akm-cli 0.10.261012-beta → 0.10.261014-beta

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 (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -34,16 +34,32 @@ function node(key, value, path, sources, depth) {
34
34
  return html`<li class="leaf"><span class="mono key">${key}</span><span class="leaf-value">${leafValue(value)}</span>${sourceBadge(source)}</li>`;
35
35
  }
36
36
 
37
- function enginesTable(engines) {
38
- if (engines.length === 0) return emptyState("No engines are configured.");
39
- const rest = (e) => {
40
- const { name, kind, endpoint, model, ...others } = e;
41
- return Object.keys(others).length > 0 ? JSON.stringify(others) : "";
42
- };
37
+ /** What a table shows of an entry beyond its named columns, as compact JSON. */
38
+ function otherFields(entry, shown) {
39
+ const rest = Object.fromEntries(Object.entries(entry).filter(([key]) => !shown.includes(key)));
40
+ return Object.keys(rest).length > 0 ? JSON.stringify(rest) : "";
41
+ }
42
+
43
+ function connectionsTable(connections) {
44
+ if (connections.length === 0) return emptyState("No connections are configured.");
45
+ const aliases = (c) =>
46
+ Object.entries(c.models ?? {})
47
+ .map(([alias, entry]) => `${alias}: ${typeof entry === "string" ? entry : entry.model}`)
48
+ .join(", ");
49
+ return tableWrap(
50
+ html`<table><thead><tr><th>Name</th><th>Endpoint</th><th>Models</th><th>Other</th></tr></thead><tbody>${connections.map(
51
+ (c) =>
52
+ html`<tr><td class="mono">${c.name}</td><td class="mono wrap">${c.endpoint ?? ""}</td><td class="mono wrap">${aliases(c)}</td><td class="mono small wrap">${otherFields(c, ["name", "endpoint", "models"])}</td></tr>`,
53
+ )}</tbody></table>`,
54
+ );
55
+ }
56
+
57
+ function harnessesTable(harnesses) {
58
+ if (harnesses.length === 0) return emptyState("No harnesses are configured.");
43
59
  return tableWrap(
44
- html`<table><thead><tr><th>Name</th><th>Kind</th><th>Endpoint</th><th>Model</th><th>Other</th></tr></thead><tbody>${engines.map(
45
- (e) =>
46
- html`<tr><td class="mono">${e.name}</td><td>${e.kind}</td><td class="mono wrap">${e.endpoint ?? ""}</td><td class="mono">${e.model ?? ""}</td><td class="mono small wrap">${rest(e)}</td></tr>`,
60
+ html`<table><thead><tr><th>Name</th><th>Platform</th><th>Other</th></tr></thead><tbody>${harnesses.map(
61
+ (h) =>
62
+ html`<tr><td class="mono">${h.name}</td><td class="mono">${h.platform ?? h.name}</td><td class="mono small wrap">${otherFields(h, ["name", "platform"])}</td></tr>`,
47
63
  )}</tbody></table>`,
48
64
  );
49
65
  }
@@ -58,7 +74,8 @@ export async function render() {
58
74
  ])}${data.exists ? "" : html`<p class="muted">There is no config file, so everything below is a default.</p>`}</section>
59
75
  <section><h2>Effective config</h2><p class="legend-line">Source: ${sourceBadge("default")} built-in ${sourceBadge("file")} this install's config.json ${sourceBadge("extends:ref")} a config it extends</p>
60
76
  ${keys.length === 0 ? emptyState("The effective config is empty.") : html`<ul class="tree root">${keys.map((k) => node(k, data.config[k], k, sources, 0))}</ul>`}</section>
61
- <section><h2>Engines</h2>${enginesTable(data.engines)}</section>
77
+ <section><h2>Connections</h2>${connectionsTable(data.connections)}</section>
78
+ <section><h2>Harnesses</h2>${harnessesTable(data.harnesses)}</section>
62
79
  <section><h2>Environment</h2><p class="muted">AKM_* variables set for the server. They override paths and credentials.</p>${
63
80
  data.env.length === 0
64
81
  ? emptyState("No AKM_* environment variables are set.")
@@ -37,8 +37,8 @@ first step's attached artifact."
37
37
 
38
38
  A `### gate` sub-heading is the step's completion rubric: the judge
39
39
  receives this whole section byte-exact. Omit the heading or leave its text
40
- empty to skip validation. A non-empty rubric requires
41
- `workflow.judgeEngine`; verifier failures and malformed verdicts reject the
40
+ empty to skip validation. A non-empty rubric needs a connection or a harness
41
+ to judge it; verifier failures and malformed verdicts reject the
42
42
  gate rather than silently skipping it.
43
43
 
44
44
  - Confirm the step accomplished what it set out to do.
package/dist/cli/clack.js CHANGED
@@ -1,7 +1,7 @@
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 { cancel as realCancel, confirm as realConfirm, intro as realIntro, isCancel as realIsCancel, log as realLog, multiselect as realMultiselect, note as realNote, outro as realOutro, select as realSelect, spinner as realSpinner, text as realText, } from "@clack/prompts";
4
+ import { cancel as realCancel, confirm as realConfirm, intro as realIntro, isCancel as realIsCancel, log as realLog, multiselect as realMultiselect, note as realNote, outro as realOutro, password as realPassword, select as realSelect, spinner as realSpinner, text as realText, } from "@clack/prompts";
5
5
  // ── Test seam ────────────────────────────────────────────────────────────────
6
6
  // Swap-and-restore override. Inert in production; only tests call the setter
7
7
  // (via tests/_helpers/seams.ts `overrideSeam`, never directly).
@@ -18,6 +18,7 @@ const realFns = {
18
18
  select: realSelect,
19
19
  multiselect: realMultiselect,
20
20
  text: realText,
21
+ password: realPassword,
21
22
  spinner: realSpinner,
22
23
  note: realNote,
23
24
  isCancel: realIsCancel,
@@ -42,6 +43,7 @@ export const confirm = bind("confirm");
42
43
  export const select = bind("select");
43
44
  export const multiselect = bind("multiselect");
44
45
  export const text = bind("text");
46
+ export const password = bind("password");
45
47
  export const spinner = bind("spinner");
46
48
  export const note = bind("note");
47
49
  export const isCancel = bind("isCancel");
@@ -0,0 +1,33 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { UsageError } from "../core/errors.js";
5
+ import { warnOnce } from "../core/warn.js";
6
+ import { getStringArg } from "./parse-args.js";
7
+ export const SELECTION_ARGS = {
8
+ connection: { type: "string", description: "Run on this connection, by name (default: the default connection)" },
9
+ harness: { type: "string", description: "Run on this harness, by name or platform (default: the default harness)" },
10
+ model: { type: "string", description: "Model to run, by alias (fast, balanced, reasoning) or exact name" },
11
+ };
12
+ /** The retired `--engine`: parsed, left out of `--help` (`withoutHiddenArgs`). Spread it where the flag existed. */
13
+ export const RETIRED_ENGINE_ARG = {
14
+ engine: { type: "string", hidden: true, description: "Retired: use --connection or --harness." },
15
+ };
16
+ export function selectionFromArgs(args) {
17
+ const connection = getStringArg(args, "connection");
18
+ const harness = getStringArg(args, "harness");
19
+ if (connection !== undefined && harness !== undefined) {
20
+ throw new UsageError("--connection and --harness are mutually exclusive. Pick one.", "INVALID_FLAG_VALUE");
21
+ }
22
+ const engine = getStringArg(args, "engine");
23
+ if (engine !== undefined) {
24
+ warnOnce("retired-flag:--engine", "--engine is retired: use --connection or --harness. For now it names a connection by that name, else a harness.");
25
+ }
26
+ const model = getStringArg(args, "model");
27
+ return {
28
+ ...(connection !== undefined ? { connection } : {}),
29
+ ...(harness !== undefined ? { harness } : {}),
30
+ ...(engine !== undefined ? { engine } : {}),
31
+ ...(model !== undefined ? { model } : {}),
32
+ };
33
+ }
@@ -92,7 +92,7 @@ function extractHint(error) {
92
92
  * R-067: this used to call `process.exit(exitCode)` directly, which
93
93
  * terminates the process synchronously and skips every pending `finally`
94
94
  * block up the call stack — including `src/cli.ts`'s own
95
- * `disposeDispatchResources()` cleanup and citty's per-command `cleanup`
95
+ * `disposeLlmUsageSink()` cleanup and citty's per-command `cleanup`
96
96
  * hooks. `process.exitCode = exitCode; return;` is equivalent for every
97
97
  * caller here: Node/Bun exits with that code once the event loop drains
98
98
  * naturally, but cleanup on the way there still runs.
@@ -183,6 +183,19 @@ export const GLOBAL_OUTPUT_ARGS = {
183
183
  default: false,
184
184
  },
185
185
  };
186
+ /**
187
+ * A command with the args marked `hidden` left out: what `--help` renders. A
188
+ * hidden arg parses like any other and is simply not advertised, the way
189
+ * `meta.hidden` keeps a command out of the COMMANDS list. It is for a retired
190
+ * spelling that still works, so a scheduled command written for an earlier
191
+ * release keeps running.
192
+ */
193
+ export function withoutHiddenArgs(command) {
194
+ const args = command.args;
195
+ if (!args)
196
+ return command;
197
+ return { ...command, args: Object.fromEntries(Object.entries(args).filter(([, def]) => def.hidden !== true)) };
198
+ }
186
199
  /**
187
200
  * Define a citty command whose `run` body is automatically wrapped in
188
201
  * `runWithJsonErrors`, so the handler emits a byte-identical JSON error
@@ -25,6 +25,7 @@
25
25
  * by a `meta.name` alias rather than its key takes the stand-down path (no
26
26
  * validation) — conservative by design.
27
27
  */
28
+ import { closestMatch } from "../core/closest-match.js";
28
29
  import { UsageError } from "../core/errors.js";
29
30
  import { warn } from "../core/warn.js";
30
31
  import { cittyComparableName, findCittyTopLevelCommandIndex, toAliasArray, } from "./invocation.js";
@@ -61,7 +62,8 @@ function collectKnownArgs(root, rawArgs) {
61
62
  // Shared args (GLOBAL_OUTPUT_ARGS) recur at every level; suggest each once.
62
63
  if (!names.has(comparable)) {
63
64
  names.add(comparable);
64
- displayNames.push(`--${key}`);
65
+ if (def.hidden !== true)
66
+ displayNames.push(`--${key}`);
65
67
  }
66
68
  if (def.type === "string" || def.type === "enum")
67
69
  valueFlags.add(comparable);
@@ -100,37 +102,6 @@ function collectKnownArgs(root, rawArgs) {
100
102
  }
101
103
  return { names, valueFlags, booleanFlags, displayNames, path, resolved: true };
102
104
  }
103
- /** Single-row-at-a-time edit-distance DP (inputs are short flag/command names). */
104
- function editDistance(a, b) {
105
- let previous = Array.from({ length: b.length + 1 }, (_, j) => j);
106
- for (let i = 1; i <= a.length; i += 1) {
107
- const current = [i];
108
- for (let j = 1; j <= b.length; j += 1) {
109
- const cost = a[i - 1] === b[j - 1] ? 0 : 1;
110
- current.push(Math.min((previous[j] ?? 0) + 1, (current[j - 1] ?? 0) + 1, (previous[j - 1] ?? 0) + cost));
111
- }
112
- previous = current;
113
- }
114
- return previous[b.length] ?? 0;
115
- }
116
- /**
117
- * Closest candidate within `threshold` edit distance, or undefined when
118
- * nothing is close enough to be worth suggesting. Shared by the unknown-flag
119
- * and unknown-command (src/cli.ts) did-you-mean paths, which pick different
120
- * thresholds.
121
- */
122
- export function closestMatch(attempted, candidates, threshold) {
123
- let best;
124
- let bestDistance = Number.POSITIVE_INFINITY;
125
- for (const candidate of candidates) {
126
- const distance = editDistance(attempted, candidate);
127
- if (distance < bestDistance) {
128
- bestDistance = distance;
129
- best = candidate;
130
- }
131
- }
132
- return best !== undefined && bestDistance <= threshold ? best : undefined;
133
- }
134
105
  /**
135
106
  * The one unknown-flag rejection, shared by the short- and long-flag scans so
136
107
  * the user-facing error contract cannot drift between them. No explicit hint
@@ -164,13 +135,11 @@ export function assertKnownFlags(root, rawArgs) {
164
135
  // `workflow run`, `task run`, and `task explain` each own one deliberately
165
136
  // dynamic namespace: long options become exact-name parameter/input flags
166
137
  // and are checked against the frozen plan / task source's own contract
167
- // before this gate would otherwise reject them (spec
168
- // docs/plans/specs/p2a-task-source-v4.md §5.1 — task run's
138
+ // before this gate would otherwise reject them (task run's
169
139
  // UNKNOWN_FLAG/INPUT_BINDING_INVALID must be raised from INSIDE the command
170
140
  // body, where runWithJsonErrors renders the JSON envelope, not from this
171
- // generic pre-dispatch gate; docs/plans/specs/p2b-input-bindings.md §4.5,
172
- // B-55 — `task explain` reuses the identical `parseTaskInputFlags`
173
- // scanner, so it needs the identical exemption).
141
+ // generic pre-dispatch gate; `task explain` reuses the identical
142
+ // `parseTaskInputFlags` scanner, so it needs the identical exemption).
174
143
  const dynamicNamedFlagCommands = new Set(["workflow run", "task run", "task explain"]);
175
144
  const dynamicWorkflowParams = dynamicNamedFlagCommands.has(known.path.join(" "));
176
145
  const tolerant = UNKNOWN_FLAG_TOLERANT_COMMANDS.has(known.path.join(" "));
package/dist/cli.js CHANGED
@@ -58,8 +58,8 @@ process.on("uncaughtException", (err) => {
58
58
  import fs from "node:fs";
59
59
  import { defineCommand, parseArgs, renderUsage, runCommand, showUsage } from "citty";
60
60
  import { findCittyTopLevelCommandIndex, getParsedInvocation, parseAllFlagValues, resolveHelpMigrateVersionArg, setParsedInvocation, } from "./cli/invocation.js";
61
- import { defineGroupCommand, EXIT_CODES, emitJsonError, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors, } from "./cli/shared.js";
62
- import { assertKnownFlags, closestMatch } from "./cli/unknown-flags.js";
61
+ import { defineGroupCommand, EXIT_CODES, emitJsonError, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors, withoutHiddenArgs, } from "./cli/shared.js";
62
+ import { assertKnownFlags } from "./cli/unknown-flags.js";
63
63
  import { agentCommand, lintCommand } from "./commands/agent/contribute-cli.js";
64
64
  import { commandCommand } from "./commands/command/command-cli.js";
65
65
  import { generateBashCompletions, installBashCompletions } from "./commands/completions.js";
@@ -68,6 +68,7 @@ import { envCommand } from "./commands/env/env-cli.js";
68
68
  import { secretCommand } from "./commands/env/secret-cli.js";
69
69
  import { feedbackCommand } from "./commands/feedback-cli.js";
70
70
  import { akmHealth } from "./commands/health.js";
71
+ import { closestMatch } from "./core/closest-match.js";
71
72
  import "./commands/health/renderers.js";
72
73
  import "./commands/metrics/md-report.js";
73
74
  import { parseWindowSpec } from "./commands/health/windows.js";
@@ -95,7 +96,6 @@ import { getConfigPath } from "./core/paths.js";
95
96
  import { DURATION_UNITS, parseDuration } from "./core/time.js";
96
97
  import { plainize } from "./core/tty.js";
97
98
  import { info, isQuiet, setQuiet, setVerbose, warn } from "./core/warn.js";
98
- import { disposeDispatchResources } from "./integrations/agent/runner-dispatch.js";
99
99
  import { installLlmUsagePersistenceIfAbsent } from "./llm/usage-persist.js";
100
100
  import { EMBEDDED_HINTS, EMBEDDED_HINTS_FULL } from "./output/cli-hints.js";
101
101
  import { getOutputMode, initOutputMode, parseDetailLevel } from "./output/context.js";
@@ -120,8 +120,8 @@ function applyEarlyStderrFlags(argv) {
120
120
  * Default --format is `json`, so a CI or piped consumer sees only the JSON on
121
121
  * stdout. But an interactive user running `akm setup --yes` would otherwise
122
122
  * see only the JSON blob with no obvious next step. When stderr is a TTY and
123
- * the JSON went to stdout, print a two-line summary to stderr telling the
124
- * user (a) where the stash landed and (b) what to run next.
123
+ * the JSON went to stdout, print a short summary to stderr telling the user
124
+ * (a) where the stash landed, (b) what runs where, and (c) what to run next.
125
125
  *
126
126
  * Silent when: stderr is not a TTY (CI, pipes), --format=text/yaml (the user
127
127
  * already gets readable output), --quiet, or the result is missing fields.
@@ -136,7 +136,10 @@ function printSetupTtyHint(result) {
136
136
  return;
137
137
  if (!result?.bundleDir)
138
138
  return;
139
- console.error(plainize(`\n✓ Bundle created at ${result.bundleDir}\n` +
139
+ const runs = result.runs
140
+ ? ` Model calls: ${result.runs.modelCalls}\n Agent work: ${result.runs.agentWork}\n Embeddings: ${result.runs.embeddings}\n`
141
+ : "";
142
+ console.error(plainize(`\n✓ Bundle created at ${result.bundleDir}\n${runs}` +
140
143
  ' Next: `akm bundle add <source>`, `akm index`, `akm search "<query>"`, `akm hints`'));
141
144
  }
142
145
  /**
@@ -149,7 +152,7 @@ function printSetupTtyHint(result) {
149
152
  const setupCommand = defineCommand({
150
153
  meta: {
151
154
  name: "setup",
152
- description: "Interactive configuration wizard. Configures embeddings/LLM connections (for indexing/enrichment), agent profiles (CLI agent, embedded SDK, or none), sources, and registries. Shows which features are enabled at the end. Use --config <json> or --yes for non-interactive/scripting mode.",
155
+ description: "Interactive configuration wizard. Enables agent programs (Claude Code, Codex, OpenCode, ...), sets up a model connection and embeddings, and picks bundle sources and registries. Flags answer individual questions; --yes takes the detected default for the rest, for scripting.",
153
156
  },
154
157
  args: {
155
158
  // R-051/S11: `setup` is a raw `defineCommand` (not `defineJsonCommand`),
@@ -157,9 +160,33 @@ const setupCommand = defineCommand({
157
160
  // already had. Three of its four run branches call `output()`; spreading
158
161
  // this in is a `--help` visibility fix, not a behavior change.
159
162
  ...GLOBAL_OUTPUT_ARGS,
160
- config: {
163
+ endpoint: {
161
164
  type: "string",
162
- description: 'Config JSON to apply non-interactively, e.g. \'{"engines":{"local":{"kind":"llm","endpoint":"...","model":"..."}},"defaults":{"llmEngine":"local"}}\'',
165
+ description: "OpenAI-compatible endpoint to add or update as a connection (the first is named default), e.g. http://localhost:11434/v1",
166
+ },
167
+ "api-key-env": {
168
+ type: "string",
169
+ description: "Name of the environment variable holding the connection's API key; the connection gets apiKey: $NAME. Keys are never passed on the command line.",
170
+ },
171
+ name: {
172
+ type: "string",
173
+ description: "Name for a further connection (with --endpoint); the first connection is named default",
174
+ },
175
+ harness: {
176
+ type: "string",
177
+ description: "Agent programs to enable, comma-separated (claude,codex,opencode,...); the first is the default",
178
+ },
179
+ embedding: {
180
+ type: "string",
181
+ description: "Embeddings: a model the connection serves, local (the built-in embedder), or off",
182
+ },
183
+ "embedding-endpoint": {
184
+ type: "string",
185
+ description: "Another endpoint that serves the --embedding model",
186
+ },
187
+ "embedding-api-key-env": {
188
+ type: "string",
189
+ description: "Name of the environment variable holding the embedding endpoint's API key",
163
190
  },
164
191
  from: {
165
192
  type: "string",
@@ -168,11 +195,11 @@ const setupCommand = defineCommand({
168
195
  yes: {
169
196
  type: "boolean",
170
197
  default: false,
171
- description: "Accept all defaults, skip all prompts. Idempotent — safe to run in CI.",
198
+ description: "Take the detected default for every question no flag answers; no prompts. Idempotent — safe to run in CI.",
172
199
  },
173
200
  dir: {
174
201
  type: "string",
175
- description: "Bundle directory path (overrides defaultBundle in config or --config JSON)",
202
+ description: "Bundle directory path (overrides defaultBundle in config)",
176
203
  },
177
204
  // Declared as the POSITIVE name with `default: true` so citty's native
178
205
  // `--no-<name>` negation (it strips a leading `--no-` from ANY token and
@@ -186,19 +213,32 @@ const setupCommand = defineCommand({
186
213
  default: true,
187
214
  description: "Scaffold the bundle directory. Use --no-init to write configuration without scaffolding it.",
188
215
  },
189
- probe: {
216
+ // There is no `--probe`: probing is the default, so only the opt-out is declared. citty parses `--no-probe`
217
+ // as the negation of `probe` whether or not `probe` is declared, so the value is `args.probe === false`;
218
+ // declaring `no-probe` is what puts the flag in `--help` and keeps the unknown-flag check from refusing it.
219
+ "no-probe": {
190
220
  type: "boolean",
191
- default: false,
192
- description: "Probe LLM/embedding endpoints before writing config to verify connectivity",
221
+ description: "Offline run: the endpoint is not contacted and its models are not listed. A connection added this way has no model until one is named with `akm models set`; the picks it already has are kept.",
193
222
  },
194
223
  },
195
224
  async run({ args }) {
196
225
  await runWithJsonErrors(async () => {
197
226
  const noInit = !args.init;
198
- if (args.from && args.config) {
199
- throw new UsageError("Pass either --from <file> or --config <json>, not both.", "INVALID_FLAG_VALUE");
200
- }
227
+ const noProbe = args.probe === false;
228
+ const { hasSetupFlags, parseSetupFlags } = await import("./setup/setup-flags.js");
229
+ const flags = parseSetupFlags({
230
+ endpoint: args.endpoint,
231
+ apiKeyEnv: args["api-key-env"],
232
+ name: args.name,
233
+ harness: args.harness,
234
+ embedding: args.embedding,
235
+ embeddingEndpoint: args["embedding-endpoint"],
236
+ embeddingApiKeyEnv: args["embedding-api-key-env"],
237
+ });
201
238
  if (args.from) {
239
+ if (hasSetupFlags(flags) && !args.yes) {
240
+ throw new UsageError("--from takes --endpoint, --harness and the other answer flags only with --yes.", "INVALID_FLAG_VALUE");
241
+ }
202
242
  // File-based bootstrap. `loadSetupConfigFromFile` expands a leading
203
243
  // `~`, resolves relative paths against cwd, picks the YAML or JSON
204
244
  // parser based on the file extension, and surfaces any
@@ -211,21 +251,8 @@ const setupCommand = defineCommand({
211
251
  configJson: loaded.configJson,
212
252
  dir: args.dir,
213
253
  noInit,
214
- probe: args.probe,
215
- applyDefaults: args.yes,
216
- });
217
- output("setup", result);
218
- printSetupTtyHint(result);
219
- }
220
- else if (args.config) {
221
- // Non-interactive config mode. With `--yes`, defaults fill any keys
222
- // the JSON blob leaves missing after the deep merge.
223
- const { runSetupFromConfig } = await import("./setup/setup.js");
224
- const result = await runSetupFromConfig({
225
- configJson: args.config,
226
- dir: args.dir,
227
- noInit,
228
- probe: args.probe,
254
+ noProbe,
255
+ flags,
229
256
  applyDefaults: args.yes,
230
257
  });
231
258
  output("setup", result);
@@ -234,11 +261,7 @@ const setupCommand = defineCommand({
234
261
  else if (args.yes) {
235
262
  // Defaults mode — no prompts
236
263
  const { runSetupWithDefaults } = await import("./setup/setup.js");
237
- const result = await runSetupWithDefaults({
238
- dir: args.dir,
239
- noInit,
240
- probe: args.probe,
241
- });
264
+ const result = await runSetupWithDefaults({ dir: args.dir, noInit, noProbe, flags });
242
265
  output("setup", result);
243
266
  printSetupTtyHint(result);
244
267
  }
@@ -248,10 +271,10 @@ const setupCommand = defineCommand({
248
271
  // first prompt and then block forever instead of failing — and `akm
249
272
  // setup` is the first command users automate.
250
273
  if (process.stdin.isTTY !== true) {
251
- throw new UsageError("Interactive setup requires a TTY. Pass --yes to accept defaults, or --config <json> / --from <file> to configure non-interactively.", "NON_INTERACTIVE_REQUIRES_YES");
274
+ throw new UsageError("Interactive setup requires a TTY. Pass --yes to take the detected defaults (flags such as --endpoint answer questions), or --from <file> to configure from a file.", "NON_INTERACTIVE_REQUIRES_YES");
252
275
  }
253
276
  const { runSetupWizard } = await import("./setup/setup.js");
254
- await runSetupWizard({ dir: args.dir, noInit });
277
+ await runSetupWizard({ dir: args.dir, noInit, noProbe, flags });
255
278
  }
256
279
  });
257
280
  },
@@ -298,8 +321,8 @@ const healthCommand = defineCommand({
298
321
  probe: {
299
322
  type: "boolean",
300
323
  default: true,
301
- description: "Probe default-llm-engine / configured-engines reachability, check for a newer akm release, and check the scheduler's recorded akm binary version (on by default).",
302
- negativeDescription: "Skip the reachability probes, the update check, and the scheduler-binary version check (for an offline or air-gapped host).",
324
+ description: "Probe configured connections for reachability and run each harness's `--version`, check for a newer akm release, look up the newest Claude plugin tag, and check the scheduler's recorded akm binary version (on by default).",
325
+ negativeDescription: "Skip the reachability probes, the harness `--version` runs, the update check, the Claude plugin tag lookup, and the scheduler-binary version check (for an offline or air-gapped host).",
303
326
  },
304
327
  },
305
328
  async run({ args }) {
@@ -464,6 +487,7 @@ const commands = {
464
487
  registry: registryCommand,
465
488
  migrate: migrateCommand,
466
489
  config: configCommand,
490
+ models: modelsCommand,
467
491
  feedback: feedbackCommand,
468
492
  log: logCommand,
469
493
  agent: agentCommand,
@@ -475,14 +499,13 @@ const commands = {
475
499
  env: envCommand,
476
500
  secret: secretCommand,
477
501
  task: taskCommand,
478
- models: modelsCommand,
479
502
  hints: hintsCommand,
480
503
  };
481
504
  function commandHelpTopic(name, command) {
482
505
  return defineCommand({
483
506
  meta: { name, description: `Print help for akm ${name}` },
484
507
  async run() {
485
- await showUsage(command, buildUsageParentForPath([name]));
508
+ await showUsage(withoutHiddenArgs(command), buildUsageParentForPath([name]));
486
509
  },
487
510
  });
488
511
  }
@@ -571,8 +594,7 @@ export const main = defineCommand({
571
594
  });
572
595
  const MAIN_TOP_LEVEL_ARGS = main.args;
573
596
  /**
574
- * F-5 (spec docs/plans/specs/p2a-task-source-v4.md §6): exported so
575
- * `akm task run`'s input-flags coverage can pin that an undeclared,
597
+ * Exported so `akm task run`'s input-flags coverage can pin that an undeclared,
576
598
  * per-task dynamic flag (e.g. `--scope all`) does not change this
577
599
  * classification — it parses only `args.id` off the declared args and
578
600
  * tolerates extra tokens (citty's non-strict `parseArgs`).
@@ -1066,7 +1088,7 @@ export async function runCli() {
1066
1088
  }
1067
1089
  else {
1068
1090
  const path = resolveCittyCommandPath(main, rawArgs);
1069
- await showUsage(resolved, buildUsageParentForPath(path));
1091
+ await showUsage(withoutHiddenArgs(resolved), buildUsageParentForPath(path));
1070
1092
  }
1071
1093
  return;
1072
1094
  }
@@ -1099,14 +1121,13 @@ export async function runCli() {
1099
1121
  // could ever reach this boundary. Route it the same way rather than
1100
1122
  // hard-coding GENERAL(1): the CLI contract reserves 1 for general/not-found
1101
1123
  // and requires a non-`AkmError` throw to render the JSON failure envelope
1102
- // with INTERNAL(70) (AGENTS.md "CLI Contract"), which is what lets
1124
+ // with INTERNAL(70), which is what lets
1103
1125
  // automation tell an internal defect apart from an ordinary failure.
1104
1126
  // `emitJsonError` classifies and sets `process.exitCode` itself.
1105
1127
  emitJsonError(error);
1106
1128
  }
1107
1129
  finally {
1108
1130
  disposeLlmUsageSink();
1109
- await disposeDispatchResources();
1110
1131
  }
1111
1132
  }
1112
1133
  // Only run the CLI when this module is the direct entry point. When it is
@@ -4,23 +4,24 @@
4
4
  import { UsageError } from "../../core/errors.js";
5
5
  import { warn } from "../../core/warn.js";
6
6
  import { isPortableExecutionAgentSelector } from "../../execution/source.js";
7
- import { fallbackAnnouncement, NO_ENGINE_MESSAGE_SUFFIX, NO_ENGINE_REMEDY, withEngineFallback, } from "../../integrations/agent/engine-fallback.js";
8
7
  import { executeInteractiveAgentInvocation } from "../../integrations/agent/runner-dispatch.js";
9
8
  import { executeCommandInvocation } from "../command/command-execution.js";
10
9
  function canonicalCurrent(options) {
11
10
  const current = {};
12
11
  if (options.agentRef !== undefined)
13
12
  current.agent = options.agentRef;
14
- if (options.engine !== undefined)
15
- current.engine = options.engine;
13
+ if (options.selection?.connection !== undefined)
14
+ current.connection = options.selection.connection;
15
+ if (options.selection?.harness !== undefined)
16
+ current.harness = options.selection.harness;
17
+ if (options.selection?.engine !== undefined)
18
+ current.engine = options.selection.engine;
16
19
  if (options.selection?.model !== undefined)
17
20
  current.model = options.selection.model;
18
21
  if (Object.hasOwn(options.selection ?? {}, "inference"))
19
22
  current.inference = options.selection?.inference;
20
23
  if (options.selection?.outputSchema !== undefined)
21
24
  current.outputSchema = options.selection.outputSchema;
22
- if (options.selection?.tools !== undefined)
23
- current.tools = options.selection.tools;
24
25
  if (options.timeoutMs !== undefined)
25
26
  current.timeout = options.timeoutMs;
26
27
  if (options.cwd !== undefined)
@@ -53,30 +54,22 @@ async function delegateCanonicalCommand(options, seams, action) {
53
54
  }
54
55
  export async function akmAgentDispatch(options, seams = {}) {
55
56
  if (!options.agentConfig)
56
- throw new UsageError("agent requires a valid config with an agent engine.", "MISSING_REQUIRED_ARGUMENT");
57
+ throw new UsageError("agent requires a valid config with a harness or connection.", "MISSING_REQUIRED_ARGUMENT");
57
58
  rejectInvalidAgentRef(options.agentRef);
58
- const hasResolvedSelection = options.agentRef !== undefined || options.selection !== undefined;
59
- if (options.prompt !== undefined || hasResolvedSelection) {
60
- if (options.prompt === undefined) {
61
- throw new UsageError("Agent persona/model/tool/schema/inference selection requires an explicit task from --prompt or --prompt-stdin; it cannot fabricate an empty command. Omit those selections for a prompt-free interactive launch.", "MISSING_REQUIRED_ARGUMENT");
62
- }
59
+ if (options.prompt !== undefined)
63
60
  return delegateCanonicalCommand(options, seams, { content: options.prompt });
61
+ // No prompt: the harness is started for a person. Only where and which model ride along; the rest needs a task.
62
+ const { connection, harness, engine, model, ...needsTask } = options.selection ?? {};
63
+ if (options.agentRef !== undefined || Object.keys(needsTask).length > 0) {
64
+ throw new UsageError("An agent persona, inference setting or output schema applies to a task: pass --prompt or --prompt-stdin. Without a prompt only the harness (and a model) is started.", "MISSING_REQUIRED_ARGUMENT");
64
65
  }
65
- // Same implicit opencode-sdk fallback the workflow and task surfaces apply,
66
- // so an engine-less install is usable everywhere or nowhere — not a mix.
67
- const { config: agentConfig, fallbackEngineName } = withEngineFallback(options.agentConfig);
68
- const engineName = options.engine ?? agentConfig.defaults?.engine;
69
- // Announced, never silent: `options.engine` outranks the default, so the
70
- // fallback is only reportable when it is the engine actually selected.
71
- const engineAnnouncement = fallbackAnnouncement(fallbackEngineName, engineName);
72
- if (engineAnnouncement)
73
- warn(engineAnnouncement);
74
- if (!engineName)
75
- throw new UsageError(`agent ${NO_ENGINE_MESSAGE_SUFFIX} ${NO_ENGINE_REMEDY}`, "MISSING_REQUIRED_ARGUMENT");
76
66
  const executeInteractive = seams.executeInteractive ?? executeInteractiveAgentInvocation;
77
67
  const execution = await executeInteractive({
78
- config: agentConfig,
79
- engine: engineName,
68
+ config: options.agentConfig,
69
+ ...(typeof connection === "string" ? { connection } : {}),
70
+ ...(typeof harness === "string" ? { harness } : {}),
71
+ ...(typeof engine === "string" ? { engine } : {}),
72
+ ...(typeof model === "string" ? { model } : {}),
80
73
  ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),
81
74
  ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),
82
75
  });
@@ -92,6 +85,5 @@ export async function akmAgentDispatch(options, seams = {}) {
92
85
  durationMs: result.durationMs,
93
86
  ...(result.error !== undefined ? { error: result.error } : {}),
94
87
  ...(result.reason !== undefined ? { reason: result.reason } : {}),
95
- ...(engineAnnouncement ? { warnings: [engineAnnouncement] } : {}),
96
88
  };
97
89
  }
@@ -23,6 +23,7 @@
23
23
  import fs from "node:fs";
24
24
  import { defineCommand } from "citty";
25
25
  import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
26
+ import { RETIRED_ENGINE_ARG, SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
26
27
  import { EXIT_CODES, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
27
28
  import { loadConfig } from "../../core/config/config.js";
28
29
  import { UsageError } from "../../core/errors.js";
@@ -36,13 +37,13 @@ export function readPromptStdin(read = () => fs.readFileSync(0, "utf8")) {
36
37
  export const agentCommand = defineCommand({
37
38
  meta: {
38
39
  name: "agent",
39
- description: "Dispatch an agent CLI (opencode, claude, …) with an optional agent persona and model defaults. Use --prompt for work; stored commands run through akm command run. Nonempty tool requests require separate operator authorization and are rejected by the current CLI.",
40
+ description: "Dispatch an agent CLI (opencode, claude, …) with an optional agent persona and model defaults. Use --prompt for work; without one the harness starts interactively. Stored commands run through akm command run.",
40
41
  },
41
42
  args: {
42
43
  ...GLOBAL_OUTPUT_ARGS,
43
44
  "agent-ref": {
44
45
  type: "positional",
45
- description: "Optional agent asset ref (e.g. agents/code-reviewer). Resolves persona and model defaults; the current CLI rejects a nonempty tool request without separate operator authorization.",
46
+ description: "Optional agent asset ref (e.g. agents/code-reviewer). Resolves persona and model defaults.",
46
47
  required: false,
47
48
  },
48
49
  prompt: { type: "string", description: "Task prompt to pass to the agent" },
@@ -51,10 +52,11 @@ export const agentCommand = defineCommand({
51
52
  description: "Read the task prompt from stdin (mutually exclusive with --prompt)",
52
53
  default: false,
53
54
  },
54
- engine: { type: "string", description: "Agent engine to use (default: defaults.engine)" },
55
+ ...SELECTION_ARGS,
56
+ ...RETIRED_ENGINE_ARG,
55
57
  model: {
56
- type: "string",
57
- description: "Model override — accepts aliases (opus, sonnet, haiku) or exact platform model IDs. Overrides the model specified in the agent asset.",
58
+ ...SELECTION_ARGS.model,
59
+ description: `${SELECTION_ARGS.model.description}. Overrides the model specified in the agent asset.`,
58
60
  },
59
61
  "timeout-ms": { type: "string", description: "Override the agent CLI timeout in milliseconds" },
60
62
  cwd: {
@@ -77,14 +79,13 @@ export const agentCommand = defineCommand({
77
79
  const cwd = getStringArg(args, "cwd");
78
80
  // The common invocation resolver loads a selected agent through its
79
81
  // owning bundle adapter. This CLI never re-reads/show-projects the file.
80
- const model = getStringArg(args, "model");
82
+ const selection = selectionFromArgs(args);
81
83
  const stdinPrompt = promptStdin ? readPromptStdin() : undefined;
82
84
  const result = await akmAgentDispatch({
83
- engine: getStringArg(args, "engine"),
84
85
  prompt: stdinPrompt ?? promptText,
85
86
  ...(agentRef === undefined ? {} : { agentRef }),
86
87
  agentConfig,
87
- ...(model === undefined ? {} : { selection: { model } }),
88
+ ...(Object.keys(selection).length === 0 ? {} : { selection }),
88
89
  ...(cwd ? { cwd } : {}),
89
90
  ...(timeoutMs !== undefined && Number.isFinite(timeoutMs) ? { timeoutMs } : {}),
90
91
  });