akm-cli 0.10.261013-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 (477) hide show
  1. package/CHANGELOG.md +494 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +9 -8
  4. package/STABILITY.md +45 -49
  5. package/dist/assets/hints/cli-hints-full.md +15 -12
  6. package/dist/assets/opencode/akm-plugin.js +177 -0
  7. package/dist/assets/stash-skeleton/README.md +1 -1
  8. package/dist/assets/tasks/core/improve.yml +1 -1
  9. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  10. package/dist/assets/ui/config.js +27 -10
  11. package/dist/assets/workflows/workflow-template.md +2 -2
  12. package/dist/cli/clack.js +3 -1
  13. package/dist/cli/selection.js +33 -0
  14. package/dist/cli/shared.js +14 -1
  15. package/dist/cli/unknown-flags.js +6 -37
  16. package/dist/cli.js +69 -48
  17. package/dist/commands/agent/agent-dispatch.js +17 -25
  18. package/dist/commands/agent/contribute-cli.js +9 -8
  19. package/dist/commands/command/command-cli.js +4 -8
  20. package/dist/commands/command/command-execution.js +25 -39
  21. package/dist/commands/completions.js +1 -1
  22. package/dist/commands/config-cli.js +14 -5
  23. package/dist/commands/env/child-env.js +12 -14
  24. package/dist/commands/env/env-cli.js +2 -2
  25. package/dist/commands/env/secret-cli.js +2 -2
  26. package/dist/commands/health/checks.js +10 -849
  27. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  28. package/dist/commands/health/egress.js +3 -3
  29. package/dist/commands/health/html-report.js +9 -10
  30. package/dist/commands/health/plugin-staleness.js +18 -11
  31. package/dist/commands/health/report-view-model.js +16 -12
  32. package/dist/commands/health/semantic-search-check.js +85 -0
  33. package/dist/commands/health/type-directory-check.js +0 -3
  34. package/dist/commands/health.js +30 -42
  35. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  36. package/dist/commands/improve/consolidate.js +10 -15
  37. package/dist/commands/improve/distill.js +5 -15
  38. package/dist/commands/improve/eligibility.js +1 -1
  39. package/dist/commands/improve/execution.js +37 -40
  40. package/dist/commands/improve/extract-cli.js +6 -11
  41. package/dist/commands/improve/extract-prompt.js +2 -2
  42. package/dist/commands/improve/extract.js +67 -97
  43. package/dist/commands/improve/improve-cli.js +22 -128
  44. package/dist/commands/improve/improve-report.js +1 -1
  45. package/dist/commands/improve/improve-strategies.js +25 -108
  46. package/dist/commands/improve/improve.js +10 -14
  47. package/dist/commands/improve/loop-stages.js +3 -0
  48. package/dist/commands/improve/memory/memory-improve.js +1 -1
  49. package/dist/commands/improve/preparation.js +8 -13
  50. package/dist/commands/improve/reflect.js +203 -332
  51. package/dist/commands/improve/retrieval-scope.js +1 -1
  52. package/dist/commands/improve/session-asset.js +3 -2
  53. package/dist/commands/improve/stage.js +87 -115
  54. package/dist/commands/lint/base-linter.js +3 -3
  55. package/dist/commands/lint/index.js +2 -2
  56. package/dist/commands/models-cli.js +103 -63
  57. package/dist/commands/proposal/drain.js +26 -39
  58. package/dist/commands/proposal/proposal-cli.js +14 -18
  59. package/dist/commands/proposal/propose-cli.js +4 -2
  60. package/dist/commands/proposal/propose.js +37 -64
  61. package/dist/commands/proposal/repository.js +17 -17
  62. package/dist/commands/proposal/validators/proposal-validators.js +2 -2
  63. package/dist/commands/read/curate.js +10 -6
  64. package/dist/commands/read/registry-search.js +2 -48
  65. package/dist/commands/read/search-cli.js +1 -8
  66. package/dist/commands/read/search.js +5 -6
  67. package/dist/commands/read/show.js +2 -4
  68. package/dist/commands/remember.js +25 -40
  69. package/dist/commands/sources/bundle-config-ops.js +2 -2
  70. package/dist/commands/sources/info.js +12 -1
  71. package/dist/commands/sources/init.js +1 -1
  72. package/dist/commands/sources/installed-stashes.js +2 -2
  73. package/dist/commands/sources/migration-help.js +1 -1
  74. package/dist/commands/sources/plugin-upgrade.js +8 -15
  75. package/dist/commands/sources/schema-repair.js +4 -8
  76. package/dist/commands/sources/source-add.js +2 -2
  77. package/dist/commands/sources/source-manage.js +4 -4
  78. package/dist/commands/targets.js +175 -0
  79. package/dist/commands/tasks/explain.js +103 -68
  80. package/dist/commands/tasks/tasks-cli.js +9 -11
  81. package/dist/commands/tasks/tasks.js +37 -41
  82. package/dist/commands/ui/api.js +11 -3
  83. package/dist/commands/ui/redact.js +1 -27
  84. package/dist/commands/ui/workspace-actions.js +1 -1
  85. package/dist/commands/workflow/plan.js +1 -1
  86. package/dist/commands/workflow-cli.js +3 -4
  87. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  88. package/dist/core/adapter/adapters/akm-adapter.js +33 -38
  89. package/dist/core/adapter/adapters/akm-lint.js +7 -8
  90. package/dist/core/adapter/adapters/akm-task-adapter.js +3 -3
  91. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  92. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  93. package/dist/core/adapter/adapters/dotenv-adapter.js +3 -3
  94. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  95. package/dist/core/adapter/adapters/index.js +3 -4
  96. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  97. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  98. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  99. package/dist/core/adapter/adapters/shared.js +3 -3
  100. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  101. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  102. package/dist/core/adapter/detect-adapter.js +1 -1
  103. package/dist/core/adapter/execution-source.js +13 -35
  104. package/dist/core/adapter/registry.js +1 -1
  105. package/dist/core/adapter/validate-context.js +2 -4
  106. package/dist/core/asset/asset-placement.js +1 -1
  107. package/dist/core/asset/asset-ref.js +3 -3
  108. package/dist/core/closest-match.js +37 -0
  109. package/dist/core/common.js +33 -5
  110. package/dist/core/config/config-io.js +26 -18
  111. package/dist/core/config/config-schema.js +19 -106
  112. package/dist/core/config/config-sources.js +3 -3
  113. package/dist/core/config/config-types.js +4 -4
  114. package/dist/core/config/config-walker.js +50 -77
  115. package/dist/core/config/config.js +385 -93
  116. package/dist/core/config/convert-engine-references.js +114 -0
  117. package/dist/core/config/convert-engines-shared.js +40 -0
  118. package/dist/core/config/convert-engines.js +300 -0
  119. package/dist/core/config/convert-models-overlay.js +137 -0
  120. package/dist/core/config/credentials.js +304 -0
  121. package/dist/core/config/engine-semantics.js +3 -3
  122. package/dist/core/config/migrate-keys.js +222 -0
  123. package/dist/core/config/model-aliases.js +37 -0
  124. package/dist/core/config/models-file.js +34 -0
  125. package/dist/core/config/retired-engines.js +53 -0
  126. package/dist/core/config/schema/connections.js +41 -0
  127. package/dist/core/config/schema/embedding.js +2 -2
  128. package/dist/core/config/schema/harnesses.js +41 -0
  129. package/dist/core/config/schema/improve-processes.js +9 -28
  130. package/dist/core/config/schema/improve.js +36 -1
  131. package/dist/core/config/schema/index-config.js +18 -20
  132. package/dist/core/config/schema/primitives.js +41 -22
  133. package/dist/core/config/schema/search.js +6 -11
  134. package/dist/core/config/schema/sources-bundles.js +7 -7
  135. package/dist/core/config/schema/workflow.js +2 -6
  136. package/dist/core/config/unusable-entries.js +66 -0
  137. package/dist/core/content-safety.js +3 -6
  138. package/dist/core/endpoint-url.js +47 -0
  139. package/dist/core/errors.js +9 -15
  140. package/dist/core/extra-params.js +3 -3
  141. package/dist/core/improve-result.js +8 -9
  142. package/dist/core/json-schema.js +1 -1
  143. package/dist/core/lesson-lint.js +1 -1
  144. package/dist/core/llm-inference.js +80 -0
  145. package/dist/core/parse.js +2 -2
  146. package/dist/core/paths.js +32 -4
  147. package/dist/core/recognition-util.js +8 -10
  148. package/dist/core/redaction.js +78 -52
  149. package/dist/core/state/migrations.js +17 -22
  150. package/dist/core/structured.js +2 -68
  151. package/dist/core/subprocess.js +63 -22
  152. package/dist/core/type-presentation.js +10 -14
  153. package/dist/execution/input-contract.js +3 -6
  154. package/dist/execution/notices.js +49 -0
  155. package/dist/execution/resolved-request.js +24 -40
  156. package/dist/execution/source.js +21 -45
  157. package/dist/execution/target-ref.js +2 -2
  158. package/dist/indexer/bundle-identity-guard.js +6 -5
  159. package/dist/indexer/ensure-index.js +1 -1
  160. package/dist/indexer/index-writer-lock.js +1 -1
  161. package/dist/indexer/indexer.js +19 -6
  162. package/dist/indexer/installations.js +11 -14
  163. package/dist/indexer/materialize-embeddings.js +20 -16
  164. package/dist/indexer/passes/memory-inference.js +21 -50
  165. package/dist/indexer/passes/metadata.js +5 -5
  166. package/dist/indexer/scan/doc-to-entry.js +1 -1
  167. package/dist/indexer/scan/drain-dir.js +6 -8
  168. package/dist/indexer/search/db-search.js +9 -7
  169. package/dist/indexer/search/search-source.js +40 -22
  170. package/dist/indexer/usage/usage-events.js +2 -3
  171. package/dist/indexer/walk/index-context.js +2 -1
  172. package/dist/indexer/walk/matchers.js +3 -11
  173. package/dist/indexer/walk/walker.js +14 -4
  174. package/dist/integrations/agent/akm-read-tools.js +81 -0
  175. package/dist/integrations/agent/config.js +1 -1
  176. package/dist/integrations/agent/detect.js +32 -36
  177. package/dist/integrations/agent/execution.js +130 -428
  178. package/dist/integrations/agent/index.js +1 -1
  179. package/dist/integrations/agent/profiles.js +24 -28
  180. package/dist/integrations/agent/prompts.js +17 -30
  181. package/dist/integrations/agent/request-lowering.js +67 -101
  182. package/dist/integrations/agent/resolution.js +332 -0
  183. package/dist/integrations/agent/runner-dispatch.js +154 -178
  184. package/dist/integrations/agent/runner.js +20 -72
  185. package/dist/integrations/agent/runtime-port.js +4 -0
  186. package/dist/integrations/agent/runtime.js +10 -0
  187. package/dist/integrations/agent/spawn.js +65 -190
  188. package/dist/integrations/harnesses/aider/index.js +19 -39
  189. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  190. package/dist/integrations/harnesses/claude/index.js +59 -28
  191. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  192. package/dist/integrations/harnesses/codex/index.js +19 -31
  193. package/dist/integrations/harnesses/copilot/index.js +17 -35
  194. package/dist/integrations/harnesses/gemini/index.js +18 -34
  195. package/dist/integrations/harnesses/harness.js +36 -0
  196. package/dist/integrations/harnesses/index.js +20 -51
  197. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  198. package/dist/integrations/harnesses/opencode/index.js +11 -33
  199. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  200. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  201. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  202. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  203. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  204. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  205. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  206. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  207. package/dist/integrations/harnesses/opencode/version.js +34 -53
  208. package/dist/integrations/harnesses/openhands/index.js +13 -37
  209. package/dist/integrations/harnesses/pi/index.js +21 -32
  210. package/dist/integrations/lockfile.js +1 -1
  211. package/dist/integrations/session-logs/index.js +11 -31
  212. package/dist/llm/client.js +93 -111
  213. package/dist/llm/embedder.js +19 -34
  214. package/dist/llm/embedders/connection.js +31 -0
  215. package/dist/llm/embedders/local-model-files.js +56 -0
  216. package/dist/llm/embedders/local.js +146 -115
  217. package/dist/llm/embedders/remote.js +26 -24
  218. package/dist/llm/embedders/types.js +1 -1
  219. package/dist/llm/index-passes.js +33 -39
  220. package/dist/llm/memory-infer.js +67 -77
  221. package/dist/llm/model-list.js +35 -0
  222. package/dist/llm/rerank-client.js +8 -14
  223. package/dist/llm/structured-call.js +45 -99
  224. package/dist/llm/structured.js +60 -0
  225. package/dist/output/renderers.js +2 -7
  226. package/dist/output/shapes/helpers.js +18 -42
  227. package/dist/output/shapes/passthrough.js +1 -0
  228. package/dist/output/shapes.js +1 -7
  229. package/dist/output/text/command-format.js +29 -37
  230. package/dist/output/text/health-format.js +8 -2
  231. package/dist/output/text/helpers.js +1 -1
  232. package/dist/output/text/migrate.js +12 -0
  233. package/dist/output/text/models.js +3 -2
  234. package/dist/output/text/registry-commands.js +1 -2
  235. package/dist/output/text/show-format.js +0 -2
  236. package/dist/output/text/targets-table.js +70 -0
  237. package/dist/output/text/workflow-format.js +7 -8
  238. package/dist/output/text.js +1 -1
  239. package/dist/registry/providers/skills-sh.js +1 -28
  240. package/dist/registry/providers/static-index.js +1 -71
  241. package/dist/runtime.js +6 -2
  242. package/dist/scripts/akm-migrate-node.js +5280 -4263
  243. package/dist/scripts/akm-migrate.js +5280 -4263
  244. package/dist/setup/detect.js +28 -273
  245. package/dist/setup/endpoint.js +36 -0
  246. package/dist/setup/semantic-assets.js +13 -19
  247. package/dist/setup/setup-flags.js +77 -0
  248. package/dist/setup/setup-plan.js +144 -0
  249. package/dist/setup/setup.js +134 -358
  250. package/dist/setup/steps/connection-shared.js +49 -101
  251. package/dist/setup/steps/connection.js +121 -524
  252. package/dist/setup/steps/embeddings.js +151 -0
  253. package/dist/setup/steps/harnesses.js +118 -0
  254. package/dist/setup/steps/platforms.js +2 -81
  255. package/dist/setup/steps.js +10 -0
  256. package/dist/setup/summary.js +67 -0
  257. package/dist/sources/freshness.js +16 -21
  258. package/dist/sources/providers/git-provider.js +2 -9
  259. package/dist/sources/providers/provider-utils.js +1 -5
  260. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  261. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  262. package/dist/standalone/onnxruntime-library.js +52 -0
  263. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  264. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  265. package/dist/storage/repositories/index-entries-repository.js +2 -2
  266. package/dist/storage/repositories/workflow-runs-repository.js +8 -15
  267. package/dist/storage/sqlite-read-snapshot.js +33 -29
  268. package/dist/tasks/log-redaction.js +7 -119
  269. package/dist/tasks/prepare/prepare-support.js +5 -5
  270. package/dist/tasks/prepare/prepare.js +5 -5
  271. package/dist/tasks/prepare/script-capture.js +3 -5
  272. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  273. package/dist/tasks/run/load-task.js +8 -13
  274. package/dist/tasks/run/run-command-task.js +15 -10
  275. package/dist/tasks/run/run-native-task.js +8 -13
  276. package/dist/tasks/run/run-task.js +5 -8
  277. package/dist/tasks/run/run-workflow-task.js +12 -19
  278. package/dist/tasks/run/task-history.js +9 -17
  279. package/dist/tasks/run/task-log.js +1 -5
  280. package/dist/tasks/scheduler-invocation.js +13 -18
  281. package/dist/tasks/source/bounded-document.js +31 -76
  282. package/dist/tasks/source/project-v4.js +5 -3
  283. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  284. package/dist/tasks/source/task-source-v4.js +47 -68
  285. package/dist/tasks/source-v3.js +2 -5
  286. package/dist/tasks/task-run-reserved-flags.js +1 -2
  287. package/dist/workflows/authoring/authoring.js +2 -7
  288. package/dist/workflows/concurrency-policy.js +4 -4
  289. package/dist/workflows/exec/child-workflow.js +0 -2
  290. package/dist/workflows/exec/dispatch-redaction.js +14 -83
  291. package/dist/workflows/exec/environment.js +2 -3
  292. package/dist/workflows/exec/exec-unit.js +10 -59
  293. package/dist/workflows/exec/frozen-judge.js +10 -26
  294. package/dist/workflows/exec/native-executor.js +56 -45
  295. package/dist/workflows/exec/run-workflow.js +7 -24
  296. package/dist/workflows/exec/step-work.js +9 -14
  297. package/dist/workflows/exec/unit-dispatch.js +6 -13
  298. package/dist/workflows/freeze/freeze.js +14 -32
  299. package/dist/workflows/freeze/step-values.js +5 -11
  300. package/dist/workflows/freeze/targets/command.js +3 -6
  301. package/dist/workflows/freeze/task-bindings.js +0 -1
  302. package/dist/workflows/parser.js +44 -34
  303. package/dist/workflows/plan.js +3 -1
  304. package/dist/workflows/renderer.js +6 -5
  305. package/dist/workflows/resource-limits.js +2 -2
  306. package/dist/workflows/runtime/run-plan.js +2 -1
  307. package/dist/workflows/runtime/runs.js +14 -9
  308. package/docs/README.md +10 -16
  309. package/docs/architecture/README.md +2 -37
  310. package/docs/architecture/adapters.md +2 -2
  311. package/docs/architecture/akm-core-principles.md +256 -118
  312. package/docs/architecture/architecture.md +282 -98
  313. package/docs/architecture/improvement.md +8 -2
  314. package/docs/architecture/internals/classification.md +1 -3
  315. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  316. package/docs/architecture/internals/health-advisories.md +35 -74
  317. package/docs/architecture/internals/improve-workflow.md +27 -26
  318. package/docs/architecture/internals/indexing.md +3 -3
  319. package/docs/architecture/internals/storage-locations.md +45 -12
  320. package/docs/architecture/persisted-data-compat.md +9 -6
  321. package/docs/architecture/specs/okf-support.md +9 -11
  322. package/docs/architecture/specs/ref.md +7 -9
  323. package/docs/architecture/testing/testing-workflow.md +164 -42
  324. package/docs/architecture/workflow-engine.md +17 -14
  325. package/docs/guides/README.md +0 -1
  326. package/docs/guides/author-bundles.md +1 -3
  327. package/docs/guides/author-workflows.md +61 -73
  328. package/docs/guides/bundles.md +4 -5
  329. package/docs/guides/discover-and-load.md +1 -1
  330. package/docs/guides/getting-started.md +49 -3
  331. package/docs/guides/improve-the-library.md +10 -4
  332. package/docs/guides/recipes/headless-install.md +11 -16
  333. package/docs/guides/run-workflows.md +6 -9
  334. package/docs/guides/scheduling.md +2 -2
  335. package/docs/guides/use-with-any-agent.md +20 -22
  336. package/docs/integration/bundling-akm.md +19 -9
  337. package/docs/maintainers/README.md +0 -3
  338. package/docs/migration/README.md +10 -3
  339. package/docs/migration/release-notes/0.10.0.md +81 -16
  340. package/docs/migration/release-notes/0.6.0.md +1 -1
  341. package/docs/migration/release-notes/0.7.0.md +1 -1
  342. package/docs/migration/release-notes/0.9.0.md +1 -1
  343. package/docs/migration/release-notes/README.md +1 -1
  344. package/docs/migration/v0.9-to-v0.10.md +295 -59
  345. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  346. package/docs/posts/config-v2-lessons-16.md +1 -1
  347. package/docs/posts/llm-mode-reflect-13.md +1 -1
  348. package/docs/posts/release-0.6.0.md +11 -11
  349. package/docs/posts/release-0.8.0.md +4 -4
  350. package/docs/posts/workflows-vaults-09.md +1 -1
  351. package/docs/reference/README.md +1 -1
  352. package/docs/reference/asset-types.md +2 -2
  353. package/docs/reference/cli.md +356 -279
  354. package/docs/reference/configuration.md +569 -557
  355. package/docs/reference/data-and-telemetry.md +8 -5
  356. package/docs/reference/env-and-secrets.md +11 -5
  357. package/docs/reference/refs.md +3 -20
  358. package/docs/reference/registry.md +6 -27
  359. package/docs/reference/supported-formats.md +1 -1
  360. package/docs/reference/tasks.md +11 -8
  361. package/docs/reference/ui-api.md +11 -6
  362. package/docs/reference/workflow-schema.md +106 -134
  363. package/docs/reference/workflows.md +4 -6
  364. package/package.json +9 -11
  365. package/schemas/akm-config.json +1696 -2922
  366. package/schemas/akm-task.json +2 -0
  367. package/schemas/akm-workflow.json +36 -9
  368. package/ROADMAP.md +0 -112
  369. package/dist/assets/models.json +0 -35
  370. package/dist/commands/health/engine-usage.js +0 -45
  371. package/dist/core/config/schema/engines.js +0 -160
  372. package/dist/core/config/schema/execution.js +0 -23
  373. package/dist/core/spawn-env.js +0 -268
  374. package/dist/integrations/agent/builder-shared.js +0 -33
  375. package/dist/integrations/agent/builders.js +0 -43
  376. package/dist/integrations/agent/engine-fallback.js +0 -59
  377. package/dist/integrations/agent/engine-resolution.js +0 -335
  378. package/dist/integrations/agent/model-map.js +0 -475
  379. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  380. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  381. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  382. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  383. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  384. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  385. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  386. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  387. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  388. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  389. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  390. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  391. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  392. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  393. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  394. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  395. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  396. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  397. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  398. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  399. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  400. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  401. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  402. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  403. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  404. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  405. package/dist/integrations/harnesses/shared.js +0 -18
  406. package/dist/integrations/harnesses/types.js +0 -55
  407. package/dist/llm/feature-gate.js +0 -115
  408. package/dist/output/shapes/models-list.js +0 -16
  409. package/dist/output/shapes/registry-search.js +0 -10
  410. package/dist/setup/detected-engines.js +0 -136
  411. package/dist/setup/engine-config.js +0 -97
  412. package/dist/setup/harness-config-import.js +0 -47
  413. package/dist/setup/providers.js +0 -14
  414. package/dist/setup/steps/semantic.js +0 -39
  415. package/dist/workflows/exec/lowering-notices.js +0 -23
  416. package/docs/architecture/0.10-process-rules.md +0 -832
  417. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  418. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -544
  419. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  420. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  421. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -187
  422. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  423. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  424. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  425. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  426. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  427. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  428. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  429. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  430. package/docs/architecture/decisions/README.md +0 -62
  431. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  432. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  433. package/docs/architecture/internals/search.md +0 -248
  434. package/docs/architecture/reviews/env-secret-access.md +0 -319
  435. package/docs/architecture/runtime-boundary-design.md +0 -153
  436. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  437. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  438. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  439. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  440. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  441. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  442. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  443. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  444. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  445. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  446. package/docs/architecture/specs/di-seams-plan.md +0 -539
  447. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  448. package/docs/architecture/specs/fact-asset-type.md +0 -142
  449. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  450. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  451. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  452. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  453. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  454. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  455. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  456. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  457. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  458. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  459. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  460. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  461. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  462. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  463. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  464. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  465. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  466. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  467. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  468. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  469. package/docs/architecture/testing/manual-testing-checklist.md +0 -3379
  470. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  471. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1702
  472. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  473. package/docs/guides/knowledge-management.md +0 -18
  474. package/docs/maintainers/curate-workmap.md +0 -335
  475. package/docs/migration/v0.5-to-v0.6.md +0 -759
  476. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  477. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -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
  });
