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
@@ -8,7 +8,12 @@
8
8
  * migrated to `defineJsonCommand`, which wraps the body in `runWithJsonErrors`
9
9
  * and emits the same JSON envelope (stdout/stderr/exit-code) as the inline
10
10
  * `runWithJsonErrors` form it replaces.
11
+ *
12
+ * 0.9 CLI overhaul (S8): the former top-level `extract` and `propose`
13
+ * commands are absorbed here as `extract` and `new` — no top-level
14
+ * registration remains for either spelling.
11
15
  */
16
+ import { getParsedInvocation } from "../../cli/invocation.js";
12
17
  import { parsePositiveIntFlag } from "../../cli/parse-args.js";
13
18
  import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
14
19
  import { resolveStashDir } from "../../core/common.js";
@@ -17,10 +22,45 @@ import { UsageError } from "../../core/errors.js";
17
22
  import { resolveTriageJudgmentRunner } from "../../integrations/agent/runner.js";
18
23
  import { installLlmUsagePersistenceIfAbsent } from "../../llm/usage-persist.js";
19
24
  import { withLlmStage } from "../../llm/usage-telemetry.js";
20
- import { resolveImproveProfile } from "../improve/improve-profiles.js";
25
+ import { extractCommand } from "../improve/extract-cli.js";
26
+ import { resolveImproveStrategy } from "../improve/improve-strategies.js";
21
27
  import { drainProposals } from "./drain.js";
22
28
  import { resolveDrainPolicy } from "./drain-policies.js";
