Documentation
¶
Overview ¶
Package fix implements the `vaultmind frontmatter fix` command's logic — walking the vault and identifying domain notes that are missing the `created` field, then optionally writing it via the existing mutator.
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` — a tolerated optional field worth filling for migration vaults where notes pre-date any auto-stamp era.
Default mode is dry-run. Apply is opt-in. Per the extend-don't-overwrite principle, vaultmind never silently rewrites user files; the human/agent must explicitly --apply to commit the changes.
User-owned fields (title, status, tags, related_ids, etc.) are NEVER touched. The mutator's existing infrastructure (atomic writes, conflict detection, schema validation) handles the actual write — this package is the discovery + iteration layer.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func DefaultCreatedDateResolver ¶
DefaultCreatedDateResolver tries git first-commit, falls back to file mtime, falls back to today. Returns (date-string, source) where source is "git", "mtime", or "today". Date is YYYY-MM-DD (date-only) — created is a humanish "when this was born" stamp.
Types ¶
type Config ¶
type Config struct {
// VaultPath is the vault root.
VaultPath string
// Apply: when true, write changes via mutator. When false (default),
// dry-run — items are populated with proposed values + diffs but no
// file is written.
Apply bool
// CreatedResolver is optional; defaults to DefaultCreatedDateResolver
// (git first-commit → file mtime → today). Tests inject deterministic
// resolvers for stable assertions.
CreatedResolver CreatedDateResolver
}
Config controls a fix run.
type CreatedDateResolver ¶
CreatedDateResolver computes a `created` date for a note path. Returns (value, source) where source describes provenance — "git", "mtime", or "today". Allows tests to inject deterministic values without touching the filesystem or git.
type Item ¶
type Item struct {
Path string `json:"path"`
ID string `json:"id"`
MissingFields []string `json:"missing_fields"`
ProposedValues map[string]string `json:"proposed_values"`
Sources map[string]string `json:"sources"`
Diff string `json:"diff,omitempty"`
Error string `json:"error,omitempty"`
}
Item is one note that needs backfill.
type Result ¶
type Result struct {
VaultPath string `json:"vault_path"`
FilesScanned int `json:"files_scanned"`
NotesAffected int `json:"notes_affected"`
Items []Item `json:"items"`
Applied bool `json:"applied"`
}
Result is the JSON-serializable output of RunBackfill.
func RunBackfill ¶
RunBackfill walks the vault, identifies domain notes missing vaultmind-owned fields, and (if cfg.Apply) writes the missing fields via the mutator. Always returns a Result describing what was found / what would change.