akm-cli 0.10.261012-beta → 0.10.261014-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -2,239 +2,114 @@
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
  /**
5
- * Agent CLI spawn wrapper (v1 spec §12.2).
5
+ * Agent CLI spawn wrapper.
6
6
  *
7
7
  * Single helper that owns:
8
8
  * • Process spawn (Bun's subprocess API).
9
9
  * • Captured vs interactive stdio.
10
10
  * • Hard timeout (per-call override or profile default).
11
- * • Structured failure reasons — `timeout`, `spawn_failed`,
12
- * `non_zero_exit`, `parse_error`.
11
+ * • Structured failure reasons — `timeout`, `aborted`, `spawn_failed`,
12
+ * `non_zero_exit`.
13
13
  *
14
- * NEVER imports an LLM SDK. Agents are reachable only via shell-out;
15
- * this is a pre-emptive guarantee against the #222 invariant.
14
+ * The command comes from the harness (`harness.build`); this module never
15
+ * touches a model. Agents are reachable only via shell-out.
16
16
  */
17
- import { parseEmbeddedJsonResponse } from "../../core/parse.js";
18
- import { collectAllowlistedEnv } from "../../core/spawn-env.js";
19
- import { runManagedSubprocess, streamCaptureFailure, } from "../../core/subprocess.js";
20
- import { getCommandBuilder } from "./builders.js";
17
+ import { ConfigError } from "../../core/errors.js";
18
+ import { childProcessEnv } from "../../core/paths.js";
19
+ import { runManagedSubprocess, streamCaptureFailure } from "../../core/subprocess.js";
20
+ import { getHarness } from "../harnesses/index.js";
21
21
  import { DEFAULT_AGENT_TIMEOUT_MS } from "./config.js";
22
22
  /**
23
- * Build the child env. Starts empty and copies through:
24
- * • Every name in `profile.envPassthrough` (via the shared
25
- * {@link collectAllowlistedEnv}, which also supplements PATH for
26
- * scheduler contexts where the inherited PATH is stripped).
27
- * • Every entry in `profile.env`.
28
- * • Every entry in `options.env` (highest precedence).
23
+ * The child's env, lowest precedence first: the environment akm runs in with the
24
+ * directories this akm resolved set over it, so a child that runs `akm` uses the
25
+ * same installation ({@link childProcessEnv}); then the call's `env`. The one
26
+ * environment policy for anything an agent run starts: a CLI harness's child, and
27
+ * the shell of an embedded session.
29
28
  */
