akm-cli 0.9.0-rc.0 → 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 (598) hide show
  1. package/CHANGELOG.md +1283 -22
  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/prompts/workflow-unit-preamble.md +26 -0
  26. package/dist/assets/stash-skeleton/README.md +38 -10
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  38. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  39. package/dist/assets/tasks/core/extract.yml +3 -2
  40. package/dist/assets/tasks/core/improve.yml +2 -1
  41. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  42. package/dist/assets/tasks/core/sync.yml +1 -0
  43. package/dist/assets/tasks/core/version-check.yml +2 -1
  44. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  45. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  46. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  48. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  49. package/dist/assets/templates/html/health.html +5 -4
  50. package/dist/assets/workflows/workflow-template.md +31 -15
  51. package/dist/cli/invocation.js +279 -0
  52. package/dist/cli/parse-args.js +5 -90
  53. package/dist/cli/retired-commands.js +78 -0
  54. package/dist/cli/shared.js +158 -48
  55. package/dist/cli-node.mjs +2 -1
  56. package/dist/cli.js +747 -293
  57. package/dist/commands/agent/agent-dispatch.js +19 -18
  58. package/dist/commands/agent/agent-support.js +0 -24
  59. package/dist/commands/agent/contribute-cli.js +43 -97
  60. package/dist/commands/completions.js +80 -23
  61. package/dist/commands/config-cli.js +44 -281
  62. package/dist/commands/env/env-binding.js +99 -0
  63. package/dist/commands/env/env-cli.js +84 -224
  64. package/dist/commands/env/env.js +12 -163
  65. package/dist/commands/env/marker-path.js +6 -0
  66. package/dist/commands/env/secret-cli.js +45 -61
  67. package/dist/commands/env/secret.js +32 -62
  68. package/dist/commands/feedback-cli.js +179 -85
  69. package/dist/commands/health/accept-rate.js +58 -0
  70. package/dist/commands/health/advisories.js +7 -8
  71. package/dist/commands/health/checks.js +279 -94
  72. package/dist/commands/health/html-report.js +197 -578
  73. package/dist/commands/health/improve-metrics.js +277 -246
  74. package/dist/commands/health/llm-usage.js +19 -19
  75. package/dist/commands/health/md-report.js +16 -7
  76. package/dist/commands/health/metrics.js +67 -32
  77. package/dist/commands/health/renderers.js +47 -0
  78. package/dist/commands/health/report-view-model.js +508 -0
  79. package/dist/commands/health/stash-exposure.js +1 -1
  80. package/dist/commands/health/surfaces.js +16 -56
  81. package/dist/commands/health/task-runs.js +3 -67
  82. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  83. package/dist/commands/health/types-improve.js +29 -0
  84. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  85. package/dist/commands/health/types-result.js +7 -0
  86. package/dist/commands/health/types-runs.js +4 -0
  87. package/dist/commands/health/types-session-log.js +4 -0
  88. package/dist/commands/health/types-windows.js +4 -0
  89. package/dist/commands/health/types.js +26 -21
  90. package/dist/commands/health/windows.js +2 -3
  91. package/dist/commands/health.js +296 -167
  92. package/dist/commands/improve/anti-collapse.js +5 -5
  93. package/dist/commands/improve/autonomy-gate.js +68 -0
  94. package/dist/commands/improve/collapse-detector.js +65 -52
  95. package/dist/commands/improve/consolidate/chunking.js +9 -7
  96. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  97. package/dist/commands/improve/consolidate/merge.js +4 -0
  98. package/dist/commands/improve/consolidate.js +454 -1354
  99. package/dist/commands/improve/content-hash.js +39 -0
  100. package/dist/commands/improve/distill/content-repair.js +4 -10
  101. package/dist/commands/improve/distill/promote-memory.js +89 -64
  102. package/dist/commands/improve/distill/quality-gate.js +118 -42
  103. package/dist/commands/improve/distill-guards.js +1 -1
  104. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  105. package/dist/commands/improve/distill.js +607 -363
  106. package/dist/commands/improve/eligibility.js +165 -79
  107. package/dist/commands/improve/extract-cli.js +35 -126
  108. package/dist/commands/improve/extract-prompt.js +6 -35
  109. package/dist/commands/improve/extract.js +640 -391
  110. package/dist/commands/improve/feedback-valence.js +2 -12
  111. package/dist/commands/improve/improve-cli.js +134 -135
  112. package/dist/commands/improve/improve-result-file.js +30 -50
  113. package/dist/commands/improve/improve-run-types.js +4 -0
  114. package/dist/commands/improve/improve-strategies.js +135 -0
  115. package/dist/commands/improve/improve.js +904 -701
  116. package/dist/commands/improve/locks.js +64 -111
  117. package/dist/commands/improve/loop-stages.js +1110 -923
  118. package/dist/commands/improve/memory/derived-ref.js +124 -0
  119. package/dist/commands/improve/memory/memory-belief.js +79 -7
  120. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  121. package/dist/commands/improve/memory/memory-improve.js +25 -37
  122. package/dist/commands/improve/outcome-loop.js +25 -88
  123. package/dist/commands/improve/preparation.js +1034 -813
  124. package/dist/commands/improve/proactive-maintenance.js +34 -9
  125. package/dist/commands/improve/proposal-envelope.js +31 -0
  126. package/dist/commands/improve/reflect.js +983 -794
  127. package/dist/commands/improve/run-context.js +119 -0
  128. package/dist/commands/improve/salience.js +24 -127
  129. package/dist/commands/improve/session-asset.js +7 -3
  130. package/dist/commands/improve/shared.js +14 -34
  131. package/dist/commands/improve/source-identity.js +28 -0
  132. package/dist/commands/improve/triage.js +20 -17
  133. package/dist/commands/lint/base-linter.js +340 -313
  134. package/dist/commands/lint/env-key-rules.js +31 -47
  135. package/dist/commands/lint/index.js +185 -30
  136. package/dist/commands/{events.js → log.js} +28 -38
  137. package/dist/commands/migrate-cli.js +54 -0
  138. package/dist/commands/migration-tool.js +55 -0
  139. package/dist/commands/observability-cli.js +70 -208
  140. package/dist/commands/proposal/diff-format.js +50 -0
  141. package/dist/commands/proposal/drain-policies.js +0 -6
  142. package/dist/commands/proposal/drain.js +91 -40
  143. package/dist/commands/proposal/proposal-cli.js +134 -132
  144. package/dist/commands/proposal/proposal-types.js +56 -0
  145. package/dist/commands/proposal/proposal.js +83 -65
  146. package/dist/commands/proposal/propose-cli.js +88 -0
  147. package/dist/commands/proposal/propose.js +105 -88
  148. package/dist/commands/proposal/repository.js +1303 -278
  149. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  150. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  151. package/dist/commands/proposal/validators/proposals.js +6 -8
  152. package/dist/commands/read/curate.js +78 -73
  153. package/dist/commands/read/knowledge.js +510 -13
  154. package/dist/commands/read/registry-search.js +2 -2
  155. package/dist/commands/read/remember-cli.js +84 -15
  156. package/dist/commands/read/search-cli.js +203 -96
  157. package/dist/commands/read/search.js +126 -94
  158. package/dist/commands/read/show.js +226 -250
  159. package/dist/commands/registry-cli.js +34 -60
  160. package/dist/commands/remember.js +18 -57
  161. package/dist/commands/sources/add-cli.js +104 -49
  162. package/dist/commands/sources/bundle-cli.js +166 -0
  163. package/dist/commands/sources/bundle-config-ops.js +63 -0
  164. package/dist/commands/sources/info.js +27 -15
  165. package/dist/commands/sources/init.js +30 -40
  166. package/dist/commands/sources/installed-stashes.js +469 -172
  167. package/dist/commands/sources/migration-help.js +7 -4
  168. package/dist/commands/sources/schema-repair.js +10 -9
  169. package/dist/commands/sources/self-update.js +182 -121
  170. package/dist/commands/sources/source-add.js +169 -178
  171. package/dist/commands/sources/source-clone.js +144 -41
  172. package/dist/commands/sources/source-manage.js +94 -59
  173. package/dist/commands/sources/sources-cli.js +64 -205
  174. package/dist/commands/sources/stash-cli.js +91 -54
  175. package/dist/commands/sources/stash-skeleton.js +1 -1
  176. package/dist/commands/tasks/tasks-cli.js +106 -104
  177. package/dist/commands/tasks/tasks.js +445 -262
  178. package/dist/commands/workflow-cli.js +232 -121
  179. package/dist/core/action-contributors.js +1 -1
  180. package/dist/core/activation-policy.js +49 -0
  181. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  182. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  183. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  184. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  185. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  186. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  187. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  188. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  189. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  190. package/dist/core/adapter/adapters/index.js +80 -0
  191. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  192. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  193. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  194. package/dist/core/adapter/adapters/shared.js +286 -0
  195. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  196. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  197. package/dist/core/adapter/bundle-adapter.js +4 -0
  198. package/dist/core/adapter/detect-adapter.js +17 -0
  199. package/dist/core/adapter/recognize-match.js +44 -0
  200. package/dist/core/adapter/registry.js +56 -0
  201. package/dist/core/adapter/types.js +4 -0
  202. package/dist/core/asset/akm-markdown.js +30 -0
  203. package/dist/core/asset/asset-placement.js +243 -0
  204. package/dist/core/asset/asset-ref.js +110 -79
  205. package/dist/core/asset/asset-serialize.js +20 -0
  206. package/dist/core/asset/frontmatter.js +28 -12
  207. package/dist/core/asset/markdown.js +40 -51
  208. package/dist/core/asset/resolve-ref.js +274 -0
  209. package/dist/core/asset/stash-meta.js +2 -2
  210. package/dist/core/bundle-id.js +51 -0
  211. package/dist/core/common.js +281 -86
  212. package/dist/core/config/config-io.js +42 -128
  213. package/dist/core/config/config-schema.js +233 -834
  214. package/dist/core/config/config-sources.js +162 -39
  215. package/dist/core/config/config-types.js +16 -11
  216. package/dist/core/config/config-version.js +29 -0
  217. package/dist/core/config/config-walker.js +126 -37
  218. package/dist/core/config/config.js +154 -331
  219. package/dist/core/config/deep-merge.js +41 -0
  220. package/dist/core/config/engine-semantics.js +28 -0
  221. package/dist/core/config/experimental.js +21 -0
  222. package/dist/core/config/schema/embedding.js +38 -0
  223. package/dist/core/config/schema/engines.js +116 -0
  224. package/dist/core/config/schema/experimental.js +47 -0
  225. package/dist/core/config/schema/feedback.js +31 -0
  226. package/dist/core/config/schema/improve-processes.js +389 -0
  227. package/dist/core/config/schema/improve.js +94 -0
  228. package/dist/core/config/schema/index-config.js +176 -0
  229. package/dist/core/config/schema/output.js +18 -0
  230. package/dist/core/config/schema/primitives.js +94 -0
  231. package/dist/core/config/schema/search.js +30 -0
  232. package/dist/core/config/schema/setup.js +18 -0
  233. package/dist/core/config/schema/sources-bundles.js +169 -0
  234. package/dist/core/config/schema/workflow.js +29 -0
  235. package/dist/core/env-secret-ref.js +155 -20
  236. package/dist/core/errors.js +17 -15
  237. package/dist/core/events-types.js +4 -0
  238. package/dist/core/events.js +46 -128
  239. package/dist/core/extra-params.js +62 -0
  240. package/dist/core/file-change.js +17 -0
  241. package/dist/core/file-lock.js +202 -57
  242. package/dist/core/fs-txn.js +392 -0
  243. package/dist/core/git-message.js +59 -0
  244. package/dist/core/improve-result.js +167 -0
  245. package/dist/core/json-schema.js +142 -0
  246. package/dist/core/lesson-lint.js +1 -17
  247. package/dist/core/logs-db.js +1 -1
  248. package/dist/core/maintenance-barrier.js +135 -0
  249. package/dist/core/migration-operation.js +44 -0
  250. package/dist/core/mutation-target.js +78 -0
  251. package/dist/core/paths.js +22 -25
  252. package/dist/core/platform.js +10 -0
  253. package/dist/core/recognition-util.js +128 -0
  254. package/dist/core/redaction.js +392 -0
  255. package/dist/core/standards/resolve-standards-context.js +36 -65
  256. package/dist/core/standards/resolve-stash-standards.js +2 -2
  257. package/dist/core/standards/resolve-type-conventions.js +5 -5
  258. package/dist/core/state/migrations.js +242 -11
  259. package/dist/core/state-db.js +98 -10
  260. package/dist/core/structured.js +1 -1
  261. package/dist/core/subprocess.js +303 -0
  262. package/dist/core/text-truncation.js +9 -5
  263. package/dist/core/time.js +20 -0
  264. package/dist/core/type-presentation.js +130 -0
  265. package/dist/core/warn.js +0 -3
  266. package/dist/core/write-source.js +834 -118
  267. package/dist/indexer/bundle-identity-guard.js +92 -0
  268. package/dist/indexer/db/graph-db.js +1 -25
  269. package/dist/indexer/db/llm-cache.js +1 -1
  270. package/dist/indexer/ensure-index.js +30 -9
  271. package/dist/indexer/graph/graph-boost.js +9 -30
  272. package/dist/indexer/graph/graph-extraction.js +41 -27
  273. package/dist/indexer/graph/graph-types.js +4 -0
  274. package/dist/indexer/index-writer-lock.js +93 -49
  275. package/dist/indexer/index-written-assets.js +100 -53
  276. package/dist/indexer/indexer.js +746 -329
  277. package/dist/indexer/init.js +18 -25
  278. package/dist/indexer/installations.js +142 -0
  279. package/dist/indexer/passes/dir-staleness.js +18 -10
  280. package/dist/indexer/passes/memory-inference.js +25 -15
  281. package/dist/indexer/passes/metadata.js +412 -243
  282. package/dist/indexer/scan/doc-to-entry.js +160 -0
  283. package/dist/indexer/scan/drain-dir.js +134 -0
  284. package/dist/indexer/search/db-search.js +292 -108
  285. package/dist/indexer/search/fts-query.js +64 -0
  286. package/dist/indexer/search/ranking-contributors.js +145 -25
  287. package/dist/indexer/search/ranking-types.js +4 -0
  288. package/dist/indexer/search/ranking.js +28 -71
  289. package/dist/indexer/search/search-attribution.js +67 -0
  290. package/dist/indexer/search/search-fields.js +18 -3
  291. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  292. package/dist/indexer/search/search-source.js +157 -111
  293. package/dist/indexer/search/semantic-status.js +4 -1
  294. package/dist/indexer/usage/usage-events.js +10 -30
  295. package/dist/indexer/walk/file-context.js +3 -45
  296. package/dist/indexer/walk/matchers.js +42 -34
  297. package/dist/indexer/walk/path-resolver.js +11 -5
  298. package/dist/indexer/walk/walker.js +42 -14
  299. package/dist/integrations/agent/builder-shared.js +7 -0
  300. package/dist/integrations/agent/builders.js +5 -56
  301. package/dist/integrations/agent/config.js +3 -143
  302. package/dist/integrations/agent/detect.js +17 -2
  303. package/dist/integrations/agent/engine-resolution.js +231 -0
  304. package/dist/integrations/agent/index.js +1 -2
  305. package/dist/integrations/agent/model-aliases.js +16 -2
  306. package/dist/integrations/agent/profiles.js +36 -62
  307. package/dist/integrations/agent/prompts.js +46 -18
  308. package/dist/integrations/agent/runner-dispatch.js +93 -4
  309. package/dist/integrations/agent/runner.js +76 -208
  310. package/dist/integrations/agent/spawn.js +88 -196
  311. package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
  312. package/dist/integrations/harnesses/aider/index.js +48 -0
  313. package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
  314. package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
  315. package/dist/integrations/harnesses/amazonq/index.js +45 -0
  316. package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
  317. package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
  318. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  319. package/dist/integrations/harnesses/claude/index.js +24 -35
  320. package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
  321. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  322. package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
  323. package/dist/integrations/harnesses/codex/index.js +52 -0
  324. package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
  325. package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
  326. package/dist/integrations/harnesses/copilot/index.js +48 -0
  327. package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
  328. package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
  329. package/dist/integrations/harnesses/gemini/index.js +48 -0
  330. package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
  331. package/dist/integrations/harnesses/ids.js +24 -0
  332. package/dist/integrations/harnesses/index.js +54 -34
  333. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  334. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  335. package/dist/integrations/harnesses/opencode/index.js +14 -32
  336. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  337. package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
  338. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
  339. package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
  340. package/dist/integrations/harnesses/openhands/index.js +48 -0
  341. package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
  342. package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
  343. package/dist/integrations/harnesses/pi/index.js +45 -0
  344. package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
  345. package/dist/integrations/harnesses/shared.js +17 -0
  346. package/dist/integrations/harnesses/types.js +43 -32
  347. package/dist/integrations/lockfile.js +211 -24
  348. package/dist/integrations/session-logs/index.js +36 -39
  349. package/dist/integrations/session-logs/provider-base.js +113 -0
  350. package/dist/llm/client.js +182 -110
  351. package/dist/llm/embedders/deterministic.js +2 -2
  352. package/dist/llm/embedders/remote.js +21 -9
  353. package/dist/llm/feature-gate.js +17 -57
  354. package/dist/llm/graph-extract.js +12 -13
  355. package/dist/llm/index-passes.js +8 -42
  356. package/dist/llm/memory-infer.js +144 -1
  357. package/dist/llm/metadata-enhance.js +45 -30
  358. package/dist/llm/structured-call.js +16 -8
  359. package/dist/llm/usage-persist.js +30 -5
  360. package/dist/llm/usage-telemetry.js +59 -6
  361. package/dist/output/cli-hints.js +1 -2
  362. package/dist/output/command-registry.js +27 -0
  363. package/dist/output/context.js +22 -7
  364. package/dist/output/format-exempt.js +80 -0
  365. package/dist/output/generic-render.js +251 -0
  366. package/dist/output/html-render.js +11 -16
  367. package/dist/output/render-registry.js +57 -0
  368. package/dist/output/renderers.js +14 -279
  369. package/dist/output/shapes/curate.js +10 -1
  370. package/dist/output/shapes/events.js +12 -7
  371. package/dist/output/shapes/helpers.js +58 -84
  372. package/dist/output/shapes/passthrough.js +11 -39
  373. package/dist/output/shapes/proposal/producer.js +15 -7
  374. package/dist/output/shapes/registry.js +12 -6
  375. package/dist/output/shapes.js +0 -9
  376. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  377. package/dist/output/text/bundle-show.js +7 -0
  378. package/dist/output/text/command-format.js +562 -0
  379. package/dist/output/text/env.js +1 -3
  380. package/dist/output/text/events.js +8 -7
  381. package/dist/output/text/helpers.js +15 -1164
  382. package/dist/output/text/proposal/producer.js +4 -2
  383. package/dist/output/text/proposal-format.js +202 -0
  384. package/dist/output/text/registry-commands.js +1 -2
  385. package/dist/output/text/registry.js +12 -6
  386. package/dist/output/text/show-directives.js +117 -0
  387. package/dist/output/text/show-format.js +103 -0
  388. package/dist/output/text/sync.js +5 -0
  389. package/dist/output/text/workflow-format.js +332 -0
  390. package/dist/output/text/workflow.js +3 -2
  391. package/dist/output/text.js +10 -19
  392. package/dist/registry/factory.js +4 -6
  393. package/dist/registry/origin-resolve.js +16 -27
  394. package/dist/registry/providers/skills-sh.js +3 -3
  395. package/dist/registry/providers/static-index.js +15 -25
  396. package/dist/registry/resolve.js +43 -94
  397. package/dist/registry/semver.js +43 -0
  398. package/dist/runtime.js +81 -12
  399. package/dist/scripts/akm-migrate.js +35529 -0
  400. package/dist/setup/detect.js +5 -7
  401. package/dist/setup/detected-engines.js +136 -0
  402. package/dist/setup/engine-config.js +100 -0
  403. package/dist/setup/registry-stash-loader.js +3 -3
  404. package/dist/setup/semantic-assets.js +12 -9
  405. package/dist/setup/setup.js +444 -208
  406. package/dist/setup/steps/connection-shared.js +120 -0
  407. package/dist/setup/steps/connection.js +108 -305
  408. package/dist/setup/steps/platforms.js +13 -12
  409. package/dist/setup/steps/semantic.js +15 -3
  410. package/dist/setup/steps/sources.js +21 -15
  411. package/dist/setup/steps/stashdir.js +6 -4
  412. package/dist/setup/steps/tasks.js +236 -119
  413. package/dist/setup/steps.js +3 -2
  414. package/dist/sources/freshness.js +39 -0
  415. package/dist/sources/provider-factory.js +11 -17
  416. package/dist/sources/providers/filesystem.js +2 -3
  417. package/dist/sources/providers/git-install.js +278 -34
  418. package/dist/sources/providers/git-provider.js +54 -56
  419. package/dist/sources/providers/git-stash.js +420 -91
  420. package/dist/sources/providers/git.js +2 -2
  421. package/dist/sources/providers/npm.js +16 -19
  422. package/dist/sources/providers/provider-utils.js +47 -22
  423. package/dist/sources/providers/sync-from-ref.js +3 -9
  424. package/dist/sources/providers/website.js +2 -2
  425. package/dist/sources/resolve.js +11 -10
  426. package/dist/sources/snapshot-fetchers/types.js +4 -0
  427. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  428. package/dist/storage/database.js +60 -4
  429. package/dist/storage/engines/sqlite-migrations.js +156 -5
  430. package/dist/storage/locations.js +1 -2
  431. package/dist/storage/repositories/canaries-repository.js +1 -1
  432. package/dist/storage/repositories/events-repository.js +51 -11
  433. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  434. package/dist/storage/repositories/index-connection.js +79 -0
  435. package/dist/storage/repositories/index-db.js +4 -3
  436. package/dist/storage/repositories/index-entries-repository.js +863 -0
  437. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  438. package/dist/storage/repositories/index-entry-types.js +4 -0
  439. package/dist/storage/repositories/index-fts-repository.js +167 -0
  440. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  441. package/dist/storage/repositories/index-meta-repository.js +49 -0
  442. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  443. package/dist/storage/repositories/index-sql.js +12 -0
  444. package/dist/storage/repositories/index-utility-repository.js +356 -0
  445. package/dist/storage/repositories/index-vec-repository.js +250 -0
  446. package/dist/storage/repositories/outcome-repository.js +119 -0
  447. package/dist/storage/repositories/proposals-repository.js +317 -75
  448. package/dist/storage/repositories/registry-cache.js +1 -1
  449. package/dist/storage/repositories/salience-repository.js +172 -0
  450. package/dist/storage/repositories/task-history-repository.js +110 -3
  451. package/dist/storage/repositories/workflow-runs-repository.js +240 -19
  452. package/dist/tasks/backends/cron.js +169 -46
  453. package/dist/tasks/backends/exec-utils.js +76 -3
  454. package/dist/tasks/backends/index.js +6 -9
  455. package/dist/tasks/backends/launchd.js +292 -55
  456. package/dist/tasks/backends/schtasks.js +557 -70
  457. package/dist/tasks/backends/types.js +4 -0
  458. package/dist/tasks/command-executable.js +93 -0
  459. package/dist/tasks/embedded.js +56 -38
  460. package/dist/tasks/parser.js +156 -64
  461. package/dist/tasks/resolve-akm-bin.js +144 -51
  462. package/dist/tasks/runner.js +377 -209
  463. package/dist/tasks/schedule.js +108 -19
  464. package/dist/tasks/scheduler-invocation.js +296 -0
  465. package/dist/tasks/schema.js +1 -1
  466. package/dist/tasks/task-id.js +35 -0
  467. package/dist/tasks/validator.js +30 -16
  468. package/dist/text-import-hook.mjs +1 -1
  469. package/dist/workflows/authoring/authoring.js +104 -43
  470. package/dist/workflows/authoring/scope-key.js +1 -1
  471. package/dist/workflows/cli.js +0 -16
  472. package/dist/workflows/concurrency-policy.js +15 -0
  473. package/dist/workflows/exec/brief.js +450 -0
  474. package/dist/workflows/exec/frozen-judge.js +47 -0
  475. package/dist/workflows/exec/native-executor.js +1038 -0
  476. package/dist/workflows/exec/param-secrets.js +115 -0
  477. package/dist/workflows/exec/report.js +1460 -0
  478. package/dist/workflows/exec/run-workflow.js +602 -0
  479. package/dist/workflows/exec/scheduler.js +71 -0
  480. package/dist/workflows/exec/step-work.js +1190 -0
  481. package/dist/workflows/exec/unit-writer.js +23 -0
  482. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  483. package/dist/workflows/exec/worktree.js +171 -0
  484. package/dist/workflows/ir/compile.js +246 -0
  485. package/dist/workflows/ir/freeze.js +233 -0
  486. package/dist/workflows/ir/params.js +54 -0
  487. package/dist/workflows/ir/plan-hash.js +68 -0
  488. package/dist/workflows/ir/schema.js +540 -0
  489. package/dist/workflows/parser.js +878 -304
  490. package/dist/workflows/program/expressions.js +181 -0
  491. package/dist/workflows/program/schema.js +51 -0
  492. package/dist/workflows/renderer.js +100 -45
  493. package/dist/workflows/resource-limits.js +22 -0
  494. package/dist/workflows/runtime/agent-identity.js +59 -14
  495. package/dist/workflows/runtime/checkin.js +1 -1
  496. package/dist/workflows/runtime/plan-classifier.js +131 -0
  497. package/dist/workflows/runtime/runs.js +376 -119
  498. package/dist/workflows/runtime/unit-checkin.js +45 -0
  499. package/dist/workflows/runtime/unit-phases.js +20 -0
  500. package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
  501. package/dist/workflows/schema.js +1 -11
  502. package/dist/workflows/validate-summary.js +2 -3
  503. package/dist/workflows/validator.js +52 -30
  504. package/docs/README.md +42 -78
  505. package/docs/migration/README.md +8 -0
  506. package/docs/migration/release-notes/0.6.0.md +1 -1
  507. package/docs/migration/release-notes/0.7.0.md +9 -8
  508. package/docs/migration/release-notes/0.9.0.md +158 -14
  509. package/docs/migration/v0.7-to-v0.8.md +46 -47
  510. package/docs/migration/v0.8-to-v0.9.md +844 -0
  511. package/docs/reference/README.md +12 -0
  512. package/docs/reference/data-and-telemetry.md +333 -0
  513. package/package.json +21 -17
  514. package/schemas/akm-asset-envelope.json +93 -0
  515. package/schemas/akm-config.json +4636 -0
  516. package/schemas/akm-task.json +87 -0
  517. package/schemas/akm-workflow.json +373 -0
  518. package/dist/akm-migrate-storage +0 -38
  519. package/dist/assets/help/help-accept.md +0 -12
  520. package/dist/assets/help/help-improve.md +0 -84
  521. package/dist/assets/help/help-proposals.md +0 -17
  522. package/dist/assets/help/help-propose.md +0 -17
  523. package/dist/assets/help/help-reject.md +0 -11
  524. package/dist/assets/profiles/frequent.json +0 -13
  525. package/dist/assets/profiles/recombine-only.json +0 -21
  526. package/dist/assets/profiles/reflect-distill.json +0 -30
  527. package/dist/assets/profiles/synthesize.json +0 -15
  528. package/dist/assets/prompts/procedural-system.md +0 -44
  529. package/dist/assets/prompts/recombine-system.md +0 -40
  530. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  531. package/dist/assets/tasks/core/backup.yml +0 -4
  532. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  533. package/dist/assets/templates/html/default.html +0 -78
  534. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  535. package/dist/assets/wiki/index-template.md +0 -12
  536. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  537. package/dist/assets/wiki/log-template.md +0 -8
  538. package/dist/assets/wiki/schema-template.md +0 -61
  539. package/dist/cli/config-migrate.js +0 -150
  540. package/dist/cli/config-validate.js +0 -39
  541. package/dist/commands/graph/graph-cli.js +0 -124
  542. package/dist/commands/graph/graph.js +0 -487
  543. package/dist/commands/improve/calibration.js +0 -161
  544. package/dist/commands/improve/dedup.js +0 -482
  545. package/dist/commands/improve/extract-watch.js +0 -140
  546. package/dist/commands/improve/hot-probation.js +0 -45
  547. package/dist/commands/improve/improve-auto-accept.js +0 -276
  548. package/dist/commands/improve/improve-profiles.js +0 -168
  549. package/dist/commands/improve/procedural.js +0 -398
  550. package/dist/commands/improve/recombine.js +0 -818
  551. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  552. package/dist/commands/lint/agent-linter.js +0 -44
  553. package/dist/commands/lint/command-linter.js +0 -44
  554. package/dist/commands/lint/default-linter.js +0 -16
  555. package/dist/commands/lint/fact-linter.js +0 -39
  556. package/dist/commands/lint/knowledge-linter.js +0 -16
  557. package/dist/commands/lint/memory-linter.js +0 -61
  558. package/dist/commands/lint/registry.js +0 -41
  559. package/dist/commands/lint/skill-linter.js +0 -45
  560. package/dist/commands/lint/task-linter.js +0 -50
  561. package/dist/commands/lint/workflow-linter.js +0 -81
  562. package/dist/commands/proposal/legacy-import.js +0 -115
  563. package/dist/commands/sources/history.js +0 -196
  564. package/dist/commands/tasks/default-tasks.js +0 -186
  565. package/dist/commands/wiki-cli.js +0 -292
  566. package/dist/core/asset/asset-registry.js +0 -76
  567. package/dist/core/asset/asset-spec.js +0 -259
  568. package/dist/core/config/config-migration.js +0 -602
  569. package/dist/core/deep-merge.js +0 -38
  570. package/dist/core/eval/rank-metrics.js +0 -113
  571. package/dist/core/ripgrep/install.js +0 -163
  572. package/dist/core/ripgrep/resolve.js +0 -81
  573. package/dist/indexer/db/db.js +0 -1413
  574. package/dist/indexer/manifest.js +0 -170
  575. package/dist/indexer/passes/metadata-contributors.js +0 -31
  576. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  577. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
  578. package/dist/llm/call-ai.js +0 -62
  579. package/dist/llm/memory-infer-impl.js +0 -138
  580. package/dist/output/shapes/distill.js +0 -14
  581. package/dist/output/shapes/history.js +0 -11
  582. package/dist/output/text/distill.js +0 -6
  583. package/dist/output/text/enable-disable.js +0 -8
  584. package/dist/output/text/history.js +0 -6
  585. package/dist/output/text/wiki.js +0 -16
  586. package/dist/registry/build-index.js +0 -386
  587. package/dist/scripts/migrate-storage.js +0 -19108
  588. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
  589. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  590. package/dist/setup/legacy-config.js +0 -106
  591. package/dist/storage/repositories/consolidation-repository.js +0 -38
  592. package/dist/storage/repositories/recombine-repository.js +0 -213
  593. package/dist/wiki/wiki-templates.js +0 -15
  594. package/dist/wiki/wiki.js +0 -1012
  595. package/dist/workflows/db.js +0 -215
  596. package/docs/data-and-telemetry.md +0 -226
  597. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  598. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -26,12 +26,6 @@
