@bartolli/kmd 0.5.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/kmd.mjs +1068 -164
- package/dist/kmd.mjs.map +4 -4
- package/package.json +1 -1
package/dist/kmd.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../db/src/database.ts", "../../
|
|
4
|
-
"sourcesContent": ["import { createHash } from 'node:crypto';\nimport { realpathSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { basename, join, resolve } from 'node:path';\nimport { DatabaseSync } from 'node:sqlite';\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS pages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n path TEXT UNIQUE NOT NULL,\n title TEXT NOT NULL,\n kind TEXT NOT NULL,\n scope TEXT,\n topic TEXT,\n status TEXT NOT NULL DEFAULT 'draft',\n summary TEXT,\n tags TEXT,\n updated TEXT,\n body TEXT,\n content_hash TEXT,\n meta TEXT\n);\n\nCREATE INDEX IF NOT EXISTS pages_scope_kind ON pages(scope, kind, status);\nCREATE INDEX IF NOT EXISTS pages_topic_kind ON pages(topic, kind, status);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS pages_fts USING fts5(\n title, summary, body,\n content='pages',\n content_rowid='id'\n);\n\nCREATE TABLE IF NOT EXISTS links (\n source_path TEXT NOT NULL,\n target_path TEXT NOT NULL,\n link_text TEXT,\n PRIMARY KEY (source_path, target_path)\n);\n\nCREATE INDEX IF NOT EXISTS links_source ON links(source_path);\nCREATE INDEX IF NOT EXISTS links_target ON links(target_path);\n\nCREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts TEXT DEFAULT (datetime('now')),\n scope TEXT,\n operation TEXT NOT NULL,\n path TEXT,\n note TEXT\n);\n\nCREATE INDEX IF NOT EXISTS events_scope_ts ON events(scope, ts DESC);\n\nCREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n`;\n\nexport function openDatabase(dbPath: string): DatabaseSync {\n const db = new DatabaseSync(dbPath);\n db.exec('PRAGMA journal_mode = WAL');\n db.exec('PRAGMA foreign_keys = ON');\n db.exec(SCHEMA);\n return db;\n}\n\n/**\n * Directory holding all per-vault indexes: `$KMD_HOME/db/{vault-key}/index.db`\n * (default `~/.kmd`). One directory per vault keyed by resolved path, so two\n * vaults can never clobber each other's index and a moved/re-pointed vault\n * gets a fresh one.\n */\nexport function indexRootDir(): string {\n const home = process.env.KMD_HOME ?? join(homedir(), '.kmd');\n return join(home, 'db');\n}\n\n/**\n * Resolved (symlink-free, absolute) vault root \u2014 the canonical identity a\n * vault is keyed by. Falls back to plain resolution when the path does not\n * exist yet.\n */\nexport function canonicalVaultRoot(vaultRoot: string): string {\n try {\n return realpathSync(vaultRoot);\n } catch {\n return resolve(vaultRoot);\n }\n}\n\n/** `{basename}-{8-hex}` \u2014 human-scannable, collision-safe per resolved path. */\nexport function vaultKey(vaultRoot: string): string {\n const canonical = canonicalVaultRoot(vaultRoot);\n const hash = createHash('sha256').update(canonical).digest('hex').slice(0, 8);\n return `${basename(canonical)}-${hash}`;\n}\n\n/** Absolute path of the vault's index database file. */\nexport function resolveIndexPath(vaultRoot: string): string {\n return join(indexRootDir(), vaultKey(vaultRoot), 'index.db');\n}\n\nexport function getMeta(db: DatabaseSync, key: string): string | null {\n const row = db.prepare('SELECT value FROM meta WHERE key = ?').get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n}\n\nexport function setMeta(db: DatabaseSync, key: string, value: string): void {\n db.prepare(\n 'INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value'\n ).run(key, value);\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\nconst ScopeSchema = z.object({\n repo: z.string().optional(),\n methodology: z.string().optional(),\n status: z.string()\n});\n\nconst KindEntrySchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n signal: z.string(),\n where: z.string()\n })\n]);\n\nconst VaultConfigSchema = z\n .object({\n scopes: z.record(z.string(), ScopeSchema),\n kinds: z.array(KindEntrySchema),\n statuses: z.array(z.string()),\n methodologies: z.array(z.string()),\n tags: z.object({\n canonical: z.array(z.string()),\n aliases: z.record(z.string(), z.string())\n }),\n authoring_rules: z.string().optional(),\n authoring_rules_extra: z.string().optional(),\n sync_protocol: z.string().optional(),\n sync_protocol_extra: z.string().optional()\n })\n .superRefine((config, ctx) => {\n for (const [name, scope] of Object.entries(config.scopes)) {\n if (scope.methodology !== undefined && !config.methodologies.includes(scope.methodology)) {\n ctx.addIssue({\n code: 'custom',\n path: ['scopes', name, 'methodology'],\n message: `\"${scope.methodology}\" is not in the methodologies list`\n });\n }\n }\n });\n\nexport type KindEntry = z.infer<typeof KindEntrySchema>;\nexport type VaultConfig = z.infer<typeof VaultConfigSchema>;\n\n/** Kind name of a `kinds` entry \u2014 plain string, or the object form's `name`. */\nexport function kindName(entry: KindEntry): string {\n return typeof entry === 'string' ? entry : entry.name;\n}\n\n/**\n * Kinds with built-in engine pedagogy (kind-selector rows; most also carry a\n * served template). An object-form entry with one of these names rewords its\n * selector row only \u2014 it never creates custom-template expectations.\n */\nexport const BUILT_IN_KINDS: ReadonlySet<string> = new Set([\n 'project',\n 'spec',\n 'adr',\n 'plan',\n 'story',\n 'ops',\n 'topic',\n 'article',\n 'src',\n 'note',\n 'artifact',\n 'prompt'\n]);\n\n/**\n * Load and validate `$vaultRoot/vault.yaml` \u2014 the single source of truth for\n * the controlled vocabulary. Throws (fail-loud) when the file is missing or\n * the contents don't satisfy the schema; sync must not run on partial\n * vocabulary.\n */\nexport async function loadVaultConfig(vaultRoot: string): Promise<VaultConfig> {\n const path = join(vaultRoot, 'vault.yaml');\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (err) {\n throw new Error(`vault.yaml not found at ${path}`, { cause: err });\n }\n const parsed = VaultConfigSchema.safeParse(parse(raw));\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('\\n');\n throw new Error(`Invalid vault.yaml at ${path}:\\n${issues}`);\n }\n return parsed.data;\n}\n", "import { parse as parseYaml } from 'yaml';\n\nexport interface ParsedFrontmatter {\n data: Record<string, unknown>;\n content: string;\n}\n\n// Leading `---` block, YAML, closing `---`, then one consumed newline. Matches\n// gray-matter's delimiter handling; the closing `---` must be on its own line so\n// `---` rules inside the body are left intact.\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n?---\\r?\\n?/;\n\n/**\n * Split a page's frontmatter from its body using the `yaml` parser. Throws\n * (deterministically, no cache) when the frontmatter is not valid YAML \u2014 this is\n * the failure mode `wiki validate` exists to catch. A page with no leading\n * delimiter parses to empty data and the whole input as body.\n */\nexport function parseFrontmatter(raw: string): ParsedFrontmatter {\n const match = FRONTMATTER_RE.exec(raw);\n if (!match) {\n return { data: {}, content: raw };\n }\n const yamlText = match[1] ?? '';\n const content = raw.slice(match[0].length);\n if (yamlText.trim() === '') {\n return { data: {}, content };\n }\n const parsed = parseYaml(yamlText);\n const data =\n parsed !== null && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {};\n return { data, content };\n}\n", "import { createHash } from 'node:crypto';\nimport { mkdirSync } from 'node:fs';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { canonicalVaultRoot, openDatabase, resolveIndexPath, setMeta } from '@llm-wiki/db/database';\nimport { z } from 'zod';\nimport { loadVaultConfig } from './config.js';\nimport { type ParsedFrontmatter, parseFrontmatter } from './frontmatter.js';\n\nconst EnvSchema = z.object({\n WIKI_VAULT: z.string().min(1)\n});\n\n// Scan only the three content domains. raw/, templates/, .obsidian/, .git/\n// are intentionally excluded by the design.\nexport const SCAN_DOMAINS = ['projects', 'research', 'notes'] as const;\n\n// [[target]], [[target|display]], [[target#heading]], [[target^block]]\nconst WIKILINK_RE = /\\[\\[([^\\]|#^]+)(?:[#^][^\\]|]*)?(?:\\|([^\\]]+))?\\]\\]/g;\n\ninterface Frontmatter {\n title?: string;\n kind?: string;\n status?: string;\n summary?: string;\n tags?: string[];\n updated?: string | Date;\n}\n\n// Frontmatter keys that already map to first-class indexed columns. Anything\n// outside this set flows into the `meta` JSONB column verbatim, so future\n// vocabulary extensions (e.g. story.triage_state, story.category) become\n// queryable without further schema changes.\nconst INDEXED_FRONTMATTER_KEYS = new Set<string>([\n 'title',\n 'kind',\n 'status',\n 'summary',\n 'tags',\n 'updated',\n 'scope',\n 'topic'\n]);\n\ninterface WikiLink {\n target: string;\n text: string | null;\n}\n\ninterface PageFields {\n path: string;\n title: string;\n kind: string;\n scope: string | null;\n topic: string | null;\n status: string;\n summary: string | null;\n tags: string[] | null;\n updated: string | null;\n body: string;\n hash: string;\n meta: Record<string, unknown> | null;\n}\n\ntype SyncResult = 'changed' | 'unchanged' | 'skipped';\n\nfunction loadEnv(): { WIKI_VAULT: string } {\n const parsed = EnvSchema.safeParse({\n WIKI_VAULT: process.env.WIKI_VAULT\n });\n if (!parsed.success) {\n console.error('invalid env:');\n console.error(parsed.error.format());\n process.exit(1);\n }\n return parsed.data;\n}\n\nexport async function walkMarkdown(root: string, domain: string): Promise<string[]> {\n const out: string[] = [];\n async function recurse(dir: string): Promise<void> {\n // null when the domain dir doesn't exist yet \u2014 fine, nothing to walk.\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => null);\n if (!entries) return;\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n if (entry.isDirectory()) {\n await recurse(join(dir, entry.name));\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n out.push(join(dir, entry.name));\n }\n }\n }\n await recurse(join(root, domain));\n return out;\n}\n\nexport function toRelativePath(root: string, absolute: string): string {\n return relative(root, absolute).split(sep).join('/');\n}\n\nfunction sha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function extractWikilinks(body: string): WikiLink[] {\n const links: WikiLink[] = [];\n const seen = new Set<string>();\n for (const match of body.matchAll(WIKILINK_RE)) {\n const rawTarget = match[1]?.trim() ?? '';\n if (!rawTarget) continue;\n // Treat any existing extension as authoritative (handles embeds of\n // `.base`, `.png`, `.pdf`, etc.); only append `.md` when the target\n // is bare.\n const hasExt = /\\.[a-zA-Z0-9]+$/.test(rawTarget);\n const target = hasExt ? rawTarget : `${rawTarget}.md`;\n const text = match[2]?.trim() ?? null;\n const key = `${target}|${text ?? ''}`;\n if (seen.has(key)) continue;\n seen.add(key);\n links.push({ target, text });\n }\n return links;\n}\n\n/**\n * Path is authoritative for scope/topic. Frontmatter may also carry these\n * (for human readability) but sync trusts the filesystem.\n *\n * projects/{scope}/... \u2192 scope = first segment\n * research/{topic}/... \u2192 topic = first segment\n * notes/... \u2192 both null\n */\nexport function deriveLocation(relPath: string): { scope: string | null; topic: string | null } {\n const segments = relPath.split('/');\n const domain = segments[0];\n if (domain === 'projects' && segments.length >= 2 && segments[1]) {\n return { scope: segments[1], topic: null };\n }\n if (domain === 'research' && segments.length >= 2 && segments[1]) {\n return { scope: null, topic: segments[1] };\n }\n return { scope: null, topic: null };\n}\n\n/**\n * Build the page row from frontmatter + path. Returns `null` to signal\n * \"skip this file\" (intentionally not indexed).\n *\n * Skip rules:\n * - No `title` in frontmatter \u2192 narrative-only page (e.g., primer.md).\n * - No `kind` AND not under notes/ \u2192 authoring incomplete; warn.\n *\n * Notes are the one place where `kind` is implied by location.\n */\nexport function buildPageFields(\n relPath: string,\n raw: string,\n parsed: ParsedFrontmatter,\n knownScopes: ReadonlySet<string>\n): PageFields | null {\n const fm = parsed.data as Frontmatter;\n if (!fm.title) {\n return null;\n }\n\n let kind = fm.kind;\n if (!kind) {\n if (relPath.startsWith('notes/')) {\n kind = 'note';\n } else {\n console.warn(` skip: ${relPath} \u2014 has title but missing kind`);\n return null;\n }\n }\n\n const { scope, topic } = deriveLocation(relPath);\n if (scope !== null && !knownScopes.has(scope)) {\n throw new Error(\n `unknown scope \"${scope}\" for ${relPath} \u2014 add it to vault.yaml or remove the page`\n );\n }\n const updated =\n fm.updated instanceof Date\n ? fm.updated.toISOString().slice(0, 10)\n : typeof fm.updated === 'string'\n ? fm.updated.slice(0, 10)\n : null;\n\n const metaEntries = Object.entries(parsed.data as Record<string, unknown>).filter(\n ([k]) => !INDEXED_FRONTMATTER_KEYS.has(k)\n );\n const meta = metaEntries.length > 0 ? Object.fromEntries(metaEntries) : null;\n\n return {\n path: relPath,\n title: fm.title,\n kind,\n scope,\n topic,\n status: fm.status ?? (kind === 'note' ? 'active' : 'draft'),\n summary: fm.summary ?? null,\n tags: Array.isArray(fm.tags) ? fm.tags : null,\n updated,\n body: parsed.content,\n hash: sha256(raw),\n meta\n };\n}\n\nexport function syncPage(db: DatabaseSync, fields: PageFields): SyncResult {\n const existing = db.prepare('SELECT content_hash FROM pages WHERE path = ?').get(fields.path) as\n | { content_hash: string | null }\n | undefined;\n if (existing?.content_hash === fields.hash) {\n return 'unchanged';\n }\n\n const upsert = db.prepare(\n `INSERT INTO pages (path, title, kind, scope, topic, status, summary, tags, updated, body, content_hash, meta)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (path) DO UPDATE SET\n title = EXCLUDED.title,\n kind = EXCLUDED.kind,\n scope = EXCLUDED.scope,\n topic = EXCLUDED.topic,\n status = EXCLUDED.status,\n summary = EXCLUDED.summary,\n tags = EXCLUDED.tags,\n updated = EXCLUDED.updated,\n body = EXCLUDED.body,\n content_hash = EXCLUDED.content_hash,\n meta = EXCLUDED.meta`\n );\n\n upsert.run(\n fields.path,\n fields.title,\n fields.kind,\n fields.scope,\n fields.topic,\n fields.status,\n fields.summary,\n fields.tags ? JSON.stringify(fields.tags) : null,\n fields.updated,\n fields.body,\n fields.hash,\n fields.meta ? JSON.stringify(fields.meta) : null\n );\n\n db.prepare('DELETE FROM links WHERE source_path = ?').run(fields.path);\n const insertLink = db.prepare(\n `INSERT INTO links (source_path, target_path, link_text)\n VALUES (?, ?, ?)\n ON CONFLICT (source_path, target_path) DO NOTHING`\n );\n for (const link of extractWikilinks(fields.body)) {\n insertLink.run(fields.path, link.target, link.text);\n }\n\n return 'changed';\n}\n\nexport async function runSync(): Promise<void> {\n const env = loadEnv();\n const dbPath = resolveIndexPath(env.WIKI_VAULT);\n console.log(`sync: ${env.WIKI_VAULT} \u2192 ${dbPath}`);\n\n const vaultConfig = await loadVaultConfig(env.WIKI_VAULT);\n const scopes = new Set(Object.keys(vaultConfig.scopes));\n\n mkdirSync(dirname(dbPath), { recursive: true });\n const db = openDatabase(dbPath);\n\n try {\n const files: string[] = [];\n for (const domain of SCAN_DOMAINS) {\n files.push(...(await walkMarkdown(env.WIKI_VAULT, domain)));\n }\n\n const indexedPaths: string[] = [];\n let changed = 0;\n let unchanged = 0;\n let skipped = 0;\n\n for (const file of files) {\n const path = toRelativePath(env.WIKI_VAULT, file);\n const raw = await readFile(file, 'utf8');\n const parsed = parseFrontmatter(raw);\n const fields = buildPageFields(path, raw, parsed, scopes);\n if (!fields) {\n skipped++;\n continue;\n }\n\n const result = syncPage(db, fields);\n if (result === 'changed') {\n changed++;\n } else {\n unchanged++;\n }\n indexedPaths.push(path);\n }\n\n let pagesDeleted = 0;\n let linksDeleted = 0;\n if (indexedPaths.length > 0) {\n const placeholders = indexedPaths.map(() => '?').join(', ');\n const pageResult = db\n .prepare(`DELETE FROM pages WHERE path NOT IN (${placeholders})`)\n .run(...indexedPaths);\n pagesDeleted = Number(pageResult.changes);\n const linkResult = db\n .prepare('DELETE FROM links WHERE source_path NOT IN (SELECT path FROM pages)')\n .run();\n linksDeleted = Number(linkResult.changes);\n } else {\n console.warn('no indexable pages found; skipping orphan deletion (safety)');\n }\n\n db.exec(\"INSERT INTO pages_fts(pages_fts) VALUES('rebuild')\");\n\n setMeta(db, 'vault_root', canonicalVaultRoot(env.WIKI_VAULT));\n setMeta(db, 'last_synced', new Date().toISOString());\n\n console.log(\n `done: ${changed} changed, ${unchanged} unchanged, ${skipped} skipped, ${pagesDeleted} pages deleted, ${linksDeleted} link orphans cleared`\n );\n } finally {\n db.close();\n }\n}\n", "import { readFile, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { BUILT_IN_KINDS, kindName, loadVaultConfig, type VaultConfig } from './config.js';\nimport { parseFrontmatter } from './frontmatter.js';\nimport {\n deriveLocation,\n extractWikilinks,\n SCAN_DOMAINS,\n toRelativePath,\n walkMarkdown\n} from './sync.js';\n\nexport type Severity = 'error' | 'warning';\n\nexport interface Finding {\n path: string;\n rule: string;\n severity: Severity;\n message: string;\n}\n\n/** Mirrors sync's indexability marker: `buildPageFields` skips any page whose\n * `title` is not a non-empty string. */\nfunction hasIndexableTitle(data: Record<string, unknown>): boolean {\n return typeof data.title === 'string' && data.title.trim() !== '';\n}\n\n/**\n * A page sync would index: it has a `title` and either a `kind` or lives under\n * notes/ (notes imply kind=note). Title-less narrative/reserved pages (primers,\n * the title-less ontology/alayacare pages) are skipped by sync, so the\n * sync-mirror checks are gated on this \u2014 validate governs what sync governs.\n * The kind-floor contract checks gate on kind intent instead: a missing or\n * empty title is itself a floor violation, and must not gate itself out.\n */\nfunction isIndexed(relPath: string, data: Record<string, unknown>): boolean {\n if (!hasIndexableTitle(data)) return false;\n if (typeof data.kind === 'string' && data.kind !== '') return true;\n return relPath.startsWith('notes/');\n}\n\n/**\n * A reserved `primer.md` (at any level). Title-less, so it is skipped by the\n * indexed-page checks \u2014 but it is the agent's first-read surface, so a stale\n * `[[link]]` there must not silently pass the gate. Its body links are checked.\n */\nfunction isPrimer(relPath: string): boolean {\n return relPath === 'primer.md' || relPath.endsWith('/primer.md');\n}\n\n// Required-field floor per kind \u2014 the set of keys present on 100% of existing\n// pages of that kind (corpus-scanned; spec-wiki-validate \u00A7 Required fields per\n// kind). Key-presence, not non-emptiness. Kinds absent here (artifact, prompt,\n// glossary-entry, pso-roster) carry no required-field contract. `tags` is\n// governed separately by the `tags-required` rule (non-empty), not this floor.\nconst REQUIRED_FIELDS: Record<string, readonly string[]> = {\n project: [\n 'title',\n 'kind',\n 'scope',\n 'status',\n 'summary',\n 'updated',\n 'methodology',\n 'phase',\n 'repo'\n ],\n spec: ['title', 'kind', 'scope', 'status', 'summary', 'updated', 'sources'],\n adr: ['title', 'kind', 'scope', 'status', 'updated'],\n plan: ['title', 'kind', 'scope', 'status', 'summary', 'updated'],\n ops: ['title', 'kind', 'scope', 'status', 'summary', 'updated'],\n story: [\n 'title',\n 'kind',\n 'scope',\n 'status',\n 'updated',\n 'parent',\n 'triage_state',\n 'category',\n 'blocked_by',\n 'sources'\n ],\n topic: ['title', 'kind', 'status', 'summary', 'updated', 'confidence'],\n article: ['title', 'kind', 'status', 'updated'],\n src: ['title', 'kind', 'topic', 'status', 'summary', 'updated'],\n note: ['title', 'updated']\n};\n\n// Kinds exempt from the tags-required floor: deliverable/package internals\n// (artifact, prompt) and registry stubs (glossary-entry, pso-roster), not\n// discoverable content pages. Mirrors the required-fields floor exemption.\nconst TAG_OPTIONAL_KINDS = new Set(['artifact', 'prompt', 'glossary-entry', 'pso-roster']);\n\n// Per-kind path patterns (spec-wiki-validate \u00A7 Folder and slug patterns). Kinds\n// absent here have no documented pattern and are exempt (article free naming,\n// notes, and the registered-but-undocumented ontology/alayacare kinds).\nconst FOLDER_PATTERNS: Record<string, RegExp> = {\n spec: /^projects\\/[^/]+\\/spec\\/spec-[^/]+\\.md$/,\n adr: /^projects\\/[^/]+\\/adr\\/adr-[^/]+\\.md$/,\n ops: /^projects\\/[^/]+\\/ops\\/ops-[^/]+\\.md$/,\n plan: /^projects\\/[^/]+\\/plan\\/plan-[^/]+\\.md$/,\n story: /^projects\\/[^/]+\\/plan\\/[^/]+\\/story-[^/]+\\.md$/,\n project: /^projects\\/[^/]+\\/index\\.md$/,\n topic: /^research\\/[^/]+\\/index\\.md$/,\n src: /^research\\/[^/]+\\/src-[^/]+\\.md$/\n};\n\nfunction checkRequiredFields(relPath: string, data: Record<string, unknown>): Finding[] {\n // Notes carry no `kind` key \u2014 sync infers `note` from location; mirror that so\n // the note floor is reachable rather than dead.\n const kind =\n typeof data.kind === 'string' && data.kind !== ''\n ? data.kind\n : relPath.startsWith('notes/')\n ? 'note'\n : undefined;\n const required = kind ? REQUIRED_FIELDS[kind] : undefined;\n if (!required) return [];\n const findings: Finding[] = [];\n for (const field of required) {\n if (!Object.hasOwn(data, field)) {\n findings.push({\n path: relPath,\n rule: 'required-fields',\n severity: 'error',\n message: `missing required field \"${field}\" for kind \"${kind}\"`\n });\n }\n }\n // Title carve-out from key-presence: the one floor field where emptiness is\n // a violation \u2014 sync skips any page without a non-empty title, silently\n // dropping it from the index.\n if (Object.hasOwn(data, 'title') && !hasIndexableTitle(data)) {\n findings.push({\n path: relPath,\n rule: 'required-fields',\n severity: 'error',\n message: `\"title\" must be a non-empty string for kind \"${kind}\" \u2014 sync skips the page otherwise`\n });\n }\n return findings;\n}\n\n// Universal floor for custom kinds: the fields the index serves. Warnings,\n// never errors \u2014 custom kinds keep their freedom; the nudge keeps pages\n// retrievable (title/summary feed FTS, updated feeds prime ordering).\nconst UNIVERSAL_FLOOR = ['title', 'summary', 'updated'] as const;\n\n/** Names of object-form kinds outside the built-in set \u2014 the explicit opt-in\n * to custom pedagogy. Plain-string unknown kinds stay floor-free. */\nfunction customKindNames(cfg: VaultConfig): Set<string> {\n const names = new Set<string>();\n for (const entry of cfg.kinds) {\n if (typeof entry !== 'string' && !BUILT_IN_KINDS.has(entry.name)) names.add(entry.name);\n }\n return names;\n}\n\nfunction checkCustomKindFloor(\n relPath: string,\n data: Record<string, unknown>,\n cfg: VaultConfig\n): Finding[] {\n const kind = data.kind;\n if (typeof kind !== 'string' || !customKindNames(cfg).has(kind)) return [];\n const findings: Finding[] = [];\n for (const field of UNIVERSAL_FLOOR) {\n if (!Object.hasOwn(data, field)) {\n findings.push({\n path: relPath,\n rule: 'custom-kind-floor',\n severity: 'warning',\n message: `custom kind \"${kind}\": missing \"${field}\" \u2014 the universal floor (title, summary, updated) keeps the page retrievable`\n });\n }\n }\n if (Object.hasOwn(data, 'title') && !hasIndexableTitle(data)) {\n findings.push({\n path: relPath,\n rule: 'custom-kind-floor',\n severity: 'warning',\n message: `custom kind \"${kind}\": \"title\" is empty \u2014 sync skips title-less pages; this page will not be indexed`\n });\n }\n return findings;\n}\n\n/**\n * Tags are an open dimension \u2014 any value, no controlled vocabulary \u2014 but every\n * content page must carry at least one. Indexed pages whose kind is not\n * tag-optional require a non-empty `tags` list.\n */\nfunction checkTagsRequired(relPath: string, data: Record<string, unknown>): Finding[] {\n const kind =\n typeof data.kind === 'string' && data.kind !== ''\n ? data.kind\n : relPath.startsWith('notes/')\n ? 'note'\n : undefined;\n if (kind && TAG_OPTIONAL_KINDS.has(kind)) return [];\n if (Array.isArray(data.tags) && data.tags.length > 0) return [];\n return [\n {\n path: relPath,\n rule: 'tags-required',\n severity: 'error',\n message:\n 'tags must be present and non-empty (tags are open \u2014 any values, every content page tagged)'\n }\n ];\n}\n\nfunction checkFolderSlug(relPath: string, data: Record<string, unknown>): Finding[] {\n const kind = data.kind;\n const pattern = typeof kind === 'string' ? FOLDER_PATTERNS[kind] : undefined;\n if (!pattern || pattern.test(relPath)) return [];\n return [\n {\n path: relPath,\n rule: 'folder-slug',\n severity: 'error',\n message: `path does not match the \"${kind}\" slug pattern ${pattern.source}`\n }\n ];\n}\n\nfunction checkVocabulary(\n relPath: string,\n data: Record<string, unknown>,\n cfg: VaultConfig\n): Finding[] {\n const findings: Finding[] = [];\n const kind = data.kind;\n if (typeof kind === 'string' && !cfg.kinds.some((k) => kindName(k) === kind)) {\n findings.push({\n path: relPath,\n rule: 'kind-vocabulary',\n severity: 'error',\n message: `kind \"${kind}\" is not in vault.yaml`\n });\n }\n const status = data.status;\n if (typeof status === 'string' && !cfg.statuses.includes(status)) {\n findings.push({\n path: relPath,\n rule: 'status-vocabulary',\n severity: 'error',\n message: `status \"${status}\" is not in vault.yaml`\n });\n }\n const { scope } = deriveLocation(relPath);\n if (scope !== null && !Object.hasOwn(cfg.scopes, scope)) {\n findings.push({\n path: relPath,\n rule: 'scope-vocabulary',\n severity: 'error',\n message: `scope \"${scope}\" is not in vault.yaml`\n });\n }\n const methodology = data.methodology;\n if (typeof methodology === 'string' && !cfg.methodologies.includes(methodology)) {\n findings.push({\n path: relPath,\n rule: 'methodology-vocabulary',\n severity: 'error',\n message: `methodology \"${methodology}\" is not in vault.yaml`\n });\n }\n return findings;\n}\n\n/**\n * Path is authoritative for `scope`/`topic`: sync derives them from the path and\n * ignores frontmatter. A frontmatter copy is allowed for readability but must not\n * lie \u2014 a mismatch means the label disagrees with where the file actually lives.\n * Fires only where the path defines the value (projects \u2192 scope, research \u2192 topic)\n * and the frontmatter carries it.\n */\nfunction checkScopePath(relPath: string, data: Record<string, unknown>): Finding[] {\n const { scope, topic } = deriveLocation(relPath);\n const findings: Finding[] = [];\n if (\n scope !== null &&\n typeof data.scope === 'string' &&\n data.scope !== '' &&\n data.scope !== scope\n ) {\n findings.push({\n path: relPath,\n rule: 'path-authority',\n severity: 'error',\n message: `frontmatter scope \"${data.scope}\" disagrees with path scope \"${scope}\"`\n });\n }\n if (\n topic !== null &&\n typeof data.topic === 'string' &&\n data.topic !== '' &&\n data.topic !== topic\n ) {\n findings.push({\n path: relPath,\n rule: 'path-authority',\n severity: 'error',\n message: `frontmatter topic \"${data.topic}\" disagrees with path topic \"${topic}\"`\n });\n }\n return findings;\n}\n\n/** A reference's basename target, or null if absent/empty/non-string. */\nfunction refTarget(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed === '' ? null : basename(trimmed);\n}\n\n/**\n * Basename targets of a reference field that may be scalar or array. `supersedes`\n * and `superseded_by` are list-valued in the wild (one ADR can supersede several),\n * so a scalar-only read would miss them and falsely fail reciprocity.\n */\nfunction refTargets(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(refTarget).filter((t): t is string => t !== null);\n }\n const single = refTarget(value);\n return single === null ? [] : [single];\n}\n\n/**\n * Strip code regions so `[[...]]`-shaped syntax inside them is not mistaken for a\n * wikilink: fenced ``` blocks (e.g. a bash `if [[ x == y ]]` test) and inline\n * `code` spans (e.g. a `[[wikilink]]` documentation example). Sync's own link\n * extraction is unaffected \u2014 its pseudo-links are a separate, pre-existing concern.\n */\nfunction stripCode(body: string): string {\n return body.replace(/```[\\s\\S]*?```/g, '').replace(/`[^`]*`/g, '');\n}\n\n/**\n * Body `[[wikilink]]` dangling check against the basename `refIndex`. Code\n * regions are stripped first (see `stripCode`) so `[[...]]`-shaped syntax inside\n * fences/inline-code is not mistaken for a link. Shared by the indexed-page\n * reference checks and the title-less primer carve-in.\n */\nfunction checkBodyLinks(relPath: string, body: string, refIndex: ReadonlySet<string>): Finding[] {\n const findings: Finding[] = [];\n for (const link of extractWikilinks(stripCode(body))) {\n if (!link.target.endsWith('.md')) continue;\n if (!refIndex.has(basename(link.target))) {\n findings.push({\n path: relPath,\n rule: 'dangling-link',\n severity: 'error',\n message: `wikilink target \"${link.target}\" does not resolve`\n });\n }\n }\n return findings;\n}\n\n/**\n * Reference resolution against the basename index: body `[[wikilinks]]` to `.md`\n * targets, plus the frontmatter reference fields. Empty values never fire (the\n * empty `supersedes:`/`superseded_by:` template keys are the 52/57). Non-`.md`\n * wikilink targets (images, `.base`, external) are not policed.\n */\nfunction checkReferences(\n relPath: string,\n data: Record<string, unknown>,\n body: string,\n refIndex: ReadonlySet<string>\n): Finding[] {\n const findings: Finding[] = checkBodyLinks(relPath, body, refIndex);\n const fieldRefs: string[] = [];\n const parent = refTarget(data.parent);\n if (parent !== null) fieldRefs.push(parent);\n for (const field of ['supersedes', 'superseded_by', 'blocked_by'] as const) {\n fieldRefs.push(...refTargets(data[field]));\n }\n for (const target of fieldRefs) {\n if (!refIndex.has(target)) {\n findings.push({\n path: relPath,\n rule: 'ref-resolves',\n severity: 'error',\n message: `frontmatter reference \"${target}\" does not resolve`\n });\n }\n }\n return findings;\n}\n\n/**\n * Tag policy: only the alias case is enforced, as a non-fatal warning. A full\n * canonical-membership check is deferred \u2014 the corpus carries ~211 distinct tags\n * against an 11-entry canonical list, so flagging non-canonical tags would fire\n * on nearly every page (spec-wiki-validate \u00A7 Tag policy).\n */\nfunction checkTags(relPath: string, data: Record<string, unknown>, cfg: VaultConfig): Finding[] {\n if (!Array.isArray(data.tags)) return [];\n const findings: Finding[] = [];\n for (const tag of data.tags) {\n if (typeof tag === 'string' && Object.hasOwn(cfg.tags.aliases, tag)) {\n findings.push({\n path: relPath,\n rule: 'tag-alias',\n severity: 'warning',\n message: `tag \"${tag}\" is an alias; use canonical \"${cfg.tags.aliases[tag]}\"`\n });\n }\n }\n return findings;\n}\n\n/** `status: superseded` requires a non-empty `superseded_by` (README \u00A76). */\nfunction checkSupersededLink(relPath: string, data: Record<string, unknown>): Finding[] {\n if (data.status === 'superseded' && refTargets(data.superseded_by).length === 0) {\n return [\n {\n path: relPath,\n rule: 'superseded-needs-link',\n severity: 'error',\n message: 'status is \"superseded\" but superseded_by is empty'\n }\n ];\n }\n return [];\n}\n\n/** Sync-mirror checks on already-parsed frontmatter \u2014 gated on indexability,\n * governing exactly what sync indexes. Pure. */\nfunction checkIndexedPage(\n relPath: string,\n data: Record<string, unknown>,\n body: string,\n cfg: VaultConfig,\n refIndex: ReadonlySet<string>\n): Finding[] {\n if (!isIndexed(relPath, data)) return [];\n return [\n ...checkTagsRequired(relPath, data),\n ...checkFolderSlug(relPath, data),\n ...checkVocabulary(relPath, data, cfg),\n ...checkScopePath(relPath, data),\n ...checkReferences(relPath, data, body, refIndex),\n ...checkSupersededLink(relPath, data),\n ...checkTags(relPath, data, cfg)\n ];\n}\n\n/**\n * Deterministic checks on a single page's raw content. Pure \u2014 no IO. Parses the\n * frontmatter first: a parse failure is the live bug that silently halts sync\n * mid-walk, reported regardless of the page's other fields. Well-formed pages\n * are then subjected to the indexed-page checks (vocabulary, \u2026) against the\n * controlled vocabulary `cfg` and the basename `refIndex` of valid link targets.\n */\nexport function validatePage(\n relPath: string,\n raw: string,\n cfg: VaultConfig,\n refIndex: ReadonlySet<string>\n): Finding[] {\n let parsed: ReturnType<typeof parseFrontmatter>;\n try {\n parsed = parseFrontmatter(raw);\n } catch (err) {\n return [\n {\n path: relPath,\n rule: 'frontmatter-parse',\n severity: 'error',\n message: err instanceof Error ? err.message : String(err)\n }\n ];\n }\n if (isPrimer(relPath)) {\n return checkBodyLinks(relPath, parsed.content, refIndex);\n }\n // Two-stage pipeline. Contract checks (the kind floors) gate on kind intent:\n // a floor violation must surface even when the violation is the very field\n // (title) that decides indexability \u2014 otherwise the page silently drops from\n // the index with zero findings. Sync-mirror checks gate on isIndexed.\n return [\n ...checkRequiredFields(relPath, parsed.data),\n ...checkCustomKindFloor(relPath, parsed.data, cfg),\n ...checkIndexedPage(relPath, parsed.data, parsed.content, cfg, refIndex)\n ];\n}\n\n/** Exit-code decision: any error-severity finding fails the run. */\nexport function hasErrors(findings: Finding[]): boolean {\n return findings.some((f) => f.severity === 'error');\n}\n\n/** Basename (no extension) of a vault-relative path. */\nfunction basename(relPath: string): string {\n const last = relPath.split('/').pop() ?? relPath;\n return last.replace(/\\.md$/, '');\n}\n\nexport interface PageData {\n path: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Cross-page ADR supersession reciprocity: a non-empty `superseded_by: B` on\n * ADR A requires `supersedes: A` on B, and vice-versa. Fires only on non-empty\n * values; a value pointing at a non-existent ADR is a `ref-resolves` error\n * (checked per-page), not a reciprocity error, so unresolved targets are skipped\n * here. (spec-wiki-validate \u00A7 Supersession.)\n */\nexport function validateSupersession(pages: PageData[]): Finding[] {\n const adrs = new Map<string, { path: string; supersedes: string[]; supersededBy: string[] }>();\n for (const { path, data } of pages) {\n if (data.kind !== 'adr') continue;\n adrs.set(basename(path), {\n path,\n supersedes: refTargets(data.supersedes),\n supersededBy: refTargets(data.superseded_by)\n });\n }\n const findings: Finding[] = [];\n for (const [name, adr] of adrs) {\n for (const target of adr.supersededBy) {\n const other = adrs.get(target);\n if (other && !other.supersedes.includes(name)) {\n findings.push({\n path: adr.path,\n rule: 'supersession-reciprocal',\n severity: 'error',\n message: `superseded_by \"${target}\" which does not declare supersedes \"${name}\"`\n });\n }\n }\n for (const target of adr.supersedes) {\n const other = adrs.get(target);\n if (other && !other.supersededBy.includes(name)) {\n findings.push({\n path: adr.path,\n rule: 'supersession-reciprocal',\n severity: 'error',\n message: `supersedes \"${target}\" which does not declare superseded_by \"${name}\"`\n });\n }\n }\n }\n return findings;\n}\n\n/** Top-level scope/topic key of a path (`projects/{scope}` or `research/{topic}`), or\n * null for notes/root pages. Two pages \"share a scope\" iff their keys are equal. */\nfunction locationKey(relPath: string): string | null {\n const seg = relPath.split('/');\n if ((seg[0] === 'projects' || seg[0] === 'research') && seg[1]) {\n return `${seg[0]}/${seg[1]}`;\n }\n return null;\n}\n\nexport interface LinkPage {\n path: string;\n body: string;\n}\n\n/**\n * Cross-page ambiguity warning. A **bare** `[[wikilink]]` whose basename is owned by\n * more than one file is ambiguous only when none of those owners shares the linking\n * page's scope: a same-scope copy resolves it locally (the per-scope `spec-context`/\n * `primer`/`index` pattern), and a path-qualified link (`[[a/b/c]]`) is already\n * disambiguated. Warning, not error \u2014 the link resolves, just not uniquely.\n */\nexport function validateAmbiguousLinks(\n pages: LinkPage[],\n basenameToPaths: ReadonlyMap<string, string[]>\n): Finding[] {\n const findings: Finding[] = [];\n for (const { path, body } of pages) {\n const here = locationKey(path);\n for (const link of extractWikilinks(stripCode(body))) {\n if (!link.target.endsWith('.md') || link.target.includes('/')) continue;\n const base = basename(link.target);\n const owners = basenameToPaths.get(base);\n if (!owners || owners.length < 2) continue;\n if (here !== null && owners.some((p) => locationKey(p) === here)) continue;\n findings.push({\n path,\n rule: 'ambiguous-link',\n severity: 'warning',\n message: `bare link \"[[${base}]]\" is ambiguous \u2014 basename owned by ${owners.length} files, none in this scope`\n });\n }\n }\n return findings;\n}\n\n/**\n * Walk the vault's content domains (reusing the sync walker), build the basename\n * index of valid reference targets (all on-disk pages, including title-less ones),\n * then aggregate findings across all pages. No database \u2014 validation is a\n * pre-sync, read-only pass over the filesystem.\n */\nexport async function validateVault(root: string): Promise<Finding[]> {\n const cfg = await loadVaultConfig(root);\n\n // Reference target universe = every on-disk page, including title-less ones and\n // pages outside the scanned domains (raw/, templates/) that are legitimate link\n // targets. Walking from '.' covers the whole vault; dotdirs (.git, .obsidian)\n // are skipped by the walker.\n const all = (await walkMarkdown(root, '.')).map((abs) => ({\n relPath: toRelativePath(root, abs),\n abs\n }));\n // basename \u2192 [paths] (the spec's reference-resolution model). `refIndex` (dangling\n // checks: does the basename exist) is its key set; the multimap also backs the\n // cross-page ambiguity warning (does a basename have more than one owner).\n const basenameToPaths = new Map<string, string[]>();\n for (const f of all) {\n const b = basename(f.relPath);\n const owners = basenameToPaths.get(b);\n if (owners) owners.push(f.relPath);\n else basenameToPaths.set(b, [f.relPath]);\n }\n const refIndex = new Set<string>(basenameToPaths.keys());\n\n // Applicability = only the indexed content domains.\n const files = all.filter((f) => SCAN_DOMAINS.some((d) => f.relPath.startsWith(`${d}/`)));\n\n const findings: Finding[] = [];\n const pages: PageData[] = [];\n const linkPages: LinkPage[] = [];\n for (const { relPath, abs } of files) {\n const raw = await readFile(abs, 'utf8');\n findings.push(...validatePage(relPath, raw, cfg, refIndex));\n try {\n const parsed = parseFrontmatter(raw);\n pages.push({ path: relPath, data: parsed.data });\n linkPages.push({ path: relPath, body: parsed.content });\n } catch {\n // Parse failure already reported by validatePage; skip in the graph pass.\n }\n }\n findings.push(...validateSupersession(pages));\n findings.push(...validateAmbiguousLinks(linkPages, basenameToPaths));\n\n // A declared custom kind without its template file leaves the served\n // \"use the matching template\" rule unsatisfiable \u2014 warn, don't block.\n for (const name of customKindNames(cfg)) {\n const file = `templates/${name}.md`;\n try {\n await stat(join(root, file));\n } catch {\n findings.push({\n path: file,\n rule: 'custom-kind-template',\n severity: 'warning',\n message: `custom kind \"${name}\" declared in vault.yaml has no template file`\n });\n }\n }\n return findings;\n}\n", "import { existsSync, readdirSync, rmSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport {\n canonicalVaultRoot,\n getMeta,\n indexRootDir,\n openDatabase,\n resolveIndexPath\n} from '@llm-wiki/db/database';\nimport { runSync } from './sync.js';\nimport { type Finding, hasErrors, validateVault } from './validate.js';\n\nexport type Command = 'sync' | 'validate';\n\nexport type CliResolution = { kind: 'run'; command: Command } | { kind: 'error'; message: string };\n\n/**\n * Resolve a `wiki <command>` invocation to the command to run, or a usage\n * error. Pure \u2014 no side effects \u2014 so the routing is testable without executing\n * the (index-touching) command. `argv` is `process.argv.slice(2)`.\n */\nexport function resolveCli(argv: string[]): CliResolution {\n const { positionals } = parseArgs({ args: argv, allowPositionals: true, strict: false });\n const command = positionals[0];\n if (command === 'sync') {\n return { kind: 'run', command: 'sync' };\n }\n if (command === 'validate') {\n return { kind: 'run', command: 'validate' };\n }\n if (command === undefined) {\n return { kind: 'error', message: 'usage: wiki <sync|validate>' };\n }\n return { kind: 'error', message: `unknown command: ${command}` };\n}\n\nexport function vaultRoot(): string {\n const root = process.env.WIKI_VAULT;\n if (!root) {\n console.error('WIKI_VAULT is not set');\n process.exit(1);\n }\n return root;\n}\n\nfunction reportFindings(findings: Finding[]): void {\n for (const f of findings) {\n console.error(`${f.severity}: ${f.path} [${f.rule}] ${f.message}`);\n }\n}\n\nexport async function runValidate(): Promise<void> {\n const findings = await validateVault(vaultRoot());\n reportFindings(findings);\n console.log(`validate: ${findings.length} finding(s)`);\n process.exit(hasErrors(findings) ? 1 : 0);\n}\n\nexport async function runSyncCommand(): Promise<void> {\n const findings = await validateVault(vaultRoot());\n reportFindings(findings);\n if (hasErrors(findings)) {\n const errors = findings.filter((f) => f.severity === 'error').length;\n console.error(`sync aborted: ${errors} validation error(s); no database writes`);\n process.exit(1);\n }\n await runSync();\n}\n\ninterface VaultDescription {\n vault: string;\n index: string;\n synced: string;\n}\n\n// Read-only: never creates the index file or its directory \u2014 `config` must\n// not leave state behind for vaults that were merely asked about.\nfunction describeVault(root: string): VaultDescription {\n const vault = canonicalVaultRoot(root);\n const index = resolveIndexPath(vault);\n let synced = 'never';\n if (existsSync(index)) {\n const db = openDatabase(index);\n try {\n synced = getMeta(db, 'last_synced') ?? 'never';\n } finally {\n db.close();\n }\n }\n return { vault, index, synced };\n}\n\nfunction printVault(d: VaultDescription): void {\n console.log(`vault: ${d.vault}`);\n console.log(`index: ${d.index}`);\n console.log(`synced: ${d.synced}`);\n}\n\n/** Every per-vault index under `~/.kmd/db/` that records its vault root. */\nfunction knownVaults(): VaultDescription[] {\n const root = indexRootDir();\n if (!existsSync(root)) return [];\n const known: VaultDescription[] = [];\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const index = join(root, entry.name, 'index.db');\n if (!existsSync(index)) continue;\n const db = openDatabase(index);\n try {\n const vault = getMeta(db, 'vault_root');\n if (vault === null) continue;\n known.push({ vault, index, synced: getMeta(db, 'last_synced') ?? 'never' });\n } finally {\n db.close();\n }\n }\n return known;\n}\n\nexport async function runConfig(): Promise<void> {\n const root = process.env.WIKI_VAULT;\n if (root) {\n printVault(describeVault(root));\n return;\n }\n const known = knownVaults();\n if (known.length === 0) {\n console.error(\n 'no vault specified and none known \u2014 pass a vault root, set WIKI_VAULT, or run `kmd sync <vault-root>` once'\n );\n process.exit(1);\n }\n known.forEach((d, i) => {\n if (i > 0) console.log('');\n printVault(d);\n });\n}\n\nexport async function runDbReset(): Promise<void> {\n const root = process.env.WIKI_VAULT;\n if (!root) {\n console.error('usage: kmd db reset [<vault-root>] (or set WIKI_VAULT)');\n process.exit(2);\n }\n const dir = dirname(resolveIndexPath(root));\n if (!existsSync(dir)) {\n console.log(`${dir} does not exist \u2014 nothing to reset`);\n return;\n }\n rmSync(dir, { recursive: true, force: true });\n console.log(`deleted ${dir}`);\n}\n\nexport async function main(): Promise<void> {\n const resolution = resolveCli(process.argv.slice(2));\n if (resolution.kind === 'error') {\n console.error(resolution.message);\n process.exit(1);\n }\n if (resolution.command === 'sync') {\n await runSyncCommand();\n } else {\n await runValidate();\n }\n}\n", "import { z } from 'zod';\n\nconst EnvSchema = z.object({\n WIKI_VAULT: z.string().min(1).describe('Absolute path to the Obsidian vault root'),\n LOG_LEVEL: z\n .enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'])\n .default('info')\n .describe('Pino log level. Logs go to stderr to keep the stdio JSON-RPC stream clean.'),\n SERVER_NAME: z.string().default('wiki-mcp'),\n SERVER_VERSION: z.string().default('0.0.0')\n});\n\nexport interface Config {\n readonly wikiVault: string;\n readonly logLevel: z.infer<typeof EnvSchema>['LOG_LEVEL'];\n readonly serverName: string;\n readonly serverVersion: string;\n}\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): Config {\n const parsed = EnvSchema.safeParse(env);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('\\n');\n throw new Error(`Invalid environment configuration:\\n${issues}`);\n }\n return {\n wikiVault: parsed.data.WIKI_VAULT,\n logLevel: parsed.data.LOG_LEVEL,\n serverName: parsed.data.SERVER_NAME,\n serverVersion: parsed.data.SERVER_VERSION\n };\n}\n", "import { mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { canonicalVaultRoot, openDatabase, resolveIndexPath, setMeta } from '@llm-wiki/db/database';\n\n/**\n * Open the per-vault index for this server's vault root, recording the root\n * in the index meta so `kmd config` can discover it from any shell \u2014 even for\n * a vault that has never been synced.\n */\nexport function createDatabase(vaultRoot: string): DatabaseSync {\n const dbPath = resolveIndexPath(vaultRoot);\n mkdirSync(dirname(dbPath), { recursive: true });\n const db = openDatabase(dbPath);\n setMeta(db, 'vault_root', canonicalVaultRoot(vaultRoot));\n return db;\n}\n", "import { appendFileSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst DIAG_DIR = join(homedir(), '.local', 'state', 'wiki-mcp');\nexport const DIAG_LOG_PATH = join(DIAG_DIR, 'server.log');\n\ntry {\n mkdirSync(DIAG_DIR, { recursive: true });\n} catch {\n // best-effort; do not block startup on log dir creation\n}\n\n/**\n * Synchronous file logger that survives even when pino, the MCP SDK, or any\n * import down the chain fails to load. Writes to ~/.local/state/wiki-mcp/server.log\n * regardless of stdio/stderr capture by the parent process. Use to trace\n * spawn-time failures that never reach pino.\n */\nexport function diag(msg: string, data?: Record<string, unknown>): void {\n try {\n const line = data\n ? `${new Date().toISOString()} pid=${process.pid} ${msg} ${JSON.stringify(data)}\\n`\n : `${new Date().toISOString()} pid=${process.pid} ${msg}\\n`;\n appendFileSync(DIAG_LOG_PATH, line);\n } catch {\n // best-effort; never crash the server on log write failure\n }\n}\n", "import pino from 'pino';\nimport { DIAG_LOG_PATH } from './diag.js';\n\n/**\n * Pino logger that fans out to BOTH stderr (fd 2, captured by Claude Code)\n * AND ~/.local/state/wiki-mcp/server.log (so logs survive when stderr capture\n * doesn't make it into the JSONL connection log). The file destination shares\n * the path with diag.ts so a single `tail -f` follows the entire startup +\n * runtime stream.\n */\nexport function createLogger(level: string, name: string): pino.Logger {\n const streams: pino.StreamEntry[] = [\n { level: level as pino.Level, stream: pino.destination(2) },\n {\n level: level as pino.Level,\n stream: pino.destination({ dest: DIAG_LOG_PATH, sync: false, mkdir: true })\n }\n ];\n return pino({ name, level, base: { pid: process.pid } }, pino.multistream(streams));\n}\n\nexport type Logger = pino.Logger;\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\n// Verbatim mirror of @llm-wiki/cli's src/config.ts \u2014 the single definition of a\n// valid vault.yaml. Kept byte-identical (schema + error strings) so mcp and\n// sync/validate never disagree on what is valid. Collapse both into a shared\n// package only when a third separate consumer appears (CLAUDE.md YAGNI rule).\n\nconst ScopeSchema = z.object({\n repo: z.string().optional(),\n methodology: z.string().optional(),\n status: z.string()\n});\n\nconst KindEntrySchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n signal: z.string(),\n where: z.string()\n })\n]);\n\nconst VaultConfigSchema = z\n .object({\n scopes: z.record(z.string(), ScopeSchema),\n kinds: z.array(KindEntrySchema),\n statuses: z.array(z.string()),\n methodologies: z.array(z.string()),\n tags: z.object({\n canonical: z.array(z.string()),\n aliases: z.record(z.string(), z.string())\n }),\n authoring_rules: z.string().optional(),\n authoring_rules_extra: z.string().optional(),\n sync_protocol: z.string().optional(),\n sync_protocol_extra: z.string().optional()\n })\n .superRefine((config, ctx) => {\n for (const [name, scope] of Object.entries(config.scopes)) {\n if (scope.methodology !== undefined && !config.methodologies.includes(scope.methodology)) {\n ctx.addIssue({\n code: 'custom',\n path: ['scopes', name, 'methodology'],\n message: `\"${scope.methodology}\" is not in the methodologies list`\n });\n }\n }\n });\n\nexport type KindEntry = z.infer<typeof KindEntrySchema>;\nexport type VaultConfig = z.infer<typeof VaultConfigSchema>;\n\n/** Kind name of a `kinds` entry \u2014 plain string, or the object form's `name`. */\nexport function kindName(entry: KindEntry): string {\n return typeof entry === 'string' ? entry : entry.name;\n}\n\n/**\n * Kinds with built-in engine pedagogy (kind-selector rows; most also carry a\n * served template). An object-form entry with one of these names rewords its\n * selector row only \u2014 it never creates custom-template expectations.\n */\nexport const BUILT_IN_KINDS: ReadonlySet<string> = new Set([\n 'project',\n 'spec',\n 'adr',\n 'plan',\n 'story',\n 'ops',\n 'topic',\n 'article',\n 'src',\n 'note',\n 'artifact',\n 'prompt'\n]);\n\n/**\n * Load and validate `$vaultRoot/vault.yaml` \u2014 the single source of truth for\n * the controlled vocabulary. Throws (fail-loud) when the file is missing or\n * the contents don't satisfy the schema; the server must not start on partial\n * vocabulary.\n */\nexport async function loadVaultConfig(vaultRoot: string): Promise<VaultConfig> {\n const path = join(vaultRoot, 'vault.yaml');\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (err) {\n throw new Error(`vault.yaml not found at ${path}`, { cause: err });\n }\n const parsed = VaultConfigSchema.safeParse(parse(raw));\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('\\n');\n throw new Error(`Invalid vault.yaml at ${path}:\\n${issues}`);\n }\n return parsed.data;\n}\n", "import { canonicalVaultRoot } from '@llm-wiki/db/database';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type KindEntry, kindName, type VaultConfig } from '../vault-config.js';\n\ninterface KindPedagogy {\n readonly signal: string;\n readonly where: string;\n}\n\nconst KIND_PEDAGOGY: ReadonlyMap<string, KindPedagogy> = new Map([\n [\n 'project',\n {\n signal: 'Identity card for a project scope',\n where: '`projects/{scope}/index.md`'\n }\n ],\n [\n 'spec',\n {\n signal: 'How a system works (state of world, not decision)',\n where: '`projects/{scope}/spec/spec-{slug}.md`'\n }\n ],\n [\n 'adr',\n {\n signal: 'Decision between alternatives, commits direction',\n where: '`projects/{scope}/adr/adr-{slug}.md`'\n }\n ],\n [\n 'plan',\n {\n signal: 'Phase/initiative with milestones and stories',\n where: '`projects/{scope}/plan/plan-{slug}.md`'\n }\n ],\n [\n 'story',\n {\n signal: 'User story with Gherkin + slices (child of plan)',\n where: '`projects/{scope}/plan/{plan}/story-N-{slug}.md`'\n }\n ],\n [\n 'ops',\n {\n signal: 'Operational runbook, how to run/deploy',\n where: '`projects/{scope}/ops/ops-{slug}.md`'\n }\n ],\n [\n 'topic',\n {\n signal: 'Identity card for a research area',\n where: '`research/{topic}/index.md`'\n }\n ],\n [\n 'article',\n {\n signal: 'Original synthesis about a concept/entity',\n where: '`research/{topic}/{slug}.md`'\n }\n ],\n [\n 'src',\n {\n signal: 'Summary of external source with citation',\n where: '`research/{topic}/src-{slug}.md`'\n }\n ],\n ['note', { signal: 'Low-ceremony capture, sort later', where: '`notes/{slug}.md`' }],\n [\n 'artifact',\n {\n signal: 'Deployable configuration (scope-specific, versioned)',\n where: '`projects/{scope}/ops/{deployment}/{slug}.md`'\n }\n ],\n [\n 'prompt',\n {\n signal: 'LLM prompt template (scope-specific, versioned)',\n where: '`projects/{scope}/ops/{deployment}/prompts/{role}/{slug}.md`'\n }\n ]\n]);\n\nconst DEFAULT_AUTHORING_RULES = [\n '**Where things go**',\n '',\n \"- **Use the matching template** via `wiki://template/{domain}/{kind}` (MCP) or from `templates/` (filesystem). Don't hand-roll frontmatter.\",\n '- **Folder name = slug prefix in `projects/`.** `spec/spec-x.md`, `adr/adr-y.md`, `plan/plan-z.md`, `ops/ops-w.md`. Stories use `story-` prefix under `plan/{plan-name}/`.',\n '- **Research is flat.** Articles are `{subject}.md`; sources are `src-{slug}.md`. The topic folder names a *frame*, the article slug names a *subject*. Avoid generic slugs (`architecture.md`, `notes.md`) and slugs that collide with project scopes.',\n '- **Extend before you split.** Prefer sharpening the existing spec, ADR, or article over creating a near-duplicate page. A new page needs a new subject, not a new session.',\n '',\n '**Frontmatter**',\n '',\n '- **`summary` is the retrieval contract.** One sentence stating the page\\'s decision or claim, not its topic. Search and `prime` rank by it \u2014 \"Chose X over Y because Z\" surfaces; \"About the sync pipeline\" sinks.',\n '- **Quote prose-bearing scalars.** `summary: \"...\"` \u2014 unquoted `Word: phrase` patterns break the YAML parser.',\n '- **On any edit, update `updated`.** Never change `created` \u2014 it is write-once.',\n '- **Notes have no `kind` field** \u2014 implied by location. Sync sets `kind: note`.',\n '- **Reuse existing tags** (visible in `prime` response `top_tags`). No synonyms.',\n '',\n '**Content**',\n '',\n '- **ADR and ops pages are predicate-only.** No definitional preambles for established vocabulary, no narrative, no marketing. The audience is the project team \u2014 assume fluency.',\n \"- **Spec / ADR edits land inline with the change that surfaces them.** Don't queue corrections in plans \u2014 the spec reflects current code at every commit.\",\n '',\n '**Linking**',\n '',\n \"- **Cross-reference with `[[wikilinks]]`, and link every mention of another vault page** \u2014 backlinks are the navigation graph for humans and agents alike. Don't link pages that don't exist yet: dangling links fail validation.\",\n '- **ADR supersession is bidirectional**: `superseded_by` on the old ADR + `supersedes` on the new one.',\n \"- **Sources convention**: external paths/URLs go inline in body text. Vault-internal `raw/` paths go in frontmatter `sources:` array. Don't mix the two surfaces.\"\n].join('\\n');\n\nfunction buildAuthoringRules(config: VaultConfig): string {\n const parts = [(config.authoring_rules ?? DEFAULT_AUTHORING_RULES).trim()];\n if (config.authoring_rules_extra) parts.push(config.authoring_rules_extra.trim());\n return ['## Authoring rules', '', parts.join('\\n\\n')].join('\\n');\n}\n\nconst DEFAULT_SYNC_PROTOCOL = [\n 'Edit the smallest set of files that reflects the change. ' +\n \"A milestone tick is plan-only; don't cascade to index.md unless phase or status changed. \" +\n 'Controlled-vocabulary edits (`vault.yaml`) need explicit user approval.',\n 'After editing wiki pages, run `kmd validate` and fix findings before `kmd sync` \u2014 ' +\n 'it checks frontmatter shape, vocabulary membership, and link integrity.'\n].join('\\n');\n\nfunction buildSyncProtocol(config: VaultConfig): string {\n const parts = [(config.sync_protocol ?? DEFAULT_SYNC_PROTOCOL).trim()];\n if (config.sync_protocol_extra) parts.push(config.sync_protocol_extra.trim());\n return ['## Resync protocol', '', parts.join('\\n\\n')].join('\\n');\n}\n\nfunction buildKindSelector(kinds: ReadonlyArray<KindEntry>): string {\n const lines: string[] = ['## Kind selector', '', '| Signal | Kind | Where |', '|---|---|---|'];\n for (const entry of kinds) {\n const name = kindName(entry);\n const pedagogy = typeof entry === 'string' ? KIND_PEDAGOGY.get(entry) : entry;\n const signal = pedagogy?.signal ?? '\u2014';\n const where = pedagogy?.where ?? '\u2014';\n lines.push(`| ${signal} | **${name}** | ${where} |`);\n }\n const names = kinds.map(kindName);\n const hasNote = names.includes('note');\n const hasAdrAndSpec = names.includes('adr') && names.includes('spec');\n if (hasNote || hasAdrAndSpec) {\n const hints: string[] = [];\n if (hasNote) hints.push('If none fits \u2192 note.');\n if (hasAdrAndSpec) {\n hints.push(\n 'If torn between adr and spec \u2192 does it record a choice? adr. Does it describe how things work? spec.'\n );\n }\n lines.push('', hints.join(' '));\n }\n return lines.join('\\n');\n}\n\n// The arrow-and-annotation rendering asserts the default lifecycle; a custom\n// status list gets a plain enumeration rather than an invented ordering.\nconst CANONICAL_STATUS_FLOW = ['draft', 'active', 'superseded', 'archived'] as const;\n\nfunction buildStatusLine(statuses: ReadonlyArray<string>): string {\n const isCanonical =\n statuses.length === CANONICAL_STATUS_FLOW.length &&\n statuses.every((s, i) => s === CANONICAL_STATUS_FLOW[i]);\n return isCanonical\n ? `**Statuses:** ${statuses.join(' \u2192 ')} (one-directional; superseded requires superseded_by link)`\n : `**Statuses:** ${statuses.join(', ')}`;\n}\n\nfunction buildVocabulary(config: VaultConfig): string {\n const lines: string[] = [\n '## Controlled vocabulary',\n '',\n `**Kinds:** ${config.kinds.map(kindName).join(', ')}`,\n buildStatusLine(config.statuses),\n `**Methodologies:** ${config.methodologies.join(', ')}`,\n `**Canonical tags:** ${config.tags.canonical.join(', ')}`\n ];\n const aliases = Object.entries(config.tags.aliases);\n if (aliases.length > 0) {\n lines.push(`**Tag aliases:** ${aliases.map(([a, c]) => `${a} \u2192 ${c}`).join(', ')}`);\n }\n return lines.join('\\n');\n}\n\nexport function registerAuthoringResource(\n mcp: McpServer,\n vaultRoot: string,\n vaultConfig: VaultConfig\n): void {\n mcp.registerResource(\n 'Authoring guide',\n 'wiki://authoring',\n {\n description:\n 'Wiki authoring pedagogy: kind selector, controlled vocabulary, authoring rules, resync protocol, and template URIs. Read before creating or editing wiki pages.',\n mimeType: 'text/markdown'\n },\n async (uri) => {\n const sections = [\n '# Wiki authoring guide',\n '',\n `Vault root: \\`${canonicalVaultRoot(vaultRoot)}\\` \u2014 every page path below is relative to it; write files and run \\`kmd validate\\` / \\`kmd sync\\` against it.`,\n '',\n buildKindSelector(vaultConfig.kinds),\n '',\n buildVocabulary(vaultConfig),\n '',\n '## Templates',\n '',\n 'Full index with URIs and descriptions: `wiki://templates`',\n '',\n buildAuthoringRules(vaultConfig),\n '',\n buildSyncProtocol(vaultConfig)\n ];\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'text/markdown' as const,\n text: sections.join('\\n')\n }\n ]\n };\n }\n );\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { BUILT_IN_KINDS, type VaultConfig } from '../vault-config.js';\n\ninterface TemplateSpec {\n /** wiki://template/{domain}/{kind} \u2014 `note` collapses to single segment. */\n readonly uri: string;\n /** Human-readable name shown in resources/list. */\n readonly name: string;\n /** Filename in vault/templates/. */\n readonly file: string;\n /** Description shown in resources/list. */\n readonly description: string;\n}\n\n/**\n * The vault has 11 fixed templates, mirroring the v2 frontmatter schemas\n * (extended with `story` per adr-story-vocabulary-and-triage-fields).\n * URI scheme: `wiki://template/{domain}/{kind}` \u2014 the agent thinks\n * \"I'm authoring a {kind} in the {domain} domain\" and the URI matches\n * that mental model. `note` collapses to a single segment because the\n * notes domain has only one kind.\n */\nexport const TEMPLATES: ReadonlyArray<TemplateSpec> = [\n {\n uri: 'wiki://template/project/index',\n name: 'Project index',\n file: 'project-index.md',\n description:\n 'Identity card for a project. Frontmatter-heavy: methodology, phase, repo, scope, summary, tags. Short body.'\n },\n {\n uri: 'wiki://template/project/primer',\n name: 'Project primer',\n file: 'project-primer.md',\n description:\n 'Human-authored narrative context for a project. Free-form body. Inlined into the prime tool response.'\n },\n {\n uri: 'wiki://template/project/spec',\n name: 'Project spec',\n file: 'project-spec.md',\n description:\n 'Specification page \u2014 how a system or feature works (state of the world, not decision).'\n },\n {\n uri: 'wiki://template/project/adr',\n name: 'Project ADR',\n file: 'project-adr.md',\n description:\n 'Architecture Decision Record \u2014 pinned moment of choice. Sections: Status, Context, Decision, Rationale, Consequences.'\n },\n {\n uri: 'wiki://template/project/plan',\n name: 'Project plan',\n file: 'project-plan.md',\n description:\n 'Plan for a phase or initiative. Sections: Goal, Scope, Milestones, Dependencies, Status Log.'\n },\n {\n uri: 'wiki://template/project/ops',\n name: 'Project ops',\n file: 'project-ops.md',\n description: 'Operational runbook \u2014 how to run or operate a system. Procedural.'\n },\n {\n uri: 'wiki://template/project/story',\n name: 'Project story',\n file: 'project-story.md',\n description:\n 'User story with Gherkin scenarios and inline implementation slices. Lives at plan/{plan-name}/story-N-{slug}.md. Frontmatter carries triage_state, category, blocked_by, parent.'\n },\n {\n uri: 'wiki://template/research/index',\n name: 'Research index',\n file: 'research-index.md',\n description:\n 'Topic identity card for a research area. Frontmatter: confidence, source_count, summary, tags.'\n },\n {\n uri: 'wiki://template/research/article',\n name: 'Research article',\n file: 'research-article.md',\n description:\n 'Wikipedia-style article about a concept, entity, or system. Original synthesis with sources.'\n },\n {\n uri: 'wiki://template/research/src',\n name: 'Research source',\n file: 'research-src.md',\n description:\n 'Summary of an external source (paper, talk, doc) with citation. The only `src-` prefix in research.'\n },\n {\n uri: 'wiki://template/note',\n name: 'Note',\n file: 'note.md',\n description: 'Low-ceremony everyday note. Capture fast, sort later.'\n }\n];\n\n/**\n * Registry entries for custom kinds \u2014 object-form `kinds` entries outside the\n * built-in set. Single-segment URI (the `note` precedent: no domain to encode),\n * file by convention at `templates/{name}.md`, the kind's `signal` doubles as\n * the description.\n */\nfunction customTemplates(config: VaultConfig): TemplateSpec[] {\n const specs: TemplateSpec[] = [];\n for (const entry of config.kinds) {\n if (typeof entry === 'string' || BUILT_IN_KINDS.has(entry.name)) continue;\n specs.push({\n uri: `wiki://template/${entry.name}`,\n name: entry.name.charAt(0).toUpperCase() + entry.name.slice(1),\n file: `${entry.name}.md`,\n description: entry.signal\n });\n }\n return specs;\n}\n\n/**\n * Register all template resources with the MCP server. Each template is a\n * fixed URI; `resources/read` re-reads the file on every call, so edits to\n * vault/templates/*.md are picked up without restarting the server.\n */\nexport function registerTemplateResources(\n mcp: McpServer,\n vaultRoot: string,\n vaultConfig: VaultConfig\n): void {\n const dir = join(vaultRoot, 'templates');\n const templates = [...TEMPLATES, ...customTemplates(vaultConfig)];\n for (const tmpl of templates) {\n mcp.registerResource(\n tmpl.name,\n tmpl.uri,\n { description: tmpl.description, mimeType: 'text/markdown' },\n async (uri) => {\n let text: string;\n try {\n text = await readFile(join(dir, tmpl.file), 'utf8');\n } catch (err) {\n throw new Error(`template file missing: templates/${tmpl.file} (${tmpl.uri})`, {\n cause: err\n });\n }\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'text/markdown' as const,\n text\n }\n ]\n };\n }\n );\n }\n\n const indexLines = ['# Wiki Templates', ''];\n for (const tmpl of templates) {\n indexLines.push(`- **${tmpl.name}** \u2014 \\`${tmpl.uri}\\` `);\n indexLines.push(` ${tmpl.description}`);\n }\n const indexText = indexLines.join('\\n');\n\n mcp.registerResource(\n 'Template index',\n 'wiki://templates',\n {\n description:\n 'Index of all wiki templates with URIs and descriptions. Read a specific template via its URI.',\n mimeType: 'text/markdown'\n },\n async (uri) => ({\n contents: [{ uri: uri.toString(), mimeType: 'text/markdown' as const, text: indexText }]\n })\n );\n}\n", "import { parse as parseYaml } from 'yaml';\n\n// Verbatim mirror of @llm-wiki/cli's src/frontmatter.ts. Kept byte-identical so\n// mcp parses frontmatter the same way sync/validate do. Collapse into a shared\n// package only when a third separate consumer appears (CLAUDE.md YAGNI rule).\n\nexport interface ParsedFrontmatter {\n data: Record<string, unknown>;\n content: string;\n}\n\n// Leading `---` block, YAML, closing `---`, then one consumed newline. Matches\n// gray-matter's delimiter handling; the closing `---` must be on its own line so\n// `---` rules inside the body are left intact.\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n?---\\r?\\n?/;\n\n/**\n * Split a page's frontmatter from its body using the `yaml` parser. Throws\n * (deterministically, no cache) when the frontmatter is not valid YAML. A page\n * with no leading delimiter parses to empty data and the whole input as body.\n */\nexport function parseFrontmatter(raw: string): ParsedFrontmatter {\n const match = FRONTMATTER_RE.exec(raw);\n if (!match) {\n return { data: {}, content: raw };\n }\n const yamlText = match[1] ?? '';\n const content = raw.slice(match[0].length);\n if (yamlText.trim() === '') {\n return { data: {}, content };\n }\n const parsed = parseYaml(yamlText);\n const data =\n parsed !== null && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {};\n return { data, content };\n}\n", "const FTS5_KEYWORDS = new Set(['AND', 'OR', 'NOT', 'NEAR']);\n\nexport function sanitizeFtsQuery(raw: string): string {\n return raw\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 0 && !FTS5_KEYWORDS.has(t))\n .join(' ');\n}\n", "/**\n * MCP CallToolResult helpers. `content[0].text` carries pretty-printed JSON\n * for LLM-facing clients; `structuredContent` carries the same payload as\n * raw JSON for clients that parse directly. Both fields kept in sync so\n * callers never choose one over the other.\n */\n\nexport function textJson(data: object) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data as Record<string, unknown>\n };\n}\n\n/**\n * Variant for tools whose model-facing surface is denser as markdown than as\n * pretty-printed JSON (~20% token savings on prose-heavy payloads). The\n * markdown goes to `content[0].text`; `structuredContent` keeps the machine\n * fields so a non-LLM client still gets a parseable shape.\n */\nexport function textWithStruct(markdown: string, data: object) {\n return {\n content: [{ type: 'text' as const, text: markdown }],\n structuredContent: data as Record<string, unknown>\n };\n}\n\nexport interface ToolErrorPayload {\n readonly code: string;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nexport function textError(error: ToolErrorPayload) {\n const payload = {\n code: error.code,\n message: error.message,\n details: error.details ?? {}\n };\n return {\n isError: true as const,\n content: [{ type: 'text' as const, text: JSON.stringify(payload) }],\n structuredContent: payload as Record<string, unknown>\n };\n}\n", "import type { DatabaseSync } from 'node:sqlite';\nimport { z } from 'zod';\nimport { sanitizeFtsQuery } from '../lib/fts.js';\nimport { textError, textJson } from '../lib/toolResponse.js';\n\nexport const SearchInputSchema = z.object({\n query: z\n .string()\n .min(1)\n .describe(\n 'Natural-language search query. Matched against title, summary, and body via SQLite FTS5.'\n ),\n scope: z\n .string()\n .optional()\n .describe('Optional: restrict to a project scope (e.g. \"ontology\", \"sotto\").'),\n kind: z\n .string()\n .optional()\n .describe(\n 'Optional: restrict to a kind. Project kinds: spec, adr, plan, ops. Research kinds: article, src. Misc: note.'\n ),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .default(5)\n .describe('Maximum number of ranked results to return. Default 5.')\n});\n\nexport type SearchInput = z.infer<typeof SearchInputSchema>;\n\nexport interface SearchResult {\n readonly path: string;\n readonly title: string;\n readonly kind: string;\n readonly summary: string | null;\n readonly score: number;\n readonly scope?: string | null;\n}\n\nexport interface SearchDeps {\n readonly db: DatabaseSync;\n}\n\n// Column weights over pages_fts(title, summary, body): a page NAMING the\n// concept outranks pages that merely mention it, however often. Shared\n// ranking policy with prime's task-relevant pages.\nexport const FTS_RANK = 'bm25(pages_fts, 10.0, 5.0, 1.0)';\n\nexport function search(deps: SearchDeps, input: SearchInput): { results: SearchResult[] } {\n const ftsQuery = sanitizeFtsQuery(input.query);\n if (!ftsQuery) return { results: [] };\n\n let sql = `SELECT p.path, p.title, p.kind, p.summary, p.scope, ${FTS_RANK} AS score\n FROM pages_fts\n JOIN pages p ON p.id = pages_fts.rowid\n WHERE pages_fts MATCH ?`;\n const params: Array<string | number> = [ftsQuery];\n\n if (input.scope) {\n sql += ' AND p.scope = ?';\n params.push(input.scope);\n }\n if (input.kind) {\n sql += ' AND p.kind = ?';\n params.push(input.kind);\n }\n sql += ` ORDER BY ${FTS_RANK} LIMIT ?`;\n params.push(input.limit);\n\n const rows = deps.db.prepare(sql).all(...params) as Array<{\n path: string;\n title: string;\n kind: string;\n summary: string | null;\n scope: string | null;\n score: number;\n }>;\n\n return {\n results: rows.map((r) => ({\n path: r.path,\n title: r.title,\n kind: r.kind,\n summary: r.summary,\n scope: r.scope,\n score: r.score\n }))\n };\n}\n\nexport function handleSearch(deps: SearchDeps, input: SearchInput) {\n try {\n return textJson(search(deps, input));\n } catch (err) {\n return textError({\n code: 'SEARCH_FAILED',\n message: err instanceof Error ? err.message : String(err)\n });\n }\n}\n", "import { readFile } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { canonicalVaultRoot } from '@llm-wiki/db/database';\nimport { z } from 'zod';\nimport { parseFrontmatter } from '../frontmatter.js';\nimport { sanitizeFtsQuery } from '../lib/fts.js';\nimport { textError, textWithStruct } from '../lib/toolResponse.js';\nimport { kindName, type VaultConfig } from '../vault-config.js';\nimport { FTS_RANK } from './search.js';\n\nexport const PrimeInputSchema = z.object({\n scope: z\n .string()\n .min(1)\n .describe('Project scope to prime (matches projects/{scope}/ in the vault).'),\n task: z\n .string()\n .optional()\n .describe('Optional task description; surfaces top-3 tsvector-ranked relevant pages.')\n});\n\nexport type PrimeInput = z.infer<typeof PrimeInputSchema>;\n\ninterface ProjectIndexFm {\n title?: string;\n methodology?: string;\n phase?: number;\n summary?: string;\n}\n\nexport interface PrimeData {\n scope: string;\n vault_root: string;\n title: string | null;\n methodology: string | null;\n phase: number | null;\n summary: string;\n primer: string;\n counts: Record<string, number>;\n active_adrs: Array<{ path: string; slug: string; title: string; summary: string | null }>;\n current_plan: { path: string; slug: string; title: string } | null;\n top_tags: string[];\n hub_pages: Array<{ path: string; title: string; inbound: number }>;\n recent: Array<{ path: string; operation: string; date: string }>;\n relevant: Array<{ path: string; title: string; score: number }>;\n cross_scope: Array<{ from_scope: string; from_path: string; to_path: string }>;\n}\n\nexport interface PrimeDeps {\n readonly db: DatabaseSync;\n readonly vaultRoot: string;\n readonly vaultConfig: VaultConfig;\n}\n\nfunction pathSlug(p: string): string {\n return basename(p).replace(/\\.md$/, '');\n}\n\nasync function readIndexFm(vaultRoot: string, scope: string): Promise<ProjectIndexFm> {\n try {\n const raw = await readFile(join(vaultRoot, 'projects', scope, 'index.md'), 'utf8');\n return parseFrontmatter(raw).data as ProjectIndexFm;\n } catch {\n return {};\n }\n}\n\nasync function readPrimer(vaultRoot: string, scope: string): Promise<string> {\n try {\n const raw = await readFile(join(vaultRoot, 'projects', scope, 'primer.md'), 'utf8');\n return parseFrontmatter(raw)\n .content.trim()\n .replace(/^#\\s+[^\\n]+\\n+/, '');\n } catch {\n return '';\n }\n}\n\nexport async function prime(\n deps: PrimeDeps,\n input: PrimeInput\n): Promise<{ markdown: string; data: PrimeData }> {\n const { db, vaultRoot, vaultConfig } = deps;\n const { scope, task } = input;\n\n const [fm, primer] = await Promise.all([\n readIndexFm(vaultRoot, scope),\n readPrimer(vaultRoot, scope)\n ]);\n\n const counts = db\n .prepare('SELECT kind, count(*) AS count FROM pages WHERE scope = ? GROUP BY kind')\n .all(scope) as Array<{ kind: string; count: number | bigint }>;\n\n const adrs = db\n .prepare(\n \"SELECT path, title, summary FROM pages WHERE scope = ? AND kind = 'adr' AND status = 'active' ORDER BY updated DESC\"\n )\n .all(scope) as Array<{ path: string; title: string; summary: string | null }>;\n\n const planRow = db\n .prepare(\n \"SELECT path, title FROM pages WHERE scope = ? AND kind = 'plan' AND status = 'active' ORDER BY updated DESC LIMIT 1\"\n )\n .get(scope) as { path: string; title: string } | undefined;\n\n const tags = db\n .prepare(\n `SELECT j.value AS tag, count(*) AS cnt\n FROM pages, json_each(pages.tags) AS j\n WHERE scope = ?\n GROUP BY j.value\n ORDER BY cnt DESC\n LIMIT 10`\n )\n .all(scope) as Array<{ tag: string }>;\n\n const hubs = db\n .prepare(\n `SELECT p.path, p.title, count(*) AS inbound\n FROM links l JOIN pages p ON p.path = l.target_path\n WHERE p.scope = ?\n GROUP BY p.path, p.title\n ORDER BY inbound DESC LIMIT 5`\n )\n .all(scope) as Array<{ path: string; title: string; inbound: number | bigint }>;\n\n const events = db\n .prepare('SELECT path, operation, ts FROM events WHERE scope = ? ORDER BY ts DESC LIMIT 5')\n .all(scope) as Array<{ path: string; operation: string; ts: string }>;\n\n const crossScope = db\n .prepare(\n `SELECT pf.scope AS from_scope, l.source_path AS from_path, l.target_path AS to_path\n FROM links l\n JOIN pages pt ON pt.path = l.target_path\n JOIN pages pf ON pf.path = l.source_path\n WHERE pt.scope = ? AND pf.scope IS NOT NULL AND pf.scope != ?\n LIMIT 10`\n )\n .all(scope, scope) as Array<{ from_scope: string; from_path: string; to_path: string }>;\n\n let relevant: Array<{ path: string; title: string; score: number }> = [];\n if (task) {\n const ftsQuery = sanitizeFtsQuery(task);\n if (ftsQuery) {\n relevant = (\n db\n .prepare(\n `SELECT p.path, p.title, ${FTS_RANK} AS score\n FROM pages_fts\n JOIN pages p ON p.id = pages_fts.rowid\n WHERE pages_fts MATCH ? AND p.scope = ?\n ORDER BY ${FTS_RANK} LIMIT 3`\n )\n .all(ftsQuery, scope) as Array<{ path: string; title: string; score: number }>\n ).map((row) => ({\n path: row.path,\n title: row.title,\n score: row.score\n }));\n }\n }\n\n const countsRecord: Record<string, number> = {};\n for (const row of counts) countsRecord[row.kind] = Number(row.count);\n\n const data: PrimeData = {\n scope,\n vault_root: canonicalVaultRoot(vaultRoot),\n title: fm.title ?? null,\n methodology: fm.methodology ?? null,\n phase: typeof fm.phase === 'number' ? fm.phase : null,\n summary: fm.summary ?? '',\n primer,\n counts: countsRecord,\n active_adrs: adrs.map((r) => ({\n path: r.path,\n slug: pathSlug(r.path),\n title: r.title,\n summary: r.summary\n })),\n current_plan: planRow\n ? {\n path: planRow.path,\n slug: pathSlug(planRow.path),\n title: planRow.title\n }\n : null,\n top_tags: tags.map((r) => r.tag),\n hub_pages: hubs.map((r) => ({\n path: r.path,\n title: r.title,\n inbound: Number(r.inbound)\n })),\n recent: events.map((r) => ({\n path: r.path,\n operation: r.operation,\n date: r.ts.slice(0, 10)\n })),\n relevant,\n cross_scope: crossScope.map((r) => ({\n from_scope: r.from_scope,\n from_path: r.from_path,\n to_path: r.to_path\n }))\n };\n\n return { markdown: renderMarkdown(data, vaultConfig, task), data };\n}\n\nexport function renderMarkdown(\n d: PrimeData,\n config: VaultConfig,\n task: string | undefined\n): string {\n const lines: string[] = [];\n\n const phaseLabel =\n d.phase !== null\n ? d.methodology\n ? `Phase ${d.phase} (${d.methodology})`\n : `Phase ${d.phase}`\n : '';\n const header = phaseLabel ? `${d.scope} \u2014 ${phaseLabel}` : d.scope;\n lines.push(`# ${header}`);\n if (d.summary) lines.push(d.summary);\n // Search returns vault-relative paths; this is what the agent resolves them against.\n lines.push(`Vault root: \\`${d.vault_root}\\``);\n\n if (d.primer) {\n lines.push('', '## Primer', d.primer);\n }\n\n if (d.active_adrs.length > 0) {\n lines.push('', '## Active Decisions');\n for (const a of d.active_adrs) {\n lines.push(`- ${a.slug}: ${a.summary ?? a.title}`);\n }\n }\n\n if (d.current_plan) {\n lines.push('', '## Current Plan');\n lines.push(`${d.current_plan.slug}: ${d.current_plan.title}`);\n }\n\n const countEntries = Object.entries(d.counts);\n if (countEntries.length > 0) {\n lines.push('', '## Pages');\n lines.push(countEntries.map(([k, n]) => `${k}: ${n}`).join(' | '));\n }\n\n lines.push('', '## Vocabulary');\n lines.push(`kinds: ${config.kinds.map(kindName).join(', ')}`);\n lines.push(`statuses: ${config.statuses.join(', ')}`);\n lines.push(`tags: ${config.tags.canonical.join(', ')}`);\n\n if (d.top_tags.length > 0) {\n lines.push('', '## Tags');\n lines.push(d.top_tags.join(', '));\n }\n\n if (d.hub_pages.length > 0) {\n lines.push('', '## Hubs');\n for (const h of d.hub_pages) {\n lines.push(`- ${pathSlug(h.path)} (${h.inbound} inbound)`);\n }\n }\n\n if (d.recent.length > 0) {\n lines.push('', '## Recent');\n for (const r of d.recent) {\n lines.push(`- [${r.date}] ${pathSlug(r.path)} ${r.operation}`);\n }\n }\n\n if (d.relevant.length > 0) {\n lines.push('', `## Relevant (task: \"${task}\")`);\n for (const r of d.relevant) {\n lines.push(`- ${pathSlug(r.path)} (${r.score.toFixed(2)})`);\n }\n }\n\n if (d.cross_scope.length > 0) {\n lines.push('', '## Cross-scope');\n for (const c of d.cross_scope) {\n lines.push(`- ${c.from_scope}/${pathSlug(c.from_path)} \u2192 ${pathSlug(c.to_path)}`);\n }\n }\n\n lines.push(\n '',\n '---',\n 'Authoring wiki content? Read `wiki://authoring` for kind selector, rules, and templates. After edits: `kmd validate`, then `kmd sync`.'\n );\n\n return lines.join('\\n');\n}\n\nexport async function handlePrime(deps: PrimeDeps, input: PrimeInput) {\n if (!Object.hasOwn(deps.vaultConfig.scopes, input.scope)) {\n const valid = Object.keys(deps.vaultConfig.scopes).sort().join(', ');\n return textError({\n code: 'UNKNOWN_SCOPE',\n message: `unknown scope \"${input.scope}\"; valid scopes: ${valid}`\n });\n }\n try {\n const { markdown, data } = await prime(deps, input);\n return textWithStruct(markdown, data as unknown as Record<string, unknown>);\n } catch (err) {\n return textError({\n code: 'PRIME_FAILED',\n message: err instanceof Error ? err.message : String(err)\n });\n }\n}\n", "import type { DatabaseSync } from 'node:sqlite';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Logger } from './lib/logger.js';\nimport { registerAuthoringResource } from './resources/authoring.js';\nimport { registerTemplateResources } from './resources/templates.js';\nimport { handlePrime, PrimeInputSchema } from './tools/prime.js';\nimport { handleSearch, SearchInputSchema } from './tools/search.js';\nimport type { VaultConfig } from './vault-config.js';\n\nexport interface BuildServerArgs {\n readonly name: string;\n readonly version: string;\n readonly vaultRoot: string;\n readonly db: DatabaseSync;\n readonly logger: Logger;\n readonly vaultConfig: VaultConfig;\n}\n\nexport function buildServer(args: BuildServerArgs): McpServer {\n const { name, version, vaultRoot, db, logger, vaultConfig } = args;\n\n const mcp = new McpServer({ name, version }, { capabilities: { tools: {}, resources: {} } });\n\n mcp.tool(\n 'prime',\n 'Orient on a project. Returns a markdown briefing with: identity (scope, phase, methodology, summary), the human-authored primer.md inlined, active ADRs, current plan, page counts, top tags, hub pages (most-linked-to), recent events, cross-scope references, and \u2014 when `task` is provided \u2014 the top 3 tsvector-ranked relevant pages. Call once at session start. Empty sections are omitted to keep the surface lean.',\n PrimeInputSchema.shape,\n async (input) => {\n logger.debug({ tool: 'prime', input }, 'tool call');\n return handlePrime({ db, vaultRoot, vaultConfig }, input);\n }\n );\n\n mcp.tool(\n 'search',\n 'Full-text search across wiki pages via SQLite FTS5. Returns ranked candidates {path, title, kind, summary, score} \u2014 never page bodies. The agent reads the returned paths directly from the filesystem.',\n SearchInputSchema.shape,\n async (input) => {\n logger.debug({ tool: 'search', input }, 'tool call');\n return handleSearch({ db }, input);\n }\n );\n\n registerTemplateResources(mcp, vaultRoot, vaultConfig);\n registerAuthoringResource(mcp, vaultRoot, vaultConfig);\n\n return mcp;\n}\n", "import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config.js';\nimport { createDatabase } from './db.js';\nimport { diag } from './lib/diag.js';\nimport { createLogger } from './lib/logger.js';\nimport { buildServer } from './server.js';\nimport { loadVaultConfig } from './vault-config.js';\n\nexport async function startMcpServer(): Promise<void> {\n diag('main entered');\n\n const config = loadConfig();\n diag('config loaded', { vault: config.wikiVault, level: config.logLevel });\n\n const vaultConfig = await loadVaultConfig(config.wikiVault);\n diag('vault config loaded', {\n scopes: Object.keys(vaultConfig.scopes).length,\n kinds: vaultConfig.kinds.length,\n statuses: vaultConfig.statuses.length\n });\n\n const logger = createLogger(config.logLevel, config.serverName);\n logger.info(\n { vault: config.wikiVault, serverName: config.serverName, serverVersion: config.serverVersion },\n 'starting wiki-mcp on stdio'\n );\n\n const db = createDatabase(config.wikiVault);\n diag('database opened');\n\n const mcp = buildServer({\n name: config.serverName,\n version: config.serverVersion,\n vaultRoot: config.wikiVault,\n db,\n logger,\n vaultConfig\n });\n diag('server built');\n\n const shutdown = async (signal: NodeJS.Signals) => {\n logger.info({ signal }, 'shutting down');\n diag('shutting down', { signal });\n try {\n await mcp.close();\n db.close();\n } catch (err) {\n logger.error({ err }, 'error during shutdown');\n }\n process.exit(0);\n };\n process.once('SIGINT', (s) => void shutdown(s));\n process.once('SIGTERM', (s) => void shutdown(s));\n\n const transport = new StdioServerTransport();\n await mcp.connect(transport);\n logger.info('wiki-mcp ready');\n diag('ready and connected to transport');\n}\n", "#!/usr/bin/env node\nimport { parseArgs } from 'node:util';\n\nconst USAGE = `usage: kmd <command> [options]\n\ncommands:\n sync vault \u2192 index sync (runs validate first)\n validate [<path>] deterministic vault checker (default: $WIKI_VAULT)\n mcp [<vault-root>] start the stdio MCP server (default: $WIKI_VAULT)\n config [<vault-root>] print vault + index resolution; with no vault, list known vaults\n db reset [<vault-root>] delete the vault's index (default: $WIKI_VAULT)\n\noptions:\n --version print version\n --help show this help`;\n\nconst { positionals, values } = parseArgs({\n args: process.argv.slice(2),\n allowPositionals: true,\n strict: false,\n options: {\n version: { type: 'boolean', short: 'v' },\n help: { type: 'boolean', short: 'h' }\n }\n});\n\nconst command = values.version ? '--version' : values.help ? '--help' : positionals[0];\n\nfunction applyVaultRoot(positionalIndex: number): void {\n const arg = positionals[positionalIndex];\n if (arg) {\n process.env.WIKI_VAULT = arg;\n }\n}\n\nasync function run(): Promise<void> {\n switch (command) {\n case 'sync': {\n const { runSyncCommand } = await import('@llm-wiki/cli/cli');\n await runSyncCommand();\n break;\n }\n case 'validate': {\n applyVaultRoot(1);\n const { runValidate } = await import('@llm-wiki/cli/cli');\n await runValidate();\n break;\n }\n case 'mcp': {\n applyVaultRoot(1);\n const { startMcpServer } = await import('@llm-wiki/mcp/start');\n await startMcpServer();\n break;\n }\n case 'config': {\n applyVaultRoot(1);\n const { runConfig } = await import('@llm-wiki/cli/cli');\n await runConfig();\n break;\n }\n case 'db': {\n const sub = positionals[1];\n if (sub === 'reset') {\n applyVaultRoot(2);\n const { runDbReset } = await import('@llm-wiki/cli/cli');\n await runDbReset();\n } else {\n console.error(sub ? `unknown db subcommand: ${sub}` : 'usage: kmd db reset [<vault-root>]');\n process.exit(2);\n }\n break;\n }\n case '--version':\n case '-v': {\n const { readFileSync } = await import('node:fs');\n const { join, dirname } = await import('node:path');\n const { fileURLToPath } = await import('node:url');\n const pkgDir = dirname(dirname(fileURLToPath(import.meta.url)));\n const pkg = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf8')) as {\n version: string;\n };\n console.log(pkg.version);\n break;\n }\n case '--help':\n case '-h':\n case undefined: {\n console.log(USAGE);\n if (command === undefined) process.exit(2);\n break;\n }\n default: {\n console.error(`unknown command: ${command}\\n\\n${USAGE}`);\n process.exit(2);\n }\n }\n}\n\nrun().catch((err) => {\n console.error('kmd failed:', err instanceof Error ? (err.stack ?? err.message) : err);\n process.exit(1);\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["vaultRoot", "join", "vaultRoot", "createHash", "readFile", "join", "z", "readFile", "join", "basename", "dirname", "join", "positionals", "command", "z", "EnvSchema", "
|
|
3
|
+
"sources": ["../../db/src/database.ts", "../../db/src/vault-config.ts", "../../cli/src/frontmatter.ts", "../../cli/src/init-templates.ts", "../../cli/src/init.ts", "../../cli/src/sync.ts", "../../cli/src/validate.ts", "../../cli/src/cli.ts", "../../mcp/src/config.ts", "../../mcp/src/db.ts", "../../mcp/src/lib/diag.ts", "../../mcp/src/lib/logger.ts", "../../mcp/src/resources/authoring.ts", "../../mcp/src/resources/templates.ts", "../../mcp/src/frontmatter.ts", "../../mcp/src/lib/fts.ts", "../../mcp/src/lib/toolResponse.ts", "../../mcp/src/tools/search.ts", "../../mcp/src/tools/prime.ts", "../../mcp/src/server.ts", "../../mcp/src/start.ts", "../../cli/src/hook.ts", "../bin/kmd.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash } from 'node:crypto';\nimport { realpathSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { basename, join, resolve } from 'node:path';\nimport { DatabaseSync } from 'node:sqlite';\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS pages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n path TEXT UNIQUE NOT NULL,\n title TEXT NOT NULL,\n kind TEXT NOT NULL,\n scope TEXT,\n topic TEXT,\n status TEXT NOT NULL DEFAULT 'draft',\n summary TEXT,\n tags TEXT,\n updated TEXT,\n body TEXT,\n content_hash TEXT,\n meta TEXT\n);\n\nCREATE INDEX IF NOT EXISTS pages_scope_kind ON pages(scope, kind, status);\nCREATE INDEX IF NOT EXISTS pages_topic_kind ON pages(topic, kind, status);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS pages_fts USING fts5(\n title, summary, body,\n content='pages',\n content_rowid='id'\n);\n\nCREATE TABLE IF NOT EXISTS links (\n source_path TEXT NOT NULL,\n target_path TEXT NOT NULL,\n link_text TEXT,\n PRIMARY KEY (source_path, target_path)\n);\n\nCREATE INDEX IF NOT EXISTS links_source ON links(source_path);\nCREATE INDEX IF NOT EXISTS links_target ON links(target_path);\n\nCREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts TEXT DEFAULT (datetime('now')),\n scope TEXT,\n operation TEXT NOT NULL,\n path TEXT,\n note TEXT\n);\n\nCREATE INDEX IF NOT EXISTS events_scope_ts ON events(scope, ts DESC);\n\nCREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n`;\n\nexport function openDatabase(dbPath: string): DatabaseSync {\n const db = new DatabaseSync(dbPath);\n db.exec('PRAGMA journal_mode = WAL');\n db.exec('PRAGMA foreign_keys = ON');\n db.exec(SCHEMA);\n return db;\n}\n\n/** Root of kmd's per-user state tree (default `~/.kmd`); `$KMD_HOME` relocates it. */\nexport function kmdHome(): string {\n return process.env.KMD_HOME ?? join(homedir(), '.kmd');\n}\n\n/**\n * Directory holding all per-vault indexes: `$KMD_HOME/db/{vault-key}/index.db`\n * (default `~/.kmd`). One directory per vault keyed by resolved path, so two\n * vaults can never clobber each other's index and a moved/re-pointed vault\n * gets a fresh one.\n */\nexport function indexRootDir(): string {\n return join(kmdHome(), 'db');\n}\n\n/**\n * Resolved (symlink-free, absolute) vault root \u2014 the canonical identity a\n * vault is keyed by. Falls back to plain resolution when the path does not\n * exist yet.\n */\nexport function canonicalVaultRoot(vaultRoot: string): string {\n try {\n return realpathSync(vaultRoot);\n } catch {\n return resolve(vaultRoot);\n }\n}\n\n/** `{basename}-{8-hex}` \u2014 human-scannable, collision-safe per resolved path. */\nexport function vaultKey(vaultRoot: string): string {\n const canonical = canonicalVaultRoot(vaultRoot);\n const hash = createHash('sha256').update(canonical).digest('hex').slice(0, 8);\n return `${basename(canonical)}-${hash}`;\n}\n\n/** Absolute path of the vault's index database file. */\nexport function resolveIndexPath(vaultRoot: string): string {\n return join(indexRootDir(), vaultKey(vaultRoot), 'index.db');\n}\n\nexport function getMeta(db: DatabaseSync, key: string): string | null {\n const row = db.prepare('SELECT value FROM meta WHERE key = ?').get(key) as\n | { value: string }\n | undefined;\n return row?.value ?? null;\n}\n\nexport function setMeta(db: DatabaseSync, key: string, value: string): void {\n db.prepare(\n 'INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value'\n ).run(key, value);\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\nconst ScopeSchema = z.strictObject({\n repo: z\n .string()\n .optional()\n .describe(\n 'Consumer repo path (~ expands). Load-bearing for kmd hook: the active scope resolves by matching the session cwd against it.'\n ),\n methodology: z.string().optional().describe('Must appear in the methodologies list.'),\n status: z.string().describe('Free string; keep within statuses by convention.')\n});\n\nconst KindEntrySchema = z.union([\n z.string(),\n z.strictObject({\n name: z.string(),\n signal: z.string().describe('When to pick this kind.'),\n where: z.string().describe('Path pattern pages of this kind follow.')\n })\n]);\n\nfunction isValidRegex(pattern: string): boolean {\n try {\n return Boolean(new RegExp(pattern));\n } catch {\n return false;\n }\n}\n\nconst WhenSchema = z.union([\n z.string(),\n z.strictObject({\n name: z.enum(['newer-than']),\n fresh: z.array(z.string().min(1)).min(1),\n than: z.array(z.string().min(1)).min(1)\n })\n]);\n\n// Exported: `kmd hook --triggers` validates standalone trigger files with it.\nexport const TriggerSchema = z\n .strictObject({\n id: z.string().min(1).describe('Unique per scope list; duplicates keep the first occurrence.'),\n on: z.enum(['prompt', 'pretool']),\n enforce: z\n .enum(['inject', 'warn', 'block'])\n .describe('inject: context line \u00B7 warn: stderr \u00B7 block: deny with reason.'),\n keywords: z\n .array(z.string().min(1))\n .optional()\n .describe('Word-boundary, porter-stemmed match. Prompt triggers need keywords or intent.'),\n intent: z\n .array(z.string())\n .optional()\n .describe('Case-insensitive regexes over the raw prompt \u2014 the stemming escape hatch.'),\n tool: z.string().optional().describe('Exact tool name; pretool matchers AND-compose.'),\n args_match: z.string().optional().describe('Regex over the serialized tool input.'),\n files: z\n .array(z.string().min(1))\n .optional()\n .describe('Globs against the paths the tool touches; pretool triggers only.'),\n when: WhenSchema.optional().describe(\n 'Precondition \u2014 the gate fires only when it is UNMET. newer-than: the newest page matching fresh must carry frontmatter updated at or after the newest matching than.'\n ),\n text: z.string().optional().describe('Required for inject and warn \u2014 the line emitted.'),\n reason: z.string().optional().describe('Required for block \u2014 the denial the agent reads.')\n })\n .superRefine((trigger, ctx) => {\n if (trigger.on === 'prompt' && !trigger.keywords?.length && !trigger.intent?.length) {\n ctx.addIssue({\n code: 'custom',\n message: `prompt trigger \"${trigger.id}\" needs keywords or intent`\n });\n }\n if (\n trigger.on === 'pretool' &&\n trigger.tool === undefined &&\n trigger.args_match === undefined &&\n !trigger.files?.length\n ) {\n ctx.addIssue({\n code: 'custom',\n message: `pretool trigger \"${trigger.id}\" needs a tool, args_match, or files matcher`\n });\n }\n if (trigger.on === 'prompt' && trigger.files !== undefined) {\n ctx.addIssue({\n code: 'custom',\n message: `trigger \"${trigger.id}\": files applies to pretool triggers only`\n });\n }\n if (trigger.enforce === 'block' ? trigger.reason === undefined : trigger.text === undefined) {\n ctx.addIssue({\n code: 'custom',\n message:\n trigger.enforce === 'block'\n ? `block trigger \"${trigger.id}\" needs a reason`\n : `${trigger.enforce} trigger \"${trigger.id}\" needs a text`\n });\n }\n const patterns = [...(trigger.intent ?? [])];\n if (trigger.args_match !== undefined) patterns.push(trigger.args_match);\n for (const pattern of patterns) {\n if (!isValidRegex(pattern)) {\n ctx.addIssue({\n code: 'custom',\n message: `trigger \"${trigger.id}\" has an invalid regex: ${pattern}`\n });\n }\n }\n });\n\nconst TriggersSchema = z.record(z.string(), z.array(TriggerSchema));\n\nconst VaultConfigSchema = z\n .strictObject({\n scopes: z\n .record(z.string(), ScopeSchema)\n .describe('Scope name \u2192 entry; key = directory name under projects/.'),\n kinds: z\n .array(KindEntrySchema)\n .describe(\n 'Page kind vocabulary; validate-enforced. Object form adds a kind-selector row to wiki://authoring.'\n ),\n statuses: z.array(z.string()).describe('Page status vocabulary; validate-enforced.'),\n methodologies: z\n .array(z.string())\n .describe('Methodology vocabulary for pages and scope entries.'),\n tags: z.strictObject({\n canonical: z.array(z.string()).describe('Approved tags.'),\n aliases: z\n .record(z.string(), z.string())\n .describe('Alias \u2192 canonical; validate warns on alias use.')\n }),\n authoring_rules: z\n .string()\n .optional()\n .describe('Replaces the served \u00A7 Authoring rules entirely \u2014 escape hatch.'),\n authoring_rules_extra: z\n .string()\n .optional()\n .describe('Appended after the served \u00A7 Authoring rules.'),\n sync_protocol: z\n .string()\n .optional()\n .describe('Replaces the served \u00A7 Resync protocol entirely \u2014 escape hatch.'),\n sync_protocol_extra: z\n .string()\n .optional()\n .describe('Appended after the served \u00A7 Resync protocol.'),\n triggers: TriggersSchema.optional().describe(\n 'Full-replace of the trigger base per scope \u2014 escape hatch. \"_all\" is reserved for triggers_extra.'\n ),\n triggers_extra: TriggersSchema.optional().describe(\n 'Appended per scope after the engine defaults; the reserved \"_all\" key fires in every session.'\n )\n })\n .describe('kmd vault.yaml \u2014 controlled vocabulary and gate triggers.')\n .superRefine((config, ctx) => {\n for (const [name, scope] of Object.entries(config.scopes)) {\n if (scope.methodology !== undefined && !config.methodologies.includes(scope.methodology)) {\n ctx.addIssue({\n code: 'custom',\n path: ['scopes', name, 'methodology'],\n message: `\"${scope.methodology}\" is not in the methodologies list`\n });\n }\n }\n if (config.triggers?._all !== undefined) {\n ctx.addIssue({\n code: 'custom',\n path: ['triggers', '_all'],\n message: '\"_all\" is reserved for triggers_extra'\n });\n }\n for (const field of ['triggers', 'triggers_extra'] as const) {\n for (const [scope, list] of Object.entries(config[field] ?? {})) {\n const seen = new Set<string>();\n for (const trigger of list) {\n if (seen.has(trigger.id)) {\n ctx.addIssue({\n code: 'custom',\n path: [field, scope],\n message: `duplicate trigger id \"${trigger.id}\"`\n });\n }\n seen.add(trigger.id);\n }\n }\n }\n });\n\nexport type KindEntry = z.infer<typeof KindEntrySchema>;\nexport type Trigger = z.infer<typeof TriggerSchema>;\nexport type VaultConfig = z.infer<typeof VaultConfigSchema>;\n\n/** Kind name of a `kinds` entry \u2014 plain string, or the object form's `name`. */\nexport function kindName(entry: KindEntry): string {\n return typeof entry === 'string' ? entry : entry.name;\n}\n\n/**\n * Kinds with built-in engine pedagogy (kind-selector rows; most also carry a\n * served template). An object-form entry with one of these names rewords its\n * selector row only \u2014 it never creates custom-template expectations.\n */\nexport const BUILT_IN_KINDS: ReadonlySet<string> = new Set([\n 'project',\n 'spec',\n 'adr',\n 'plan',\n 'story',\n 'ops',\n 'topic',\n 'article',\n 'src',\n 'note',\n 'artifact',\n 'prompt'\n]);\n\n/**\n * JSON Schema (draft-07) emission of the vault.yaml contract, consumed by the\n * yaml-language-server modeline for in-IDE validation and hover docs.\n * Structural only \u2014 refinements (trigger conditionals, methodology\n * membership, duplicate ids) stay runtime checks in this module.\n */\nexport function configJsonSchema(): Record<string, unknown> {\n return z.toJSONSchema(VaultConfigSchema, { target: 'draft-7' }) as Record<string, unknown>;\n}\n\n/**\n * Load and validate `$vaultRoot/vault.yaml` \u2014 the single source of truth for\n * the controlled vocabulary. Throws (fail-loud) when the file is missing or\n * the contents don't satisfy the schema \u2014 unknown keys included, so a typo'd\n * field never silently does nothing. Nothing runs on partial vocabulary:\n * sync aborts and the MCP server refuses to start.\n */\nexport async function loadVaultConfig(vaultRoot: string): Promise<VaultConfig> {\n const path = join(vaultRoot, 'vault.yaml');\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (err) {\n throw new Error(`vault.yaml not found at ${path}`, { cause: err });\n }\n const parsed = VaultConfigSchema.safeParse(parse(raw));\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('\\n');\n throw new Error(`Invalid vault.yaml at ${path}:\\n${issues}`);\n }\n return parsed.data;\n}\n", "import { parse as parseYaml } from 'yaml';\n\nexport interface ParsedFrontmatter {\n data: Record<string, unknown>;\n content: string;\n}\n\n// Leading `---` block, YAML, closing `---`, then one consumed newline. Matches\n// gray-matter's delimiter handling; the closing `---` must be on its own line so\n// `---` rules inside the body are left intact.\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n?---\\r?\\n?/;\n\n/**\n * Split a page's frontmatter from its body using the `yaml` parser. Throws\n * (deterministically, no cache) when the frontmatter is not valid YAML \u2014 this is\n * the failure mode `wiki validate` exists to catch. A page with no leading\n * delimiter parses to empty data and the whole input as body.\n */\nexport function parseFrontmatter(raw: string): ParsedFrontmatter {\n const match = FRONTMATTER_RE.exec(raw);\n if (!match) {\n return { data: {}, content: raw };\n }\n const yamlText = match[1] ?? '';\n const content = raw.slice(match[0].length);\n if (yamlText.trim() === '') {\n return { data: {}, content };\n }\n const parsed = parseYaml(yamlText);\n const data =\n parsed !== null && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {};\n return { data, content };\n}\n", "/**\n * The built-in vault templates, embedded so `kmd init` scaffolds a working\n * vault offline. Filenames are the MCP server's resource contract\n * (wiki://template/{domain}/{kind} maps to them) \u2014 never rename.\n */\nexport const VAULT_TEMPLATES: Readonly<Record<string, string>> = {\n 'note.md':\n '---\\ntitle: {{title}}\\ntags: []\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n',\n 'project-adr.md':\n '---\\ntitle: {{title}}\\nkind: adr\\nscope:\\nstatus: active\\nsummary:\\ntags: []\\nsupersedes:\\nsuperseded_by:\\nsources: []\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Status\\n\\n> [!info] Active\\n\\n## Context\\n\\nThe forces in tension \u2014 what made this a decision rather than an\\nobvious step. Name the constraints; skip the history recap.\\n\\n## Decision\\n\\nWhat was decided, precisely. Predicates only \u2014 falsifiable, not\\naspirational.\\n\\n## Rationale\\n\\nWhy this side won: which alternatives were live, and what killed each.\\nAn ADR with no rejected alternative is a spec in disguise.\\n\\n## Consequences\\n\\nWhat this commits the project to going forward \u2014 including the costs\\naccepted, not just the benefits claimed.\\n\\n## Links\\n\\n-\\n',\n 'project-index.md':\n '---\\ntitle: {{title}}\\nkind: project\\nmethodology: sdd\\nphase: 1\\nrepo:\\nscope:\\nstatus: active\\ntags: []\\nsummary:\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Summary\\n\\nOne paragraph. What this project is and what it delivers.\\n\\n## Current Phase\\n\\nWhat\\'s in flight right now. 1\u20133 sentences.\\n\\n## Links\\n\\n- [[projects/{{title}}/primer]]\\n\\n## Sources\\n\\n-\\n',\n 'project-ops.md':\n '---\\ntitle: {{title}}\\nkind: ops\\nscope:\\nstatus: active\\nsummary:\\ntags: []\\nsources: []\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Summary\\n\\nWhat this runbook operates and when it runs.\\n\\n## Context\\n\\nWhat triggers this flow; what breaks when it\\'s skipped.\\n\\n## Details\\n\\nNumbered steps executable without asking: exact commands, expected\\noutput, failure modes and their recovery. Predicates only \u2014 if a step\\nneeds judgment, say whose.\\n\\n## Links\\n\\n-\\n\\n## Sources\\n\\n-\\n',\n 'project-plan.md':\n \"---\\ntitle: {{title}}\\nkind: plan\\nscope:\\nstatus: active\\nsummary:\\ntags: []\\ncreated: \\\"{{date}}\\\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Goal\\n\\nOne sentence: what this phase delivers. If it needs two, it's two\\nplans.\\n\\n## Scope\\n\\nWhat's in and \u2014 more important \u2014 what's out. Out-of-scope lines stop\\nscope creep better than in-scope lines define it.\\n\\n## Milestones\\n\\nCheckable outcomes, not activities. Tick here; don't cascade ticks to\\nindex.md unless phase or status changed.\\n\\n1.\\n2.\\n\\n## Dependencies\\n\\n-\\n\\n## Status Log\\n\\nDated one-liners, newest first. This is the only history surface \u2014\\nprimer and index stay clean.\\n\\n- {{date}}: Phase started.\\n\",\n 'project-primer.md':\n '---\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# Primer\\n\\n## Current Focus\\n\\nWhat we\\'re working on right now. 1\u20133 sentences. Not a history log \u2014\\nprogress lives in plan checkboxes; history lives in git.\\n\\n## Open Questions\\n\\nCurrently-open questions only. Strip on resolution; reflect the\\nresolution in the relevant ADR or spec, not here.\\n\\n-\\n\\n## Blocked On\\n\\nNothing currently. List only items genuinely blocking forward\\nprogress.\\n\\n## Load-bearing invariants (optional)\\n\\nFacts not derivable from code or commits \u2014 pipeline orderings, sync\\nconstraints, file-location rationales. The kind of fact a fresh-context\\nagent would otherwise re-derive incorrectly. Durable across sessions.\\n\\n## Read Order (optional)\\n\\n\u22645 entries. Wiki/doc pointers \u2014 what to read to orient. Each entry\\none line: `[[wikilink]] \u2014 why`.\\n\\n1.\\n\\n## Working set (optional)\\n\\n\u226410 entries. File pointers (code, fixtures, configs) for the\\nimmediate Next Steps, with one-line context. Lets a fresh-context\\nagent skip the discovery loop. Task-scoped \u2014 refresh when focus\\nshifts. Most valuable when transitioning phases or starting a new\\nfeature; can be skipped mid-slice when the immediate context already\\ncarries it.\\n\\n- `path/to/file` \u2014 why it\\'s relevant for the next steps.\\n',\n 'project-spec.md':\n \"---\\ntitle: {{title}}\\nkind: spec\\nscope:\\nstatus: active\\nsummary:\\ntags: []\\nsources: []\\ncreated: \\\"{{date}}\\\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Summary\\n\\nOne paragraph, in predicates \u2014 the system's current shape, not its\\nhistory. If you're recording a *choice* between alternatives, stop:\\nthat's an ADR.\\n\\n## Context\\n\\nThe question this spec answers and who asks it. One paragraph, no\\nnarrative arc.\\n\\n## Details\\n\\nThe actual contract: inputs, outputs, invariants, failure modes. Use\\nsubsections per concern. Present tense \u2014 the spec describes what IS\\nand must match current code at every commit.\\n\\n## Links\\n\\n-\\n\\n## Sources\\n\\n-\\n\",\n 'project-story.md':\n '---\\ntitle: {{title}}\\nkind: story\\nscope:\\nparent:\\nstatus: active\\ntriage_state: needs-triage\\ncategory: enhancement\\nblocked_by: []\\ntags: []\\nsources: []\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## User Story\\n\\nAs a {{actor}}, I want {{capability}}, so that {{benefit}}.\\n\\n## Scenarios\\n\\nScenarios are the test specification \u2014 each becomes a failing test\\nbefore implementation. Write observable outcomes, not implementation\\nsteps.\\n\\n**Scenario: {{scenario name}}**\\n- Given {{precondition}}\\n- When {{action}}\\n- Then {{expected outcome}}\\n\\n**Scenario: {{edge case name}}**\\n- Given {{precondition}}\\n- When {{action}}\\n- Then {{expected outcome}}\\n\\n## Slices\\n\\nVertical tracer bullets: each slice ships signature + implementation +\\ntests + wiring, independently committable. `AFK` = agent works alone;\\n`HITL` = human in the loop.\\n\\n- [ ] **Slice 1** \u2014 {{description}} \u00B7 `AFK` \u00B7 [[spec-{{topic}}]]\\n- [ ] **Slice 2** \u2014 {{description}} \u00B7 `HITL` \u00B7 [[adr-{{decision}}]]\\n\\n## References\\n\\n- [[spec-{{related-spec}}]]\\n- [[adr-{{related-adr}}]]\\n',\n 'research-article.md':\n '---\\ntitle: {{title}}\\nkind: article\\ntopic:\\nstatus: active\\nsummary:\\ntags: []\\nsources: []\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Summary\\n\\nOne paragraph. What this page covers and why it matters.\\n\\n## Context\\n\\nWhy this page exists. The problem or question it addresses.\\n\\n## Details\\n\\nThe actual content. Use subsections as needed.\\n\\n## Links\\n\\n-\\n\\n## Sources\\n\\n-\\n',\n 'research-index.md':\n '---\\ntitle: {{title}}\\nkind: topic\\nstatus: active\\nsummary:\\nconfidence: medium\\nsource_count: 0\\ntags: []\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Summary\\n\\nOne paragraph. What this research topic covers.\\n\\n## Confidence\\n\\nWhy the confidence level is what it is. What would raise or lower it.\\n\\n## Pages\\n\\n-\\n\\n## Sources\\n\\n-\\n',\n 'research-src.md':\n '---\\ntitle: {{title}}\\nkind: src\\ntopic:\\nstatus: active\\nsummary:\\ntags: []\\nsource_url:\\ncreated: \"{{date}}\"\\nupdated: {{date}}\\n---\\n\\n# {{title}}\\n\\n## Summary\\n\\nWhat this source is. Author, origin, year.\\n\\n## Key Points\\n\\n-\\n\\n## Quotes\\n\\n>\\n\\n## Relevance\\n\\nWhy this source matters to the topic.\\n\\n## Citation\\n\\n`{author, year, title, url}`\\n'\n};\n", "import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { configJsonSchema, type VaultConfig } from '@llm-wiki/db/vault-config';\nimport { stringify } from 'yaml';\nimport { VAULT_TEMPLATES } from './init-templates.js';\n\nexport const SCHEMA_FILE = 'vault.schema.json';\n\n// yaml-language-server reads this modeline and validates vault.yaml against\n// the sibling schema file in any modern IDE \u2014 machine wiring, not pedagogy.\nconst SCHEMA_MODELINE = `# yaml-language-server: $schema=./${SCHEMA_FILE}\\n`;\n\n/**\n * Write `vault.schema.json` when the running engine's emission differs from\n * what is on disk (absence counts). Returns whether a write happened \u2014 the\n * schema is a derived artifact; sync refreshes it so engine upgrades surface\n * as a visible git diff instead of silent IDE/runtime disagreement.\n */\nexport async function refreshSchemaFile(root: string): Promise<boolean> {\n const path = join(root, SCHEMA_FILE);\n const next = `${JSON.stringify(configJsonSchema(), null, 2)}\\n`;\n try {\n if ((await readFile(path, 'utf8')) === next) return false;\n } catch {}\n await writeFile(path, next);\n return true;\n}\n\n/**\n * The starter vocabulary a fresh vault ships with. Typed against the loader's\n * own schema so a spec change that invalidates it fails compile, not a user's\n * first sync. Scopes stay empty \u2014 the first scope is the adopter's naming\n * decision, not the engine's.\n */\nexport const STARTER_CONFIG: VaultConfig = {\n scopes: {},\n kinds: ['project', 'spec', 'adr', 'plan', 'story', 'ops', 'topic', 'article', 'src', 'note'],\n statuses: ['draft', 'active', 'superseded', 'archived'],\n methodologies: ['sdd', 'tdd', 'hybrid'],\n tags: { canonical: [], aliases: {} }\n};\n\nconst DOMAIN_DIRS = ['projects', 'research', 'notes'] as const;\n\n/**\n * Scaffold a fresh vault at `dir` and return the resolved root. Throws when\n * the target exists and is non-empty (any entry counts \u2014 deterministic, no\n * junk-file allowances). `vault.yaml` is written last: every tool fails loud\n * on its absence, so an interrupted scaffold is inert, never a half-valid\n * vault.\n */\nexport async function scaffoldVault(dir: string): Promise<string> {\n const root = resolve(dir);\n let entries: string[] = [];\n try {\n entries = await readdir(root);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n if (entries.includes('vault.yaml')) {\n throw new Error(`already a vault: ${root} (vault.yaml exists)`);\n }\n if (entries.length > 0) {\n throw new Error(\n `target is not empty: ${root}\\n found: ${entries.join(', ')}\\n delete it or pick another directory`\n );\n }\n\n for (const domain of DOMAIN_DIRS) {\n await mkdir(join(root, domain), { recursive: true });\n }\n await mkdir(join(root, 'templates'), { recursive: true });\n for (const [file, content] of Object.entries(VAULT_TEMPLATES)) {\n await writeFile(join(root, 'templates', file), content);\n }\n await refreshSchemaFile(root);\n await writeFile(join(root, 'vault.yaml'), SCHEMA_MODELINE + stringify(STARTER_CONFIG));\n return root;\n}\n\n/**\n * `[y/N]` confirmation on stderr \u2014 stdout stays data-clean. Only called when\n * stdin is a TTY; a piped invocation must never hang on a hidden question.\n */\nexport async function promptYesNo(\n question: string,\n input: NodeJS.ReadableStream = process.stdin,\n output: NodeJS.WritableStream = process.stderr\n): Promise<boolean> {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input, output });\n try {\n const answer = await rl.question(question);\n return /^y(es)?$/i.test(answer.trim());\n } finally {\n rl.close();\n }\n}\n\nexport async function runInit(dir: string | undefined, yes = false): Promise<void> {\n let target = dir;\n if (!target) {\n if (yes) {\n target = '.';\n } else if (process.stdin.isTTY) {\n const ok = await promptYesNo(`initialize a vault in ${resolve('.')}? [y/N] `);\n if (!ok) {\n console.error('init: aborted');\n process.exit(1);\n }\n target = '.';\n } else {\n console.error('usage: kmd init <dir> (or --yes to scaffold the current directory)');\n process.exit(2);\n }\n }\n let root: string;\n try {\n root = await scaffoldVault(target);\n } catch (err) {\n console.error(`init: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n const templateCount = Object.keys(VAULT_TEMPLATES).length;\n console.log(`initialized empty vault at ${root}\n\n vault.yaml starter vocabulary \u2014 add your first scope under scopes:\n vault.schema.json IDE validation via the yaml-language-server modeline\n templates/ ${templateCount} built-in templates (served at wiki://template/...)\n projects/ research/ notes/\n\nnext steps:\n export WIKI_VAULT=${root}\n kmd mcp ${root} # stdio MCP server (prime, search)`);\n}\n", "import { createHash } from 'node:crypto';\nimport { mkdirSync } from 'node:fs';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { canonicalVaultRoot, openDatabase, resolveIndexPath, setMeta } from '@llm-wiki/db/database';\nimport { loadVaultConfig } from '@llm-wiki/db/vault-config';\nimport { z } from 'zod';\nimport { type ParsedFrontmatter, parseFrontmatter } from './frontmatter.js';\nimport { refreshSchemaFile } from './init.js';\n\nconst EnvSchema = z.object({\n WIKI_VAULT: z.string().min(1)\n});\n\n// Scan only the three content domains. raw/, templates/, .obsidian/, .git/\n// are intentionally excluded by the design.\nexport const SCAN_DOMAINS = ['projects', 'research', 'notes'] as const;\n\n// [[target]], [[target|display]], [[target#heading]], [[target^block]]\nconst WIKILINK_RE = /\\[\\[([^\\]|#^]+)(?:[#^][^\\]|]*)?(?:\\|([^\\]]+))?\\]\\]/g;\n\ninterface Frontmatter {\n title?: string;\n kind?: string;\n status?: string;\n summary?: string;\n tags?: string[];\n updated?: string | Date;\n}\n\n// Frontmatter keys that already map to first-class indexed columns. Anything\n// outside this set flows into the `meta` JSONB column verbatim, so future\n// vocabulary extensions (e.g. story.triage_state, story.category) become\n// queryable without further schema changes.\nconst INDEXED_FRONTMATTER_KEYS = new Set<string>([\n 'title',\n 'kind',\n 'status',\n 'summary',\n 'tags',\n 'updated',\n 'scope',\n 'topic'\n]);\n\ninterface WikiLink {\n target: string;\n text: string | null;\n}\n\ninterface PageFields {\n path: string;\n title: string;\n kind: string;\n scope: string | null;\n topic: string | null;\n status: string;\n summary: string | null;\n tags: string[] | null;\n updated: string | null;\n body: string;\n hash: string;\n meta: Record<string, unknown> | null;\n}\n\ntype SyncResult = 'changed' | 'unchanged' | 'skipped';\n\nfunction loadEnv(): { WIKI_VAULT: string } {\n const parsed = EnvSchema.safeParse({\n WIKI_VAULT: process.env.WIKI_VAULT\n });\n if (!parsed.success) {\n console.error('invalid env:');\n console.error(parsed.error.format());\n process.exit(1);\n }\n return parsed.data;\n}\n\nexport async function walkMarkdown(root: string, domain: string): Promise<string[]> {\n const out: string[] = [];\n async function recurse(dir: string): Promise<void> {\n // null when the domain dir doesn't exist yet \u2014 fine, nothing to walk.\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => null);\n if (!entries) return;\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n if (entry.isDirectory()) {\n await recurse(join(dir, entry.name));\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n out.push(join(dir, entry.name));\n }\n }\n }\n await recurse(join(root, domain));\n return out;\n}\n\nexport function toRelativePath(root: string, absolute: string): string {\n return relative(root, absolute).split(sep).join('/');\n}\n\nfunction sha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function extractWikilinks(body: string): WikiLink[] {\n const links: WikiLink[] = [];\n const seen = new Set<string>();\n for (const match of body.matchAll(WIKILINK_RE)) {\n const rawTarget = match[1]?.trim() ?? '';\n if (!rawTarget) continue;\n // Treat any existing extension as authoritative (handles embeds of\n // `.base`, `.png`, `.pdf`, etc.); only append `.md` when the target\n // is bare.\n const hasExt = /\\.[a-zA-Z0-9]+$/.test(rawTarget);\n const target = hasExt ? rawTarget : `${rawTarget}.md`;\n const text = match[2]?.trim() ?? null;\n const key = `${target}|${text ?? ''}`;\n if (seen.has(key)) continue;\n seen.add(key);\n links.push({ target, text });\n }\n return links;\n}\n\n/**\n * Path is authoritative for scope/topic. Frontmatter may also carry these\n * (for human readability) but sync trusts the filesystem.\n *\n * projects/{scope}/... \u2192 scope = first segment\n * research/{topic}/... \u2192 topic = first segment\n * notes/... \u2192 both null\n */\nexport function deriveLocation(relPath: string): { scope: string | null; topic: string | null } {\n const segments = relPath.split('/');\n const domain = segments[0];\n if (domain === 'projects' && segments.length >= 2 && segments[1]) {\n return { scope: segments[1], topic: null };\n }\n if (domain === 'research' && segments.length >= 2 && segments[1]) {\n return { scope: null, topic: segments[1] };\n }\n return { scope: null, topic: null };\n}\n\n/**\n * Build the page row from frontmatter + path. Returns `null` to signal\n * \"skip this file\" (intentionally not indexed).\n *\n * Skip rules:\n * - No `title` in frontmatter \u2192 narrative-only page (e.g., primer.md).\n * - No `kind` AND not under notes/ \u2192 authoring incomplete; warn.\n *\n * Notes are the one place where `kind` is implied by location.\n */\nexport function buildPageFields(\n relPath: string,\n raw: string,\n parsed: ParsedFrontmatter,\n knownScopes: ReadonlySet<string>\n): PageFields | null {\n const fm = parsed.data as Frontmatter;\n if (!fm.title) {\n return null;\n }\n\n let kind = fm.kind;\n if (!kind) {\n if (relPath.startsWith('notes/')) {\n kind = 'note';\n } else {\n console.warn(` skip: ${relPath} \u2014 has title but missing kind`);\n return null;\n }\n }\n\n const { scope, topic } = deriveLocation(relPath);\n if (scope !== null && !knownScopes.has(scope)) {\n throw new Error(\n `unknown scope \"${scope}\" for ${relPath} \u2014 add it to vault.yaml or remove the page`\n );\n }\n const updated =\n fm.updated instanceof Date\n ? fm.updated.toISOString().slice(0, 10)\n : typeof fm.updated === 'string'\n ? fm.updated.slice(0, 10)\n : null;\n\n const metaEntries = Object.entries(parsed.data as Record<string, unknown>).filter(\n ([k]) => !INDEXED_FRONTMATTER_KEYS.has(k)\n );\n const meta = metaEntries.length > 0 ? Object.fromEntries(metaEntries) : null;\n\n return {\n path: relPath,\n title: fm.title,\n kind,\n scope,\n topic,\n status: fm.status ?? (kind === 'note' ? 'active' : 'draft'),\n summary: fm.summary ?? null,\n tags: Array.isArray(fm.tags) ? fm.tags : null,\n updated,\n body: parsed.content,\n hash: sha256(raw),\n meta\n };\n}\n\nexport function syncPage(db: DatabaseSync, fields: PageFields): SyncResult {\n const existing = db.prepare('SELECT content_hash FROM pages WHERE path = ?').get(fields.path) as\n | { content_hash: string | null }\n | undefined;\n if (existing?.content_hash === fields.hash) {\n return 'unchanged';\n }\n\n const upsert = db.prepare(\n `INSERT INTO pages (path, title, kind, scope, topic, status, summary, tags, updated, body, content_hash, meta)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (path) DO UPDATE SET\n title = EXCLUDED.title,\n kind = EXCLUDED.kind,\n scope = EXCLUDED.scope,\n topic = EXCLUDED.topic,\n status = EXCLUDED.status,\n summary = EXCLUDED.summary,\n tags = EXCLUDED.tags,\n updated = EXCLUDED.updated,\n body = EXCLUDED.body,\n content_hash = EXCLUDED.content_hash,\n meta = EXCLUDED.meta`\n );\n\n upsert.run(\n fields.path,\n fields.title,\n fields.kind,\n fields.scope,\n fields.topic,\n fields.status,\n fields.summary,\n fields.tags ? JSON.stringify(fields.tags) : null,\n fields.updated,\n fields.body,\n fields.hash,\n fields.meta ? JSON.stringify(fields.meta) : null\n );\n\n db.prepare('DELETE FROM links WHERE source_path = ?').run(fields.path);\n const insertLink = db.prepare(\n `INSERT INTO links (source_path, target_path, link_text)\n VALUES (?, ?, ?)\n ON CONFLICT (source_path, target_path) DO NOTHING`\n );\n for (const link of extractWikilinks(fields.body)) {\n insertLink.run(fields.path, link.target, link.text);\n }\n\n return 'changed';\n}\n\nexport interface SyncStats {\n changed: number;\n unchanged: number;\n skipped: number;\n pagesDeleted: number;\n linksDeleted: number;\n noPages: boolean;\n}\n\n/**\n * The sync pipeline without operator output \u2014 the seam the posttool hook\n * calls in-process, where stdout belongs to the harness protocol.\n */\nexport async function syncVault(vaultRoot: string): Promise<SyncStats> {\n const dbPath = resolveIndexPath(vaultRoot);\n const vaultConfig = await loadVaultConfig(vaultRoot);\n const scopes = new Set(Object.keys(vaultConfig.scopes));\n\n mkdirSync(dirname(dbPath), { recursive: true });\n const db = openDatabase(dbPath);\n\n try {\n const files: string[] = [];\n for (const domain of SCAN_DOMAINS) {\n files.push(...(await walkMarkdown(vaultRoot, domain)));\n }\n\n const indexedPaths: string[] = [];\n let changed = 0;\n let unchanged = 0;\n let skipped = 0;\n\n for (const file of files) {\n const path = toRelativePath(vaultRoot, file);\n const raw = await readFile(file, 'utf8');\n const parsed = parseFrontmatter(raw);\n const fields = buildPageFields(path, raw, parsed, scopes);\n if (!fields) {\n skipped++;\n continue;\n }\n\n const result = syncPage(db, fields);\n if (result === 'changed') {\n changed++;\n } else {\n unchanged++;\n }\n indexedPaths.push(path);\n }\n\n let pagesDeleted = 0;\n let linksDeleted = 0;\n if (indexedPaths.length > 0) {\n const placeholders = indexedPaths.map(() => '?').join(', ');\n const pageResult = db\n .prepare(`DELETE FROM pages WHERE path NOT IN (${placeholders})`)\n .run(...indexedPaths);\n pagesDeleted = Number(pageResult.changes);\n const linkResult = db\n .prepare('DELETE FROM links WHERE source_path NOT IN (SELECT path FROM pages)')\n .run();\n linksDeleted = Number(linkResult.changes);\n }\n\n db.exec(\"INSERT INTO pages_fts(pages_fts) VALUES('rebuild')\");\n\n setMeta(db, 'vault_root', canonicalVaultRoot(vaultRoot));\n setMeta(db, 'last_synced', new Date().toISOString());\n\n // Derived artifact like the index: refreshed so engine upgrades surface\n // as a git diff, not silent IDE/runtime disagreement. stderr keeps every\n // hook codec's stdout clean.\n if (await refreshSchemaFile(vaultRoot)) {\n console.error('sync: vault.schema.json refreshed to the running engine');\n }\n\n return {\n changed,\n unchanged,\n skipped,\n pagesDeleted,\n linksDeleted,\n noPages: indexedPaths.length === 0\n };\n } finally {\n db.close();\n }\n}\n\nexport async function runSync(): Promise<void> {\n const env = loadEnv();\n console.log(`sync: ${env.WIKI_VAULT} \u2192 ${resolveIndexPath(env.WIKI_VAULT)}`);\n const stats = await syncVault(env.WIKI_VAULT);\n if (stats.noPages) {\n console.warn('no indexable pages found; skipping orphan deletion (safety)');\n }\n console.log(\n `done: ${stats.changed} changed, ${stats.unchanged} unchanged, ${stats.skipped} skipped, ${stats.pagesDeleted} pages deleted, ${stats.linksDeleted} link orphans cleared`\n );\n}\n", "import { readFile, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport {\n BUILT_IN_KINDS,\n kindName,\n loadVaultConfig,\n type VaultConfig\n} from '@llm-wiki/db/vault-config';\nimport { parseFrontmatter } from './frontmatter.js';\nimport {\n deriveLocation,\n extractWikilinks,\n SCAN_DOMAINS,\n toRelativePath,\n walkMarkdown\n} from './sync.js';\n\nexport type Severity = 'error' | 'warning';\n\nexport interface Finding {\n path: string;\n rule: string;\n severity: Severity;\n message: string;\n}\n\n/** Mirrors sync's indexability marker: `buildPageFields` skips any page whose\n * `title` is not a non-empty string. */\nfunction hasIndexableTitle(data: Record<string, unknown>): boolean {\n return typeof data.title === 'string' && data.title.trim() !== '';\n}\n\n/**\n * A page sync would index: it has a `title` and either a `kind` or lives under\n * notes/ (notes imply kind=note). Title-less narrative/reserved pages (primers,\n * the title-less ontology/alayacare pages) are skipped by sync, so the\n * sync-mirror checks are gated on this \u2014 validate governs what sync governs.\n * The kind-floor contract checks gate on kind intent instead: a missing or\n * empty title is itself a floor violation, and must not gate itself out.\n */\nfunction isIndexed(relPath: string, data: Record<string, unknown>): boolean {\n if (!hasIndexableTitle(data)) return false;\n if (typeof data.kind === 'string' && data.kind !== '') return true;\n return relPath.startsWith('notes/');\n}\n\n/**\n * A reserved `primer.md` (at any level). Title-less, so it is skipped by the\n * indexed-page checks \u2014 but it is the agent's first-read surface, so a stale\n * `[[link]]` there must not silently pass the gate. Its body links are checked.\n */\nfunction isPrimer(relPath: string): boolean {\n return relPath === 'primer.md' || relPath.endsWith('/primer.md');\n}\n\n// Required-field floor per kind \u2014 the set of keys present on 100% of existing\n// pages of that kind (corpus-scanned; spec-wiki-validate \u00A7 Required fields per\n// kind). Key-presence, not non-emptiness. Kinds absent here (artifact, prompt,\n// glossary-entry, pso-roster) carry no required-field contract. `tags` is\n// governed separately by the `tags-required` rule (non-empty), not this floor.\nconst REQUIRED_FIELDS: Record<string, readonly string[]> = {\n project: [\n 'title',\n 'kind',\n 'scope',\n 'status',\n 'summary',\n 'updated',\n 'methodology',\n 'phase',\n 'repo'\n ],\n spec: ['title', 'kind', 'scope', 'status', 'summary', 'updated', 'sources'],\n adr: ['title', 'kind', 'scope', 'status', 'updated'],\n plan: ['title', 'kind', 'scope', 'status', 'summary', 'updated'],\n ops: ['title', 'kind', 'scope', 'status', 'summary', 'updated'],\n story: [\n 'title',\n 'kind',\n 'scope',\n 'status',\n 'updated',\n 'parent',\n 'triage_state',\n 'category',\n 'blocked_by',\n 'sources'\n ],\n topic: ['title', 'kind', 'status', 'summary', 'updated', 'confidence'],\n article: ['title', 'kind', 'status', 'updated'],\n src: ['title', 'kind', 'topic', 'status', 'summary', 'updated'],\n note: ['title', 'updated']\n};\n\n// Kinds exempt from the tags-required floor: deliverable/package internals\n// (artifact, prompt) and registry stubs (glossary-entry, pso-roster), not\n// discoverable content pages. Mirrors the required-fields floor exemption.\nconst TAG_OPTIONAL_KINDS = new Set(['artifact', 'prompt', 'glossary-entry', 'pso-roster']);\n\n// Per-kind path patterns (spec-wiki-validate \u00A7 Folder and slug patterns). Kinds\n// absent here have no documented pattern and are exempt (article free naming,\n// notes, and the registered-but-undocumented ontology/alayacare kinds).\nconst FOLDER_PATTERNS: Record<string, RegExp> = {\n spec: /^projects\\/[^/]+\\/spec\\/spec-[^/]+\\.md$/,\n adr: /^projects\\/[^/]+\\/adr\\/adr-[^/]+\\.md$/,\n ops: /^projects\\/[^/]+\\/ops\\/ops-[^/]+\\.md$/,\n plan: /^projects\\/[^/]+\\/plan\\/plan-[^/]+\\.md$/,\n story: /^projects\\/[^/]+\\/plan\\/[^/]+\\/story-[^/]+\\.md$/,\n project: /^projects\\/[^/]+\\/index\\.md$/,\n topic: /^research\\/[^/]+\\/index\\.md$/,\n src: /^research\\/[^/]+\\/src-[^/]+\\.md$/\n};\n\nfunction checkRequiredFields(relPath: string, data: Record<string, unknown>): Finding[] {\n // Notes carry no `kind` key \u2014 sync infers `note` from location; mirror that so\n // the note floor is reachable rather than dead.\n const kind =\n typeof data.kind === 'string' && data.kind !== ''\n ? data.kind\n : relPath.startsWith('notes/')\n ? 'note'\n : undefined;\n const required = kind ? REQUIRED_FIELDS[kind] : undefined;\n if (!required) return [];\n const findings: Finding[] = [];\n for (const field of required) {\n if (!Object.hasOwn(data, field)) {\n findings.push({\n path: relPath,\n rule: 'required-fields',\n severity: 'error',\n message: `missing required field \"${field}\" for kind \"${kind}\"`\n });\n }\n }\n // Title carve-out from key-presence: the one floor field where emptiness is\n // a violation \u2014 sync skips any page without a non-empty title, silently\n // dropping it from the index.\n if (Object.hasOwn(data, 'title') && !hasIndexableTitle(data)) {\n findings.push({\n path: relPath,\n rule: 'required-fields',\n severity: 'error',\n message: `\"title\" must be a non-empty string for kind \"${kind}\" \u2014 sync skips the page otherwise`\n });\n }\n return findings;\n}\n\n// Universal floor for custom kinds: the fields the index serves. Warnings,\n// never errors \u2014 custom kinds keep their freedom; the nudge keeps pages\n// retrievable (title/summary feed FTS, updated feeds prime ordering).\nconst UNIVERSAL_FLOOR = ['title', 'summary', 'updated'] as const;\n\n/** Names of object-form kinds outside the built-in set \u2014 the explicit opt-in\n * to custom pedagogy. Plain-string unknown kinds stay floor-free. */\nfunction customKindNames(cfg: VaultConfig): Set<string> {\n const names = new Set<string>();\n for (const entry of cfg.kinds) {\n if (typeof entry !== 'string' && !BUILT_IN_KINDS.has(entry.name)) names.add(entry.name);\n }\n return names;\n}\n\nfunction checkCustomKindFloor(\n relPath: string,\n data: Record<string, unknown>,\n cfg: VaultConfig\n): Finding[] {\n const kind = data.kind;\n if (typeof kind !== 'string' || !customKindNames(cfg).has(kind)) return [];\n const findings: Finding[] = [];\n for (const field of UNIVERSAL_FLOOR) {\n if (!Object.hasOwn(data, field)) {\n findings.push({\n path: relPath,\n rule: 'custom-kind-floor',\n severity: 'warning',\n message: `custom kind \"${kind}\": missing \"${field}\" \u2014 the universal floor (title, summary, updated) keeps the page retrievable`\n });\n }\n }\n if (Object.hasOwn(data, 'title') && !hasIndexableTitle(data)) {\n findings.push({\n path: relPath,\n rule: 'custom-kind-floor',\n severity: 'warning',\n message: `custom kind \"${kind}\": \"title\" is empty \u2014 sync skips title-less pages; this page will not be indexed`\n });\n }\n return findings;\n}\n\n/**\n * Tags are an open dimension \u2014 any value, no controlled vocabulary \u2014 but every\n * content page must carry at least one. Indexed pages whose kind is not\n * tag-optional require a non-empty `tags` list.\n */\nfunction checkTagsRequired(relPath: string, data: Record<string, unknown>): Finding[] {\n const kind =\n typeof data.kind === 'string' && data.kind !== ''\n ? data.kind\n : relPath.startsWith('notes/')\n ? 'note'\n : undefined;\n if (kind && TAG_OPTIONAL_KINDS.has(kind)) return [];\n if (Array.isArray(data.tags) && data.tags.length > 0) return [];\n return [\n {\n path: relPath,\n rule: 'tags-required',\n severity: 'error',\n message:\n 'tags must be present and non-empty (tags are open \u2014 any values, every content page tagged)'\n }\n ];\n}\n\nfunction checkFolderSlug(relPath: string, data: Record<string, unknown>): Finding[] {\n const kind = data.kind;\n const pattern = typeof kind === 'string' ? FOLDER_PATTERNS[kind] : undefined;\n if (!pattern || pattern.test(relPath)) return [];\n return [\n {\n path: relPath,\n rule: 'folder-slug',\n severity: 'error',\n message: `path does not match the \"${kind}\" slug pattern ${pattern.source}`\n }\n ];\n}\n\nfunction checkVocabulary(\n relPath: string,\n data: Record<string, unknown>,\n cfg: VaultConfig\n): Finding[] {\n const findings: Finding[] = [];\n const kind = data.kind;\n if (typeof kind === 'string' && !cfg.kinds.some((k) => kindName(k) === kind)) {\n findings.push({\n path: relPath,\n rule: 'kind-vocabulary',\n severity: 'error',\n message: `kind \"${kind}\" is not in vault.yaml`\n });\n }\n const status = data.status;\n if (typeof status === 'string' && !cfg.statuses.includes(status)) {\n findings.push({\n path: relPath,\n rule: 'status-vocabulary',\n severity: 'error',\n message: `status \"${status}\" is not in vault.yaml`\n });\n }\n const { scope } = deriveLocation(relPath);\n if (scope !== null && !Object.hasOwn(cfg.scopes, scope)) {\n findings.push({\n path: relPath,\n rule: 'scope-vocabulary',\n severity: 'error',\n message: `scope \"${scope}\" is not in vault.yaml`\n });\n }\n const methodology = data.methodology;\n if (typeof methodology === 'string' && !cfg.methodologies.includes(methodology)) {\n findings.push({\n path: relPath,\n rule: 'methodology-vocabulary',\n severity: 'error',\n message: `methodology \"${methodology}\" is not in vault.yaml`\n });\n }\n return findings;\n}\n\n/**\n * Path is authoritative for `scope`/`topic`: sync derives them from the path and\n * ignores frontmatter. A frontmatter copy is allowed for readability but must not\n * lie \u2014 a mismatch means the label disagrees with where the file actually lives.\n * Fires only where the path defines the value (projects \u2192 scope, research \u2192 topic)\n * and the frontmatter carries it.\n */\nfunction checkScopePath(relPath: string, data: Record<string, unknown>): Finding[] {\n const { scope, topic } = deriveLocation(relPath);\n const findings: Finding[] = [];\n if (\n scope !== null &&\n typeof data.scope === 'string' &&\n data.scope !== '' &&\n data.scope !== scope\n ) {\n findings.push({\n path: relPath,\n rule: 'path-authority',\n severity: 'error',\n message: `frontmatter scope \"${data.scope}\" disagrees with path scope \"${scope}\"`\n });\n }\n if (\n topic !== null &&\n typeof data.topic === 'string' &&\n data.topic !== '' &&\n data.topic !== topic\n ) {\n findings.push({\n path: relPath,\n rule: 'path-authority',\n severity: 'error',\n message: `frontmatter topic \"${data.topic}\" disagrees with path topic \"${topic}\"`\n });\n }\n return findings;\n}\n\n/** A reference's basename target, or null if absent/empty/non-string. */\nfunction refTarget(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed === '' ? null : basename(trimmed);\n}\n\n/**\n * Basename targets of a reference field that may be scalar or array. `supersedes`\n * and `superseded_by` are list-valued in the wild (one ADR can supersede several),\n * so a scalar-only read would miss them and falsely fail reciprocity.\n */\nfunction refTargets(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(refTarget).filter((t): t is string => t !== null);\n }\n const single = refTarget(value);\n return single === null ? [] : [single];\n}\n\n/**\n * Strip code regions so `[[...]]`-shaped syntax inside them is not mistaken for a\n * wikilink: fenced ``` blocks (e.g. a bash `if [[ x == y ]]` test) and inline\n * `code` spans (e.g. a `[[wikilink]]` documentation example). Sync's own link\n * extraction is unaffected \u2014 its pseudo-links are a separate, pre-existing concern.\n */\nfunction stripCode(body: string): string {\n return body.replace(/```[\\s\\S]*?```/g, '').replace(/`[^`]*`/g, '');\n}\n\n/**\n * Body `[[wikilink]]` dangling check against the basename `refIndex`. Code\n * regions are stripped first (see `stripCode`) so `[[...]]`-shaped syntax inside\n * fences/inline-code is not mistaken for a link. Shared by the indexed-page\n * reference checks and the title-less primer carve-in.\n */\nfunction checkBodyLinks(relPath: string, body: string, refIndex: ReadonlySet<string>): Finding[] {\n const findings: Finding[] = [];\n for (const link of extractWikilinks(stripCode(body))) {\n if (!link.target.endsWith('.md')) continue;\n if (!refIndex.has(basename(link.target))) {\n findings.push({\n path: relPath,\n rule: 'dangling-link',\n severity: 'error',\n message: `wikilink target \"${link.target}\" does not resolve`\n });\n }\n }\n return findings;\n}\n\n/**\n * Reference resolution against the basename index: body `[[wikilinks]]` to `.md`\n * targets, plus the frontmatter reference fields. Empty values never fire (the\n * empty `supersedes:`/`superseded_by:` template keys are the 52/57). Non-`.md`\n * wikilink targets (images, `.base`, external) are not policed.\n */\nfunction checkReferences(\n relPath: string,\n data: Record<string, unknown>,\n body: string,\n refIndex: ReadonlySet<string>\n): Finding[] {\n const findings: Finding[] = checkBodyLinks(relPath, body, refIndex);\n const fieldRefs: string[] = [];\n const parent = refTarget(data.parent);\n if (parent !== null) fieldRefs.push(parent);\n for (const field of ['supersedes', 'superseded_by', 'blocked_by'] as const) {\n fieldRefs.push(...refTargets(data[field]));\n }\n for (const target of fieldRefs) {\n if (!refIndex.has(target)) {\n findings.push({\n path: relPath,\n rule: 'ref-resolves',\n severity: 'error',\n message: `frontmatter reference \"${target}\" does not resolve`\n });\n }\n }\n return findings;\n}\n\n/**\n * Tag policy: only the alias case is enforced, as a non-fatal warning. A full\n * canonical-membership check is deferred \u2014 the corpus carries ~211 distinct tags\n * against an 11-entry canonical list, so flagging non-canonical tags would fire\n * on nearly every page (spec-wiki-validate \u00A7 Tag policy).\n */\nfunction checkTags(relPath: string, data: Record<string, unknown>, cfg: VaultConfig): Finding[] {\n if (!Array.isArray(data.tags)) return [];\n const findings: Finding[] = [];\n for (const tag of data.tags) {\n if (typeof tag === 'string' && Object.hasOwn(cfg.tags.aliases, tag)) {\n findings.push({\n path: relPath,\n rule: 'tag-alias',\n severity: 'warning',\n message: `tag \"${tag}\" is an alias; use canonical \"${cfg.tags.aliases[tag]}\"`\n });\n }\n }\n return findings;\n}\n\n/** `status: superseded` requires a non-empty `superseded_by` (README \u00A76). */\nfunction checkSupersededLink(relPath: string, data: Record<string, unknown>): Finding[] {\n if (data.status === 'superseded' && refTargets(data.superseded_by).length === 0) {\n return [\n {\n path: relPath,\n rule: 'superseded-needs-link',\n severity: 'error',\n message: 'status is \"superseded\" but superseded_by is empty'\n }\n ];\n }\n return [];\n}\n\n/** Sync-mirror checks on already-parsed frontmatter \u2014 gated on indexability,\n * governing exactly what sync indexes. Pure. */\nfunction checkIndexedPage(\n relPath: string,\n data: Record<string, unknown>,\n body: string,\n cfg: VaultConfig,\n refIndex: ReadonlySet<string>\n): Finding[] {\n if (!isIndexed(relPath, data)) return [];\n return [\n ...checkTagsRequired(relPath, data),\n ...checkFolderSlug(relPath, data),\n ...checkVocabulary(relPath, data, cfg),\n ...checkScopePath(relPath, data),\n ...checkReferences(relPath, data, body, refIndex),\n ...checkSupersededLink(relPath, data),\n ...checkTags(relPath, data, cfg)\n ];\n}\n\n/**\n * Deterministic checks on a single page's raw content. Pure \u2014 no IO. Parses the\n * frontmatter first: a parse failure is the live bug that silently halts sync\n * mid-walk, reported regardless of the page's other fields. Well-formed pages\n * are then subjected to the indexed-page checks (vocabulary, \u2026) against the\n * controlled vocabulary `cfg` and the basename `refIndex` of valid link targets.\n */\nexport function validatePage(\n relPath: string,\n raw: string,\n cfg: VaultConfig,\n refIndex: ReadonlySet<string>\n): Finding[] {\n let parsed: ReturnType<typeof parseFrontmatter>;\n try {\n parsed = parseFrontmatter(raw);\n } catch (err) {\n return [\n {\n path: relPath,\n rule: 'frontmatter-parse',\n severity: 'error',\n message: err instanceof Error ? err.message : String(err)\n }\n ];\n }\n if (isPrimer(relPath)) {\n return checkBodyLinks(relPath, parsed.content, refIndex);\n }\n // Two-stage pipeline. Contract checks (the kind floors) gate on kind intent:\n // a floor violation must surface even when the violation is the very field\n // (title) that decides indexability \u2014 otherwise the page silently drops from\n // the index with zero findings. Sync-mirror checks gate on isIndexed.\n return [\n ...checkRequiredFields(relPath, parsed.data),\n ...checkCustomKindFloor(relPath, parsed.data, cfg),\n ...checkIndexedPage(relPath, parsed.data, parsed.content, cfg, refIndex)\n ];\n}\n\n/** Exit-code decision: any error-severity finding fails the run. */\nexport function hasErrors(findings: Finding[]): boolean {\n return findings.some((f) => f.severity === 'error');\n}\n\n/** Basename (no extension) of a vault-relative path. */\nfunction basename(relPath: string): string {\n const last = relPath.split('/').pop() ?? relPath;\n return last.replace(/\\.md$/, '');\n}\n\nexport interface PageData {\n path: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Cross-page ADR supersession reciprocity: a non-empty `superseded_by: B` on\n * ADR A requires `supersedes: A` on B, and vice-versa. Fires only on non-empty\n * values; a value pointing at a non-existent ADR is a `ref-resolves` error\n * (checked per-page), not a reciprocity error, so unresolved targets are skipped\n * here. (spec-wiki-validate \u00A7 Supersession.)\n */\nexport function validateSupersession(pages: PageData[]): Finding[] {\n const adrs = new Map<string, { path: string; supersedes: string[]; supersededBy: string[] }>();\n for (const { path, data } of pages) {\n if (data.kind !== 'adr') continue;\n adrs.set(basename(path), {\n path,\n supersedes: refTargets(data.supersedes),\n supersededBy: refTargets(data.superseded_by)\n });\n }\n const findings: Finding[] = [];\n for (const [name, adr] of adrs) {\n for (const target of adr.supersededBy) {\n const other = adrs.get(target);\n if (other && !other.supersedes.includes(name)) {\n findings.push({\n path: adr.path,\n rule: 'supersession-reciprocal',\n severity: 'error',\n message: `superseded_by \"${target}\" which does not declare supersedes \"${name}\"`\n });\n }\n }\n for (const target of adr.supersedes) {\n const other = adrs.get(target);\n if (other && !other.supersededBy.includes(name)) {\n findings.push({\n path: adr.path,\n rule: 'supersession-reciprocal',\n severity: 'error',\n message: `supersedes \"${target}\" which does not declare superseded_by \"${name}\"`\n });\n }\n }\n }\n return findings;\n}\n\n/** Top-level scope/topic key of a path (`projects/{scope}` or `research/{topic}`), or\n * null for notes/root pages. Two pages \"share a scope\" iff their keys are equal. */\nfunction locationKey(relPath: string): string | null {\n const seg = relPath.split('/');\n if ((seg[0] === 'projects' || seg[0] === 'research') && seg[1]) {\n return `${seg[0]}/${seg[1]}`;\n }\n return null;\n}\n\nexport interface LinkPage {\n path: string;\n body: string;\n}\n\n/**\n * Cross-page ambiguity warning. A **bare** `[[wikilink]]` whose basename is owned by\n * more than one file is ambiguous only when none of those owners shares the linking\n * page's scope: a same-scope copy resolves it locally (the per-scope `spec-context`/\n * `primer`/`index` pattern), and a path-qualified link (`[[a/b/c]]`) is already\n * disambiguated. Warning, not error \u2014 the link resolves, just not uniquely.\n */\nexport function validateAmbiguousLinks(\n pages: LinkPage[],\n basenameToPaths: ReadonlyMap<string, string[]>\n): Finding[] {\n const findings: Finding[] = [];\n for (const { path, body } of pages) {\n const here = locationKey(path);\n for (const link of extractWikilinks(stripCode(body))) {\n if (!link.target.endsWith('.md') || link.target.includes('/')) continue;\n const base = basename(link.target);\n const owners = basenameToPaths.get(base);\n if (!owners || owners.length < 2) continue;\n if (here !== null && owners.some((p) => locationKey(p) === here)) continue;\n findings.push({\n path,\n rule: 'ambiguous-link',\n severity: 'warning',\n message: `bare link \"[[${base}]]\" is ambiguous \u2014 basename owned by ${owners.length} files, none in this scope`\n });\n }\n }\n return findings;\n}\n\n/**\n * Walk the vault's content domains (reusing the sync walker), build the basename\n * index of valid reference targets (all on-disk pages, including title-less ones),\n * then aggregate findings across all pages. No database \u2014 validation is a\n * pre-sync, read-only pass over the filesystem.\n */\nexport async function validateVault(root: string): Promise<Finding[]> {\n const cfg = await loadVaultConfig(root);\n\n // Reference target universe = every on-disk page, including title-less ones and\n // pages outside the scanned domains (raw/, templates/) that are legitimate link\n // targets. Walking from '.' covers the whole vault; dotdirs (.git, .obsidian)\n // are skipped by the walker.\n const all = (await walkMarkdown(root, '.')).map((abs) => ({\n relPath: toRelativePath(root, abs),\n abs\n }));\n // basename \u2192 [paths] (the spec's reference-resolution model). `refIndex` (dangling\n // checks: does the basename exist) is its key set; the multimap also backs the\n // cross-page ambiguity warning (does a basename have more than one owner).\n const basenameToPaths = new Map<string, string[]>();\n for (const f of all) {\n const b = basename(f.relPath);\n const owners = basenameToPaths.get(b);\n if (owners) owners.push(f.relPath);\n else basenameToPaths.set(b, [f.relPath]);\n }\n const refIndex = new Set<string>(basenameToPaths.keys());\n\n // Applicability = only the indexed content domains.\n const files = all.filter((f) => SCAN_DOMAINS.some((d) => f.relPath.startsWith(`${d}/`)));\n\n const findings: Finding[] = [];\n const pages: PageData[] = [];\n const linkPages: LinkPage[] = [];\n for (const { relPath, abs } of files) {\n const raw = await readFile(abs, 'utf8');\n findings.push(...validatePage(relPath, raw, cfg, refIndex));\n try {\n const parsed = parseFrontmatter(raw);\n pages.push({ path: relPath, data: parsed.data });\n linkPages.push({ path: relPath, body: parsed.content });\n } catch {\n // Parse failure already reported by validatePage; skip in the graph pass.\n }\n }\n findings.push(...validateSupersession(pages));\n findings.push(...validateAmbiguousLinks(linkPages, basenameToPaths));\n\n // A declared custom kind without its template file leaves the served\n // \"use the matching template\" rule unsatisfiable \u2014 warn, don't block.\n for (const name of customKindNames(cfg)) {\n const file = `templates/${name}.md`;\n try {\n await stat(join(root, file));\n } catch {\n findings.push({\n path: file,\n rule: 'custom-kind-template',\n severity: 'warning',\n message: `custom kind \"${name}\" declared in vault.yaml has no template file`\n });\n }\n }\n return findings;\n}\n", "import { existsSync, readdirSync, rmSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport {\n canonicalVaultRoot,\n getMeta,\n indexRootDir,\n openDatabase,\n resolveIndexPath\n} from '@llm-wiki/db/database';\nimport { runSync } from './sync.js';\nimport { type Finding, hasErrors, validateVault } from './validate.js';\n\nexport type Command = 'sync' | 'validate';\n\nexport type CliResolution = { kind: 'run'; command: Command } | { kind: 'error'; message: string };\n\n/**\n * Resolve a `wiki <command>` invocation to the command to run, or a usage\n * error. Pure \u2014 no side effects \u2014 so the routing is testable without executing\n * the (index-touching) command. `argv` is `process.argv.slice(2)`.\n */\nexport function resolveCli(argv: string[]): CliResolution {\n const { positionals } = parseArgs({ args: argv, allowPositionals: true, strict: false });\n const command = positionals[0];\n if (command === 'sync') {\n return { kind: 'run', command: 'sync' };\n }\n if (command === 'validate') {\n return { kind: 'run', command: 'validate' };\n }\n if (command === undefined) {\n return { kind: 'error', message: 'usage: wiki <sync|validate>' };\n }\n return { kind: 'error', message: `unknown command: ${command}` };\n}\n\nexport function vaultRoot(): string {\n const root = process.env.WIKI_VAULT;\n if (!root) {\n console.error('WIKI_VAULT is not set');\n process.exit(1);\n }\n return root;\n}\n\nfunction reportFindings(findings: Finding[]): void {\n for (const f of findings) {\n console.error(`${f.severity}: ${f.path} [${f.rule}] ${f.message}`);\n }\n}\n\nexport { runInit } from './init.js';\n\nexport async function runValidate(): Promise<void> {\n const findings = await validateVault(vaultRoot());\n reportFindings(findings);\n console.log(`validate: ${findings.length} finding(s)`);\n process.exit(hasErrors(findings) ? 1 : 0);\n}\n\nexport async function runSyncCommand(): Promise<void> {\n const findings = await validateVault(vaultRoot());\n reportFindings(findings);\n if (hasErrors(findings)) {\n const errors = findings.filter((f) => f.severity === 'error').length;\n console.error(`sync aborted: ${errors} validation error(s); no database writes`);\n process.exit(1);\n }\n await runSync();\n}\n\ninterface VaultDescription {\n vault: string;\n index: string;\n synced: string;\n}\n\n// Read-only: never creates the index file or its directory \u2014 `config` must\n// not leave state behind for vaults that were merely asked about.\nfunction describeVault(root: string): VaultDescription {\n const vault = canonicalVaultRoot(root);\n const index = resolveIndexPath(vault);\n let synced = 'never';\n if (existsSync(index)) {\n const db = openDatabase(index);\n try {\n synced = getMeta(db, 'last_synced') ?? 'never';\n } finally {\n db.close();\n }\n }\n return { vault, index, synced };\n}\n\nfunction printVault(d: VaultDescription): void {\n console.log(`vault: ${d.vault}`);\n console.log(`index: ${d.index}`);\n console.log(`synced: ${d.synced}`);\n}\n\n/** Every per-vault index under `~/.kmd/db/` that records its vault root. */\nfunction knownVaults(): VaultDescription[] {\n const root = indexRootDir();\n if (!existsSync(root)) return [];\n const known: VaultDescription[] = [];\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const index = join(root, entry.name, 'index.db');\n if (!existsSync(index)) continue;\n const db = openDatabase(index);\n try {\n const vault = getMeta(db, 'vault_root');\n if (vault === null) continue;\n known.push({ vault, index, synced: getMeta(db, 'last_synced') ?? 'never' });\n } finally {\n db.close();\n }\n }\n return known;\n}\n\nexport async function runConfig(): Promise<void> {\n const root = process.env.WIKI_VAULT;\n if (root) {\n printVault(describeVault(root));\n return;\n }\n const known = knownVaults();\n if (known.length === 0) {\n console.error(\n 'no vault specified and none known \u2014 pass a vault root, set WIKI_VAULT, or run `kmd sync <vault-root>` once'\n );\n process.exit(1);\n }\n known.forEach((d, i) => {\n if (i > 0) console.log('');\n printVault(d);\n });\n}\n\nexport async function runDbReset(): Promise<void> {\n const root = process.env.WIKI_VAULT;\n if (!root) {\n console.error('usage: kmd db reset [<vault-root>] (or set WIKI_VAULT)');\n process.exit(2);\n }\n const dir = dirname(resolveIndexPath(root));\n if (!existsSync(dir)) {\n console.log(`${dir} does not exist \u2014 nothing to reset`);\n return;\n }\n rmSync(dir, { recursive: true, force: true });\n console.log(`deleted ${dir}`);\n}\n\nexport async function main(): Promise<void> {\n const resolution = resolveCli(process.argv.slice(2));\n if (resolution.kind === 'error') {\n console.error(resolution.message);\n process.exit(1);\n }\n if (resolution.command === 'sync') {\n await runSyncCommand();\n } else {\n await runValidate();\n }\n}\n", "import { z } from 'zod';\n\nconst EnvSchema = z.object({\n WIKI_VAULT: z.string().min(1).describe('Absolute path to the Obsidian vault root'),\n LOG_LEVEL: z\n .enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'])\n .default('info')\n .describe('Pino log level. Logs go to stderr to keep the stdio JSON-RPC stream clean.'),\n SERVER_NAME: z.string().default('wiki-mcp'),\n SERVER_VERSION: z.string().default('0.0.0')\n});\n\nexport interface Config {\n readonly wikiVault: string;\n readonly logLevel: z.infer<typeof EnvSchema>['LOG_LEVEL'];\n readonly serverName: string;\n readonly serverVersion: string;\n}\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): Config {\n const parsed = EnvSchema.safeParse(env);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.') || '(root)'}: ${i.message}`)\n .join('\\n');\n throw new Error(`Invalid environment configuration:\\n${issues}`);\n }\n return {\n wikiVault: parsed.data.WIKI_VAULT,\n logLevel: parsed.data.LOG_LEVEL,\n serverName: parsed.data.SERVER_NAME,\n serverVersion: parsed.data.SERVER_VERSION\n };\n}\n", "import { mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { canonicalVaultRoot, openDatabase, resolveIndexPath, setMeta } from '@llm-wiki/db/database';\n\n/**\n * Open the per-vault index for this server's vault root, recording the root\n * in the index meta so `kmd config` can discover it from any shell \u2014 even for\n * a vault that has never been synced.\n */\nexport function createDatabase(vaultRoot: string): DatabaseSync {\n const dbPath = resolveIndexPath(vaultRoot);\n mkdirSync(dirname(dbPath), { recursive: true });\n const db = openDatabase(dbPath);\n setMeta(db, 'vault_root', canonicalVaultRoot(vaultRoot));\n return db;\n}\n", "import { appendFileSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nconst DIAG_DIR = join(homedir(), '.local', 'state', 'wiki-mcp');\nexport const DIAG_LOG_PATH = join(DIAG_DIR, 'server.log');\n\ntry {\n mkdirSync(DIAG_DIR, { recursive: true });\n} catch {\n // best-effort; do not block startup on log dir creation\n}\n\n/**\n * Synchronous file logger that survives even when pino, the MCP SDK, or any\n * import down the chain fails to load. Writes to ~/.local/state/wiki-mcp/server.log\n * regardless of stdio/stderr capture by the parent process. Use to trace\n * spawn-time failures that never reach pino.\n */\nexport function diag(msg: string, data?: Record<string, unknown>): void {\n try {\n const line = data\n ? `${new Date().toISOString()} pid=${process.pid} ${msg} ${JSON.stringify(data)}\\n`\n : `${new Date().toISOString()} pid=${process.pid} ${msg}\\n`;\n appendFileSync(DIAG_LOG_PATH, line);\n } catch {\n // best-effort; never crash the server on log write failure\n }\n}\n", "import pino from 'pino';\nimport { DIAG_LOG_PATH } from './diag.js';\n\n/**\n * Pino logger that fans out to BOTH stderr (fd 2, captured by Claude Code)\n * AND ~/.local/state/wiki-mcp/server.log (so logs survive when stderr capture\n * doesn't make it into the JSONL connection log). The file destination shares\n * the path with diag.ts so a single `tail -f` follows the entire startup +\n * runtime stream.\n */\nexport function createLogger(level: string, name: string): pino.Logger {\n const streams: pino.StreamEntry[] = [\n { level: level as pino.Level, stream: pino.destination(2) },\n {\n level: level as pino.Level,\n stream: pino.destination({ dest: DIAG_LOG_PATH, sync: false, mkdir: true })\n }\n ];\n return pino({ name, level, base: { pid: process.pid } }, pino.multistream(streams));\n}\n\nexport type Logger = pino.Logger;\n", "import { canonicalVaultRoot } from '@llm-wiki/db/database';\nimport { type KindEntry, kindName, type VaultConfig } from '@llm-wiki/db/vault-config';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\ninterface KindPedagogy {\n readonly signal: string;\n readonly where: string;\n}\n\nconst KIND_PEDAGOGY: ReadonlyMap<string, KindPedagogy> = new Map([\n [\n 'project',\n {\n signal: 'Identity card for a project scope',\n where: '`projects/{scope}/index.md`'\n }\n ],\n [\n 'spec',\n {\n signal: 'How a system works (state of world, not decision)',\n where: '`projects/{scope}/spec/spec-{slug}.md`'\n }\n ],\n [\n 'adr',\n {\n signal: 'Decision between alternatives, commits direction',\n where: '`projects/{scope}/adr/adr-{slug}.md`'\n }\n ],\n [\n 'plan',\n {\n signal: 'Phase/initiative with milestones and stories',\n where: '`projects/{scope}/plan/plan-{slug}.md`'\n }\n ],\n [\n 'story',\n {\n signal: 'User story with Gherkin + slices (child of plan)',\n where: '`projects/{scope}/plan/{plan}/story-N-{slug}.md`'\n }\n ],\n [\n 'ops',\n {\n signal: 'Operational runbook, how to run/deploy',\n where: '`projects/{scope}/ops/ops-{slug}.md`'\n }\n ],\n [\n 'topic',\n {\n signal: 'Identity card for a research area',\n where: '`research/{topic}/index.md`'\n }\n ],\n [\n 'article',\n {\n signal: 'Original synthesis about a concept/entity',\n where: '`research/{topic}/{slug}.md`'\n }\n ],\n [\n 'src',\n {\n signal: 'Summary of external source with citation',\n where: '`research/{topic}/src-{slug}.md`'\n }\n ],\n ['note', { signal: 'Low-ceremony capture, sort later', where: '`notes/{slug}.md`' }],\n [\n 'artifact',\n {\n signal: 'Deployable configuration (scope-specific, versioned)',\n where: '`projects/{scope}/ops/{deployment}/{slug}.md`'\n }\n ],\n [\n 'prompt',\n {\n signal: 'LLM prompt template (scope-specific, versioned)',\n where: '`projects/{scope}/ops/{deployment}/prompts/{role}/{slug}.md`'\n }\n ]\n]);\n\nconst DEFAULT_AUTHORING_RULES = [\n '**Where things go**',\n '',\n \"- **Use the matching template** via `wiki://template/{domain}/{kind}` (MCP) or from `templates/` (filesystem). Don't hand-roll frontmatter.\",\n '- **Folder name = slug prefix in `projects/`.** `spec/spec-x.md`, `adr/adr-y.md`, `plan/plan-z.md`, `ops/ops-w.md`. Stories use `story-` prefix under `plan/{plan-name}/`.',\n '- **Research is flat.** Articles are `{subject}.md`; sources are `src-{slug}.md`. The topic folder names a *frame*, the article slug names a *subject*. Avoid generic slugs (`architecture.md`, `notes.md`) and slugs that collide with project scopes.',\n '- **Extend before you split.** Prefer sharpening the existing spec, ADR, or article over creating a near-duplicate page. A new page needs a new subject, not a new session.',\n '',\n '**Frontmatter**',\n '',\n '- **`summary` is the retrieval contract.** One sentence stating the page\\'s decision or claim, not its topic. Search and `prime` rank by it \u2014 \"Chose X over Y because Z\" surfaces; \"About the sync pipeline\" sinks.',\n '- **Quote prose-bearing scalars.** `summary: \"...\"` \u2014 unquoted `Word: phrase` patterns break the YAML parser.',\n '- **On any edit, update `updated`.** Never change `created` \u2014 it is write-once.',\n '- **Notes have no `kind` field** \u2014 implied by location. Sync sets `kind: note`.',\n '- **Reuse existing tags** (visible in `prime` response `top_tags`). No synonyms.',\n '',\n '**Content**',\n '',\n '- **ADR and ops pages are predicate-only.** No definitional preambles for established vocabulary, no narrative, no marketing. The audience is the project team \u2014 assume fluency.',\n \"- **Spec / ADR edits land inline with the change that surfaces them.** Don't queue corrections in plans \u2014 the spec reflects current code at every commit.\",\n '',\n '**Linking**',\n '',\n \"- **Cross-reference with `[[wikilinks]]`, and link every mention of another vault page** \u2014 backlinks are the navigation graph for humans and agents alike. Don't link pages that don't exist yet: dangling links fail validation.\",\n '- **ADR supersession is bidirectional**: `superseded_by` on the old ADR + `supersedes` on the new one.',\n \"- **Sources convention**: external paths/URLs go inline in body text. Vault-internal `raw/` paths go in frontmatter `sources:` array. Don't mix the two surfaces.\"\n].join('\\n');\n\nfunction buildAuthoringRules(config: VaultConfig): string {\n const parts = [(config.authoring_rules ?? DEFAULT_AUTHORING_RULES).trim()];\n if (config.authoring_rules_extra) parts.push(config.authoring_rules_extra.trim());\n return ['## Authoring rules', '', parts.join('\\n\\n')].join('\\n');\n}\n\nconst DEFAULT_SYNC_PROTOCOL = [\n 'Edit the smallest set of files that reflects the change. ' +\n \"A milestone tick is plan-only; don't cascade to index.md unless phase or status changed. \" +\n 'Controlled-vocabulary edits (`vault.yaml`) need explicit user approval.',\n 'After editing wiki pages, run `kmd validate` and fix findings before `kmd sync` \u2014 ' +\n 'it checks frontmatter shape, vocabulary membership, and link integrity.'\n].join('\\n');\n\nfunction buildSyncProtocol(config: VaultConfig): string {\n const parts = [(config.sync_protocol ?? DEFAULT_SYNC_PROTOCOL).trim()];\n if (config.sync_protocol_extra) parts.push(config.sync_protocol_extra.trim());\n return ['## Resync protocol', '', parts.join('\\n\\n')].join('\\n');\n}\n\nfunction buildKindSelector(kinds: ReadonlyArray<KindEntry>): string {\n const lines: string[] = ['## Kind selector', '', '| Signal | Kind | Where |', '|---|---|---|'];\n for (const entry of kinds) {\n const name = kindName(entry);\n const pedagogy = typeof entry === 'string' ? KIND_PEDAGOGY.get(entry) : entry;\n const signal = pedagogy?.signal ?? '\u2014';\n const where = pedagogy?.where ?? '\u2014';\n lines.push(`| ${signal} | **${name}** | ${where} |`);\n }\n const names = kinds.map(kindName);\n const hasNote = names.includes('note');\n const hasAdrAndSpec = names.includes('adr') && names.includes('spec');\n if (hasNote || hasAdrAndSpec) {\n const hints: string[] = [];\n if (hasNote) hints.push('If none fits \u2192 note.');\n if (hasAdrAndSpec) {\n hints.push(\n 'If torn between adr and spec \u2192 does it record a choice? adr. Does it describe how things work? spec.'\n );\n }\n lines.push('', hints.join(' '));\n }\n return lines.join('\\n');\n}\n\n// The arrow-and-annotation rendering asserts the default lifecycle; a custom\n// status list gets a plain enumeration rather than an invented ordering.\nconst CANONICAL_STATUS_FLOW = ['draft', 'active', 'superseded', 'archived'] as const;\n\nfunction buildStatusLine(statuses: ReadonlyArray<string>): string {\n const isCanonical =\n statuses.length === CANONICAL_STATUS_FLOW.length &&\n statuses.every((s, i) => s === CANONICAL_STATUS_FLOW[i]);\n return isCanonical\n ? `**Statuses:** ${statuses.join(' \u2192 ')} (one-directional; superseded requires superseded_by link)`\n : `**Statuses:** ${statuses.join(', ')}`;\n}\n\nfunction buildVocabulary(config: VaultConfig): string {\n const lines: string[] = [\n '## Controlled vocabulary',\n '',\n `**Kinds:** ${config.kinds.map(kindName).join(', ')}`,\n buildStatusLine(config.statuses),\n `**Methodologies:** ${config.methodologies.join(', ')}`,\n `**Canonical tags:** ${config.tags.canonical.join(', ')}`\n ];\n const aliases = Object.entries(config.tags.aliases);\n if (aliases.length > 0) {\n lines.push(`**Tag aliases:** ${aliases.map(([a, c]) => `${a} \u2192 ${c}`).join(', ')}`);\n }\n return lines.join('\\n');\n}\n\nexport function registerAuthoringResource(\n mcp: McpServer,\n vaultRoot: string,\n vaultConfig: VaultConfig\n): void {\n mcp.registerResource(\n 'Authoring guide',\n 'wiki://authoring',\n {\n description:\n 'Wiki authoring pedagogy: kind selector, controlled vocabulary, authoring rules, resync protocol, and template URIs. Read before creating or editing wiki pages.',\n mimeType: 'text/markdown'\n },\n async (uri) => {\n const sections = [\n '# Wiki authoring guide',\n '',\n `Vault root: \\`${canonicalVaultRoot(vaultRoot)}\\` \u2014 every page path below is relative to it; write files and run \\`kmd validate\\` / \\`kmd sync\\` against it.`,\n '',\n buildKindSelector(vaultConfig.kinds),\n '',\n buildVocabulary(vaultConfig),\n '',\n '## Templates',\n '',\n 'Full index with URIs and descriptions: `wiki://templates`',\n '',\n buildAuthoringRules(vaultConfig),\n '',\n buildSyncProtocol(vaultConfig)\n ];\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'text/markdown' as const,\n text: sections.join('\\n')\n }\n ]\n };\n }\n );\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { BUILT_IN_KINDS, type VaultConfig } from '@llm-wiki/db/vault-config';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\ninterface TemplateSpec {\n /** wiki://template/{domain}/{kind} \u2014 `note` collapses to single segment. */\n readonly uri: string;\n /** Human-readable name shown in resources/list. */\n readonly name: string;\n /** Filename in vault/templates/. */\n readonly file: string;\n /** Description shown in resources/list. */\n readonly description: string;\n}\n\n/**\n * The vault has 11 fixed templates, mirroring the v2 frontmatter schemas\n * (extended with `story` per adr-story-vocabulary-and-triage-fields).\n * URI scheme: `wiki://template/{domain}/{kind}` \u2014 the agent thinks\n * \"I'm authoring a {kind} in the {domain} domain\" and the URI matches\n * that mental model. `note` collapses to a single segment because the\n * notes domain has only one kind.\n */\nexport const TEMPLATES: ReadonlyArray<TemplateSpec> = [\n {\n uri: 'wiki://template/project/index',\n name: 'Project index',\n file: 'project-index.md',\n description:\n 'Identity card for a project. Frontmatter-heavy: methodology, phase, repo, scope, summary, tags. Short body.'\n },\n {\n uri: 'wiki://template/project/primer',\n name: 'Project primer',\n file: 'project-primer.md',\n description:\n 'Human-authored narrative context for a project. Free-form body. Inlined into the prime tool response.'\n },\n {\n uri: 'wiki://template/project/spec',\n name: 'Project spec',\n file: 'project-spec.md',\n description:\n 'Specification page \u2014 how a system or feature works (state of the world, not decision).'\n },\n {\n uri: 'wiki://template/project/adr',\n name: 'Project ADR',\n file: 'project-adr.md',\n description:\n 'Architecture Decision Record \u2014 pinned moment of choice. Sections: Status, Context, Decision, Rationale, Consequences.'\n },\n {\n uri: 'wiki://template/project/plan',\n name: 'Project plan',\n file: 'project-plan.md',\n description:\n 'Plan for a phase or initiative. Sections: Goal, Scope, Milestones, Dependencies, Status Log.'\n },\n {\n uri: 'wiki://template/project/ops',\n name: 'Project ops',\n file: 'project-ops.md',\n description: 'Operational runbook \u2014 how to run or operate a system. Procedural.'\n },\n {\n uri: 'wiki://template/project/story',\n name: 'Project story',\n file: 'project-story.md',\n description:\n 'User story with Gherkin scenarios and inline implementation slices. Lives at plan/{plan-name}/story-N-{slug}.md. Frontmatter carries triage_state, category, blocked_by, parent.'\n },\n {\n uri: 'wiki://template/research/index',\n name: 'Research index',\n file: 'research-index.md',\n description:\n 'Topic identity card for a research area. Frontmatter: confidence, source_count, summary, tags.'\n },\n {\n uri: 'wiki://template/research/article',\n name: 'Research article',\n file: 'research-article.md',\n description:\n 'Wikipedia-style article about a concept, entity, or system. Original synthesis with sources.'\n },\n {\n uri: 'wiki://template/research/src',\n name: 'Research source',\n file: 'research-src.md',\n description:\n 'Summary of an external source (paper, talk, doc) with citation. The only `src-` prefix in research.'\n },\n {\n uri: 'wiki://template/note',\n name: 'Note',\n file: 'note.md',\n description: 'Low-ceremony everyday note. Capture fast, sort later.'\n }\n];\n\n/**\n * Registry entries for custom kinds \u2014 object-form `kinds` entries outside the\n * built-in set. Single-segment URI (the `note` precedent: no domain to encode),\n * file by convention at `templates/{name}.md`, the kind's `signal` doubles as\n * the description.\n */\nfunction customTemplates(config: VaultConfig): TemplateSpec[] {\n const specs: TemplateSpec[] = [];\n for (const entry of config.kinds) {\n if (typeof entry === 'string' || BUILT_IN_KINDS.has(entry.name)) continue;\n specs.push({\n uri: `wiki://template/${entry.name}`,\n name: entry.name.charAt(0).toUpperCase() + entry.name.slice(1),\n file: `${entry.name}.md`,\n description: entry.signal\n });\n }\n return specs;\n}\n\n/**\n * Register all template resources with the MCP server. Each template is a\n * fixed URI; `resources/read` re-reads the file on every call, so edits to\n * vault/templates/*.md are picked up without restarting the server.\n */\nexport function registerTemplateResources(\n mcp: McpServer,\n vaultRoot: string,\n vaultConfig: VaultConfig\n): void {\n const dir = join(vaultRoot, 'templates');\n const templates = [...TEMPLATES, ...customTemplates(vaultConfig)];\n for (const tmpl of templates) {\n mcp.registerResource(\n tmpl.name,\n tmpl.uri,\n { description: tmpl.description, mimeType: 'text/markdown' },\n async (uri) => {\n let text: string;\n try {\n text = await readFile(join(dir, tmpl.file), 'utf8');\n } catch (err) {\n throw new Error(`template file missing: templates/${tmpl.file} (${tmpl.uri})`, {\n cause: err\n });\n }\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'text/markdown' as const,\n text\n }\n ]\n };\n }\n );\n }\n\n const indexLines = ['# Wiki Templates', ''];\n for (const tmpl of templates) {\n indexLines.push(`- **${tmpl.name}** \u2014 \\`${tmpl.uri}\\` `);\n indexLines.push(` ${tmpl.description}`);\n }\n const indexText = indexLines.join('\\n');\n\n mcp.registerResource(\n 'Template index',\n 'wiki://templates',\n {\n description:\n 'Index of all wiki templates with URIs and descriptions. Read a specific template via its URI.',\n mimeType: 'text/markdown'\n },\n async (uri) => ({\n contents: [{ uri: uri.toString(), mimeType: 'text/markdown' as const, text: indexText }]\n })\n );\n}\n", "import { parse as parseYaml } from 'yaml';\n\n// Verbatim mirror of @llm-wiki/cli's src/frontmatter.ts. Kept byte-identical so\n// mcp parses frontmatter the same way sync/validate do. Collapse into a shared\n// package only when a third separate consumer appears (CLAUDE.md YAGNI rule).\n\nexport interface ParsedFrontmatter {\n data: Record<string, unknown>;\n content: string;\n}\n\n// Leading `---` block, YAML, closing `---`, then one consumed newline. Matches\n// gray-matter's delimiter handling; the closing `---` must be on its own line so\n// `---` rules inside the body are left intact.\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n?---\\r?\\n?/;\n\n/**\n * Split a page's frontmatter from its body using the `yaml` parser. Throws\n * (deterministically, no cache) when the frontmatter is not valid YAML. A page\n * with no leading delimiter parses to empty data and the whole input as body.\n */\nexport function parseFrontmatter(raw: string): ParsedFrontmatter {\n const match = FRONTMATTER_RE.exec(raw);\n if (!match) {\n return { data: {}, content: raw };\n }\n const yamlText = match[1] ?? '';\n const content = raw.slice(match[0].length);\n if (yamlText.trim() === '') {\n return { data: {}, content };\n }\n const parsed = parseYaml(yamlText);\n const data =\n parsed !== null && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {};\n return { data, content };\n}\n", "const FTS5_KEYWORDS = new Set(['AND', 'OR', 'NOT', 'NEAR']);\n\nexport function sanitizeFtsQuery(raw: string): string {\n return raw\n .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 0 && !FTS5_KEYWORDS.has(t))\n .join(' ');\n}\n", "/**\n * MCP CallToolResult helpers. `content[0].text` carries pretty-printed JSON\n * for LLM-facing clients; `structuredContent` carries the same payload as\n * raw JSON for clients that parse directly. Both fields kept in sync so\n * callers never choose one over the other.\n */\n\nexport function textJson(data: object) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],\n structuredContent: data as Record<string, unknown>\n };\n}\n\n/**\n * Variant for tools whose model-facing surface is denser as markdown than as\n * pretty-printed JSON (~20% token savings on prose-heavy payloads). The\n * markdown goes to `content[0].text`; `structuredContent` keeps the machine\n * fields so a non-LLM client still gets a parseable shape.\n */\nexport function textWithStruct(markdown: string, data: object) {\n return {\n content: [{ type: 'text' as const, text: markdown }],\n structuredContent: data as Record<string, unknown>\n };\n}\n\nexport interface ToolErrorPayload {\n readonly code: string;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nexport function textError(error: ToolErrorPayload) {\n const payload = {\n code: error.code,\n message: error.message,\n details: error.details ?? {}\n };\n return {\n isError: true as const,\n content: [{ type: 'text' as const, text: JSON.stringify(payload) }],\n structuredContent: payload as Record<string, unknown>\n };\n}\n", "import type { DatabaseSync } from 'node:sqlite';\nimport { z } from 'zod';\nimport { sanitizeFtsQuery } from '../lib/fts.js';\nimport { textError, textJson } from '../lib/toolResponse.js';\n\nexport const SearchInputSchema = z.object({\n query: z\n .string()\n .min(1)\n .describe(\n 'Natural-language search query. Matched against title, summary, and body via SQLite FTS5.'\n ),\n scope: z\n .string()\n .optional()\n .describe('Optional: restrict to a project scope (e.g. \"ontology\", \"sotto\").'),\n kind: z\n .string()\n .optional()\n .describe(\n 'Optional: restrict to a kind. Project kinds: spec, adr, plan, ops. Research kinds: article, src. Misc: note.'\n ),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .default(5)\n .describe('Maximum number of ranked results to return. Default 5.')\n});\n\nexport type SearchInput = z.infer<typeof SearchInputSchema>;\n\nexport interface SearchResult {\n readonly path: string;\n readonly title: string;\n readonly kind: string;\n readonly summary: string | null;\n readonly score: number;\n readonly scope?: string | null;\n}\n\nexport interface SearchDeps {\n readonly db: DatabaseSync;\n}\n\n// Column weights over pages_fts(title, summary, body): a page NAMING the\n// concept outranks pages that merely mention it, however often. Shared\n// ranking policy with prime's task-relevant pages.\nexport const FTS_RANK = 'bm25(pages_fts, 10.0, 5.0, 1.0)';\n\nexport function search(deps: SearchDeps, input: SearchInput): { results: SearchResult[] } {\n const ftsQuery = sanitizeFtsQuery(input.query);\n if (!ftsQuery) return { results: [] };\n\n let sql = `SELECT p.path, p.title, p.kind, p.summary, p.scope, ${FTS_RANK} AS score\n FROM pages_fts\n JOIN pages p ON p.id = pages_fts.rowid\n WHERE pages_fts MATCH ?`;\n const params: Array<string | number> = [ftsQuery];\n\n if (input.scope) {\n sql += ' AND p.scope = ?';\n params.push(input.scope);\n }\n if (input.kind) {\n sql += ' AND p.kind = ?';\n params.push(input.kind);\n }\n sql += ` ORDER BY ${FTS_RANK} LIMIT ?`;\n params.push(input.limit);\n\n const rows = deps.db.prepare(sql).all(...params) as Array<{\n path: string;\n title: string;\n kind: string;\n summary: string | null;\n scope: string | null;\n score: number;\n }>;\n\n return {\n results: rows.map((r) => ({\n path: r.path,\n title: r.title,\n kind: r.kind,\n summary: r.summary,\n scope: r.scope,\n score: r.score\n }))\n };\n}\n\nexport function handleSearch(deps: SearchDeps, input: SearchInput) {\n try {\n return textJson(search(deps, input));\n } catch (err) {\n return textError({\n code: 'SEARCH_FAILED',\n message: err instanceof Error ? err.message : String(err)\n });\n }\n}\n", "import { readFile } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\nimport type { DatabaseSync } from 'node:sqlite';\nimport { canonicalVaultRoot } from '@llm-wiki/db/database';\nimport { kindName, type VaultConfig } from '@llm-wiki/db/vault-config';\nimport { z } from 'zod';\nimport { parseFrontmatter } from '../frontmatter.js';\nimport { sanitizeFtsQuery } from '../lib/fts.js';\nimport { textError, textWithStruct } from '../lib/toolResponse.js';\nimport { FTS_RANK } from './search.js';\n\nexport const PrimeInputSchema = z.object({\n scope: z\n .string()\n .min(1)\n .describe('Project scope to prime (matches projects/{scope}/ in the vault).'),\n task: z\n .string()\n .optional()\n .describe('Optional task description; surfaces top-3 tsvector-ranked relevant pages.')\n});\n\nexport type PrimeInput = z.infer<typeof PrimeInputSchema>;\n\ninterface ProjectIndexFm {\n title?: string;\n methodology?: string;\n phase?: number;\n summary?: string;\n}\n\nexport interface PrimeData {\n scope: string;\n vault_root: string;\n title: string | null;\n methodology: string | null;\n phase: number | null;\n summary: string;\n primer: string;\n counts: Record<string, number>;\n active_adrs: Array<{ path: string; slug: string; title: string; summary: string | null }>;\n current_plan: { path: string; slug: string; title: string } | null;\n top_tags: string[];\n hub_pages: Array<{ path: string; title: string; inbound: number }>;\n recent: Array<{ path: string; operation: string; date: string }>;\n relevant: Array<{ path: string; title: string; score: number }>;\n cross_scope: Array<{ from_scope: string; from_path: string; to_path: string }>;\n}\n\nexport interface PrimeDeps {\n readonly db: DatabaseSync;\n readonly vaultRoot: string;\n readonly vaultConfig: VaultConfig;\n}\n\nfunction pathSlug(p: string): string {\n return basename(p).replace(/\\.md$/, '');\n}\n\nasync function readIndexFm(vaultRoot: string, scope: string): Promise<ProjectIndexFm> {\n try {\n const raw = await readFile(join(vaultRoot, 'projects', scope, 'index.md'), 'utf8');\n return parseFrontmatter(raw).data as ProjectIndexFm;\n } catch {\n return {};\n }\n}\n\nasync function readPrimer(vaultRoot: string, scope: string): Promise<string> {\n try {\n const raw = await readFile(join(vaultRoot, 'projects', scope, 'primer.md'), 'utf8');\n return parseFrontmatter(raw)\n .content.trim()\n .replace(/^#\\s+[^\\n]+\\n+/, '');\n } catch {\n return '';\n }\n}\n\nexport async function prime(\n deps: PrimeDeps,\n input: PrimeInput\n): Promise<{ markdown: string; data: PrimeData }> {\n const { db, vaultRoot, vaultConfig } = deps;\n const { scope, task } = input;\n\n const [fm, primer] = await Promise.all([\n readIndexFm(vaultRoot, scope),\n readPrimer(vaultRoot, scope)\n ]);\n\n const counts = db\n .prepare('SELECT kind, count(*) AS count FROM pages WHERE scope = ? GROUP BY kind')\n .all(scope) as Array<{ kind: string; count: number | bigint }>;\n\n const adrs = db\n .prepare(\n \"SELECT path, title, summary FROM pages WHERE scope = ? AND kind = 'adr' AND status = 'active' ORDER BY updated DESC\"\n )\n .all(scope) as Array<{ path: string; title: string; summary: string | null }>;\n\n const planRow = db\n .prepare(\n \"SELECT path, title FROM pages WHERE scope = ? AND kind = 'plan' AND status = 'active' ORDER BY updated DESC LIMIT 1\"\n )\n .get(scope) as { path: string; title: string } | undefined;\n\n const tags = db\n .prepare(\n `SELECT j.value AS tag, count(*) AS cnt\n FROM pages, json_each(pages.tags) AS j\n WHERE scope = ?\n GROUP BY j.value\n ORDER BY cnt DESC\n LIMIT 10`\n )\n .all(scope) as Array<{ tag: string }>;\n\n const hubs = db\n .prepare(\n `SELECT p.path, p.title, count(*) AS inbound\n FROM links l JOIN pages p ON p.path = l.target_path\n WHERE p.scope = ?\n GROUP BY p.path, p.title\n ORDER BY inbound DESC LIMIT 5`\n )\n .all(scope) as Array<{ path: string; title: string; inbound: number | bigint }>;\n\n const events = db\n .prepare('SELECT path, operation, ts FROM events WHERE scope = ? ORDER BY ts DESC LIMIT 5')\n .all(scope) as Array<{ path: string; operation: string; ts: string }>;\n\n const crossScope = db\n .prepare(\n `SELECT pf.scope AS from_scope, l.source_path AS from_path, l.target_path AS to_path\n FROM links l\n JOIN pages pt ON pt.path = l.target_path\n JOIN pages pf ON pf.path = l.source_path\n WHERE pt.scope = ? AND pf.scope IS NOT NULL AND pf.scope != ?\n LIMIT 10`\n )\n .all(scope, scope) as Array<{ from_scope: string; from_path: string; to_path: string }>;\n\n let relevant: Array<{ path: string; title: string; score: number }> = [];\n if (task) {\n const ftsQuery = sanitizeFtsQuery(task);\n if (ftsQuery) {\n relevant = (\n db\n .prepare(\n `SELECT p.path, p.title, ${FTS_RANK} AS score\n FROM pages_fts\n JOIN pages p ON p.id = pages_fts.rowid\n WHERE pages_fts MATCH ? AND p.scope = ?\n ORDER BY ${FTS_RANK} LIMIT 3`\n )\n .all(ftsQuery, scope) as Array<{ path: string; title: string; score: number }>\n ).map((row) => ({\n path: row.path,\n title: row.title,\n score: row.score\n }));\n }\n }\n\n const countsRecord: Record<string, number> = {};\n for (const row of counts) countsRecord[row.kind] = Number(row.count);\n\n const data: PrimeData = {\n scope,\n vault_root: canonicalVaultRoot(vaultRoot),\n title: fm.title ?? null,\n methodology: fm.methodology ?? null,\n phase: typeof fm.phase === 'number' ? fm.phase : null,\n summary: fm.summary ?? '',\n primer,\n counts: countsRecord,\n active_adrs: adrs.map((r) => ({\n path: r.path,\n slug: pathSlug(r.path),\n title: r.title,\n summary: r.summary\n })),\n current_plan: planRow\n ? {\n path: planRow.path,\n slug: pathSlug(planRow.path),\n title: planRow.title\n }\n : null,\n top_tags: tags.map((r) => r.tag),\n hub_pages: hubs.map((r) => ({\n path: r.path,\n title: r.title,\n inbound: Number(r.inbound)\n })),\n recent: events.map((r) => ({\n path: r.path,\n operation: r.operation,\n date: r.ts.slice(0, 10)\n })),\n relevant,\n cross_scope: crossScope.map((r) => ({\n from_scope: r.from_scope,\n from_path: r.from_path,\n to_path: r.to_path\n }))\n };\n\n return { markdown: renderMarkdown(data, vaultConfig, task), data };\n}\n\nexport function renderMarkdown(\n d: PrimeData,\n config: VaultConfig,\n task: string | undefined\n): string {\n const lines: string[] = [];\n\n const phaseLabel =\n d.phase !== null\n ? d.methodology\n ? `Phase ${d.phase} (${d.methodology})`\n : `Phase ${d.phase}`\n : '';\n const header = phaseLabel ? `${d.scope} \u2014 ${phaseLabel}` : d.scope;\n lines.push(`# ${header}`);\n if (d.summary) lines.push(d.summary);\n // Search returns vault-relative paths; this is what the agent resolves them against.\n lines.push(`Vault root: \\`${d.vault_root}\\``);\n\n if (d.primer) {\n lines.push('', '## Primer', d.primer);\n }\n\n if (d.active_adrs.length > 0) {\n lines.push('', '## Active Decisions');\n for (const a of d.active_adrs) {\n lines.push(`- ${a.slug}: ${a.summary ?? a.title}`);\n }\n }\n\n if (d.current_plan) {\n lines.push('', '## Current Plan');\n lines.push(`${d.current_plan.slug}: ${d.current_plan.title}`);\n }\n\n const countEntries = Object.entries(d.counts);\n if (countEntries.length > 0) {\n lines.push('', '## Pages');\n lines.push(countEntries.map(([k, n]) => `${k}: ${n}`).join(' | '));\n }\n\n lines.push('', '## Vocabulary');\n lines.push(`kinds: ${config.kinds.map(kindName).join(', ')}`);\n lines.push(`statuses: ${config.statuses.join(', ')}`);\n lines.push(`tags: ${config.tags.canonical.join(', ')}`);\n\n if (d.top_tags.length > 0) {\n lines.push('', '## Tags');\n lines.push(d.top_tags.join(', '));\n }\n\n if (d.hub_pages.length > 0) {\n lines.push('', '## Hubs');\n for (const h of d.hub_pages) {\n lines.push(`- ${pathSlug(h.path)} (${h.inbound} inbound)`);\n }\n }\n\n if (d.recent.length > 0) {\n lines.push('', '## Recent');\n for (const r of d.recent) {\n lines.push(`- [${r.date}] ${pathSlug(r.path)} ${r.operation}`);\n }\n }\n\n if (d.relevant.length > 0) {\n lines.push('', `## Relevant (task: \"${task}\")`);\n for (const r of d.relevant) {\n lines.push(`- ${pathSlug(r.path)} (${r.score.toFixed(2)})`);\n }\n }\n\n if (d.cross_scope.length > 0) {\n lines.push('', '## Cross-scope');\n for (const c of d.cross_scope) {\n lines.push(`- ${c.from_scope}/${pathSlug(c.from_path)} \u2192 ${pathSlug(c.to_path)}`);\n }\n }\n\n lines.push(\n '',\n '---',\n 'Authoring wiki content? Read `wiki://authoring` for kind selector, rules, and templates. After edits: `kmd validate`, then `kmd sync`.'\n );\n\n return lines.join('\\n');\n}\n\nexport async function handlePrime(deps: PrimeDeps, input: PrimeInput) {\n if (!Object.hasOwn(deps.vaultConfig.scopes, input.scope)) {\n const valid = Object.keys(deps.vaultConfig.scopes).sort().join(', ');\n return textError({\n code: 'UNKNOWN_SCOPE',\n message: `unknown scope \"${input.scope}\"; valid scopes: ${valid}`\n });\n }\n try {\n const { markdown, data } = await prime(deps, input);\n return textWithStruct(markdown, data as unknown as Record<string, unknown>);\n } catch (err) {\n return textError({\n code: 'PRIME_FAILED',\n message: err instanceof Error ? err.message : String(err)\n });\n }\n}\n", "import type { DatabaseSync } from 'node:sqlite';\nimport type { VaultConfig } from '@llm-wiki/db/vault-config';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Logger } from './lib/logger.js';\nimport { registerAuthoringResource } from './resources/authoring.js';\nimport { registerTemplateResources } from './resources/templates.js';\nimport { handlePrime, PrimeInputSchema } from './tools/prime.js';\nimport { handleSearch, SearchInputSchema } from './tools/search.js';\n\nexport interface BuildServerArgs {\n readonly name: string;\n readonly version: string;\n readonly vaultRoot: string;\n readonly db: DatabaseSync;\n readonly logger: Logger;\n readonly vaultConfig: VaultConfig;\n}\n\nexport function buildServer(args: BuildServerArgs): McpServer {\n const { name, version, vaultRoot, db, logger, vaultConfig } = args;\n\n const mcp = new McpServer({ name, version }, { capabilities: { tools: {}, resources: {} } });\n\n mcp.tool(\n 'prime',\n 'Orient on a project. Returns a markdown briefing with: identity (scope, phase, methodology, summary), the human-authored primer.md inlined, active ADRs, current plan, page counts, top tags, hub pages (most-linked-to), recent events, cross-scope references, and \u2014 when `task` is provided \u2014 the top 3 tsvector-ranked relevant pages. Call once at session start. Empty sections are omitted to keep the surface lean.',\n PrimeInputSchema.shape,\n async (input) => {\n logger.debug({ tool: 'prime', input }, 'tool call');\n return handlePrime({ db, vaultRoot, vaultConfig }, input);\n }\n );\n\n mcp.tool(\n 'search',\n 'Full-text search across wiki pages via SQLite FTS5. Returns ranked candidates {path, title, kind, summary, score} \u2014 never page bodies. The agent reads the returned paths directly from the filesystem.',\n SearchInputSchema.shape,\n async (input) => {\n logger.debug({ tool: 'search', input }, 'tool call');\n return handleSearch({ db }, input);\n }\n );\n\n registerTemplateResources(mcp, vaultRoot, vaultConfig);\n registerAuthoringResource(mcp, vaultRoot, vaultConfig);\n\n return mcp;\n}\n", "import { loadVaultConfig } from '@llm-wiki/db/vault-config';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config.js';\nimport { createDatabase } from './db.js';\nimport { diag } from './lib/diag.js';\nimport { createLogger } from './lib/logger.js';\nimport { buildServer } from './server.js';\n\nexport async function startMcpServer(): Promise<void> {\n diag('main entered');\n\n const config = loadConfig();\n diag('config loaded', { vault: config.wikiVault, level: config.logLevel });\n\n const vaultConfig = await loadVaultConfig(config.wikiVault);\n diag('vault config loaded', {\n scopes: Object.keys(vaultConfig.scopes).length,\n kinds: vaultConfig.kinds.length,\n statuses: vaultConfig.statuses.length\n });\n\n const logger = createLogger(config.logLevel, config.serverName);\n logger.info(\n { vault: config.wikiVault, serverName: config.serverName, serverVersion: config.serverVersion },\n 'starting wiki-mcp on stdio'\n );\n\n const db = createDatabase(config.wikiVault);\n diag('database opened');\n\n const mcp = buildServer({\n name: config.serverName,\n version: config.serverVersion,\n vaultRoot: config.wikiVault,\n db,\n logger,\n vaultConfig\n });\n diag('server built');\n\n const shutdown = async (signal: NodeJS.Signals) => {\n logger.info({ signal }, 'shutting down');\n diag('shutting down', { signal });\n try {\n await mcp.close();\n db.close();\n } catch (err) {\n logger.error({ err }, 'error during shutdown');\n }\n process.exit(0);\n };\n process.once('SIGINT', (s) => void shutdown(s));\n process.once('SIGTERM', (s) => void shutdown(s));\n\n const transport = new StdioServerTransport();\n await mcp.connect(transport);\n logger.info('wiki-mcp ready');\n diag('ready and connected to transport');\n}\n", "import { mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, resolve, sep } from 'node:path';\nimport { DatabaseSync } from 'node:sqlite';\nimport { parseArgs } from 'node:util';\nimport { kmdHome } from '@llm-wiki/db/database';\nimport type { Trigger, VaultConfig } from '@llm-wiki/db/vault-config';\nimport { loadVaultConfig, TriggerSchema } from '@llm-wiki/db/vault-config';\nimport { parse as parseYaml } from 'yaml';\nimport { z } from 'zod';\nimport { parseFrontmatter } from './frontmatter.js';\nimport { syncVault } from './sync.js';\nimport { type Finding, hasErrors, validateVault } from './validate.js';\n\nexport interface PromptEvent {\n session_id: string;\n prompt: string;\n cwd?: string;\n}\n\nexport interface InjectMatch {\n id: string;\n text: string;\n}\n\n/**\n * Built-in triggers ship with the engine; `vault.yaml` `triggers` replaces\n * them per scope, `triggers_extra` appends. Empty until field data nominates\n * universal defaults.\n */\nconst DEFAULT_TRIGGERS: Trigger[] = [];\n\nconst SESSION_STATE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nfunction eventFields(raw: string): Record<string, unknown> | null {\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n return null;\n }\n if (typeof data !== 'object' || data === null) return null;\n return data as Record<string, unknown>;\n}\n\nexport function parsePromptEvent(raw: string): PromptEvent | null {\n const fields = eventFields(raw);\n if (fields === null) return null;\n const { session_id, prompt, cwd } = fields;\n if (typeof session_id !== 'string' || typeof prompt !== 'string') return null;\n return { session_id, prompt, ...(typeof cwd === 'string' && { cwd }) };\n}\n\n/** Dedup key granularity for the kiro-ide codec, which has no session id. */\nconst KIRO_IDE_BUCKET_MS = 30 * 60 * 1000;\n\n/**\n * Kiro IDE (\u22640.12.x) delivers the prompt via $USER_PROMPT and neither writes\n * nor closes stdin \u2014 reading it blocks until the hook timeout, so this codec\n * must never touch the pipe. Absent env means a newer build that delivers the\n * event on stdin instead; the caller falls back to the neutral codec. With no\n * session identifier available, the dedup key is a per-workspace 30-minute\n * time bucket: noise bounded, suppression never permanent. A bucket boundary\n * crossed mid-conversation re-fires triggers that already fired.\n */\nexport function kiroIdePromptEvent(now = Date.now()): PromptEvent | null {\n const prompt = process.env.USER_PROMPT;\n if (prompt === undefined || prompt === '') return null;\n const cwd = process.cwd();\n return { session_id: `kiro:${cwd}:${Math.floor(now / KIRO_IDE_BUCKET_MS)}`, prompt, cwd };\n}\n\n/**\n * Compiled skill-activation triggers shipped by a plugin (`--triggers`).\n * Returns null on any failure \u2014 the shell diags and degrades open, keeping\n * vault-owned triggers alive.\n */\nexport function loadTriggerFile(path: string): Trigger[] | null {\n try {\n const result = z.array(TriggerSchema).safeParse(parseYaml(readFileSync(path, 'utf8')));\n return result.success ? result.data : null;\n } catch {\n return null;\n }\n}\n\n/** Reserved `triggers_extra` key whose entries apply to every invocation. */\nconst ALL_SCOPES_KEY = '_all';\n\n/**\n * DEFAULT_TRIGGERS ++ file triggers ++ `_all` extras ++ scope `triggers_extra`;\n * a scope's full-replace `triggers` takes total control of the base (defaults\n * and file source) while both extras sections still append. Duplicate ids keep\n * the first occurrence and report the rest.\n */\nexport function effectiveTriggers(\n config: VaultConfig,\n scope: string | undefined,\n fileTriggers: Trigger[] = []\n): { triggers: Trigger[]; duplicates: string[] } {\n const replace = scope === undefined ? undefined : config.triggers?.[scope];\n const base = replace ?? [...DEFAULT_TRIGGERS, ...fileTriggers];\n const allExtras = config.triggers_extra?.[ALL_SCOPES_KEY] ?? [];\n const scopeExtras =\n scope === undefined || scope === ALL_SCOPES_KEY ? [] : (config.triggers_extra?.[scope] ?? []);\n const seen = new Set<string>();\n const triggers: Trigger[] = [];\n const duplicates: string[] = [];\n for (const trigger of [...base, ...allExtras, ...scopeExtras]) {\n if (seen.has(trigger.id)) {\n duplicates.push(trigger.id);\n continue;\n }\n seen.add(trigger.id);\n triggers.push(trigger);\n }\n return { triggers, duplicates };\n}\n\nfunction expandHome(path: string): string {\n if (path === '~') return homedir();\n return path.startsWith('~/') ? join(homedir(), path.slice(2)) : path;\n}\n\n/**\n * Scope from the event's working directory: the scope whose `repo` contains\n * cwd, longest declared path winning. `~` expands to the home directory;\n * non-absolute repo values never match.\n */\nexport function resolveScope(config: VaultConfig, cwd: string | undefined): string | undefined {\n if (cwd === undefined || cwd === '') return undefined;\n let best: string | undefined;\n let bestLength = -1;\n for (const [name, scope] of Object.entries(config.scopes)) {\n if (scope.repo === undefined) continue;\n const repo = expandHome(scope.repo).replace(/\\/+$/, '');\n if (!repo.startsWith('/')) continue;\n if (cwd !== repo && !cwd.startsWith(`${repo}/`)) continue;\n if (repo.length > bestLength) {\n best = name;\n bestLength = repo.length;\n }\n }\n return best;\n}\n\ntype InjectTrigger = Trigger & { text: string };\n\nfunction keywordQuery(keywords: string[]): string {\n return keywords.map((keyword) => `\"${keyword.replaceAll('\"', '\"\"')}\"`).join(' OR ');\n}\n\nfunction openPromptIndex(prompt: string): DatabaseSync {\n const db = new DatabaseSync(':memory:');\n db.exec(`CREATE VIRTUAL TABLE prompt_doc USING fts5(text, tokenize = 'porter unicode61')`);\n db.prepare('INSERT INTO prompt_doc (text) VALUES (?)').run(prompt);\n return db;\n}\n\n/**\n * Inject-class prompt triggers only (slice 1). Keywords match word-boundary\n * and porter-stemmed against an in-memory FTS5 table \u2014 the prompt is the\n * document, the author-controlled keywords are the query, so raw user text\n * never enters FTS5 query syntax. `intent` regexes run case-insensitive over\n * the raw prompt.\n */\nexport function matchPromptTriggers(prompt: string, triggers: Trigger[]): InjectMatch[] {\n const candidates = triggers.filter(\n (trigger): trigger is InjectTrigger =>\n trigger.on === 'prompt' && trigger.enforce === 'inject' && trigger.text !== undefined\n );\n if (candidates.length === 0) return [];\n\n const matches: InjectMatch[] = [];\n let db: DatabaseSync | null = null;\n try {\n for (const trigger of candidates) {\n let hit = false;\n if (trigger.keywords !== undefined && trigger.keywords.length > 0) {\n db ??= openPromptIndex(prompt);\n const row = db\n .prepare('SELECT count(*) AS n FROM prompt_doc WHERE prompt_doc MATCH ?')\n .get(keywordQuery(trigger.keywords)) as { n: number };\n hit = row.n > 0;\n }\n if (!hit && trigger.intent !== undefined) {\n hit = trigger.intent.some((pattern) => new RegExp(pattern, 'i').test(prompt));\n }\n if (hit) {\n matches.push({ id: trigger.id, text: trigger.text });\n }\n }\n } finally {\n db?.close();\n }\n return matches;\n}\n\nexport interface PretoolEvent {\n session_id: string;\n tool_name: string;\n tool_input: unknown;\n cwd?: string;\n}\n\nexport interface PretoolMatch {\n id: string;\n enforce: 'inject' | 'warn' | 'block';\n text: string;\n when?: Trigger['when'];\n}\n\nexport function parsePretoolEvent(raw: string): PretoolEvent | null {\n const fields = eventFields(raw);\n if (fields === null) return null;\n const { session_id, tool_name, tool_input, cwd } = fields;\n if (typeof session_id !== 'string' || typeof tool_name !== 'string') return null;\n return { session_id, tool_name, tool_input, ...(typeof cwd === 'string' && { cwd }) };\n}\n\n/**\n * Pinned glob semantics for the deny path: `**` crosses directories (`**\u200B/`\n * optionally empty), `*` stays within a segment, `?` is one character.\n * Hand-rolled instead of `path.matchesGlob`, whose semantics are still\n * experimental and may drift across the Node versions users run.\n */\nfunction globToRegExp(glob: string): RegExp {\n let source = '^';\n let i = 0;\n while (i < glob.length) {\n const char = glob[i] as string;\n if (char === '*') {\n if (glob.startsWith('**/', i)) {\n source += '(?:.*/)?';\n i += 3;\n } else if (glob.startsWith('**', i)) {\n source += '.*';\n i += 2;\n } else {\n source += '[^/]*';\n i += 1;\n }\n } else if (char === '?') {\n source += '[^/]';\n i += 1;\n } else {\n source += char.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n i += 1;\n }\n }\n return new RegExp(`${source}$`);\n}\n\nfunction pathCandidates(toolInput: unknown, cwd: string | undefined): string[] {\n if (typeof toolInput !== 'object' || toolInput === null) return [];\n const fields = toolInput as Record<string, unknown>;\n const candidates: string[] = [];\n for (const key of ['file_path', 'notebook_path', 'path']) {\n const value = fields[key];\n if (typeof value === 'string' && value !== '') {\n candidates.push(value);\n if (cwd !== undefined && value.startsWith(`${cwd}/`)) {\n candidates.push(value.slice(cwd.length + 1));\n }\n }\n }\n return candidates;\n}\n\nexport function matchPretoolTriggers(\n toolName: string,\n toolInput: unknown,\n triggers: Trigger[],\n cwd?: string\n): PretoolMatch[] {\n const matches: PretoolMatch[] = [];\n for (const trigger of triggers) {\n if (trigger.on !== 'pretool') continue;\n if (trigger.tool !== undefined && trigger.tool !== toolName) continue;\n if (trigger.args_match !== undefined) {\n const serialized = JSON.stringify(toolInput ?? {});\n if (!new RegExp(trigger.args_match).test(serialized)) continue;\n }\n if (trigger.files !== undefined && trigger.files.length > 0) {\n const candidates = pathCandidates(toolInput, cwd);\n const hit = trigger.files.some((glob) => {\n const regex = globToRegExp(glob);\n return candidates.some((candidate) => regex.test(candidate));\n });\n if (!hit) continue;\n }\n const text = trigger.enforce === 'block' ? trigger.reason : trigger.text;\n if (text === undefined) continue;\n matches.push({\n id: trigger.id,\n enforce: trigger.enforce,\n text,\n ...(trigger.when !== undefined && { when: trigger.when })\n });\n }\n return matches;\n}\n\n/**\n * Resolve `when` preconditions for matched triggers only \u2014 a predicate walk\n * never runs for a tool call no trigger matched. `when` names the condition\n * under which the action is ALLOWED: the trigger fires when it evaluates\n * false, is suppressed when true, and is skipped (reported) when the\n * predicate is unknown or unevaluable.\n */\nexport function evaluateMatches(\n matches: PretoolMatch[],\n vaultRoot: string\n): { fired: PretoolMatch[]; skipped: string[] } {\n const fired: PretoolMatch[] = [];\n const skipped: string[] = [];\n for (const match of matches) {\n if (match.when === undefined) {\n fired.push(match);\n continue;\n }\n const verdict = evaluateWhen(match.when, vaultRoot);\n if (verdict === null) skipped.push(match.id);\n else if (!verdict) fired.push(match);\n }\n return { fired, skipped };\n}\n\nfunction evaluateWhen(when: NonNullable<Trigger['when']>, vaultRoot: string): boolean | null {\n if (typeof when === 'string') return null;\n try {\n const than = newestUpdated(vaultRoot, when.than);\n if (than === null) return true;\n const fresh = newestUpdated(vaultRoot, when.fresh);\n if (fresh === null) return false;\n return fresh >= than;\n } catch {\n return null;\n }\n}\n\nfunction newestUpdated(vaultRoot: string, globs: string[]): string | null {\n const regexes = globs.map(globToRegExp);\n let newest: string | null = null;\n for (const entry of readdirSync(vaultRoot, { recursive: true }) as string[]) {\n const rel = entry.split(sep).join('/');\n if (!rel.endsWith('.md')) continue;\n if (rel.startsWith('.') || rel.includes('/.')) continue;\n if (!regexes.some((regex) => regex.test(rel))) continue;\n const updated = readUpdated(join(vaultRoot, entry));\n if (updated !== null && (newest === null || updated > newest)) {\n newest = updated;\n }\n }\n return newest;\n}\n\nfunction readUpdated(path: string): string | null {\n try {\n const { data } = parseFrontmatter(readFileSync(path, 'utf8'));\n const updated = data.updated;\n if (typeof updated === 'string') return updated;\n if (updated instanceof Date) return updated.toISOString().slice(0, 10);\n } catch {\n // a malformed page is validate's problem, not the gate's\n }\n return null;\n}\n\nexport function renderPretool(\n matches: PretoolMatch[],\n format: 'neutral' | 'claude'\n): { stdout: string | null; stderr: string[] } {\n const block = matches.find((match) => match.enforce === 'block');\n const context = matches.filter((match) => match.enforce === 'inject').map((match) => match.text);\n const warnings = matches.filter((match) => match.enforce === 'warn').map((match) => match.text);\n if (format === 'claude') {\n // \"allow\" would auto-approve the tool call; inject/warn must leave the\n // permission flow untouched, so the decision appears only on deny.\n const hookSpecificOutput: Record<string, string> = { hookEventName: 'PreToolUse' };\n if (block !== undefined) {\n hookSpecificOutput.permissionDecision = 'deny';\n hookSpecificOutput.permissionDecisionReason = block.text;\n }\n if (context.length > 0) {\n hookSpecificOutput.additionalContext = context.join('\\n');\n }\n const decided = block !== undefined || context.length > 0;\n return { stdout: decided ? JSON.stringify({ hookSpecificOutput }) : null, stderr: warnings };\n }\n if (matches.length === 0) return { stdout: null, stderr: [] };\n return {\n stdout: JSON.stringify({\n decision: block !== undefined ? 'deny' : 'none',\n ...(block !== undefined && { reason: block.text }),\n context,\n warnings\n }),\n stderr: []\n };\n}\n\n// Codex apply_patch envelope: paths live in the patch text, not input fields.\nconst PATCH_FILE_RE = /^\\*\\*\\* (?:Add|Update|Delete) File: (.+)$/gm;\n\nfunction patchPaths(toolInput: unknown): string[] {\n const fields =\n typeof toolInput === 'object' && toolInput !== null\n ? (toolInput as Record<string, unknown>)\n : {};\n const sources = [toolInput, fields.patch, fields.input, fields.command].filter(\n (value): value is string => typeof value === 'string'\n );\n const paths: string[] = [];\n for (const source of sources) {\n for (const match of source.matchAll(PATCH_FILE_RE)) {\n paths.push((match[1] as string).trim());\n }\n }\n return paths;\n}\n\n/**\n * Path guard for the posttool event: did this tool call touch a file inside\n * the vault? Relative candidates resolve against the event cwd. A miss is the\n * hot path \u2014 every non-vault edit in a session flows through here.\n */\nexport function vaultPathTouched(toolInput: unknown, vaultRoot: string, cwd?: string): boolean {\n const root = resolve(vaultRoot);\n const candidates = [...pathCandidates(toolInput, cwd), ...patchPaths(toolInput)];\n return candidates.some((candidate) => {\n const absolute = resolve(cwd ?? '.', candidate);\n return absolute === root || absolute.startsWith(`${root}/`);\n });\n}\n\n/**\n * Posttool outcome codec. Errors read as the fix list (sync did not run);\n * warnings pass the sync gate but still surface once. The quiet path \u2014 no\n * findings, sync clean \u2014 renders nothing: zero per-edit noise.\n */\nexport function renderPosttool(\n findings: Finding[],\n synced: boolean,\n format: 'neutral' | 'claude'\n): string | null {\n if (findings.length === 0 && synced) return null;\n const lines = findings.map((f) => `${f.severity}: ${f.path} [${f.rule}] ${f.message}`);\n if (format === 'claude') {\n if (hasErrors(findings)) {\n return JSON.stringify({\n decision: 'block',\n reason: `kmd validate failed \u2014 fix before the index syncs:\\n${lines.join('\\n')}`\n });\n }\n const hookSpecificOutput: Record<string, string> = { hookEventName: 'PostToolUse' };\n const notes = [...lines];\n if (!synced) notes.push('kmd sync failed \u2014 index not updated; see hook stderr');\n hookSpecificOutput.additionalContext = notes.join('\\n');\n return JSON.stringify({ hookSpecificOutput });\n }\n return JSON.stringify({ findings, synced });\n}\n\n/** Block-class gates fire on every event; only inject/warn spend the noise budget. */\nexport function dedupePretoolMatches(\n stateDir: string,\n sessionId: string,\n matches: PretoolMatch[]\n): PretoolMatch[] {\n const blocks = matches.filter((match) => match.enforce === 'block');\n const rest = matches.filter((match) => match.enforce !== 'block');\n const fresh = dedupeMatches(stateDir, sessionId, rest);\n return matches.filter((match) => blocks.includes(match) || fresh.includes(match));\n}\n\n/** Session dedup state \u2014 deliberately outside `db/` so `kmd db reset` keeps it. */\nexport function hookStateDir(): string {\n return join(kmdHome(), 'state', 'hook');\n}\n\n/**\n * Drops matches whose trigger id already fired for this session, records the\n * survivors. Stale session files are pruned opportunistically on write.\n */\nexport function dedupeMatches<T extends { id: string }>(\n stateDir: string,\n sessionId: string,\n matches: T[]\n): T[] {\n if (matches.length === 0) return [];\n const file = join(stateDir, `${sessionId.replace(/[^A-Za-z0-9._-]/g, '_')}.json`);\n const fired = readFired(file);\n const fresh = matches.filter((match) => !fired.has(match.id));\n if (fresh.length > 0) {\n mkdirSync(stateDir, { recursive: true });\n for (const match of fresh) {\n fired.add(match.id);\n }\n writeFileSync(file, JSON.stringify([...fired]));\n pruneStale(stateDir, file);\n }\n return fresh;\n}\n\nfunction readFired(file: string): Set<string> {\n try {\n const data: unknown = JSON.parse(readFileSync(file, 'utf8'));\n if (Array.isArray(data)) {\n return new Set(data.filter((entry): entry is string => typeof entry === 'string'));\n }\n } catch {\n // missing or corrupt state reads as \"nothing fired\" \u2014 worst case one repeated line\n }\n return new Set();\n}\n\nfunction pruneStale(stateDir: string, keep: string): void {\n try {\n const cutoff = Date.now() - SESSION_STATE_MAX_AGE_MS;\n for (const entry of readdirSync(stateDir)) {\n const path = join(stateDir, entry);\n if (path !== keep && statSync(path).mtimeMs < cutoff) {\n rmSync(path, { force: true });\n }\n }\n } catch {\n // pruning is best-effort\n }\n}\n\n/**\n * `kmd hook prompt [<vault-root>] [--scope <s>] [--harness kiro-ide]`. Exits 0\n * on every path and never throws: stdout is the harness's context-injection\n * channel, so a degraded gate engine emits one stderr diagnostic and injects\n * nothing \u2014 it must never block a prompt. `--harness` selects the input codec;\n * without it (claude, codex, kiro-cli) the event arrives as JSON on stdin.\n */\ninterface HookInvocation {\n vaultRoot: string;\n scope: string | undefined;\n harness: unknown;\n triggersFile: unknown;\n}\n\nfunction hookInvocation(): HookInvocation | null {\n const { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n allowPositionals: true,\n strict: false,\n options: {\n scope: { type: 'string' },\n harness: { type: 'string' },\n triggers: { type: 'string' }\n }\n });\n const vaultRoot = positionals[2] ?? process.env.WIKI_VAULT;\n if (vaultRoot === undefined || vaultRoot === '') {\n diag('no vault root (positional or $WIKI_VAULT)');\n return null;\n }\n return {\n vaultRoot,\n scope: typeof values.scope === 'string' ? values.scope : process.env.WIKI_SCOPE,\n harness: values.harness,\n triggersFile: values.triggers\n };\n}\n\nfunction resolveFileTriggers(invocation: HookInvocation): Trigger[] {\n if (typeof invocation.triggersFile !== 'string') return [];\n const loaded = loadTriggerFile(invocation.triggersFile);\n if (loaded === null) {\n diag(`triggers file unreadable or invalid: ${invocation.triggersFile}`);\n return [];\n }\n return loaded;\n}\n\nexport async function runHookPrompt(): Promise<void> {\n try {\n const invocation = hookInvocation();\n if (invocation === null) return;\n const { vaultRoot } = invocation;\n let event: PromptEvent | null = null;\n if (invocation.harness === 'kiro-ide') {\n event = kiroIdePromptEvent();\n } else if (invocation.harness !== undefined) {\n diag(`unknown harness \"${String(invocation.harness)}\" \u2014 reading the neutral stdin event`);\n }\n event ??= parsePromptEvent(await readStdin());\n if (event === null) {\n diag('stdin is not a prompt event ({session_id, prompt})');\n return;\n }\n const config = await loadVaultConfig(vaultRoot);\n const scope = invocation.scope ?? resolveScope(config, event.cwd);\n const { triggers, duplicates } = effectiveTriggers(\n config,\n scope,\n resolveFileTriggers(invocation)\n );\n for (const id of duplicates) {\n diag(`duplicate trigger id \"${id}\" \u2014 later occurrence ignored`);\n }\n const matches = matchPromptTriggers(event.prompt, triggers);\n for (const match of dedupeMatches(hookStateDir(), event.session_id, matches)) {\n console.log(match.text);\n }\n } catch (err) {\n diag(err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * `kmd hook pretool [<vault-root>] [--scope <s>] [--harness claude]`. Fails\n * open: a degraded engine (missing/invalid config, bad payload) emits one\n * stderr diagnostic per event and no decision \u2014 loud enough to get fixed,\n * never denying unrelated work on a config typo. Exits 0 on every path.\n */\nexport async function runHookPretool(): Promise<void> {\n try {\n const invocation = hookInvocation();\n if (invocation === null) return;\n const { vaultRoot } = invocation;\n let format: 'neutral' | 'claude' = 'neutral';\n if (invocation.harness === 'claude') {\n format = 'claude';\n } else if (invocation.harness !== undefined) {\n diag(`unknown harness \"${String(invocation.harness)}\" \u2014 emitting the neutral contract`);\n }\n const event = parsePretoolEvent(await readStdin());\n if (event === null) {\n diag('stdin is not a pretool event ({session_id, tool_name})');\n return;\n }\n const config = await loadVaultConfig(vaultRoot);\n const scope = invocation.scope ?? resolveScope(config, event.cwd);\n const { triggers, duplicates } = effectiveTriggers(\n config,\n scope,\n resolveFileTriggers(invocation)\n );\n for (const id of duplicates) {\n diag(`duplicate trigger id \"${id}\" \u2014 later occurrence ignored`);\n }\n const matches = matchPretoolTriggers(event.tool_name, event.tool_input, triggers, event.cwd);\n const { fired, skipped } = evaluateMatches(matches, vaultRoot);\n for (const id of skipped) {\n diag(`trigger \"${id}\": unknown or unevaluable predicate \u2014 skipped`);\n }\n const rendered = renderPretool(\n dedupePretoolMatches(hookStateDir(), event.session_id, fired),\n format\n );\n for (const line of rendered.stderr) {\n console.error(line);\n }\n if (rendered.stdout !== null) {\n console.log(rendered.stdout);\n }\n } catch (err) {\n diag(err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * `kmd hook posttool [<vault-root>] [--harness claude]`. Fixed-function, not\n * trigger-driven: a tool call that wrote inside the vault runs validate\n * in-process; errors render as feedback and hold the sync, otherwise the\n * index syncs quietly. The resync protocol as an event instead of prose.\n * Fails open and exits 0 on every path, like the other hook events.\n */\nexport async function runHookPosttool(): Promise<void> {\n try {\n const invocation = hookInvocation();\n if (invocation === null) return;\n let format: 'neutral' | 'claude' = 'neutral';\n if (invocation.harness === 'claude') {\n format = 'claude';\n } else if (invocation.harness !== undefined) {\n diag(`unknown harness \"${String(invocation.harness)}\" \u2014 emitting the neutral contract`);\n }\n const event = parsePretoolEvent(await readStdin());\n if (event === null) {\n diag('stdin is not a posttool event ({session_id, tool_name})');\n return;\n }\n if (!vaultPathTouched(event.tool_input, invocation.vaultRoot, event.cwd)) return;\n const findings = await validateVault(invocation.vaultRoot);\n let synced = false;\n if (!hasErrors(findings)) {\n try {\n await syncVault(invocation.vaultRoot);\n synced = true;\n } catch (err) {\n diag(`sync failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n const rendered = renderPosttool(findings, synced, format);\n if (rendered !== null) {\n console.log(rendered);\n }\n } catch (err) {\n diag(err instanceof Error ? err.message : String(err));\n }\n}\n\nasync function readStdin(): Promise<string> {\n process.stdin.setEncoding('utf8');\n let input = '';\n for await (const chunk of process.stdin) {\n input += chunk;\n }\n return input;\n}\n\nfunction diag(message: string): void {\n console.error(`kmd hook: ${message}`);\n}\n", "#!/usr/bin/env node\nimport { parseArgs } from 'node:util';\n\n// node:sqlite is the engine's storage bet; on older Node 22.x its\n// ExperimentalWarning lands on stderr \u2014 the hook diagnostics channel, printed\n// per spawned event. Filter that one warning, pass every other through.\nprocess.removeAllListeners('warning');\nprocess.on('warning', (warning) => {\n if (warning.name !== 'ExperimentalWarning') {\n console.error(warning.stack ?? `${warning.name}: ${warning.message}`);\n }\n});\n\nconst USAGE = `usage: kmd <command> [options]\n\ncommands:\n init [<dir>] [-y] scaffold a fresh vault (no dir: current directory \u2014 TTY prompt, or -y)\n sync vault \u2192 index sync (runs validate first)\n validate [<path>] deterministic vault checker (default: $WIKI_VAULT)\n mcp [<vault-root>] start the stdio MCP server (default: $WIKI_VAULT)\n config [<vault-root>] print vault + index resolution; with no vault, list known vaults\n db reset [<vault-root>] delete the vault's index (default: $WIKI_VAULT)\n hook <prompt|pretool|posttool> [<vault-root>] [--scope <s>] [--harness <claude|kiro-ide>] [--triggers <file>]\n harness gate engine: JSON event on stdin, decision/context on stdout;\n posttool auto-runs validate + sync after a vault write\n\noptions:\n --version print version\n --help show this help`;\n\nconst { positionals, values } = parseArgs({\n args: process.argv.slice(2),\n allowPositionals: true,\n strict: false,\n options: {\n version: { type: 'boolean', short: 'v' },\n help: { type: 'boolean', short: 'h' },\n yes: { type: 'boolean', short: 'y' }\n }\n});\n\nconst command = values.version ? '--version' : values.help ? '--help' : positionals[0];\n\nfunction applyVaultRoot(positionalIndex: number): void {\n const arg = positionals[positionalIndex];\n if (arg) {\n process.env.WIKI_VAULT = arg;\n }\n}\n\nasync function run(): Promise<void> {\n switch (command) {\n case 'init': {\n const { runInit } = await import('@llm-wiki/cli/cli');\n await runInit(positionals[1], Boolean(values.yes));\n break;\n }\n case 'sync': {\n const { runSyncCommand } = await import('@llm-wiki/cli/cli');\n await runSyncCommand();\n break;\n }\n case 'validate': {\n applyVaultRoot(1);\n const { runValidate } = await import('@llm-wiki/cli/cli');\n await runValidate();\n break;\n }\n case 'mcp': {\n applyVaultRoot(1);\n const { startMcpServer } = await import('@llm-wiki/mcp/start');\n await startMcpServer();\n break;\n }\n case 'config': {\n applyVaultRoot(1);\n const { runConfig } = await import('@llm-wiki/cli/cli');\n await runConfig();\n break;\n }\n case 'db': {\n const sub = positionals[1];\n if (sub === 'reset') {\n applyVaultRoot(2);\n const { runDbReset } = await import('@llm-wiki/cli/cli');\n await runDbReset();\n } else {\n console.error(sub ? `unknown db subcommand: ${sub}` : 'usage: kmd db reset [<vault-root>]');\n process.exit(2);\n }\n break;\n }\n case 'hook': {\n const sub = positionals[1];\n // Hook runners own their errors and always exit 0 \u2014 never falling\n // through to the global handler, whose stderr/exit(1) would fire on\n // every harness event.\n if (sub === 'prompt') {\n const { runHookPrompt } = await import('@llm-wiki/cli/hook');\n await runHookPrompt();\n } else if (sub === 'pretool') {\n const { runHookPretool } = await import('@llm-wiki/cli/hook');\n await runHookPretool();\n } else if (sub === 'posttool') {\n const { runHookPosttool } = await import('@llm-wiki/cli/hook');\n await runHookPosttool();\n } else if (sub) {\n // A typo'd event name is the degraded-engine state the fail-open\n // contract covers, and exit 2 on UserPromptSubmit erases the prompt.\n // Bare `kmd hook` keeps the loud usage error \u2014 harness wiring always\n // passes an event, so a missing one is operator misuse.\n console.error(`kmd hook: unknown event: ${sub}`);\n } else {\n console.error(\n 'usage: kmd hook <prompt|pretool|posttool> [<vault-root>] [--scope <scope>] [--harness <claude|kiro-ide>]'\n );\n process.exit(2);\n }\n break;\n }\n case '--version':\n case '-v': {\n const { readFileSync } = await import('node:fs');\n const { join, dirname } = await import('node:path');\n const { fileURLToPath } = await import('node:url');\n const pkgDir = dirname(dirname(fileURLToPath(import.meta.url)));\n const pkg = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf8')) as {\n version: string;\n };\n console.log(pkg.version);\n break;\n }\n case '--help':\n case '-h':\n case undefined: {\n console.log(USAGE);\n if (command === undefined) process.exit(2);\n break;\n }\n default: {\n // Same fail-open contract as `kmd hook <bad-event>`: a known event\n // name in the tail marks the invocation as harness wiring, where\n // exit 2 blocks every prompt. Operator typos (`kmd valdate`) carry\n // no event token and keep the loud usage error.\n const tail = positionals[1];\n if (tail === 'prompt' || tail === 'pretool' || tail === 'posttool') {\n console.error(`kmd: unknown command: ${command}`);\n break;\n }\n console.error(`unknown command: ${command}\\n\\n${USAGE}`);\n process.exit(2);\n }\n }\n}\n\nrun().catch((err) => {\n console.error('kmd failed:', err instanceof Error ? (err.stack ?? err.message) : err);\n process.exit(1);\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["vaultRoot", "join", "vaultRoot", "readFile", "join", "resolve", "createHash", "readdir", "readFile", "join", "z", "vaultRoot", "readFile", "join", "basename", "dirname", "join", "positionals", "command", "z", "EnvSchema", "mkdirSync", "dirname", "vaultRoot", "mkdirSync", "homedir", "join", "vaultRoot", "readFile", "join", "vaultRoot", "parseYaml", "parseFrontmatter", "FRONTMATTER_RE", "init_frontmatter", "z", "readFile", "basename", "join", "z", "vaultRoot", "parseFrontmatter", "init_frontmatter", "vaultRoot", "mkdirSync", "readdirSync", "rmSync", "homedir", "join", "resolve", "sep", "DatabaseSync", "parseArgs", "parseYaml", "z", "vaultRoot", "values", "positionals", "diag", "parseArgs", "runInit", "runSyncCommand", "runValidate", "startMcpServer", "runConfig", "runDbReset", "runHookPrompt", "runHookPretool", "runHookPosttool", "readFileSync", "join", "dirname"]
|
|
7
7
|
}
|