akm-cli 0.9.30 → 0.10.26101001-alpha

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 (353) hide show
  1. package/CHANGELOG.md +282 -0
  2. package/README.md +10 -10
  3. package/ROADMAP.md +112 -0
  4. package/STABILITY.md +79 -53
  5. package/dist/api-node.mjs +20 -0
  6. package/dist/api.d.ts +23 -0
  7. package/dist/api.js +45 -0
  8. package/dist/assets/hints/cli-hints-full.md +13 -27
  9. package/dist/assets/hints/cli-hints-short.md +1 -1
  10. package/dist/assets/improve-strategies/default.json +3 -3
  11. package/dist/assets/prompts/consolidate-pair.md +9 -7
  12. package/dist/cli/shared.js +31 -48
  13. package/dist/cli/unknown-flags.js +6 -43
  14. package/dist/cli.js +8 -34
  15. package/dist/commands/agent/contribute-cli.js +1 -1
  16. package/dist/commands/completions.js +1 -2
  17. package/dist/commands/config-cli.js +5 -28
  18. package/dist/commands/env/env-cli.js +5 -5
  19. package/dist/commands/env/secret-cli.js +2 -2
  20. package/dist/commands/health/checks.js +41 -16
  21. package/dist/commands/health/plugin-staleness.js +52 -22
  22. package/dist/commands/improve/autonomy-gate.js +5 -3
  23. package/dist/commands/improve/consolidate/pair-pass.js +7 -1
  24. package/dist/commands/improve/consolidate.js +6 -35
  25. package/dist/commands/improve/distill/lesson-update.js +91 -0
  26. package/dist/commands/improve/distill-guards.js +1 -43
  27. package/dist/commands/improve/distill.js +140 -20
  28. package/dist/commands/improve/extract-cli.js +1 -1
  29. package/dist/commands/improve/improve-cli.js +120 -114
  30. package/dist/commands/improve/improve-strategies.js +8 -12
  31. package/dist/commands/improve/loop-stages.js +0 -1
  32. package/dist/commands/improve/planner.js +0 -1
  33. package/dist/commands/improve/preparation.js +40 -99
  34. package/dist/commands/improve/proactive-maintenance.js +2 -2
  35. package/dist/commands/improve/reflect-noise.js +3 -55
  36. package/dist/commands/improve/reflect.js +3 -8
  37. package/dist/commands/improve/retrieval-scope.js +2 -2
  38. package/dist/commands/improve/salience.js +2 -9
  39. package/dist/commands/improve/stage.js +14 -9
  40. package/dist/commands/lint/index.js +5 -20
  41. package/dist/commands/observability-cli.js +3 -9
  42. package/dist/commands/proposal/drain.js +39 -6
  43. package/dist/commands/proposal/proposal-cli.js +10 -30
  44. package/dist/commands/proposal/repository.js +3 -3
  45. package/dist/commands/read/knowledge.js +3 -3
  46. package/dist/commands/read/remember-cli.js +0 -13
  47. package/dist/commands/read/search-cli.js +29 -97
  48. package/dist/commands/read/search.js +0 -11
  49. package/dist/commands/read/show.js +0 -19
  50. package/dist/commands/sources/plugin-upgrade.js +164 -101
  51. package/dist/commands/sources/sources-cli.js +1 -15
  52. package/dist/commands/sources/stash-cli.js +4 -12
  53. package/dist/commands/tasks/tasks-cli.js +4 -115
  54. package/dist/commands/workflow/plan.js +11 -33
  55. package/dist/commands/workflow-cli.js +2 -7
  56. package/dist/core/adapter/adapter-ids.js +1 -2
  57. package/dist/core/adapter/adapters/agent-skills-adapter.js +0 -4
  58. package/dist/core/adapter/adapters/akm-adapter.js +9 -48
  59. package/dist/core/adapter/adapters/akm-lint.js +10 -26
  60. package/dist/core/adapter/adapters/akm-metadata.js +2 -72
  61. package/dist/core/adapter/adapters/akm-task-adapter.js +0 -5
  62. package/dist/core/adapter/adapters/akm-workflow-adapter.js +9 -28
  63. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -20
  64. package/dist/core/adapter/adapters/generic-files-adapter.js +0 -10
  65. package/dist/core/adapter/adapters/llm-wiki-adapter.js +0 -4
  66. package/dist/core/adapter/adapters/tool-dir-shared.js +0 -24
  67. package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -4
  68. package/dist/core/adapter/recognize-match.js +3 -4
  69. package/dist/core/common.js +18 -2
  70. package/dist/core/config/config-schema.js +12 -15
  71. package/dist/core/config/config-types.js +6 -15
  72. package/dist/core/config/config-walker.js +6 -23
  73. package/dist/core/config/config.js +17 -80
  74. package/dist/core/config/engine-semantics.js +7 -3
  75. package/dist/core/config/schema/engines.js +7 -7
  76. package/dist/core/config/schema/improve-processes.js +8 -61
  77. package/dist/core/config/schema/improve.js +2 -21
  78. package/dist/core/config/schema/index-config.js +6 -39
  79. package/dist/core/env-secret-ref.js +2 -45
  80. package/dist/core/errors.js +1 -2
  81. package/dist/core/extra-params.js +2 -86
  82. package/dist/core/file-lock.js +10 -1
  83. package/dist/core/improve-result.js +11 -1
  84. package/dist/core/mutation-target.js +2 -2
  85. package/dist/core/recognition-util.js +4 -5
  86. package/dist/core/warn.js +21 -4
  87. package/dist/core/write-source.js +3 -3
  88. package/dist/execution/target-ref.js +1 -2
  89. package/dist/indexer/search/db-search.js +4 -19
  90. package/dist/indexer/search/fts-query.js +0 -19
  91. package/dist/integrations/agent/engine-resolution.js +5 -2
  92. package/dist/integrations/agent/index.js +1 -1
  93. package/dist/integrations/agent/profiles.js +41 -98
  94. package/dist/integrations/agent/request-lowering.js +3 -3
  95. package/dist/integrations/harnesses/aider/index.js +5 -0
  96. package/dist/integrations/harnesses/amazonq/index.js +1 -0
  97. package/dist/integrations/harnesses/claude/config-import.js +2 -3
  98. package/dist/integrations/harnesses/claude/index.js +5 -0
  99. package/dist/integrations/harnesses/codex/index.js +1 -0
  100. package/dist/integrations/harnesses/copilot/index.js +1 -0
  101. package/dist/integrations/harnesses/gemini/index.js +1 -0
  102. package/dist/integrations/harnesses/index.js +18 -39
  103. package/dist/integrations/harnesses/opencode/agent-builder.js +60 -35
  104. package/dist/integrations/harnesses/opencode/config-import.js +121 -52
  105. package/dist/integrations/harnesses/opencode/index.js +22 -0
  106. package/dist/integrations/harnesses/opencode/plugin-layout.js +68 -0
  107. package/dist/integrations/harnesses/opencode/session-log-types.js +12 -0
  108. package/dist/integrations/harnesses/opencode/session-log-v1.js +72 -0
  109. package/dist/integrations/harnesses/opencode/session-log-v2.js +140 -0
  110. package/dist/integrations/harnesses/opencode/session-log.js +104 -115
  111. package/dist/integrations/harnesses/opencode/version.js +98 -0
  112. package/dist/integrations/harnesses/opencode-sdk/{harness.js → index.js} +5 -17
  113. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +105 -206
  114. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +199 -0
  115. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +228 -0
  116. package/dist/integrations/harnesses/opencode-sdk/wire.js +66 -0
  117. package/dist/integrations/harnesses/openhands/index.js +1 -0
  118. package/dist/integrations/harnesses/pi/index.js +1 -0
  119. package/dist/integrations/harnesses/shared.js +2 -0
  120. package/dist/integrations/harnesses/types.js +2 -0
  121. package/dist/llm/client.js +74 -14
  122. package/dist/output/cli-hints.js +1 -1
  123. package/dist/output/context.js +10 -19
  124. package/dist/output/format-exempt.js +5 -8
  125. package/dist/output/shapes/helpers.js +1 -22
  126. package/dist/output/shapes/passthrough.js +0 -1
  127. package/dist/output/shapes.js +3 -31
  128. package/dist/output/stdout.js +5 -1
  129. package/dist/output/text/command-format.js +6 -1
  130. package/dist/output/text/workflow-format.js +4 -22
  131. package/dist/scripts/akm-migrate-node.js +15746 -16706
  132. package/dist/scripts/akm-migrate.js +16319 -17275
  133. package/dist/setup/detect.js +10 -4
  134. package/dist/setup/harness-config-import.js +5 -14
  135. package/dist/setup/setup.js +1 -1
  136. package/dist/setup/steps/tasks.js +12 -13
  137. package/dist/storage/repositories/task-history-repository.js +0 -5
  138. package/dist/storage/repositories/workflow-runs-repository.js +5 -15
  139. package/dist/tasks/embedded.js +2 -1
  140. package/dist/tasks/run/task-history.js +0 -2
  141. package/dist/tasks/schedule-gates.js +39 -0
  142. package/dist/tasks/scheduler-binding.js +0 -16
  143. package/dist/tasks/scheduler-sync.js +3 -97
  144. package/dist/tasks/source/bounded-document.js +1 -1
  145. package/dist/tasks/source/task-source-v4.js +2 -12
  146. package/dist/tasks/task-run-reserved-flags.js +2 -31
  147. package/dist/workflows/authoring/authoring.js +6 -6
  148. package/dist/workflows/compile.js +8 -65
  149. package/dist/workflows/exec/child-workflow.js +22 -3
  150. package/dist/workflows/exec/native-executor.js +12 -147
  151. package/dist/workflows/exec/run-workflow.js +31 -103
  152. package/dist/workflows/exec/step-work.js +9 -178
  153. package/dist/workflows/exec/unit-dispatch.js +0 -10
  154. package/dist/workflows/freeze/environment.js +3 -44
  155. package/dist/workflows/freeze/freeze.js +8 -41
  156. package/dist/workflows/freeze/targets/child-workflow.js +27 -63
  157. package/dist/workflows/freeze/targets/command.js +2 -16
  158. package/dist/workflows/freeze/targets/shell.js +0 -2
  159. package/dist/workflows/freeze/task-bindings.js +2 -28
  160. package/dist/workflows/ir/params.js +12 -2
  161. package/dist/workflows/parser.js +82 -232
  162. package/dist/workflows/plan.js +1 -1
  163. package/dist/workflows/renderer.js +10 -19
  164. package/dist/workflows/runtime/run-plan.js +11 -53
  165. package/dist/workflows/runtime/runs.js +4 -27
  166. package/dist/workflows/source-files.js +12 -16
  167. package/dist/workflows/source-semantics.js +1 -93
  168. package/docs/README.md +43 -42
  169. package/docs/agents/README.md +15 -0
  170. package/docs/agents/agent-install.md +14 -0
  171. package/docs/architecture/README.md +67 -0
  172. package/docs/architecture/adapters.md +258 -0
  173. package/docs/architecture/akm-architecture-decision-history.md +2055 -0
  174. package/docs/architecture/akm-core-principles.md +126 -0
  175. package/docs/architecture/architecture.md +578 -0
  176. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +550 -0
  177. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +72 -0
  178. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +142 -0
  179. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +189 -0
  180. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +97 -0
  181. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +108 -0
  182. package/docs/architecture/decisions/0006-task-source-version-routing.md +124 -0
  183. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +83 -0
  184. package/docs/architecture/decisions/0008-task-binding-normalization.md +88 -0
  185. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +80 -0
  186. package/docs/architecture/decisions/0010-driver-protocol-cut.md +36 -0
  187. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +125 -0
  188. package/docs/architecture/decisions/README.md +62 -0
  189. package/docs/architecture/improvement.md +471 -0
  190. package/docs/architecture/internals/classification.md +154 -0
  191. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +40 -0
  192. package/docs/architecture/internals/functional-contract-patterns.md +340 -0
  193. package/docs/architecture/internals/health-advisories.md +110 -0
  194. package/docs/architecture/internals/improve-workflow.md +720 -0
  195. package/docs/architecture/internals/indexing.md +498 -0
  196. package/docs/architecture/internals/registry-network-boundary.md +57 -0
  197. package/docs/architecture/internals/search.md +248 -0
  198. package/docs/architecture/internals/storage-locations.md +943 -0
  199. package/docs/architecture/persisted-data-compat.md +68 -0
  200. package/docs/architecture/reviews/env-secret-access.md +319 -0
  201. package/docs/architecture/runtime-boundary-design.md +153 -0
  202. package/docs/architecture/specs/0.9.0-close-out-plan.md +361 -0
  203. package/docs/architecture/specs/0.9.0-decisions.md +532 -0
  204. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +745 -0
  205. package/docs/architecture/specs/0.9.0-open-items-register.md +135 -0
  206. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +740 -0
  207. package/docs/architecture/specs/0.9.0-release-surface-review.md +636 -0
  208. package/docs/architecture/specs/agent-command-engine-model-design.md +513 -0
  209. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +501 -0
  210. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +291 -0
  211. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +2059 -0
  212. package/docs/architecture/specs/di-seams-plan.md +539 -0
  213. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +275 -0
  214. package/docs/architecture/specs/fact-asset-type.md +142 -0
  215. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +634 -0
  216. package/docs/architecture/specs/okf-support.md +148 -0
  217. package/docs/architecture/specs/ref.md +329 -0
  218. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +72 -0
  219. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +152 -0
  220. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +352 -0
  221. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +300 -0
  222. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +402 -0
  223. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +758 -0
  224. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +645 -0
  225. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +602 -0
  226. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +27 -0
  227. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +27 -0
  228. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +74 -0
  229. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +15 -0
  230. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +132 -0
  231. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +147 -0
  232. package/docs/architecture/specs/stash-conventions-code-spec.md +275 -0
  233. package/docs/architecture/specs/stash-organization-conventions.md +377 -0
  234. package/docs/architecture/specs/task-workflow-format-unification.md +721 -0
  235. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +231 -0
  236. package/docs/architecture/specs/workflow-format-unification.md +432 -0
  237. package/docs/architecture/testing/manual-testing-checklist.md +3411 -0
  238. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +924 -0
  239. package/docs/architecture/testing/task-workflow-manual-tests.md +1720 -0
  240. package/docs/architecture/testing/testing-workflow.md +446 -0
  241. package/docs/architecture/workflow-engine.md +223 -0
  242. package/docs/guides/README.md +33 -0
  243. package/docs/guides/author-bundles.md +310 -0
  244. package/docs/guides/author-workflows.md +490 -0
  245. package/docs/guides/bundles.md +321 -0
  246. package/docs/guides/capture-knowledge.md +136 -0
  247. package/docs/guides/claude-code-vs-akm-workflows.md +29 -0
  248. package/docs/guides/concepts.md +93 -0
  249. package/docs/guides/discover-and-load.md +158 -0
  250. package/docs/guides/getting-started.md +240 -0
  251. package/docs/guides/improve-the-library.md +246 -0
  252. package/docs/guides/knowledge-management.md +18 -0
  253. package/docs/guides/recipes/headless-install.md +97 -0
  254. package/docs/guides/recipes/website-source.md +28 -0
  255. package/docs/guides/run-workflows.md +279 -0
  256. package/docs/guides/scheduling.md +123 -0
  257. package/docs/guides/use-with-any-agent.md +174 -0
  258. package/docs/guides/wikis.md +81 -0
  259. package/docs/integration/bundling-akm.md +7 -6
  260. package/docs/maintainers/README.md +19 -0
  261. package/docs/maintainers/curate-workmap.md +335 -0
  262. package/docs/maintainers/eval.md +3 -0
  263. package/docs/maintainers/local-development.md +108 -0
  264. package/docs/maintainers/release-checklist.md +132 -0
  265. package/docs/migration/README.md +2 -2
  266. package/docs/migration/release-notes/0.0.13.md +1 -1
  267. package/docs/migration/release-notes/0.1.0.md +1 -1
  268. package/docs/migration/release-notes/0.2.0.md +1 -1
  269. package/docs/migration/release-notes/0.3.0.md +1 -1
  270. package/docs/migration/release-notes/0.5.0.md +1 -1
  271. package/docs/migration/release-notes/0.6.0.md +1 -1
  272. package/docs/migration/release-notes/0.7.0.md +1 -1
  273. package/docs/migration/release-notes/0.7.3.md +2 -2
  274. package/docs/migration/release-notes/0.7.4.md +1 -1
  275. package/docs/migration/release-notes/0.7.5.md +1 -1
  276. package/docs/migration/release-notes/0.8.0.md +1 -1
  277. package/docs/migration/release-notes/0.9.0.md +1 -1
  278. package/docs/migration/release-notes/0.9.14.md +1 -1
  279. package/docs/migration/release-notes/0.9.15.md +1 -1
  280. package/docs/migration/release-notes/0.9.16.md +1 -1
  281. package/docs/migration/release-notes/0.9.17.md +1 -1
  282. package/docs/migration/release-notes/0.9.19.md +1 -1
  283. package/docs/migration/release-notes/0.9.2.md +1 -1
  284. package/docs/migration/release-notes/README.md +27 -31
  285. package/docs/migration/v0.5-to-v0.6.md +759 -0
  286. package/docs/migration/v0.8-to-v0.9.md +1 -1
  287. package/docs/plans/0.9.2-agent-command-workflow-plan.md +423 -0
  288. package/docs/posts/README.md +30 -0
  289. package/docs/posts/akm-command-tour.md +495 -0
  290. package/docs/posts/akm-logo-sized.webp +0 -0
  291. package/docs/posts/belief-aware-memory-12.md +139 -0
  292. package/docs/posts/config-v2-lessons-16.md +191 -0
  293. package/docs/posts/improve-loop-autonomous-10.md +225 -0
  294. package/docs/posts/improve-pipeline-debugging-0803.md +179 -0
  295. package/docs/posts/intro-part-01.md +76 -0
  296. package/docs/posts/intro-part-02.md +221 -0
  297. package/docs/posts/intro-part-03.md +190 -0
  298. package/docs/posts/intro-part-04.md +221 -0
  299. package/docs/posts/llm-mode-reflect-13.md +166 -0
  300. package/docs/posts/openpalm-built-on-akm.md +86 -0
  301. package/docs/posts/progressive-disclosure-06.md +129 -0
  302. package/docs/posts/proposal-safety-net-15.md +112 -0
  303. package/docs/posts/release-0.5.0.md +247 -0
  304. package/docs/posts/release-0.6.0.md +117 -0
  305. package/docs/posts/release-0.7.0.md +159 -0
  306. package/docs/posts/release-0.8.0.md +332 -0
  307. package/docs/posts/scattered-skills-05.md +100 -0
  308. package/docs/posts/task-assets-persistent-workflows-11.md +222 -0
  309. package/docs/posts/team-skills-07.md +198 -0
  310. package/docs/posts/wiki-agent-knowledge-08.md +223 -0
  311. package/docs/posts/workflows-vaults-09.md +321 -0
  312. package/docs/product-surface.md +54 -0
  313. package/docs/reference/README.md +2 -2
  314. package/docs/reference/api.md +65 -0
  315. package/docs/reference/asset-types.md +166 -0
  316. package/docs/reference/bundle-types.md +2 -4
  317. package/docs/reference/cli.md +129 -175
  318. package/docs/reference/configuration.md +84 -19
  319. package/docs/reference/data-and-telemetry.md +1 -1
  320. package/docs/reference/env-and-secrets.md +126 -0
  321. package/docs/reference/memory.md +124 -0
  322. package/docs/reference/refs.md +156 -0
  323. package/docs/reference/registry.md +489 -0
  324. package/docs/reference/supported-formats.md +3 -4
  325. package/docs/reference/tasks.md +12 -19
  326. package/docs/reference/website-sources.md +141 -0
  327. package/docs/reference/workflow-schema.md +89 -317
  328. package/docs/reference/workflows.md +20 -48
  329. package/package.json +23 -16
  330. package/schemas/akm-config.json +2 -243
  331. package/schemas/akm-task.json +2 -3
  332. package/schemas/akm-workflow.json +47 -84
  333. package/dist/assets/improve-strategies/catchup.json +0 -41
  334. package/dist/assets/improve-strategies/proactive-maintenance.json +0 -24
  335. package/dist/assets/improve-strategies/quick.json +0 -17
  336. package/dist/assets/improve-strategies/reflect-distill.json +0 -29
  337. package/dist/assets/improve-strategies/thorough.json +0 -49
  338. package/dist/assets/tasks/improve/akm-improve-catchup.yml +0 -6
  339. package/dist/assets/tasks/improve/akm-improve-frequent.yml +0 -4
  340. package/dist/assets/tasks/improve/akm-improve-nightly.yml +0 -4
  341. package/dist/cli/retired-commands.js +0 -118
  342. package/dist/commands/tasks/validate.js +0 -176
  343. package/dist/core/config/legacy-source-shape-shim.js +0 -117
  344. package/dist/integrations/harnesses/ids.js +0 -28
  345. package/dist/tasks/source/task-source-v3-frozen.js +0 -424
  346. package/dist/tasks/source/task-to-v4.js +0 -863
  347. package/dist/workflows/exec/worktree.js +0 -372
  348. package/dist/workflows/freeze/child-output-references.js +0 -83
  349. package/dist/workflows/freeze/identity.js +0 -22
  350. package/dist/workflows/freeze/targets/script.js +0 -50
  351. package/dist/workflows/freeze/targets/task.js +0 -124
  352. package/dist/workflows/github-yaml.js +0 -506
  353. package/dist/workflows/runtime/run-outputs.js +0 -80
