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