akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -1,12 +0,0 @@
1
- ---
2
- description: Catalog of pages in the {{WIKI_NAME}} wiki. Regenerated by `akm index`.
3
- wikiRole: index
4
- ---
5
-
6
- # {{WIKI_NAME}} — index
7
-
8
- _This file is regenerated on every `akm index` run. Manual edits are
9
- preserved until the next regeneration, then replaced._
10
-
11
- _(no pages yet — create one with your editor, or ingest a source with `akm
12
- wiki stash {{WIKI_NAME}} <path>`.)_
@@ -1,83 +0,0 @@
1
- # Ingest workflow for wiki:{{WIKI_NAME}}
2
-
3
- Wiki location: {{WIKI_DIR}}
4
- Schema: {{SCHEMA_PATH}}
5
-
6
- Follow these steps. akm commands handle the invariants; use your native
7
- Read/Write/Edit tools for page edits.
8
-
9
- This workflow is for ingesting sources that are ALREADY present under
10
- `{{WIKI_DIR}}/raw/`. Do not ask the user for a source unless the raw queue is
11
- empty and the caller explicitly asked for interactive ingest.
12
-
13
- 1. **Read the schema.** Open `{{SCHEMA_PATH}}`. It defines the voice, page
14
- kinds, contradiction policy, and any wiki-specific conventions. Do not
15
- skip this step even on familiar wikis — the schema may have changed.
16
-
17
- 2. **Discover the pending raw queue.**
18
- ```sh
19
- akm wiki lint {{WIKI_NAME}}
20
- ```
21
- Focus on `uncited-raw` findings: those raw files exist under `raw/` but are
22
- not yet cited by any authored page. Treat each `uncited-raw` finding as a
23
- pending ingest item, and sort the queue **oldest raw file first** (by
24
- filename/mtime). Processing oldest-first keeps backlog age bounded even
25
- when the queue is larger than one run can finish. If there are no
26
- `uncited-raw` findings, exit cleanly after a final `akm index` +
27
- `akm wiki lint {{WIKI_NAME}}` verification.
28
-
29
- Do not read or classify the whole backlog upfront. Work the queue as a
30
- bounded loop, one raw file at a time: fully finish a raw (read → decide →
31
- edit → log entry, steps 3-7 below) before looking at the next one. If you
32
- run low on time partway through a large backlog, stop after finishing your
33
- current raw — do not start a new one you can't complete. This is expected
34
- and fine: whatever you already merged is committed to the pages and
35
- `log.md`, so the next scheduled run picks up where you left off instead of
36
- redoing this run's work.
37
-
38
- 3. **For the current raw file, read the source and find related pages.**
39
- Open the raw file directly from `{{WIKI_DIR}}/raw/`.
40
-
41
- If the file does not read as text (binary content, garbled bytes, e.g. a
42
- raw PDF byte-dump that was never text-extracted), do not attempt deep
43
- forensic recovery (no web searches, no `strings`-style dumps). Append a
44
- one-line `log.md` entry noting it as skipped/unprocessable with a short
45
- reason, then move on to the next raw in the queue.
46
-
47
- Otherwise, search for related pages:
48
- ```sh
49
- akm wiki search {{WIKI_NAME}} "<key terms from the raw source>"
50
- ```
51
- Read the top hits with `akm show wiki:{{WIKI_NAME}}/pages/<page>`. Use
52
- `akm show wiki:{{WIKI_NAME}}/pages/<page> toc` for large pages.
53
-
54
- 4. **Decide for each candidate.** For each related page:
55
- - **Append**: add a section or paragraph under the relevant heading.
56
- Include the raw source in the page's `sources:` frontmatter list.
57
- - **Contradict**: note the tension explicitly; don't silently overwrite.
58
- Follow the schema's contradiction policy.
59
- - **Skip**: source doesn't add to this page — move on.
60
-
61
- 5. **Create new pages for concepts/entities the source introduces**, under
62
- `{{WIKI_DIR}}/pages/` (never at the wiki root — only `schema.md`,
63
- `index.md`, and `log.md` belong there). Each new page must have
64
- frontmatter with `description`, `pageKind`, `xrefs`, and `sources`.
65
- Cross-reference with related pages both directions.
66
-
67
- 6. **Update xrefs both ways.** If page A now xrefs page B, page B must xref
68
- page A. `akm wiki lint {{WIKI_NAME}}` will flag violations.
69
-
70
- 7. **Append to `log.md`.** One entry per processed raw source (ingested or
71
- skipped-as-unprocessable): date, raw slug, one-line summary, refs to
72
- created/edited pages. Newest at the top.
73
-
74
- 8. **Regenerate the index + verify.**
75
- ```sh
76
- akm index
77
- akm wiki lint {{WIKI_NAME}}
78
- ```
79
- Resolve any lint findings before calling the ingest done.
80
-
81
- That's it. `akm` never calls an LLM — reasoning is your job; it just owns
82
- the invariants (raw immutability, ref validation, index regeneration,
83
- structural lint).
@@ -1,8 +0,0 @@
1
- ---
2
- description: Append-only log for the {{WIKI_NAME}} wiki. Newest entries at the top.
3
- wikiRole: log
4
- ---
5
-
6
- # {{WIKI_NAME}} — log
7
-
8
- _Each entry: ISO date, operation, brief summary._
@@ -1,61 +0,0 @@
1
- ---
2
- description: Rules that govern this wiki. Read before ingesting, searching, or editing pages.
3
- wikiRole: schema
4
- ---
5
-
6
- # {{WIKI_NAME}} wiki schema
7
-
8
- This wiki follows the three-layer pattern:
9
-
10
- - `raw/` — immutable ingested sources (never edit)
11
- - `pages/<page>.md` and `pages/<topic>/<page>.md` — agent-authored pages
12
- - `schema.md` (this file), `index.md`, `log.md` — wiki-level metadata
13
-
14
- ## Page frontmatter
15
-
16
- Every page should carry frontmatter so akm can index and link it:
17
-
18
- ```yaml
19
- ---
20
- description: one-sentence summary used in search and lint
21
- pageKind: entity | concept | question | note | <your-custom-kind>
22
- xrefs:
23
- - wiki:{{WIKI_NAME}}/pages/other-page
24
- sources:
25
- - raw/<slug>.md
26
- ---
27
- ```
28
-
29
- `pageKind` accepts any non-empty string. Add new categories freely; they
30
- will surface in `index.md` as new sections after the next `akm index` run.
31
-
32
- ## Three operations
33
-
34
- ### Ingest
35
-
36
- 1. Copy the new source into `raw/` with `akm wiki stash {{WIKI_NAME}} <path>`.
37
- 2. Find related pages: `akm wiki search {{WIKI_NAME}} "<terms>"`.
38
- 3. For each related page: append a section, note a contradiction, or create a
39
- new page under `pages/`. Update xrefs on both sides.
40
- 4. Cite the raw source in each touched page's `sources:` frontmatter.
41
- 5. Append one entry to `log.md` describing what was assimilated.
42
-
43
- ### Query
44
-
45
- 1. `akm wiki search {{WIKI_NAME}} "<question>"` — find candidate pages.
46
- 2. `akm show wiki:{{WIKI_NAME}}/pages/<page>` — read the top hits.
47
- 3. Compose the answer from the wiki; cite raw sources only when the wiki
48
- points at them.
49
-
50
- ### Lint
51
-
52
- 1. `akm wiki lint {{WIKI_NAME}}` — deterministic structural checks.
53
- 2. Resolve each finding: link orphans, fix broken xrefs, add descriptions,
54
- cite uncited raws, refresh the index.
55
-
56
- ## Hard rules
57
-
58
- - `raw/` is immutable. Never edit ingested sources.
59
- - Cross-references must point at pages that actually exist.
60
- - Prefer appending to an existing page over duplicating one.
61
- - Cite the raw source id (e.g. `raw/2026-04-foo.md`) when copying claims.
@@ -1,150 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import { stripJsonComments } from "../core/config/config.js";
7
- import { unifiedDiff, withConfigLock, writeConfigAtomic } from "../core/config/config-io.js";
8
- import { migrateConfigShape } from "../core/config/config-migration.js";
9
- import { getCacheDir, getConfigPath } from "../core/paths.js";
10
- import { warn } from "../core/warn.js";
11
- export { migrateConfigShape } from "../core/config/config-migration.js";
12
- const PROJECT_CONFIG_RELATIVE_PATH = path.join(".akm", "config.json");
13
- function backupConfigFile(configPath) {
14
- if (!fs.existsSync(configPath))
15
- return;
16
- const backupDir = path.join(getCacheDir(), "config-backups");
17
- // 08-F4: lock the backup dir owner-only (0700) — see config-io.ts.
18
- fs.mkdirSync(backupDir, { recursive: true, mode: 0o700 });
19
- fs.chmodSync(backupDir, 0o700);
20
- const timestamp = new Date().toISOString().replace(/[.:]/g, "-");
21
- const backupPath = path.join(backupDir, `config-${timestamp}.json`);
22
- fs.copyFileSync(configPath, backupPath);
23
- const latestPath = path.join(backupDir, "config.latest.json");
24
- fs.copyFileSync(configPath, latestPath);
25
- // 08-F4: config backups can carry secrets (endpoints/tokens) — keep them
26
- // owner-only rather than inheriting the source file's (often 0644) mode.
27
- fs.chmodSync(backupPath, 0o600);
28
- fs.chmodSync(latestPath, 0o600);
29
- }
30
- function acquireMigrateLock(lockPath, noWait) {
31
- const lockDir = path.dirname(lockPath);
32
- fs.mkdirSync(lockDir, { recursive: true });
33
- const maxAttempts = noWait ? 1 : 20;
34
- const delayMs = 200;
35
- for (let attempt = 0; attempt < maxAttempts; attempt++) {
36
- try {
37
- fs.writeFileSync(lockPath, String(process.pid), { flag: "wx" });
38
- return () => {
39
- try {
40
- fs.unlinkSync(lockPath);
41
- }
42
- catch {
43
- // ignore
44
- }
45
- };
46
- }
47
- catch {
48
- if (noWait) {
49
- return null;
50
- }
51
- // Simple busy-wait — synchronous since this is a one-shot CLI action
52
- const deadline = Date.now() + delayMs;
53
- while (Date.now() < deadline) {
54
- // spin
55
- }
56
- }
57
- }
58
- return null;
59
- }
60
- export async function migrateConfigFile(filePath, opts) {
61
- if (!fs.existsSync(filePath)) {
62
- return { changed: false, result: {} };
63
- }
64
- const text = fs.readFileSync(filePath, "utf8");
65
- let raw;
66
- try {
67
- const stripped = stripJsonComments(text);
68
- const parsed = JSON.parse(stripped);
69
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
70
- warn(`[akm] config-migrate: ${filePath} is not a valid JSON object, skipping.`);
71
- return { changed: false, result: {} };
72
- }
73
- raw = parsed;
74
- }
75
- catch {
76
- warn(`[akm] config-migrate: failed to parse ${filePath}, skipping.`);
77
- return { changed: false, result: {} };
78
- }
79
- const { changed, result } = migrateConfigShape(raw);
80
- if (!changed) {
81
- return { changed: false, result };
82
- }
83
- const migratedText = `${JSON.stringify(result, null, 2)}\n`;
84
- // WS-2: compute a diff when requested (always computed for --print-diff;
85
- // never requires a write so safe in --dry-run).
86
- const diff = opts.printDiff ? unifiedDiff(text, migratedText, filePath) : undefined;
87
- if (opts.dryRun) {
88
- return { changed: true, result, diff };
89
- }
90
- // WS-3: acquire config write lock + use atomic write (tmp → rename).
91
- withConfigLock(() => {
92
- backupConfigFile(filePath);
93
- writeConfigAtomic(filePath, result);
94
- });
95
- return { changed: true, result, diff };
96
- }
97
- function discoverProjectConfigPaths(startDir) {
98
- const paths = [];
99
- let currentDir = path.resolve(startDir);
100
- while (true) {
101
- const configPath = path.join(currentDir, PROJECT_CONFIG_RELATIVE_PATH);
102
- if (fs.existsSync(configPath) && fs.statSync(configPath).isFile()) {
103
- paths.unshift(configPath);
104
- }
105
- const parentDir = path.dirname(currentDir);
106
- if (parentDir === currentDir)
107
- break;
108
- currentDir = parentDir;
109
- }
110
- return paths;
111
- }
112
- export async function runConfigMigrate(opts) {
113
- const userConfigPath = getConfigPath();
114
- const projectPaths = discoverProjectConfigPaths(process.cwd());
115
- const allPaths = [userConfigPath, ...projectPaths].filter((p, i, arr) => arr.indexOf(p) === i && fs.existsSync(p));
116
- if (allPaths.length === 0) {
117
- console.log("No config files found to migrate.");
118
- return;
119
- }
120
- const lockPath = path.join(getCacheDir(), "config-migrate.lock");
121
- const releaseLock = acquireMigrateLock(lockPath, opts.noWait ?? false);
122
- if (!releaseLock) {
123
- warn("[akm] config-migrate: another migration is already in progress, skipping.");
124
- return;
125
- }
126
- try {
127
- let anyChanged = false;
128
- for (const filePath of allPaths) {
129
- const { changed, diff } = await migrateConfigFile(filePath, { dryRun: opts.dryRun, printDiff: opts.printDiff });
130
- if (changed) {
131
- const action = opts.dryRun ? "would migrate" : "migrated";
132
- console.log(`[akm] ${action}: ${filePath}`);
133
- // WS-2: print the unified diff to stdout when --print-diff is set.
134
- if (diff) {
135
- console.log(diff);
136
- }
137
- anyChanged = true;
138
- }
139
- else {
140
- console.log(`[akm] already up to date: ${filePath}`);
141
- }
142
- }
143
- if (!anyChanged) {
144
- console.log("All config files are already at the current version.");
145
- }
146
- }
147
- finally {
148
- releaseLock();
149
- }
150
- }
@@ -1,39 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- /**
5
- * `akm config validate` — verify the on-disk config matches the schema.
6
- *
7
- * Reads the user config file, validates against AkmConfigSchema, and either
8
- * prints "All checks passed." or a list of structured errors (path + message).
9
- * Exits non-zero on errors so it composes well in CI hooks.
10
- */
11
- import fs from "node:fs";
12
- import { parseConfigText } from "../core/config/config-io.js";
13
- import { validateConfigShape } from "../core/config/config-schema.js";
14
- import { ConfigError } from "../core/errors.js";
15
- import { getConfigPath } from "../core/paths.js";
16
- export async function runConfigValidate() {
17
- const configPath = getConfigPath();
18
- if (!fs.existsSync(configPath)) {
19
- console.log(`No config file at ${configPath} — nothing to validate.`);
20
- return;
21
- }
22
- let text;
23
- try {
24
- text = fs.readFileSync(configPath, "utf8");
25
- }
26
- catch (err) {
27
- const detail = err instanceof Error ? err.message : String(err);
28
- throw new ConfigError(`Could not read config at ${configPath}: ${detail}`, "INVALID_CONFIG_FILE");
29
- }
30
- // parseConfigText throws ConfigError on malformed JSON (#458). Surface as-is.
31
- const raw = parseConfigText(text, configPath);
32
- const result = validateConfigShape(raw);
33
- if (result.ok) {
34
- console.log(`All checks passed. (${configPath})`);
35
- return;
36
- }
37
- const lines = result.errors.map((e) => ` - ${e.path || "(root)"}: ${e.message}`).join("\n");
38
- throw new ConfigError(`Config at ${configPath} has ${result.errors.length} validation error${result.errors.length === 1 ? "" : "s"}:\n${lines}`, "INVALID_CONFIG_FILE", "Fix the listed fields, or run `akm config migrate` if the errors look like legacy-shape leftovers.");
39
- }
@@ -1,124 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- /**
5
- * `akm graph` command family. Extracted verbatim from src/cli.ts (WS6) so the
6
- * God Module shrinks; the `main.subCommands.graph` key and every subcommand's
7
- * args/output shape are byte-identical. Each handler is migrated to
8
- * `defineJsonCommand`, which wraps the body in `runWithJsonErrors` and emits the
9
- * same JSON envelope (stdout/stderr/exit-code) as the inline `runWithJsonErrors`
10
- * form it replaces.
11
- */
12
- import { parsePositiveIntFlag } from "../../cli/parse-args.js";
13
- import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
14
- import { akmGraphEntities, akmGraphEntity, akmGraphExport, akmGraphOrphans, akmGraphRelated, akmGraphRelations, akmGraphSummary, akmGraphUpdate, } from "./graph.js";
15
- const graphSubCommands = {
16
- summary: defineJsonCommand({
17
- meta: { name: "summary", description: "Show entity-graph counts and quality telemetry" },
18
- args: {
19
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
20
- },
21
- run({ args }) {
22
- output("graph-summary", akmGraphSummary({ source: args.source }));
23
- },
24
- }),
25
- entities: defineJsonCommand({
26
- meta: { name: "entities", description: "List entities with per-file occurrence counts" },
27
- args: {
28
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
29
- limit: { type: "string", description: "Maximum entities to return" },
30
- },
31
- run({ args }) {
32
- output("graph-entities", akmGraphEntities({ source: args.source, limit: parsePositiveIntFlag(args.limit ?? undefined) }));
33
- },
34
- }),
35
- relations: defineJsonCommand({
36
- meta: { name: "relations", description: "List relations with occurrence counts" },
37
- args: {
38
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
39
- limit: { type: "string", description: "Maximum relations to return" },
40
- },
41
- run({ args }) {
42
- output("graph-relations", akmGraphRelations({ source: args.source, limit: parsePositiveIntFlag(args.limit ?? undefined) }));
43
- },
44
- }),
45
- related: defineJsonCommand({
46
- meta: { name: "related", description: "Show graph-related neighboring assets for a ref" },
47
- args: {
48
- ref: { type: "positional", description: "Asset ref", required: true },
49
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
50
- limit: { type: "string", description: "Maximum related assets to return" },
51
- },
52
- async run({ args }) {
53
- output("graph-related", await akmGraphRelated({
54
- ref: args.ref ?? "",
55
- source: args.source,
56
- limit: parsePositiveIntFlag(args.limit ?? undefined),
57
- }));
58
- },
59
- }),
60
- entity: defineJsonCommand({
61
- meta: { name: "entity", description: "List assets that contain the given entity" },
62
- args: {
63
- name: { type: "positional", description: "Entity name", required: true },
64
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
65
- limit: { type: "string", description: "Maximum matches to return" },
66
- },
67
- run({ args }) {
68
- output("graph-entity", akmGraphEntity({
69
- name: args.name ?? "",
70
- source: args.source,
71
- limit: parsePositiveIntFlag(args.limit ?? undefined),
72
- }));
73
- },
74
- }),
75
- orphans: defineJsonCommand({
76
- meta: { name: "orphans", description: "List assets with no extracted graph entities" },
77
- args: {
78
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
79
- limit: { type: "string", description: "Maximum orphans to return" },
80
- },
81
- run({ args }) {
82
- output("graph-orphans", akmGraphOrphans({ source: args.source, limit: parsePositiveIntFlag(args.limit ?? undefined) }));
83
- },
84
- }),
85
- export: defineJsonCommand({
86
- meta: { name: "export", description: "Export graph artifact as JSON or JSONL" },
87
- args: {
88
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
89
- out: { type: "string", description: "Output path" },
90
- format: { type: "string", description: "Export format (json|jsonl)", default: "json" },
91
- },
92
- run({ args }) {
93
- output("graph-export", akmGraphExport({
94
- source: args.source,
95
- out: args.out ?? "",
96
- format: args.format,
97
- }));
98
- },
99
- }),
100
- update: defineJsonCommand({
101
- meta: { name: "update", description: "Re-run graph extraction, optionally scoped to specific asset refs" },
102
- args: {
103
- refs: {
104
- type: "positional",
105
- description: "Zero or more asset refs to scope extraction (omit for a full re-extract)",
106
- required: false,
107
- default: "",
108
- },
109
- source: { type: "string", description: "Source name/path (default: primary stash source)" },
110
- },
111
- async run({ args }) {
112
- // `refs` is a single positional; collect remaining argv tokens as well.
113
- const rawRefs = [args.refs, ...(Array.isArray(args._) ? args._ : [])].filter((r) => typeof r === "string" && r.trim().length > 0);
114
- output("graph-update", await akmGraphUpdate({ refs: rawRefs.length > 0 ? rawRefs : undefined, source: args.source }));
115
- },
116
- }),
117
- };
118
- export const graphCommand = defineGroupCommand({
119
- meta: { name: "graph", description: "Inspect the indexed entity graph stored in SQLite" },
120
- subCommands: graphSubCommands,
121
- defaultRun() {
122
- output("graph-summary", akmGraphSummary());
123
- },
124
- });