@theglitchking/semantic-memory 1.6.1 → 1.7.1

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.
Files changed (117) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +81 -0
  4. package/LICENSES/Apache-2.0.txt +202 -0
  5. package/README.md +19 -2
  6. package/THIRD_PARTY_NOTICES.md +17 -0
  7. package/commands/jev-mode.md +18 -0
  8. package/commands/skill-loop.md +23 -0
  9. package/dist/chunk-2BFG4IBC.js +295 -0
  10. package/dist/chunk-2BFG4IBC.js.map +1 -0
  11. package/dist/chunk-2OMDSTSS.js +118 -0
  12. package/dist/chunk-2OMDSTSS.js.map +1 -0
  13. package/dist/{chunk-TMMTOFHI.js → chunk-34VN47IW.js} +2 -2
  14. package/dist/chunk-3ML5ESXI.js +224 -0
  15. package/dist/chunk-3ML5ESXI.js.map +1 -0
  16. package/dist/{chunk-ZLIHQZ4C.js → chunk-6TIKWOY4.js} +5 -5
  17. package/dist/{chunk-KSH2QO6V.js → chunk-7UAVDOI6.js} +5 -5
  18. package/dist/chunk-ACZKDSMP.js +123 -0
  19. package/dist/chunk-ACZKDSMP.js.map +1 -0
  20. package/dist/{chunk-PGVIBUL3.js → chunk-AIXQFTSB.js} +5 -5
  21. package/dist/chunk-BSXIGPDY.js +137 -0
  22. package/dist/chunk-BSXIGPDY.js.map +1 -0
  23. package/dist/{chunk-HZ7B5KHY.js → chunk-EXAUVIGW.js} +4 -4
  24. package/dist/chunk-GYR7U6KA.js +80 -0
  25. package/dist/chunk-GYR7U6KA.js.map +1 -0
  26. package/dist/chunk-M2PC64DB.js +195 -0
  27. package/dist/chunk-M2PC64DB.js.map +1 -0
  28. package/dist/chunk-MTLYF357.js +130 -0
  29. package/dist/chunk-MTLYF357.js.map +1 -0
  30. package/dist/chunk-N77YCMSX.js +113 -0
  31. package/dist/chunk-N77YCMSX.js.map +1 -0
  32. package/dist/chunk-PJXYCCI2.js +177 -0
  33. package/dist/chunk-PJXYCCI2.js.map +1 -0
  34. package/dist/chunk-PMOZKUEM.js +170 -0
  35. package/dist/chunk-PMOZKUEM.js.map +1 -0
  36. package/dist/chunk-R6GNP7DS.js +87 -0
  37. package/dist/chunk-R6GNP7DS.js.map +1 -0
  38. package/dist/chunk-TKHWVISV.js +71 -0
  39. package/dist/chunk-TKHWVISV.js.map +1 -0
  40. package/dist/chunk-V6PSK4Y4.js +186 -0
  41. package/dist/chunk-V6PSK4Y4.js.map +1 -0
  42. package/dist/{chunk-GYBUBJYM.js → chunk-VBLCUWT4.js} +17 -8
  43. package/dist/chunk-VBLCUWT4.js.map +1 -0
  44. package/dist/chunk-VQCNWRTL.js +121 -0
  45. package/dist/chunk-VQCNWRTL.js.map +1 -0
  46. package/dist/{chunk-HUG7E25D.js → chunk-Y7H76Q7F.js} +1 -1
  47. package/dist/chunk-Y7H76Q7F.js.map +1 -0
  48. package/dist/chunk-ZSWI3Y4Y.js +232 -0
  49. package/dist/chunk-ZSWI3Y4Y.js.map +1 -0
  50. package/dist/cli/index.js +381 -52
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/core/features.d.ts +38 -0
  53. package/dist/core/features.js +28 -0
  54. package/dist/core/index.d.ts +285 -2
  55. package/dist/core/index.js +170 -21
  56. package/dist/core/index.js.map +1 -1
  57. package/dist/core/jev.d.ts +35 -0
  58. package/dist/core/jev.js +20 -0
  59. package/dist/core/skill-curator.d.ts +1 -0
  60. package/dist/core/skill-curator.js +41 -0
  61. package/dist/core/skill-evidence.d.ts +25 -0
  62. package/dist/core/skill-evidence.js +23 -0
  63. package/dist/core/skill-queue.d.ts +46 -0
  64. package/dist/core/skill-queue.js +42 -0
  65. package/dist/core/skill-review.d.ts +3 -0
  66. package/dist/core/skill-review.js +29 -0
  67. package/dist/core/skill-worker.d.ts +21 -0
  68. package/dist/core/skill-worker.js +70 -0
  69. package/dist/core/skill-worker.js.map +1 -0
  70. package/dist/{dossier-EN26WDKC.js → dossier-RXBLQOXC.js} +3 -3
  71. package/dist/failure-eval-IUJO47UC.js +18 -0
  72. package/dist/failure-eval-IUJO47UC.js.map +1 -0
  73. package/dist/{healthcheck-53OVXUQQ.js → healthcheck-S7D6YNTA.js} +7 -7
  74. package/dist/healthcheck-S7D6YNTA.js.map +1 -0
  75. package/dist/{lexicon-XNA5IFIA.js → lexicon-SEJSLBHO.js} +4 -4
  76. package/dist/lexicon-SEJSLBHO.js.map +1 -0
  77. package/dist/{lint-O4RQ47NX.js → lint-3JNLRM5U.js} +6 -6
  78. package/dist/lint-3JNLRM5U.js.map +1 -0
  79. package/dist/mcp/server.js +19 -17
  80. package/dist/mcp/server.js.map +1 -1
  81. package/dist/{profile-SIWAVD7O.js → profile-SNULTJ27.js} +4 -4
  82. package/dist/profile-SNULTJ27.js.map +1 -0
  83. package/dist/{schema-UJNYYRZZ.js → schema-RDYUK6CC.js} +2 -2
  84. package/dist/schema-RDYUK6CC.js.map +1 -0
  85. package/dist/skill-curator-D7HHZaUI.d.ts +71 -0
  86. package/dist/skill-land-EHXZW47F.js +31 -0
  87. package/dist/skill-land-EHXZW47F.js.map +1 -0
  88. package/dist/skill-ledger-AYXVNFX7.js +18 -0
  89. package/dist/skill-ledger-AYXVNFX7.js.map +1 -0
  90. package/dist/skill-merge-HBZBALZX.js +24 -0
  91. package/dist/skill-merge-HBZBALZX.js.map +1 -0
  92. package/dist/skill-review-BNvHipn9.d.ts +182 -0
  93. package/dist/skill-schema-RVB3EHEF.js +30 -0
  94. package/dist/skill-schema-RVB3EHEF.js.map +1 -0
  95. package/hooks/hooks.json +26 -1
  96. package/hooks/jev-bridge.py +109 -0
  97. package/hooks/session-start.js +5 -0
  98. package/hooks/skill-loop.js +65 -0
  99. package/hooks/vault-context.js +104 -6
  100. package/package.json +4 -2
  101. package/dist/chunk-5F5ZIAW2.js +0 -79
  102. package/dist/chunk-5F5ZIAW2.js.map +0 -1
  103. package/dist/chunk-GYBUBJYM.js.map +0 -1
  104. package/dist/chunk-HUG7E25D.js.map +0 -1
  105. package/dist/failure-eval-37JRNTIW.js +0 -10
  106. /package/dist/{chunk-TMMTOFHI.js.map → chunk-34VN47IW.js.map} +0 -0
  107. /package/dist/{chunk-ZLIHQZ4C.js.map → chunk-6TIKWOY4.js.map} +0 -0
  108. /package/dist/{chunk-KSH2QO6V.js.map → chunk-7UAVDOI6.js.map} +0 -0
  109. /package/dist/{chunk-PGVIBUL3.js.map → chunk-AIXQFTSB.js.map} +0 -0
  110. /package/dist/{chunk-HZ7B5KHY.js.map → chunk-EXAUVIGW.js.map} +0 -0
  111. /package/dist/{dossier-EN26WDKC.js.map → core/features.js.map} +0 -0
  112. /package/dist/{failure-eval-37JRNTIW.js.map → core/jev.js.map} +0 -0
  113. /package/dist/{healthcheck-53OVXUQQ.js.map → core/skill-curator.js.map} +0 -0
  114. /package/dist/{lexicon-XNA5IFIA.js.map → core/skill-evidence.js.map} +0 -0
  115. /package/dist/{lint-O4RQ47NX.js.map → core/skill-queue.js.map} +0 -0
  116. /package/dist/{profile-SIWAVD7O.js.map → core/skill-review.js.map} +0 -0
  117. /package/dist/{schema-UJNYYRZZ.js.map → dossier-RXBLQOXC.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/core/healthcheck-fix.ts","../../src/cli/skills.ts","../../src/cli/migrate-state.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from \"commander\";\nimport { resolve, join, dirname, relative } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync, rmSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { spawnSync } from \"node:child_process\";\nimport { pathToFileURL } from \"node:url\";\nimport { planFixes, type PlannedFix } from \"../core/healthcheck-fix.js\";\nimport { registerUpdateCommands } from \"@theglitchking/claude-plugin-runtime\";\nimport {\n resolveTarget,\n installSkills,\n uninstallSkills,\n listShippedSkills,\n SKILL_BUNDLER_AGENTS,\n type AgentName,\n type Scope,\n} from \"./skills.js\";\nimport { migrateState } from \"./migrate-state.js\";\n\nconst require_ = createRequire(import.meta.url);\nconst { version } = require_(\"../../package.json\") as { version: string };\n\nconst PKG_NAME = \"@theglitchking/semantic-memory\";\nconst LEGACY_PKG_NAME = \"@theglitchking/semantic-sidekick\";\n\nfunction runRelink(cwd: string) {\n const candidates = [\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-memory\", \"scripts\", \"link-skills.js\"),\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-sidekick\", \"scripts\", \"link-skills.js\"),\n resolve(process.cwd(), \"scripts\", \"link-skills.js\"),\n ];\n const script = candidates.find((p) => existsSync(p));\n if (!script) {\n console.error(\"link-skills.js not found — is the package installed?\");\n return;\n }\n spawnSync(process.execPath, [script], {\n cwd,\n env: { ...process.env, INIT_CWD: cwd },\n stdio: \"inherit\",\n });\n}\n\ninterface FixOutcome {\n check: string;\n action: string;\n status: \"fixed\" | \"failed\";\n detail: string;\n}\n\n/**\n * Execute a `--fix` plan. Actions are de-duplicated (running skill-link once\n * covers every skill-link finding) and each is best-effort: a failure is captured\n * as an outcome, never thrown. Returns one outcome per distinct action attempted.\n */\nasync function executeFixes(cwd: string, fixes: PlannedFix[]): Promise<FixOutcome[]> {\n const outcomes: FixOutcome[] = [];\n const actions = [...new Set(fixes.map((f) => f.action))];\n for (const action of actions) {\n const checks = fixes.filter((f) => f.action === action).map((f) => f.check).join(\", \");\n try {\n switch (action) {\n case \"skill-link\": {\n runRelink(cwd);\n outcomes.push({ check: checks, action, status: \"fixed\", detail: \"re-linked skills\" });\n break;\n }\n case \"state-migrate\": {\n const r = migrateState({ projectRoot: cwd, force: true });\n outcomes.push({\n check: checks,\n action,\n status: \"fixed\",\n detail: `migrated ${r.migrated.length} file(s), resolved ${r.conflicts.length} conflict(s)`,\n });\n break;\n }\n case \"mcp-reconcile\": {\n const reconcilePath = join(findSourceRoot(), \"hooks\", \"reconcile.js\");\n if (!existsSync(reconcilePath)) {\n outcomes.push({ check: checks, action, status: \"failed\", detail: \"reconcile.js not found\" });\n break;\n }\n const mod = await import(pathToFileURL(reconcilePath).href);\n mod.reconcile(cwd);\n outcomes.push({ check: checks, action, status: \"fixed\", detail: \"reconciled .mcp.json\" });\n break;\n }\n case \"reindex\": {\n const bin = findLocalBin(cwd);\n if (!bin) {\n outcomes.push({ check: checks, action, status: \"failed\", detail: \"no local bin to run reindex\" });\n break;\n }\n const vault = join(cwd, \".claude\", \".vault\");\n const r = spawnSync(\"node\", [bin, \"--notes\", vault, \"--reindex\"], { cwd, stdio: \"pipe\", timeout: 120_000 });\n if (r.status === 0) {\n outcomes.push({ check: checks, action, status: \"fixed\", detail: \"reindexed vault\" });\n } else {\n outcomes.push({ check: checks, action, status: \"failed\", detail: (r.stderr?.toString() || \"reindex failed\").slice(0, 200) });\n }\n break;\n }\n }\n } catch (err: any) {\n outcomes.push({ check: checks, action, status: \"failed\", detail: err?.message ?? String(err) });\n }\n }\n return outcomes;\n}\n\nfunction findLocalBin(cwd: string): string | null {\n const candidates = [\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-memory\", \"bin\", \"semantic-memory\"),\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-sidekick\", \"bin\", \"semantic-sidekick\"),\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction localBinArg(cwd: string): string | null {\n const abs = findLocalBin(cwd);\n if (!abs) return null;\n const rel = relative(cwd, abs);\n return rel.startsWith(\"..\") ? abs : `./${rel}`;\n}\n\nfunction readJsonSafe(path: string): any {\n try {\n const raw = readFileSync(path, \"utf8\");\n return raw.trim() ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns the fragile npx-form pattern we used to write in pre-0.10.0\n * SessionStart hooks, so normalize-config can detect and rewrite it.\n */\nfunction isNpxForm(entry: any): boolean {\n if (!entry || typeof entry !== \"object\") return false;\n const cmd = entry.command;\n const args = Array.isArray(entry.args) ? entry.args : [];\n return (\n cmd === \"npx\" &&\n args.some(\n (a: unknown) => typeof a === \"string\" && (a.includes(PKG_NAME) || a.includes(LEGACY_PKG_NAME))\n )\n );\n}\n\nfunction isLocalForm(entry: any): boolean {\n if (!entry || typeof entry !== \"object\") return false;\n const cmd = entry.command;\n const args = Array.isArray(entry.args) ? entry.args : [];\n return (\n cmd === \"node\" &&\n args.some(\n (a: unknown) =>\n typeof a === \"string\" &&\n (a.includes(\"node_modules/@theglitchking/semantic-memory\") ||\n a.includes(\"node_modules/@theglitchking/semantic-sidekick\"))\n )\n );\n}\n\nfunction extractNotesPath(entry: any): string | null {\n const args = Array.isArray(entry?.args) ? entry.args : [];\n const i = args.indexOf(\"--notes\");\n if (i === -1 || i + 1 >= args.length) return null;\n return String(args[i + 1]);\n}\n\nfunction extractExtraFlags(entry: any): string[] {\n const args = Array.isArray(entry?.args) ? entry.args : [];\n return args.filter((a: unknown): a is string => typeof a === \"string\" && a.startsWith(\"--\") && a !== \"--notes\");\n}\n\nconst TOOL_HELP: Record<string, { description: string; args: string; examples: string[] }> = {\n // Search\n search_semantic: {\n description: \"Vector similarity search — find notes by meaning, not just keywords\",\n args: '{ \"query\": \"string\", \"limit?\": 10 }',\n examples: [\n '{ \"query\": \"microservices architecture\", \"limit\": 5 }',\n '{ \"query\": \"how to deploy to production\" }',\n ],\n },\n search_text: {\n description: \"Full-text keyword or regex search with optional filters\",\n args: '{ \"pattern\": \"string\", \"regex?\": false, \"caseSensitive?\": false, \"pathGlob?\": \"string\", \"tagFilter?\": [\"string\"], \"limit?\": 20 }',\n examples: [\n '{ \"pattern\": \"RabbitMQ\" }',\n '{ \"pattern\": \"OAuth\\\\\\\\d\", \"regex\": true }',\n '{ \"pattern\": \"deploy\", \"pathGlob\": \"devops/**\", \"tagFilter\": [\"kubernetes\"] }',\n ],\n },\n search_graph: {\n description: \"Graph traversal — find notes connected to a concept via wikilinks and tags\",\n args: '{ \"concept\": \"string\", \"maxDepth?\": 2 }',\n examples: [\n '{ \"concept\": \"microservices\" }',\n '{ \"concept\": \"auth\", \"maxDepth\": 3 }',\n ],\n },\n search_hybrid: {\n description: \"Combined semantic + graph search — vector results re-ranked by graph proximity\",\n args: '{ \"query\": \"string\", \"limit?\": 10 }',\n examples: [\n '{ \"query\": \"event driven architecture\", \"limit\": 5 }',\n ],\n },\n\n // Read\n read_note: {\n description: \"Read the full content of a specific note by path\",\n args: '{ \"path\": \"string\" }',\n examples: [\n '{ \"path\": \"project-overview.md\" }',\n '{ \"path\": \"notes/meeting-2024-01-15.md\" }',\n ],\n },\n read_multiple_notes: {\n description: \"Batch read multiple notes in one call\",\n args: '{ \"paths\": [\"string\"] }',\n examples: [\n '{ \"paths\": [\"overview.md\", \"architecture.md\", \"deployment.md\"] }',\n ],\n },\n list_notes: {\n description: \"List all indexed notes with metadata (title, tags, link count)\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n\n // Write\n create_note: {\n description: \"Create a new markdown note with optional YAML frontmatter\",\n args: '{ \"path\": \"string\", \"content\": \"string\", \"frontmatter?\": {} }',\n examples: [\n '{ \"path\": \"new-guide.md\", \"content\": \"# Guide\\\\n\\\\nContent here.\" }',\n '{ \"path\": \"tagged.md\", \"content\": \"Content.\", \"frontmatter\": { \"title\": \"Tagged Note\", \"tags\": [\"test\"] } }',\n ],\n },\n update_note: {\n description: \"Edit note content — overwrite, append, prepend, or patch by heading\",\n args: '{ \"path\": \"string\", \"content\": \"string\", \"mode\": \"overwrite|append|prepend|patch-by-heading\", \"heading?\": \"string\" }',\n examples: [\n '{ \"path\": \"guide.md\", \"content\": \"New content.\", \"mode\": \"overwrite\" }',\n '{ \"path\": \"guide.md\", \"content\": \"\\\\n## Appendix\\\\nExtra info.\", \"mode\": \"append\" }',\n '{ \"path\": \"guide.md\", \"content\": \"Updated architecture section.\", \"mode\": \"patch-by-heading\", \"heading\": \"Architecture\" }',\n ],\n },\n delete_note: {\n description: \"Delete a note permanently (requires confirm=true)\",\n args: '{ \"path\": \"string\", \"confirm\": true }',\n examples: [\n '{ \"path\": \"old-note.md\", \"confirm\": true }',\n '{ \"path\": \"old-note.md\", \"confirm\": false } // returns warning, does not delete',\n ],\n },\n move_note: {\n description: \"Move or rename a note — automatically updates wikilinks across the vault\",\n args: '{ \"from\": \"string\", \"to\": \"string\" }',\n examples: [\n '{ \"from\": \"user-service.md\", \"to\": \"auth-service.md\" }',\n '{ \"from\": \"old/note.md\", \"to\": \"new/location/note.md\" }',\n ],\n },\n\n // Metadata\n get_frontmatter: {\n description: \"Read parsed YAML frontmatter from a note as JSON\",\n args: '{ \"path\": \"string\" }',\n examples: ['{ \"path\": \"project-overview.md\" }'],\n },\n update_frontmatter: {\n description: \"Set or delete YAML frontmatter keys — pass null to delete a key\",\n args: '{ \"path\": \"string\", \"fields\": {} }',\n examples: [\n '{ \"path\": \"note.md\", \"fields\": { \"status\": \"active\", \"priority\": 1 } }',\n '{ \"path\": \"note.md\", \"fields\": { \"deprecated_field\": null } } // deletes the key',\n ],\n },\n manage_tags: {\n description: \"Add, remove, or list tags on a note (frontmatter and inline)\",\n args: '{ \"path\": \"string\", \"action\": \"add|remove|list\", \"tags?\": [\"string\"] }',\n examples: [\n '{ \"path\": \"note.md\", \"action\": \"list\" }',\n '{ \"path\": \"note.md\", \"action\": \"add\", \"tags\": [\"important\", \"reviewed\"] }',\n '{ \"path\": \"note.md\", \"action\": \"remove\", \"tags\": [\"draft\"] }',\n ],\n },\n rename_tag: {\n description: \"Rename a tag across all notes in the vault (frontmatter + inline)\",\n args: '{ \"oldTag\": \"string\", \"newTag\": \"string\" }',\n examples: ['{ \"oldTag\": \"architecture\", \"newTag\": \"arch\" }'],\n },\n\n // Graph\n backlinks: {\n description: \"Find all notes that link TO a given note via [[wikilinks]]\",\n args: '{ \"path\": \"string\" }',\n examples: ['{ \"path\": \"microservices.md\" }'],\n },\n forwardlinks: {\n description: \"Find all notes linked FROM a given note\",\n args: '{ \"path\": \"string\" }',\n examples: ['{ \"path\": \"project-overview.md\" }'],\n },\n graph_path: {\n description: \"Find the shortest path between two notes in the knowledge graph\",\n args: '{ \"from\": \"string\", \"to\": \"string\" }',\n examples: ['{ \"from\": \"project-overview.md\", \"to\": \"user-service.md\" }'],\n },\n graph_statistics: {\n description: \"Knowledge graph stats — most connected nodes, orphans, density\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n\n // System\n get_stats: {\n description: \"Vault and index statistics — note count, chunks, embeddings, graph density\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n reindex: {\n description: \"Force a full reindex of the vault\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n};\n\nconst TOOL_CATEGORIES: Record<string, string[]> = {\n Search: [\"search_semantic\", \"search_text\", \"search_graph\", \"search_hybrid\"],\n Read: [\"read_note\", \"read_multiple_notes\", \"list_notes\"],\n Write: [\"create_note\", \"update_note\", \"delete_note\", \"move_note\"],\n Metadata: [\"get_frontmatter\", \"update_frontmatter\", \"manage_tags\", \"rename_tag\"],\n Graph: [\"backlinks\", \"forwardlinks\", \"graph_path\", \"graph_statistics\"],\n System: [\"get_stats\", \"reindex\"],\n};\n\nfunction printToolList() {\n console.log(\"\\nSemantic Pages — 21 MCP Tools\\n\");\n console.log(\"Usage: These tools are available via MCP when the server is running.\");\n console.log(\" Run `semantic-memory tools <name>` for details on a specific tool.\\n\");\n\n for (const [category, tools] of Object.entries(TOOL_CATEGORIES)) {\n console.log(` ${category}:`);\n for (const name of tools) {\n const tool = TOOL_HELP[name];\n console.log(` ${name.padEnd(24)} ${tool.description}`);\n }\n console.log();\n }\n\n console.log(\"Run `semantic-memory tools <tool-name>` for arguments and examples.\");\n}\n\nfunction printToolDetail(name: string) {\n const tool = TOOL_HELP[name];\n if (!tool) {\n console.error(`Unknown tool: ${name}`);\n console.error(`Run \\`semantic-memory tools\\` to see all available tools.`);\n process.exit(1);\n }\n\n console.log(`\\n ${name}`);\n console.log(` ${\"─\".repeat(name.length)}`);\n console.log(` ${tool.description}\\n`);\n console.log(` Arguments:`);\n console.log(` ${tool.args}\\n`);\n console.log(` Examples:`);\n for (const ex of tool.examples) {\n console.log(` ${ex}`);\n }\n console.log();\n}\n\nprogram\n .name(\"semantic-memory\")\n .description(\n \"Unified memory-layer MCP server for Claude Code (rebrand of semantic-sidekick at v1.0.0).\\n\" +\n \"The `semantic-sidekick` command is preserved as an alias.\\n\\n\" +\n \" Start MCP server: semantic-memory --notes ./vault\\n\" +\n \" Show vault stats: semantic-memory --notes ./vault --stats\\n\" +\n \" Force reindex: semantic-memory --notes ./vault --reindex\\n\" +\n \" List MCP tools: semantic-memory tools\\n\" +\n \" Tool details: semantic-memory tools search_semantic\"\n )\n .version(version);\n\nprogram\n .command(\"search <query>\")\n .description(\"Run a vault search and print top hits as JSON (used by activation hooks)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--limit <n>\", \"Max results\", (v) => parseInt(v, 10), 8)\n .option(\"--text-only\", \"Skip embedder — keyword-only search (fast path, no model init)\")\n .option(\"--json\", \"Emit raw JSON (default)\", true)\n .action(async (query: string, opts) => {\n const { runSearch } = await import(\"./search.js\");\n try {\n const hits = await runSearch({\n notes: opts.notes,\n query,\n limit: opts.limit,\n textOnly: opts.textOnly,\n });\n process.stdout.write(JSON.stringify(hits, null, 2) + \"\\n\");\n process.exit(0);\n } catch (err: any) {\n console.error(`search failed: ${err.message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"eval-failures\")\n .description(\"Replay failed tool calls through search and measure how often the top hit answers them (v1.6 failure lookup)\")\n .requiredOption(\"--cases <file>\", \"JSONL of {id, notes, error, command}\")\n .requiredOption(\"--judgments <file>\", \"JSONL of {case, path, relevant}\")\n .option(\"--limit <n>\", \"Hits per search\", (v) => parseInt(v, 10), 5)\n .option(\"--query <mode>\", \"raw (error + command as-is) or normalized (failureQuery)\", \"normalized\")\n .option(\"--target <p>\", \"Target precision for the recommended threshold\", (v) => parseFloat(v), 0.95)\n .option(\"--min-judged <n>\", \"Judged injections needed before a threshold can be recommended\", (v) => parseInt(v, 10), 20)\n .option(\"--unjudged-out <file>\", \"Write unlabelled top hits here (JSONL) for labelling\")\n .option(\"--hits-out <file>\", \"Write every case's hits here (JSONL) for analysis\")\n .option(\"--json\", \"Print the report as JSON\")\n .action(async (opts) => {\n const { openSearch } = await import(\"./search.js\");\n const { evaluateFailures, formatFailureEval } = await import(\"../core/failure-eval.js\");\n const { failureQuery } = await import(\"../core/failure-query.js\");\n const toQuery = (c: { error: string; command: string }) =>\n opts.query === \"raw\" ? `${c.error}\\n${c.command}` : failureQuery(c.error, c.command);\n const readJsonl = (p: string) =>\n readFileSync(resolve(p), \"utf-8\").split(\"\\n\").filter(Boolean).map((l) => JSON.parse(l));\n const cases = readJsonl(opts.cases) as import(\"../core/failure-eval.js\").FailureCase[];\n const judgments = readJsonl(opts.judgments) as import(\"../core/failure-eval.js\").Judgment[];\n\n // one searcher per corpus: the model loads once, not once per case\n const searchers = new Map<string, Awaited<ReturnType<typeof openSearch>>>();\n const results = [];\n for (const c of cases) {\n if (!searchers.has(c.notes)) searchers.set(c.notes, await openSearch(c.notes));\n const hits = await searchers.get(c.notes)!.search(toQuery(c), opts.limit);\n results.push({ case: c.id, hits: hits.map((h) => ({ path: h.path, score: h.score })) });\n }\n const report = evaluateFailures(results, judgments, { targetPrecision: opts.target, minJudged: opts.minJudged });\n if (opts.hitsOut) {\n writeFileSync(resolve(opts.hitsOut), results.map((r) => JSON.stringify(r)).join(\"\\n\") + \"\\n\");\n }\n if (opts.unjudgedOut) {\n writeFileSync(resolve(opts.unjudgedOut), report.unjudged.map((u) => JSON.stringify(u)).join(\"\\n\") + \"\\n\");\n }\n console.log(opts.json ? JSON.stringify(report, null, 2) : formatFailureEval(report, `query: ${opts.query}`));\n process.exit(0);\n });\n\nprogram\n .command(\"lint\")\n .description(\"Lint the vault against vault.schema.yml (schema violations + missing provenance + stale)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--rule <name>\", \"Limit output to one rule: schema_violations | missing_provenance | stale\")\n .option(\"--json\", \"Emit JSON instead of the human-readable report\")\n .option(\"--strict\", \"Exit non-zero on warnings too (default: exit non-zero only on errors)\")\n .action(async (opts) => {\n const { lintVault, formatLintReport } = await import(\"../core/lint.js\");\n const report = await lintVault(resolve(opts.notes));\n // Use console.log + process.exitCode (not process.exit) so Node flushes\n // stdout fully before the process ends. Early process.exit with a large\n // buffered JSON payload can truncate output.\n if (opts.json) {\n const out = opts.rule ? report.byRule[opts.rule as keyof typeof report.byRule] : report;\n console.log(JSON.stringify(out, null, 2));\n } else {\n console.log(formatLintReport(report, { rule: opts.rule }));\n }\n const bad = opts.strict ? report.counts.errors + report.counts.warnings : report.counts.errors;\n process.exitCode = bad > 0 ? 1 : 0;\n });\n\nprogram\n .command(\"log-event\")\n .description(\"Append a structured event to the vault's log.md (used by hooks and CI scripts — same shape as mcp__semantic-vault__log_event)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .requiredOption(\"--kind <name>\", \"Event category: ingest, synthesis, error, mode_change, etc.\")\n .requiredOption(\"--summary <text>\", \"One-line human summary\")\n .option(\"--payload <json>\", \"Structured payload as JSON string\")\n .action(async (opts) => {\n const { logEvent } = await import(\"../core/log.js\");\n let payload: Record<string, unknown> | undefined;\n if (opts.payload) {\n try {\n payload = JSON.parse(opts.payload);\n } catch (e: any) {\n console.error(`invalid --payload JSON: ${e.message}`);\n process.exitCode = 1;\n return;\n }\n }\n try {\n const entry = await logEvent(resolve(opts.notes), {\n kind: opts.kind,\n summary: opts.summary,\n payload,\n });\n console.log(JSON.stringify(entry));\n } catch (e: any) {\n console.error(`log-event failed: ${e.message}`);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"log-query\")\n .description(\"Read structured log entries from log.md — filters by kind, date range, limit\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--kind <name>\", \"Filter by kind (ingest, synthesis, error, mode_change, etc.)\")\n .option(\"--after <iso>\", \"ISO timestamp — only entries on or after\")\n .option(\"--before <iso>\", \"ISO timestamp — only entries on or before\")\n .option(\"--limit <n>\", \"Max entries (most recent)\", (v) => parseInt(v, 10))\n .action(async (opts) => {\n const { logQuery } = await import(\"../core/log.js\");\n try {\n const entries = await logQuery(resolve(opts.notes), {\n kind: opts.kind,\n after: opts.after,\n before: opts.before,\n limit: opts.limit,\n });\n console.log(JSON.stringify(entries));\n } catch (e: any) {\n console.error(`log-query failed: ${e.message}`);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"install-schema\")\n .description(\"Bootstrap vault.schema.yml in the vault root with the default schema\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--force\", \"Overwrite existing schema file\")\n .action(async (opts) => {\n const { installDefaultSchema } = await import(\"../core/schema.js\");\n const r = await installDefaultSchema(resolve(opts.notes), opts.force);\n console.log(r.written ? `Installed default schema: ${r.path}` : `Schema already exists: ${r.path} (use --force to overwrite)`);\n process.exit(0);\n });\n\nprogram\n .command(\"tools [name]\")\n .description(\"List all MCP tools, or show details for a specific tool\")\n .action((name?: string) => {\n if (name) {\n printToolDetail(name);\n } else {\n printToolList();\n }\n process.exit(0);\n });\n\nprogram\n .command(\"serve\", { isDefault: true })\n .description(\"Start the MCP server (default command)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--reindex\", \"Force full reindex and exit\")\n .option(\"--stats\", \"Show vault statistics and exit\")\n .option(\"--wait-for-ready\", \"Block startup until index is fully built before serving (default: index in background; tools return 'Indexing in progress' until ready)\")\n .option(\"--read-only\", \"Suppress write tools (create_note, update_note, delete_note, move_note, update_frontmatter, manage_tags, rename_tag, log_event, ...) — use for shared docs vaults owned by another tool\")\n .option(\"--model <name>\", \"Embedding model to use (default: all-MiniLM-L6-v2, fast; use nomic-ai/nomic-embed-text-v1.5 for higher quality)\")\n .option(\"--workers <n>\", \"Number of worker threads for parallel embedding\", parseInt)\n .option(\"--batch-size <n>\", \"Texts per ONNX forward pass (default: 8)\", parseInt)\n .option(\"--no-quantized\", \"Use full-precision model instead of quantized (slower, slightly higher quality)\")\n .option(\"--no-watch\", \"Disable file watcher\")\n .action(async (opts) => {\n const notesPath = resolve(opts.notes);\n\n if (!existsSync(notesPath)) {\n console.error(`Error: notes directory not found: ${notesPath}`);\n process.exit(1);\n }\n\n if (opts.stats) {\n const { Indexer } = await import(\"../core/indexer.js\");\n const indexer = new Indexer(notesPath);\n const docs = await indexer.indexAll();\n console.log(`Notes: ${docs.length}`);\n console.log(`Chunks: ${docs.reduce((n: number, d: any) => n + d.chunks.length, 0)}`);\n console.log(`Wikilinks: ${docs.reduce((n: number, d: any) => n + d.wikilinks.length, 0)}`);\n console.log(`Tags: ${new Set(docs.flatMap((d: any) => d.tags)).size} unique`);\n process.exit(0);\n }\n\n if (opts.reindex) {\n const { createServer } = await import(\"../mcp/server.js\");\n await createServer(notesPath, {\n watch: false,\n waitForReady: true,\n model: opts.model,\n workers: opts.workers,\n batchSize: opts.batchSize,\n quantized: opts.quantized,\n onProgress: (embedded, total) => {\n process.stderr.write(`\\rEmbedding ${embedded}/${total} chunks...`);\n },\n });\n process.stderr.write(\"\\n\");\n console.log(\"Reindex complete.\");\n process.exit(0);\n }\n\n // Default: start MCP server on stdio\n const { startServer } = await import(\"../mcp/server.js\");\n await startServer(notesPath, {\n watch: opts.watch,\n waitForReady: opts.waitForReady,\n model: opts.model,\n workers: opts.workers,\n batchSize: opts.batchSize,\n quantized: opts.quantized,\n readOnly: opts.readOnly,\n });\n });\n\nregisterUpdateCommands(program, {\n packageName: PKG_NAME,\n pluginName: \"semantic-memory\",\n configFile: \"semantic-memory.json\",\n onAfterUpdate: (cwd) => runRelink(cwd),\n});\n\nprogram\n .command(\"normalize-config\")\n .description(\n \"Rewrite fragile `npx @latest` entries in .mcp.json to the stable node-against-node_modules form (with backup and validation)\",\n )\n .option(\"--dry-run\", \"print the proposed changes but don't write\")\n .action((opts: { dryRun?: boolean }) => {\n const cwd = process.cwd();\n const mcpPath = join(cwd, \".mcp.json\");\n if (!existsSync(mcpPath)) {\n console.log(\"no .mcp.json in current directory — nothing to do\");\n process.exit(0);\n }\n const data = readJsonSafe(mcpPath);\n if (!data || typeof data !== \"object\" || !data.mcpServers || typeof data.mcpServers !== \"object\") {\n console.error(`could not parse ${mcpPath}`);\n process.exit(1);\n }\n const bin = localBinArg(cwd);\n if (!bin) {\n console.error(\n `no local install found at ./node_modules/@theglitchking/semantic-memory/bin/semantic-memory ` +\n `(or the legacy semantic-sidekick path).\\n` +\n `run 'npm install --save @theglitchking/semantic-memory' first, then re-run this command.`,\n );\n process.exit(1);\n }\n const rewritten: string[] = [];\n for (const [key, entry] of Object.entries<any>(data.mcpServers)) {\n if (!isNpxForm(entry)) continue;\n const notes = extractNotesPath(entry) ?? \"./.claude/.vault\";\n const extra = extractExtraFlags(entry);\n data.mcpServers[key] = {\n type: \"stdio\",\n command: \"node\",\n args: [bin, \"--notes\", notes, ...extra],\n };\n rewritten.push(key);\n }\n if (rewritten.length === 0) {\n console.log(\"no npx-form entries found — .mcp.json is already in the stable form.\");\n process.exit(0);\n }\n console.log(`Rewriting ${rewritten.length} entr${rewritten.length === 1 ? \"y\" : \"ies\"}: ${rewritten.join(\", \")}`);\n if (opts.dryRun) {\n console.log(\"--- proposed .mcp.json:\");\n console.log(JSON.stringify(data, null, 2));\n console.log(\"--- (dry-run; no changes written)\");\n process.exit(0);\n }\n // Back up\n const bakPath = join(dirname(mcpPath), \".mcp.json.bak\");\n try {\n writeFileSync(bakPath, readFileSync(mcpPath, \"utf8\"));\n console.log(`backup written: ${bakPath}`);\n } catch (err: any) {\n console.error(`could not write backup: ${err.message}`);\n process.exit(1);\n }\n writeFileSync(mcpPath, JSON.stringify(data, null, 2) + \"\\n\");\n\n // Verify the local bin starts cleanly. We just run --version — fast and\n // enough to catch ERR_MODULE_NOT_FOUND type failures.\n const verify = spawnSync(\"node\", [bin, \"--version\"], { cwd, stdio: \"pipe\", timeout: 15_000 });\n if (verify.status !== 0) {\n console.error(`verification failed (exit ${verify.status}):\\n${verify.stderr?.toString() || \"\"}`);\n console.error(`rolling back from ${bakPath}`);\n writeFileSync(mcpPath, readFileSync(bakPath, \"utf8\"));\n process.exit(1);\n }\n console.log(`✓ .mcp.json normalized and verified. Toggle the MCPs in /mcp to reconnect.`);\n process.exit(0);\n });\n\nprogram\n .command(\"healthcheck\")\n .description(\n \"Verify the local install starts cleanly + run drift detection. Self-heals common npx-cache corruption (ERR_MODULE_NOT_FOUND). With --fast, skips the slow tier (full vault lint). With --fix, auto-applies safe fixes for fixable findings.\",\n )\n .option(\"--fast\", \"Run only the fast-tier drift checks (file-system probes). Skips the slow tier (full vault lint).\", false)\n .option(\"--json\", \"Emit structured JSON output instead of human-readable text.\", false)\n .option(\"--fix\", \"Auto-apply safe fixes for fixable drift findings (re-link skills, reconcile .mcp.json, reindex, migrate state). Findings that need human review are reported, not touched.\", false)\n .action(async (opts) => {\n const cwd = process.cwd();\n const bin = findLocalBin(cwd);\n if (!bin) {\n console.error(`no local install at ./node_modules/@theglitchking/semantic-memory/bin/semantic-memory (or legacy semantic-sidekick path)`);\n console.error(`run 'npm install --save @theglitchking/semantic-memory' to install.`);\n process.exit(1);\n }\n\n // 1. Warn if .mcp.json uses the fragile form.\n const mcpPath = join(cwd, \".mcp.json\");\n if (existsSync(mcpPath) && !opts.json) {\n const data = readJsonSafe(mcpPath);\n const entries = data?.mcpServers && typeof data.mcpServers === \"object\" ? Object.entries<any>(data.mcpServers) : [];\n const fragile = entries.filter(([, e]) => isNpxForm(e)).map(([k]) => k);\n if (fragile.length > 0) {\n console.warn(`⚠️ .mcp.json uses the fragile npx-@latest form for: ${fragile.join(\", \")}`);\n console.warn(` Rewrite to the stable form:`);\n console.warn(` npx --no @theglitchking/semantic-memory normalize-config`);\n }\n }\n\n // 2. Smoke-test the local bin (with npx-cache self-heal on ERR_MODULE_NOT_FOUND).\n // Unlike prior versions, this does NOT exit early — drift detection and\n // --fix always run afterwards.\n let smokeOk = false;\n let smokeVersion = \"\";\n {\n const r = spawnSync(\"node\", [bin, \"--version\"], { cwd, stdio: \"pipe\", timeout: 15_000 });\n if (r.status === 0) {\n smokeOk = true;\n smokeVersion = r.stdout?.toString().trim() ?? \"\";\n } else {\n const stderr = r.stderr?.toString() ?? \"\";\n if (stderr.includes(\"ERR_MODULE_NOT_FOUND\")) {\n const match = stderr.match(/([\\/~][^'\"\\s]*\\/_npx\\/[^\\/'\"\\s]+)/);\n if (match) {\n const bad = match[1];\n if (!opts.json) console.warn(`detected broken npx cache at ${bad} — clearing and retrying...`);\n try { rmSync(bad, { recursive: true, force: true }); } catch {}\n const r2 = spawnSync(\"node\", [bin, \"--version\"], { cwd, stdio: \"pipe\", timeout: 15_000 });\n if (r2.status === 0) {\n smokeOk = true;\n smokeVersion = r2.stdout?.toString().trim() ?? \"\";\n } else if (!opts.json) {\n console.error(`retry still failed:\\n${r2.stderr?.toString() || \"\"}`);\n }\n }\n }\n if (!smokeOk && !opts.json && stderr) console.error(stderr);\n }\n }\n if (smokeOk && !opts.json) console.log(`✓ local install starts cleanly (v${smokeVersion})`);\n\n // 3. Run drift detection.\n const { runHealthcheck, formatDriftBanner, filterToDrift } = await import(\"../core/healthcheck.js\");\n const vaultCandidate = join(cwd, \".claude\", \".vault\");\n const vaultPath = existsSync(vaultCandidate) ? vaultCandidate : undefined;\n let result = await runHealthcheck({ projectRoot: cwd, vaultPath, tier: opts.fast ? \"fast\" : \"all\", force: true });\n\n // 4. Apply fixes if requested.\n let fixOutcomes: FixOutcome[] = [];\n let plan = { fixes: [] as PlannedFix[], skipped: [] as { check: string; reason: string }[] };\n if (opts.fix) {\n plan = planFixes(filterToDrift(result));\n if (plan.fixes.length > 0) {\n fixOutcomes = await executeFixes(cwd, plan.fixes);\n // Re-run fast-tier drift to reflect the post-fix state.\n result = await runHealthcheck({ projectRoot: cwd, vaultPath, tier: opts.fast ? \"fast\" : \"all\", force: true });\n }\n }\n\n // 5. Emit.\n if (opts.json) {\n console.log(JSON.stringify({ smoke: { ok: smokeOk, version: smokeVersion }, result, fix: opts.fix ? { plan, outcomes: fixOutcomes } : undefined }, null, 2));\n } else {\n if (opts.fix) {\n if (fixOutcomes.length === 0 && plan.skipped.length === 0) {\n console.log(`\\n✓ nothing to fix`);\n } else {\n console.log(`\\n--fix applied ${fixOutcomes.filter((o) => o.status === \"fixed\").length}/${fixOutcomes.length} action(s):`);\n for (const o of fixOutcomes) console.log(` ${o.status === \"fixed\" ? \"✓\" : \"✗\"} ${o.action} (${o.check}) — ${o.detail}`);\n for (const s of plan.skipped) console.log(` • skipped ${s.check} — ${s.reason}`);\n }\n }\n const banner = formatDriftBanner(result);\n if (banner) {\n console.log(\"\");\n console.log(banner);\n } else {\n console.log(`\\n✓ no drift detected (${result.findings.length} checks ran in ${result.duration_ms}ms)`);\n }\n }\n\n process.exit(smokeOk ? 0 : 1);\n });\n\n// --- Skill bundler (Phase 6) ---\n\nfunction parseAgent(input: string): AgentName {\n const a = input.toLowerCase();\n if (!SKILL_BUNDLER_AGENTS.includes(a as AgentName)) {\n console.error(`Unknown agent: ${input}. Supported: ${SKILL_BUNDLER_AGENTS.join(\", \")}.`);\n process.exit(2);\n }\n return a as AgentName;\n}\n\nfunction parseScope(input: string): Scope {\n if (input !== \"global\" && input !== \"local\") {\n console.error(`Unknown scope: ${input}. Use 'global' or 'local'.`);\n process.exit(2);\n }\n return input;\n}\n\nfunction findSourceRoot(): string {\n // 1. Installed: <cwd>/node_modules/@theglitchking/semantic-sidekick or semantic-memory\n for (const pkg of [\"semantic-memory\", \"semantic-sidekick\"]) {\n const installed = join(process.cwd(), \"node_modules\", \"@theglitchking\", pkg);\n if (existsSync(installed)) return installed;\n }\n // 2. Dev: derive from the bin location (this file lives at <root>/dist/cli/index.js)\n const dev = resolve(new URL(\"../../\", import.meta.url).pathname);\n return dev;\n}\n\nconst skillsCmd = program.command(\"skills\").description(\"Install, target, or uninstall skill bundles for non-Claude agents (codex, copilot, pi). Claude installs continue to use the npm postinstall flow.\");\n\nskillsCmd\n .command(\"targets\")\n .description(\"Preview where skill bundles would be installed for one or more agents.\")\n .option(\"--agent <name...>\", \"One or more agents (default: all). Repeatable.\", undefined as any)\n .option(\"--scope <scope>\", \"global or local (default: local)\", \"local\")\n .option(\"--project <path>\", \"Project root for local-scope paths (default: cwd)\", process.cwd())\n .action((opts) => {\n const scope = parseScope(opts.scope);\n const agents: AgentName[] = (opts.agent && opts.agent.length > 0 ? opts.agent : SKILL_BUNDLER_AGENTS).map(parseAgent);\n const out = agents.map((a) => resolveTarget(a, scope, opts.project));\n console.log(JSON.stringify(out, null, 2));\n });\n\nskillsCmd\n .command(\"install\")\n .description(\"Install skill bundles into an agent's skill directory. Non-destructive by default; --force to overwrite.\")\n .requiredOption(\"--agent <name>\", \"Agent runtime (claude, codex, copilot, pi)\")\n .option(\"--scope <scope>\", \"global or local (default: local)\", \"local\")\n .option(\"--project <path>\", \"Project root for local-scope paths (default: cwd)\", process.cwd())\n .option(\"--only <names...>\", \"Restrict to specific skill names (default: all shipped)\")\n .option(\"--force\", \"Overwrite even if drift is detected against an existing manifest\", false)\n .action(async (opts) => {\n const agent = parseAgent(opts.agent);\n const scope = parseScope(opts.scope);\n if (agent === \"claude\") {\n console.error(\n \"Claude skill installs are handled by the npm postinstall (claude-plugin-runtime). \" +\n \"Run `npm install @theglitchking/semantic-memory` instead — that flow symlinks \" +\n \"skills into ~/.claude/skills/ or .claude/skills/ automatically. The skills CLI \" +\n \"is intended for non-Claude agents (codex, copilot, pi) which do not have that \" +\n \"postinstall integration.\"\n );\n process.exit(2);\n }\n const sourceRoot = findSourceRoot();\n const result = await installSkills({\n agent,\n scope,\n sourceRoot,\n projectRoot: opts.project,\n version,\n only: opts.only,\n force: opts.force === true,\n });\n console.log(JSON.stringify(result, null, 2));\n if (result.installed.length === 0 && result.reason) process.exit(1);\n });\n\nskillsCmd\n .command(\"uninstall\")\n .description(\"Remove skill bundles tracked by the semantic-memory manifest. User-written skills outside the manifest are left untouched.\")\n .requiredOption(\"--agent <name>\", \"Agent runtime (claude, codex, copilot, pi)\")\n .option(\"--scope <scope>\", \"global or local (default: local)\", \"local\")\n .option(\"--project <path>\", \"Project root for local-scope paths (default: cwd)\", process.cwd())\n .action(async (opts) => {\n const agent = parseAgent(opts.agent);\n const scope = parseScope(opts.scope);\n if (agent === \"claude\") {\n console.error(\"Claude skill uninstalls go through the npm uninstall flow. The skills CLI is for non-Claude agents.\");\n process.exit(2);\n }\n const result = await uninstallSkills({ agent, scope, projectRoot: opts.project });\n console.log(JSON.stringify(result, null, 2));\n });\n\nskillsCmd\n .command(\"list\")\n .description(\"List the skill bundles shipped with this plugin version.\")\n .action(async () => {\n const sourceRoot = findSourceRoot();\n const shipped = await listShippedSkills(sourceRoot);\n console.log(JSON.stringify(shipped.map((s) => s.name), null, 2));\n });\n\n// --- State migration (Phase 3, v1.2) ---\n\nprogram\n .command(\"migrate-state\")\n .description(\n \"Move legacy .claude/.sidekick-* state files to .claude/.semantic-memory/. Idempotent. \" +\n \"Conflicts (both paths exist) require --force. Pass --dry-run to preview without changes.\",\n )\n .option(\"--dry-run\", \"Print the planned migration without renaming any files.\", false)\n .option(\n \"--force\",\n \"When both old and new paths exist, prefer the new path and delete the old one.\",\n false,\n )\n .option(\"--project <path>\", \"Project root (default: cwd)\", process.cwd())\n .action((opts) => {\n const result = migrateState({\n projectRoot: opts.project,\n dryRun: opts.dryRun === true,\n force: opts.force === true,\n });\n console.log(JSON.stringify(result, null, 2));\n if (result.conflicts.length > 0 && !opts.force && !opts.dryRun) {\n console.error(\n `\\n${result.conflicts.length} conflict${result.conflicts.length === 1 ? \"\" : \"s\"} detected. Re-run with --force to resolve (keeps new path, deletes old).`,\n );\n process.exit(1);\n }\n });\n\n// --- Confidence decay introspection (v1.3) ---\n\nprogram\n .command(\"decay-config\")\n .description(\"Print the active confidence-decay config (shipped defaults + any vault.schema.yml override).\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { loadDecayConfig, DEFAULT_DECAY_CONFIG } = await import(\"../core/decay.js\");\n const cfg = loadDecayConfig(resolve(opts.notes));\n const source = JSON.stringify(cfg) === JSON.stringify(DEFAULT_DECAY_CONFIG) ? \"defaults\" : \"vault.schema.yml (overridden)\";\n console.log(JSON.stringify({ source, config: cfg }, null, 2));\n process.exit(0);\n });\n\nprogram\n .command(\"decay-trace <notePath>\")\n .description(\"Show the decay calculation for one note: type, last_verified, age, half-life, evergreen, multiplier.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (notePath: string, opts) => {\n const { loadDecayConfig, computeDecay, normalizeVerifiedDate } = await import(\"../core/decay.js\");\n const matter = (await import(\"../core/matter.js\")).default;\n const abs = resolve(opts.notes, notePath);\n if (!existsSync(abs)) {\n console.error(`note not found: ${abs}`);\n process.exit(1);\n }\n const { data: fm } = matter(readFileSync(abs, \"utf8\"));\n const lastVerified = normalizeVerifiedDate(fm.last_verified);\n const d = computeDecay({\n type: typeof fm.type === \"string\" ? fm.type : undefined,\n last_verified: lastVerified,\n evergreen: fm.evergreen === true,\n config: loadDecayConfig(resolve(opts.notes)),\n });\n console.log(\n JSON.stringify(\n {\n path: notePath,\n type: fm.type ?? null,\n last_verified: lastVerified ?? null,\n evergreen: fm.evergreen === true,\n multiplier: d.multiplier,\n age_days: Math.round(d.age_days),\n effective_half_life: d.effective_half_life,\n reason: d.reason,\n },\n null,\n 2\n )\n );\n process.exit(0);\n });\n\n// --- Lexicon (v1.4) ---\n\nconst lexiconCmd = program.command(\"lexicon\").description(\"Manage the learned human→artifact lexicon (aliases).\");\n\nlexiconCmd\n .command(\"list\")\n .description(\"List all aliases in the lexicon.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { loadLexiconCache } = await import(\"../core/lexicon.js\");\n console.log(JSON.stringify(await loadLexiconCache(resolve(opts.notes)), null, 2));\n process.exit(0);\n });\n\nlexiconCmd\n .command(\"compile\")\n .description(\"Rebuild the derived lexicon cache from the lexicon/ notes.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { compileLexicon } = await import(\"../core/lexicon.js\");\n const entries = await compileLexicon(resolve(opts.notes));\n console.log(`compiled ${entries.length} alias(es)`);\n process.exit(0);\n });\n\nlexiconCmd\n .command(\"add <canonical> <phrases...>\")\n .description(\"Upsert an alias: a canonical target and the human phrases that refer to it.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--authored\", \"Mark as human-authored (default: learned)\")\n .action(async (canonical: string, phrases: string[], opts) => {\n const { addAlias } = await import(\"../core/lexicon.js\");\n const r = await addAlias(resolve(opts.notes), { canonical, phrases, source: opts.authored ? \"authored\" : \"learned\" });\n console.log(JSON.stringify(r, null, 2));\n process.exit(0);\n });\n\n// --- Entity dossiers (v1.5 Phase 8) ---\n\nconst dossierCmd = program.command(\"dossier\").description(\"Manage entity dossiers — per-component living notes (purpose / failure modes / knobs / incident log / current state).\");\n\ndossierCmd\n .command(\"init <entity>\")\n .description(\"Scaffold a dossier for an entity (no-op if one already exists). Optionally seed aliases and provenance.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--alias <phrase...>\", \"Human phrase(s) for this entity — fed to the lexicon compiler\")\n .option(\"--seeded-from <ref>\", \"Provenance of the scaffold (e.g. a babel-fish project-map entry)\")\n .action(async (entity: string, opts) => {\n const { initDossier } = await import(\"../core/dossier.js\");\n const r = await initDossier(resolve(opts.notes), entity, { aliases: opts.alias, seeded_from: opts.seededFrom });\n console.log(JSON.stringify(r, null, 2));\n process.exit(0);\n });\n\ndossierCmd\n .command(\"list\")\n .description(\"List all dossiers with their entity, aliases, and current state.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { listDossiers } = await import(\"../core/dossier.js\");\n console.log(JSON.stringify(await listDossiers(resolve(opts.notes)), null, 2));\n process.exit(0);\n });\n\n// --- Speaker profile (v1.5 Phase 11) ---\n\nconst profileCmd = program.command(\"profile\").description(\"Manage the speaker profile — how THIS human communicates (severity calibration, chronic omissions, verbosity, shorthand).\");\n\nprofileCmd\n .command(\"init\")\n .description(\"Scaffold profile/speaker.md with the fixed sections (no-op if it exists).\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { initSpeakerProfile } = await import(\"../core/profile.js\");\n const r = await initSpeakerProfile(resolve(opts.notes));\n console.log(JSON.stringify(r, null, 2));\n process.exit(0);\n });\n\nprofileCmd\n .command(\"show\")\n .description(\"Print the speaker profile's injection head (the capped, placeholder-stripped view).\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { readSpeakerProfile } = await import(\"../core/profile.js\");\n const p = await readSpeakerProfile(resolve(opts.notes));\n console.log(p ? p.head || \"(profile is empty — only placeholders)\" : \"(no speaker profile — run `profile init`)\");\n process.exit(0);\n });\n\n// --- Selection-logging telemetry introspection (v1.3.1) ---\n\nprogram\n .command(\"selection-stats\")\n .description(\"Summarize the local selection log: searches, selections, most-cited notes, and retrieved-but-never-cited notes.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--json\", \"Emit raw JSON instead of a human summary\")\n .action(async (opts) => {\n const { computeSelectionStats, selectionLogPath } = await import(\"../core/telemetry.js\");\n const stats = await computeSelectionStats(resolve(opts.notes));\n if (opts.json) {\n console.log(JSON.stringify(stats, null, 2));\n process.exit(0);\n }\n console.log(`Selection log: ${selectionLogPath(resolve(opts.notes))}`);\n console.log(` searches: ${stats.searches}`);\n console.log(` selections: ${stats.selections}`);\n const topCited = Object.entries(stats.citedPaths).sort((a, b) => b[1] - a[1]).slice(0, 10);\n if (topCited.length) {\n console.log(` most cited:`);\n for (const [p, n] of topCited) console.log(` ${n}× ${p}`);\n }\n if (stats.retrievedNeverCited.length) {\n console.log(` retrieved but never cited (${stats.retrievedNeverCited.length}): ${stats.retrievedNeverCited.slice(0, 10).join(\", \")}${stats.retrievedNeverCited.length > 10 ? \" …\" : \"\"}`);\n }\n process.exit(0);\n });\n\nprogram.parse();\n","import type { DriftFinding } from \"./healthcheck.js\";\n\n/**\n * The `--fix` planner. Pure, side-effect-free: it maps drift findings onto safe\n * auto-fix actions, or explains why a finding needs a human. The CLI executes the\n * plan; keeping the decision logic here makes it unit-testable without spawning.\n *\n * \"Safe\" means: idempotent, non-destructive, and derivable from the install itself\n * (re-link skills, reconcile .mcp.json, rebuild the derived index, migrate state).\n * Anything that touches user-authored content (stale notes, broken wikilinks,\n * hand-edited AGENTS.md) is deliberately NOT auto-fixed — it drops to `skipped`\n * with a pointer to the manual remedy.\n */\n\nexport type FixAction = \"skill-link\" | \"mcp-reconcile\" | \"reindex\" | \"state-migrate\";\n\nexport interface PlannedFix {\n check: string;\n action: FixAction;\n summary: string;\n}\n\nexport interface SkippedFinding {\n check: string;\n reason: string;\n}\n\nexport interface FixPlan {\n fixes: PlannedFix[];\n skipped: SkippedFinding[];\n}\n\n/** Human-readable reason a finding is not auto-fixable. */\nconst MANUAL_REASON: Record<string, string> = {\n \"regenerate-contract\":\n \"AGENTS.md needs a human decision — run `/contract` (regenerate_contract), or move custom content into a Local Notes section outside the managed block.\",\n lint_vault:\n \"Vault lint findings (stale notes, broken wikilinks, schema violations) require human review — run `lint_vault` for the full report.\",\n session_staleness:\n \"Resume the session (session_run / session_finish) or remove .claude/.semantic-memory/session.json to abandon it.\",\n};\n\n/**\n * Build the fix plan from a set of drift findings. Only findings with\n * severity !== \"ok\" are considered.\n */\nexport function planFixes(findings: DriftFinding[]): FixPlan {\n const fixes: PlannedFix[] = [];\n const skipped: SkippedFinding[] = [];\n\n for (const f of findings) {\n if (f.severity === \"ok\") continue;\n\n switch (f.fixable_via) {\n case \"skill-link\":\n fixes.push({ check: f.check, action: \"skill-link\", summary: f.summary });\n break;\n case \"mcp-reconcile\":\n fixes.push({ check: f.check, action: \"mcp-reconcile\", summary: f.summary });\n break;\n case \"reindex\":\n fixes.push({ check: f.check, action: \"reindex\", summary: f.summary });\n break;\n case \"state-migrate\":\n fixes.push({ check: f.check, action: \"state-migrate\", summary: f.summary });\n break;\n case \"regenerate-contract\":\n // The only case this fires is a custom AGENTS.md without managed markers,\n // where regeneration would refuse anyway. Treat as human-review.\n skipped.push({ check: f.check, reason: MANUAL_REASON[\"regenerate-contract\"] });\n break;\n default:\n skipped.push({\n check: f.check,\n reason: MANUAL_REASON[f.check] ?? \"No automatic fix available — needs human review.\",\n });\n }\n }\n\n return { fixes, skipped };\n}\n","import { mkdir, readFile, writeFile, copyFile, readdir, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, basename, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\n\nexport type AgentName = \"claude\" | \"codex\" | \"copilot\" | \"pi\";\nexport type Scope = \"global\" | \"local\";\n\nexport interface AgentTargetSpec {\n agent: AgentName;\n scope: Scope;\n /** Absolute resolved path where the skill bundles will land. */\n path: string;\n}\n\nexport interface SkillManifest {\n package: string;\n version: string;\n agent: AgentName;\n scope: Scope;\n installed_at: string;\n skills: { name: string; sha256: string }[];\n}\n\nexport interface InstallResult {\n agent: AgentName;\n scope: Scope;\n target_path: string;\n installed: string[];\n skipped: string[];\n reason?: string;\n manifest_path?: string;\n}\n\nconst MANIFEST_FILE = \".semantic-memory-skill-manifest.json\";\n\n/**\n * Resolve where a given (agent, scope) tuple should land. Project root is required for local\n * scope (to anchor relative paths); for global scope it's not used.\n */\nexport function resolveTarget(agent: AgentName, scope: Scope, projectRoot: string): AgentTargetSpec {\n const root = resolve(projectRoot);\n const home = homedir();\n const map: Record<AgentName, { global: string; local: string }> = {\n claude: { global: join(home, \".claude\", \"skills\"), local: join(root, \".claude\", \"skills\") },\n codex: { global: join(home, \".codex\", \"skills\"), local: join(root, \".codex\", \"skills\") },\n copilot: { global: join(home, \".copilot\", \"skills\"), local: join(root, \".github\", \"skills\") },\n pi: { global: join(home, \".pi\", \"agent\", \"skills\"), local: join(root, \".pi\", \"skills\") },\n };\n return { agent, scope, path: map[agent][scope] };\n}\n\n/**\n * Enumerate the canonical skill bundles shipped by this plugin. Each bundle is a directory\n * under `<sourceRoot>/skills/` containing at least a SKILL.md file. Entries without\n * SKILL.md are silently skipped (allows future non-skill files like `/skills/.gitkeep`).\n */\nexport async function listShippedSkills(sourceRoot: string): Promise<{ name: string; dir: string }[]> {\n const skillsDir = join(sourceRoot, \"skills\");\n if (!existsSync(skillsDir)) return [];\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const out: { name: string; dir: string }[] = [];\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const dir = join(skillsDir, e.name);\n const skillFile = join(dir, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n out.push({ name: e.name, dir });\n }\n return out;\n}\n\nasync function sha256OfFile(path: string): Promise<string> {\n const buf = await readFile(path);\n return createHash(\"sha256\").update(buf).digest(\"hex\");\n}\n\n/**\n * Copy a single skill bundle (SKILL.md plus any sibling files in the same directory) into\n * the target directory, overlaying it with the agent name. Returns the list of files written.\n *\n * The target layout is `<targetPath>/<skillName>/SKILL.md` plus mirrored siblings, so each\n * bundle is namespaced and easy to remove later.\n */\nasync function copyBundle(srcDir: string, destDir: string): Promise<string[]> {\n await mkdir(destDir, { recursive: true });\n const entries = await readdir(srcDir, { withFileTypes: true });\n const written: string[] = [];\n for (const e of entries) {\n const src = join(srcDir, e.name);\n const dest = join(destDir, e.name);\n if (e.isDirectory()) {\n const childWritten = await copyBundle(src, dest);\n written.push(...childWritten);\n continue;\n }\n if (!e.isFile()) continue;\n await copyFile(src, dest);\n written.push(dest);\n }\n return written;\n}\n\nexport interface InstallOptions {\n agent: AgentName;\n scope: Scope;\n /** Path to the package's source root (usually the repo root, where `skills/` lives). */\n sourceRoot: string;\n /** Used to anchor local-scope target paths. */\n projectRoot: string;\n /** Plugin version, recorded in the manifest. */\n version: string;\n /** Specific skills to install. When omitted, all shipped skills are installed. */\n only?: string[];\n /**\n * When false, refuse to overwrite an existing install (manifest present + sha mismatch\n * indicates upstream drift). When true, overwrite. Default false.\n */\n force?: boolean;\n}\n\n/**\n * Install all (or selected) skill bundles into an agent's skill directory.\n *\n * Behavior:\n * - Resolves the destination via resolveTarget.\n * - Reads any existing manifest. If a manifest exists, version differs from `version`,\n * AND any skill sha256 differs from the source: this is a drift event. Without\n * `force: true`, returns a refusal with reason \"drift detected\". With force, proceeds\n * and overwrites.\n * - For each shipped skill (or each in `only`), copies the bundle into\n * <target>/<skillName>/, overwriting any existing files in that subdirectory.\n * - Writes a fresh manifest at <target>/<MANIFEST_FILE> recording sha256 of each\n * SKILL.md installed, the plugin version, agent, and scope.\n */\nexport async function installSkills(opts: InstallOptions): Promise<InstallResult> {\n const target = resolveTarget(opts.agent, opts.scope, opts.projectRoot);\n const shipped = await listShippedSkills(opts.sourceRoot);\n const filter = opts.only && opts.only.length > 0 ? new Set(opts.only) : null;\n const toInstall = filter ? shipped.filter((s) => filter.has(s.name)) : shipped;\n\n if (toInstall.length === 0) {\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n installed: [],\n skipped: [],\n reason: filter ? `No matching skills found (only=${[...filter].join(\",\")}).` : \"No shipped skills found at sourceRoot/skills/.\",\n };\n }\n\n const manifestPath = join(target.path, MANIFEST_FILE);\n const existing = await readManifest(manifestPath);\n\n if (existing && !opts.force) {\n const drift = await detectDrift(existing, toInstall);\n if (drift.length > 0) {\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n installed: [],\n skipped: toInstall.map((s) => s.name),\n reason: `Drift detected on ${drift.length} skill(s): ${drift.join(\", \")}. Pass --force to overwrite.`,\n manifest_path: manifestPath,\n };\n }\n }\n\n await mkdir(target.path, { recursive: true });\n const installed: string[] = [];\n const skillEntries: { name: string; sha256: string }[] = [];\n for (const skill of toInstall) {\n const destDir = join(target.path, skill.name);\n await copyBundle(skill.dir, destDir);\n const skillFile = join(skill.dir, \"SKILL.md\");\n skillEntries.push({ name: skill.name, sha256: await sha256OfFile(skillFile) });\n installed.push(skill.name);\n }\n\n const manifest: SkillManifest = {\n package: \"@theglitchking/semantic-memory\",\n version: opts.version,\n agent: opts.agent,\n scope: opts.scope,\n installed_at: new Date().toISOString(),\n skills: skillEntries,\n };\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n installed,\n skipped: [],\n manifest_path: manifestPath,\n };\n}\n\nexport interface UninstallOptions {\n agent: AgentName;\n scope: Scope;\n projectRoot: string;\n}\n\nexport interface UninstallResult {\n agent: AgentName;\n scope: Scope;\n target_path: string;\n removed: string[];\n manifest_present: boolean;\n reason?: string;\n}\n\n/**\n * Remove only the skill bundles tracked in the manifest. User-written skills outside\n * the manifest are left untouched.\n */\nexport async function uninstallSkills(opts: UninstallOptions): Promise<UninstallResult> {\n const target = resolveTarget(opts.agent, opts.scope, opts.projectRoot);\n const manifestPath = join(target.path, MANIFEST_FILE);\n const manifest = await readManifest(manifestPath);\n if (!manifest) {\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n removed: [],\n manifest_present: false,\n reason: \"No semantic-memory manifest found — nothing to uninstall.\",\n };\n }\n const removed: string[] = [];\n for (const skill of manifest.skills) {\n const dir = join(target.path, skill.name);\n if (existsSync(dir)) {\n await rm(dir, { recursive: true, force: true });\n removed.push(skill.name);\n }\n }\n await rm(manifestPath, { force: true });\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n removed,\n manifest_present: true,\n };\n}\n\nasync function readManifest(path: string): Promise<SkillManifest | null> {\n if (!existsSync(path)) return null;\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed?.package !== \"string\") return null;\n return parsed as SkillManifest;\n } catch {\n return null;\n }\n}\n\nasync function detectDrift(\n existing: SkillManifest,\n toInstall: { name: string; dir: string }[]\n): Promise<string[]> {\n const driftNames: string[] = [];\n const existingByName = new Map(existing.skills.map((s) => [s.name, s.sha256]));\n for (const skill of toInstall) {\n const sourceSha = await sha256OfFile(join(skill.dir, \"SKILL.md\"));\n const existingSha = existingByName.get(skill.name);\n if (existingSha !== undefined && existingSha !== sourceSha) {\n driftNames.push(skill.name);\n }\n }\n return driftNames;\n}\n\nexport const SKILL_BUNDLER_AGENTS: AgentName[] = [\"claude\", \"codex\", \"copilot\", \"pi\"];\n","import { existsSync, mkdirSync, statSync, renameSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * State files that moved/renamed in v1.2.\n *\n * Each entry: legacy path (relative to <projectRoot>/.claude) → new path (relative to\n * <projectRoot>/.claude). Reads in v1.x check new first, fall back to old; writes always\n * go to new. This command does the explicit move so the legacy files stop existing.\n *\n * Order matters only for human-readable output; the migrations themselves are independent.\n */\nconst STATE_MIGRATIONS: { name: string; old: string; new: string }[] = [\n { name: \"mode\", old: \".sidekick-mode\", new: \".semantic-memory/mode\" },\n { name: \"fingerprints\", old: \".sidekick-fingerprints.json\", new: \".semantic-memory/fingerprints.json\" },\n { name: \"capture-pending\", old: \".sidekick-capture-pending.json\", new: \".semantic-memory/capture-pending.json\" },\n];\n\nexport type MigrationStatus = \"migrated\" | \"skipped-no-source\" | \"skipped-already-migrated\" | \"conflict\" | \"resolved-by-force\";\n\nexport interface MigrationFinding {\n name: string;\n status: MigrationStatus;\n oldPath: string;\n newPath: string;\n detail?: string;\n}\n\nexport interface MigrateStateOptions {\n projectRoot: string;\n dryRun?: boolean;\n force?: boolean;\n}\n\nexport interface MigrateStateResult {\n migrated: MigrationFinding[];\n skipped: MigrationFinding[];\n conflicts: MigrationFinding[];\n}\n\n/**\n * Move legacy `.claude/.sidekick-*` state files to the canonical\n * `.claude/.semantic-memory/<name>` paths.\n *\n * Behavior per file:\n * - old exists, new does not → MIGRATE: rename old to new\n * - old does not exist → SKIP (skipped-no-source)\n * - old does not exist, new exists → SKIP (skipped-already-migrated)\n * - both old and new exist → CONFLICT (refused without --force)\n * With --force: prefer new, delete old\n *\n * Idempotent: a second run after a successful migration is all-no-ops.\n */\nexport function migrateState(opts: MigrateStateOptions): MigrateStateResult {\n const result: MigrateStateResult = {\n migrated: [],\n skipped: [],\n conflicts: [],\n };\n\n const stateDir = join(opts.projectRoot, \".claude\", \".semantic-memory\");\n if (!opts.dryRun && !existsSync(stateDir)) {\n mkdirSync(stateDir, { recursive: true });\n }\n\n for (const m of STATE_MIGRATIONS) {\n const oldPath = join(opts.projectRoot, \".claude\", m.old);\n const newPath = join(opts.projectRoot, \".claude\", m.new);\n const oldExists = existsSync(oldPath);\n const newExists = existsSync(newPath);\n\n if (!oldExists && !newExists) {\n result.skipped.push({ name: m.name, status: \"skipped-no-source\", oldPath, newPath, detail: \"neither path exists\" });\n continue;\n }\n if (!oldExists && newExists) {\n result.skipped.push({ name: m.name, status: \"skipped-already-migrated\", oldPath, newPath, detail: \"already at new path\" });\n continue;\n }\n if (oldExists && newExists) {\n if (!opts.force) {\n const oldMtime = safeMtime(oldPath);\n const newMtime = safeMtime(newPath);\n result.conflicts.push({\n name: m.name,\n status: \"conflict\",\n oldPath,\n newPath,\n detail: `both paths exist (old: ${oldMtime}, new: ${newMtime}); pass --force to keep new and delete old`,\n });\n continue;\n }\n // --force: prefer new, delete old\n if (!opts.dryRun) {\n try { unlinkSync(oldPath); } catch (e: any) {\n result.conflicts.push({ name: m.name, status: \"conflict\", oldPath, newPath, detail: `force-delete of old failed: ${e?.message ?? e}` });\n continue;\n }\n }\n result.migrated.push({\n name: m.name,\n status: \"resolved-by-force\",\n oldPath,\n newPath,\n detail: opts.dryRun ? \"dry-run: would delete old\" : \"old deleted; new preserved\",\n });\n continue;\n }\n // oldExists && !newExists → migrate\n if (!opts.dryRun) {\n try { renameSync(oldPath, newPath); } catch (e: any) {\n // Cross-device rename failure is theoretically possible; for state files all\n // under .claude/, both paths are the same filesystem in practice.\n result.conflicts.push({ name: m.name, status: \"conflict\", oldPath, newPath, detail: `rename failed: ${e?.message ?? e}` });\n continue;\n }\n }\n result.migrated.push({\n name: m.name,\n status: \"migrated\",\n oldPath,\n newPath,\n detail: opts.dryRun ? \"dry-run: would rename old to new\" : \"renamed\",\n });\n }\n\n return result;\n}\n\nfunction safeMtime(path: string): string {\n try {\n return statSync(path).mtime.toISOString();\n } catch {\n return \"unknown\";\n }\n}\n"],"mappings":"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","names":["resolve","join","existsSync","existsSync","join","join","resolve","existsSync","resolve","existsSync","join"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/core/healthcheck-fix.ts","../../src/cli/skills.ts","../../src/cli/migrate-state.ts","../../src/cli/features.ts","../../src/cli/skill-loop.ts","../../src/cli/skill-eval.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from \"commander\";\nimport { resolve, join, dirname, relative } from \"node:path\";\nimport { existsSync, readFileSync, writeFileSync, rmSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { spawnSync } from \"node:child_process\";\nimport { pathToFileURL } from \"node:url\";\nimport { planFixes, type PlannedFix } from \"../core/healthcheck-fix.js\";\nimport { registerUpdateCommands } from \"@theglitchking/claude-plugin-runtime\";\nimport {\n resolveTarget,\n installSkills,\n uninstallSkills,\n listShippedSkills,\n SKILL_BUNDLER_AGENTS,\n type AgentName,\n type Scope,\n} from \"./skills.js\";\nimport { migrateState } from \"./migrate-state.js\";\nimport { registerFeatureCommands } from \"./features.js\";\nimport { registerSkillLoopCommands, skillLoopStatus } from \"./skill-loop.js\";\nimport { registerSkillEvalCommands } from \"./skill-eval.js\";\nimport { featureState, describeFeature } from \"../core/features.js\";\n\nconst require_ = createRequire(import.meta.url);\nconst { version } = require_(\"../../package.json\") as { version: string };\n\nconst PKG_NAME = \"@theglitchking/semantic-memory\";\nconst LEGACY_PKG_NAME = \"@theglitchking/semantic-sidekick\";\n\nfunction runRelink(cwd: string) {\n const candidates = [\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-memory\", \"scripts\", \"link-skills.js\"),\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-sidekick\", \"scripts\", \"link-skills.js\"),\n resolve(process.cwd(), \"scripts\", \"link-skills.js\"),\n ];\n const script = candidates.find((p) => existsSync(p));\n if (!script) {\n console.error(\"link-skills.js not found — is the package installed?\");\n return;\n }\n spawnSync(process.execPath, [script], {\n cwd,\n env: { ...process.env, INIT_CWD: cwd },\n stdio: \"inherit\",\n });\n}\n\ninterface FixOutcome {\n check: string;\n action: string;\n status: \"fixed\" | \"failed\";\n detail: string;\n}\n\n/**\n * Execute a `--fix` plan. Actions are de-duplicated (running skill-link once\n * covers every skill-link finding) and each is best-effort: a failure is captured\n * as an outcome, never thrown. Returns one outcome per distinct action attempted.\n */\nasync function executeFixes(cwd: string, fixes: PlannedFix[]): Promise<FixOutcome[]> {\n const outcomes: FixOutcome[] = [];\n const actions = [...new Set(fixes.map((f) => f.action))];\n for (const action of actions) {\n const checks = fixes.filter((f) => f.action === action).map((f) => f.check).join(\", \");\n try {\n switch (action) {\n case \"skill-link\": {\n runRelink(cwd);\n outcomes.push({ check: checks, action, status: \"fixed\", detail: \"re-linked skills\" });\n break;\n }\n case \"state-migrate\": {\n const r = migrateState({ projectRoot: cwd, force: true });\n outcomes.push({\n check: checks,\n action,\n status: \"fixed\",\n detail: `migrated ${r.migrated.length} file(s), resolved ${r.conflicts.length} conflict(s)`,\n });\n break;\n }\n case \"mcp-reconcile\": {\n const reconcilePath = join(findSourceRoot(), \"hooks\", \"reconcile.js\");\n if (!existsSync(reconcilePath)) {\n outcomes.push({ check: checks, action, status: \"failed\", detail: \"reconcile.js not found\" });\n break;\n }\n const mod = await import(pathToFileURL(reconcilePath).href);\n mod.reconcile(cwd);\n outcomes.push({ check: checks, action, status: \"fixed\", detail: \"reconciled .mcp.json\" });\n break;\n }\n case \"reindex\": {\n const bin = findLocalBin(cwd);\n if (!bin) {\n outcomes.push({ check: checks, action, status: \"failed\", detail: \"no local bin to run reindex\" });\n break;\n }\n const vault = join(cwd, \".claude\", \".vault\");\n const r = spawnSync(\"node\", [bin, \"--notes\", vault, \"--reindex\"], { cwd, stdio: \"pipe\", timeout: 120_000 });\n if (r.status === 0) {\n outcomes.push({ check: checks, action, status: \"fixed\", detail: \"reindexed vault\" });\n } else {\n outcomes.push({ check: checks, action, status: \"failed\", detail: (r.stderr?.toString() || \"reindex failed\").slice(0, 200) });\n }\n break;\n }\n }\n } catch (err: any) {\n outcomes.push({ check: checks, action, status: \"failed\", detail: err?.message ?? String(err) });\n }\n }\n return outcomes;\n}\n\nfunction findLocalBin(cwd: string): string | null {\n const candidates = [\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-memory\", \"bin\", \"semantic-memory\"),\n join(cwd, \"node_modules\", \"@theglitchking\", \"semantic-sidekick\", \"bin\", \"semantic-sidekick\"),\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction localBinArg(cwd: string): string | null {\n const abs = findLocalBin(cwd);\n if (!abs) return null;\n const rel = relative(cwd, abs);\n return rel.startsWith(\"..\") ? abs : `./${rel}`;\n}\n\nfunction readJsonSafe(path: string): any {\n try {\n const raw = readFileSync(path, \"utf8\");\n return raw.trim() ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns the fragile npx-form pattern we used to write in pre-0.10.0\n * SessionStart hooks, so normalize-config can detect and rewrite it.\n */\nfunction isNpxForm(entry: any): boolean {\n if (!entry || typeof entry !== \"object\") return false;\n const cmd = entry.command;\n const args = Array.isArray(entry.args) ? entry.args : [];\n return (\n cmd === \"npx\" &&\n args.some(\n (a: unknown) => typeof a === \"string\" && (a.includes(PKG_NAME) || a.includes(LEGACY_PKG_NAME))\n )\n );\n}\n\nfunction isLocalForm(entry: any): boolean {\n if (!entry || typeof entry !== \"object\") return false;\n const cmd = entry.command;\n const args = Array.isArray(entry.args) ? entry.args : [];\n return (\n cmd === \"node\" &&\n args.some(\n (a: unknown) =>\n typeof a === \"string\" &&\n (a.includes(\"node_modules/@theglitchking/semantic-memory\") ||\n a.includes(\"node_modules/@theglitchking/semantic-sidekick\"))\n )\n );\n}\n\nfunction extractNotesPath(entry: any): string | null {\n const args = Array.isArray(entry?.args) ? entry.args : [];\n const i = args.indexOf(\"--notes\");\n if (i === -1 || i + 1 >= args.length) return null;\n return String(args[i + 1]);\n}\n\nfunction extractExtraFlags(entry: any): string[] {\n const args = Array.isArray(entry?.args) ? entry.args : [];\n return args.filter((a: unknown): a is string => typeof a === \"string\" && a.startsWith(\"--\") && a !== \"--notes\");\n}\n\nconst TOOL_HELP: Record<string, { description: string; args: string; examples: string[] }> = {\n // Search\n search_semantic: {\n description: \"Vector similarity search — find notes by meaning, not just keywords\",\n args: '{ \"query\": \"string\", \"limit?\": 10 }',\n examples: [\n '{ \"query\": \"microservices architecture\", \"limit\": 5 }',\n '{ \"query\": \"how to deploy to production\" }',\n ],\n },\n search_text: {\n description: \"Full-text keyword or regex search with optional filters\",\n args: '{ \"pattern\": \"string\", \"regex?\": false, \"caseSensitive?\": false, \"pathGlob?\": \"string\", \"tagFilter?\": [\"string\"], \"limit?\": 20 }',\n examples: [\n '{ \"pattern\": \"RabbitMQ\" }',\n '{ \"pattern\": \"OAuth\\\\\\\\d\", \"regex\": true }',\n '{ \"pattern\": \"deploy\", \"pathGlob\": \"devops/**\", \"tagFilter\": [\"kubernetes\"] }',\n ],\n },\n search_graph: {\n description: \"Graph traversal — find notes connected to a concept via wikilinks and tags\",\n args: '{ \"concept\": \"string\", \"maxDepth?\": 2 }',\n examples: [\n '{ \"concept\": \"microservices\" }',\n '{ \"concept\": \"auth\", \"maxDepth\": 3 }',\n ],\n },\n search_hybrid: {\n description: \"Combined semantic + graph search — vector results re-ranked by graph proximity\",\n args: '{ \"query\": \"string\", \"limit?\": 10 }',\n examples: [\n '{ \"query\": \"event driven architecture\", \"limit\": 5 }',\n ],\n },\n\n // Read\n read_note: {\n description: \"Read the full content of a specific note by path\",\n args: '{ \"path\": \"string\" }',\n examples: [\n '{ \"path\": \"project-overview.md\" }',\n '{ \"path\": \"notes/meeting-2024-01-15.md\" }',\n ],\n },\n read_multiple_notes: {\n description: \"Batch read multiple notes in one call\",\n args: '{ \"paths\": [\"string\"] }',\n examples: [\n '{ \"paths\": [\"overview.md\", \"architecture.md\", \"deployment.md\"] }',\n ],\n },\n list_notes: {\n description: \"List all indexed notes with metadata (title, tags, link count)\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n\n // Write\n create_note: {\n description: \"Create a new markdown note with optional YAML frontmatter\",\n args: '{ \"path\": \"string\", \"content\": \"string\", \"frontmatter?\": {} }',\n examples: [\n '{ \"path\": \"new-guide.md\", \"content\": \"# Guide\\\\n\\\\nContent here.\" }',\n '{ \"path\": \"tagged.md\", \"content\": \"Content.\", \"frontmatter\": { \"title\": \"Tagged Note\", \"tags\": [\"test\"] } }',\n ],\n },\n update_note: {\n description: \"Edit note content — overwrite, append, prepend, or patch by heading\",\n args: '{ \"path\": \"string\", \"content\": \"string\", \"mode\": \"overwrite|append|prepend|patch-by-heading\", \"heading?\": \"string\" }',\n examples: [\n '{ \"path\": \"guide.md\", \"content\": \"New content.\", \"mode\": \"overwrite\" }',\n '{ \"path\": \"guide.md\", \"content\": \"\\\\n## Appendix\\\\nExtra info.\", \"mode\": \"append\" }',\n '{ \"path\": \"guide.md\", \"content\": \"Updated architecture section.\", \"mode\": \"patch-by-heading\", \"heading\": \"Architecture\" }',\n ],\n },\n delete_note: {\n description: \"Delete a note permanently (requires confirm=true)\",\n args: '{ \"path\": \"string\", \"confirm\": true }',\n examples: [\n '{ \"path\": \"old-note.md\", \"confirm\": true }',\n '{ \"path\": \"old-note.md\", \"confirm\": false } // returns warning, does not delete',\n ],\n },\n move_note: {\n description: \"Move or rename a note — automatically updates wikilinks across the vault\",\n args: '{ \"from\": \"string\", \"to\": \"string\" }',\n examples: [\n '{ \"from\": \"user-service.md\", \"to\": \"auth-service.md\" }',\n '{ \"from\": \"old/note.md\", \"to\": \"new/location/note.md\" }',\n ],\n },\n\n // Metadata\n get_frontmatter: {\n description: \"Read parsed YAML frontmatter from a note as JSON\",\n args: '{ \"path\": \"string\" }',\n examples: ['{ \"path\": \"project-overview.md\" }'],\n },\n update_frontmatter: {\n description: \"Set or delete YAML frontmatter keys — pass null to delete a key\",\n args: '{ \"path\": \"string\", \"fields\": {} }',\n examples: [\n '{ \"path\": \"note.md\", \"fields\": { \"status\": \"active\", \"priority\": 1 } }',\n '{ \"path\": \"note.md\", \"fields\": { \"deprecated_field\": null } } // deletes the key',\n ],\n },\n manage_tags: {\n description: \"Add, remove, or list tags on a note (frontmatter and inline)\",\n args: '{ \"path\": \"string\", \"action\": \"add|remove|list\", \"tags?\": [\"string\"] }',\n examples: [\n '{ \"path\": \"note.md\", \"action\": \"list\" }',\n '{ \"path\": \"note.md\", \"action\": \"add\", \"tags\": [\"important\", \"reviewed\"] }',\n '{ \"path\": \"note.md\", \"action\": \"remove\", \"tags\": [\"draft\"] }',\n ],\n },\n rename_tag: {\n description: \"Rename a tag across all notes in the vault (frontmatter + inline)\",\n args: '{ \"oldTag\": \"string\", \"newTag\": \"string\" }',\n examples: ['{ \"oldTag\": \"architecture\", \"newTag\": \"arch\" }'],\n },\n\n // Graph\n backlinks: {\n description: \"Find all notes that link TO a given note via [[wikilinks]]\",\n args: '{ \"path\": \"string\" }',\n examples: ['{ \"path\": \"microservices.md\" }'],\n },\n forwardlinks: {\n description: \"Find all notes linked FROM a given note\",\n args: '{ \"path\": \"string\" }',\n examples: ['{ \"path\": \"project-overview.md\" }'],\n },\n graph_path: {\n description: \"Find the shortest path between two notes in the knowledge graph\",\n args: '{ \"from\": \"string\", \"to\": \"string\" }',\n examples: ['{ \"from\": \"project-overview.md\", \"to\": \"user-service.md\" }'],\n },\n graph_statistics: {\n description: \"Knowledge graph stats — most connected nodes, orphans, density\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n\n // System\n get_stats: {\n description: \"Vault and index statistics — note count, chunks, embeddings, graph density\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n reindex: {\n description: \"Force a full reindex of the vault\",\n args: \"{}\",\n examples: [\"{}\"],\n },\n};\n\nconst TOOL_CATEGORIES: Record<string, string[]> = {\n Search: [\"search_semantic\", \"search_text\", \"search_graph\", \"search_hybrid\"],\n Read: [\"read_note\", \"read_multiple_notes\", \"list_notes\"],\n Write: [\"create_note\", \"update_note\", \"delete_note\", \"move_note\"],\n Metadata: [\"get_frontmatter\", \"update_frontmatter\", \"manage_tags\", \"rename_tag\"],\n Graph: [\"backlinks\", \"forwardlinks\", \"graph_path\", \"graph_statistics\"],\n System: [\"get_stats\", \"reindex\"],\n};\n\nfunction printToolList() {\n console.log(\"\\nSemantic Pages — 21 MCP Tools\\n\");\n console.log(\"Usage: These tools are available via MCP when the server is running.\");\n console.log(\" Run `semantic-memory tools <name>` for details on a specific tool.\\n\");\n\n for (const [category, tools] of Object.entries(TOOL_CATEGORIES)) {\n console.log(` ${category}:`);\n for (const name of tools) {\n const tool = TOOL_HELP[name];\n console.log(` ${name.padEnd(24)} ${tool.description}`);\n }\n console.log();\n }\n\n console.log(\"Run `semantic-memory tools <tool-name>` for arguments and examples.\");\n}\n\nfunction printToolDetail(name: string) {\n const tool = TOOL_HELP[name];\n if (!tool) {\n console.error(`Unknown tool: ${name}`);\n console.error(`Run \\`semantic-memory tools\\` to see all available tools.`);\n process.exit(1);\n }\n\n console.log(`\\n ${name}`);\n console.log(` ${\"─\".repeat(name.length)}`);\n console.log(` ${tool.description}\\n`);\n console.log(` Arguments:`);\n console.log(` ${tool.args}\\n`);\n console.log(` Examples:`);\n for (const ex of tool.examples) {\n console.log(` ${ex}`);\n }\n console.log();\n}\n\nprogram\n .name(\"semantic-memory\")\n .description(\n \"Unified memory-layer MCP server for Claude Code (rebrand of semantic-sidekick at v1.0.0).\\n\" +\n \"The `semantic-sidekick` command is preserved as an alias.\\n\\n\" +\n \" Start MCP server: semantic-memory --notes ./vault\\n\" +\n \" Show vault stats: semantic-memory --notes ./vault --stats\\n\" +\n \" Force reindex: semantic-memory --notes ./vault --reindex\\n\" +\n \" List MCP tools: semantic-memory tools\\n\" +\n \" Tool details: semantic-memory tools search_semantic\"\n )\n .version(version);\n\nprogram\n .command(\"search <query>\")\n .description(\"Run a vault search and print top hits as JSON (used by activation hooks)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--limit <n>\", \"Max results\", (v) => parseInt(v, 10), 8)\n .option(\"--text-only\", \"Skip embedder — keyword-only search (fast path, no model init)\")\n .option(\"--json\", \"Emit raw JSON (default)\", true)\n .action(async (query: string, opts) => {\n const { runSearch } = await import(\"./search.js\");\n try {\n const hits = await runSearch({\n notes: opts.notes,\n query,\n limit: opts.limit,\n textOnly: opts.textOnly,\n });\n process.stdout.write(JSON.stringify(hits, null, 2) + \"\\n\");\n process.exit(0);\n } catch (err: any) {\n console.error(`search failed: ${err.message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"eval-failures\")\n .description(\"Replay failed tool calls through search and measure how often the top hit answers them (v1.6 failure lookup)\")\n .requiredOption(\"--cases <file>\", \"JSONL of {id, notes, error, command}\")\n .requiredOption(\"--judgments <file>\", \"JSONL of {case, path, relevant}\")\n .option(\"--limit <n>\", \"Hits per search\", (v) => parseInt(v, 10), 5)\n .option(\"--query <mode>\", \"raw (error + command as-is) or normalized (failureQuery)\", \"normalized\")\n .option(\"--target <p>\", \"Target precision for the recommended threshold\", (v) => parseFloat(v), 0.95)\n .option(\"--min-judged <n>\", \"Judged injections needed before a threshold can be recommended\", (v) => parseInt(v, 10), 20)\n .option(\"--unjudged-out <file>\", \"Write unlabelled top hits here (JSONL) for labelling\")\n .option(\"--hits-out <file>\", \"Write every case's hits here (JSONL) for analysis\")\n .option(\"--json\", \"Print the report as JSON\")\n .option(\"--hits-in <file>\", \"Reuse hits from an earlier --hits-out instead of searching\")\n .option(\"--gate <kind>\", \"Also replay the failure hook's gate: 'jev' (needs --jev-scores)\")\n .option(\"--jev-scores <files...>\", \"JSONL of {case, path, p} from scripts/eval-failures/judge-jev.mjs\")\n .option(\"--gate-batch-out <file>\", \"With --gate jev: write the candidates Jev has not scored as a judge batch (set B format)\")\n .action(async (opts) => {\n const { openSearch } = await import(\"./search.js\");\n const { evaluateFailures, formatFailureEval } = await import(\"../core/failure-eval.js\");\n const { failureQuery } = await import(\"../core/failure-query.js\");\n const toQuery = (c: { error: string; command: string }) =>\n opts.query === \"raw\" ? `${c.error}\\n${c.command}` : failureQuery(c.error, c.command);\n const readJsonl = (p: string) =>\n readFileSync(resolve(p), \"utf-8\").split(\"\\n\").filter(Boolean).map((l) => JSON.parse(l));\n const cases = readJsonl(opts.cases) as import(\"../core/failure-eval.js\").FailureCase[];\n const judgments = readJsonl(opts.judgments) as import(\"../core/failure-eval.js\").Judgment[];\n\n // one searcher per corpus: the model loads once, not once per case\n const searchers = new Map<string, Awaited<ReturnType<typeof openSearch>>>();\n const results: import(\"../core/failure-eval.js\").CaseResult[] = [];\n if (opts.hitsIn) {\n const ids = new Set(cases.map((c) => c.id));\n results.push(...(readJsonl(opts.hitsIn) as import(\"../core/failure-eval.js\").CaseResult[]).filter((r) => ids.has(r.case)));\n } else {\n for (const c of cases) {\n if (!searchers.has(c.notes)) searchers.set(c.notes, await openSearch(c.notes));\n const hits = await searchers.get(c.notes)!.search(toQuery(c), opts.limit);\n results.push({ case: c.id, hits: hits.map((h) => ({ path: h.path, score: h.score })) });\n }\n }\n const report = evaluateFailures(results, judgments, { targetPrecision: opts.target, minJudged: opts.minJudged });\n if (opts.gate) {\n if (opts.gate !== \"jev\" || !opts.jevScores) {\n console.error(\"--gate jev needs --jev-scores <file...>\");\n process.exit(2);\n }\n const { evaluateGate, formatGate } = await import(\"../core/failure-eval.js\");\n const jev = (opts.jevScores as string[]).flatMap((f) => readJsonl(f));\n const gate = evaluateGate(results, judgments, jev);\n const veto = evaluateGate(results, judgments, jev, { mode: \"veto\", thresholds: [0.3, 0.35, 0.4, 0.45, 0.5] });\n if (opts.gateBatchOut) {\n const { default: matter } = await import(\"../core/matter.js\");\n const byId = new Map(cases.map((c) => [c.id, c]));\n const missing = [...new Map([...gate.missing, ...veto.missing].map((m) => [`${m.case}\\0${m.path}`, m])).values()];\n const batch = missing.map((m) => {\n const c = byId.get(m.case)!;\n let title = m.path, excerpt = \"\";\n try {\n const doc = matter(readFileSync(join(c.notes, m.path), \"utf-8\"));\n title = String(doc.data.title ?? m.path);\n excerpt = doc.content.replace(/^#.*$/m, \"\").trim().slice(0, 600);\n } catch {}\n return { case: m.case, path: m.path, command: c.command, error: c.error, doc_title: title, doc_excerpt: excerpt };\n });\n writeFileSync(resolve(opts.gateBatchOut), JSON.stringify(batch, null, 1));\n console.error(`${batch.length} unscored candidates → ${opts.gateBatchOut} (judge them with judge-jev.mjs, then re-run)`);\n }\n if (opts.json) {\n console.log(JSON.stringify({ ...report, gate: gate.rows, veto: veto.rows }, null, 2));\n process.exit(0);\n }\n console.log(formatFailureEval(report, `query: ${opts.query}`));\n console.log(\"\");\n console.log(formatGate(gate.rows));\n console.log(\"\");\n console.log(formatGate(veto.rows, \"veto\"));\n process.exit(0);\n }\n if (opts.hitsOut) {\n writeFileSync(resolve(opts.hitsOut), results.map((r) => JSON.stringify(r)).join(\"\\n\") + \"\\n\");\n }\n if (opts.unjudgedOut) {\n writeFileSync(resolve(opts.unjudgedOut), report.unjudged.map((u) => JSON.stringify(u)).join(\"\\n\") + \"\\n\");\n }\n console.log(opts.json ? JSON.stringify(report, null, 2) : formatFailureEval(report, `query: ${opts.query}`));\n process.exit(0);\n });\n\nprogram\n .command(\"lint\")\n .description(\"Lint the vault against vault.schema.yml (schema violations + missing provenance + stale)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--rule <name>\", \"Limit output to one rule: schema_violations | missing_provenance | stale\")\n .option(\"--json\", \"Emit JSON instead of the human-readable report\")\n .option(\"--strict\", \"Exit non-zero on warnings too (default: exit non-zero only on errors)\")\n .action(async (opts) => {\n const { lintVault, formatLintReport } = await import(\"../core/lint.js\");\n const report = await lintVault(resolve(opts.notes));\n // Use console.log + process.exitCode (not process.exit) so Node flushes\n // stdout fully before the process ends. Early process.exit with a large\n // buffered JSON payload can truncate output.\n if (opts.json) {\n const out = opts.rule ? report.byRule[opts.rule as keyof typeof report.byRule] : report;\n console.log(JSON.stringify(out, null, 2));\n } else {\n console.log(formatLintReport(report, { rule: opts.rule }));\n }\n const bad = opts.strict ? report.counts.errors + report.counts.warnings : report.counts.errors;\n process.exitCode = bad > 0 ? 1 : 0;\n });\n\nprogram\n .command(\"log-event\")\n .description(\"Append a structured event to the vault's log.md (used by hooks and CI scripts — same shape as mcp__semantic-vault__log_event)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .requiredOption(\"--kind <name>\", \"Event category: ingest, synthesis, error, mode_change, etc.\")\n .requiredOption(\"--summary <text>\", \"One-line human summary\")\n .option(\"--payload <json>\", \"Structured payload as JSON string\")\n .action(async (opts) => {\n const { logEvent } = await import(\"../core/log.js\");\n let payload: Record<string, unknown> | undefined;\n if (opts.payload) {\n try {\n payload = JSON.parse(opts.payload);\n } catch (e: any) {\n console.error(`invalid --payload JSON: ${e.message}`);\n process.exitCode = 1;\n return;\n }\n }\n try {\n const entry = await logEvent(resolve(opts.notes), {\n kind: opts.kind,\n summary: opts.summary,\n payload,\n });\n console.log(JSON.stringify(entry));\n } catch (e: any) {\n console.error(`log-event failed: ${e.message}`);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"log-query\")\n .description(\"Read structured log entries from log.md — filters by kind, date range, limit\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--kind <name>\", \"Filter by kind (ingest, synthesis, error, mode_change, etc.)\")\n .option(\"--after <iso>\", \"ISO timestamp — only entries on or after\")\n .option(\"--before <iso>\", \"ISO timestamp — only entries on or before\")\n .option(\"--limit <n>\", \"Max entries (most recent)\", (v) => parseInt(v, 10))\n .action(async (opts) => {\n const { logQuery } = await import(\"../core/log.js\");\n try {\n const entries = await logQuery(resolve(opts.notes), {\n kind: opts.kind,\n after: opts.after,\n before: opts.before,\n limit: opts.limit,\n });\n console.log(JSON.stringify(entries));\n } catch (e: any) {\n console.error(`log-query failed: ${e.message}`);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"install-schema\")\n .description(\"Bootstrap vault.schema.yml in the vault root with the default schema\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--force\", \"Overwrite existing schema file\")\n .action(async (opts) => {\n const { installDefaultSchema } = await import(\"../core/schema.js\");\n const r = await installDefaultSchema(resolve(opts.notes), opts.force);\n console.log(r.written ? `Installed default schema: ${r.path}` : `Schema already exists: ${r.path} (use --force to overwrite)`);\n process.exit(0);\n });\n\nprogram\n .command(\"tools [name]\")\n .description(\"List all MCP tools, or show details for a specific tool\")\n .action((name?: string) => {\n if (name) {\n printToolDetail(name);\n } else {\n printToolList();\n }\n process.exit(0);\n });\n\nprogram\n .command(\"serve\", { isDefault: true })\n .description(\"Start the MCP server (default command)\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--reindex\", \"Force full reindex and exit\")\n .option(\"--stats\", \"Show vault statistics and exit\")\n .option(\"--wait-for-ready\", \"Block startup until index is fully built before serving (default: index in background; tools return 'Indexing in progress' until ready)\")\n .option(\"--read-only\", \"Suppress write tools (create_note, update_note, delete_note, move_note, update_frontmatter, manage_tags, rename_tag, log_event, ...) — use for shared docs vaults owned by another tool\")\n .option(\"--model <name>\", \"Embedding model to use (default: all-MiniLM-L6-v2, fast; use nomic-ai/nomic-embed-text-v1.5 for higher quality)\")\n .option(\"--workers <n>\", \"Number of worker threads for parallel embedding\", parseInt)\n .option(\"--batch-size <n>\", \"Texts per ONNX forward pass (default: 8)\", parseInt)\n .option(\"--no-quantized\", \"Use full-precision model instead of quantized (slower, slightly higher quality)\")\n .option(\"--no-watch\", \"Disable file watcher\")\n .action(async (opts) => {\n const notesPath = resolve(opts.notes);\n\n if (!existsSync(notesPath)) {\n console.error(`Error: notes directory not found: ${notesPath}`);\n process.exit(1);\n }\n\n if (opts.stats) {\n const { Indexer } = await import(\"../core/indexer.js\");\n const indexer = new Indexer(notesPath);\n const docs = await indexer.indexAll();\n console.log(`Notes: ${docs.length}`);\n console.log(`Chunks: ${docs.reduce((n: number, d: any) => n + d.chunks.length, 0)}`);\n console.log(`Wikilinks: ${docs.reduce((n: number, d: any) => n + d.wikilinks.length, 0)}`);\n console.log(`Tags: ${new Set(docs.flatMap((d: any) => d.tags)).size} unique`);\n process.exit(0);\n }\n\n if (opts.reindex) {\n const { createServer } = await import(\"../mcp/server.js\");\n await createServer(notesPath, {\n watch: false,\n waitForReady: true,\n model: opts.model,\n workers: opts.workers,\n batchSize: opts.batchSize,\n quantized: opts.quantized,\n onProgress: (embedded, total) => {\n process.stderr.write(`\\rEmbedding ${embedded}/${total} chunks...`);\n },\n });\n process.stderr.write(\"\\n\");\n console.log(\"Reindex complete.\");\n process.exit(0);\n }\n\n // Default: start MCP server on stdio\n const { startServer } = await import(\"../mcp/server.js\");\n await startServer(notesPath, {\n watch: opts.watch,\n waitForReady: opts.waitForReady,\n model: opts.model,\n workers: opts.workers,\n batchSize: opts.batchSize,\n quantized: opts.quantized,\n readOnly: opts.readOnly,\n });\n });\n\nregisterUpdateCommands(program, {\n packageName: PKG_NAME,\n pluginName: \"semantic-memory\",\n configFile: \"semantic-memory.json\",\n onAfterUpdate: (cwd) => runRelink(cwd),\n});\n\nprogram\n .command(\"normalize-config\")\n .description(\n \"Rewrite fragile `npx @latest` entries in .mcp.json to the stable node-against-node_modules form (with backup and validation)\",\n )\n .option(\"--dry-run\", \"print the proposed changes but don't write\")\n .action((opts: { dryRun?: boolean }) => {\n const cwd = process.cwd();\n const mcpPath = join(cwd, \".mcp.json\");\n if (!existsSync(mcpPath)) {\n console.log(\"no .mcp.json in current directory — nothing to do\");\n process.exit(0);\n }\n const data = readJsonSafe(mcpPath);\n if (!data || typeof data !== \"object\" || !data.mcpServers || typeof data.mcpServers !== \"object\") {\n console.error(`could not parse ${mcpPath}`);\n process.exit(1);\n }\n const bin = localBinArg(cwd);\n if (!bin) {\n console.error(\n `no local install found at ./node_modules/@theglitchking/semantic-memory/bin/semantic-memory ` +\n `(or the legacy semantic-sidekick path).\\n` +\n `run 'npm install --save @theglitchking/semantic-memory' first, then re-run this command.`,\n );\n process.exit(1);\n }\n const rewritten: string[] = [];\n for (const [key, entry] of Object.entries<any>(data.mcpServers)) {\n if (!isNpxForm(entry)) continue;\n const notes = extractNotesPath(entry) ?? \"./.claude/.vault\";\n const extra = extractExtraFlags(entry);\n data.mcpServers[key] = {\n type: \"stdio\",\n command: \"node\",\n args: [bin, \"--notes\", notes, ...extra],\n };\n rewritten.push(key);\n }\n if (rewritten.length === 0) {\n console.log(\"no npx-form entries found — .mcp.json is already in the stable form.\");\n process.exit(0);\n }\n console.log(`Rewriting ${rewritten.length} entr${rewritten.length === 1 ? \"y\" : \"ies\"}: ${rewritten.join(\", \")}`);\n if (opts.dryRun) {\n console.log(\"--- proposed .mcp.json:\");\n console.log(JSON.stringify(data, null, 2));\n console.log(\"--- (dry-run; no changes written)\");\n process.exit(0);\n }\n // Back up\n const bakPath = join(dirname(mcpPath), \".mcp.json.bak\");\n try {\n writeFileSync(bakPath, readFileSync(mcpPath, \"utf8\"));\n console.log(`backup written: ${bakPath}`);\n } catch (err: any) {\n console.error(`could not write backup: ${err.message}`);\n process.exit(1);\n }\n writeFileSync(mcpPath, JSON.stringify(data, null, 2) + \"\\n\");\n\n // Verify the local bin starts cleanly. We just run --version — fast and\n // enough to catch ERR_MODULE_NOT_FOUND type failures.\n const verify = spawnSync(\"node\", [bin, \"--version\"], { cwd, stdio: \"pipe\", timeout: 15_000 });\n if (verify.status !== 0) {\n console.error(`verification failed (exit ${verify.status}):\\n${verify.stderr?.toString() || \"\"}`);\n console.error(`rolling back from ${bakPath}`);\n writeFileSync(mcpPath, readFileSync(bakPath, \"utf8\"));\n process.exit(1);\n }\n console.log(`✓ .mcp.json normalized and verified. Toggle the MCPs in /mcp to reconnect.`);\n process.exit(0);\n });\n\nprogram\n .command(\"healthcheck\")\n .description(\n \"Verify the local install starts cleanly + run drift detection. Self-heals common npx-cache corruption (ERR_MODULE_NOT_FOUND). With --fast, skips the slow tier (full vault lint). With --fix, auto-applies safe fixes for fixable findings.\",\n )\n .option(\"--fast\", \"Run only the fast-tier drift checks (file-system probes). Skips the slow tier (full vault lint).\", false)\n .option(\"--json\", \"Emit structured JSON output instead of human-readable text.\", false)\n .option(\"--fix\", \"Auto-apply safe fixes for fixable drift findings (re-link skills, reconcile .mcp.json, reindex, migrate state). Findings that need human review are reported, not touched.\", false)\n .action(async (opts) => {\n const cwd = process.cwd();\n const bin = findLocalBin(cwd);\n if (!bin) {\n console.error(`no local install at ./node_modules/@theglitchking/semantic-memory/bin/semantic-memory (or legacy semantic-sidekick path)`);\n console.error(`run 'npm install --save @theglitchking/semantic-memory' to install.`);\n process.exit(1);\n }\n\n // 1. Warn if .mcp.json uses the fragile form.\n const mcpPath = join(cwd, \".mcp.json\");\n if (existsSync(mcpPath) && !opts.json) {\n const data = readJsonSafe(mcpPath);\n const entries = data?.mcpServers && typeof data.mcpServers === \"object\" ? Object.entries<any>(data.mcpServers) : [];\n const fragile = entries.filter(([, e]) => isNpxForm(e)).map(([k]) => k);\n if (fragile.length > 0) {\n console.warn(`⚠️ .mcp.json uses the fragile npx-@latest form for: ${fragile.join(\", \")}`);\n console.warn(` Rewrite to the stable form:`);\n console.warn(` npx --no @theglitchking/semantic-memory normalize-config`);\n }\n }\n\n // 2. Smoke-test the local bin (with npx-cache self-heal on ERR_MODULE_NOT_FOUND).\n // Unlike prior versions, this does NOT exit early — drift detection and\n // --fix always run afterwards.\n let smokeOk = false;\n let smokeVersion = \"\";\n {\n const r = spawnSync(\"node\", [bin, \"--version\"], { cwd, stdio: \"pipe\", timeout: 15_000 });\n if (r.status === 0) {\n smokeOk = true;\n smokeVersion = r.stdout?.toString().trim() ?? \"\";\n } else {\n const stderr = r.stderr?.toString() ?? \"\";\n if (stderr.includes(\"ERR_MODULE_NOT_FOUND\")) {\n const match = stderr.match(/([\\/~][^'\"\\s]*\\/_npx\\/[^\\/'\"\\s]+)/);\n if (match) {\n const bad = match[1];\n if (!opts.json) console.warn(`detected broken npx cache at ${bad} — clearing and retrying...`);\n try { rmSync(bad, { recursive: true, force: true }); } catch {}\n const r2 = spawnSync(\"node\", [bin, \"--version\"], { cwd, stdio: \"pipe\", timeout: 15_000 });\n if (r2.status === 0) {\n smokeOk = true;\n smokeVersion = r2.stdout?.toString().trim() ?? \"\";\n } else if (!opts.json) {\n console.error(`retry still failed:\\n${r2.stderr?.toString() || \"\"}`);\n }\n }\n }\n if (!smokeOk && !opts.json && stderr) console.error(stderr);\n }\n }\n if (smokeOk && !opts.json) console.log(`✓ local install starts cleanly (v${smokeVersion})`);\n\n // 3. Run drift detection.\n const { runHealthcheck, formatDriftBanner, filterToDrift } = await import(\"../core/healthcheck.js\");\n const vaultCandidate = join(cwd, \".claude\", \".vault\");\n const vaultPath = existsSync(vaultCandidate) ? vaultCandidate : undefined;\n let result = await runHealthcheck({ projectRoot: cwd, vaultPath, tier: opts.fast ? \"fast\" : \"all\", force: true });\n\n // 4. Apply fixes if requested.\n let fixOutcomes: FixOutcome[] = [];\n let plan = { fixes: [] as PlannedFix[], skipped: [] as { check: string; reason: string }[] };\n if (opts.fix) {\n plan = planFixes(filterToDrift(result));\n if (plan.fixes.length > 0) {\n fixOutcomes = await executeFixes(cwd, plan.fixes);\n // Re-run fast-tier drift to reflect the post-fix state.\n result = await runHealthcheck({ projectRoot: cwd, vaultPath, tier: opts.fast ? \"fast\" : \"all\", force: true });\n }\n }\n\n // 5. Emit.\n if (opts.json) {\n const features = { skill_loop: featureState(\"skill_loop\", cwd), jev: featureState(\"jev\", cwd) };\n console.log(JSON.stringify({ smoke: { ok: smokeOk, version: smokeVersion }, result, features, fix: opts.fix ? { plan, outcomes: fixOutcomes } : undefined }, null, 2));\n } else {\n if (opts.fix) {\n if (fixOutcomes.length === 0 && plan.skipped.length === 0) {\n console.log(`\\n✓ nothing to fix`);\n } else {\n console.log(`\\n--fix applied ${fixOutcomes.filter((o) => o.status === \"fixed\").length}/${fixOutcomes.length} action(s):`);\n for (const o of fixOutcomes) console.log(` ${o.status === \"fixed\" ? \"✓\" : \"✗\"} ${o.action} (${o.check}) — ${o.detail}`);\n for (const s of plan.skipped) console.log(` • skipped ${s.check} — ${s.reason}`);\n }\n }\n const banner = formatDriftBanner(result);\n if (banner) {\n console.log(\"\");\n console.log(banner);\n } else {\n console.log(`\\n✓ no drift detected (${result.findings.length} checks ran in ${result.duration_ms}ms)`);\n }\n console.log(`\\n${describeFeature(featureState(\"skill_loop\", cwd))}\\n${describeFeature(featureState(\"jev\", cwd))}`);\n }\n\n process.exit(smokeOk ? 0 : 1);\n });\n\n// --- Skill bundler (Phase 6) ---\n\nfunction parseAgent(input: string): AgentName {\n const a = input.toLowerCase();\n if (!SKILL_BUNDLER_AGENTS.includes(a as AgentName)) {\n console.error(`Unknown agent: ${input}. Supported: ${SKILL_BUNDLER_AGENTS.join(\", \")}.`);\n process.exit(2);\n }\n return a as AgentName;\n}\n\nfunction parseScope(input: string): Scope {\n if (input !== \"global\" && input !== \"local\") {\n console.error(`Unknown scope: ${input}. Use 'global' or 'local'.`);\n process.exit(2);\n }\n return input;\n}\n\nfunction findSourceRoot(): string {\n // 1. Installed: <cwd>/node_modules/@theglitchking/semantic-sidekick or semantic-memory\n for (const pkg of [\"semantic-memory\", \"semantic-sidekick\"]) {\n const installed = join(process.cwd(), \"node_modules\", \"@theglitchking\", pkg);\n if (existsSync(installed)) return installed;\n }\n // 2. Dev: derive from the bin location (this file lives at <root>/dist/cli/index.js)\n const dev = resolve(new URL(\"../../\", import.meta.url).pathname);\n return dev;\n}\n\nconst skillsCmd = program.command(\"skills\").description(\"Install, target, or uninstall skill bundles for non-Claude agents (codex, copilot, pi). Claude installs continue to use the npm postinstall flow.\");\n\nskillsCmd\n .command(\"targets\")\n .description(\"Preview where skill bundles would be installed for one or more agents.\")\n .option(\"--agent <name...>\", \"One or more agents (default: all). Repeatable.\", undefined as any)\n .option(\"--scope <scope>\", \"global or local (default: local)\", \"local\")\n .option(\"--project <path>\", \"Project root for local-scope paths (default: cwd)\", process.cwd())\n .action((opts) => {\n const scope = parseScope(opts.scope);\n const agents: AgentName[] = (opts.agent && opts.agent.length > 0 ? opts.agent : SKILL_BUNDLER_AGENTS).map(parseAgent);\n const out = agents.map((a) => resolveTarget(a, scope, opts.project));\n console.log(JSON.stringify(out, null, 2));\n });\n\nskillsCmd\n .command(\"install\")\n .description(\"Install skill bundles into an agent's skill directory. Non-destructive by default; --force to overwrite.\")\n .requiredOption(\"--agent <name>\", \"Agent runtime (claude, codex, copilot, pi)\")\n .option(\"--scope <scope>\", \"global or local (default: local)\", \"local\")\n .option(\"--project <path>\", \"Project root for local-scope paths (default: cwd)\", process.cwd())\n .option(\"--only <names...>\", \"Restrict to specific skill names (default: all shipped)\")\n .option(\"--force\", \"Overwrite even if drift is detected against an existing manifest\", false)\n .action(async (opts) => {\n const agent = parseAgent(opts.agent);\n const scope = parseScope(opts.scope);\n if (agent === \"claude\") {\n console.error(\n \"Claude skill installs are handled by the npm postinstall (claude-plugin-runtime). \" +\n \"Run `npm install @theglitchking/semantic-memory` instead — that flow symlinks \" +\n \"skills into ~/.claude/skills/ or .claude/skills/ automatically. The skills CLI \" +\n \"is intended for non-Claude agents (codex, copilot, pi) which do not have that \" +\n \"postinstall integration.\"\n );\n process.exit(2);\n }\n const sourceRoot = findSourceRoot();\n const result = await installSkills({\n agent,\n scope,\n sourceRoot,\n projectRoot: opts.project,\n version,\n only: opts.only,\n force: opts.force === true,\n });\n console.log(JSON.stringify(result, null, 2));\n if (result.installed.length === 0 && result.reason) process.exit(1);\n });\n\nskillsCmd\n .command(\"uninstall\")\n .description(\"Remove skill bundles tracked by the semantic-memory manifest. User-written skills outside the manifest are left untouched.\")\n .requiredOption(\"--agent <name>\", \"Agent runtime (claude, codex, copilot, pi)\")\n .option(\"--scope <scope>\", \"global or local (default: local)\", \"local\")\n .option(\"--project <path>\", \"Project root for local-scope paths (default: cwd)\", process.cwd())\n .action(async (opts) => {\n const agent = parseAgent(opts.agent);\n const scope = parseScope(opts.scope);\n if (agent === \"claude\") {\n console.error(\"Claude skill uninstalls go through the npm uninstall flow. The skills CLI is for non-Claude agents.\");\n process.exit(2);\n }\n const result = await uninstallSkills({ agent, scope, projectRoot: opts.project });\n console.log(JSON.stringify(result, null, 2));\n });\n\nskillsCmd\n .command(\"list\")\n .description(\"List the skill bundles shipped with this plugin version.\")\n .action(async () => {\n const sourceRoot = findSourceRoot();\n const shipped = await listShippedSkills(sourceRoot);\n console.log(JSON.stringify(shipped.map((s) => s.name), null, 2));\n });\n\n// --- State migration (Phase 3, v1.2) ---\n\nprogram\n .command(\"migrate-state\")\n .description(\n \"Move legacy .claude/.sidekick-* state files to .claude/.semantic-memory/. Idempotent. \" +\n \"Conflicts (both paths exist) require --force. Pass --dry-run to preview without changes.\",\n )\n .option(\"--dry-run\", \"Print the planned migration without renaming any files.\", false)\n .option(\n \"--force\",\n \"When both old and new paths exist, prefer the new path and delete the old one.\",\n false,\n )\n .option(\"--project <path>\", \"Project root (default: cwd)\", process.cwd())\n .action((opts) => {\n const result = migrateState({\n projectRoot: opts.project,\n dryRun: opts.dryRun === true,\n force: opts.force === true,\n });\n console.log(JSON.stringify(result, null, 2));\n if (result.conflicts.length > 0 && !opts.force && !opts.dryRun) {\n console.error(\n `\\n${result.conflicts.length} conflict${result.conflicts.length === 1 ? \"\" : \"s\"} detected. Re-run with --force to resolve (keeps new path, deletes old).`,\n );\n process.exit(1);\n }\n });\n\n// --- Confidence decay introspection (v1.3) ---\n\nprogram\n .command(\"decay-config\")\n .description(\"Print the active confidence-decay config (shipped defaults + any vault.schema.yml override).\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { loadDecayConfig, DEFAULT_DECAY_CONFIG } = await import(\"../core/decay.js\");\n const cfg = loadDecayConfig(resolve(opts.notes));\n const source = JSON.stringify(cfg) === JSON.stringify(DEFAULT_DECAY_CONFIG) ? \"defaults\" : \"vault.schema.yml (overridden)\";\n console.log(JSON.stringify({ source, config: cfg }, null, 2));\n process.exit(0);\n });\n\nprogram\n .command(\"decay-trace <notePath>\")\n .description(\"Show the decay calculation for one note: type, last_verified, age, half-life, evergreen, multiplier.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (notePath: string, opts) => {\n const { loadDecayConfig, computeDecay, normalizeVerifiedDate } = await import(\"../core/decay.js\");\n const matter = (await import(\"../core/matter.js\")).default;\n const abs = resolve(opts.notes, notePath);\n if (!existsSync(abs)) {\n console.error(`note not found: ${abs}`);\n process.exit(1);\n }\n const { data: fm } = matter(readFileSync(abs, \"utf8\"));\n const lastVerified = normalizeVerifiedDate(fm.last_verified);\n const d = computeDecay({\n type: typeof fm.type === \"string\" ? fm.type : undefined,\n last_verified: lastVerified,\n evergreen: fm.evergreen === true,\n config: loadDecayConfig(resolve(opts.notes)),\n });\n console.log(\n JSON.stringify(\n {\n path: notePath,\n type: fm.type ?? null,\n last_verified: lastVerified ?? null,\n evergreen: fm.evergreen === true,\n multiplier: d.multiplier,\n age_days: Math.round(d.age_days),\n effective_half_life: d.effective_half_life,\n reason: d.reason,\n },\n null,\n 2\n )\n );\n process.exit(0);\n });\n\n// --- Lexicon (v1.4) ---\n\nconst lexiconCmd = program.command(\"lexicon\").description(\"Manage the learned human→artifact lexicon (aliases).\");\n\nlexiconCmd\n .command(\"list\")\n .description(\"List all aliases in the lexicon.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { loadLexiconCache } = await import(\"../core/lexicon.js\");\n console.log(JSON.stringify(await loadLexiconCache(resolve(opts.notes)), null, 2));\n process.exit(0);\n });\n\nlexiconCmd\n .command(\"compile\")\n .description(\"Rebuild the derived lexicon cache from the lexicon/ notes.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { compileLexicon } = await import(\"../core/lexicon.js\");\n const entries = await compileLexicon(resolve(opts.notes));\n console.log(`compiled ${entries.length} alias(es)`);\n process.exit(0);\n });\n\nlexiconCmd\n .command(\"add <canonical> <phrases...>\")\n .description(\"Upsert an alias: a canonical target and the human phrases that refer to it.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--authored\", \"Mark as human-authored (default: learned)\")\n .action(async (canonical: string, phrases: string[], opts) => {\n const { addAlias } = await import(\"../core/lexicon.js\");\n const r = await addAlias(resolve(opts.notes), { canonical, phrases, source: opts.authored ? \"authored\" : \"learned\" });\n console.log(JSON.stringify(r, null, 2));\n process.exit(0);\n });\n\n// --- Entity dossiers (v1.5 Phase 8) ---\n\nconst dossierCmd = program.command(\"dossier\").description(\"Manage entity dossiers — per-component living notes (purpose / failure modes / knobs / incident log / current state).\");\n\ndossierCmd\n .command(\"init <entity>\")\n .description(\"Scaffold a dossier for an entity (no-op if one already exists). Optionally seed aliases and provenance.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--alias <phrase...>\", \"Human phrase(s) for this entity — fed to the lexicon compiler\")\n .option(\"--seeded-from <ref>\", \"Provenance of the scaffold (e.g. a babel-fish project-map entry)\")\n .action(async (entity: string, opts) => {\n const { initDossier } = await import(\"../core/dossier.js\");\n const r = await initDossier(resolve(opts.notes), entity, { aliases: opts.alias, seeded_from: opts.seededFrom });\n console.log(JSON.stringify(r, null, 2));\n process.exit(0);\n });\n\ndossierCmd\n .command(\"list\")\n .description(\"List all dossiers with their entity, aliases, and current state.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { listDossiers } = await import(\"../core/dossier.js\");\n console.log(JSON.stringify(await listDossiers(resolve(opts.notes)), null, 2));\n process.exit(0);\n });\n\n// --- Speaker profile (v1.5 Phase 11) ---\n\nconst profileCmd = program.command(\"profile\").description(\"Manage the speaker profile — how THIS human communicates (severity calibration, chronic omissions, verbosity, shorthand).\");\n\nprofileCmd\n .command(\"init\")\n .description(\"Scaffold profile/speaker.md with the fixed sections (no-op if it exists).\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { initSpeakerProfile } = await import(\"../core/profile.js\");\n const r = await initSpeakerProfile(resolve(opts.notes));\n console.log(JSON.stringify(r, null, 2));\n process.exit(0);\n });\n\nprofileCmd\n .command(\"show\")\n .description(\"Print the speaker profile's injection head (the capped, placeholder-stripped view).\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .action(async (opts) => {\n const { readSpeakerProfile } = await import(\"../core/profile.js\");\n const p = await readSpeakerProfile(resolve(opts.notes));\n console.log(p ? p.head || \"(profile is empty — only placeholders)\" : \"(no speaker profile — run `profile init`)\");\n process.exit(0);\n });\n\n// --- Selection-logging telemetry introspection (v1.3.1) ---\n\nprogram\n .command(\"selection-stats\")\n .description(\"Summarize the local selection log: searches, selections, most-cited notes, and retrieved-but-never-cited notes.\")\n .requiredOption(\"--notes <path>\", \"Path to markdown notes directory\")\n .option(\"--json\", \"Emit raw JSON instead of a human summary\")\n .action(async (opts) => {\n const { computeSelectionStats, selectionLogPath } = await import(\"../core/telemetry.js\");\n const stats = await computeSelectionStats(resolve(opts.notes));\n if (opts.json) {\n console.log(JSON.stringify(stats, null, 2));\n process.exit(0);\n }\n console.log(`Selection log: ${selectionLogPath(resolve(opts.notes))}`);\n console.log(` searches: ${stats.searches}`);\n console.log(` selections: ${stats.selections}`);\n const topCited = Object.entries(stats.citedPaths).sort((a, b) => b[1] - a[1]).slice(0, 10);\n if (topCited.length) {\n console.log(` most cited:`);\n for (const [p, n] of topCited) console.log(` ${n}× ${p}`);\n }\n if (stats.retrievedNeverCited.length) {\n console.log(` retrieved but never cited (${stats.retrievedNeverCited.length}): ${stats.retrievedNeverCited.slice(0, 10).join(\", \")}${stats.retrievedNeverCited.length > 10 ? \" …\" : \"\"}`);\n }\n process.exit(0);\n });\n\nskillsCmd\n .command(\"lint\")\n .description(\"Lint the skill loop's learned skills this repo loads (v1.7): format, description, evidence, sections, cites, applies_to, secrets, name clashes.\")\n .option(\"--root <dir>\", \"Repo root (default: cwd)\")\n .option(\"--json\", \"JSON output\")\n .action(async (opts) => {\n const { lintSkills } = await import(\"../core/skill-schema.js\");\n const root = resolve(opts.root ?? process.cwd());\n const r = lintSkills(root);\n if (opts.json) console.log(JSON.stringify(r, null, 2));\n else {\n for (const f of r.findings) console.log(`${f.severity === \"error\" ? \"✗\" : \"!\"} ${relative(root, f.path)}: ${f.rule}: ${f.message}`);\n const errors = r.findings.filter((f) => f.severity === \"error\").length;\n console.log(`${r.files} learned skill(s), ${errors} error(s), ${r.findings.length - errors} warning(s)`);\n }\n process.exit(r.findings.some((f) => f.severity === \"error\") ? 1 : 0);\n });\n\n// --- v1.7 switches: skill loop and jev mode ---\n\nregisterFeatureCommands(program, {\n skill_loop: skillLoopStatus,\n jev: async () => {\n const { jevSpendToday } = await import(\"../core/jev.js\");\n const { jevLoopDir } = await import(\"../core/features.js\");\n const spend = jevSpendToday(jevLoopDir());\n const total = Object.values(spend).reduce((a, b) => a + b, 0);\n return [`Jev today (semantic-memory callers): ${total.toLocaleString()} tokens${total ? ` — ${Object.entries(spend).map(([c, n]) => `${c} ${n.toLocaleString()}`).join(\", \")}` : \"\"}`];\n },\n});\nregisterSkillLoopCommands(program);\nregisterSkillEvalCommands(program);\n\nprogram.parse();\n","import type { DriftFinding } from \"./healthcheck.js\";\n\n/**\n * The `--fix` planner. Pure, side-effect-free: it maps drift findings onto safe\n * auto-fix actions, or explains why a finding needs a human. The CLI executes the\n * plan; keeping the decision logic here makes it unit-testable without spawning.\n *\n * \"Safe\" means: idempotent, non-destructive, and derivable from the install itself\n * (re-link skills, reconcile .mcp.json, rebuild the derived index, migrate state).\n * Anything that touches user-authored content (stale notes, broken wikilinks,\n * hand-edited AGENTS.md) is deliberately NOT auto-fixed — it drops to `skipped`\n * with a pointer to the manual remedy.\n */\n\nexport type FixAction = \"skill-link\" | \"mcp-reconcile\" | \"reindex\" | \"state-migrate\";\n\nexport interface PlannedFix {\n check: string;\n action: FixAction;\n summary: string;\n}\n\nexport interface SkippedFinding {\n check: string;\n reason: string;\n}\n\nexport interface FixPlan {\n fixes: PlannedFix[];\n skipped: SkippedFinding[];\n}\n\n/** Human-readable reason a finding is not auto-fixable. */\nconst MANUAL_REASON: Record<string, string> = {\n \"regenerate-contract\":\n \"AGENTS.md needs a human decision — run `/contract` (regenerate_contract), or move custom content into a Local Notes section outside the managed block.\",\n lint_vault:\n \"Vault lint findings (stale notes, broken wikilinks, schema violations) require human review — run `lint_vault` for the full report.\",\n session_staleness:\n \"Resume the session (session_run / session_finish) or remove .claude/.semantic-memory/session.json to abandon it.\",\n};\n\n/**\n * Build the fix plan from a set of drift findings. Only findings with\n * severity !== \"ok\" are considered.\n */\nexport function planFixes(findings: DriftFinding[]): FixPlan {\n const fixes: PlannedFix[] = [];\n const skipped: SkippedFinding[] = [];\n\n for (const f of findings) {\n if (f.severity === \"ok\") continue;\n\n switch (f.fixable_via) {\n case \"skill-link\":\n fixes.push({ check: f.check, action: \"skill-link\", summary: f.summary });\n break;\n case \"mcp-reconcile\":\n fixes.push({ check: f.check, action: \"mcp-reconcile\", summary: f.summary });\n break;\n case \"reindex\":\n fixes.push({ check: f.check, action: \"reindex\", summary: f.summary });\n break;\n case \"state-migrate\":\n fixes.push({ check: f.check, action: \"state-migrate\", summary: f.summary });\n break;\n case \"regenerate-contract\":\n // The only case this fires is a custom AGENTS.md without managed markers,\n // where regeneration would refuse anyway. Treat as human-review.\n skipped.push({ check: f.check, reason: MANUAL_REASON[\"regenerate-contract\"] });\n break;\n default:\n skipped.push({\n check: f.check,\n reason: MANUAL_REASON[f.check] ?? \"No automatic fix available — needs human review.\",\n });\n }\n }\n\n return { fixes, skipped };\n}\n","import { mkdir, readFile, writeFile, copyFile, readdir, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, basename, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\n\nexport type AgentName = \"claude\" | \"codex\" | \"copilot\" | \"pi\";\nexport type Scope = \"global\" | \"local\";\n\nexport interface AgentTargetSpec {\n agent: AgentName;\n scope: Scope;\n /** Absolute resolved path where the skill bundles will land. */\n path: string;\n}\n\nexport interface SkillManifest {\n package: string;\n version: string;\n agent: AgentName;\n scope: Scope;\n installed_at: string;\n skills: { name: string; sha256: string }[];\n}\n\nexport interface InstallResult {\n agent: AgentName;\n scope: Scope;\n target_path: string;\n installed: string[];\n skipped: string[];\n reason?: string;\n manifest_path?: string;\n}\n\nconst MANIFEST_FILE = \".semantic-memory-skill-manifest.json\";\n\n/**\n * Resolve where a given (agent, scope) tuple should land. Project root is required for local\n * scope (to anchor relative paths); for global scope it's not used.\n */\nexport function resolveTarget(agent: AgentName, scope: Scope, projectRoot: string): AgentTargetSpec {\n const root = resolve(projectRoot);\n const home = homedir();\n const map: Record<AgentName, { global: string; local: string }> = {\n claude: { global: join(home, \".claude\", \"skills\"), local: join(root, \".claude\", \"skills\") },\n codex: { global: join(home, \".codex\", \"skills\"), local: join(root, \".codex\", \"skills\") },\n copilot: { global: join(home, \".copilot\", \"skills\"), local: join(root, \".github\", \"skills\") },\n pi: { global: join(home, \".pi\", \"agent\", \"skills\"), local: join(root, \".pi\", \"skills\") },\n };\n return { agent, scope, path: map[agent][scope] };\n}\n\n/**\n * Enumerate the canonical skill bundles shipped by this plugin. Each bundle is a directory\n * under `<sourceRoot>/skills/` containing at least a SKILL.md file. Entries without\n * SKILL.md are silently skipped (allows future non-skill files like `/skills/.gitkeep`).\n */\nexport async function listShippedSkills(sourceRoot: string): Promise<{ name: string; dir: string }[]> {\n const skillsDir = join(sourceRoot, \"skills\");\n if (!existsSync(skillsDir)) return [];\n const entries = await readdir(skillsDir, { withFileTypes: true });\n const out: { name: string; dir: string }[] = [];\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const dir = join(skillsDir, e.name);\n const skillFile = join(dir, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n out.push({ name: e.name, dir });\n }\n return out;\n}\n\nasync function sha256OfFile(path: string): Promise<string> {\n const buf = await readFile(path);\n return createHash(\"sha256\").update(buf).digest(\"hex\");\n}\n\n/**\n * Copy a single skill bundle (SKILL.md plus any sibling files in the same directory) into\n * the target directory, overlaying it with the agent name. Returns the list of files written.\n *\n * The target layout is `<targetPath>/<skillName>/SKILL.md` plus mirrored siblings, so each\n * bundle is namespaced and easy to remove later.\n */\nasync function copyBundle(srcDir: string, destDir: string): Promise<string[]> {\n await mkdir(destDir, { recursive: true });\n const entries = await readdir(srcDir, { withFileTypes: true });\n const written: string[] = [];\n for (const e of entries) {\n const src = join(srcDir, e.name);\n const dest = join(destDir, e.name);\n if (e.isDirectory()) {\n const childWritten = await copyBundle(src, dest);\n written.push(...childWritten);\n continue;\n }\n if (!e.isFile()) continue;\n await copyFile(src, dest);\n written.push(dest);\n }\n return written;\n}\n\nexport interface InstallOptions {\n agent: AgentName;\n scope: Scope;\n /** Path to the package's source root (usually the repo root, where `skills/` lives). */\n sourceRoot: string;\n /** Used to anchor local-scope target paths. */\n projectRoot: string;\n /** Plugin version, recorded in the manifest. */\n version: string;\n /** Specific skills to install. When omitted, all shipped skills are installed. */\n only?: string[];\n /**\n * When false, refuse to overwrite an existing install (manifest present + sha mismatch\n * indicates upstream drift). When true, overwrite. Default false.\n */\n force?: boolean;\n}\n\n/**\n * Install all (or selected) skill bundles into an agent's skill directory.\n *\n * Behavior:\n * - Resolves the destination via resolveTarget.\n * - Reads any existing manifest. If a manifest exists, version differs from `version`,\n * AND any skill sha256 differs from the source: this is a drift event. Without\n * `force: true`, returns a refusal with reason \"drift detected\". With force, proceeds\n * and overwrites.\n * - For each shipped skill (or each in `only`), copies the bundle into\n * <target>/<skillName>/, overwriting any existing files in that subdirectory.\n * - Writes a fresh manifest at <target>/<MANIFEST_FILE> recording sha256 of each\n * SKILL.md installed, the plugin version, agent, and scope.\n */\nexport async function installSkills(opts: InstallOptions): Promise<InstallResult> {\n const target = resolveTarget(opts.agent, opts.scope, opts.projectRoot);\n const shipped = await listShippedSkills(opts.sourceRoot);\n const filter = opts.only && opts.only.length > 0 ? new Set(opts.only) : null;\n const toInstall = filter ? shipped.filter((s) => filter.has(s.name)) : shipped;\n\n if (toInstall.length === 0) {\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n installed: [],\n skipped: [],\n reason: filter ? `No matching skills found (only=${[...filter].join(\",\")}).` : \"No shipped skills found at sourceRoot/skills/.\",\n };\n }\n\n const manifestPath = join(target.path, MANIFEST_FILE);\n const existing = await readManifest(manifestPath);\n\n if (existing && !opts.force) {\n const drift = await detectDrift(existing, toInstall);\n if (drift.length > 0) {\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n installed: [],\n skipped: toInstall.map((s) => s.name),\n reason: `Drift detected on ${drift.length} skill(s): ${drift.join(\", \")}. Pass --force to overwrite.`,\n manifest_path: manifestPath,\n };\n }\n }\n\n await mkdir(target.path, { recursive: true });\n const installed: string[] = [];\n const skillEntries: { name: string; sha256: string }[] = [];\n for (const skill of toInstall) {\n const destDir = join(target.path, skill.name);\n await copyBundle(skill.dir, destDir);\n const skillFile = join(skill.dir, \"SKILL.md\");\n skillEntries.push({ name: skill.name, sha256: await sha256OfFile(skillFile) });\n installed.push(skill.name);\n }\n\n const manifest: SkillManifest = {\n package: \"@theglitchking/semantic-memory\",\n version: opts.version,\n agent: opts.agent,\n scope: opts.scope,\n installed_at: new Date().toISOString(),\n skills: skillEntries,\n };\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n installed,\n skipped: [],\n manifest_path: manifestPath,\n };\n}\n\nexport interface UninstallOptions {\n agent: AgentName;\n scope: Scope;\n projectRoot: string;\n}\n\nexport interface UninstallResult {\n agent: AgentName;\n scope: Scope;\n target_path: string;\n removed: string[];\n manifest_present: boolean;\n reason?: string;\n}\n\n/**\n * Remove only the skill bundles tracked in the manifest. User-written skills outside\n * the manifest are left untouched.\n */\nexport async function uninstallSkills(opts: UninstallOptions): Promise<UninstallResult> {\n const target = resolveTarget(opts.agent, opts.scope, opts.projectRoot);\n const manifestPath = join(target.path, MANIFEST_FILE);\n const manifest = await readManifest(manifestPath);\n if (!manifest) {\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n removed: [],\n manifest_present: false,\n reason: \"No semantic-memory manifest found — nothing to uninstall.\",\n };\n }\n const removed: string[] = [];\n for (const skill of manifest.skills) {\n const dir = join(target.path, skill.name);\n if (existsSync(dir)) {\n await rm(dir, { recursive: true, force: true });\n removed.push(skill.name);\n }\n }\n await rm(manifestPath, { force: true });\n return {\n agent: opts.agent,\n scope: opts.scope,\n target_path: target.path,\n removed,\n manifest_present: true,\n };\n}\n\nasync function readManifest(path: string): Promise<SkillManifest | null> {\n if (!existsSync(path)) return null;\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed?.package !== \"string\") return null;\n return parsed as SkillManifest;\n } catch {\n return null;\n }\n}\n\nasync function detectDrift(\n existing: SkillManifest,\n toInstall: { name: string; dir: string }[]\n): Promise<string[]> {\n const driftNames: string[] = [];\n const existingByName = new Map(existing.skills.map((s) => [s.name, s.sha256]));\n for (const skill of toInstall) {\n const sourceSha = await sha256OfFile(join(skill.dir, \"SKILL.md\"));\n const existingSha = existingByName.get(skill.name);\n if (existingSha !== undefined && existingSha !== sourceSha) {\n driftNames.push(skill.name);\n }\n }\n return driftNames;\n}\n\nexport const SKILL_BUNDLER_AGENTS: AgentName[] = [\"claude\", \"codex\", \"copilot\", \"pi\"];\n","import { existsSync, mkdirSync, statSync, renameSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * State files that moved/renamed in v1.2.\n *\n * Each entry: legacy path (relative to <projectRoot>/.claude) → new path (relative to\n * <projectRoot>/.claude). Reads in v1.x check new first, fall back to old; writes always\n * go to new. This command does the explicit move so the legacy files stop existing.\n *\n * Order matters only for human-readable output; the migrations themselves are independent.\n */\nconst STATE_MIGRATIONS: { name: string; old: string; new: string }[] = [\n { name: \"mode\", old: \".sidekick-mode\", new: \".semantic-memory/mode\" },\n { name: \"fingerprints\", old: \".sidekick-fingerprints.json\", new: \".semantic-memory/fingerprints.json\" },\n { name: \"capture-pending\", old: \".sidekick-capture-pending.json\", new: \".semantic-memory/capture-pending.json\" },\n];\n\nexport type MigrationStatus = \"migrated\" | \"skipped-no-source\" | \"skipped-already-migrated\" | \"conflict\" | \"resolved-by-force\";\n\nexport interface MigrationFinding {\n name: string;\n status: MigrationStatus;\n oldPath: string;\n newPath: string;\n detail?: string;\n}\n\nexport interface MigrateStateOptions {\n projectRoot: string;\n dryRun?: boolean;\n force?: boolean;\n}\n\nexport interface MigrateStateResult {\n migrated: MigrationFinding[];\n skipped: MigrationFinding[];\n conflicts: MigrationFinding[];\n}\n\n/**\n * Move legacy `.claude/.sidekick-*` state files to the canonical\n * `.claude/.semantic-memory/<name>` paths.\n *\n * Behavior per file:\n * - old exists, new does not → MIGRATE: rename old to new\n * - old does not exist → SKIP (skipped-no-source)\n * - old does not exist, new exists → SKIP (skipped-already-migrated)\n * - both old and new exist → CONFLICT (refused without --force)\n * With --force: prefer new, delete old\n *\n * Idempotent: a second run after a successful migration is all-no-ops.\n */\nexport function migrateState(opts: MigrateStateOptions): MigrateStateResult {\n const result: MigrateStateResult = {\n migrated: [],\n skipped: [],\n conflicts: [],\n };\n\n const stateDir = join(opts.projectRoot, \".claude\", \".semantic-memory\");\n if (!opts.dryRun && !existsSync(stateDir)) {\n mkdirSync(stateDir, { recursive: true });\n }\n\n for (const m of STATE_MIGRATIONS) {\n const oldPath = join(opts.projectRoot, \".claude\", m.old);\n const newPath = join(opts.projectRoot, \".claude\", m.new);\n const oldExists = existsSync(oldPath);\n const newExists = existsSync(newPath);\n\n if (!oldExists && !newExists) {\n result.skipped.push({ name: m.name, status: \"skipped-no-source\", oldPath, newPath, detail: \"neither path exists\" });\n continue;\n }\n if (!oldExists && newExists) {\n result.skipped.push({ name: m.name, status: \"skipped-already-migrated\", oldPath, newPath, detail: \"already at new path\" });\n continue;\n }\n if (oldExists && newExists) {\n if (!opts.force) {\n const oldMtime = safeMtime(oldPath);\n const newMtime = safeMtime(newPath);\n result.conflicts.push({\n name: m.name,\n status: \"conflict\",\n oldPath,\n newPath,\n detail: `both paths exist (old: ${oldMtime}, new: ${newMtime}); pass --force to keep new and delete old`,\n });\n continue;\n }\n // --force: prefer new, delete old\n if (!opts.dryRun) {\n try { unlinkSync(oldPath); } catch (e: any) {\n result.conflicts.push({ name: m.name, status: \"conflict\", oldPath, newPath, detail: `force-delete of old failed: ${e?.message ?? e}` });\n continue;\n }\n }\n result.migrated.push({\n name: m.name,\n status: \"resolved-by-force\",\n oldPath,\n newPath,\n detail: opts.dryRun ? \"dry-run: would delete old\" : \"old deleted; new preserved\",\n });\n continue;\n }\n // oldExists && !newExists → migrate\n if (!opts.dryRun) {\n try { renameSync(oldPath, newPath); } catch (e: any) {\n // Cross-device rename failure is theoretically possible; for state files all\n // under .claude/, both paths are the same filesystem in practice.\n result.conflicts.push({ name: m.name, status: \"conflict\", oldPath, newPath, detail: `rename failed: ${e?.message ?? e}` });\n continue;\n }\n }\n result.migrated.push({\n name: m.name,\n status: \"migrated\",\n oldPath,\n newPath,\n detail: opts.dryRun ? \"dry-run: would rename old to new\" : \"renamed\",\n });\n }\n\n return result;\n}\n\nfunction safeMtime(path: string): string {\n try {\n return statSync(path).mtime.toISOString();\n } catch {\n return \"unknown\";\n }\n}\n","import type { Command } from \"commander\";\nimport { featureState, describeFeature, setSettingsEnv, setRepoConfig, ENV, type Feature } from \"../core/features.js\";\n\nconst NEXT = \"takes effect in the next Claude Code session (settings env is read at session start)\";\n\nfunction toggle(feature: Feature, on: boolean, opts: { repo?: boolean; clear?: boolean }) {\n const cwd = process.cwd();\n try {\n if (opts.repo) {\n const path = setRepoConfig(cwd, \"skill_loop\", opts.clear ? undefined : on ? \"on\" : \"off\");\n console.log(`✓ ${opts.clear ? \"cleared\" : \"set\"} skill_loop${opts.clear ? \"\" : `: ${on ? \"on\" : \"off\"}`} in ${path}`);\n } else {\n // \"off\" removes the key rather than writing 0: off is the default, and nothing is left behind\n const { path, backup } = setSettingsEnv(ENV[feature], on ? \"1\" : undefined);\n console.log(`✓ ${on ? \"set\" : \"removed\"} ${ENV[feature]}${on ? \"=1\" : \"\"} in ${path}${backup ? ` (previous file: ${backup})` : \"\"}`);\n console.log(` ${NEXT}`);\n }\n } catch (e) {\n console.error(`✗ ${(e as Error).message}`);\n process.exit(1);\n }\n // the switch as this repo will see it next session\n const env = { ...process.env };\n if (!opts.repo) {\n if (on) env[ENV[feature]] = \"1\";\n else delete env[ENV[feature]];\n }\n console.log(` now: ${describeFeature(featureState(feature, cwd, env))}`);\n}\n\nexport function registerFeatureCommands(program: Command, extraStatus: Partial<Record<Feature, (cwd: string) => Promise<string[]>>> = {}) {\n for (const [feature, name, what] of [\n [\"skill_loop\", \"skill-loop\", \"the skill loop (learned skills between sessions)\"],\n [\"jev\", \"jev-mode\", \"jev mode (Jev through jev-loop for closed-set decisions)\"],\n ] as const) {\n const cmd = program.commands.find((c) => c.name() === name) ?? program.command(name).description(`Turn ${what} on or off, or show its state.`);\n const on = cmd.command(\"on\").description(`Turn ${what} on (sets ${ENV[feature]}=1 in ~/.claude/settings.json env).`);\n const off = cmd.command(\"off\").description(`Turn ${what} off (removes ${ENV[feature]} from ~/.claude/settings.json env).`);\n if (feature === \"skill_loop\") {\n for (const c of [on, off]) {\n c.option(\"--repo\", \"Write the per-repo override in .claude/.semantic-memory/config instead (beats the global switch)\");\n c.option(\"--clear\", \"With --repo: remove the override so the global switch applies\");\n }\n }\n on.action((opts) => toggle(feature, true, opts));\n off.action((opts) => toggle(feature, false, opts));\n cmd\n .command(\"status\")\n .description(`Show whether ${what} is on, and why.`)\n .option(\"--json\", \"JSON output\")\n .action(async (opts) => {\n const cwd = process.cwd();\n const s = featureState(feature, cwd);\n const extra = (await extraStatus[feature]?.(cwd)) ?? [];\n if (opts.json) console.log(JSON.stringify({ ...s, details: extra }, null, 2));\n else for (const line of [describeFeature(s), ...extra.map((l) => ` ${l}`)]) console.log(line);\n process.exit(0);\n });\n }\n}\n","import type { Command } from \"commander\";\nimport { resolve } from \"node:path\";\n\n/** `skill-loop` subcommands beyond on / off / status (v1.7). The worker is what SessionEnd starts. */\nexport function registerSkillLoopCommands(program: Command) {\n const cmd = program.commands.find((c) => c.name() === \"skill-loop\")!;\n registerReviewCommands(cmd);\n registerCuratorCommands(cmd);\n cmd\n .command(\"worker\")\n .description(\"Drain this repo's review queue (started detached by the SessionEnd hook; safe to run by hand).\")\n .option(\"--repo <dir>\", \"Repo root (default: cwd)\")\n .action(async (opts) => {\n const repo = resolve(opts.repo ?? process.cwd());\n const { featureOn } = await import(\"../core/features.js\");\n const { log } = await import(\"../core/skill-queue.js\");\n if (!featureOn(\"skill_loop\", repo)) {\n log(repo, \"worker: skill loop is off — queue left as it is\");\n process.exit(0);\n }\n const { drain } = await import(\"../core/skill-worker.js\");\n const { reviewSession } = await import(\"../core/skill-review.js\");\n const r = await drain(repo, (job) => reviewSession(job));\n console.log(r.locked ? \"another worker holds this repo's lock\" : `reviewed ${r.reviewed} session(s)${r.capped ? \"; daily cap reached\" : \"\"}${r.failed ? `; ${r.failed} set aside` : \"\"}`);\n process.exit(0);\n });\n}\n\nexport function registerReviewCommands(cmd: Command) {\n cmd\n .command(\"review\")\n .description(\"List skill drafts with their evidence (and diff, for patches); approve, reject or evaluate one.\")\n .option(\"--json\", \"JSON output\")\n .option(\"--approve <id>\", \"Land a draft (writes the skill and a ledger entry)\")\n .option(\"--promote\", \"With --approve: land it as a global skill replacing the project copies (needs a promotion)\")\n .option(\"--override <why>\", \"With --approve: land it although its eval gate did not adopt it (the reason is ledgered)\")\n .option(\"--reject <id>\", \"Drop a draft (ledgered)\")\n .option(\"--eval <id>\", \"Run the trigger eval on a draft and record the scores and the gate's verdict\")\n .option(\"--task\", \"With --eval: also replay the task with and without the skill (runs the draft's Verify command)\")\n .action(async (opts) => {\n const { repoRoot } = await import(\"../core/skill-evidence.js\");\n const land = await import(\"../core/skill-land.js\");\n const repo = repoRoot(process.cwd());\n try {\n if (opts.approve) {\n const e = land.approveDraft(repo, opts.approve, { promote: opts.promote, override: opts.override });\n console.log(`✓ ${e.action}: ${e.files.map((f) => f.path).join(\", \")} (ledger ${e.id}; undo: skill-loop rollback ${e.id})`);\n } else if (opts.reject) {\n const e = land.rejectDraft(repo, opts.reject);\n console.log(`✓ rejected ${e.skill} (ledger ${e.id})`);\n } else if (opts.eval) {\n const ev = await land.evalDraft(repo, opts.eval, { task: opts.task });\n console.log(opts.json ? JSON.stringify(ev, null, 2) : `gate: ${ev.gate.verdict} — ${ev.gate.reasons.join(\"; \")} (${ev.prompts} prompts, ${ev.runs} claude runs)`);\n } else {\n const drafts = land.describeDrafts(repo);\n if (opts.json) console.log(JSON.stringify(drafts, null, 2));\n else if (!drafts.length) console.log(\"no skill drafts waiting\");\n else\n for (const d of drafts) {\n console.log(`\\n${d.id} ${d.kind} ${d.name} → ${d.destination}`);\n console.log(` scope: ${d.scope}${d.scope_why ? ` (${d.scope_why})` : \"\"}${d.promotion?.length ? `; also in ${d.promotion.map((p) => p.repo).join(\", \")}: --promote offers one global skill` : \"\"}`);\n console.log(` evidence: sessions ${d.provenance?.sessions.join(\", \")}; failures ${d.provenance?.failures.join(\", \") || \"-\"}; corrections ${d.provenance?.corrections.join(\", \") || \"-\"}`);\n if (d.verify.kind === \"command\") console.log(` verify command (a --task eval runs it): ${d.verify.command}`);\n if (d.evals) console.log(` evals: ${JSON.stringify((d.evals as any).gate)}`);\n for (const w of d.warnings) console.log(` ! ${w}`);\n }\n }\n } catch (e) {\n console.error(`✗ ${(e as Error).message}`);\n process.exit(1);\n }\n process.exit(0);\n });\n cmd\n .command(\"rollback <ledger-id>\")\n .description(\"Undo one ledgered change exactly (refuses if a file changed since).\")\n .action(async (id: string) => {\n const { repoRoot } = await import(\"../core/skill-evidence.js\");\n const { rollback } = await import(\"../core/skill-ledger.js\");\n try {\n const e = rollback(repoRoot(process.cwd()), id);\n console.log(`✓ ${e.why} (ledger ${e.id})`);\n } catch (err) {\n console.error(`✗ ${(err as Error).message}`);\n process.exit(1);\n }\n process.exit(0);\n });\n}\n\nexport function registerCuratorCommands(cmd: Command) {\n const repoOf = async () => (await import(\"../core/skill-evidence.js\")).repoRoot(process.cwd());\n cmd\n .command(\"curate\")\n .description(\"Mark learned skills unused 14 days stale and archive those unused 30 days (pinned / cited / new ones skipped).\")\n .option(\"--dry-run\", \"Show what would change, change nothing\")\n .option(\"--merge\", \"Also propose merges of overlapping learned skills as review drafts (opt-in)\")\n .option(\"--auto\", \"Started by SessionStart: quiet, logs to skill-loop.log\")\n .action(async (opts) => {\n const repo = await repoOf();\n const { curate } = await import(\"../core/skill-curator.js\");\n const { log } = await import(\"../core/skill-queue.js\");\n const r = curate(repo, { dryRun: opts.dryRun });\n const changes = r.actions.filter((a) => a.action !== \"skip\" && a.action !== \"keep\");\n if (opts.auto) log(repo, `curator: ${changes.map((a) => `${a.action} ${a.skill} (${a.why})`).join(\", \") || \"nothing to do\"}`);\n else for (const a of r.actions) console.log(`${opts.dryRun ? \"would \" : \"\"}${a.action.padEnd(10)} ${a.skill} — ${a.why}`);\n if (!opts.auto && !r.actions.length) console.log(\"no learned skills here\");\n const { consolidateOn, proposeMerges } = await import(\"../core/skill-merge.js\");\n if (!opts.dryRun && (opts.merge || consolidateOn(repo))) {\n const m = await proposeMerges(repo);\n const line = `merge: ${m.drafted.length} draft(s) for review${m.skipped.length ? `; ${m.skipped.join(\"; \")}` : \"\"}`;\n if (opts.auto) log(repo, line);\n else console.log(line);\n }\n process.exit(0);\n });\n cmd\n .command(\"restore <name>\")\n .description(\"Bring an archived learned skill back, active.\")\n .action(async (name: string) => {\n const { restore } = await import(\"../core/skill-curator.js\");\n try {\n const e = restore(await repoOf(), name);\n console.log(`✓ restored ${name} → ${e.files[0].path} (ledger ${e.id}). Pin it (skill_loop.pinned: true) to keep the curator away.`);\n } catch (err) {\n console.error(`✗ ${(err as Error).message}`);\n process.exit(1);\n }\n process.exit(0);\n });\n cmd\n .command(\"verify\")\n .description(\"Run each landed learned skill's ## Verify command here; failures are flagged, nothing is archived.\")\n .action(async () => {\n const { verifySkills } = await import(\"../core/skill-curator.js\");\n const r = verifySkills(await repoOf());\n for (const x of r) console.log(`${x.result === \"pass\" ? \"✓\" : x.result === \"fail\" ? \"✗\" : \"·\"} ${x.skill}: ${x.result} — ${x.detail}`);\n if (!r.length) console.log(\"no learned skills here\");\n process.exit(r.some((x) => x.result === \"fail\") ? 1 : 0);\n });\n}\n\n/** Extra `skill-loop status` lines: drafts waiting, today's review budget. */\nexport async function skillLoopStatus(cwd: string): Promise<string[]> {\n const { repoRoot } = await import(\"../core/skill-evidence.js\");\n const { listDrafts } = await import(\"../core/skill-review.js\");\n const { runsToday, dailyRunCap, pendingJobs, lockHolder } = await import(\"../core/skill-queue.js\");\n const repo = repoRoot(cwd);\n const lines = [\n `drafts waiting: ${listDrafts(repo).length}${listDrafts(repo).length ? \" (/skill-loop review)\" : \"\"}`,\n `queued sessions for this repo: ${pendingJobs(repo).length}${lockHolder(repo) ? ` (worker running, pid ${lockHolder(repo)})` : \"\"}`,\n `reviews today (all repos): ${runsToday()} of ${dailyRunCap()} (SEMANTIC_MEMORY_SKILL_LOOP_DAILY_RUNS)`,\n ];\n const { curatorState } = await import(\"../core/skill-curator.js\");\n const st = curatorState(repo);\n lines.push(`curator: ${st.last_run ? `last run ${st.last_run.slice(0, 16)} — ${st.last_report}` : \"not run yet (first run 7 days after the loop first sees a repo)\"}`);\n if (st.flagged?.length) lines.push(`verify failures flagged: ${st.flagged.map((f) => f.name).join(\", \")}`);\n return lines;\n}\n","import type { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parseSkill } from \"../core/skill-schema.js\";\nimport { buildEvalSet, type CandidatePrompt } from \"../core/skill-eval/sets.js\";\nimport { runTrigger } from \"../core/skill-eval/trigger.js\";\nimport { runTaskEval } from \"../core/skill-eval/task.js\";\nimport { tuneDescription } from \"../core/skill-eval/tune.js\";\n\nconst pct = (n: number | null) => (n === null ? \"n/a\" : `${Math.round(n * 100)}%`);\n\nfunction load(file: string, promptsFile: string) {\n const skillRaw = readFileSync(resolve(file), \"utf8\");\n const candidates: CandidatePrompt[] = readFileSync(resolve(promptsFile), \"utf8\").split(\"\\n\").filter(Boolean).map((l) => JSON.parse(l));\n return { skillRaw, prompts: buildEvalSet(parseSkill(skillRaw), candidates) };\n}\n\nconst out = (json: boolean | undefined, data: unknown, text: () => string) => console.log(json ? JSON.stringify(data, null, 2) : text());\n\nexport function registerSkillEvalCommands(program: Command): void {\n const ev = program.command(\"skill-eval\").description(\"Evaluate a learned skill: does it trigger, does it help, can its description be better (v1.7)\");\n const repoRoot = process.cwd();\n const fail = (e: unknown) => {\n console.error(`✗ ${(e as Error).message}`);\n process.exit(1);\n };\n\n ev.command(\"trigger <skill-md>\")\n .description(\"Run the trigger eval; --prompts is JSONL of {session, text}\")\n .requiredOption(\"--prompts <jsonl>\", \"candidate prompts, one {session, text} per line\")\n .option(\"--json\", \"machine-readable output\")\n .action(async (file: string, opts: { prompts: string; json?: boolean }) => {\n try {\n const { skillRaw, prompts } = load(file, opts.prompts);\n const r = await runTrigger(prompts, { repoRoot, skillRaw });\n out(opts.json, r, () =>\n [\n `${r.skill}: ${prompts.length} prompts, ${r.runs} claude run(s)`,\n ...([\"train\", \"heldout\"] as const).map((s) => ` ${s}: triggers on ${pct(r[s].positiveRate)} of positives, false-triggers on ${pct(r[s].falseTriggerRate)} of near-misses (n=${r[s].n})`),\n ].join(\"\\n\"),\n );\n } catch (e) {\n fail(e);\n }\n });\n\n ev.command(\"task <skill-md>\")\n .description(\"Replay a task with and without the skill and check its ## Verify\")\n .requiredOption(\"--prompt <text>\", \"the task prompt\")\n .option(\"--json\", \"machine-readable output\")\n .action(async (file: string, opts: { prompt: string; json?: boolean }) => {\n try {\n const r = await runTaskEval({ repoRoot, skillRaw: readFileSync(resolve(file), \"utf8\"), prompt: opts.prompt });\n out(opts.json, r, () => `${r.skill}: with skill ${r.with.passed ? \"PASS\" : \"FAIL\"} (${r.with.evidence}); without ${r.without.passed ? \"PASS\" : \"FAIL\"} (${r.without.evidence})`);\n } catch (e) {\n fail(e);\n }\n });\n\n ev.command(\"tune <skill-md>\")\n .description(\"Propose a better description (never writes the skill file)\")\n .requiredOption(\"--prompts <jsonl>\", \"candidate prompts, one {session, text} per line\")\n .option(\"--json\", \"machine-readable output\")\n .action(async (file: string, opts: { prompts: string; json?: boolean }) => {\n try {\n const { skillRaw, prompts } = load(file, opts.prompts);\n const r = await tuneDescription({ repoRoot, skillRaw, prompts });\n out(opts.json, r, () =>\n r.improved\n ? `proposed (held-out ${pct(r.original.heldout)} -> ${pct(r.best.heldout)}):\\n${r.best.description}`\n : `no better description found (held-out ${pct(r.original.heldout)}); ${r.candidates.length - 1} tried`,\n );\n } catch (e) {\n fail(e);\n }\n });\n}\n"],"mappings":"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","names":["resolve","join","existsSync","readFileSync","out","existsSync","join","program","resolve","program","resolve","resolve","program","join","resolve","existsSync","readFileSync","readFileSync","resolve","join","out","existsSync"]}