26
26
  export const UTILITY_WEIGHT = 0.7;
27
27
  /** Weight on the feedback attention term in the combined eligibility score. */
28
28
  export const FEEDBACK_WEIGHT = 0.3;
29
- /**
30
- * Minimum |valence| magnitude for an item to be ROUTED to the fix / reinforce
31
- * lane. Below this the feedback is too weak/mixed to be a confident signal and
32
- * the item carries no attention lane (`null`). Pure magnitude in [0, 1].
33
- */
34
- export const STRONG_VALENCE_THRESHOLD = 0.5;
35
29
  /**
36
30
  * Compute the symmetric-valence attention score for one asset's feedback.
37
31
  *
@@ -42,13 +36,9 @@ export function computeValenceScore(counts) {
42
36
  const negative = Math.max(0, counts.negative);
43
37
  const total = positive + negative;
44
38
  if (total === 0) {
45
- return { valence: 0, magnitude: 0, attention: 0, lane: null };
39
+ return { valence: 0, magnitude: 0, attention: 0 };
46
40
  }
47
41
  const valence = (positive - negative) / total;
48
42
  const magnitude = Math.abs(valence);
49
- let lane = null;
50
- if (magnitude >= STRONG_VALENCE_THRESHOLD) {
51
- lane = valence < 0 ? "fix" : "reinforce";
52
- }
53
- return { valence, magnitude, attention: magnitude, lane };
43
+ return { valence, magnitude, attention: magnitude };
54
44
  }
@@ -3,116 +3,108 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import path from "node:path";
5
5
  import { defineCommand } from "citty";
6
- import { getStringArg, parseAutoAcceptFlag, parseNonNegativeIntFlag, parsePositiveIntFlag } from "../../cli/parse-args.js";
7
- import { output, runWithJsonErrors } from "../../cli/shared.js";
6
+ import { getParsedInvocation } from "../../cli/invocation.js";
7
+ import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
8
+ import { GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
9
+ import { isFullRefInput, parseRefInput } from "../../core/asset/resolve-ref.js";
8
10
  import { loadConfig } from "../../core/config/config.js";
9
11
  import { UsageError } from "../../core/errors.js";
12
+ import { resolveMutationTarget } from "../../core/mutation-target.js";
10
13
  import { getCacheDir } from "../../core/paths.js";
11
- import { withStateDb } from "../../core/state-db.js";
12
- import { clearLogFile, setLogFile } from "../../core/warn.js";
13
- import { closeDatabase, openExistingDatabase } from "../../indexer/db/db.js";
14
- import { resolveSourceEntries } from "../../indexer/search/search-source.js";
15
- import { parseFlagValue } from "../../output/context.js";
16
- import { getActiveCanaries, queryRecentCycleMetrics } from "../../storage/repositories/canaries-repository.js";
17
- import { refreshCanarySet } from "./collapse-detector.js";
14
+ import { redactSensitiveText } from "../../core/redaction.js";
15
+ import { clearLogFile, setLogFile, warn } from "../../core/warn.js";
16
+ import { resolveWriteTarget } from "../../core/write-source.js";
17
+ import { collectEngineCredentialValues } from "../../integrations/agent/engine-resolution.js";
18
18
  import { akmImprove } from "./improve.js";
19
- import { buildImproveRunId, recordTerminatedImproveRun, relativeImproveResultPath, writeImproveResultFile, } from "./improve-result-file.js";
19
+ import { buildImproveRunId, recordImproveRunResult, recordTerminatedImproveRun, } from "./improve-result-file.js";
20
20
  import { runImproveSession } from "./improve-session.js";
21
- // R5 — collapse-detector canary set inspection / explicit refresh. The
22
- // detector NEVER auto-refreshes the canary set (silent re-baselining is how a
23
- // slow collapse hides); this verb is the only refresh path.
24
- //
25
- // Dispatched from the parent improve run() on `scope === "canary"` — NOT a
26
- // citty subCommand: registering subCommands makes citty treat EVERY first
27
- // positional as a subcommand name, breaking `akm improve <type|ref>` outright
28
- // (citty throws "Unknown command memory"), and citty also re-runs the parent
29
- // run() after a matched subcommand.
30
- async function runCanaryInspection(refresh) {
31
- const config = loadConfig();
32
- const cfg = config.improve?.collapseDetector ?? {};
33
- const result = withStateDb((stateDb) => {
34
- let refreshOutcome;
35
- if (refresh) {
36
- const indexDb = openExistingDatabase();
37
- try {
38
- // Mint-first, deactivate-after (refreshCanarySet): an empty/unreadable
39
- // index keeps the old baseline instead of destroying it.
40
- refreshOutcome = refreshCanarySet(stateDb, indexDb, cfg) === null ? "kept-old-set" : "refreshed";
41
- }
42
- finally {
43
- closeDatabase(indexDb);
44
- }
45
- }
46
- const canaries = getActiveCanaries(stateDb);
47
- const canarySetId = canaries[0]?.canary_set_id;
48
- const recentCycles = canarySetId ? queryRecentCycleMetrics(stateDb, canarySetId, cfg.windowCycles ?? 5) : [];
49
- return {
50
- schemaVersion: 1,
51
- ok: true,
52
- refreshed: refreshOutcome === "refreshed",
53
- ...(refreshOutcome === "kept-old-set"
54
- ? { warning: "refresh skipped: no mintable learning entries in the index — existing canary set kept" }
55
- : {}),
56
- canarySetId: canarySetId ?? null,
57
- canaries: canaries.map((c) => ({ id: c.id, anchorRef: c.anchor_ref, query: c.query })),
58
- recentCycles: recentCycles.map((r) => ({
59
- ts: r.ts,
60
- pass: r.pass,
61
- meanRecall: r.mean_recall,
62
- meanNdcg: r.mean_ndcg,
63
- distinctContentRatio: r.distinct_content_ratio,
64
- acceptedActions: r.accepted_actions,
65
- mergeFloorViolations: r.merge_floor_violations,
66
- alerts: JSON.parse(r.alerts_json),
67
- })),
68
- };
69
- });
70
- output("improve-canary", result);
21
+ import { resolveImprovePlan } from "./improve-strategies.js";
22
+ let akmImproveForRun = akmImprove;
23
+ /** Swap the CLI's improve work implementation in deterministic subprocess tests. */
24
+ export function _setAkmImproveForTests(fake) {
25
+ akmImproveForRun = fake ?? akmImprove;
26
+ }
27
+ /**
28
+ * Handle the `--auto-accept` flag retired in 0.9.0, returning the scope the run
29
+ * should actually use.
30
+ *
31
+ * citty is non-strict, so the removed flag is silently absorbed rather than
32
+ * rejected — which is the dangerous case. The SPACE-separated spelling
33
+ * (`--auto-accept 90`) leaves `90` sitting in the positional slot, where it is
34
+ * read as the asset-type scope: the run then matches nothing and exits 0, so a
35
+ * 0.8-era crontab goes dark with no error at all. Warn about the flag, and drop
36
+ * the poisoned positional so the run behaves as an unscoped improve instead.
37
+ */
38
+ function resolveScopeAfterRetiredAutoAccept(scopeArg) {
39
+ const invocation = getParsedInvocation();
40
+ const autoAcceptRaw = invocation.getFlagValue("--auto-accept");
41
+ if (autoAcceptRaw === undefined && !invocation.hasFlag("--auto-accept"))
42
+ return scopeArg;
43
+ warn("[improve] --auto-accept was removed in 0.9 and is ignored; proposals always queue for review. " +
44
+ "Replacement: `akm improve && akm proposal drain --promote --yes`, or a `triage` block with " +
45
+ 'applyMode: "promote" in your strategy. It becomes a hard error in 0.10.');
46
+ if (scopeArg !== undefined && scopeArg === autoAcceptRaw) {
47
+ warn(`[improve] ignoring "${scopeArg}" as a scope — it is the removed --auto-accept flag's value.`);
48
+ return undefined;
49
+ }
50
+ return scopeArg;
51
+ }
52
+ /**
53
+ * `akm improve canary` was removed in 0.9 (moved to
54
+ * `scripts/refresh-canary-set.ts`). Without this check "canary" falls through
55
+ * to the generic scope positional, where resolveImproveScope treats any bare
56
+ * word as a type filter that matches zero entries — so an unmigrated caller
57
+ * silently acquires the improve lock and exits 0 having done nothing, instead
58
+ * of getting an error.
59
+ */
60
+ function rejectRetiredCanaryScope(scopeArg) {
61
+ if (scopeArg !== "canary")
62
+ return;
63
+ throw new UsageError('"akm improve canary" was removed in 0.9. Use `bun scripts/refresh-canary-set.ts [--refresh]` instead.', "INVALID_FLAG_VALUE");
64
+ }
65
+ /**
66
+ * `--target` was renamed to `--bundle` on `improve` in 0.9 (S8). citty is
67
+ * non-strict, so the retired spelling is silently absorbed rather than
68
+ * rejected — accepted proposals then write into the default bundle instead
69
+ * of the one the caller named, with exit 0 and no error. Reject it
70
+ * explicitly instead.
71
+ */
72
+ function rejectRetiredImproveTargetFlag() {
73
+ if (!getParsedInvocation().hasFlag("--target"))
74
+ return;
75
+ throw new UsageError("`akm improve --target` was renamed to `--bundle` in 0.9. Use `--bundle <name>` instead.", "INVALID_FLAG_VALUE");
71
76
  }
