From archivist
This skill should be used when users ask to "analyze vault metadata", "check for schema drift", "fix duplicate notes", "update note properties", "generate canvas", "improve vault connections", "create discovery view", "validate frontmatter consistency", "build knowledge map", "check for orphaned notes", or "analyze note relationships". Also handles: "find duplicates", "merge notes", "redirect links", "suggest properties", "show connections", "extract meeting from log", "migrate vault notes", "visualize my notes", "show me a map", "update this note", "write to vault", or "create a note from URL". Curates and evolves existing vault content through pattern detection, migration workflows, metadata intelligence, consolidation, discovery, visualization, and direct vault writes. Do NOT use for creating new templates, schemas, Bases queries, or vault structures (use vault-architect for those).
How this skill is triggered — by the user, by Claude, or both
Slash command
/archivist:vault-curatorThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Curate and evolve vault content through pattern detection, metadata intelligence, consolidation, discovery, and visualization. Principles: evolve gradually (test on small batches), validate before executing (dry-run first), checkpoint with git before operations, discover existing patterns before suggesting changes.
references/available-scripts.mdreferences/cli-patterns.mdreferences/consolidation-protocol.mdreferences/migration-strategies.mdscripts/check_collection_health.pyscripts/detect_schema_drift.pyscripts/extract_section_to_meeting.pyscripts/find_related.pyscripts/find_similar_notes.pyscripts/generate_canvas.pyscripts/helper.pyscripts/merge_notes.pyscripts/redirect_links.pyscripts/suggest_properties.pyCurate and evolve vault content through pattern detection, metadata intelligence, consolidation, discovery, and visualization. Principles: evolve gradually (test on small batches), validate before executing (dry-run first), checkpoint with git before operations, discover existing patterns before suggesting changes.
All intelligence workflows (metadata, consolidation, discovery, visualization) begin with scope selection. Large vaults (7K+ files) require scoped operations.
Workflow:
Discover vault structure using CLI or file tools:
obsidian folders # CLI: list all vault folders
# OR fallback:
tree -L 2 -d ${VAULT_PATH} # file tools: directory tree
Present choices via AskUserQuestion with top-level directories
User selects scope (or types a path directly)
Scope all operations to the selected path for the rest of the session
Quick path: If the user mentions a specific topic ("my Docker notes"), search first:
obsidian search query="Docker" format=json
Edge cases: Empty scope → inform and suggest broadening. Whole vault → warn and require confirmation. CLI unavailable → fall back to tree + Glob/Grep.
CLI delegation: obsidian-cli, obsidian-markdown, obsidian-bases, json-canvas. See references/cli-patterns.md for command rules, Base File lookup, File Relocation, and error handling. Fallback: markdown-oxide LSP (if available via Neovim), then Grep/Glob/Read.
Opportunistic drift detection: When frontmatter is sampled during any operation, watch for obvious inconsistencies — competing property names (url/site/urls), mixed-case fileClass values, YAML corruption artifacts. Offer: "I noticed schema drift in <folder> — run detection before continuing?"
Before writing any note to the vault:
--- must be the very first characters. A leading newline silently breaks Obsidian's property parsing and fileClass resolution. When using obsidian append, ensure content begins with --- directly..obsidian/plugins/obsidian-linter/data.json first (see vault-architect for key fields). Linter auto-reformats on save; non-compliant notes produce spurious git diffs.uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-architect/scripts/validate_frontmatter.py ${VAULT_PATH}Before writing to any path in the vault, check whether it falls within your allowed zones.
How to check: Read ${CLAUDE_PLUGIN_ROOT}/.local.md and parse the curator_write_zones: field. This contains a comma-separated list of vault-relative directory paths. A write is allowed if the target path starts with any listed zone prefix. When multiple zones match, the most-specific (longest) prefix wins.
Allowed writes: Note content directories, generated output directory (canvas files, discovery views), existing note files for property updates, and any path listed in curator_write_zones.
Out-of-zone writes: If the target path does not match any curator zone, refuse the write and suggest using vault-architect instead.
No zones configured: If .local.md has no zone fields, all writes require user confirmation. Offer to run vault profiling to discover and configure zones.
All writes require confirmation — regardless of zone. The zone model determines which skill may write, not whether to confirm.
When asked to extract meeting information from daily notes or inline logs:
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/extract_section_to_meeting.py \
${VAULT_PATH} "${CURRENT_NOTE}" "${SELECTED_TEXT}"
See: references/migration-strategies.md for extraction patterns
Import calendar events → match attendees to Person notes → infer company → create meeting note.
See: references/migration-strategies.md for calendar import patterns
Migrate existing notes to new schemas:
Common migrations: add scope to meetings, consolidate Dataview to Bases.
See: references/migration-strategies.md for comprehensive patterns
When asked "what properties should this note have?" or "suggest metadata":
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/suggest_properties.py \
${VAULT_PATH} "${NOTE_PATH}"
Returns JSON with suggestions and confidence scores.
When asked to "detect schema drift" or "find inconsistent metadata":
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/detect_schema_drift.py \
${VAULT_PATH} --file-class Meeting --scope "${SCOPE_PATH}"
When asked to batch update frontmatter:
Safety: Always validate vault path. Preserve YAML formatting. Handle missing properties gracefully.
Consolidation detects duplicates, merges notes, and redirects links. All operations require user confirmation and git checkpoint before execution.
See: references/consolidation-protocol.md for full merge semantics, conflict resolution, and rollback procedures.
Detect duplicates within a scope using tiered detection:
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/find_similar_notes.py \
${VAULT_PATH} --scope "${SCOPE_PATH}"
Merge source note into target (surviving) note:
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/merge_notes.py \
${VAULT_PATH} --source "${SOURCE}" --target "${TARGET}" --dry-run
--dry-run)After merge, redirect all vault-wide references from deleted note to surviving note:
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/redirect_links.py \
${VAULT_PATH} --old "${OLD_NAME}" --new "${NEW_NAME}" --dry-run
--dry-run)Discovery workflows surface connections, suggest links, and generate views that help users navigate large vaults.
When asked "find related notes", "show connections", or "what links to this":
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/find_related.py \
${VAULT_PATH} "${NOTE_PATH}" --scope "${SCOPE_PATH}" --top 10
references/available-scripts.md)When asked "show discovery view" or "organize notes by depth":
noteType: MOC or fileClass: MOC (Maps of Content, overviews)fileClass values (Meeting, Project, Person, etc.)fileClass/noteType, or with fileClass: Capture/Log.base file using obsidian-bases skill knowledge:
{
"name": "Discovery View - [Scope]",
"filters": [{"property": "file.folder", "op": "starts-with", "value": "[scope]"}],
"groups": [{"property": "noteType", "direction": "asc"}],
"columns": ["file", "noteType", "fileClass", "tags", "file.ctime"]
}
.base file in the scoped directory (e.g., _discovery-view.base)When asked "suggest links", "what should I link", or "improve connections":
scope or project properties but aren't linkedfileClass=Meeting + scope=[[Project]] to see all related meetings"When asked "show me a map", "generate canvas", "visualize my notes", or "show knowledge map":
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/generate_canvas.py \
${VAULT_PATH} --scope "${SCOPE_PATH}" --dry-run
--dry-run) to write .canvas fileSee: references/available-scripts.md for canvas layout, naming conventions, and --output/--max-nodes options.
obsidian orphans — files with no incoming linksfind_related.py --scope — groups of related notes within a directorySee: references/available-scripts.md for full script inventory
Audit Collection Folder Pattern compliance across the vault. A collection is healthy when it has a folder note, a Bases file, and consistent member frontmatter.
uv run ${CLAUDE_PLUGIN_ROOT}/skills/vault-curator/scripts/check_collection_health.py \
${VAULT_PATH} [--scope "${SCOPE}"] [--folder "700 Notes/Workflows"]
Output fields: has_folder_note, folder_note_embeds_bases, has_bases_file, dominant_fileclass, schema_drift_issues, health — see references/available-scripts.md for field definitions.
After report, offer fixes in order: missing folder note or Bases file → scaffold via vault-architect; folder note missing Bases embed → add with confirmation; schema drift → run detect_schema_drift.py --scope <folder>.
npx claudepluginhub totallygreg/claude-mp --plugin archivistEnforces schema-as-code for Obsidian vaults. Discovers structure, builds a schema, and runs health checks, dedup, link cleanup, MOC generation, and decay cycles.
Organizes an Obsidian vault: adds documents with auto-categorization, restructures misplaced files, processes meeting notes, and runs health checks.
Inspects, edits, organizes, and analyzes local Obsidian vault notes, YAML frontmatter, wikilinks, graph structure, and schema. Useful for vault maintenance and bulk edits.