@@ -2,6 +2,7 @@
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
4
  import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
5
+ import { RETIRED_ENGINE_ARG, SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
5
6
  import { defineGroupCommand, defineJsonCommand, EXIT_CODES, output } from "../../cli/shared.js";
6
7
  import { loadConfig } from "../../core/config/config.js";
7
8
  import { isVerbose, setVerbose, warn, warnVerbose } from "../../core/warn.js";
@@ -30,8 +31,8 @@ export const commandRunCommand = defineJsonCommand({
30
31
  type: "string",
31
32
  description: "Override the command's agent selector with a portable agent ref or native harness selector",
32
33
  },
33
- engine: { type: "string", description: "Override the selected execution engine" },
34
- model: { type: "string", description: "Override the selected model alias or exact model identifier" },
34
+ ...SELECTION_ARGS,
35
+ ...RETIRED_ENGINE_ARG,
35
36
  "timeout-ms": { type: "string", description: "Override the execution timeout in milliseconds" },
36
37
  cwd: { type: "string", description: "Override the execution workspace/current working directory" },
37
38
  "dry-run": {
@@ -46,15 +47,10 @@ export const commandRunCommand = defineJsonCommand({
46
47
  const timeoutMs = parsePositiveIntFlag(exactStringArg(args, "timeout-ms"), "--timeout-ms");
47
48
  const current = {};
48
49
  const agent = getStringArg(args, "agent");
49
- const engine = getStringArg(args, "engine");
50
- const model = getStringArg(args, "model");
51
50
  const workspace = getStringArg(args, "cwd");
52
51
  if (agent !== undefined)
53
52
  current.agent = agent;
54
- if (engine !== undefined)
55
- current.engine = engine;
56
- if (model !== undefined)
57
- current.model = model;
53
+ Object.assign(current, selectionFromArgs(args));
58
54
  if (timeoutMs !== undefined)
59
55
  current.timeout = timeoutMs;
60
56
  if (workspace !== undefined)