obsidian-plugin/skills/vault-mocs/SKILL.md
Map-of-Content (MOC) curation for Obsidian vaults. Use when creating a MOC for a tag, extending with orphans, fixing legacy MOC tags, or analyzing coverage.
npx skillsauth add laurigates/claude-plugins vault-mocsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Use this skill when... | Use the alternative instead when... |
|---|---|
| Creating or extending a Map of Content hub for a tag category | Reconnecting individual orphaned notes without building a hub — use vault-orphans |
| Migrating legacy 🗺️ MOC tags to canonical 📝/moc | Renaming or consolidating non-MOC tags across the vault — use vault-tags |
| Auditing MOC coverage and linking orphans into existing hubs | Repairing broken [[...]] references inside an existing MOC — use vault-wikilinks |
A Map of Content (MOC) is a structured hub note that organizes related content via wikilinks. It's the primary navigation surface of a mature Obsidian vault — more useful than tags, more discoverable than search.
---
tags: [📝/moc]
---
# Neovim MOC
Central hub for Neovim configuration, plugins, and workflows.
## Core
- [[Neovim]] — base configuration
- [[Lazy.nvim]] — plugin management
## Plugins
- [[nvim-treesitter]]
- [[Mason LSP]]
## Keybindings and Workflow
- [[Neovim Keybindings]]
- [[Neovim Session Management]]
Rules:
📝/moc — not 🗺️ (legacy), not MOC (flat), not 📝/MOC (wrong case).Zettelkasten/ (personal) or work/MOC/ (work).{Subject} MOC.md — suffix, not prefix.## section headings, then bullet-list wikilinks.id: or other legacy frontmatter.| Issue | Fix |
|-------|-----|
| tags: 🗺️ | Rewrite to tags: [📝/moc] |
| tags: [🗺, 📝/moc] | Deduplicate to tags: [📝/moc] |
| MOC in work/z/ instead of work/MOC/ | Move file |
| Uses [[Kanban/Foo]] path-qualified links | Rewrite to [[Foo]] when basename unique |
For each tag category (🛠️/, 🔌/, 💻/, etc.), the vault-agent mocs.analyze_mocs analyzer reports how many tagged notes are NOT linked from any MOC. High uncovered counts indicate:
The detection methodology above is unchanged — only the data source changes when Obsidian (and its obsidian CLI / live link index) is closed. The obsidian CLI and vault-agent analyzers are the live-index path; parsing the .md corpus directly with Glob/Grep is the deterministic headless default, and for batch/scheduled audits it is often the better choice (reproducible, free of app/index state). vault-frontmatter already operates this way.
Parse the corpus directly:
--- fences; extract tags, aliases, context. See vault-frontmatter for YAML-block mechanics.[[Target]], [[Target|Alias]], [[Target#Heading]], [[folder/Target]], and ![[embed]]. Resolve each target to a note by basename, then relative path, then alias (from frontmatter), all case-insensitive. Resolve ![[embed]] against attachments as well as notes — the attachment folder is per-vault configurable, so read it from .obsidian/app.json (attachmentFolderPath) and fall back to the vault root / Files/ only when that key is unset.Coverage analysis offline: for each tag category, count notes whose parsed frontmatter tags place them in the category but which no 📝/moc-tagged note links to (via the resolution cascade). That is the same uncovered count mocs.analyze_mocs produces from the live index.
Thresholds (heuristic):
If all three hold, create Zettelkasten/{Category} MOC.md:
---
tags: [📝/moc]
---
# {Category} MOC
{One-paragraph framing of the category.}
## {Section}
- [[Note1]]
- [[Note2]]
Pick 2–4 ## sections that reflect natural groupings within the notes — don't force a deep hierarchy.
When the analyzer reports orphaned notes that belong in an existing MOC:
## section (or create a new one if 3+ notes fit a new grouping).Don't add a "See also" or "Random" section as a dumping ground. If a note doesn't fit any section, reconsider whether it belongs in this MOC at all.
📝/moc tag to a note that isn't actually a MOC — it pollutes MOC inventories.vault-wikilinks rewrite patterns).| Action | Commit |
|--------|--------|
| New MOC | feat(mocs): add {Category} MOC covering N notes |
| Fixup tag | fix(mocs): 🗺️ → 📝/moc on work MOCs |
| Add orphans | feat(mocs): link 12 notes into Neovim MOC |
| Rewrite path-qualified link | fix(mocs): unqualify [[Kanban/X]] → [[X]] across 6 MOCs |
development
Debug HTTP APIs: trace requests, inspect headers. Use when a request fails: check status first.
documentation
Render architecture diagrams from text sources. Use when documenting system topology.
tools
Inspect JSON payloads and extract nested fields. Use when parsing API responses.
tools
--- name: no-description allowed-tools: Read --- # No Description This skill has no description and must be dropped with a warning.