30
- function buildChildEnv(profile, options) {
31
- const env = collectAllowlistedEnv(profile.envPassthrough, options.envSource ?? process.env);
32
- if (profile.env) {
33
- for (const [k, v] of Object.entries(profile.env))
34
- env[k] = v;
35
- }
36
- if (options.env) {
37
- for (const [k, v] of Object.entries(options.env))
38
- env[k] = v;
39
- }
40
- return env;
29
+ export function buildChildEnv(options) {
30
+ return { ...childProcessEnv(), ...options.env };
41
31
  }
42
32
  /**
43
33
  * This path's phrasing of the SHARED incomplete-capture verdict
44
34
  * ({@link streamCaptureFailure} in `core/subprocess.ts`). The classification
45
35
  * lives in the primitive so the agent path and the workflow `exec` path cannot
46
36
  * drift apart on what "the capture did not complete" means; only the sentence
47
- * naming the profile is local. Message text is unchanged from the inlined copy.
37
+ * naming what ran is local.
48
38
  */
49
- function streamFailureMessage(profileName, stdout, stderr) {
39
+ function streamFailureMessage(label, stdout, stderr) {
50
40
  const failures = streamCaptureFailure(stdout, stderr);
51
- return failures === undefined ? undefined : `agent CLI "${profileName}" output capture failed: ${failures}`;
41
+ return failures === undefined ? undefined : `${label} output capture failed: ${failures}`;
42
+ }
43
+ function failed(reason, error, rest = {}) {
44
+ return { ok: false, exitCode: null, stdout: "", stderr: "", durationMs: 0, reason, error, ...rest };
52
45
  }
53
46
  /**
54
- * Spawn the agent CLI described by `profile` with `prompt` (forwarded as
55
- * the last positional arg by default) and return a structured result.
56
- *
57
- * The `prompt` argument is appended to `profile.args` (and `options.args`)
58
- * unless it is `undefined`. Pass `prompt = ""` to forward an explicit
59
- * empty positional, or pass extra args via `options.args`.
47
+ * Spawn the agent CLI `profile` names, with the command its harness builds from
48
+ * `options.dispatch`, and return a structured result.
60
49
  *
61
50
  * Failure modes (see {@link AgentFailureReason}):
62
51
  *
63
- * • `spawn_failed` — the spawn call threw synchronously.
52
+ * • `spawn_failed` — the spawn call threw, or its output could not be captured.
64
53
  * • `timeout` — exceeded the resolved timeout.
54
+ * • `aborted` — the caller's signal fired.
65
55
  * • `non_zero_exit` — child exited with a non-zero code.
66
- * • `parse_error` — `parseOutput === "json"` and stdout was not JSON.
67
56
  *
68
- * `ok === true` requires exit code 0 and (if `parseOutput === "json"`)
69
- * a successful `JSON.parse`.
57
+ * `ok === true` requires exit code 0.
58
+ */
59
+ export async function runAgent(profile, options = {}) {
60
+ const platform = profile.platform ?? profile.name;
61
+ const harness = getHarness(platform);
62
+ if (!harness) {
63
+ throw new ConfigError(`Agent platform "${platform}" has no registered command builder.`, "INVALID_CONFIG_FILE", "Select a canonical agent platform in harnesses.<name>.platform.");
64
+ }
65
+ const built = harness.build(profile, options.dispatch ?? {});
66
+ const command = { argv: built.argv, env: { ...buildChildEnv(options), ...built.env }, stdin: built.stdin };
67
+ return runBuiltCommand(`agent CLI "${profile.name}"`, command, options, options.stdio ?? profile.stdio);
68
+ }
69
+ /**
70
+ * Run a command that is already built and return a structured result: the part
71
+ * of {@link runAgent} that does not depend on which harness built the command,
72
+ * which akm's own runtime (`harnesses/opencode/runtime/`) shares. `label` names
73
+ * what ran in the failure messages.
70
74
  */
71
- export async function runAgent(profile, prompt, options = {}) {
72
- const stdioMode = options.stdio ?? profile.stdio;
75
+ export async function runBuiltCommand(label, { argv, env, stdin }, options, stdioMode = options.stdio ?? "captured") {
73
76
  // null = explicitly disabled (no kill timer). undefined = runtime default.
74
77
  const timeoutMs = options.timeoutMs !== undefined ? options.timeoutMs : DEFAULT_AGENT_TIMEOUT_MS;
75
- const parseOutput = options.parseOutput ?? profile.parseOutput;
76
- const setTimeoutImpl = options.setTimeoutFn ?? setTimeout;
77
- const clearTimeoutImpl = options.clearTimeoutFn ?? clearTimeout;
78
- // Observability seam — ids/status only, best-effort (see RunAgentOptions.onEvent).
79
- const emitSpawnEvent = (type, data) => {
80
- if (!options.onEvent)
81
- return;
82
- try {
83
- options.onEvent({ type, data });
84
- }
85
- catch {
86
- // Observability must never break the dispatch.
87
- }
88
- };
89
- // Build argv via the platform-specific builder when dispatch params are
90
- // provided; otherwise use the direct positional-prompt form.
91
- let builtArgv;
92
- let builtEnv;
93
- if (options.dispatch !== undefined) {
94
- const builder = getCommandBuilder(profile.platform ?? profile.name, options.builderRegistry);
95
- const built = builder.build(profile, options.dispatch);
96
- builtArgv = built.argv;
97
- builtEnv = built.env;
98
- }
99
- else {
100
- const positionalArgs = [...profile.args, ...(options.args ?? [])];
101
- if (prompt !== undefined)
102
- positionalArgs.push(prompt);
103
- builtArgv = [profile.bin, ...positionalArgs];
104
- }
105
- // Extra args (e.g. forwarded CLI positionals) are appended after the builder output.
106
- const finalArgv = [...builtArgv, ...(options.dispatch ? (options.args ?? []) : [])];
107
- const env = { ...buildChildEnv(profile, options), ...(builtEnv ?? {}) };
108
- const start = Date.now();
109
78
  // Cooperative cancel: refuse to spawn at all when the caller's signal is
110
79
  // already aborted (e.g. the run's budget was exhausted before this unit).
111
80
  if (options.signal?.aborted) {
112
- return {
113
- ok: false,
114
- exitCode: null,
115
- stdout: "",
116
- stderr: "",
117
- durationMs: 0,
118
- reason: "aborted",
119
- error: `agent CLI "${profile.name}" not started: caller signal already aborted`,
120
- };
81
+ return failed("aborted", `${label} not started: caller signal already aborted`);
121
82
  }
122
83
  // Spawn/timeout/abort/capture are owned by the managed-subprocess primitive
123
84
  // (src/core/subprocess.ts): process-GROUP spawn (detached in captured mode),
124
- // the SIGTERM→SIGKILL kill ladder on timeout/abort, bounded output capture,
125
- // and the optional stdin payload. runAgent keeps its agent-specific surface —
126
- // the onEvent observability seam, the failure taxonomy, and JSON parsing.
127
- //
128
- // `onSpawn` fires spawn_start once the child is live (never for a pre-spawn
129
- // abort or a synchronous spawn failure), and captures the proc so spawn_exit
130
- // can carry the same pid.
131
- let spawnedProc;
132
- const result = await runManagedSubprocess(finalArgv, {
85
+ // the SIGINT→SIGTERM→SIGKILL kill ladder on timeout/abort, bounded output capture,
86
+ // and the optional stdin payload. This keeps the agent-specific surface:
87
+ // the failure taxonomy.
88
+ const start = Date.now();
89
+ const result = await runManagedSubprocess([...argv], {
133
90
  capture: stdioMode === "captured",
134
- env,
91
+ env: { ...env },
135
92
  ...(options.cwd ? { cwd: options.cwd } : {}),
136
- ...(options.stdin !== undefined ? { stdin: options.stdin } : {}),
93
+ ...(stdin !== undefined ? { stdin } : {}),
137
94
  timeoutMs,
138
95
  ...(options.signal ? { signal: options.signal } : {}),
139
- ...(options.spawn ? { spawnFn: options.spawn } : {}),
140
- setTimeoutFn: setTimeoutImpl,
141
- clearTimeoutFn: clearTimeoutImpl,
142
- onSpawn: (proc) => {
143
- spawnedProc = proc;
144
- emitSpawnEvent("spawn_start", {
145
- profile: profile.name,
146
- ...(typeof proc.pid === "number" ? { pid: proc.pid } : {}),
147
- });
148
- },
149
96
  });
150
- const pidField = spawnedProc && typeof spawnedProc.pid === "number" ? { pid: spawnedProc.pid } : {};
151
97
  const durationMs = Date.now() - start;
152
- // Spawn/exit failure. A synchronous spawn throw never reached a live child
153
- // (no spawn_start fired, so no spawn_exit either); a rejected proc.exited did
154
- // (spawn_start already fired, so it emits a spawn_exit with status spawn_failed).
155
- if (result.spawnError) {
156
- if (spawnedProc) {
157
- emitSpawnEvent("spawn_exit", { profile: profile.name, ...pidField, exitCode: null, status: "spawn_failed" });
158
- }
159
- return {
160
- ok: false,
161
- exitCode: null,
162
- stdout: "",
163
- stderr: "",
164
- durationMs,
165
- reason: "spawn_failed",
166
- error: result.spawnError.message,
167
- };
98
+ if (result.spawnError)
99
+ return failed("spawn_failed", result.spawnError.message, { durationMs });
100
+ const { exitCode, stdout, stderr } = result;
101
+ const output = { exitCode, stdout, stderr, durationMs };
102
+ if (result.aborted) {
103
+ return failed("aborted", `${label} aborted by caller signal`, output);
168
104
  }
169
- const { exitCode, timedOut, aborted, stdout, stderr } = result;
170
- emitSpawnEvent("spawn_exit", {
171
- profile: profile.name,
172
- ...pidField,
173
- exitCode,
174
- status: aborted ? "aborted" : timedOut ? "timeout" : exitCode !== 0 ? "non_zero_exit" : "ok",
175
- });
176
- if (aborted) {
177
- return {
178
- ok: false,
179
- exitCode,
180
- stdout,
181
- stderr,
182
- durationMs,
183
- reason: "aborted",
184
- error: `agent CLI "${profile.name}" aborted by caller signal`,
185
- };
186
- }
187
- if (timedOut) {
188
- return {
189
- ok: false,
190
- exitCode,
191
- stdout,
192
- stderr,
193
- durationMs,
194
- reason: "timeout",
195
- error: `agent CLI "${profile.name}" timed out after ${timeoutMs ?? 0}ms`,
196
- };
197
- }
198
- const captureFailure = streamFailureMessage(profile.name, result.stdoutRead, result.stderrRead);
199
- if (captureFailure) {
200
- return {
201
- ok: false,
202
- exitCode,
203
- stdout,
204
- stderr,
205
- durationMs,
206
- reason: "spawn_failed",
207
- error: captureFailure,
208
- };
105
+ if (result.timedOut) {
106
+ return failed("timeout", `${label} timed out after ${timeoutMs ?? 0}ms`, output);
209
107
  }
108
+ const captureFailure = streamFailureMessage(label, result.stdoutRead, result.stderrRead);
109
+ if (captureFailure)
110
+ return failed("spawn_failed", captureFailure, output);
210
111
  if (exitCode !== 0) {
211
- return {
212
- ok: false,
213
- exitCode,
214
- stdout,
215
- stderr,
216
- durationMs,
217
- reason: "non_zero_exit",
218
- error: `agent CLI "${profile.name}" exited with code ${exitCode}`,
219
- };
220
- }
221
- if (parseOutput === "json" && stdioMode === "captured") {
222
- // Strip <think> blocks and code fences, then parse with embedded-JSON
223
- // fallback for local LLMs that emit prose around the payload. Handles
224
- // both top-level `{…}` and `[…]` structures.
225
- const parsed = parseEmbeddedJsonResponse(stdout);
226
- if (parsed === undefined) {
227
- return {
228
- ok: false,
229
- exitCode,
230
- stdout,
231
- stderr,
232
- durationMs,
233
- reason: "parse_error",
234
- error: "no JSON structure found in agent output",
235
- };
236
- }
237
- return { ok: true, exitCode, stdout, stderr, durationMs, parsed };
112
+ return failed("non_zero_exit", `${label} exited with code ${exitCode}`, output);
238
113
  }
239
- return { ok: true, exitCode, stdout, stderr, durationMs };
114
+ return { ok: true, ...output };
240
115
  }
@@ -2,46 +2,26 @@
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
  /**
5
- * Aider CLI harness (P2 integration, plan §"The adapter contract").
6
- *
7
- * Per-harness barrel gathering the Aider integration surfaces:
8
- * - agent command builder → ./agent-builder.ts (aiderBuilder)
9
- * - result extractor → ./result-extractor.ts (aiderResultExtractor)
10
- *
11
- * It also defines {@link AiderHarness}, the {@link AkmHarness} descriptor that
12
- * `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log reader or
13
- * config importer yet.
5
+ * Aider (`aider`). `--message` is its one-shot mode, `--yes-always` confirms every
6
+ * prompt so an unattended run does not stop, and `--no-pretty` keeps ANSI
7
+ * rendering out of the captured reply. The message is a flag value, with no
8
+ * positional prompt and no `--` to hide behind, so it is glued on with `=`: a
9
+ * prompt that starts with `-` then binds to the flag and is never read as an option.
14
10
  */
15
- import { caps } from "../shared.js";
16
- import { BaseHarness } from "../types.js";
17
- import { aiderBuilder } from "./agent-builder.js";
18
- import { aiderResultExtractor } from "./result-extractor.js";
19
- export { AIDER_PLATFORM, aiderBuilder } from "./agent-builder.js";
20
- export { aiderResultExtractor } from "./result-extractor.js";
21
- /**
22
- * Aider.
23
- *
24
- * Canonical id is `'aider'`; no alias or distinct runtime identity.
25
- */
26
- export class AiderHarness extends BaseHarness {
11
+ import { withoutModelFlag, } from "../harness.js";
12
+ export class AiderHarness {
27
13
  id = "aider";
28
14
  displayName = "Aider";
29
- agentBuilder = aiderBuilder;
30
- profile = {
31
- bin: "aider",
32
- args: ["--no-auto-commits"],
33
- envPassthrough: ["OPENAI_API_KEY", "ANTHROPIC_API_KEY"],
34
- };
35
- resultExtractor = aiderResultExtractor;
36
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
37
- // No flag-shaped resume: Aider persists context in chat-history files
38
- // (`.aider.chat.history.md`), not session ids — the plan's named example of
39
- // a harness with no session model. akm's `workflow_run_units` remains the
40
- // durable resume source of truth.
41
- // No `identityEnv`: the matrix lists Aider's identity markers as uncertain,
42
- // and Aider stamps no session var onto child processes.
43
- capabilities = caps({
44
- agentDispatch: true,
45
- detection: true,
46
- });
15
+ profile = { bin: "aider", args: [] };
16
+ systemPrompt = false;
17
+ nativeAgent = false;
18
+ confinable = false;
19
+ build({ bin, args }, req) {
20
+ const argv = [bin, ...(req.model ? withoutModelFlag(args) : args)];
21
+ if (req.model)
22
+ argv.push("--model", req.model);
23
+ if (req.prompt !== undefined)
24
+ argv.push("--yes-always", "--no-pretty", `--message=${req.prompt}`);
25
+ return { argv };
26
+ }
47
27
  }
@@ -2,39 +2,24 @@
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
  /**
5
- * Amazon Q Developer CLI harness (P2 integration, plan §"The adapter
6
- * contract").
7
- *
8
- * Per-harness barrel gathering the Amazon Q integration surfaces:
9
- * - agent command builder → ./agent-builder.ts (amazonqBuilder)
10
- * - result extractor → ./result-extractor.ts (amazonqResultExtractor)
11
- *
12
- * It also defines {@link AmazonqHarness}, the {@link AkmHarness} descriptor
13
- * that `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log
14
- * reader or config importer yet.
5
+ * Amazon Q Developer CLI (`q`). Headless is `q chat --no-interactive`, which
6
+ * prints the reply and exits; `--trust-all-tools` stops it asking before each
7
+ * tool. The prompt is the trailing positional, after `--`.
15
8
  */
16
- import { caps } from "../shared.js";
17
- import { BaseHarness } from "../types.js";
18
- import { amazonqBuilder } from "./agent-builder.js";
19
- import { amazonqResultExtractor } from "./result-extractor.js";
20
- export { AMAZONQ_PLATFORM, amazonqBuilder } from "./agent-builder.js";
21
- export { amazonqResultExtractor, stripTerminalFraming } from "./result-extractor.js";
22
- /**
23
- * Amazon Q Developer CLI (`q`).
24
- *
25
- * Canonical id is `'amazonq'`; no alias or distinct runtime identity.
26
- */
27
- export class AmazonqHarness extends BaseHarness {
9
+ import { withoutLeading, withoutModelFlag, } from "../harness.js";
10
+ export class AmazonqHarness {
28
11
  id = "amazonq";
29
12
  displayName = "Amazon Q Developer CLI";
30
- agentBuilder = amazonqBuilder;
31
- profile = { bin: "q", args: [], envPassthrough: ["AWS_PROFILE", "AWS_REGION"] };
32
- resultExtractor = amazonqResultExtractor;
33
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
34
- // No `identityEnv`: the matrix lists Q's identity markers as uncertain, and
35
- // Q stamps no session var onto child processes.
36
- capabilities = caps({
37
- agentDispatch: true,
38
- detection: true,
39
- });
13
+ profile = { bin: "q", args: [] };
14
+ systemPrompt = false;
15
+ nativeAgent = false;
16
+ confinable = false;
17
+ build({ bin, args }, req) {
18
+ const authored = withoutLeading(args, "chat");
19
+ const base = [bin, "chat", ...(req.model ? withoutModelFlag(authored) : authored)];
20
+ const model = req.model ? ["--model", req.model] : [];
21
+ if (req.prompt === undefined)
22
+ return { argv: [...base, ...model] };
23
+ return { argv: [...base, "--no-interactive", "--trust-all-tools", ...model, "--", req.prompt] };
24
+ }
40
25
  }
@@ -1,42 +1,73 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { caps } from "../shared.js";
5
- import { BaseHarness } from "../types.js";
6
- import { claudeBuilder } from "./agent-builder.js";
7
- import { claudeCodeImporter } from "./config-import.js";
8
- import { claudeResultExtractor } from "./result-extractor.js";
4
+ import { modelFromArgs, withoutModelFlag, } from "../harness.js";
9
5
  import { ClaudeCodeProvider } from "./session-log.js";
10
- export { claudeBuilder } from "./agent-builder.js";
11
- export { claudeCodeImporter } from "./config-import.js";
12
- export { claudeResultExtractor } from "./result-extractor.js";
13
6
  export { ClaudeCodeProvider } from "./session-log.js";
14
7
  /**
15
- * Claude Code.
16
- *
17
- * `claude` is the sole runtime and persisted id.
8
+ * The model-work tool policy on Claude Code, verified against 2.1.283:
9
+ * - `--restricted` ignores the user, project and local settings files (whose
10
+ * allow rules would otherwise pre-approve any command or path) and confines
11
+ * the file tools to the working directory;
12
+ * - `--strict-mcp-config` starts no MCP server, and `--tools` offers only Read
13
+ * and Bash: no Edit;
14
+ * - `--allowedTools` pre-approves Read and `akm search`, `akm show` and
15
+ * `akm curate`, and `--permission-mode dontAsk` denies everything else instead
16
+ * of prompting, including a compound, redirected or substituted command;
17
+ * - `--no-session-persistence` keeps the run out of Claude Code's transcripts,
18
+ * which `akm extract` would otherwise harvest as the user's own sessions.
19
+ * The config's `args` are left out of a model-work run, because `--add-dir`,
20
+ * `--settings` or a second `--allowedTools` would widen the policy; only the model
21
+ * they name is kept.
18
22
  */
19
- export class ClaudeHarness extends BaseHarness {
23
+ export const MODEL_WORK_CLAUDE_FLAGS = Object.freeze([
24
+ "--restricted",
25
+ "--strict-mcp-config",
26
+ "--tools",
27
+ "Read,Bash",
28
+ "--allowedTools",
29
+ "Read,Bash(akm search *),Bash(akm show *),Bash(akm curate *)",
30
+ "--permission-mode",
31
+ "dontAsk",
32
+ "--no-session-persistence",
33
+ ]);
34
+ export class ClaudeHarness {
20
35
  id = "claude";
21
36
  displayName = "Claude Code";
22
37
  // Home-relative config dir scanned by `akm setup` (#567). Claude Code has a
23
38
  // session-log provider, so offering it as a stash source is functional.
24
39
  setupDetectionDir = ".claude";
25
- agentBuilder = claudeBuilder;
26
- profile = { bin: "claude", args: [], envPassthrough: ["ANTHROPIC_API_KEY", "CLAUDE_CONFIG"] };
27
- resultExtractor = claudeResultExtractor;
28
- configImporter = claudeCodeImporter;
29
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
30
- // Session-id env marker: presence of a concrete session id (not the bare
31
- // "running under Claude Code" flag) attributes a run to this harness.
32
- identityEnv = ["CLAUDE_SESSION_ID"];
40
+ profile = { bin: "claude", args: [] };
41
+ models = {
42
+ fast: "claude-haiku-4-5-20251001",
43
+ balanced: "claude-sonnet-4-6",
44
+ reasoning: "claude-opus-4-7",
45
+ };
46
+ // Claude Code exports its session id to the commands it runs. Only a concrete id
47
+ // attributes a run to this harness, not the bare "running under Claude Code" fact.
48
+ identityEnv = ["CLAUDE_CODE_SESSION_ID"];
33
49
  sessionLogProvider = () => new ClaudeCodeProvider();
34
- capabilities = caps({
35
- sessionLogs: true,
36
- agentDispatch: true,
37
- detection: true,
38
- modelWork: true,
39
- nativeAgent: true,
40
- configImport: true,
41
- });
50
+ systemPrompt = true;
51
+ nativeAgent = true;
52
+ confinable = true;
53
+ build({ bin, args }, req) {
54
+ const argv = [bin];
55
+ let model = req.model;
56
+ if (req.modelWork) {
57
+ argv.push(...MODEL_WORK_CLAUDE_FLAGS);
58
+ model ??= modelFromArgs(args);
59
+ }
60
+ else {
61
+ argv.push(...(model ? withoutModelFlag(args) : args));
62
+ }
63
+ if (req.agent)
64
+ argv.push("--agent", req.agent);
65
+ if (req.systemPrompt)
66
+ argv.push("--append-system-prompt", req.systemPrompt);
67
+ if (model)
68
+ argv.push("--model", model);
69
+ if (req.prompt === undefined)
70
+ return { argv };
71
+ return { argv: [...argv, "-p"], stdin: req.prompt };
72
+ }
42
73
  }
@@ -7,17 +7,19 @@ import path from "node:path";
7
7
  import { extractInlineRefMentions } from "../../session-logs/inline-refs.js";
8
8
  import { AbstractSessionLogProvider } from "../../session-logs/provider-base.js";
9
9
  /**
10
- * Root directory holding Claude Code's per-project JSONL session logs.
10
+ * Root directory holding Claude Code's per-project JSONL session logs: the
11
+ * `projects` folder of its config directory (`CLAUDE_CONFIG_DIR`, else `~/.claude`).
11
12
  *
12
- * Resolved per call (not memoized at module load) so the `AKM_CLAUDE_PROJECTS_DIR`
13
- * override can be set after import. The override exists so tests — and the
14
- * isolated-storage sandbox — can point the scan at an empty fixture directory
13
+ * Resolved per call (not memoized at module load) so the environment can be set
14
+ * after import. `AKM_CLAUDE_PROJECTS_DIR` overrides it so tests, and the
15
+ * isolated-storage sandbox, can point the scan at an empty fixture directory
15
16
  * instead of the real `~/.claude/projects`, which on an actively-used machine
16
17
  * holds many large session files and would make `akm health` (which scans it
17
18
  * synchronously) slow and non-hermetic.
18
19
  */
19
20
  function claudeProjectsDir() {
20
- return process.env.AKM_CLAUDE_PROJECTS_DIR ?? path.join(os.homedir(), ".claude", "projects");
21
+ return (process.env.AKM_CLAUDE_PROJECTS_DIR ??
22
+ path.join(process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude"), "projects"));
21
23
  }
22
24
  /**
23
25
  * Directory Claude Code writes a session's subagent transcripts into, as
@@ -1,43 +1,31 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { caps } from "../shared.js";
5
- import { BaseHarness } from "../types.js";
6
- import { codexBuilder } from "./agent-builder.js";
7
- import { codexResultExtractor } from "./result-extractor.js";
4
+ import { modelFromArgs, withoutLeading, withoutModelFlag, } from "../harness.js";
8
5
  import { CodexProvider } from "./session-log.js";
9
- export { codexBuilder, codexResumeArgs, writeCodexOutputSchemaFile } from "./agent-builder.js";
10
- export { codexResultExtractor } from "./result-extractor.js";
11
6
  export { CodexProvider } from "./session-log.js";
12
- /**
13
- * OpenAI Codex CLI.
14
- *
15
- * Canonical id is `'codex'`; no alias or distinct runtime identity.
16
- */
17
- export class CodexHarness extends BaseHarness {
7
+ export class CodexHarness {
18
8
  id = "codex";
19
9
  displayName = "OpenAI Codex CLI";
20
10
  // No `setupDetectionDir`: `~/.codex` holds credentials and session rollouts,
21
11
  // not assets, so `akm setup` must not offer it as a stash source.
22
- agentBuilder = codexBuilder;
23
- profile = { bin: "codex", args: [], envPassthrough: ["OPENAI_API_KEY", "CODEX_CONFIG"] };
24
- resultExtractor = codexResultExtractor;
25
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
26
- // No flag-shaped resume: codex resume is the `exec resume <id>` SUBCOMMAND
27
- // chain (see `codexResumeArgs` in ./agent-builder.ts).
28
- // Presence flag: CODEX_SANDBOX is stamped only on processes codex itself
29
- // spawns inside its sandbox, so it genuinely means "running under codex" —
30
- // but its VALUE (e.g. "seatbelt") is a sandbox mode, not a session id, so it
31
- // is registered as `presenceEnv` (harness inference only), never
32
- // `identityEnv` (whose values persist as agent_session_id). CODEX_HOME (the
33
- // matrix's other candidate) is deliberately NOT registered anywhere: it is a
34
- // user config-dir var commonly exported in shell profiles, so it would stamp
35
- // identity onto manual runs (see `AkmHarness.presenceEnv`).
12
+ profile = { bin: "codex", args: [] };
13
+ // CODEX_SANDBOX is stamped only on processes codex itself spawns inside its sandbox, so it
14
+ // means "running under codex"; its value (e.g. "seatbelt") is a sandbox mode, not a session id.
36
15
  presenceEnv = ["CODEX_SANDBOX"];
37
16
  sessionLogProvider = () => new CodexProvider();
38
- capabilities = caps({
39
- sessionLogs: true,
40
- agentDispatch: true,
41
- detection: true,
42
- });
17
+ systemPrompt = false;
18
+ nativeAgent = false;
19
+ confinable = true;
20
+ build({ bin, args }, req) {
21
+ const authored = withoutLeading(args, "exec");
22
+ // Model work drops the config's args (a `--sandbox` among them would widen the policy), keeping the model they name.
23
+ const extra = req.modelWork ? [] : req.model ? withoutModelFlag(authored) : authored;
24
+ const model = req.model ?? (req.modelWork ? modelFromArgs(authored) : undefined);
25
+ const modelFlag = model ? ["--model", model] : [];
26
+ if (req.prompt === undefined)
27
+ return { argv: [bin, ...extra, ...modelFlag] };
28
+ const sandbox = req.modelWork ? ["--sandbox", "read-only"] : [];
29
+ return { argv: [bin, "exec", ...extra, ...sandbox, "--skip-git-repo-check", ...modelFlag, "--", req.prompt] };
30
+ }
43
31
  }