with one click
moc-curator
// Curate wiki maps and clustering pages for the LLM Wiki. Use when asked to "curate MOCs", "update maps", "find clusters", "what MOCs need updating", or "organize my notes".
// Curate wiki maps and clustering pages for the LLM Wiki. Use when asked to "curate MOCs", "update maps", "find clusters", "what MOCs need updating", or "organize my notes".
Ingest a new source into the LLM Wiki. Save the full captured resource under src/content/notes/sources/ first, then create or update the maintained wiki summary/synthesis entry, index, and log. Trigger on "add", "save", "capture", "note this", "take notes on", or any request to record content in the knowledge base.
Query the maintained wiki layer first, then fall back to sources when needed. Use when asked to "ask my notes", "what do I know about", "query my knowledge", "/ask", or when the user has a question that the wiki might answer.
Summarize the past week's daily journal entries. Use when asked to "weekly review", "review the week", "summarize this week", or "week summary".
Audit the maintained wiki for quality and maintenance issues. Use when asked to "review notes", "check content quality", "audit my knowledge base", or "find broken links".
Generate a weekly newsletter summarizing resources added last week. Use when asked to "weekly newsletter", "newsletter", "what did I add this week", "generate newsletter", or "Monday newsletter".
Add tweets to the Second Brain. Use when the user provides a Twitter/X URL and pasted tweet content, asking to "add a tweet", "save this tweet", or "capture this tweet".
| name | moc-curator |
| description | Curate wiki maps and clustering pages for the LLM Wiki. Use when asked to "curate MOCs", "update maps", "find clusters", "what MOCs need updating", or "organize my notes". |
| allowed-tools | Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion |
This skill uses semantic embeddings to suggest map-page updates, discover new map opportunities, and improve the public wiki's navigational layer.
Embeddings include title, summary, and first 500 characters of body content for improved semantic accuracy.
Run the clustering script to analyze the knowledge base:
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --mode=full
Parse the JSON output:
moc_updates: Existing MOCs with missing notesnew_clusters: Orphan note clusters that could be MOCsFor each MOC with gaps, show:
### [[moc-slug]] - MOC Title
Currently has X members. Suggested additions:
1. **[[note-slug]]** (score: 0.82)
- Type: article | Tags: tag1, tag2
- Shares tags: shared-tag
2. **[[another-note]]** (score: 0.75)
- Type: youtube | Tags: tag3
- High semantic similarity to existing members
For each orphan cluster:
### Potential New MOC: "Inferred Theme"
Common tags: tag1, tag2, tag3
Notes in this cluster:
- [[note-a]] - Note A Title
- [[note-b]] - Note B Title
- [[note-c]] - Note C Title
**Suggested MOC name**: `theme-name-guide.md`
Use the AskUserQuestion tool to ask which suggestions to apply:
question: "Which MOC suggestions would you like me to apply?"
header: "MOC Updates"
multiSelect: false
options:
- label: "Apply all MOC updates"
description: "Add suggested notes to existing MOCs"
- label: "Apply all new MOC creations"
description: "Create new MOCs from discovered clusters"
- label: "Select specific suggestions"
description: "Choose individual suggestions to apply"
- label: "Skip all"
description: "Don't make any changes"
Wait for explicit approval before making any changes.
For MOC Updates:
## Suggested section at the end## Suggested
- [[new-note-1]] - Brief description of why it belongs
- [[new-note-2]] - Brief description of why it belongs
For New MOCs:
.claude/skills/writing-style/SKILL.md---
title: "Theme Name Guide"
type: map
tags:
- common-tag-1
- common-tag-2
---
Description of what this map covers.
## Section Name
- [[note-a]] - What this note contributes
- [[note-b]] - What this note contributes
Run linter and type check to catch any issues:
vp run check
If errors are found, fix them before completing the task.
# Full analysis (MOC gaps + new clusters + hub notes)
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --mode=full
# Only MOC gaps
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --mode=moc-gaps
# Only orphan clusters
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --mode=new-clusters
# Only hub notes (potential MOCs)
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --mode=hub-notes
# Suggestions for a specific note (used by adding-notes hook)
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --mode=for-note --note=slug-name
# Adjust threshold (default: 0.7 - strict)
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --threshold=0.6
# Adjust minimum links for hub detection (default: 5)
python3 .claude/skills/moc-curator/scripts/cluster-notes.py --mode=hub-notes --min-links=3
{
"moc_updates": [
{
"moc": "slug",
"moc_title": "Title",
"current_members": 5,
"missing_notes": [
{
"slug": "note",
"title": "Title",
"score": 0.82,
"shared_tags": ["tag"],
"type": "article"
}
]
}
],
"new_clusters": [
{
"cluster_id": 0,
"theme": "Inferred Theme",
"common_tags": ["tag1", "tag2"],
"notes": [{ "slug": "note", "title": "Title", "type": "article" }],
"size": 3
}
],
"orphan_stats": {
"total_orphans": 20,
"clustered": 8,
"unclustered": 12
},
"potential_mocs": [
{
"slug": "note-slug",
"title": "Note Title",
"type": "article",
"outgoing_links": 7,
"links": ["link-a", "link-b", "link-c"]
}
],
"for_note": [
{
"moc": "slug",
"moc_title": "Title",
"score": 0.82,
"reason": "shares tags: x; semantic similarity: 82%"
}
]
}
| Issue | Resolution |
|---|---|
| No embeddings cache | Script will auto-generate embeddings |
| sklearn not installed | pip install scikit-learn |
| Empty results | Try lower threshold: --threshold=0.6 |
| sentence-transformers missing | pip install sentence-transformers |