72
77
  export const improveCommand = defineCommand({
73
78
  meta: {
74
79
  name: "improve",
75
- description: "Analyze existing AKM assets and generate improvement proposals; also consolidates memories when profiles.improve.default.processes.consolidate.enabled is true. `akm improve canary [--refresh]` inspects the collapse-detector canary set.",
80
+ description: "Analyze existing AKM assets and generate improvement proposals; also consolidates memories when the selected strategy enables consolidate.",
76
81
  },
82
+ // Raw defineCommand, so the global output flags are declared here explicitly.
83
+ // Without them citty treats `--format` as a boolean and its space-separated
84
+ // value falls through to the `scope` positional.
77
85
  args: {
86
+ ...GLOBAL_OUTPUT_ARGS,
78
87
  scope: {
79
88
  type: "positional",
80
89
  description: "Optional asset type or asset ref to improve",
81
90
  required: false,
82
91
  },
83
92
  task: { type: "string", description: "Add extra guidance for this improvement pass" },
84
- refresh: {
85
- type: "boolean",
86
- description: "(canary scope only) Mint a new collapse-detector canary set and deactivate the old one; old rows and their cycle history are retained",
87
- default: false,
88
- },
89
93
  "dry-run": { type: "boolean", description: "Show planned actions without writing", default: false },
90
- target: { type: "string", description: "Override the write target for accepted proposals" },
91
- "auto-accept": {
92
- type: "string",
93
- description: "Auto-accept proposals at or above this confidence threshold (0-100). Default: disabled. Pass a value 0-100 to enable. 'safe' is an alias for 90. Pass 'false' to be explicit.",
94
- },
94
+ bundle: { type: "string", description: "Override the write target for accepted proposals" },
95
95
  limit: { type: "string", description: "Maximum number of assets to process (highest utility first)" },
96
96
  "timeout-ms": {
97
97
  type: "string",
98
98
  description: "Wall-clock budget for the entire run in milliseconds (default: 7200000 = 2 hours)",
99
99
  },
100
- "consolidate-recovery": {
101
- type: "string",
102
- description: "How to handle stale/incomplete consolidation journals: abort (default) or clean (remove stale journal artifacts)",
103
- },
104
100
  "require-feedback-signal": {
105
101
  type: "boolean",
106
- description: "Only process assets with recent feedback signals (disables retrieval fallback)",
102
+ description: "Only process assets with recent feedback signals (disables the proactive/high-salience fallback lanes)",
107
103
  default: false,
108
104
  },
109
- "min-retrieval-count": {
110
- type: "string",
111
- description: "Minimum retrieval count for zero-feedback fallback eligibility (default: 1, set 0 to include all assets regardless of retrieval history)",
112
- },
113
105
  "json-to-stdout": {
114
106
  type: "boolean",
115
- description: "Emit the full JSON result on stdout (legacy behaviour). (0.8.0+: full result is recorded in the improve_runs table of state.db and stdout is empty; use this flag for the prior behaviour, e.g. `akm improve --json-to-stdout | jq`.)",
107
+ description: "Also emit the full persisted run result on stdout as JSON.",
116
108
  default: false,
117
109
  },
118
110
  "skip-if-locked": {
@@ -120,13 +112,13 @@ export const improveCommand = defineCommand({
120
112
  description: "If another improve run already holds the lock, skip gracefully (exit 0) instead of failing with 'already running' (exit 78). Use for high-frequency scheduled runs so they don't pile up failures while a longer run is in progress.",
121
113
  default: false,
122
114
  },
123
- profile: {
115
+ strategy: {
124
116
  type: "string",
125
- description: "Named improve profile from profiles.improve or built-in profiles (default, quick, thorough, memory-focus, graph-refresh). Controls which sub-processes run and which asset types are processed.",
117
+ description: "Named improve strategy from improve.strategies or built-in strategies (catchup, consolidate, default, frequent, graph-refresh, memory-focus, proactive-maintenance, quick, reflect-distill, thorough). Controls which sub-processes run and which asset types are processed.",
126
118
  },
127
119
  sync: {
128
120
  type: "boolean",
129
- description: "Commit (and optionally push) the git-backed primary stash when the run finishes. Use --no-sync to disable. Default: on for git-backed stashes (per profile config).",
121
+ description: "Commit (and optionally push) the git-backed primary bundle when the run finishes. Use --no-sync to disable. Default: on for git-backed bundles (per profile config).",
130
122
  },
131
123
  push: {
132
124
  type: "boolean",
@@ -134,39 +126,37 @@ export const improveCommand = defineCommand({
134
126
  },
135
127
  },
136
128
  async run({ args }) {
137
- // "canary" is a reserved scope word (never a valid asset type, and refs
138
- // contain ":"): dispatch to the detector inspection verb instead of an
139
- // improve run.
140
- if (args.scope === "canary") {
141
- await runWithJsonErrors(() => runCanaryInspection(args.refresh));
142
- return;
143
- }
144
129
  await runWithJsonErrors(async () => {
145
- const formatFlagValue = parseFlagValue(process.argv, "--format");
146
- if (formatFlagValue !== undefined) {
147
- throw new UsageError(`akm improve does not accept --format. That flag controls output formatting for other commands (search, show, etc.).\n` +
148
- `Did you mean: akm improve (no --format flag)?`, "INVALID_FLAG_VALUE");
149
- }
130
+ rejectRetiredImproveTargetFlag();
131
+ // D7 — `--format` used to be rejected here outright. It is a global flag on
132
+ // a command that does emit an envelope through `output()` (always on
133
+ // `--dry-run`, otherwise with `--json-to-stdout`), so rejecting it made
134
+ // improve a fourth inconsistent format behaviour rather than a documented
135
+ // exemption. It now applies to that envelope; progress output stays on
136
+ // stderr regardless.
150
137
  const jsonToStdout = args["json-to-stdout"];
151
- const autoAcceptRaw = args["auto-accept"];
152
- const autoAccept = parseAutoAcceptFlag(autoAcceptRaw);
153
- const targetArg = getStringArg(args, "target");
138
+ const targetArg = getStringArg(args, "bundle");
154
139
  const taskArg = getStringArg(args, "task");
155
140
  const dryRun = args["dry-run"];
156
141
  const limitRaw = parsePositiveIntFlag(args.limit ?? undefined);
157
142
  const timeoutMs = parsePositiveIntFlag(args["timeout-ms"], "--timeout-ms");
158
- const consolidateRecoveryRaw = args["consolidate-recovery"];
159
- const consolidateRecovery = consolidateRecoveryRaw === undefined
160
- ? undefined
161
- : consolidateRecoveryRaw.trim().toLowerCase();
162
- if (consolidateRecovery !== undefined && consolidateRecovery !== "abort" && consolidateRecovery !== "clean") {
163
- throw new UsageError(`Invalid --consolidate-recovery value: "${consolidateRecoveryRaw}". Must be one of: abort, clean.`, "INVALID_FLAG_VALUE");
164
- }
165
- const minRetrievalCountRaw = args["min-retrieval-count"];
166
- const minRetrievalCount = parseNonNegativeIntFlag(minRetrievalCountRaw, "--min-retrieval-count");
167
143
  const requireFeedbackSignal = args["require-feedback-signal"];
168
144
  const skipIfLocked = args["skip-if-locked"];
169
- const profileArg = getStringArg(args, "profile");
145
+ const strategyArg = getStringArg(args, "strategy");
146
+ const effectiveConfig = loadConfig();
147
+ const scopeArg = resolveScopeAfterRetiredAutoAccept(getStringArg(args, "scope"));
148
+ rejectRetiredCanaryScope(scopeArg);
149
+ const scopeRef = scopeArg && isFullRefInput(scopeArg) ? parseRefInput(scopeArg) : undefined;
150
+ const writeTarget = dryRun
151
+ ? undefined
152
+ : scopeRef
153
+ ? resolveMutationTarget(effectiveConfig, scopeRef, targetArg).target
154
+ : resolveWriteTarget(effectiveConfig, targetArg);
155
+ // Resolve every enabled model-backed process before logging, signal
156
+ // lifecycle setup, or any filesystem/database side effect.
157
+ const resolvedPlan = resolveImprovePlan(strategyArg, effectiveConfig);
158
+ const selectedStrategyName = resolvedPlan.strategy.name;
159
+ const sensitiveValues = collectEngineCredentialValues(effectiveConfig);
170
160
  // Only set the keys the user actually passed (citty leaves the flag
171
161
  // undefined unless `--sync`/`--no-sync` / `--push`/`--no-push` appears),
172
162
  // so the resolved profile `sync` block wins by default.
@@ -177,8 +167,10 @@ export const improveCommand = defineCommand({
177
167
  syncOverride.enabled = syncFlag;
178
168
  if (pushFlag !== undefined)
179
169
  syncOverride.push = pushFlag;
180
- const improveLogFile = path.join(getCacheDir(), "logs", "improve", `${new Date().toISOString().replace(/[:.]/g, "-")}.log`);
181
- setLogFile(improveLogFile);
170
+ if (!dryRun) {
171
+ const improveLogFile = path.join(getCacheDir(), "logs", "improve", `${new Date().toISOString().replace(/[:.]/g, "-")}.log`);
172
+ setLogFile(improveLogFile);
173
+ }
182
174
  const startedAtMs = Date.now();
183
175
  const startedAtIso = new Date(startedAtMs).toISOString();
184
176
  // Mint the run-id up front so signal handlers can persist a partial
@@ -186,14 +178,15 @@ export const improveCommand = defineCommand({
186
178
  // was minted at end-of-run, so SIGTERM'd runs (cron timeout) left no
187
179
  // row in improve_runs and effectively disappeared from `akm health`.
188
180
  const runId = buildImproveRunId();
189
- const primaryStashDir = resolveSourceEntries(undefined, loadConfig())[0]?.path;
190
- const scopeArg = getStringArg(args, "scope");
191
- const inferredScopeMode = (scopeArg ?? "").includes(":") ? "ref" : scopeArg ? "type" : "all";
181
+ const primaryStashDir = writeTarget?.source.path;
182
+ const inferredScopeMode = scopeRef ? "ref" : scopeArg ? "type" : "all";
192
183
  // Signal handler + exception path both flow through this helper so
193
184
  // every abnormal termination produces a row with ok:false and a
194
185
  // reason in metadata.terminated.
195
186
  let runRecorded = false;
196
187
  const persistTerminated = (reason, errorMessage) => {
188
+ if (dryRun)
189
+ return;
197
190
  if (runRecorded)
198
191
  return;
199
192
  if (!primaryStashDir)
@@ -204,8 +197,9 @@ export const improveCommand = defineCommand({
204
197
  scopeMode: inferredScopeMode,
205
198
  scopeValue: scopeArg ?? null,
206
199
  dryRun: Boolean(dryRun),
207
- profile: profileArg ?? null,
208
- ...(errorMessage ? { errorMessage } : {}),
200
+ strategy: selectedStrategyName,
201
+ ...(errorMessage ? { errorMessage: redactSensitiveText(errorMessage, sensitiveValues) } : {}),
202
+ sensitiveValues,
209
203
  });
210
204
  }
211
205
  catch (err) {
@@ -223,33 +217,33 @@ export const improveCommand = defineCommand({
223
217
  let improveResult;
224
218
  try {
225
219
  improveResult = await runImproveSession({
226
- runWork: () => akmImprove({
220
+ runWork: () => akmImproveForRun({
227
221
  scope: scopeArg,
228
222
  task: taskArg,
229
223
  dryRun,
224
+ resolvedPlan,
230
225
  target: targetArg,
231
- autoAccept,
226
+ ...(writeTarget ? { writeTarget } : {}),
232
227
  ...(runId !== undefined ? { runId } : {}),
233
228
  ...(limitRaw !== undefined ? { limit: limitRaw } : {}),
234
229
  ...(timeoutMs !== undefined ? { timeoutMs } : {}),
235
- ...(minRetrievalCount !== undefined ? { minRetrievalCount } : {}),
236
230
  ...(requireFeedbackSignal ? { requireFeedbackSignal } : {}),
237
231
  ...(skipIfLocked ? { skipIfLocked } : {}),
238
- ...(profileArg !== undefined ? { profile: profileArg } : {}),
232
+ ...(strategyArg !== undefined ? { strategy: strategyArg } : {}),
239
233
  ...(Object.keys(syncOverride).length > 0 ? { sync: syncOverride } : {}),
240
234
  consolidateOptions: {
241
235
  target: targetArg,
242
236
  dryRun,
243
- autoAccept,
244
237
  task: taskArg,
245
- ...(consolidateRecovery !== undefined ? { recoveryMode: consolidateRecovery } : {}),
246
238
  },
247
239
  }),
248
240
  }, {
249
241
  signalSource: process,
250
242
  exit: process.exit,
251
243
  onTerminate: (reason) => persistTerminated(reason),
252
- ack: (message) => process.stderr.write(`[improve] ${message}; recorded terminated run ${runId}\n`),
244
+ ack: (message) => process.stderr.write(dryRun
245
+ ? `[improve] ${message}; dry-run state was not persisted\n`
246
+ : `[improve] ${message}; recorded terminated run ${runId}\n`),
253
247
  });
254
248
  }
255
249
  catch (err) {
@@ -263,12 +257,15 @@ export const improveCommand = defineCommand({
263
257
  finally {
264
258
  clearLogFile();
265
259
  }
266
- const durationMs = Date.now() - startedAtMs;
267
- if (jsonToStdout) {
268
- // Legacy / escape-hatch mode: full JSON on stdout, no file write.
269
- // Kept for scripts/agents that already pipe to jq.
260
+ if (dryRun) {
261
+ // A dry-run never persists its result, so stdout is its only result
262
+ // channel. F4: was `process.exit(0)`, which terminates synchronously
263
+ // and skips pending cleanup (e.g. the `finally { clearLogFile(); }`
264
+ // above already ran, but any citty/runWithJsonErrors-level cleanup
265
+ // on the way out would not). Exit code is 0 either way — `return`
266
+ // alone is sufficient since success is the default `process.exitCode`.
270
267
  output("improve", improveResult);
271
- process.exit(0);
268
+ return;
272
269
  }
273
270
  // Default mode (0.8.0+): persist the full result as a row in the
274
271
  // `improve_runs` table of state.db (migration 003) and emit NOTHING
@@ -284,24 +281,26 @@ export const improveCommand = defineCommand({
284
281
  // ORDER BY started_at DESC LIMIT 10"
285
282
  // runId + primaryStashDir minted up-top so signal handlers can record
286
283
  // partial runs; reuse them here for the success path.
287
- const resultRef = relativeImproveResultPath(runId);
288
284
  runRecorded = true; // Suppress any late signal-handler write — the success path owns the row now.
289
285
  if (primaryStashDir) {
290
286
  try {
291
- writeImproveResultFile(primaryStashDir, runId, improveResult, startedAtIso, profileArg ?? null);
287
+ recordImproveRunResult(primaryStashDir, runId, improveResult, startedAtIso, sensitiveValues);
292
288
  }
293
289
  catch (err) {
294
290
  // Stderr warning on the failure path is preferable to crashing
295
291
  // the run after all the work has completed.
296
- process.stderr.write(`warning: failed to record improve run ${resultRef}: ${err instanceof Error ? err.message : String(err)}\n`);
292
+ process.stderr.write(`warning: failed to record improve run ${runId}: ${err instanceof Error ? err.message : String(err)}\n`);
297
293
  }
298
294
  }
299
295
  else {
300
- process.stderr.write(`warning: no writable stash directory resolved; improve result not persisted to state.db (use --json-to-stdout to capture)\n`);
296
+ process.stderr.write(`warning: no writable bundle directory resolved; improve result not persisted to state.db (use --json-to-stdout to capture)\n`);
301
297
  }
302
- // durationMs reserved for future use (no console emission today).
303
- void durationMs;
304
- process.exit(0);
298
+ if (jsonToStdout)
299
+ output("improve", improveResult);
300
+ // F4: was `process.exit(0)` — the run has already been fully recorded
301
+ // above (recordImproveRunResult / the warning path), so nothing here
302
+ // depends on an immediate synchronous exit. This is the last statement
303
+ // in the handler, so a plain fall-through is equivalent.
305
304
  });
306
305
  },
307
306
  });
@@ -9,8 +9,7 @@
9
9
  * `improve_runs` table of `state.db` (migration 003). Stdout is empty.
10
10
  * The existing `[improve] ...` progress log lines on stderr remain the
11
11
  * canonical console UX.
12
- * - `--json-to-stdout` restores the prior behaviour: full JSON to stdout,
13
- * nothing written to state.db.
12
+ * - `--json-to-stdout` additionally emits the persisted result as JSON.
14
13
  *
15
14
  * v0.8.0 storage change (this module): the previous on-disk artifact at
16
15
  * `<stash>/.akm/runs/<runId>/improve-result.json` is no longer written. The
@@ -26,7 +25,8 @@
26
25
  * single-slot artefact. We mint a fresh timestamped id for each improve run.
27
26
  */
28
27
  import crypto from "node:crypto";
29
- import path from "node:path";
28
+ import { decodeImproveResult } from "../../core/improve-result.js";
29
+ import { redactSensitiveValue } from "../../core/redaction.js";
30
30
  import { withStateDb } from "../../core/state-db.js";
31
31
  import { recordImproveRun } from "../../storage/repositories/improve-runs-repository.js";
32
32
  /**
@@ -43,45 +43,19 @@ export function buildImproveRunId(now = new Date()) {
43
43
  const rand = crypto.randomBytes(4).toString("hex");
44
44
  return `${iso}-${rand}`;
45
45
  }
46
- /**
47
- * Return a stable, human-recognisable reference for a given improve run.
48
- *
49
- * Historical compatibility shim: callers used to receive a stash-relative
50
- * file path like `.akm/runs/<runId>/improve-result.json`. With the state.db
51
- * migration, no such file exists, but several callers still log "wrote to
52
- * <path>" style messages. Returning a `state.db//improve_runs/<runId>`
53
- * locator preserves the "the result is at <thing>" signature so existing
54
- * log lines and error messages continue to make sense without rewriting
55
- * every call site.
56
- */
57
- export function relativeImproveResultPath(runId) {
58
- return path.join("state.db", "improve_runs", runId);
59
- }
60
46
  /**
61
47
  * Persist the full improve result into the `improve_runs` table of state.db.
62
48
  *
63
- * Backwards-compatible signature: the function name, argument list, and
64
- * return type all match the pre-0.8.0 file-writing helper. The returned
65
- * string is the `state.db//improve_runs/<runId>` locator (see
66
- * {@link relativeImproveResultPath}), which is intended for log messages
67
- * only — no caller should treat it as a filesystem path. Zero current
68
- * readers existed for the previous file path, so this is a pure storage
69
- * swap.
70
- *
71
49
  * The state.db row carries the scope and dry-run flag from `result.scope`
72
50
  * and `result.dryRun`, plus the full result JSON for full fidelity. The
73
51
  * dry-run column is indexed so productivity audits can filter cleanly
74
52
  * (closes the dry-run/real-run artifact-trap recorded in MEMORY.md
75
53
  * `feedback_akm_dryrun_artifact_trap`).
76
54
  *
77
- * @param profile - The `--profile` value passed to this invocation (e.g.
78
- * `quick`, `reflect-distill`), or `null`/`undefined` when no profile was
79
- * given. Mirrors {@link recordTerminatedImproveRun}'s `ctx.profile`
80
- * convention so successful and terminated runs are equally queryable by
81
- * profile. Previously hardcoded to `null` here, which meant only
82
- * abnormally-terminated runs recorded their profile in state.db.
83
55
  */
84
- export function writeImproveResultFile(stashDir, runId, result, startedAt, profile) {
56
+ export function recordImproveRunResult(stashDir, runId, result, startedAt, sensitiveValues = []) {
57
+ const decoded = decodeImproveResult(result);
58
+ const persistedResult = redactSensitiveValue(result, sensitiveValues);
85
59
  withStateDb((db) => {
86
60
  const completedAt = new Date().toISOString();
87
61
  // startedAt is the ISO timestamp captured at process launch (passed from the
@@ -95,15 +69,14 @@ export function writeImproveResultFile(stashDir, runId, result, startedAt, profi
95
69
  completedAt,
96
70
  stashDir,
97
71
  dryRun: Boolean(result.dryRun),
98
- profile: profile ?? null,
72
+ strategy: redactSensitiveValue(decoded.strategy, sensitiveValues),
99
73
  scopeMode: result.scope?.mode ?? "all",
100
- scopeValue: result.scope?.value ?? null,
101
- guidance: result.guidance ?? null,
74
+ scopeValue: persistedResult.scope?.value ?? null,
75
+ guidance: persistedResult.guidance ?? null,
102
76
  ok: Boolean(result.ok),
103
- result,
77
+ result: persistedResult,
104
78
  });
105
79
  });
106
- return relativeImproveResultPath(runId);
107
80
  }
108
81
  /**
109
82
  * Persist an improve_runs row for a run that did NOT complete normally.
@@ -124,37 +97,44 @@ export function writeImproveResultFile(stashDir, runId, result, startedAt, profi
124
97
  */
125
98
  export function recordTerminatedImproveRun(stashDir, runId, startedAt, reason, ctx) {
126
99
  const completedAt = new Date().toISOString();
127
- const minimalResult = {
128
- schemaVersion: 1,
100
+ const persistedReason = redactSensitiveValue(reason, ctx.sensitiveValues ?? []);
101
+ const persistedScopeValue = redactSensitiveValue(ctx.scopeValue, ctx.sensitiveValues ?? []);
102
+ const persistedStrategy = redactSensitiveValue(ctx.strategy, ctx.sensitiveValues ?? []);
103
+ const minimalResult = redactSensitiveValue({
104
+ schemaVersion: 2,
129
105
  ok: false,
130
- scope: { mode: ctx?.scopeMode ?? "all", ...(ctx?.scopeValue ? { value: ctx.scopeValue } : {}) },
131
- dryRun: Boolean(ctx?.dryRun),
106
+ strategy: persistedStrategy,
107
+ scope: { mode: ctx.scopeMode ?? "all", ...(persistedScopeValue ? { value: persistedScopeValue } : {}) },
108
+ dryRun: Boolean(ctx.dryRun),
109
+ memorySummary: { eligible: 0, derived: 0 },
132
110
  actions: [],
133
111
  plannedRefs: [],
134
112
  terminated: {
135
- reason,
113
+ reason: persistedReason,
136
114
  at: completedAt,
137
- ...(ctx?.errorMessage ? { errorMessage: ctx.errorMessage } : {}),
115
+ ...(ctx.errorMessage ? { errorMessage: ctx.errorMessage } : {}),
138
116
  },
139
- };
117
+ }, ctx.sensitiveValues ?? []);
140
118
  withStateDb((db) => {
141
119
  recordImproveRun(db, {
142
120
  id: runId,
143
121
  startedAt,
144
122
  completedAt,
145
123
  stashDir,
146
- dryRun: Boolean(ctx?.dryRun),
147
- profile: ctx?.profile ?? null,
148
- scopeMode: ctx?.scopeMode ?? "all",
149
- scopeValue: ctx?.scopeValue ?? null,
124
+ dryRun: Boolean(ctx.dryRun),
125
+ strategy: persistedStrategy,
126
+ scopeMode: ctx.scopeMode ?? "all",
127
+ scopeValue: persistedScopeValue ?? null,
150
128
  guidance: null,
151
129
  ok: false,
152
130
  result: minimalResult,
153
131
  metadata: {
154
132
  terminated: {
155
- reason,
133
+ reason: persistedReason,
156
134
  at: completedAt,
157
- ...(ctx?.errorMessage ? { errorMessage: ctx.errorMessage } : {}),
135
+ ...(ctx.errorMessage
136
+ ? { errorMessage: redactSensitiveValue(ctx.errorMessage, ctx.sensitiveValues ?? []) }
137
+ : {}),
158
138
  },
159
139
  },
160
140
  });
@@ -0,0 +1,4 @@
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
+ export {};