Documentation
¶
Index ¶
- Variables
- func ApplyOptions() []config.ConfigOption
- func ArcCandidatesOptions() []config.ConfigOption
- func AskOptions() []config.ConfigOption
- func CheckOptions() []config.ConfigOption
- func DataviewOptions() []config.ConfigOption
- func DocsCommandsOptions() []config.ConfigOption
- func DoctorHealOptions() []config.ConfigOption
- func DoctorHealWikilinksOptions() []config.ConfigOption
- func DoctorOptions() []config.ConfigOption
- func ExperimentCompareOptions() []config.ConfigOption
- func ExperimentReportOptions() []config.ConfigOption
- func ExperimentSummaryOptions() []config.ConfigOption
- func ExperimentTraceOptions() []config.ConfigOption
- func ExperimentsOptions() []config.ConfigOption
- func ExportOptions() []config.ConfigOption
- func FrontmatterFixOptions() []config.ConfigOption
- func FrontmatterMutationOptions() []config.ConfigOption
- func FrontmatterOptions() []config.ConfigOption
- func GitStatusOptions() []config.ConfigOption
- func HooksInstallOptions() []config.ConfigOption
- func HooksUninstallOptions() []config.ConfigOption
- func IdentityEnrollAddOptions() []config.ConfigOption
- func IdentityEnrollOptions() []config.ConfigOption
- func IdentityInitOptions() []config.ConfigOption
- func IdentityInviteOptions() []config.ConfigOption
- func IdentitySignEnrollmentOptions() []config.ConfigOption
- func IdentitySignEnvelopeOptions() []config.ConfigOption
- func IdentitySignOptions() []config.ConfigOption
- func IdentitySignRegistryOptions() []config.ConfigOption
- func IdentitySignerOptions() []config.ConfigOption
- func IndexOptions() []config.ConfigOption
- func InitOptions() []config.ConfigOption
- func LinksNeighborsOptions() []config.ConfigOption
- func LinksOptions() []config.ConfigOption
- func LintFixLinksOptions() []config.ConfigOption
- func MemoryContextPackOptions() []config.ConfigOption
- func MemoryLinksOptions() []config.ConfigOption
- func MemoryNeighborsOptions() []config.ConfigOption
- func MemoryPackOptions() []config.ConfigOption
- func MemoryRecallOptions() []config.ConfigOption
- func MemoryRelatedOptions() []config.ConfigOption
- func MemorySummarizeOptions() []config.ConfigOption
- func NoteCreateOptions() []config.ConfigOption
- func NoteOptions() []config.ConfigOption
- func PingOptions() []config.ConfigOption
- func ResolveOptions() []config.ConfigOption
- func SchemaOptions() []config.ConfigOption
- func SearchOptions() []config.ConfigOption
- func SelfOptions() []config.ConfigOption
- func VaultStatusOptions() []config.ConfigOption
Constants ¶
This section is empty.
Variables ¶
var ApplyMetadata = config.CommandMetadata{ Use: "apply <plan-file | ->", Short: "Execute an AI-generated plan to mutate vault notes", Long: `Parse a JSON plan file and execute its operations against the vault. Plans are typically produced by AI agents to make structured changes to your notes: setting frontmatter keys, creating new notes, or populating generated regions. Use preview modes to inspect what will change before writing anything to disk. THE PLAN FILE The argument is a path to a JSON file, or "-" to read from stdin. Required shape: {"version": 1, "description": "...", "operations": [...]} Supported operation types: frontmatter_set Set a frontmatter key in one note frontmatter_unset Remove a frontmatter key from one note frontmatter_merge Merge a map of keys into a note's frontmatter generated_region_render Write content into a delimited generated region note_create Create a new note with frontmatter and body PREVIEW AND EXECUTION MODES --dry-run Parse and simulate without writing. Shows what would change. --diff With --dry-run, display unified diffs of each note mutation. --commit Auto-stage and commit all changes in one git commit after success. Without --commit, writes are applied but not committed. FLAGS --vault <path> Vault root directory (default: ".") --json Machine-readable output: status envelope, per-operation results, and commit SHA when --commit succeeds. EXAMPLES vaultmind apply ./my-plan.json Apply the plan. Changes written to disk but not committed. vaultmind apply - < ./my-plan.json Read plan from stdin (pipe from an AI agent or another command). vaultmind apply ./my-plan.json --dry-run Simulate the plan without writing anything. vaultmind apply ./my-plan.json --dry-run --diff Simulate and show unified diffs so you see exactly what each mutation looks like. vaultmind apply ./my-plan.json --commit Apply, then auto-stage and commit in one step using the plan description. vaultmind apply ./my-plan.json --json Apply with machine-readable output including per-operation status.`, ConfigPrefix: "app.apply", FlagOverrides: map[string]string{ "app.apply.vault": "vault", "app.apply.json": "json", "app.apply.dry_run": "dry-run", "app.apply.diff": "diff", "app.apply.commit": "commit", }, }
ApplyMetadata defines metadata for the apply command.
var ArcCandidatesMetadata = config.CommandMetadata{ Use: "candidates", Short: "Surface arc-distillation candidate moments from episodes (propose-only)", Long: "Scan the vault's episode captures and surface candidate transformation moments " + "(authority-grants, manifesto-lens invocations) for arc distillation. PROPOSE-ONLY: it " + "never writes arcs — the moments are pointers for you to judge, draft, and approve. See " + "principle-how-to-write-arcs for the bar a real arc must clear.", ConfigPrefix: "app.arc.candidates", FlagOverrides: map[string]string{ "app.arc.candidates.vault": "vault", "app.arc.candidates.json": "json", }, }
ArcCandidatesMetadata defines the `arc candidates` command — propose-only arc-distillation candidate surfacing (plasticity step 2).
var AskMetadata = config.CommandMetadata{ Use: "ask <query>", Short: "Compound search + context-pack: answer 'what do I know about X?'", Long: `Search the vault, pick the top hit, and pack token-budgeted context around it. One command replaces the manual search → recall → summarize chain. CHOOSE A RENDERING MODE BY INTENT vaultmind ask "spreading activation" --pointers-only Menu of relevant ids + titles. Cheapest. Use when you want to see what's relevant without reading bodies — then 'note get <id>' the one you want. vaultmind ask "spreading activation" --preview Menu + one-line snippet under each hit. Use when titles aren't enough to know what each note is about. Bridges --pointers-only and default. vaultmind ask "spreading activation" Default. Full token-budgeted context-pack around the top hit. Use when you want bodies in working context (not just to identify the right id). vaultmind ask "spreading activation" --explain Each hit shows per-lane RRF math (dense / sparse / colbert / fts). For investigating ranking decisions, not for answering content questions. ANTI-PATTERN — AVOID vaultmind ask "X" --budget 3000 | tail -20 Don't double-clip. The budget asks the system to compute 3000 tokens of context-pack; the tail then throws most of it away. Pick one shape that fits the intent: --pointers-only if you want a menu, no bodies --preview if you want a menu with body snippets --budget=N (no tail) if you really want N tokens of context OUTPUT INCLUDES Search: [top-hit confidence: strong|moderate|weak] Per-hit: score, id, title, optional snippet (--preview), optional lanes (--explain) Context: target frontmatter + body, then ranked context items (default mode only)`, ConfigPrefix: "app.ask", FlagOverrides: map[string]string{ "app.ask.vault": "vault", "app.ask.json": "json", "app.ask.budget": "budget", "app.ask.max_items": "max-items", "app.ask.search_limit": "search-limit", "app.ask.explain": "explain", "app.ask.pointers_only": "pointers-only", "app.ask.preview": "preview", "app.ask.read": "read", "app.ask.quiet_on_nomatch": "quiet-on-no-match", }, }
AskMetadata defines metadata for the ask command.
var CheckMetadata = config.CommandMetadata{ Use: "check", Short: "Run quality checks", Long: `Run comprehensive code quality checks using checkmate. Includes 23 checks across 6 categories: Development Environment (2): go-version, tools Code Quality (2): format, lint Architecture Validation (10): defaults, commands, constants, task-naming, architecture, layering, package-org, config-consumption, output-patterns, security-patterns Security Scanning (2): secrets, sast Dependencies (6): deps, vuln, outdated, license-source, license-binary, sbom-vulns Tests (1): test Use --parallel to run checks within each category concurrently. Use --fail-fast to stop on the first failure.`, ConfigPrefix: "app.check", FlagOverrides: map[string]string{ "app.check.fail_fast": "fail-fast", "app.check.verbose": "verbose", "app.check.parallel": "parallel", "app.check.category": "category", "app.check.timing": "timing", }, Examples: []string{ "check", "check --category=security", "check -c security,tests", "check --fail-fast", }, SeeAlso: []string{"docs"}, }
CheckMetadata defines all metadata for the check command
var DataviewLintMetadata = config.CommandMetadata{ Use: "lint", Short: "Scan the vault for broken or duplicate VAULTMIND:GENERATED markers", Long: `Validate VAULTMIND:GENERATED markers across every note in the vault. The command reads all notes and checks each one for two classes of problems: malformed_markers A START marker has no matching END, or vice versa, for the same section key. Typically caused by a partial paste or a hand-edit that removed one half of the pair. duplicate_markers The same section key appears more than once in a single note. Rendering would be ambiguous; the second occurrence is flagged. read_error The file could not be read (permissions, encoding). Run this before "dataview render" to catch problems early. Run it after manual edits to confirm the markers are still well-formed. FLAGS --json Machine-readable output. Emits a JSON envelope whose "data" field contains files_checked (int), valid (int), and issues (array). Each issue has: path, section_key, rule, message, line. --vault Path to the vault root (default: current directory). OUTPUT INCLUDES Text: "Checked N files: N valid, N issues" followed by one line per issue in the form "[rule] path: message". JSON: { "status": "ok"|"warning", "data": { "files_checked": N, "valid": N, "issues": [ { "path": "...", "section_key": "...", "rule": "...", "message": "...", "line": N } ] } } EXAMPLES vaultmind dataview lint Scan the vault in the current directory; print summary and any issues. vaultmind dataview lint --vault /path/to/vault Scan a vault at an explicit path. vaultmind dataview lint --json Emit full JSON envelope; useful for piping into other tools. vaultmind dataview lint --json | jq '.data.issues' Extract just the issues array for scripted checks.`, ConfigPrefix: "app.dataviewlint", FlagOverrides: map[string]string{ "app.dataviewlint.vault": "vault", "app.dataviewlint.json": "json", }, }
DataviewLintMetadata defines metadata for the dataview lint command.
var DataviewRenderMetadata = config.CommandMetadata{ Use: "render <note-id-or-path>", Short: "Render a generated region", Long: `Replace content between VAULTMIND:GENERATED markers with section template content. Arguments: note-id-or-path Note ID, title, or file path (resolved via entity resolution) Markers have the format: <!-- VAULTMIND:GENERATED:{key}:START/END --> Section templates are loaded from .vaultmind/sections/{type}/{key}.md. Use --section-key to render a specific section (default: all sections). Use --force to override checksum mismatch (hand-edited content).`, ConfigPrefix: "app.dataviewrender", FlagOverrides: map[string]string{ "app.dataviewrender.vault": "vault", "app.dataviewrender.json": "json", "app.dataviewrender.dry_run": "dry-run", "app.dataviewrender.diff": "diff", "app.dataviewrender.commit": "commit", "app.dataviewrender.force": "force", "app.dataviewrender.section_key": "section-key", }, }
DataviewRenderMetadata defines metadata for the dataview render command.
var DocsCommandsMetadata = config.CommandMetadata{ Use: "commands", Short: "Generate the grouped command reference (COMMANDS.md)", Long: `Generate a markdown reference of every user-facing command, grouped by intent, each with its when-to-use trigger. This is the same catalog that backs 'vaultmind help' and the embedded onboarding doc — one generator, rendered to markdown here. Use --output to write COMMANDS.md; with no --output it prints to stdout.`, ConfigPrefix: "app.docs_commands", FlagOverrides: map[string]string{ "app.docs_commands.output": "output", }, Examples: []string{ "docs commands", "docs commands --output internal/onboard/COMMANDS.md", }, }
DocsCommandsMetadata defines the metadata for `docs commands` — emits the grouped command catalog (every user-facing command, with its when-to-use) as markdown. This is the COMMANDS.md generator: the same catalog that backs `vaultmind help` and the embedded onboarding doc, rendered to markdown.
var DoctorHealMetadata = config.CommandMetadata{ Use: "heal", Short: "heal (fix): apply all auto-fixable repairs doctor found", Long: `heal (fix): apply every auto-fixable repair that doctor's diagnosis can resolve. heal is the repair half of the doctor health hub. Today the auto-fixable set is exactly the Obsidian-incompatible wikilink rewriter, so 'doctor heal' rewrites [[Title]] links that won't resolve in Obsidian to the [[filename|Title]] form. As doctor learns to auto-fix more issues, they join this command. heal APPLIES changes by default. Pass --dry-run to preview the planned repairs without touching disk. (This is the inverse of the old 'lint fix-links', which was dry-run by default.) The 'fix' alias makes 'doctor fix' an exact synonym. SUBCOMMANDS wikilinks Surgically rewrite only Obsidian-incompatible wikilinks. EXAMPLES vaultmind doctor heal --vault ./my-vault # apply all auto-fixes vaultmind doctor heal --vault ./my-vault --dry-run # preview only vaultmind doctor heal wikilinks --vault ./my-vault # just the wikilink repair vaultmind doctor fix --vault ./my-vault # 'fix' alias`, ConfigPrefix: "app.doctorheal", FlagOverrides: map[string]string{ "app.doctorheal.vault": "vault", "app.doctorheal.json": "json", "app.doctorheal.dry_run": "dry-run", }, }
DoctorHealMetadata defines the metadata for the `doctor heal` command. heal APPLIES every auto-fixable repair doctor found (today that set is the wikilink rewriter); --dry-run previews instead. The `fix` alias is wired in cmd/ so `doctor fix` resolves here too.
var DoctorHealWikilinksMetadata = config.CommandMetadata{ Use: "wikilinks", Short: "Rewrite Obsidian-incompatible wikilinks to [[filename|Title]]", Long: `Detect [[Title]] wikilinks that won't resolve in Obsidian and rewrite them to the [[filename|Title]] form Obsidian requires. Scans every markdown file in the vault, reports each rewrite as "old -> new", and prints a summary of files scanned, files changed, and links fixed. Applies changes by default; pass --dry-run to preview without writing. The 'fix' alias makes 'doctor fix wikilinks' an exact synonym. EXAMPLES vaultmind doctor heal wikilinks --vault ./my-vault # apply the rewrites vaultmind doctor heal wikilinks --vault ./my-vault --dry-run # preview only vaultmind doctor heal wikilinks --json # machine-readable`, ConfigPrefix: "app.doctorhealwikilinks", FlagOverrides: map[string]string{ "app.doctorhealwikilinks.vault": "vault", "app.doctorhealwikilinks.json": "json", "app.doctorhealwikilinks.dry_run": "dry-run", }, }
DoctorHealWikilinksMetadata defines the metadata for the `doctor heal wikilinks` subcommand — the surgical wikilink repair that the old `lint fix-links` performed. Applies by default; --dry-run previews.
var DoctorMetadata = config.CommandMetadata{ Use: "doctor", Short: "Vault health hub: diagnose the vault and report issues", Long: `Run read-only diagnostics on the vault and report its health. doctor is the single vault-health command. It reports note counts, the per-type breakdown (per-type counts, required fields, valid statuses), embedding readiness, hook drift, unresolved/incompatible/dead links, stale-index drift, and an errors/warnings rollup. By default doctor also prints per-link details, which can run to hundreds of lines on a noisy vault. Use --summary for the cold-start view: counts, per-type breakdown, and the errors/warnings rollup, with the verbose per-link detail lines suppressed. (--summary replaces the former 'vault status'.) To repair what doctor finds, run 'doctor heal' (all auto-fixable) or 'doctor heal wikilinks'. Use --all to diagnose EVERY vault discovered under a root (directories containing a .vaultmind/ subdir), with a combined rollup plus a per-vault report. --root sets where discovery starts (default: the current directory). --all composes with --summary and --json (one combined envelope). When a Contract-B mesh signal exists (an identity key, a pinned network anchor, a --mesh-* flag, or a reachable local daemon) doctor also reports a mesh-identity section: key custody, whether your binding authenticates against a PINNED root, and chat reachability. Green is reserved for a cryptographically authenticated binding; everything else is a warning (doctor stays exit-0). --mesh-root-pubkey pins the root explicitly (otherwise the enroll-persisted anchor is used), --mesh-registry verifies an offline registry file, --mesh-slug overrides the agents.yaml slug, and --mesh-heartbeat overrides the wake-watcher heartbeat path.`, ConfigPrefix: "app.doctor", FlagOverrides: map[string]string{ "app.doctor.vault": "vault", "app.doctor.json": "json", "app.doctor.summary": "summary", "app.doctor.all": "all", "app.doctor.root": "root", "app.doctor.mesh_root_pubkey": "mesh-root-pubkey", "app.doctor.mesh_registry": "mesh-registry", "app.doctor.mesh_slug": "mesh-slug", "app.doctor.mesh_heartbeat": "mesh-heartbeat", }, }
DoctorMetadata defines the metadata for the doctor command.
var ExperimentCompareMetadata = config.CommandMetadata{ Use: "compare", Short: "Surface where retrieval variants disagree, without needing labeled ground truth", Long: `Read recent ask/search/context-pack events that recorded shadow variants and compute pairwise rank-agreement metrics (Jaccard@K and Kendall's tau) for each variant pair. Reports per-pair means and event counts, with an optional per-event breakdown. This command measures disagreement, not correctness. It answers: "do these two variants tend to return different results?" without requiring any labeled target notes. Contrast with "experiment report", which measures absolute quality and requires labeled targets. METRICS Jaccard@K: Intersection over union of the top-K result sets from two variants (0 = no overlap, 1 = identical top-K). Use K to control how deep in the ranking you care about. Kendall tau: Rank correlation on items shared by both variants (-1 = fully reversed, 0 = uncorrelated, 1 = identical order). Undefined when fewer than 2 results are shared. WHEN TO USE Use "experiment compare" when you have two or more retrieval variants (e.g., a new ranking model shadowing the primary) and want to measure how often they diverge, before investing in labeling ground truth for a full quality evaluation via "experiment report". FLAGS --k: top-K depth for Jaccard and the cap on list length for Kendall's tau (int; default 10). --per-event: emit one row per event in addition to aggregates (bool). --since: only include events at or after this RFC3339 timestamp (string). --session: restrict to a single session ID (string). --caller: restrict to a single caller label (string). --event-type: restrict to one event type: ask, search, or context_pack (string; default: all three). --json: emit JSON instead of a table (bool). EXAMPLES vaultmind experiment compare # Compare all variants across all recent events, K=10. vaultmind experiment compare --k 5 # Stricter: only count a result as "in top K" if it is in the top 5. vaultmind experiment compare --since 2024-06-01T00:00:00Z # Only events on or after a cutoff date. vaultmind experiment compare --session abc123 --per-event # Restrict to one agent session and emit one row per event. vaultmind experiment compare --event-type ask --json # Only ask events, machine-readable output for scripting.`, ConfigPrefix: "app.experimentcompare", FlagOverrides: map[string]string{ "app.experimentcompare.session": "session", "app.experimentcompare.caller": "caller", "app.experimentcompare.since": "since", "app.experimentcompare.event_type": "event-type", "app.experimentcompare.k": "k", "app.experimentcompare.per_event": "per-event", "app.experimentcompare.json": "json", }, }
ExperimentCompareMetadata defines metadata for the experiment compare command.
var ExperimentReportMetadata = config.CommandMetadata{ Use: "report", Short: "Measure retrieval quality: Hit@K and MRR per variant", Long: `Read the local experiment database and compute Hit@K and MRR for each variant. These are absolute quality metrics that tell you how well a retrieval variant performs when a labeled target exists. METRICS Hit@K: Fraction of lookups where the target note appeared in the top K results (0.0 = never found, 1.0 = always in top K). MRR: Mean Reciprocal Rank — average of 1/rank for each lookup where the target was found (rank 1 = 1.0, rank 2 = 0.5, rank 3 = 0.33). WHEN TO USE Use "experiment report" when you want to know whether a variant is actually correct — not just whether two variants disagree. It requires events where a target note was labeled at retrieval time (e.g., spreading-activation lookups where the source note is known). Contrast with "experiment compare", which measures variant disagreement and needs no labeled ground truth. FLAGS --experiment: restrict to a named experiment (string; default: all experiments). --k: K value for Hit@K (int; default 10). --json: emit JSON instead of a table (bool). EXAMPLES vaultmind experiment report # Hit@K and MRR across all variants and experiments, K=10. vaultmind experiment report --k 5 # Stricter threshold: target must appear in the top 5 to count. vaultmind experiment report --experiment spreading-activation-v2 # Metrics only for the named experiment. vaultmind experiment report --experiment spreading-activation-v2 --json # Machine-readable output for scripting or logging.`, ConfigPrefix: "app.experimentreport", FlagOverrides: map[string]string{ "app.experimentreport.experiment": "experiment", "app.experimentreport.json": "json", "app.experimentreport.k": "k", }, }
ExperimentReportMetadata defines metadata for the experiment report command.
var ExperimentSummaryMetadata = config.CommandMetadata{ Use: "summary", Short: "Memory usage overview: top recalled notes, session gap stats", Long: `Read the local experiment database and report which notes are recalled most often, how many unique notes have been retrieved, and the distribution of time gaps between sessions. Use this as the weekly readout on whether recall is staying focused or drifting. A small number of notes dominating the top list may signal retrieval fixation; many unique notes with long gaps between sessions may signal low vault engagement. OUTPUT INCLUDES Top-N most-recalled notes (note id, title, recall count). Total unique notes retrieved across all sessions. Session gap distribution (min, median, max time between sessions). FLAGS --top: number of top-recalled notes to show (int; default 10). --json: emit JSON instead of a table (bool). EXAMPLES vaultmind experiment summary # Overview with the top 10 recalled notes and session gap stats. vaultmind experiment summary --top 20 # Widen to the top 20 notes to see if recall coverage is broad. vaultmind experiment summary --json # Machine-readable output for logging or scripting.`, ConfigPrefix: "app.experimentsummary", FlagOverrides: map[string]string{ "app.experimentsummary.json": "json", "app.experimentsummary.top": "top", }, }
ExperimentSummaryMetadata defines metadata for the experiment summary command.
var ExperimentTraceMetadata = config.CommandMetadata{ Use: "trace", Short: "Drill into a specific session or note's retrieval history", Long: "Given --session <id>, reports that session's caller (agent + operator) and every retrieval it performed in order. Given --note <id>, reports every session that retrieved that note with caller attribution. Exactly one of --session or --note must be provided.", ConfigPrefix: "app.experimenttrace", FlagOverrides: map[string]string{ "app.experimenttrace.session": "session", "app.experimenttrace.note": "note", "app.experimenttrace.json": "json", }, }
ExperimentTraceMetadata defines metadata for the experiment trace command.
var ExportMetadata = config.CommandMetadata{ Use: "export", Short: "Export experiment data as a sanitized JSONL snapshot", Long: `Export the experiment DB (sessions, events, outcomes) as a JSONL stream that you can share with the VaultMind team. The output is sanitized according to your configured telemetry tier: anonymous Strips vault paths, query text, and result note_ids/paths. Aggregate shape (ranks, scores, counts, timestamps, variant names) is preserved. full Preserves everything. Use only if you've explicitly opted into Full data sharing on first run. off Refused — the user opted out, so producing a file would imply we collected data we shouldn't have. OUTPUT SHAPE A JSONL stream — one JSON object per line: {"kind":"manifest","tier":"anonymous","exported_at":"...",...} {"kind":"session","session_id":"...","started_at":"...","ended_at":"..."} {"kind":"event","event_id":"...","event_type":"ask","data":{...}} {"kind":"outcome","outcome_id":"...","rank":1,"variant":"primary",...} EXAMPLES vaultmind export Stream JSONL to stdout. Pipe to gzip or redirect: vaultmind export | gzip > vm-export-$(date +%Y%m%d).jsonl.gz vaultmind export --output ./vm-export.jsonl Write to a file directly. vaultmind export --tier full Override the configured tier (requires opt-in record). PRIVACY The Anonymous tier's stripping contract is tested in internal/experiment/export_test.go. If the tests change, the contract documented in telemetry.go must change too.`, ConfigPrefix: "app.export", FlagOverrides: map[string]string{ "app.export.output": "output", "app.export.tier": "tier", "app.export.rollup": "rollup", "app.export.vault": "vault", "app.export.preview": "preview", }, }
ExportMetadata defines the metadata for the export command — produces a sanitized JSONL snapshot of the experiment DB for sharing with the VaultMind team. Tier-aware: Anonymous strips note_ids, paths, and queries per the contract documented in internal/experiment/telemetry.go; Full preserves everything.
var FrontmatterFixMetadata = config.CommandMetadata{ Use: "fix", Short: "Backfill missing `created` frontmatter on domain notes", Long: `Walk the vault and identify domain notes missing the ` + "`created`" + ` field. Surface what's missing and the proposed value; with --apply, write the addition atomically. Provenance for ` + "`created`" + `: git first-commit (when the file is tracked) → file mtime → today's date. The first successful resolution wins. User-owned fields (title, status, tags, related_ids, etc.) are NEVER touched by this command — only the missing ` + "`created`" + ` field gets backfilled. Default is dry-run. Pass --apply to write changes. Output as JSON with --json. Examples: vaultmind frontmatter fix --vault . # dry-run audit vaultmind frontmatter fix --vault . --apply # backfill missing created vaultmind frontmatter fix --vault . --json # machine-readable audit`, ConfigPrefix: "app.frontmatterfix", FlagOverrides: map[string]string{ "app.frontmatterfix.vault": "vault", "app.frontmatterfix.json": "json", "app.frontmatterfix.apply": "apply", }, }
FrontmatterFixMetadata defines metadata for the `frontmatter fix` command.
Surfaces domain notes that are missing the `created` field and (with --apply) writes it. Migration scenarios — existing-vault notes that predate any auto-stamp era — are the primary use case.
Default mode is dry-run: the command prints what would change but does not write. Per the extend-don't-overwrite principle, vaultmind never silently rewrites user files; --apply is the explicit gate.
Provenance for the `created` value: git log first-commit (most accurate signal — actual creation date in version control), file mtime, today's date — tried in order, the first successful one wins.
Scope was originally `created` + `vm_updated` (the four-tier vaultmind-owned tier). The 2026-05-04 dogfood pass retired vm_updated entirely (no read-side consumer survived the false-positive collapse of mtime-based drift), so this command now covers only `created`.
var FrontmatterMergeMetadata = config.CommandMetadata{ Use: "merge <note-id-or-path> --file <yaml-file>", Short: "Merge multiple frontmatter fields", Long: `Merge key-value pairs from a YAML file into the note's frontmatter. Arguments: note-id-or-path Note ID, title, or file path (resolved via entity resolution) Required flags: --file Path to a YAML file containing key-value pairs to merge The YAML file should contain top-level keys matching frontmatter fields. Existing keys are overwritten; new keys are added. Use --allow-extra to merge keys not defined in the type schema. Use --dry-run --diff to preview.`, ConfigPrefix: "app.frontmattermerge", FlagOverrides: map[string]string{ "app.frontmattermerge.vault": "vault", "app.frontmattermerge.json": "json", "app.frontmattermerge.dry_run": "dry-run", "app.frontmattermerge.diff": "diff", "app.frontmattermerge.commit": "commit", "app.frontmattermerge.allow_extra": "allow-extra", "app.frontmattermerge.file": "file", }, }
FrontmatterMergeMetadata defines metadata for the frontmatter merge command.
var FrontmatterNormalizeMetadata = config.CommandMetadata{ Use: "normalize [<file-or-path>] [flags]", Short: "Normalize frontmatter on a file (sort keys, fix aliases/tags, dates, snake_case)", Long: `Normalize frontmatter formatting on a single vault file. Applies these transformations to the target file's frontmatter: - Sort keys into canonical order - Convert scalar aliases and tags fields to lists - Normalize all date fields (use --strip-time to truncate to date-only) - Convert all keys to snake_case The optional argument is the path to a note file. When omitted, "." is used as the target (current directory). FLAGS --vault string Path to vault root (default ".") --dry-run Preview changes without writing to disk --diff Show a unified diff of the proposed changes --commit Stage and commit the file after applying changes --strip-time Convert all datetime fields to date-only (drop time component) --json Output result in JSON format EXAMPLES vaultmind frontmatter normalize notes/my-note.md --dry-run --diff Preview what normalizations would be applied, showing a unified diff. vaultmind frontmatter normalize notes/my-note.md Apply all normalizations and write the file. vaultmind frontmatter normalize notes/my-note.md --strip-time --commit Normalize and strip time from dates, then stage and commit the change. vaultmind frontmatter normalize notes/my-note.md --json Apply normalizations and return structured JSON output. WHEN TO USE Use "frontmatter normalize" to clean up a single file before review or commit. For setting or removing individual fields, use "frontmatter set" or "frontmatter unset". For bulk key-value updates from a YAML file, use "frontmatter merge".`, ConfigPrefix: "app.frontmatternormalize", FlagOverrides: map[string]string{ "app.frontmatternormalize.vault": "vault", "app.frontmatternormalize.json": "json", "app.frontmatternormalize.dry_run": "dry-run", "app.frontmatternormalize.diff": "diff", "app.frontmatternormalize.commit": "commit", "app.frontmatternormalize.strip_time": "strip-time", }, }
FrontmatterNormalizeMetadata defines metadata for the frontmatter normalize command.
var FrontmatterSetMetadata = config.CommandMetadata{ Use: "set <note-id-or-path> <key> <value>", Short: "Set a frontmatter field", Long: `Set a single frontmatter key to a value. Validates against the type schema. Arguments: note-id-or-path Note ID, title, or file path (resolved via entity resolution) key Frontmatter key to set (e.g., "status", "tags") value Value to assign (strings, numbers, JSON arrays like '["a","b"]') The key is validated against the note's type schema. Use --allow-extra to set keys not defined in the schema. Use --dry-run --diff to preview the change.`, ConfigPrefix: "app.frontmatterset", FlagOverrides: map[string]string{ "app.frontmatterset.vault": "vault", "app.frontmatterset.json": "json", "app.frontmatterset.dry_run": "dry-run", "app.frontmatterset.diff": "diff", "app.frontmatterset.commit": "commit", "app.frontmatterset.allow_extra": "allow-extra", }, }
FrontmatterSetMetadata defines metadata for the frontmatter set command.
var FrontmatterUnsetMetadata = config.CommandMetadata{ Use: "unset <note-id-or-path> <key>", Short: "Remove a frontmatter field", Long: `Remove a frontmatter key from a note's frontmatter. Arguments: note-id-or-path Note ID, title, or file path (resolved via entity resolution) key Frontmatter key to remove Returns an error if the key is required by the note's type schema. Use --dry-run --diff to preview the change.`, ConfigPrefix: "app.frontmatterunset", FlagOverrides: map[string]string{ "app.frontmatterunset.vault": "vault", "app.frontmatterunset.json": "json", "app.frontmatterunset.dry_run": "dry-run", "app.frontmatterunset.diff": "diff", "app.frontmatterunset.commit": "commit", }, }
FrontmatterUnsetMetadata defines metadata for the frontmatter unset command.
var FrontmatterValidateMetadata = config.CommandMetadata{ Use: "validate", Short: "Check vault notes for frontmatter rule violations", Long: `Scan all domain notes and report frontmatter violations against the type registry. Catches four rule classes: missing required fields, invalid status values, unknown types, and broken frontmatter references (explicit_relation edges pointing to non-existent notes). MODES Default (indexed): Reads from the vault's SQLite index built by "vaultmind index". Fast. Use for routine health checks and CI pipelines. Reports the index hash in JSON output so results are traceable to a specific index snapshot. --live: Reads raw .md files on disk instead of the indexed database. Use when the index may be stale or you want to validate before indexing. No index hash is reported in this mode. FLAGS --vault PATH Path to vault root (default: ".") --live Validate raw .md files on disk instead of the indexed database --json Output structured JSON instead of human-readable text OUTPUT INCLUDES (human-readable) "Checked N files: M valid, K issues" Per issue: [severity] path: message (rule) Severity values: error (missing required field), warning (unknown type, invalid status, broken reference) Rule values: missing_required_field, unknown_type, invalid_status, broken_reference OUTPUT INCLUDES (--json) status: "ok" or "warning" (warning when any issues found) result: files_checked total notes scanned valid notes with no violations issues[] array of {path, id, severity, rule, message, field, value} meta: vault_path vault root used index_hash index snapshot identifier (empty in --live mode) EXAMPLES vaultmind frontmatter validate # check indexed database in current vault vaultmind frontmatter validate --vault ./my-vault # check a specific vault (indexed) vaultmind frontmatter validate --live # check raw .md files before indexing vaultmind frontmatter validate --json # machine-readable output for CI`, ConfigPrefix: "app.frontmatter", FlagOverrides: map[string]string{ "app.frontmatter.vault": "vault", "app.frontmatter.json": "json", "app.frontmatter.live": "live", }, }
FrontmatterValidateMetadata defines the metadata for the frontmatter validate command.
var GitStatusMetadata = config.CommandMetadata{ Use: "status", Short: "Git repository state for VaultMind policies", Long: "Report git repo state relevant to VaultMind mutation policies: branch, dirty files, merge/rebase status.", ConfigPrefix: "app.gitstatus", FlagOverrides: map[string]string{ "app.gitstatus.vault": "vault", "app.gitstatus.json": "json", }, }
GitStatusMetadata defines the metadata for the git status command.
var HooksInstallMetadata = config.CommandMetadata{ Use: "install [project-dir]", Short: "Install Claude Code hook scripts into a project", Long: `Write VaultMind's Claude Code hook scripts to <project-dir>/.claude/scripts/. The scripts are embedded in the vaultmind binary; this command copies them out for use by Claude Code's hook system. PROJECT-DIR Directory of the project to install hooks into. Defaults to the current working directory if omitted. The script writes to <project-dir>/.claude/scripts/. Creates the directory if missing. WHAT GETS INSTALLED All 8 embedded scripts are written to .claude/scripts/. Four are the core hooks --merge wires into your settings; the rest are helpers the core scripts source or that you opt into separately. Core (wired by --merge): load-persona.sh SessionStart — loads identity context vault-recall.sh UserPromptSubmit — per-turn pointers vault-track-read.sh PreToolUse(Read) — access tracking capture-episode.sh SessionEnd — episode transcript capture Helpers (written, not wired by default): vault-block-read.sh parked variant — block-and-redirect on Read auto-rag-guard.sh PreToolUse drift gate (opt-in — see auto-RAG) auto-rag-evaluate.sh scores auto-RAG guard decisions shell-strip.sh shared helper sourced by the auto-RAG scripts After writing the scripts, this command prints the .claude/settings.json "hooks" stanza that wires them. Pass --merge to apply it for you instead of copy-pasting (see WIRING below). --vault: point the hooks at a specific vault. The stanza bakes VAULTMIND_VAULT=<path> into every command so recall, read-tracking, episode capture, and persona loading all target that vault instead of the built-in default ($CLAUDE_PROJECT_DIR/vaultmind-identity). Omit it to keep the default convention. WIRING (--merge) --merge additively merges the four canonical hook entries straight into the project's hook config — no hand-editing. The merge NEVER clobbers: a project's own hooks are preserved, our entries are de-duplicated (so re-running is a no-op), all other settings and key order are kept, and malformed settings error out before any write. Pair with "hooks uninstall" to cleanly remove only our entries later. --local: merge into .claude/settings.local.json (gitignored, personal) instead of .claude/settings.json (committed, team-shared). Choose local for a personal persona vault; the default for a capability the whole team should get. --dry-run: with --merge, print the merged result without writing it — use it to preview/diff before applying. OVERWRITE PROTECTION Default: refuses to write any script that already exists. Lists the conflicts and exits non-zero so the agent can surface them. --force: overwrites existing scripts unconditionally. Use when refreshing after a vaultmind binary upgrade (the canonical source updates; existing copies become stale). --only: comma-separated subset of canonical scripts to install (e.g. --only auto-rag-guard.sh,shell-strip.sh,auto-rag-evaluate.sh). Consumers who've customized some hooks but want a clean canonical install of others — pass --only to scope the install. Unknown names rejected at lint time so typos surface explicitly. Doctor's hook-drift check (vaultmind doctor) flags when installed copies differ from the embedded canonical, so refresh-need is surfaced explicitly rather than left to guessing. EXAMPLES vaultmind hooks install # install all 8 into current dir vaultmind hooks install ~/dev/myproject # install all 8 into a specific project vaultmind hooks install --force # refresh after binary upgrade vaultmind hooks install --json # machine-readable output vaultmind hooks install --only auto-rag-guard.sh,shell-strip.sh # only the auto-RAG slice (companion-project pattern) vaultmind hooks install --vault ./my-knowledge # print a stanza wired to a specific vault vaultmind hooks install --vault ./my-knowledge --merge --dry-run # preview the merge without writing vaultmind hooks install --vault ./my-knowledge --merge # write scripts AND wire settings.json vaultmind hooks install --vault ./my-knowledge --merge --local # wire personal settings.local.json instead`, ConfigPrefix: "app.hooksinstall", FlagOverrides: map[string]string{ "app.hooksinstall.force": "force", "app.hooksinstall.json": "json", "app.hooksinstall.only": "only", "app.hooksinstall.vault": "vault", "app.hooksinstall.merge": "merge", "app.hooksinstall.local": "local", "app.hooksinstall.dryrun": "dry-run", }, }
HooksInstallMetadata defines the metadata for the `vaultmind hooks install` subcommand. Writes the embedded Claude Code hook scripts to <project>/.claude/scripts/, where the user's hook config (.claude/settings.json) can invoke them.
Default mode refuses to overwrite existing scripts; --force overwrites. Refresh after a binary upgrade is the same command with --force; doctor's hook-drift check (separate work) flags when stale copies need refreshing.
Per the extend-don't-overwrite principle, vaultmind never silently rewrites user files. Refuse-by-default + explicit --force is the same gate `vaultmind init` uses.
var HooksUninstallMetadata = config.CommandMetadata{ Use: "uninstall [project-dir]", Short: "Remove VaultMind's Claude Code hook entries from a project", Long: `Strip VaultMind's hook entries from a project's Claude Code hook config. The inverse of "hooks install --merge": it removes only the entries that reference VaultMind's canonical scripts, leaving a project's own hooks and all unrelated settings (permissions, etc.) intact. PROJECT-DIR Directory of the project to clean. Defaults to the current working directory if omitted. WHAT GETS REMOVED Any hook entry whose command invokes one of VaultMind's scripts (load-persona.sh, vault-recall.sh, vault-track-read.sh, capture-episode.sh, and the auto-RAG helpers). An event array left empty is dropped, and the "hooks" object is dropped if it becomes empty. Entries that merely have a similar name are NOT matched — removal is anchored to the exact script path, so a project's own hooks are never deleted. --local: clean .claude/settings.local.json instead of the default .claude/settings.json. Run once per file if you wired into both. --remove-scripts: also delete the installed scripts under .claude/scripts/. Off by default — uninstall touches only the hook config unless you ask for the scripts too. EXAMPLES vaultmind hooks uninstall # strip our entries from settings.json vaultmind hooks uninstall --local # strip from settings.local.json vaultmind hooks uninstall --remove-scripts # also delete .claude/scripts/*.sh vaultmind hooks uninstall ~/dev/myproject --json # machine-readable output`, ConfigPrefix: "app.hooksuninstall", FlagOverrides: map[string]string{ "app.hooksuninstall.json": "json", "app.hooksuninstall.local": "local", "app.hooksuninstall.removescripts": "remove-scripts", }, }
HooksUninstallMetadata defines the metadata for the `vaultmind hooks uninstall` subcommand — the inverse of `hooks install --merge`. It strips VaultMind's hook entries from a project's hook config, removing ONLY entries that reference our canonical scripts. A project's own hooks and any unrelated settings are left untouched.
Per the extend-don't-overwrite principle, vaultmind never silently mutates user files beyond its own footprint: uninstall is surgical, and --remove-scripts (off by default) is the explicit opt-in to also delete the installed script files.
var IdentityEnrollAddMetadata = config.CommandMetadata{ Use: "enroll-add", Short: "Admin-add a member's enrollment request to the trust-root registry (Contract-B)", Long: `Run the Contract-B ADMIN side of onboarding. Read a member's signed enrollment-request JSON (the output of ` + "`identity enroll`" + `), VERIFY proof-of-possession, confirm the request is for YOUR network, add the member's binding to the trust-root REGISTRY, and print the UPDATED UNSIGNED registry to stdout for ` + "`identity sign-registry`" + ` to root-sign. This verb does NOT sign — the established two-verb split (build-then-sign): enroll > request.json -> enroll-add --request request.json --registry current.json > new-unsigned.json -> sign-registry --file new-unsigned.json > new-signed.json (ROOT signer) --registry accepts either an UNSIGNED wireRegistry or a SIGNED distribution envelope (auto-detected); absent => a fresh registry (first emit = epoch 1). A signed-envelope --registry is INTEGRITY-verified against --root-pubkey before any mutation (the root signature must hold — freshness/rollback are NOT checked, so an admin can mutate a stale registry) and is REFUSED without --root-pubkey. At least one of --root-pubkey or --network-id is required to resolve the admin network; when both are set they must AGREE. A request whose network_id is not the admin network is REFUSED (cross-network). Uniqueness is checked FAIL-CLOSED before the append: a duplicate {slug,key_epoch} or a slug that already has a live binding is refused (a bad append would poison the whole registry at the consumer). NOTE: transport_pubkey/transport_endpoint are NOT yet carried into the binding (WireGuard wiring is a later slice). This CLI is KEYLESS: it never signs.`, ConfigPrefix: "app.identityenrolladd", FlagOverrides: map[string]string{ "app.identityenrolladd.request": "request", "app.identityenrolladd.registry": "registry", "app.identityenrolladd.root_pubkey": "root-pubkey", "app.identityenrolladd.network_id": "network-id", "app.identityenrolladd.validity_seconds": "validity-seconds", "app.identityenrolladd.origin_daemon": "origin-daemon", }, }
IdentityEnrollAddMetadata defines metadata for the `identity enroll-add` command — the ADMIN counterpart to `identity enroll`.
var IdentityEnrollMetadata = config.CommandMetadata{ Use: "enroll", Short: "Enroll into a Contract-B network: consume an invite, confirm the fingerprint, self-sign a request", Long: `Run the Contract-B MEMBER-onboarding journey. Consume a network INVITE (a ` + "`vmenroll1:`" + ` token or an enroll URL), fetch the relay's /.well-known/vaultmind-root, CROSS-CHECK it against the invite's trust anchor, confirm the FINGERPRINT out of band, then assemble + self-sign an enrollment request via the KEYLESS signer and print the signed request JSON to stdout. The cross-checks are the security spine: the relay's advertised root MUST decode to a valid key, be self-consistent (network_id == NetworkID(root)), and match the invite's anchor (raw bytes AND network id). Any mismatch is a HARD error (wrong relay / MITM / misconfig) and the flow refuses to proceed. After signing, the request is SELF-VERIFIED (proof-of-possession). A self-verify failure means the running signer holds a DIFFERENT key than --pubkey — the flow fails loudly and emits NOTHING. --pubkey is your base64-std ed25519 IDENTITY pubkey from ` + "`identity init`" + `. --transport-pubkey is your base64-std WireGuard pubkey (` + "`wg pubkey`" + `). Pipe stdout to a file and hand it to your admin out of band; they run ` + "`vaultmind identity enroll-add`" + `. This CLI is KEYLESS: it never opens the key file.`, ConfigPrefix: "app.identityenroll", FlagOverrides: map[string]string{ "app.identityenroll.invite": "invite", "app.identityenroll.display_name": "display-name", "app.identityenroll.slug": "slug", "app.identityenroll.pubkey": "pubkey", "app.identityenroll.transport_pubkey": "transport-pubkey", "app.identityenroll.transport_endpoint": "transport-endpoint", "app.identityenroll.signer_socket": "signer-socket", "app.identityenroll.yes": "yes", }, }
IdentityEnrollMetadata defines metadata for the `identity enroll` command.
var IdentityInitMetadata = config.CommandMetadata{ Use: "init", Short: "Mint an agent keypair and seal the private key to the signer", Long: `Mint a per-agent ed25519 keypair, SEAL the private key to the signer's 0600 key file, and print the PUBLIC key. The private key is NEVER printed or logged. Re-running refuses to overwrite an existing sealed key. DEV-INTERIM: the sealed key is a raw 0600 file. Secure-Enclave wrapping and a dedicated service uid are deferred (see internal/identity/signer).`, ConfigPrefix: "app.identityinit", FlagOverrides: map[string]string{ "app.identityinit.signer_key": "signer-key", }, }
IdentityInitMetadata defines metadata for the `identity init` command.
var IdentityInviteMetadata = config.CommandMetadata{ Use: "invite", Short: "Emit an UNSIGNED network invite carrying the trust anchor (Contract-B)", Long: `Build a Contract-B agent-network INVITE from the network's ROOT public key and relay base URL, and print three blocks: the bootstrap TOKEN, the enroll URL (the token in its fragment), and the FINGERPRINT to share out of band. The invite is UNSIGNED by design: it CARRIES the network's root anchor (the ed25519 root public key) itself, so a signature would prove nothing. Authenticity comes OUT OF BAND — the admin reads the fingerprint (the vmnet1:… network id) to the member over a TRUSTED channel, and the member confirms it before ` + "`identity enroll`" + ` trusts the anchor. --root-pubkey is the base64-std value ` + "`identity init`" + ` printed for the root key. --relay is the relay base URL (e.g. https://chat.acme.com). Both are REQUIRED; an invalid root pubkey or empty relay FAILS CLOSED with an error and no output.`, ConfigPrefix: "app.identityinvite", FlagOverrides: map[string]string{ "app.identityinvite.root_pubkey": "root-pubkey", "app.identityinvite.relay": "relay", }, }
IdentityInviteMetadata defines metadata for the `identity invite` command.
var IdentitySignEnrollmentMetadata = config.CommandMetadata{ Use: "sign-enrollment", Short: "Self-sign an agent ENROLLMENT request via the keyless signer (Contract-B)", Long: `Read an agent-enrollment request (stdin or --file), enforce the Contract-B enrollment gates, CANONICALIZE the signed subset (RFC 8785 JCS), then sign the canonical bytes via the signer over its 0600 socket and print {sig, pubkey} as JSON. The signed subset is { alg_version, created, display_name, key_epoch, network_id, nonce, pubkey, slug, transport_endpoint? (optional), transport_pubkey }. The pubkey field IS the enrolling agent's ed25519 identity key AND the verification key: the self-signature is PROOF-OF-POSSESSION of that key. It does NOT prove the slug/identity is authorized — an admin separately decides to add the binding to the trust-root registry (the out-of-band step). This CLI is KEYLESS: it NEVER opens the private-key file. If the signer is unreachable it FAILS CLOSED with an error (never a silent unsigned result).`, ConfigPrefix: "app.identitysignenrollment", FlagOverrides: map[string]string{ "app.identitysignenrollment.file": "file", "app.identitysignenrollment.signer_socket": "signer-socket", }, }
IdentitySignEnrollmentMetadata defines metadata for the `identity sign-enrollment` command.
var IdentitySignEnvelopeMetadata = config.CommandMetadata{ Use: "sign-envelope", Short: "Sign a chat MESSAGE envelope via the keyless signer (Contract-B slice 5)", Long: `Read a chat-message envelope (stdin or --file), enforce the Contract-B signing gates, CANONICALIZE the signed subset (RFC 8785 JCS), then sign the canonical bytes via the signer over its 0600 socket and print {sig, from_pubkey, key_epoch} as JSON. The signed subset is { alg_version, body, from_agent, key_epoch, nonce, room?, seq, to_agent? (exactly one), ts }. from_pubkey is DERIVED, not signed. The transport fields (id, sig, from_pubkey, receive_ts, ioguard_verdict, origin_daemon) are excluded from the signed bytes. This CLI is KEYLESS: it NEVER opens the private-key file. If the signer is unreachable it FAILS CLOSED with an error (never a silent unsigned result). Anti-replay (seq high-water + nonce-unseen) is the receiving daemon's job.`, ConfigPrefix: "app.identitysignenvelope", FlagOverrides: map[string]string{ "app.identitysignenvelope.file": "file", "app.identitysignenvelope.signer_socket": "signer-socket", "app.identitysignenvelope.from_pubkey": "from-pubkey", }, }
IdentitySignEnvelopeMetadata defines metadata for the `identity sign-envelope` command.
var IdentitySignMetadata = config.CommandMetadata{ Use: "sign", Short: "Validate, canonicalize, and sign an entry via the keyless signer", Long: `Read a Contract-B entry (stdin or --file), VALIDATE and CANONICALIZE it (slice-1 schema gate + RFC 8785 JCS), then send the canonical bytes to the signer over its 0600 socket and print the signature. This CLI is KEYLESS: it NEVER opens the private-key file. If the signer is unreachable it FAILS CLOSED with an error (never a silent unsigned result).`, ConfigPrefix: "app.identitysign", FlagOverrides: map[string]string{ "app.identitysign.file": "file", "app.identitysign.signer_socket": "signer-socket", }, }
IdentitySignMetadata defines metadata for the `identity sign` command.
var IdentitySignRegistryMetadata = config.CommandMetadata{ Use: "sign-registry", Short: "Sign a trust-root REGISTRY via the keyless signer (Contract-B)", Long: `Read an UNSIGNED registry (stdin or --file), enforce the Contract-B epoch gate, CANONICALIZE it (RFC 8785 JCS), then sign the canonical bytes via the signer over its 0600 socket and print the distribution envelope {registry, root_sig, root_key_epoch} as JSON. The input is a registry.Registry: { agents[], epoch, valid_from, valid_until }, where each binding is { authorized_origin_daemons[], display_name, key_epoch, pubkey (base64-std), revoked_at? (absent == live), slug, valid_from, valid_until }. Every pubkey is re-validated (wrong-length / small-order keys are rejected) so a hostile key cannot enter a binding. This CLI is KEYLESS: it NEVER opens the root private-key file. If the signer is unreachable it FAILS CLOSED with an error (never a silent unsigned result). The consumer trust gate (root-sig verify, anti-rollback, freshness) runs at load via VerifyAndLoad, not here.`, ConfigPrefix: "app.identitysignregistry", FlagOverrides: map[string]string{ "app.identitysignregistry.file": "file", "app.identitysignregistry.signer_socket": "signer-socket", }, }
IdentitySignRegistryMetadata defines metadata for the `identity sign-registry` command.
var IdentitySignerMetadata = config.CommandMetadata{ Use: "signer", Short: "Run the keyless custody signer daemon (Contract-B)", Long: `Run the keyless custody signer in the FOREGROUND. The signer holds the agent's ed25519 private key in memory and serves signatures over a 0600 Unix-domain socket, gated by LOCAL_PEERCRED to the current user's uid (the documented DEV-INTERIM posture). The private key NEVER leaves this process; the sign-* CLIs are KEYLESS and reach it only over the socket. This is a long-running process: it serves until it receives SIGINT/SIGTERM, then removes the socket and exits. Background it (or wire it under launchd) yourself. It FAILS CLOSED: a missing/unreadable key, a bind failure, or an empty uid allowlist refuses to start with a non-zero exit and prints nothing sensitive. DEV-INTERIM: the signer runs as the SAME uid as the CLI today. This is the custody ARCHITECTURE, not real isolation — that needs a dedicated service uid + launchd + sandbox + Secure-Enclave key wrap (deferred).`, ConfigPrefix: "app.identitysigner", FlagOverrides: map[string]string{ "app.identitysigner.signer_key": "signer-key", "app.identitysigner.signer_socket": "signer-socket", }, }
IdentitySignerMetadata defines metadata for the `identity signer` command — the keyless custody-signer DAEMON that the sign-* commands connect to.
var IndexMetadata = config.CommandMetadata{ Use: "index", Short: "Scan and index vault notes into SQLite, with optional embedding", Long: `Scan the vault directory and update the SQLite index so search and recall commands see current note contents. By default only re-parses notes whose content has changed since the last run (incremental). Use --full to purge and rebuild the entire index from scratch. FLAGS --vault path Vault root directory to index (default: current dir). --full Force a complete rebuild; purges the index first and re-parses every note. Shows deleted count explicitly. --embed Compute and store embeddings for all note bodies after indexing. Required for hybrid (semantic+keyword) search. --model name Embedding model to use with --embed. "minilm" — 384-dimensional, fast, pure-Go build. "bge-m3" — 1024-dimensional, dense+sparse+ColBERT (3-in-1), ORT-tagged build only. Empty (default): auto-selects bge-m3 on ORT builds, minilm on pure-Go builds. --allow-slow-backend Allow BGE-M3 on the pure-Go hugot backend. Omit this flag and the command refuses with a warning — BGE-M3 on pure-Go takes hours for a medium vault. --json Machine-readable JSON output (envelope format). EMBEDDING MODELS minilm: Default on pure-Go builds. Fast. Produces 384-dimensional dense vectors only. Sufficient for basic semantic search. bge-m3: Default on ORT-tagged builds ("task build:ort"). Produces dense (1024d) + sparse + ColBERT vectors in one pass, enabling the full 4-way RRF hybrid used by "ask" and "search". Recommended for recall quality. Requires an ORT binary; pure-Go falls back to minilm silently unless --allow-slow-backend is passed. OUTPUT INCLUDES Human-readable (default): "Indexed N notes (M skipped, A added, U updated, D deleted)" "Embedded N notes (M skipped, E errors) [model: <name>]" Warning line if any notes produced empty sparse/ColBERT output. JSON (--json): Envelope with index stats (indexed, added, updated, deleted, errors, full_rebuild) and, when --embed, embed stats (embedded, skipped, errors, model). EXAMPLES vaultmind index # incremental update vaultmind index --full # full rebuild from scratch vaultmind index --embed # incremental + compute embeddings vaultmind index --embed --model minilm # force minilm model explicitly vaultmind index --embed --model bge-m3 # bge-m3 (ORT build required) vaultmind index --vault ./my-vault --embed --json # JSON output for scripting`, ConfigPrefix: "app.index", FlagOverrides: map[string]string{ "app.index.vault": "vault", "app.index.json": "json", "app.index.full": "full", "app.index.embed": "embed", "app.index.model": "model", "app.index.allow_slow_backend": "allow-slow-backend", }, }
IndexMetadata defines the metadata for the index command.
var InitMetadata = config.CommandMetadata{ Use: "init [path]", Short: "Scaffold a fresh vault — persona-shaped, ready for you and your agent", Long: `Create a new VaultMind vault at <path> with the standard persona-shaped type registry, a vault-level README, and starter notes that demonstrate the schema. After init, you index, embed, and you're ready. WHAT YOU GET <path>/ .vaultmind/config.yaml Type registry — identity, principle, arc, reference, concept, source, decision README.md Vault model + workflow identity/who-am-i.md Foundational identity note (placeholder) references/current-context.md Live-edge priority note (placeholder) principles/principle-example.md Template — replace or delete arcs/arc-example.md Template — replace or delete The placeholder notes have today's date in their frontmatter so the index reads them cleanly without hand-editing. Replace the bodies with your agent's real content as your collaboration produces it. EXAMPLES vaultmind init ./my-vault Standard scaffold at a relative path. vaultmind init "$HOME/.vaultmind/persona" A vault outside the project tree — common when the agent's memory should persist across multiple repos. vaultmind init ./vaultmind-identity --wire-hooks Scaffold AND wire Claude Code in one step (see ONE-COMMAND SETUP). vaultmind init --print-instructions Print the concise agent-onboarding quick-start and exit. No vault created. The quick-start is the skimmable 20% — install, init, hooks, env-var routing, index/embed, first ask. Add --full to print the whole guide (preflight, project read, greenfield + migration paths, Claude Code wiring with diff-preview) instead. Use this when an AI agent is helping a new user wire vaultmind into their environment — paste the output to the agent. vaultmind init --print-instructions --full Print the full agent-onboarding guide instead of the quick-start. ONE-COMMAND SETUP (--wire-hooks) --wire-hooks does the Claude Code wiring for you right after the scaffold: it installs the hook scripts into the current project's .claude/scripts/ and merges the four hook entries into .claude/settings.json, baked to the new vault via VAULTMIND_VAULT. The merge is additive and NEVER clobbers — a project's own hooks are preserved, re-runs are no-ops, malformed settings error out before any write. (This is the same engine as "vaultmind hooks install --merge".) --local wire .claude/settings.local.json (gitignored, personal) instead of the committed settings.json --dry-run preview the settings merge without writing it The vault is created at <path>; the hooks are wired into the CURRENT directory's .claude/ (your project root). After wiring, index + embed so recall has something to retrieve, then restart Claude Code. To undo: vaultmind hooks uninstall. NEXT STEPS cd <path> vaultmind index --vault . # build the SQLite index vaultmind index --embed --vault . # compute embeddings (one-time) vaultmind ask "who am I" --vault . # see what the agent would see For agent-led setup (interview, project read, migration, hooks), run: vaultmind init --print-instructions THE MODEL VaultMind treats arcs — transformation notes — as the atomic unit of persona. Identity is carried by the journey, not by the rules. The default scaffold gives you placeholder identity + current-context notes and example templates for principles and arcs; let your real collaboration produce the rest.`, ConfigPrefix: "app.init", FlagOverrides: map[string]string{ "app.init.print_instructions": "print-instructions", "app.init.full": "full", "app.init.wire_hooks": "wire-hooks", "app.init.local": "local", "app.init.dry_run": "dry-run", "app.init.project_dir": "project-dir", }, }
InitMetadata defines the metadata for the init command — scaffolds a fresh persona-shaped vault at a user-provided path.
VaultMind is built for a human collaborating with an AI agent: the agent reads the vault as long-term memory, both human and agent curate the markdown. The default scaffold reflects that — types and starter notes match the persona-reconstruction model that makes VaultMind distinct from a plain notes app.
var LinksInMetadata = config.CommandMetadata{ Use: "in <id-or-path>", Short: "List notes linking to a note (inbound edges)", Long: `Find all notes that reference the given note (inbound edges). Useful for understanding a note's context and impact: which notes depend on it, cite it as rationale, or point to it as a concept to explore further. Each result shows the source note's ID, the edge type, and a confidence label (high, medium, low) reflecting how strongly the reference was detected. FLAGS --edge-type Filter to a specific edge type (e.g., "cites"). Omit to show all types. --json Output in machine-readable JSON. Includes target_id and a "links" array with source_id, edge_type, confidence, and resolution status per edge. --vault Path to vault root (default: current directory). EXAMPLES vaultmind links in concept-spreading-activation Show all notes that reference spreading-activation, one per line: source_id edge_type confidence. vaultmind links in decision-expand-cache --edge-type cites Show only notes that cite this decision as rationale. vaultmind links in concept-spreading-activation --json Machine-readable output; pipe to jq or an agent tool.`, ConfigPrefix: "app.links", FlagOverrides: map[string]string{ "app.links.vault": "vault", "app.links.json": "json", "app.links.edge_type": "edge-type", }, }
LinksInMetadata defines the metadata for the links in command.
var LinksNeighborsMetadata = config.CommandMetadata{ Use: "neighbors <id-or-path>", Short: "Explore a note's graph neighborhood via breadth-first traversal", Long: `Explore the notes reachable from the given note within N hops (breadth-first traversal). Useful for finding related material at increasing degrees of separation: direct references (depth 1), second-order clusters (depth 2), or broader context. Results are ordered by distance from the starting note and show the connecting edge type and confidence for each hop. CONFIDENCE LABELS Edges carry a confidence label (high, medium, low) reflecting how strongly a reference was detected. Use --min-confidence to prune weak references and focus on the most reliable connections. FLAGS --depth Maximum hops from the starting note (default: 1). Increase to explore further context. --min-confidence Minimum edge confidence to include: high, medium, or low (default: low, includes all edges). Useful for reducing noise. --max-nodes Cap the number of nodes returned (default: 200). If the cap is reached, output notes "(max reached)" so you know the graph was truncated. --json Output in machine-readable JSON. Includes a "nodes" array with id, distance, and edge_from (edge_type, confidence) per node, plus a "max_nodes_reached" boolean. --vault Path to vault root (default: current directory). EXAMPLES vaultmind links neighbors concept-spreading-activation Show all notes within 1 hop (direct references), one per line. vaultmind links neighbors concept-spreading-activation --depth 2 Show second-degree connections — notes that cite notes that cite this one. vaultmind links neighbors concept-spreading-activation --depth 2 --min-confidence medium Second-degree neighborhood, pruned to medium+ confidence edges (reduces noise). vaultmind links neighbors concept-spreading-activation --json Machine-readable output; pipe to jq or an agent tool.`, ConfigPrefix: "app.linksneighbors", FlagOverrides: map[string]string{ "app.linksneighbors.vault": "vault", "app.linksneighbors.json": "json", "app.linksneighbors.depth": "depth", "app.linksneighbors.min_confidence": "min-confidence", "app.linksneighbors.max_nodes": "max-nodes", }, }
LinksNeighborsMetadata defines the metadata for the links neighbors command.
var LinksOutMetadata = config.CommandMetadata{ Use: "out <id-or-path>", Short: "List notes referenced by a note (outbound edges)", Long: `Find all notes referenced by the given note (outbound edges). Shows what a note depends on, cites, or extends — useful for tracing a note's sources, following its reasoning chain, or finding related material. Each edge includes its type (e.g., "cites", "extends", "references") and a confidence label (high, medium, low) reflecting how strongly the reference was detected. FLAGS --edge-type Filter to a specific edge type (e.g., "cites"). Omit to show all types. --json Output in machine-readable JSON. Includes source_id and a "links" array with edge_type, confidence, target_id, and resolution status per edge. --vault Path to vault root (default: current directory). EXAMPLES vaultmind links out concept-spreading-activation Show all outbound edges from the note, one per line: target edge_type confidence. vaultmind links out decision-expand-cache --edge-type cites Show only edges of type "cites" — the sources this decision depends on. vaultmind links out concept-spreading-activation --json Machine-readable output; pipe to jq or an agent tool.`, ConfigPrefix: "app.links", FlagOverrides: map[string]string{ "app.links.vault": "vault", "app.links.json": "json", "app.links.edge_type": "edge-type", }, }
LinksOutMetadata defines the metadata for the links out command.
var LintFixLinksMetadata = config.CommandMetadata{ Use: "fix-links", Short: "Rewrite wikilinks to Obsidian-compatible format", Long: "Detect [[Title]] wikilinks that won't resolve in Obsidian and rewrite to [[filename|Title]].\nDefault is dry-run (preview). Use --fix to apply changes.", ConfigPrefix: "app.lintfixlinks", FlagOverrides: map[string]string{ "app.lintfixlinks.vault": "vault", "app.lintfixlinks.json": "json", "app.lintfixlinks.fix": "fix", }, }
LintFixLinksMetadata defines metadata for the lint fix-links subcommand.
var MemoryContextPackMetadata = config.CommandMetadata{ Use: "context-pack <id-or-path>", Short: "Pack the target note and ranked context items within a token budget", Long: `Load a target note, then fill a token budget with its ranked neighbors, stopping when the budget is exhausted. Designed to produce an agent-ready payload: the target is always included, followed by context items in priority order (explicit relations first, then inferred edges). TOKEN BUDGET The budget is a soft limit on tokens. Context items are added one by one in ranked order; as soon as adding the next item would exceed the budget, it is skipped and the "truncated" field in the output is set to true. The target note itself is always included regardless of its size. Use --slim to reduce the token footprint of context item frontmatter when the budget is tight. FLAGS --budget <tokens> Token budget for context assembly. Default: 4096. --depth <n> BFS traversal depth for finding candidate context items. Default: 1 (direct neighbors only). --max-items <n> Maximum number of context items to include. 0 means no limit beyond the token budget. Default: 0. --slim Reduce each context item's frontmatter to {type, title, status} only, saving tokens for more items. --vault <path> Path to vault root. Default: ".". --json Output as a JSON envelope instead of text. OUTPUT INCLUDES target: the target note's frontmatter and body context: ranked context items, each with frontmatter (full or slim) used_tokens: tokens consumed budget_tokens: the requested budget truncated: true if one or more items were dropped due to budget EXAMPLES vaultmind memory context-pack concept-spreading-activation # default 4096-token pack around the target vaultmind memory context-pack concept-spreading-activation --budget 2000 --slim # tight budget, slim frontmatter to fit more items vaultmind memory context-pack concept-spreading-activation --max-items 8 --slim --json # cap at 8 items, slim, machine-readable (preferred for agent hooks) WHEN TO USE Use context-pack when an agent needs a self-contained, token-bounded working context around a topic. For a full neighborhood traversal without a budget, use "memory recall". For a flat list of related notes, use "memory related".`, ConfigPrefix: "app.memorycontextpack", FlagOverrides: map[string]string{ "app.memorycontextpack.vault": "vault", "app.memorycontextpack.json": "json", "app.memorycontextpack.budget": "budget", "app.memorycontextpack.depth": "depth", "app.memorycontextpack.max_items": "max-items", "app.memorycontextpack.slim": "slim", }, }
MemoryContextPackMetadata defines metadata for the memory context-pack command.
var MemoryLinksMetadata = config.CommandMetadata{ Use: "links <id-or-path>", Short: "List directed wikilink edges for a note (outbound, inbound, or both)", Long: `List the directed link edges of a note. By default shows both directions; use --out for outbound edges only or --in for inbound edges (backlinks) only. Outbound edges are the notes this note references, cites, or extends. Inbound edges (backlinks) are the notes that reference this one — useful for finding callers, dependents, or consumers of a concept. Each edge includes its type (e.g., "cites", "extends", "references") and a confidence label (high, medium, low) reflecting how strongly it was detected. FLAGS --out Show only outbound edges (notes this note references). --in Show only inbound edges (backlinks: notes that reference this one). --both Show both directions (default). Mutually exclusive with --out/--in. --edge-type Filter to a specific edge type (e.g., "cites"). Omit to show all types. --json Output in machine-readable JSON. --vault Path to vault root (default: current directory). EXAMPLES vaultmind memory links concept-spreading-activation Show both inbound and outbound edges for the note. vaultmind memory links concept-spreading-activation --out Show only outbound edges (what the note references). vaultmind memory links concept-spreading-activation --in Show only backlinks (what references the note). vaultmind memory links concept-spreading-activation --out --json Machine-readable output; pipe to jq or an agent tool.`, ConfigPrefix: "app.memorylinks", FlagOverrides: map[string]string{ "app.memorylinks.vault": "vault", "app.memorylinks.json": "json", "app.memorylinks.edge_type": "edge-type", "app.memorylinks.out": "out", "app.memorylinks.in": "in", "app.memorylinks.both": "both", }, }
MemoryLinksMetadata defines metadata for the memory links command. It unifies directed wikilink-edge queries: outbound (--out), inbound (--in, backlinks), or both (--both, default). Absorbs the old top-level `links out` and `links in` commands into one direction-flagged command.
var MemoryNeighborsMetadata = config.CommandMetadata{ Use: "neighbors <id-or-path>", Short: "Traverse the graph from a note (BFS) and return neighbors with full frontmatter", Long: `Perform a breadth-first traversal starting from a target note and return all neighbors within the specified depth. Every node carries its full frontmatter, so callers get a rich, typed neighborhood without follow-up note-get calls. BFS (breadth-first search) means depth=1 returns only direct neighbors, depth=2 includes their neighbors as well, and so on. CONFIDENCE LEVELS Edges carry a confidence level (low, medium, high). --min-confidence sets the floor: only edges at or above that level are traversed. The default is "high" so traversal stays precise; lower it to include weaker, LLM-inferred relationships. FLAGS --depth <n> Maximum traversal depth. Default: 1. --max-nodes <n> Safety limit on result size. Default: 50. --min-confidence <l> Minimum edge confidence (low, medium, high). Default: high. --vault <path> Path to vault root. Default: ".". --json Output as a JSON envelope instead of text. EXAMPLES vaultmind memory neighbors concept-spreading-activation # direct neighbors (depth 1) at high confidence, with full frontmatter vaultmind memory neighbors concept-spreading-activation --depth 2 --max-nodes 20 # up to depth 2, capped at 20 nodes vaultmind memory neighbors concept-spreading-activation --min-confidence medium --json # include medium-confidence edges, machine-readable output WHEN TO USE Use neighbors when you want the full enriched neighborhood around a known note. For a flat list of edge-typed relations, use "memory related". For a token-budgeted payload ready for agent consumption, use "memory pack".`, ConfigPrefix: "app.memoryneighbors", FlagOverrides: map[string]string{ "app.memoryneighbors.vault": "vault", "app.memoryneighbors.json": "json", "app.memoryneighbors.depth": "depth", "app.memoryneighbors.min_confidence": "min-confidence", "app.memoryneighbors.max_nodes": "max-nodes", }, }
MemoryNeighborsMetadata defines metadata for the memory neighbors command. It merges the old `links neighbors` (BFS traversal) and `memory recall` (full-frontmatter enrichment) into one: BFS to a depth limit, returning every reachable node with its full frontmatter.
var MemoryPackMetadata = config.CommandMetadata{ Use: "pack <id-or-path>", Short: "Pack the target note and ranked context items within a token budget", Long: `Load a target note, then fill a token budget with its ranked neighbors, stopping when the budget is exhausted. Designed to produce an agent-ready payload: the target is always included, followed by context items in priority order (explicit relations first, then inferred edges). TOKEN BUDGET The budget is a soft limit on tokens. Context items are added one by one in ranked order; as soon as adding the next item would exceed the budget, it is skipped and the "truncated" field in the output is set to true. The target note itself is always included regardless of its size. Use --slim to reduce the token footprint of context item frontmatter when the budget is tight. FLAGS --budget <tokens> Token budget for context assembly. Default: 4096. --depth <n> BFS traversal depth for candidate context items. Default: 1. --max-items <n> Max context items. 0 means no limit beyond the budget. Default: 0. --slim Reduce each context item's frontmatter to {type, title, status}. --vault <path> Path to vault root. Default: ".". --json Output as a JSON envelope instead of text. EXAMPLES vaultmind memory pack concept-spreading-activation # default 4096-token pack around the target vaultmind memory pack concept-spreading-activation --budget 2000 --slim # tight budget, slim frontmatter to fit more items vaultmind memory pack concept-spreading-activation --max-items 8 --slim --json # cap at 8 items, slim, machine-readable (preferred for agent hooks) WHEN TO USE Use pack when an agent needs a self-contained, token-bounded working context around a topic. For a full neighborhood traversal without a budget, use "memory neighbors". For a flat list of related notes, use "memory related".`, ConfigPrefix: "app.memorypack", FlagOverrides: map[string]string{ "app.memorypack.vault": "vault", "app.memorypack.json": "json", "app.memorypack.budget": "budget", "app.memorypack.depth": "depth", "app.memorypack.max_items": "max-items", "app.memorypack.slim": "slim", }, }
MemoryPackMetadata defines metadata for the memory pack command. It is a rename of the old `memory context-pack` (identical behavior).
var MemoryRecallMetadata = config.CommandMetadata{ Use: "recall <id-or-path>", Short: "Traverse the graph from a note and return neighbors with full frontmatter", Long: `Perform a breadth-first traversal starting from a target note and return all neighbors within the specified depth. Every node in the result carries its full frontmatter, so callers get a rich, typed neighborhood without follow-up note-get calls. BFS (breadth-first search) means depth=1 returns only direct neighbors, depth=2 includes their neighbors as well, and so on. CONFIDENCE LEVELS Edges in the vault carry a confidence level (low, medium, high). --min-confidence sets the floor: only edges at or above that level are traversed. The default is "high" so recall stays precise; lower it to "medium" or "low" to include weaker, LLM-inferred relationships. FLAGS --depth <n> Maximum traversal depth. Default: 1. --max-nodes <n> Safety limit on result size. Traversal stops when N nodes have been collected. The JSON output includes a "max_nodes_reached" field when the limit was hit. Default: 50. --min-confidence <low|medium|high> Minimum edge confidence required to follow an edge. Default: high. --vault <path> Path to vault root. Default: ".". --json Output as a JSON envelope instead of text. EXAMPLES vaultmind memory recall concept-spreading-activation # direct neighbors (depth 1) at high confidence vaultmind memory recall concept-spreading-activation --depth 2 --max-nodes 20 # up to depth 2, capped at 20 nodes vaultmind memory recall concept-spreading-activation --min-confidence medium --json # include medium-confidence edges, machine-readable output WHEN TO USE Use recall when you want the full neighborhood around a known note — for populating a reasoning window or checking what is explicitly linked. For a flat list of edge-typed relations, use "memory related" instead. For a token-budgeted payload ready for agent consumption, use "memory context-pack" instead.`, ConfigPrefix: "app.memoryrecall", FlagOverrides: map[string]string{ "app.memoryrecall.vault": "vault", "app.memoryrecall.json": "json", "app.memoryrecall.depth": "depth", "app.memoryrecall.min_confidence": "min-confidence", "app.memoryrecall.max_nodes": "max-nodes", }, }
MemoryRecallMetadata defines metadata for the memory recall command.
var MemoryRelatedMetadata = config.CommandMetadata{ Use: "related <id-or-path>", Short: "List notes related to the target, filtered by edge type", Long: `Return all notes directly related to the target, with each result showing the edge type and confidence level. Use --mode to filter by how the relationship was established. MODES explicit Only edges recorded in the note's frontmatter (related_ids, parent_id, source_ids), wikilinks [[...]], and markdown links [...]. These are user-curated and carry high confidence. inferred Only LLM-inferred edges. These represent relationships the model detected during indexing but that the user has not explicitly linked. They carry medium or low confidence and are useful for discovery. mixed Both explicit and inferred edges, ranked by confidence and edge type. This is the default. FLAGS --mode <explicit|inferred|mixed> Which edge types to include. Default: mixed. --vault <path> Path to vault root. Default: ".". --json Output as a JSON envelope instead of text. EXAMPLES vaultmind memory related concept-spreading-activation # all related notes (explicit + inferred) vaultmind memory related concept-spreading-activation --mode explicit # only notes with explicit frontmatter or wikilink edges vaultmind memory related concept-spreading-activation --mode inferred --json # LLM-inferred suggestions only, machine-readable WHEN TO USE Use related for a flat list of directly linked notes when you already know the target. For a depth-traversal that follows edges transitively, use "memory neighbors". For a token-budgeted agent payload, use "memory pack".`, ConfigPrefix: "app.memoryrelated", FlagOverrides: map[string]string{ "app.memoryrelated.vault": "vault", "app.memoryrelated.json": "json", "app.memoryrelated.mode": "mode", }, }
MemoryRelatedMetadata defines metadata for the memory related command.
var MemorySummarizeMetadata = config.CommandMetadata{ Use: "summarize [id1 id2 ...]", Short: "Assemble note material for agent synthesis", Long: "Load frontmatter and body excerpts from a set of notes. Agents use this output to create reflection notes. Not an LLM call — data assembly only.", ConfigPrefix: "app.memorysummarize", FlagOverrides: map[string]string{ "app.memorysummarize.vault": "vault", "app.memorysummarize.json": "json", "app.memorysummarize.ids": "ids", "app.memorysummarize.include_body": "include-body", "app.memorysummarize.max_body_len": "max-body-len", }, }
MemorySummarizeMetadata defines metadata for the memory summarize command.
var NoteCreateMetadata = config.CommandMetadata{ Use: "create <path> --type <type>", Short: "Create a note from a template with field overrides", Long: `Create a new note at <path> by expanding the template registered for --type, then override individual frontmatter fields and body text before writing. --type is required. The type must be registered in the vault schema; unknown types are rejected with a list of registered alternatives. TEMPLATE WORKFLOW 1. The vault schema maps each type to a template file. 2. Placeholders in the template (ID, TITLE, PATH, CREATED_DATE) are auto-filled from the note path and creation time. 3. --field key=value patches a frontmatter field after auto-fill (repeatable). 4. --body or --body-stdin replaces the template body. 5. Required fields declared by the type must be present and non-empty after all substitutions; missing required fields fail with an actionable error naming the field and suggesting --field. 6. The note is written to <vault-root>/<path>. The path must stay inside the vault directory (path traversal is rejected). FLAGS --type <type> Note type (required). Must match a type in the vault schema. --vault <dir> Path to vault root (default: "."). --field key=value Patch a frontmatter field after template expansion (repeatable). --body <text> Replace the template body with literal text. --body-stdin Read the body replacement from stdin (overrides --body). --commit Stage and git-commit the new file after writing. --json Output a structured envelope instead of the default one-liner. OUTPUT INCLUDES (--json) path vault-relative path of the created note id auto-assigned note ID type the --type value used created true on success write_hash sha256 of the file as written (integrity check) commit_sha git commit SHA when --commit is used (omitted otherwise) warnings list of non-fatal issues (e.g. re-index failure) EXAMPLES vaultmind note create concepts/memory.md --type concept --vault my-vault # create a concept note; auto-fill ID, TITLE, CREATED_DATE from the template vaultmind note create principles/focus.md --type principle --field author=alice # create and set the "author" frontmatter field in one step vaultmind note create episodes/ep-001.md --type episode --body-stdin --vault vaultmind-identity <<EOF Session opened. Explored spreading-activation scoring. EOF # pipe a multi-line body from stdin vaultmind note create arcs/growth.md --type arc --commit --vault vaultmind-identity # create and immediately git-commit the new file`, ConfigPrefix: "app.notecreate", FlagOverrides: map[string]string{ "app.notecreate.vault": "vault", "app.notecreate.json": "json", "app.notecreate.type": "type", "app.notecreate.body": "body", "app.notecreate.commit": "commit", }, }
NoteCreateMetadata defines metadata for the note create command.
var NoteGetMetadata = config.CommandMetadata{ Use: "get <id-or-path>", Short: "Get a note's full content and metadata", Long: `Return full note content including frontmatter, body, headings, and blocks. Use --frontmatter-only to omit body text. This is the canonical READ-ONE-NOTE-BY-ID path. It fires access tracking (reinforcement signal for the activation-based ranking layer), so prefer it over the Read tool when you want to read a vault note's body. The cleanest read path is also the tracked one. EXAMPLES vaultmind note get reference-current-context --vault vaultmind-identity Print the note's id+type+title header followed by the body inline. vaultmind note get reference-current-context --vault vaultmind-identity --json Same content, structured envelope. Use from scripts. vaultmind note get concept-act-r --vault vaultmind-vault --frontmatter-only Header + frontmatter only, no body. Use to inspect tags/related_ids. PAIRS WELL WITH vaultmind ask "X" --pointers-only # find the right id, then note get it vaultmind self # see what you've been touching`, ConfigPrefix: "app.note", FlagOverrides: map[string]string{ "app.note.vault": "vault", "app.note.json": "json", "app.note.frontmatter_only": "frontmatter-only", }, }
NoteGetMetadata defines the metadata for the note get command.
var PingMetadata = config.CommandMetadata{ Use: "ping", Short: "Responds with a pong", Long: `The ping command demonstrates configuration, logging, and optional Bubble Tea UI. - Without arguments, prints "Pong". - Supports overriding its output and an optional interactive UI.`, ConfigPrefix: "app.ping", FlagOverrides: map[string]string{ "app.ping.output_message": "message", "app.ping.output_color": "color", "app.ping.ui": "ui", }, Examples: []string{ "ping", "ping --message 'Hello World!'", "ping --color green", "ping --ui", }, SeeAlso: []string{"docs"}, }
PingMetadata defines all metadata for the ping command
var ResolveMetadata = config.CommandMetadata{ Use: "resolve <id-or-title-or-alias>", Short: "Resolve ambiguous note references to canonical IDs", Long: `Turn a fragment — a partial ID, a title, an alias, or a file path — into one or more matched notes with a resolution tier that explains how the match was found. Use resolve when you have a string that might refer to a note but you are not certain of its exact ID, or when you want to check whether a reference is ambiguous before acting on it. RESOLUTION TIERS Resolve walks the input through five tiers, returning at the first hit: path Input contains "/" or ends in ".md"; matched against stored paths. id Exact match against the note's canonical ID. title Exact match against the note's title field. alias Exact match against any alias stored for the note. normalized Case-insensitive match on title or alias, including treating hyphens and underscores as spaces. If no tier produces a hit, resolve reports "No match". If a tier produces multiple hits, the result is marked ambiguous and all candidates are returned — resolve does not silently pick one. FLAGS --vault: path to the vault root directory (string, default ".") --json: output the full resolution envelope as JSON instead of plain text (bool, default false) OUTPUT INCLUDES Plain text (one line per match): <id> <type> <title> (<path>) JSON envelope: resolved whether any match was found ambiguous true when multiple notes matched at the same tier input the original query string resolution_tier which tier produced the match ("id", "title", etc.) matches[] array of { id, type, title, path, status } WHEN TO USE resolve You have a fragment or alias and need the canonical ID. Handles ambiguity explicitly — tells you when a string is not unique. ask You have a semantic question and want ranked context around the best-matching note; works across whole vault topics, not single IDs. search You want a ranked list of notes matching a free-text query without needing exact disambiguation. EXAMPLES vaultmind resolve concept-act-r --vault ./my-vault # exact ID lookup vaultmind resolve "ACT-R" --vault ./my-vault # case-insensitive title match vaultmind resolve act-r --vault ./my-vault # normalized (hyphen → space) vaultmind resolve notes/decision-foo.md --vault . # path shortcut vaultmind resolve spreading-activation --json --vault . # machine-readable output`, ConfigPrefix: "app.resolve", FlagOverrides: map[string]string{ "app.resolve.vault": "vault", "app.resolve.json": "json", }, }
ResolveMetadata defines the metadata for the resolve command.
var SchemaListTypesMetadata = config.CommandMetadata{ Use: "list-types", Short: "Show the vault's type registry — available note types, required fields, and valid statuses", Long: `Return every registered note type together with its required-fields flag and allowed status values. Agents run this during startup or before creating notes to discover what types the vault supports and what constraints apply to each. Humans rarely need it directly; its primary use is feeding agent initialization logic and type-aware tooling. OUTPUT INCLUDES Text (default): one line per type — name (12-char padded), required=true|false, statuses=[...] JSON (--json): envelope with status "ok", command "schema list-types", and a "data" object keyed by type name; each value carries required and statuses fields. FLAGS --json Output the registry as a JSON envelope (default: human-readable text). --vault Path to vault root (default: current directory). EXAMPLES vaultmind schema list-types Print the type registry as a text table — use to see at a glance what types exist. vaultmind schema list-types --vault ./my-vault Same, but targeting a vault at a specific path. vaultmind schema list-types --json Return the registry as a JSON envelope; use in agent init scripts or tooling that needs to validate a type before calling "note create". WHEN TO USE Run list-types before creating a note when you are unsure whether a type name is valid or which status values are accepted. It is cheaper than attempting a write and handling a validation error.`, ConfigPrefix: "app.schema", FlagOverrides: map[string]string{ "app.schema.vault": "vault", "app.schema.json": "json", }, }
SchemaListTypesMetadata defines the metadata for the schema list-types command.
var SearchMetadata = config.CommandMetadata{ Use: "search <query>", Short: "Search vault notes by keyword, semantic similarity, or both", Long: `Search note titles and body text and return ranked hits. Keyword mode is the default and needs no index; semantic and hybrid modes require embeddings built with "vaultmind index --embed". SEARCH MODES keyword (default) Pure full-text search using SQLite FTS5. Fast, no embeddings needed. Best for exact-term queries. semantic Embedding-based similarity search. Needs: vaultmind index --embed. Best for concept queries where exact wording varies. hybrid Combines keyword and semantic via reciprocal rank fusion (RRF). Best all-around mode when embeddings are available. Needs: vaultmind index --embed. FLAGS --vault string Path to vault root (default ".") --mode string Search mode: keyword, semantic, or hybrid (default "keyword") --type string Filter results to notes of this type (e.g. concept, source) --tag string Filter results to notes with this tag --limit int Maximum number of results to return (default 20) --offset int Skip the first N results for pagination (default 0) --json Output results as a JSON envelope instead of plain text OUTPUT INCLUDES Default: one line per hit — id followed by title --json: envelope with query, offset, limit, total, and hits array (each hit: id, title, score, type, path) WHEN TO USE search: You want to browse ranked hits and choose what to read next. ask: You want the top hit plus token-budgeted context already packed — one command replaces the search-then-recall chain. EXAMPLES vaultmind search "spreading activation" --vault my-vault vaultmind search "memory consolidation" --mode hybrid --vault my-vault # semantic + keyword vaultmind search "attention" --type concept --tag learning --vault my-vault # filtered vaultmind search "retrieval" --limit 5 --json --vault my-vault # machine-readable top 5 vaultmind search "recall" --limit 10 --offset 10 --vault my-vault # page 2`, ConfigPrefix: "app.search", FlagOverrides: map[string]string{ "app.search.vault": "vault", "app.search.json": "json", "app.search.limit": "limit", "app.search.offset": "offset", "app.search.type": "type", "app.search.tag": "tag", "app.search.mode": "mode", }, }
SearchMetadata defines the metadata for the search command.
var SelfMetadata = config.CommandMetadata{ Use: "self", Short: "Show your memory state — recent, hot, stale notes", Long: `Render the activation state of your vault — first-person AX for the agent using vaultmind as long-term memory. Reads access_count + last_accessed_at, which RecordNoteAccess populates on every successful Ask + note get. THREE SECTIONS Recent (newest first): The last N notes you touched. Anchors you in "where am I right now" in conceptual space. Hot (top activation): Ranked by ln(1+count) - d*ln(elapsed_hours). Captures both frequency and recency. Stale (drifting away): Accessed but past the threshold. What your memory used to hold but isn't returning to. The hot column shows activation as +0.00 for the leader, then negative numbers indicating how-much-below the leader. Order-preserving — the sign is just relative-distance, not "broken". EXAMPLES vaultmind self --vault vaultmind-vault Default — limit 10 per section, 7-day stale threshold. vaultmind self --vault vaultmind-identity --limit 5 Tighter view — 5 rows per section. THIS IS ALREADY AUTO-INJECTED The SessionStart hook runs 'vaultmind self' for both identity and research vaults at session start. You see your memory state ambiently before any work begins. Run this command manually only when you want a fresh check mid-session.`, ConfigPrefix: "app.self", FlagOverrides: map[string]string{ "app.self.vault": "vault", "app.self.limit": "limit", }, }
SelfMetadata defines the metadata for the self command — the agent's own memory-state introspection view (recent / hot / stale).
var VaultStatusMetadata = config.CommandMetadata{ Use: "status", Short: "Vault status summary (cold-start)", Long: "Single-call summary combining note counts, type registry, index freshness, and validation issues.", ConfigPrefix: "app.vaultstatus", FlagOverrides: map[string]string{ "app.vaultstatus.vault": "vault", "app.vaultstatus.json": "json", }, }
VaultStatusMetadata defines the metadata for the vault status command.
Functions ¶
func ApplyOptions ¶
func ApplyOptions() []config.ConfigOption
ApplyOptions returns config options for the apply command.
func ArcCandidatesOptions ¶
func ArcCandidatesOptions() []config.ConfigOption
ArcCandidatesOptions returns configuration options for `arc candidates`.
func AskOptions ¶
func AskOptions() []config.ConfigOption
AskOptions returns config options for the ask command.
func CheckOptions ¶
func CheckOptions() []config.ConfigOption
CheckOptions returns configuration options for the check command
func DataviewOptions ¶
func DataviewOptions() []config.ConfigOption
DataviewOptions returns config options for dataview commands.
func DocsCommandsOptions ¶ added in v0.1.11
func DocsCommandsOptions() []config.ConfigOption
DocsCommandsOptions returns configuration options for `docs commands`.
func DoctorHealOptions ¶ added in v0.1.11
func DoctorHealOptions() []config.ConfigOption
DoctorHealOptions returns configuration options for `doctor heal`.
func DoctorHealWikilinksOptions ¶ added in v0.1.11
func DoctorHealWikilinksOptions() []config.ConfigOption
DoctorHealWikilinksOptions returns configuration options for `doctor heal wikilinks`.
func DoctorOptions ¶
func DoctorOptions() []config.ConfigOption
DoctorOptions returns configuration options for the doctor command.
func ExperimentCompareOptions ¶
func ExperimentCompareOptions() []config.ConfigOption
ExperimentCompareOptions returns config options for the experiment compare command.
func ExperimentReportOptions ¶
func ExperimentReportOptions() []config.ConfigOption
ExperimentReportOptions returns config options for the experiment report command.
func ExperimentSummaryOptions ¶
func ExperimentSummaryOptions() []config.ConfigOption
ExperimentSummaryOptions returns config options for the experiment summary command.
func ExperimentTraceOptions ¶
func ExperimentTraceOptions() []config.ConfigOption
ExperimentTraceOptions returns config options for the experiment trace command.
func ExperimentsOptions ¶
func ExperimentsOptions() []config.ConfigOption
ExperimentsOptions returns config options for the experiments subsystem.
func ExportOptions ¶
func ExportOptions() []config.ConfigOption
ExportOptions returns configuration options for the export command.
func FrontmatterFixOptions ¶
func FrontmatterFixOptions() []config.ConfigOption
FrontmatterFixOptions returns configuration options for the fix command.
func FrontmatterMutationOptions ¶
func FrontmatterMutationOptions() []config.ConfigOption
FrontmatterMutationOptions returns config options for mutation commands.
func FrontmatterOptions ¶
func FrontmatterOptions() []config.ConfigOption
FrontmatterOptions returns configuration options for frontmatter commands.
func GitStatusOptions ¶
func GitStatusOptions() []config.ConfigOption
GitStatusOptions returns configuration options for git status.
func HooksInstallOptions ¶
func HooksInstallOptions() []config.ConfigOption
HooksInstallOptions returns configuration options for the hooks install subcommand. The project-dir argument is positional; --force and --json are the flags.
func HooksUninstallOptions ¶
func HooksUninstallOptions() []config.ConfigOption
HooksUninstallOptions returns configuration options for the hooks uninstall subcommand. The project-dir argument is positional.
func IdentityEnrollAddOptions ¶ added in v0.2.0
func IdentityEnrollAddOptions() []config.ConfigOption
IdentityEnrollAddOptions returns config options for `identity enroll-add`. Every flag description lives here (SSOT) — never inline in cmd/.
func IdentityEnrollOptions ¶ added in v0.2.0
func IdentityEnrollOptions() []config.ConfigOption
IdentityEnrollOptions returns config options for `identity enroll`. Every flag description lives here (SSOT) — never inline in cmd/.
func IdentityInitOptions ¶ added in v0.2.0
func IdentityInitOptions() []config.ConfigOption
IdentityInitOptions returns config options for `identity init`.
func IdentityInviteOptions ¶ added in v0.2.0
func IdentityInviteOptions() []config.ConfigOption
IdentityInviteOptions returns config options for `identity invite`.
func IdentitySignEnrollmentOptions ¶ added in v0.2.0
func IdentitySignEnrollmentOptions() []config.ConfigOption
IdentitySignEnrollmentOptions returns config options for `identity sign-enrollment`.
func IdentitySignEnvelopeOptions ¶ added in v0.2.0
func IdentitySignEnvelopeOptions() []config.ConfigOption
IdentitySignEnvelopeOptions returns config options for `identity sign-envelope`.
func IdentitySignOptions ¶ added in v0.2.0
func IdentitySignOptions() []config.ConfigOption
IdentitySignOptions returns config options for `identity sign`.
func IdentitySignRegistryOptions ¶ added in v0.2.0
func IdentitySignRegistryOptions() []config.ConfigOption
IdentitySignRegistryOptions returns config options for `identity sign-registry`.
func IdentitySignerOptions ¶ added in v0.2.0
func IdentitySignerOptions() []config.ConfigOption
IdentitySignerOptions returns config options for `identity signer`.
func IndexOptions ¶
func IndexOptions() []config.ConfigOption
IndexOptions returns configuration options for the index command.
func InitOptions ¶
func InitOptions() []config.ConfigOption
InitOptions returns configuration options for the init command. The path argument is positional; --print-instructions is the one flag, which prints the embedded onboarding doc and exits without creating a vault. The flag is the answer to AX-design Q2 ("where does the doc live?") — embedded in the binary, accessible wherever vaultmind is installed.
func LinksNeighborsOptions ¶
func LinksNeighborsOptions() []config.ConfigOption
LinksNeighborsOptions returns configuration options for the links neighbors command.
func LinksOptions ¶
func LinksOptions() []config.ConfigOption
LinksOptions returns configuration options for links commands.
func LintFixLinksOptions ¶
func LintFixLinksOptions() []config.ConfigOption
LintFixLinksOptions returns configuration options for the lint fix-links command.
func MemoryContextPackOptions ¶
func MemoryContextPackOptions() []config.ConfigOption
MemoryContextPackOptions returns config options for memory context-pack.
func MemoryLinksOptions ¶ added in v0.1.11
func MemoryLinksOptions() []config.ConfigOption
MemoryLinksOptions returns config options for memory links.
func MemoryNeighborsOptions ¶ added in v0.1.11
func MemoryNeighborsOptions() []config.ConfigOption
MemoryNeighborsOptions returns config options for memory neighbors.
func MemoryPackOptions ¶ added in v0.1.11
func MemoryPackOptions() []config.ConfigOption
MemoryPackOptions returns config options for memory pack.
func MemoryRecallOptions ¶
func MemoryRecallOptions() []config.ConfigOption
MemoryRecallOptions returns config options for memory recall.
func MemoryRelatedOptions ¶
func MemoryRelatedOptions() []config.ConfigOption
MemoryRelatedOptions returns config options for memory related.
func MemorySummarizeOptions ¶
func MemorySummarizeOptions() []config.ConfigOption
MemorySummarizeOptions returns config options for memory summarize.
func NoteCreateOptions ¶
func NoteCreateOptions() []config.ConfigOption
NoteCreateOptions returns config options for note create.
func NoteOptions ¶
func NoteOptions() []config.ConfigOption
NoteOptions returns configuration options for note commands.
func PingOptions ¶
func PingOptions() []config.ConfigOption
PingOptions returns configuration options for the ping command
func ResolveOptions ¶
func ResolveOptions() []config.ConfigOption
ResolveOptions returns configuration options for the resolve command.
func SchemaOptions ¶
func SchemaOptions() []config.ConfigOption
SchemaOptions returns configuration options for schema commands.
func SearchOptions ¶
func SearchOptions() []config.ConfigOption
SearchOptions returns configuration options for the search command.
func SelfOptions ¶
func SelfOptions() []config.ConfigOption
SelfOptions returns configuration options for the self command.
func VaultStatusOptions ¶
func VaultStatusOptions() []config.ConfigOption
VaultStatusOptions returns configuration options for vault status.
Types ¶
This section is empty.
Source Files
¶
- apply_config.go
- arc_candidates_config.go
- ask_config.go
- check_config.go
- dataview_config.go
- docs_commands_config.go
- doctor_config.go
- doctor_heal_config.go
- experiment_config.go
- experiments_config.go
- export_config.go
- frontmatter_config.go
- frontmatter_fix_config.go
- frontmatter_mutation_config.go
- git_status_config.go
- hooks_install_config.go
- hooks_uninstall_config.go
- identity_enroll_add_config.go
- identity_enroll_config.go
- identity_init_config.go
- identity_invite_config.go
- identity_sign_config.go
- identity_sign_enrollment_config.go
- identity_sign_envelope_config.go
- identity_sign_registry_config.go
- identity_signer_config.go
- index_config.go
- init_config.go
- links_config.go
- lint_config.go
- memory_config.go
- note_config.go
- note_create_config.go
- ping_config.go
- resolve_config.go
- schema_config.go
- search_config.go
- self_config.go
- vault_config.go