@@ -3,20 +3,20 @@
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 { 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";
6
+ import { findCittyTopLevelCommandIndex, getStringArg, hasSubcommand, parsePositiveIntFlag } from "../../cli/parse-args.js";
7
+ import { defineJsonCommand, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
9
8
  import { isFullRefInput, parseRefInput } from "../../core/asset/resolve-ref.js";
10
9
  import { loadConfig } from "../../core/config/config.js";
11
10
  import { ConfigError, UsageError } from "../../core/errors.js";
12
11
  import { resolveMutationTarget } from "../../core/mutation-target.js";
13
12
  import { getCacheDir } from "../../core/paths.js";
14
13
  import { redactSensitiveText } from "../../core/redaction.js";
15
- import { clearLogFile, setLogFile, warn } from "../../core/warn.js";
14
+ import { clearLogFile, setLogFile } from "../../core/warn.js";
16
15
  import { resolveWriteTarget } from "../../core/write-source.js";
17
16
  import { DEFAULT_LLM_TIMEOUT_MS } from "../../integrations/agent/config.js";
18
17
  import { defaultWhich } from "../../integrations/agent/detect.js";
19
- import { collectEngineCredentialValues } from "../../integrations/agent/engine-resolution.js";
18
+ import { collectEngineCredentialValues, materializeLlmConnection, } from "../../integrations/agent/engine-resolution.js";
19
+ import { llmUseFromRunner, sdkFallbackUseFromRunner } from "../../integrations/agent/runner.js";
20
20
  import { probeLlmReachable } from "../../llm/client.js";
21
21
  import { getOutputMode } from "../../output/context.js";
22
22
  import { deliverRendered } from "../../output/html-render.js";
@@ -34,37 +34,6 @@ let akmImproveForRun = akmImprove;
34
34
  export function _setAkmImproveForTests(fake) {
35
35
  akmImproveForRun = fake ?? akmImprove;
36
36
  }
37
- /**
38
- * `--auto-accept` (removed in 0.9): citty absorbs it silently, and
39
- * `--auto-accept 90` would leave `90` as the scope — a 0.8-era crontab would
40
- * match nothing and exit 0. Warn, and drop that positional.
41
- */
42
- function resolveScopeAfterRetiredAutoAccept(scopeArg) {
43
- const invocation = getParsedInvocation();
44
- const autoAcceptRaw = invocation.getFlagValue("--auto-accept");
45
- if (autoAcceptRaw === undefined && !invocation.hasFlag("--auto-accept"))
46
- return scopeArg;
47
- warn("[improve] --auto-accept was removed in 0.9 and is ignored; proposals always queue for review. " +
48
- "Replacement: `akm improve && akm proposal drain --promote --yes`, or a `triage` block with " +
49
- 'applyMode: "promote" in your strategy. It becomes a hard error in 0.10.');
50
- if (scopeArg !== undefined && scopeArg === autoAcceptRaw) {
51
- warn(`[improve] ignoring "${scopeArg}" as a scope — it is the removed --auto-accept flag's value.`);
52
- return undefined;
53
- }
54
- return scopeArg;
55
- }
56
- /** `akm improve canary` (removed in 0.9) would otherwise be a type scope matching nothing, exiting 0. */
57
- function rejectRetiredCanaryScope(scopeArg) {
58
- if (scopeArg !== "canary")
59
- return;
60
- throw new UsageError('"akm improve canary" was removed in 0.9; the collapse-detector canary set it managed no longer exists.', "INVALID_FLAG_VALUE");
61
- }
62
- /** `--target` (renamed `--bundle` in 0.9) would otherwise be absorbed and write to the default bundle. */
63
- function rejectRetiredImproveTargetFlag() {
64
- if (!getParsedInvocation().hasFlag("--target"))
65
- return;
66
- throw new UsageError("`akm improve --target` was renamed to `--bundle` in 0.9. Use `--bundle <name>` instead.", "INVALID_FLAG_VALUE");
67
- }
68
37
  /**
69
38
  * `--require-engines` (#957): fail before any side effect when an enabled
70
39
  * process cannot run, naming what each is missing — a scheduled run would
@@ -81,18 +50,36 @@ function collectRequiredEngineTargets(plan) {
81
50
  const runners = Object.entries(plan.processes)
82
51
  .flatMap(([processName, process]) => (process.runner ? [[processName, process.runner]] : []))
83
52
  .concat(plan.triageJudgment ? [["triage.judgment", plan.triageJudgment]] : []);
84
- return runners.map(([processName, runner]) => ({
85
- process: processName,
86
- engine: runner.engine,
87
- ...(runner.kind === "llm" ? { connection: probeConnection(runner) } : { bin: runner.profile.bin }),
88
- ...(runner.kind === "sdk" && runner.fallbackConnection
89
- ? { connection: probeConnection({ connection: runner.fallbackConnection, timeoutMs: runner.fallbackTimeoutMs }) }
90
- : {}),
91
- }));
53
+ return runners.map(([processName, runner]) => {
54
+ // The runner's own timeout, else the connection's (sdkFallbackUseFromRunner already does this).
55
+ const use = runner.kind === "llm"
56
+ ? {
57
+ ...llmUseFromRunner(runner),
58
+ timeoutMs: runner.timeoutMs !== undefined ? runner.timeoutMs : (runner.connection.timeoutMs ?? null),
59
+ }
60
+ : runner.kind === "sdk"
61
+ ? sdkFallbackUseFromRunner(runner)
62
+ : undefined;
63
+ return {
64
+ process: processName,
65
+ engine: runner.engine,
66
+ ...(runner.kind === "llm" ? {} : { bin: runner.profile.bin }),
67
+ ...(use ? probeConnection(use) : {}),
68
+ };
69
+ });
92
70
  }
93
- /** The resolved engine keeps its request timeout beside the connection (the runtime merges it in); the probe needs it on the connection. */
94
- function probeConnection(runner) {
95
- return runner.timeoutMs !== undefined ? { ...runner.connection, timeoutMs: runner.timeoutMs } : runner.connection;
71
+ /**
72
+ * The connection the probe sends, built as a dispatch builds it: the runner
73
+ * keeps its credential symbolic, so the key is read and injected here, or the
74
+ * probe would go out without one.
75
+ */
76
+ function probeConnection(use) {
77
+ try {
78
+ return { connection: materializeLlmConnection(use) };
79
+ }
80
+ catch (err) {
81
+ return { connection: use.connection, error: err instanceof Error ? err.message : String(err) };
82
+ }
96
83
  }
97
84
  /**
98
85
  * The bound on `--require-engines`' probe: the connection's own request
@@ -133,6 +120,8 @@ export async function assertRequiredEnginesReachable(plan, probeReachable = (con
133
120
  }
134
121
  if (!target.connection)
135
122
  return { ...target, reach: { reachable: true }, latencyMs: 0 };
123
+ if (target.error)
124
+ return { ...target, reach: { reachable: false, error: target.error }, latencyMs: 0 };
136
125
  return { ...target, ...(await probeConnectionOnce(target.connection)) };
137
126
  }));
138
127
  const unreachable = probed.filter((item) => !item.reach.reachable);
@@ -173,53 +162,91 @@ async function runShowPromptCli(refArg, parsedRef, taskArg, targetArg, resolvedP
173
162
  });
174
163
  }
175
164
  /** `akm improve report` (#944): the per-run LLM usage/routing report ("report" is no asset type). */
176
- function runImproveReportCli(args) {
177
- const runIdArg = getStringArg(args, "run");
178
- const sinceArg = getStringArg(args, "since");
179
- const result = runImproveReportQuery({ runId: runIdArg, since: sinceArg });
180
- output("improve-report", { ok: true, ...result });
181
- }
182
- /** `--run`/`--since` belong to `improve report`; elsewhere citty would silently ignore them. */
183
- function rejectReportOnlyFlags(args) {
184
- const flag = getStringArg(args, "run") !== undefined
185
- ? "--run"
186
- : getStringArg(args, "since") !== undefined
187
- ? "--since"
188
- : undefined;
189
- if (flag === undefined)
190
- return;
191
- throw new UsageError(`\`${flag}\` only applies to \`akm improve report\`. Use \`akm improve report ${flag} <value>\` instead.`, "INVALID_FLAG_VALUE");
192
- }
165
+ const improveReportCommand = defineJsonCommand({
166
+ meta: {
167
+ name: "report",
168
+ description: "Show the LLM usage/routing report for the most recent improve run, one run, or a window of runs.",
169
+ },
170
+ args: {
171
+ run: {
172
+ type: "string",
173
+ description: "Show the report for one specific improve_runs row instead of the most recent run. Mutually exclusive with --since.",
174
+ },
175
+ since: {
176
+ type: "string",
177
+ description: 'Aggregate the report over every real run started since <window> (a duration like "24h"/"7d", or an ISO timestamp) instead of showing one run. Mutually exclusive with --run.',
178
+ },
179
+ },
180
+ run({ args }) {
181
+ const result = runImproveReportQuery({ runId: getStringArg(args, "run"), since: getStringArg(args, "since") });
182
+ output("improve-report", { ok: true, ...result });
183
+ },
184
+ });
193
185
  /**
194
186
  * `akm improve judge`: reflect's quality judge on one revision, read as
195
187
  * `{"source", "candidate", "feedback"}` JSON from stdin, with the engine the
196
188
  * strategy's reflect quality gate names. It writes nothing.
197
189
  */
198
- async function runImproveJudgeCli(strategyName) {
199
- const input = process.stdin.isTTY
200
- ? {}
201
- : JSON.parse((await readStdin()).toString("utf8"));
202
- const { source, candidate, feedback, ref } = input;
203
- if (typeof source !== "string" || typeof candidate !== "string") {
204
- throw new UsageError('`akm improve judge` reads {"source": "...", "candidate": "...", "feedback": "...", "ref": "..."} JSON from stdin.', "MISSING_REQUIRED_ARGUMENT");
205
- }
206
- const config = loadConfig();
207
- const judge = resolveQualityGateJudge(config, resolveImproveStrategy(strategyName, config).config, "reflect");
208
- if (!judge) {
209
- throw new ConfigError("`akm improve judge` judges with the reflect quality gate's engine. Set processes.reflect.qualityGate.engine.", "INVALID_CONFIG_FILE");
210
- }
211
- const notes = typeof feedback === "string" && feedback.trim() !== "" ? [feedback.trim()] : [];
212
- const verdict = await runReflectQualityJudge(config, candidate, source, notes, undefined, {
213
- runnerSelectionFrozen: true,
214
- llmRunner: judge,
215
- ...(typeof ref === "string" && ref ? { ref } : {}),
216
- });
217
- output("improve-judge", { engine: judge.engine, ...verdict });
218
- }
190
+ const improveJudgeCommand = defineJsonCommand({
191
+ meta: {
192
+ name: "judge",
193
+ description: "Run reflect's quality judge on one revision, read as {source, candidate, feedback, ref} JSON from stdin. Writes nothing.",
194
+ },
195
+ args: {
196
+ strategy: {
197
+ type: "string",
198
+ description: "Named improve strategy whose reflect quality gate names the judge engine.",
199
+ },
200
+ },
201
+ async run({ args }) {
202
+ const input = process.stdin.isTTY
203
+ ? {}
204
+ : JSON.parse((await readStdin()).toString("utf8"));
205
+ const { source, candidate, feedback, ref } = input;
206
+ if (typeof source !== "string" || typeof candidate !== "string") {
207
+ throw new UsageError('`akm improve judge` reads {"source": "...", "candidate": "...", "feedback": "...", "ref": "..."} JSON from stdin.', "MISSING_REQUIRED_ARGUMENT");
208
+ }
209
+ const config = loadConfig();
210
+ const judge = resolveQualityGateJudge(config, resolveImproveStrategy(getStringArg(args, "strategy"), config).config, "reflect");
211
+ if (!judge) {
212
+ throw new ConfigError("`akm improve judge` judges with the reflect quality gate's engine. Set processes.reflect.qualityGate.engine.", "INVALID_CONFIG_FILE");
213
+ }
214
+ const notes = typeof feedback === "string" && feedback.trim() !== "" ? [feedback.trim()] : [];
215
+ const verdict = await runReflectQualityJudge(config, candidate, source, notes, undefined, {
216
+ runnerSelectionFrozen: true,
217
+ llmRunner: judge,
218
+ ...(typeof ref === "string" && ref ? { ref } : {}),
219
+ });
220
+ output("improve-judge", { engine: judge.engine, ...verdict });
221
+ },
222
+ });
223
+ /** The subcommands `setup` withheld for this run, restored by `cleanup` (one command runs per process; in-process tests run many). */
224
+ let subCommandsWithheld = false;
225
+ const IMPROVE_SUBCOMMANDS = { report: improveReportCommand, judge: improveJudgeCommand };
219
226
  export const improveCommand = defineCommand({
220
227
  meta: {
221
228
  name: "improve",
222
- description: "Analyze existing AKM assets and generate improvement proposals; also consolidates memories when the selected strategy enables consolidate.",
229
+ description: "Analyze existing AKM assets and generate improvement proposals; also consolidates memories when the selected strategy enables consolidate. `improve report` and `improve judge` are subcommands.",
230
+ },
231
+ subCommands: IMPROVE_SUBCOMMANDS,
232
+ // `improve` takes a scope positional (an asset type or ref), and citty reads
233
+ // the first positional of a command with subcommands as a subcommand name,
234
+ // failing with an unknown command for a scope. So the subcommands stay
235
+ // registered only for an invocation that names one; any other, scope or none,
236
+ // is the improve run itself.
237
+ setup(context) {
238
+ const index = findCittyTopLevelCommandIndex(context.rawArgs, improveCommand.args);
239
+ const token = index >= 0 ? context.rawArgs[index] : undefined;
240
+ if (token !== undefined && token in IMPROVE_SUBCOMMANDS)
241
+ return;
242
+ subCommandsWithheld = true;
243
+ context.cmd.subCommands = undefined;
244
+ },
245
+ cleanup(context) {
246
+ if (!subCommandsWithheld)
247
+ return;
248
+ context.cmd.subCommands = IMPROVE_SUBCOMMANDS;
249
+ subCommandsWithheld = false;
223
250
  },
224
251
  // Declared explicitly: otherwise citty takes `--format`'s value as the scope.
225
252
  args: {
@@ -231,11 +258,6 @@ export const improveCommand = defineCommand({
231
258
  },
232
259
  task: { type: "string", description: "Add extra guidance for this improvement pass" },
233
260
  "dry-run": { type: "boolean", description: "Show planned actions without writing", default: false },
234
- plan: {
235
- type: "boolean",
236
- description: "Alias for --dry-run (#947). Sets the exact same internal flag; use it when previewing resolved process -> engine -> model routing (plan.processes) rather than checking what would write.",
237
- default: false,
238
- },
239
261
  bundle: {
240
262
  type: "string",
241
263
  description: "Bundle to improve and write proposals to (default: defaultWriteTarget, else the working bundle); only its assets are planned",
@@ -247,7 +269,7 @@ export const improveCommand = defineCommand({
247
269
  },
248
270
  "require-feedback-signal": {
249
271
  type: "boolean",
250
- description: "Turn the proactive/high-salience fallback lanes off (they only select and score assets; a rewrite needs negative feedback)",
272
+ description: "Turn the proactive-maintenance lane off for this run, so only assets with recent feedback are planned",
251
273
  default: false,
252
274
  },
253
275
  "json-to-stdout": {
@@ -270,17 +292,9 @@ export const improveCommand = defineCommand({
270
292
  description: "Print the composed reflect prompt for one asset ref and exit — no lock, index write, or engine dispatch (#952). Requires a fully-qualified asset ref as the scope positional (e.g. `akm improve lessons/my-lesson --show-prompt`). JSON/yaml format carries the prompt as a `prompt` field; text format prints it directly.",
271
293
  default: false,
272
294
  },
273
- run: {
274
- type: "string",
275
- description: 'Only with the "report" scope (`akm improve report --run <id>`): show the LLM usage/routing report for one specific improve_runs row instead of the most recent run. Mutually exclusive with --since.',
276
- },
277
- since: {
278
- type: "string",
279
- description: 'Only with the "report" scope (`akm improve report --since <window>`): aggregate the LLM usage/routing report over every real run started since <window> (a duration like "24h"/"7d", or an ISO timestamp) instead of showing one run. Mutually exclusive with --run.',
280
- },
281
295
  strategy: {
282
296
  type: "string",
283
- description: "Named improve strategy from improve.strategies or built-in strategies (catchup, consolidate, default, proactive-maintenance, quick, reflect-distill, thorough). Controls which sub-processes run and which asset types are processed.",
297
+ description: "Named improve strategy from improve.strategies or built-in strategies (consolidate, default). Controls which sub-processes run and which asset types are processed.",
284
298
  },
285
299
  sync: {
286
300
  type: "boolean",
@@ -293,29 +307,21 @@ export const improveCommand = defineCommand({
293
307
  },
294
308
  async run({ args }) {
295
309
  await runWithJsonErrors(async () => {
296
- if (getStringArg(args, "scope") === "report") {
297
- runImproveReportCli(args);
310
+ // citty runs this body after a subcommand it dispatched too.
311
+ if (hasSubcommand(args, new Set(Object.keys(IMPROVE_SUBCOMMANDS))))
298
312
  return;
299
- }
300
- rejectReportOnlyFlags(args);
301
- if (getStringArg(args, "scope") === "judge") {
302
- await runImproveJudgeCli(getStringArg(args, "strategy"));
303
- return;
304
- }
305
- rejectRetiredImproveTargetFlag();
306
313
  const jsonToStdout = args["json-to-stdout"];
307
314
  const targetArg = getStringArg(args, "bundle");
308
315
  const taskArg = getStringArg(args, "task");
309
- // `--plan` is an alias for `--dry-run`; `--show-prompt` is read-only too.
310
- const dryRun = args["dry-run"] || args.plan || args["show-prompt"];
316
+ // `--show-prompt` is read-only too.
317
+ const dryRun = args["dry-run"] || args["show-prompt"];
311
318
  const limitRaw = parsePositiveIntFlag(args.limit ?? undefined);
312
319
  const timeoutMs = parsePositiveIntFlag(args["timeout-ms"], "--timeout-ms");
313
320
  const requireFeedbackSignal = args["require-feedback-signal"];
314
321
  const skipIfLocked = args["skip-if-locked"];
315
322
  const strategyArg = getStringArg(args, "strategy");
316
323
  const effectiveConfig = loadConfig();
317
- const scopeArg = resolveScopeAfterRetiredAutoAccept(getStringArg(args, "scope"));
318
- rejectRetiredCanaryScope(scopeArg);
324
+ const scopeArg = getStringArg(args, "scope");
319
325
  const scopeRef = scopeArg && isFullRefInput(scopeArg) ? parseRefInput(scopeArg) : undefined;
320
326
  const writeTarget = dryRun
321
327
  ? undefined
@@ -1,17 +1,12 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import catchup from "../../assets/improve-strategies/catchup.json" with { type: "json" };
5
4
  import consolidate from "../../assets/improve-strategies/consolidate.json" with { type: "json" };
6
5
  import defaultStrategy from "../../assets/improve-strategies/default.json" with { type: "json" };
7
- import proactiveMaintenance from "../../assets/improve-strategies/proactive-maintenance.json" with { type: "json" };
8
- import quick from "../../assets/improve-strategies/quick.json" with { type: "json" };
9
- import reflectDistill from "../../assets/improve-strategies/reflect-distill.json" with { type: "json" };
10
- import thorough from "../../assets/improve-strategies/thorough.json" with { type: "json" };
11
6
  import { conceptIdFromTypeName, parseRefInput } from "../../core/asset/resolve-ref.js";
12
7
  import { ImproveProfileConfigSchema } from "../../core/config/config-schema.js";
13
8
  import { deepMergeConfig } from "../../core/config/deep-merge.js";
14
- import { BUILTIN_IMPROVE_STRATEGY_NAMES, IMPROVE_ENGINE_PROCESSES, IMPROVE_PROCESS_NAMES, } from "../../core/config/engine-semantics.js";
9
+ import { BUILTIN_IMPROVE_STRATEGY_NAMES, IMPROVE_ENGINE_PROCESSES, IMPROVE_PROCESS_NAMES, REMOVED_IMPROVE_STRATEGY_NAMES, } from "../../core/config/engine-semantics.js";
15
10
  import { ConfigError } from "../../core/errors.js";
16
11
  import { describeLlmCredentialAvailability, } from "../../integrations/agent/engine-resolution.js";
17
12
  import { runnerLlmConnection } from "../../integrations/agent/runner.js";
@@ -69,12 +64,7 @@ export function isStrategyFilteredForAllPasses(ref, strategy) {
69
64
  }
70
65
  const BUILTIN_STRATEGIES = {
71
66
  default: defaultStrategy,
72
- quick,
73
- thorough,
74
67
  consolidate,
75
- catchup,
76
- "reflect-distill": reflectDistill,
77
- "proactive-maintenance": proactiveMaintenance,
78
68
  };
79
69
  if (BUILTIN_IMPROVE_STRATEGY_NAMES.some((name) => !(name in BUILTIN_STRATEGIES))) {
80
70
  throw new Error("Built-in improve strategy names are out of sync with their assets");
@@ -105,6 +95,11 @@ export function resolveImproveStrategy(name, config) {
105
95
  // shape this refusal exists to reject, not a way around it.
106
96
  "Choose a different strategy. `graph-refresh` cannot be redefined under `improve.strategies` — it always refuses.");
107
97
  }
98
+ if (!(selectedName in BUILTIN_STRATEGIES) &&
99
+ !userStrategies[selectedName] &&
100
+ REMOVED_IMPROVE_STRATEGY_NAMES.includes(selectedName)) {
101
+ throw new ConfigError(`Improve strategy "${selectedName}" was removed in 0.10. Use "default" (or "consolidate"), or define "${selectedName}" under improve.strategies to keep your own version.`, "UNKNOWN_IMPROVE_STRATEGY", `Run \`akm improve --strategy default\`, or add \`improve.strategies.${selectedName}\` to your config; a block of that name is a user-defined strategy that inherits \`default\`.`);
102
+ }
108
103
  if (!(selectedName in BUILTIN_STRATEGIES) && !userStrategies[selectedName]) {
109
104
  const valid = [...new Set([...Object.keys(BUILTIN_STRATEGIES), ...Object.keys(userStrategies)])].sort();
110
105
  throw new ConfigError(`Improve strategy "${selectedName}" not found. Valid strategies: ${valid.join(", ")}.`, "UNKNOWN_IMPROVE_STRATEGY");
@@ -304,7 +299,8 @@ function buildImprovePlan(strategy, config, options) {
304
299
  });
305
300
  }
306
301
  if (engineUnavailable.length > 0 &&
307
- !Object.values(processes).some((process) => process.enabled) &&
302
+ // proactiveMaintenance uses no engine: it is a selector, so it alone does not keep a run alive.
303
+ !IMPROVE_ENGINE_PROCESSES.some((name) => processes[name].enabled) &&
308
304
  (!options.allowAllDisabled || anyEngineNotConfigured)) {
309
305
  const names = engineUnavailable.map((item) => `"${item.process}"`).join(", ");
310
306
  throw new ConfigError(`No improve process can run: ${names} ${engineUnavailable.length === 1 ? "requires" : "require"} an engine that is not configured. Set defaults.llmEngine, or the per-process engine key named for each.`, "LLM_NOT_CONFIGURED");
@@ -148,7 +148,6 @@ async function runLoopReflectPass(planned, env, tally) {
148
148
  ...(options.sourceName && primaryStashDir ? { target: { source: options.sourceName, root: primaryStashDir } } : {}),
149
149
  ...(reflectErrors.length > 0 ? { avoidPatterns: [...reflectErrors] } : {}),
150
150
  eventSource: "improve",
151
- lowValueFilter: improveProfile.processes?.reflect?.lowValueFilter?.enabled === true,
152
151
  ...(improveProfile.processes?.reflect?.defectFilter
153
152
  ? { defectFilter: improveProfile.processes.reflect.defectFilter }
154
153
  : {}),
@@ -99,7 +99,6 @@ export function buildImproveExecutionPlan(input) {
99
99
  effective: { ...input.consolidation.effective },
100
100
  gates: {
101
101
  profile: { ...input.consolidation.gates.profile },
102
- minimumPool: { ...input.consolidation.gates.minimumPool },
103
102
  delta: { ...input.consolidation.gates.delta },
104
103
  },
105
104
  },