23
- import { akmProposalAccept, akmProposalDiff, akmProposalList, akmProposalReject, akmProposalRevert, akmProposalShow, } from "./proposal.js";
29
+ import { akmProposalAccept, akmProposalDiff, akmProposalList, akmProposalReject, akmProposalRevert, akmProposalShow, bulkAdjudicateProposals, } from "./proposal.js";
30
+ import { proposeCommand } from "./propose-cli.js";
31
+ /**
32
+ * `--source` was renamed to `--generator` on `proposal accept`/`proposal
33
+ * reject` in 0.9 (WS3/S8 — "Removed in 0.9.0"). citty is non-strict, so the
34
+ * retired spelling is silently absorbed rather than rejected — a bulk
35
+ * accept/reject invoked with `--source <name>` then has neither `--generator`
36
+ * nor a positional id, and falls through to the single-proposal path, which
37
+ * throws MISSING_REQUIRED_ARGUMENT instead of running the bulk action the
38
+ * caller asked for. Reject it explicitly instead.
39
+ */
40
+ function rejectRetiredProposalSourceFlag(subcommand) {
41
+ if (!getParsedInvocation().hasFlag("--source"))
42
+ return;
43
+ throw new UsageError(`\`akm proposal ${subcommand} --source\` was renamed to \`--generator\` in 0.9. Use \`--generator <name>\` instead.`, "INVALID_FLAG_VALUE");
44
+ }
45
+ /**
46
+ * Parse + validate the shared bulk-adjudication filter flags
47
+ * (`--max-diff-lines`, `--older-than`). Extracted from the two verbatim
48
+ * copies that lived in the accept and reject bulk branches (WI-6.6).
49
+ */
50
+ function parseBulkFilterFlags(args) {
51
+ const rawMaxDiff = args["max-diff-lines"] ? Number.parseInt(String(args["max-diff-lines"]), 10) : undefined;
52
+ if (rawMaxDiff !== undefined && (Number.isNaN(rawMaxDiff) || rawMaxDiff < 0)) {
53
+ throw new UsageError("--max-diff-lines must be a non-negative integer", "INVALID_FLAG_VALUE");
54
+ }
55
+ const rawOlderThan = args["older-than"] ? Number.parseInt(String(args["older-than"]), 10) : undefined;
56
+ if (rawOlderThan !== undefined && (Number.isNaN(rawOlderThan) || rawOlderThan < 0)) {
57
+ throw new UsageError("--older-than must be a non-negative integer (days)", "INVALID_FLAG_VALUE");
58
+ }
59
+ return {
60
+ maxDiffLines: rawMaxDiff,
61
+ olderThanMs: rawOlderThan !== undefined ? rawOlderThan * 86_400_000 : undefined,
62
+ };
63
+ }
24
64
  function parseProposalStatus(raw) {
25
65
  if (raw === undefined)
26
66
  return undefined;
@@ -35,16 +75,18 @@ function parseProposalStatus(raw) {
35
75
  const proposalListCommand = defineJsonCommand({
36
76
  meta: { name: "list", description: "List proposal queue entries" },
37
77
  args: {
78
+ queue: { type: "string", description: "Select the proposal queue by source name" },
38
79
  status: {
39
80
  type: "string",
40
81
  description: "Filter by status (pending|accepted|rejected|reverted)",
41
82
  },
42
- ref: { type: "string", description: "Filter by asset ref (type:name)" },
83
+ ref: { type: "string", description: "Filter by asset ref ([bundle//]conceptId, e.g. knowledge/guide.md)" },
43
84
  type: { type: "string", description: "Filter by asset type" },
44
85
  },
45
86
  run({ args }) {
46
87
  const status = parseProposalStatus(args.status);
47
88
  const result = akmProposalList({
89
+ queue: args.queue,
48
90
  status,
49
91
  ref: args.ref,
50
92
  type: args.type,
@@ -54,30 +96,31 @@ const proposalListCommand = defineJsonCommand({
54
96
  },
55
97
  });
56
98
  const proposalAcceptCommand = defineJsonCommand({
57
- meta: { name: "accept", description: "Accept a proposal and promote it into the stash" },
99
+ meta: { name: "accept", description: "Accept a proposal and promote it into the bundle" },
58
100
  args: {
59
101
  id: {
60
102
  type: "positional",
61
- description: "Proposal id (uuid / prefix) or asset ref (e.g. skill:akm-dream). Optional when --generator is provided.",
103
+ description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream). Optional when --generator is provided.",
62
104
  required: false,
63
105
  },
64
- target: { type: "string", description: "Override the write target by source name" },
106
+ queue: { type: "string", description: "Select the proposal queue by source name" },
107
+ target: { type: "string", description: "Write destination; must match the proposal's recorded target" },
65
108
  // F-6 / #393: Batch accept by generator, diff size, or age.
66
109
  generator: {
67
110
  type: "string",
68
- description: "F-6: Bulk-accept all pending proposals from this generator (e.g. reflect, distill). Requires no positional id.",
111
+ description: "Bulk-accept all pending proposals from this generator (e.g. reflect, distill). Requires no positional id.",
69
112
  },
70
113
  "max-diff-lines": {
71
114
  type: "string",
72
- description: "F-6: When bulk-accepting, only accept proposals whose content is <= this many lines. Skips larger proposals.",
115
+ description: "When bulk-accepting, only accept proposals whose content is <= this many lines. Skips larger proposals.",
73
116
  },
74
117
  "older-than": {
75
118
  type: "string",
76
- description: "F-6: When bulk-accepting, only accept proposals created more than this many days ago (e.g. '7' for 7 days).",
119
+ description: "When bulk-accepting, only accept proposals created more than this many days ago (e.g. '7' for 7 days).",
77
120
  },
78
121
  "dry-run": {
79
122
  type: "boolean",
80
- description: "F-6: List proposals that would be bulk-accepted without accepting them.",
123
+ description: "List proposals that would be bulk-accepted without accepting them.",
81
124
  default: false,
82
125
  },
83
126
  yes: {
@@ -88,6 +131,7 @@ const proposalAcceptCommand = defineJsonCommand({
88
131
  },
89
132
  },
90
133
  async run({ args }) {
134
+ rejectRetiredProposalSourceFlag("accept");
91
135
  const generator = args.generator;
92
136
  // F-6 / #393: Bulk-accept when --generator is provided without a positional id.
93
137
  if (generator && !args.id) {
@@ -97,50 +141,27 @@ const proposalAcceptCommand = defineJsonCommand({
97
141
  process.stderr.write("Aborted.\n");
98
142
  return;
99
143
  }
100
- const { listProposals } = await import("./repository.js");
101
- const stashDir = resolveStashDir();
102
- const rawMaxDiff = args["max-diff-lines"] ? Number.parseInt(String(args["max-diff-lines"]), 10) : undefined;
103
- if (rawMaxDiff !== undefined && (Number.isNaN(rawMaxDiff) || rawMaxDiff < 0)) {
104
- throw new UsageError("--max-diff-lines must be a non-negative integer", "INVALID_FLAG_VALUE");
105
- }
106
- const rawOlderThan = args["older-than"] ? Number.parseInt(String(args["older-than"]), 10) : undefined;
107
- if (rawOlderThan !== undefined && (Number.isNaN(rawOlderThan) || rawOlderThan < 0)) {
108
- throw new UsageError("--older-than must be a non-negative integer (days)", "INVALID_FLAG_VALUE");
109
- }
110
- const maxDiffLines = rawMaxDiff;
111
- const olderThanMs = rawOlderThan !== undefined ? rawOlderThan * 86_400_000 : undefined;
112
- const pending = listProposals(stashDir, { status: "pending" }).filter((p) => {
113
- if (p.source !== generator)
114
- return false;
115
- if (maxDiffLines !== undefined) {
116
- const lines = (p.payload.content ?? "").split("\n").length;
117
- if (lines > maxDiffLines)
118
- return false;
119
- }
120
- if (olderThanMs !== undefined) {
121
- const age = Date.now() - new Date(p.createdAt).getTime();
122
- if (age < olderThanMs)
123
- return false;
124
- }
125
- return true;
144
+ const { maxDiffLines, olderThanMs } = parseBulkFilterFlags(args);
145
+ const { count, results } = await bulkAdjudicateProposals({
146
+ action: "accept",
147
+ generator,
148
+ maxDiffLines,
149
+ olderThanMs,
150
+ dryRun: args["dry-run"],
151
+ queue: args.queue,
152
+ target: args.target,
126
153
  });
127
- const results = [];
128
- for (const proposal of pending) {
129
- if (args["dry-run"]) {
130
- results.push({ id: proposal.id, ref: proposal.ref, source: proposal.source, dryRun: true });
131
- }
132
- else {
133
- const result = await akmProposalAccept({ id: proposal.id, target: args.target });
134
- results.push(result);
135
- }
136
- }
137
- output("proposal-accept-batch", { accepted: results.length, results, dryRun: args["dry-run"] });
154
+ output("proposal-accept-batch", { accepted: count, results, dryRun: args["dry-run"] });
138
155
  return;
139
156
  }
140
157
  if (!args.id) {
141
158
  throw new UsageError("Usage: akm proposal accept <id> OR akm proposal accept --generator <generator>", "MISSING_REQUIRED_ARGUMENT");
142
159
  }
143
- const result = await akmProposalAccept({ id: args.id, target: args.target });
160
+ const result = await akmProposalAccept({
161
+ id: args.id,
162
+ queue: args.queue,
163
+ target: args.target,
164
+ });
144
165
  output("proposal-accept", result);
145
166
  },
146
167
  });
@@ -149,26 +170,27 @@ const proposalRejectCommand = defineJsonCommand({
149
170
  args: {
150
171
  id: {
151
172
  type: "positional",
152
- description: "Proposal id (uuid / prefix) or asset ref (e.g. skill:akm-dream). Optional when --generator is provided.",
173
+ description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream). Optional when --generator is provided.",
153
174
  required: false,
154
175
  },
155
176
  reason: { type: "string", description: "Reason for rejection (required)" },
177
+ queue: { type: "string", description: "Select the proposal queue by source name" },
156
178
  // F-6 / #393: Batch reject by generator, diff size, or age.
157
179
  generator: {
158
180
  type: "string",
159
- description: "F-6: Bulk-reject all pending proposals from this generator (e.g. reflect, distill). Requires no positional id.",
181
+ description: "Bulk-reject all pending proposals from this generator (e.g. reflect, distill). Requires no positional id.",
160
182
  },
161
183
  "max-diff-lines": {
162
184
  type: "string",
163
- description: "F-6: When bulk-rejecting, only reject proposals whose content is <= this many lines. Skips larger proposals.",
185
+ description: "When bulk-rejecting, only reject proposals whose content is <= this many lines. Skips larger proposals.",
164
186
  },
165
187
  "older-than": {
166
188
  type: "string",
167
- description: "F-6: When bulk-rejecting, only reject proposals created more than this many days ago (e.g. '7' for 7 days).",
189
+ description: "When bulk-rejecting, only reject proposals created more than this many days ago (e.g. '7' for 7 days).",
168
190
  },
169
191
  "dry-run": {
170
192
  type: "boolean",
171
- description: "F-6: List proposals that would be bulk-rejected without rejecting them.",
193
+ description: "List proposals that would be bulk-rejected without rejecting them.",
172
194
  default: false,
173
195
  },
174
196
  yes: {
@@ -179,6 +201,7 @@ const proposalRejectCommand = defineJsonCommand({
179
201
  },
180
202
  },
181
203
  async run({ args }) {
204
+ rejectRetiredProposalSourceFlag("reject");
182
205
  const generator = args.generator;
183
206
  if (!args.reason || !String(args.reason).trim()) {
184
207
  throw new UsageError("Usage: akm proposal reject <id> --reason '<reason>' OR akm proposal reject --generator <generator> --reason '<reason>'", "MISSING_REQUIRED_ARGUMENT");
@@ -191,44 +214,17 @@ const proposalRejectCommand = defineJsonCommand({
191
214
  process.stderr.write("Aborted.\n");
192
215
  return;
193
216
  }
194
- const { listProposals } = await import("./repository.js");
195
- const stashDir = resolveStashDir();
196
- const rawMaxDiff = args["max-diff-lines"] ? Number.parseInt(String(args["max-diff-lines"]), 10) : undefined;
197
- if (rawMaxDiff !== undefined && (Number.isNaN(rawMaxDiff) || rawMaxDiff < 0)) {
198
- throw new UsageError("--max-diff-lines must be a non-negative integer", "INVALID_FLAG_VALUE");
199
- }
200
- const rawOlderThan = args["older-than"] ? Number.parseInt(String(args["older-than"]), 10) : undefined;
201
- if (rawOlderThan !== undefined && (Number.isNaN(rawOlderThan) || rawOlderThan < 0)) {
202
- throw new UsageError("--older-than must be a non-negative integer (days)", "INVALID_FLAG_VALUE");
203
- }
204
- const maxDiffLines = rawMaxDiff;
205
- const olderThanMs = rawOlderThan !== undefined ? rawOlderThan * 86_400_000 : undefined;
206
- const pending = listProposals(stashDir, { status: "pending" }).filter((p) => {
207
- if (p.source !== generator)
208
- return false;
209
- if (maxDiffLines !== undefined) {
210
- const lines = (p.payload.content ?? "").split("\n").length;
211
- if (lines > maxDiffLines)
212
- return false;
213
- }
214
- if (olderThanMs !== undefined) {
215
- const age = Date.now() - new Date(p.createdAt).getTime();
216
- if (age < olderThanMs)
217
- return false;
218
- }
219
- return true;
217
+ const { maxDiffLines, olderThanMs } = parseBulkFilterFlags(args);
218
+ const { count, results } = await bulkAdjudicateProposals({
219
+ action: "reject",
220
+ generator,
221
+ maxDiffLines,
222
+ olderThanMs,
223
+ dryRun: args["dry-run"],
224
+ queue: args.queue,
225
+ reason: String(args.reason),
220
226
  });
221
- const results = [];
222
- for (const proposal of pending) {
223
- if (args["dry-run"]) {
224
- results.push({ id: proposal.id, ref: proposal.ref, source: proposal.source, dryRun: true });
225
- }
226
- else {
227
- const result = akmProposalReject({ id: proposal.id, reason: String(args.reason) });
228
- results.push(result);
229
- }
230
- }
231
- output("proposal-reject-batch", { rejected: results.length, results, dryRun: args["dry-run"] });
227
+ output("proposal-reject-batch", { rejected: count, results, dryRun: args["dry-run"] });
232
228
  return;
233
229
  }
234
230
  if (!args.id) {
@@ -242,7 +238,11 @@ const proposalRejectCommand = defineJsonCommand({
242
238
  process.stderr.write("Aborted.\n");
243
239
  return;
244
240
  }
245
- const result = akmProposalReject({ id: args.id, reason: String(args.reason) });
241
+ const result = await akmProposalReject({
242
+ id: args.id,
243
+ queue: args.queue,
244
+ reason: String(args.reason),
245
+ });
246
246
  output("proposal-reject", result);
247
247
  },
248
248
  });
@@ -251,13 +251,14 @@ const proposalDiffCommand = defineJsonCommand({
251
251
  args: {
252
252
  id: {
253
253
  type: "positional",
254
- description: "Proposal id (uuid / prefix) or asset ref (e.g. skill:akm-dream)",
254
+ description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream)",
255
255
  required: true,
256
256
  },
257
- target: { type: "string", description: "Override the write target by source name" },
257
+ queue: { type: "string", description: "Select the proposal queue by source name" },
258
+ target: { type: "string", description: "Diff destination; must match the proposal's recorded target" },
258
259
  },
259
260
  run({ args }) {
260
- const result = akmProposalDiff({ id: args.id, target: args.target });
261
+ const result = akmProposalDiff({ id: args.id, queue: args.queue, target: args.target });
261
262
  output("proposal-diff", result);
262
263
  },
263
264
  });
@@ -280,33 +281,34 @@ const proposalRevertCommand = defineJsonCommand({
280
281
  args: {
281
282
  id: {
282
283
  type: "positional",
283
- description: "Proposal id (full uuid) or asset ref (e.g. skill:akm-dream). UUID prefixes are not supported for archived proposals — use the full UUID.",
284
+ description: "Proposal id (full uuid) or asset ref (e.g. skills/akm-dream). UUID prefixes are not supported for archived proposals — use the full UUID.",
284
285
  required: true,
285
286
  },
286
- target: { type: "string", description: "Override the write target by source name" },
287
+ queue: { type: "string", description: "Select the proposal queue by source name" },
288
+ target: { type: "string", description: "Write destination; must match the proposal's recorded target" },
287
289
  },
288
290
  async run({ args }) {
289
291
  const result = await akmProposalRevert({
290
292
  id: args.id,
293
+ queue: args.queue,
291
294
  target: args.target,
292
295
  });
293
296
  output("proposal-revert", result);
294
297
  },
295
298
  });
296
299
  // `proposal show` (#225): show a single proposal with its validation findings.
297
- // `akmProposalShow` already backs `akm show proposal <id>` (now deprecated); this
298
- // is the canonical noun-group entry point.
299
300
  const proposalShowCommand = defineJsonCommand({
300
301
  meta: { name: "show", description: "Show a single proposal and its validation findings" },
301
302
  args: {
302
303
  id: {
303
304
  type: "positional",
304
- description: "Proposal id (uuid / prefix) or asset ref (e.g. skill:akm-dream)",
305
+ description: "Proposal id (uuid / prefix) or asset ref (e.g. skills/akm-dream)",
305
306
  required: true,
306
307
  },
308
+ queue: { type: "string", description: "Select the proposal queue by source name" },
307
309
  },
308
310
  run({ args }) {
309
- const result = akmProposalShow({ id: args.id });
311
+ const result = akmProposalShow({ id: args.id, queue: args.queue });
310
312
  output("proposal-show", result);
311
313
  },
312
314
  });
@@ -353,17 +355,21 @@ const proposalDrainCommand = defineJsonCommand({
353
355
  description: "Opt into the judgment tier (llm by default; agent/sdk per config) for deferred items. No-op with a logged triage_deferred summary when no runner is configured.",
354
356
  default: false,
355
357
  },
356
- profile: {
358
+ strategy: {
357
359
  type: "string",
358
- description: "Read the triage block (policy, applyMode, ceilings, judgment) from this improve profile.",
360
+ description: "Read the triage block (policy, applyMode, ceilings, judgment) from this improve strategy.",
359
361
  },
360
362
  },
361
- async run({ args }) {
363
+ async run({ args, rawArgs }) {
364
+ if (rawArgs.some((arg) => arg === "--profile" || arg.startsWith("--profile="))) {
365
+ throw new UsageError("proposal drain: --profile is retired; use --strategy.", "INVALID_FLAG_VALUE");
366
+ }
362
367
  const stashDir = resolveStashDir();
363
368
  const cfg = loadConfig();
364
- // Phase 2: read the triage block from the named improve profile. CLI flags
369
+ // Phase 2: read the triage block from the named improve strategy. CLI flags
365
370
  // always override config; config supplies defaults for any flag omitted.
366
- const triageConfig = args.profile !== undefined ? resolveImproveProfile(args.profile, cfg).processes?.triage : undefined;
371
+ const selectedStrategy = resolveImproveStrategy(args.strategy, cfg);
372
+ const triageConfig = selectedStrategy.config.processes?.triage;
367
373
  const policy = resolveDrainPolicy(args.policy ?? triageConfig?.policy);
368
374
  const dryRun = args["dry-run"] === true;
369
375
  const applyMode = args.promote === true ? "promote" : (triageConfig?.applyMode ?? "queue");
@@ -404,10 +410,12 @@ const proposalDrainCommand = defineJsonCommand({
404
410
  }
405
411
  // Phase 3: resolve the judgment runner when --judgment is set. Default
406
412
  // mode is llm; falls back to defaults.llm when the triage block sets
407
- // neither mode nor profile (mirrors resolveValidationRunner). null when
413
+ // no explicit engine selection. null when
408
414
  // nothing is configured → the engine leaves deferred items unresolved and
409
415
  // emits triage_deferred.
410
- const judgment = args.judgment === true ? resolveTriageJudgmentRunner(triageConfig?.judgment, cfg) : null;
416
+ const judgment = args.judgment === true
417
+ ? resolveTriageJudgmentRunner(triageConfig?.judgment, cfg, triageConfig, selectedStrategy.config)
418
+ : null;
411
419
  // #576: persist + attribute per-call LLM usage for the standalone drain
412
420
  // path. `IfAbsent` keeps an enclosing `akm improve` sink in charge when
413
421
  // drain runs as a sub-step; the disposer clears only a sink we installed.
@@ -416,6 +424,7 @@ const proposalDrainCommand = defineJsonCommand({
416
424
  try {
417
425
  result = await withLlmStage("drain", () => drainProposals({
418
426
  stashDir,
427
+ config: cfg,
419
428
  policy,
420
429
  applyMode,
421
430
  maxAccepts,
@@ -434,29 +443,28 @@ const proposalDrainCommand = defineJsonCommand({
434
443
  policy: policy.name,
435
444
  applyMode,
436
445
  dryRun,
446
+ strategy: selectedStrategy.name,
447
+ judgmentEngine: judgment?.engine ?? null,
448
+ judgmentKind: judgment?.kind ?? null,
437
449
  promoted: result.promoted,
438
450
  rejected: result.rejected,
439
451
  deferred: result.deferred,
440
452
  skippedByCap: result.skippedByCap,
453
+ staged: result.staged,
441
454
  });
442
455
  },
443
456
  });
444
- // ── proposal noun group (#225 / 0.8 CLI stabilization) ────────────────────────
445
- //
446
- // `akm proposal <verb>` is the canonical grammar in 0.8. The flat verbs
447
- // (`proposals`/`accept`/`reject`/`diff`/`revert`) remain as deprecated aliases
448
- // that warn to stderr and delegate to the same command bodies; they are removed
449
- // in 0.9.0. Bare `akm proposal` behaves as `proposal list` (mirrors `akm env`).
457
+ // ── proposal noun group ───────────────────────────────────────────────────────
450
458
  export const proposalCommand = defineGroupCommand({
451
- meta: { name: "proposal", description: "Manage the proposal queue: list, show, diff, accept, reject, revert" },
452
- args: {
453
- status: {
454
- type: "string",
455
- description: "Filter by status (pending|accepted|rejected|reverted)",
456
- },
457
- ref: { type: "string", description: "Filter by asset ref (type:name)" },
458
- type: { type: "string", description: "Filter by asset type" },
459
+ meta: {
460
+ name: "proposal",
461
+ description: "Manage the proposal queue: list, show, diff, accept, reject, revert, extract, new, drain",
459
462
  },
463
+ // The group declared `--queue`/`--status`/`--ref`/`--type` only so the bare
464
+ // form could act as `proposal list`. That form is gone (see below), and
465
+ // `proposalListCommand` declares the identical set, so keeping them here
466
+ // would just advertise flags in `akm proposal --help` that no group-level
467
+ // body reads.
460
468
  subCommands: {
461
469
  list: proposalListCommand,
462
470
  show: proposalShowCommand,
@@ -465,16 +473,10 @@ export const proposalCommand = defineGroupCommand({
465
473
  reject: proposalRejectCommand,
466
474
  revert: proposalRevertCommand,
467
475
  drain: proposalDrainCommand,
476
+ extract: extractCommand,
477
+ new: proposeCommand,
468
478
  },
469
- // Default body fires only for bare `akm proposal [--status …]`.
470
- defaultRun({ args }) {
471
- const status = parseProposalStatus(args.status);
472
- const result = akmProposalList({
473
- status,
474
- ref: args.ref,
475
- type: args.type,
476
- includeArchive: status === "accepted" || status === "rejected" || status === "reverted",
477
- });
478
- output("proposal-list", result);
479
- },
479
+ // No `defaultRun`: bare `akm proposal [--status …]` is a usage error (exit 2),
480
+ // the canonical bare-group behavior — owner ruling 12. `akm proposal list`
481
+ // takes the same flags and produces what the bare form used to.
480
482
  });
@@ -0,0 +1,56 @@
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
+ // ── Source allow-list (F-4 / #385) ──────────────────────────────────────────
5
+ /**
6
+ * Curated allow-list of valid `source` values for proposals (F-4 / #385).
7
+ *
8
+ * Rationale (W3C PROV-DM 2013): Provenance records require typed, validated
9
+ * sources for meaningful aggregation. Accept-rate-per-source is the core
10
+ * self-measurement metric for recursive self-improvement: if reflect proposals
11
+ * are accepted at 20% and distill proposals at 60%, that guides resource
12
+ * allocation. Free-text typos (`"reflct"`) produce unaggregatable events.
13
+ *
14
+ * Automated sources (those in {@link AUTOMATED_PROPOSAL_SOURCES}) require a
15
+ * `sourceRun` field for full PROV-DM traceability.
16
+ */
17
+ export const PROPOSAL_SOURCES = [
18
+ // Automated sources — require sourceRun for traceability.
19
+ "reflect",
20
+ "distill",
21
+ "consolidate",
22
+ "extract",
23
+ "improve",
24
+ // Semi-automated / tool-driven.
25
+ "feedback",
26
+ // Human-initiated / CLI-driven.
27
+ "propose",
28
+ "remember",
29
+ "import",
30
+ // Internal / system.
31
+ "distill_quality_rejected",
32
+ "schema-repair",
33
+ ];
34
+ /** Automated sources that SHOULD include a `sourceRun` for PROV-DM traceability. */
35
+ export const AUTOMATED_PROPOSAL_SOURCES = [
36
+ "reflect",
37
+ "distill",
38
+ "consolidate",
39
+ "extract",
40
+ "improve",
41
+ "schema-repair",
42
+ ];
43
+ /**
44
+ * Check whether a string is a valid {@link ProposalSource}.
45
+ * Unknown source values are accepted with a runtime warning rather than a hard
46
+ * error, to allow extensions without breaking existing callers.
47
+ */
48
+ export function isValidProposalSource(source) {
49
+ return PROPOSAL_SOURCES.includes(source);
50
+ }
51
+ /**
52
+ * Check whether a source value is an automated source requiring `sourceRun`.
53
+ */
54
+ export function isAutomatedProposalSource(source) {
55
+ return AUTOMATED_PROPOSAL_SOURCES.includes(source);
56
+ }