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,42 +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
- * GitHub Copilot CLI harness (P2 integration, plan §"The adapter contract").
6
- *
7
- * Per-harness barrel gathering the Copilot CLI integration surfaces:
8
- * - agent command builder → ./agent-builder.ts (copilotBuilder)
9
- * - result extractor → ./result-extractor.ts (copilotResultExtractor)
10
- *
11
- * It also defines {@link CopilotHarness}, the {@link AkmHarness} descriptor
12
- * that `HARNESS_REGISTRY` registers. This is the LOCAL Copilot CLI
13
- * (`copilot -p …`); the cloud "Copilot coding agent" is a separate, future
14
- * descriptor.
5
+ * GitHub Copilot CLI (`copilot`), the local headless CLI and not the cloud coding
6
+ * agent. `-p` runs one prompt; `--allow-all-tools` is what lets it run without
7
+ * asking for approval at each tool.
15
8
  */
16
- import { caps } from "../shared.js";
17
- import { BaseHarness } from "../types.js";
18
- import { copilotBuilder } from "./agent-builder.js";
19
- import { copilotResultExtractor } from "./result-extractor.js";
20
- export { COPILOT_PLATFORM, copilotBuilder } from "./agent-builder.js";
21
- export { copilotResultExtractor } from "./result-extractor.js";
22
- /**
23
- * GitHub Copilot CLI (local headless CLI, not the cloud coding agent).
24
- *
25
- * Canonical id is `'copilot'`; no alias or distinct runtime identity.
26
- */
27
- export class CopilotHarness extends BaseHarness {
9
+ import { withoutModelFlag, } from "../harness.js";
10
+ export class CopilotHarness {
28
11
  id = "copilot";
29
12
  displayName = "GitHub Copilot CLI";
30
- agentBuilder = copilotBuilder;
31
- profile = { bin: "copilot", args: [], envPassthrough: ["GH_TOKEN", "GITHUB_TOKEN"] };
32
- resultExtractor = copilotResultExtractor;
33
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
34
- // Session-id env marker only. The matrix's other candidates (GH_TOKEN,
35
- // bare COPILOT_* presence vars) are credential/presence flags that would
36
- // stamp identity onto manual runs, so they are deliberately NOT registered
37
- // (see `AkmHarness.identityEnv`).
38
- identityEnv = ["COPILOT_SESSION_ID"];
39
- capabilities = caps({
40
- agentDispatch: true,
41
- detection: true,
42
- });
13
+ profile = { bin: "copilot", args: [] };
14
+ systemPrompt = false;
15
+ nativeAgent = false;
16
+ confinable = false;
17
+ build({ bin, args }, req) {
18
+ const argv = [bin, ...(req.model ? withoutModelFlag(args) : args)];
19
+ if (req.model)
20
+ argv.push("--model", req.model);
21
+ if (req.prompt !== undefined)
22
+ argv.push("--allow-all-tools", "-p", req.prompt);
23
+ return { argv };
24
+ }
43
25
  }
@@ -2,42 +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
- * Gemini CLI harness (P2 integration, plan §"The adapter contract").
6
- *
7
- * Per-harness barrel gathering the Gemini CLI integration surfaces:
8
- * - agent command builder → ./agent-builder.ts (geminiBuilder)
9
- * - result extractor → ./result-extractor.ts (geminiResultExtractor)
10
- *
11
- * It also defines {@link GeminiHarness}, the {@link AkmHarness} descriptor
12
- * that `HARNESS_REGISTRY` registers. Dispatch-only: no native session-log
13
- * reader or config importer yet.
5
+ * Gemini CLI (`gemini`). `-p` runs one prompt headless. Autonomy flags
6
+ * (`--yolo`, `--approval-mode`) belong in the config's `args`, where the user opts in.
14
7
  */
15
- import { caps } from "../shared.js";
16
- import { BaseHarness } from "../types.js";
17
- import { geminiBuilder } from "./agent-builder.js";
18
- import { geminiResultExtractor } from "./result-extractor.js";
19
- export { GEMINI_PLATFORM, geminiBuilder } from "./agent-builder.js";
20
- export { geminiResultExtractor } from "./result-extractor.js";
21
- /**
22
- * Gemini CLI.
23
- *
24
- * Canonical id is `'gemini'`; no alias or distinct runtime identity.
25
- */
26
- export class GeminiHarness extends BaseHarness {
8
+ import { withoutModelFlag, } from "../harness.js";
9
+ export class GeminiHarness {
27
10
  id = "gemini";
28
11
  displayName = "Gemini CLI";
29
- agentBuilder = geminiBuilder;
30
- profile = { bin: "gemini", args: [], envPassthrough: ["GEMINI_API_KEY", "GOOGLE_API_KEY"] };
31
- resultExtractor = geminiResultExtractor;
32
- // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
33
- // The matrix's identity marker: Gemini CLI stamps GEMINI_CLI=1 only on
34
- // processes it spawns, so it genuinely means "running under gemini" (it is
35
- // not a user-profile config var) — but its VALUE ("1") is a bare flag, not
36
- // a session id, so it is registered as `presenceEnv` (harness inference
37
- // only), never `identityEnv` (whose values persist as agent_session_id).
12
+ profile = { bin: "gemini", args: [] };
13
+ // GEMINI_CLI=1 is stamped only on processes Gemini CLI spawns, so it means "running under
14
+ // gemini"; its value is a bare flag, not a session id.
38
15
  presenceEnv = ["GEMINI_CLI"];
39
- capabilities = caps({
40
- agentDispatch: true,
41
- detection: true,
42
- });
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("-p", req.prompt);
25
+ return { argv };
26
+ }
43
27
  }
@@ -0,0 +1,36 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * The model the config's own `args` select, as `--model X` or `--model=X` (the
6
+ * last one wins).
7
+ */
8
+ export function modelFromArgs(args) {
9
+ let model;
10
+ for (let index = 0; index < args.length; index += 1) {
11
+ const arg = args[index];
12
+ if (arg === "--model")
13
+ model = args[index + 1];
14
+ else if (arg?.startsWith("--model="))
15
+ model = arg.slice("--model=".length);
16
+ }
17
+ return model;
18
+ }
19
+ /** `args` without any `--model X` or `--model=X`, for a builder that adds the request's model itself, so it is passed once. */
20
+ export function withoutModelFlag(args) {
21
+ const kept = [];
22
+ for (let index = 0; index < args.length; index += 1) {
23
+ const arg = args[index];
24
+ if (arg === undefined)
25
+ continue;
26
+ if (arg === "--model")
27
+ index += 1;
28
+ else if (!arg.startsWith("--model="))
29
+ kept.push(arg);
30
+ }
31
+ return kept;
32
+ }
33
+ /** `args` less a leading `subcommand` the builder writes itself, so an authored one is not doubled. */
34
+ export function withoutLeading(args, subcommand) {
35
+ return args[0] === subcommand ? args.slice(1) : [...args];
36
+ }
@@ -11,8 +11,7 @@
11
11
  *
12
12
  * Adding a harness: create `./<id>/index.ts`, add its class here. Removing:
13
13
  * delete both. This module must stay free of runtime `core/config` imports
14
- * (config derives `VALID_HARNESS_IDS` from here), so a harness's heavy runner
15
- * (e.g. `opencode-sdk/sdk-runner.ts`) is imported by its caller, not here.
14
+ * (config derives `VALID_HARNESS_IDS` from here).
16
15
  */
17
16
  import { AiderHarness } from "./aider/index.js";
18
17
  import { AmazonqHarness } from "./amazonq/index.js";
@@ -21,28 +20,21 @@ import { CodexHarness } from "./codex/index.js";
21
20
  import { CopilotHarness } from "./copilot/index.js";
22
21
  import { GeminiHarness } from "./gemini/index.js";
23
22
  import { OpencodeHarness } from "./opencode/index.js";
24
- import { OpencodeSdkHarness } from "./opencode-sdk/index.js";
25
23
  import { OpenhandsHarness } from "./openhands/index.js";
26
24
  import { PiHarness } from "./pi/index.js";
27
- import { isSessionLogHarness } from "./types.js";
28
- export { isSessionLogHarness } from "./types.js";
29
25
  /**
30
- * The single registration point.
31
- *
32
- * Typed `as const` (not `AkmHarness[]`) so each entry keeps its literal `id`,
33
- * which lets `VALID_HARNESS_IDS` stay a literal tuple — `HarnessId`,
34
- * `z.enum(...)`, and the `platform` union all need the literal types.
26
+ * The registered harnesses, with each entry keeping its literal `id` so that
27
+ * `VALID_HARNESS_IDS` can stay a literal tuple (`HarnessId`, `z.enum(...)` and
28
+ * the `platform` union all need the literal types).
35
29
  */
36
30
  // Order is significant: VALID_HARNESS_IDS derives from this array and feeds the
37
- // committed JSON-schema enum order. The original [opencode, claude,
38
- // opencode-sdk] prefix is preserved so the pre-unification portion of the
39
- // generated schema enum does not reorder; the seven P2 harness adapters are
40
- // appended after it, which extends the enum additively (schemas/akm-config.json
41
- // is regenerated in lockstep).
42
- export const HARNESS_REGISTRY = Object.freeze([
31
+ // committed JSON-schema enum order. The original [opencode, claude] prefix is
32
+ // preserved so the pre-unification portion of the generated schema enum does not
33
+ // reorder; the seven P2 harness adapters are appended after it, which extends the
34
+ // enum additively (schemas/akm-config.json is regenerated in lockstep).
35
+ const REGISTERED = [
43
36
  new OpencodeHarness(),
44
37
  new ClaudeHarness(),
45
- new OpencodeSdkHarness(),
46
38
  new CodexHarness(),
47
39
  new CopilotHarness(),
48
40
  new PiHarness(),
@@ -50,49 +42,26 @@ export const HARNESS_REGISTRY = Object.freeze([
50
42
  new AiderHarness(),
51
43
  new AmazonqHarness(),
52
44
  new OpenhandsHarness(),
53
- ]);
45
+ ];
46
+ /** The single registration point. */
47
+ export const HARNESS_REGISTRY = Object.freeze([...REGISTERED]);
54
48
  /** Lookup by the one supported harness id. */
55
49
  export const HARNESS_BY_ID = new Map(HARNESS_REGISTRY.map((h) => [h.id, h]));
56
50
  /**
57
51
  * Canonical, ordered list of valid harness / platform ids. The Zod
58
- * `AgentPlatformSchema` enum, the agent-engine platform union, and
52
+ * `AgentPlatformSchema` enum, the harness platform union, and
59
53
  * setup's `DetectedHarness` union all derive from this so they cannot drift.
60
54
  */
61
- export const VALID_HARNESS_IDS = Object.freeze(HARNESS_REGISTRY.map((h) => h.id));
62
- /**
63
- * Harnesses that expose readable native session logs. Narrowed via the
64
- * {@link isSessionLogHarness} type-predicate (rather than a plain boolean
65
- * callback) so `sessionLogProvider` is known-present on every element — see
66
- * that function's doc comment for why a plain predicate doesn't narrow here.
67
- */
68
- export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter(isSessionLogHarness);
69
- /** Harnesses that can be dispatched as an agent CLI / SDK. */
70
- export const AGENT_DISPATCH_HARNESSES = HARNESS_REGISTRY.filter((h) => h.capabilities.agentDispatch);
71
- const idsWith = (flag) => new Set(HARNESS_REGISTRY.filter(flag).map((h) => h.id));
72
- /** Harness ids whose `capabilities.agentDispatch` is `true`. */
73
- export const HARNESS_AGENT_DISPATCH_IDS = idsWith((h) => h.capabilities.agentDispatch);
74
- /** Harness ids that confine the model-work tool policy, so unattended model work may run on them. */
75
- export const HARNESS_MODEL_WORK_IDS = idsWith((h) => h.capabilities.modelWork);
76
- /** Harness ids that can run a named native agent, so an engine may name a default `agent`. */
77
- export const HARNESS_NATIVE_AGENT_IDS = idsWith((h) => h.capabilities.nativeAgent);
55
+ export const VALID_HARNESS_IDS = Object.freeze(REGISTERED.map((h) => h.id));
56
+ /** The platforms a `harnesses` entry may name: every harness in the registry. */
57
+ export const HARNESS_CONFIG_PLATFORMS = VALID_HARNESS_IDS;
58
+ /** Harnesses that expose readable native session logs. */
59
+ export const SESSION_LOG_HARNESSES = HARNESS_REGISTRY.filter((h) => h.sessionLogProvider !== undefined);
60
+ /** Harness ids that can run a named native agent, so a harness may name a default `agent`. */
61
+ export const HARNESS_NATIVE_AGENT_IDS = new Set(HARNESS_REGISTRY.filter((h) => h.nativeAgent).map((h) => h.id));
78
62
  /**
79
63
  * Resolve an exact harness id to its descriptor, or `undefined` if unknown.
80
64
  */
81
65
  export function getHarness(id) {
82
66
  return HARNESS_BY_ID.get(id);
83
67
  }
84
- /**
85
- * Default agent-profile name for a detected harness id (#566).
86
- *
87
- * Used by `akm setup`'s headless/recommended-config path so a newly added
88
- * dispatch-capable harness gets a usable default profile name (its canonical
89
- * id) instead of falling through a hardcoded if-chain with no default. Returns
90
- * `undefined` for `"none"` or any id that is unknown / not agent-dispatch
91
- * capable.
92
- */
93
- export function defaultProfileName(detected) {
94
- const h = HARNESS_BY_ID.get(detected);
95
- if (!h?.capabilities.agentDispatch)
96
- return undefined;
97
- return h.id;
98
- }
@@ -2,120 +2,152 @@
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
- * OpenCode agent command builder (migrated from `agent/builders.ts`, #564).
5
+ * OpenCode command builder: the `opencode run` CLI of the opencode harness
6
+ * (#1244), for both majors, treated like the Claude and Codex CLIs. The user's
7
+ * OpenCode owns its config, logins and sessions; akm hands it a prompt and reads
8
+ * the reply from stdout.
6
9
  *
7
- * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
8
- * argv the `opencode` CLI expects. This is the OpenCode-specific slice of the
9
- * builder strategy; the shared infrastructure (`AgentCommandBuilder`,
10
- * `getCommandBuilder`, the default builder, flag/tool helpers) stays in
11
- * `agent/builders.ts`, which imports this builder back into `BUILTIN_BUILDERS`.
10
+ * The prompt goes on stdin: `opencode run` alters an argv message (quotes change,
11
+ * inner quotes are escaped) and a prompt that starts with `-` could be taken for
12
+ * a flag; stdin is read verbatim. akm closes it after the write, which the CLI
13
+ * needs: with stdin open it waits for more input.
12
14
  *
13
- * The builder's `platform` stays `'opencode'` (the canonical harness id). The
14
- * one thing that depends on the OpenCode major (`./version.ts`, one cached
15
- * `--version` run per binary) is `--standalone`, added on OpenCode 2 only; the
16
- * OpenCode 1 argv is byte-identical to the pre-OpenCode-2 builder's.
15
+ * Agent work adds nothing: `opencode run`, the authored args as written, `--model` when akm
16
+ * names one, `--agent` when the asset names one, and the prompt on stdin. The run is the
17
+ * user's own, on their OpenCode as they have it set up.
18
+ *
19
+ * Model work is akm's own process. It sets `OPENCODE_DISABLE_FREE_MODELS` (OpenCode 2.1.2 and
20
+ * later, where the variable first appears): with no usable provider, OpenCode 2 would
21
+ * otherwise send akm's data to its hosted free model. The variable deletes every zero-cost
22
+ * model of the `opencode` and `opencode-go` providers, so it has no place on agent work,
23
+ * where it would override a model the user chose. On OpenCode 2 model work also gets
24
+ * `--standalone`, which keeps the run to one process that ends with it (the default attaches
25
+ * to a background service that outlives the CLI, is shared across users on one port, ignores
26
+ * inline config and replays killed sessions at every start), and `--title`, which names the
27
+ * session and spares the second model request that would otherwise generate a title.
28
+ *
29
+ * A binary whose version cannot be read runs model work as OpenCode 1, with one warning that says so.
30
+ *
31
+ * Model work drops the config's `args`, keeping the model they name, as the
32
+ * Claude and Codex shells do. On OpenCode 2 it runs as {@link MODEL_WORK_AGENT},
33
+ * an agent defined inline for the run whose tools are limited to reading and
34
+ * searching, added to the user's own inline config; OpenCode 1 cannot be
35
+ * restricted and runs it unrestricted, with a one-line warning.
17
36
  */
18
- import { modelFromArgs, resolveDispatchModel, } from "../../agent/builder-shared.js";
19
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
20
- import { MODEL_WORK_AGENT_INFERENCE, opencodeInferenceConfig } from "./model-config.js";
21
- import { MODEL_WORK_OPENCODE_AGENT, modelWorkOpencodeConfig, modelWorkPluginEnv } from "./model-work-agent.js";
22
- import { detectOpencodeMajor } from "./version.js";
37
+ import { asRecord, parseJsonc } from "../../../core/common.js";
38
+ import { warnOnce } from "../../../core/warn.js";
39
+ import { modelFromArgs, withoutLeading, withoutModelFlag, } from "../harness.js";
40
+ import { detectOpencodeMajor, isOpencode2 } from "./version.js";
41
+ /** The agent OpenCode 2 runs akm's model work as, limited to reading and searching; the name also marks those sessions in the user's history (`./session-log-v2.ts`). */
42
+ export const MODEL_WORK_AGENT = "akm-model-work";
23
43
  /**
24
- * OpenCode 2's `run` attaches to a shared background service by default,
25
- * starting it when absent and leaving it running after the run; `--standalone`
26
- * runs a private server that exits with the run (and reads the
27
- * `OPENCODE_CONFIG_CONTENT` model work travels in, which the service ignores).
28
- * OpenCode 1 has no such flag. An engine whose own `args` name `--server`
29
- * chose that server, so it gets no `--standalone`. `--auto` is never passed:
30
- * a non-interactive run rejects a permission request, on both majors.
44
+ * The agent's definition, in OpenCode 2's native shape, passed inline so it merges over the user's config and is
45
+ * never written anywhere. Its permission rules are default-deny with the reading tools allowed after it (the last
46
+ * matching rule wins; measured on OpenCode 2.1.2): `*` denied removes every tool, one a plugin registers that akm has
47
+ * never heard of included, and the allows give back `read`, `glob` and `grep` and, when the akm plugin is installed,
48
+ * `akm_search`, `akm_show` and `akm_curate`. Nothing else is allowed. This limits the tools; a plugin's own `setup`
49
+ * and hooks still run.
31
50
  */
32
- const STANDALONE_FLAG = "--standalone";
33
- function standalone(major, flags) {
34
- if (major !== 2)
35
- return [];
36
- const chosen = flags.some((arg) => arg === STANDALONE_FLAG || arg === "--server" || arg.startsWith("--server="));
37
- return chosen ? [] : [STANDALONE_FLAG];
38
- }
51
+ const MODEL_WORK_AGENT_DEFINITION = {
52
+ mode: "primary",
53
+ permissions: [
54
+ { action: "*", resource: "*", effect: "deny" },
55
+ ...["read", "glob", "grep", "akm_search", "akm_show", "akm_curate"].map((action) => ({
56
+ action,
57
+ resource: "*",
58
+ effect: "allow",
59
+ })),
60
+ ],
61
+ };
62
+ const CONFIG_CONTENT_ENV = "OPENCODE_CONFIG_CONTENT";
39
63
  /**
40
- * The flags before the `--` separator of an ordinary dispatch: the engine's
41
- * `args` (without any `--model` when the request names one), then `--agent`
42
- * and `--model`. Both majors spell these the same way.
64
+ * The inline config model work runs with: the user's own `OPENCODE_CONFIG_CONTENT` as it is, with akm's agent set on
65
+ * `agents.akm-model-work`, the one key akm's definition wins. OpenCode 2 reads that native `agents` map over the
66
+ * legacy `agent` one, so a same-named entry the user keeps in `agent` is left out rather than left to conflict. The
67
+ * child's value is built from the parent's, so a provider, model or key the user keeps only there stays. It is read as
68
+ * OpenCode reads it, as JSONC (comments and trailing commas), and written back as JSON; content that reads only once
69
+ * its `{env:NAME}` references are replaced (one written outside a string) is read the way OpenCode replaces them
70
+ * ({@link withEnvReferences}). Content that is not valid JSONC holding an object either way is left out, with one
71
+ * warning.
43
72
  */
44
- function ordinaryFlags(profile, req) {
45
- const args = req.model ? [] : [...profile.args];
46
- if (req.model) {
47
- for (let index = 0; index < profile.args.length; index += 1) {
48
- const arg = profile.args[index];
49
- if (arg === undefined)
50
- continue;
51
- if (arg === "--model") {
52
- index += 1;
53
- }
54
- else if (!arg.startsWith("--model=")) {
55
- args.push(arg);
56
- }
57
- }
73
+ function modelWorkConfig() {
74
+ const content = process.env[CONFIG_CONTENT_ENV]?.trim();
75
+ const user = content ? userConfig(content) : undefined;
76
+ if (content && !user) {
77
+ warnOnce("opencode-config-content", `${CONFIG_CONTENT_ENV} is not valid JSONC holding an object, so OpenCode model work runs without it.`);
78
+ }
79
+ const config = {
80
+ ...user,
81
+ agents: { ...asRecord(user?.agents), [MODEL_WORK_AGENT]: MODEL_WORK_AGENT_DEFINITION },
82
+ };
83
+ const legacy = asRecord(user?.agent);
84
+ if (legacy && Object.hasOwn(legacy, MODEL_WORK_AGENT)) {
85
+ const { [MODEL_WORK_AGENT]: _replaced, ...others } = legacy;
86
+ config.agent = others;
58
87
  }
59
- if (req.agent) {
60
- args.push("--agent", req.agent);
88
+ return JSON.stringify(config);
89
+ }
90
+ function userConfig(content) {
91
+ return jsoncObject(content) ?? jsoncObject(withEnvReferences(content));
92
+ }
93
+ function jsoncObject(content) {
94
+ try {
95
+ return asRecord(parseJsonc(content));
61
96
  }
62
- if (req.model) {
63
- args.push("--model", resolveDispatchModel(req, profile, "opencode"));
97
+ catch {
98
+ return undefined;
64
99
  }
65
- return args;
66
100
  }
67
101
  /**
68
- * OpenCode builder: `opencode run [--standalone] [--agent <name>] [--model <m>] -- "<prompt>"`
69
- * (`--standalone` on OpenCode 2 only).
70
- *
71
- * `opencode run` has no system-prompt option (1.18.25 prints its usage and
72
- * exits 1 on `--system-prompt`), so the shared lowerer composes a persona
73
- * into the prompt.
74
- *
75
- * Tool policy is omitted: opencode manages tool access through its own agent
76
- * config files, not via CLI flags. The one exception is the model-work tool
77
- * policy: the builder injects its confined agent through
78
- * `OPENCODE_CONFIG_CONTENT` and selects it with `--agent`. That command is
79
- * akm's own: the engine's `args` are left out, because one such as `--attach`
80
- * or `--dir` would move the run out of the injected config or the scratch
81
- * working directory. Only the model they name is kept.
82
- *
83
- * Model work's agent carries the request's inference options
84
- * (`./model-config.ts`). Any other dispatch injects nothing and carries none, so
85
- * the model's own opencode config applies: set inference there.
102
+ * `{env:NAME}` replaced as OpenCode replaces it in this variable before it parses it (`ConfigVariable.substitute`):
103
+ * by the variable's value, or nothing when it is unset or empty, as written where the result reads as JSONC, else
104
+ * escaped as the inside of a JSON string. A `{file:path}` is left for the OpenCode akm runs, which replaces it against
105
+ * its own directory, as it would in-process.
86
106
  */
107
+ function withEnvReferences(content) {
108
+ const replaced = (escaped) => content.replace(/\{env:([^}]+)\}/g, (_, name) => {
109
+ const value = process.env[name] || "";
110
+ return escaped ? JSON.stringify(value).slice(1, -1) : value;
111
+ });
112
+ const raw = replaced(false);
113
+ try {
114
+ parseJsonc(raw);
115
+ return raw;
116
+ }
117
+ catch {
118
+ return replaced(true);
119
+ }
120
+ }
121
+ const NO_FREE_MODELS = { OPENCODE_DISABLE_FREE_MODELS: "1" };
87
122
  export const opencodeBuilder = {
88
- platform: "opencode",
89
- personaChannel: "prompt",
90
- lower: createAgentRequestLowerer({
91
- adapter: "opencode",
92
- personaChannel: "prompt",
93
- tools: "none",
94
- inference: MODEL_WORK_AGENT_INFERENCE,
95
- }),
96
- build(profile, req) {
97
- const major = detectOpencodeMajor(profile.bin).major;
98
- if (req.modelWork) {
99
- const model = req.model ?? modelFromArgs(profile.args);
100
- const { agentOptions } = opencodeInferenceConfig(req.inference, true);
101
- return {
102
- argv: [
103
- profile.bin,
104
- "run",
105
- ...standalone(major, []),
106
- "--agent",
107
- MODEL_WORK_OPENCODE_AGENT,
108
- ...(model ? ["--model", model] : []),
109
- "--",
110
- req.prompt,
111
- ],
112
- env: {
113
- ...modelWorkPluginEnv(),
114
- OPENCODE_CONFIG_CONTENT: JSON.stringify(modelWorkOpencodeConfig(agentOptions)),
115
- },
116
- };
123
+ build({ bin, args }, req) {
124
+ const agent = req.agent ? ["--agent", req.agent] : [];
125
+ const model = req.model ? ["--model", req.model] : [];
126
+ if (req.prompt === undefined) {
127
+ // An interactive launch is the TUI, which `run` (headless) is not.
128
+ const authored = withoutLeading(args, "run");
129
+ return { argv: [bin, ...(req.model ? withoutModelFlag(authored) : authored), ...agent, ...model] };
130
+ }
131
+ if (!req.modelWork) {
132
+ return { argv: [bin, ...(req.model ? withoutModelFlag(args) : args), ...agent, ...model], stdin: req.prompt };
133
+ }
134
+ const oc2 = isOpencode2(bin);
135
+ if (!oc2 && detectOpencodeMajor(bin).reportedMajor === undefined) {
136
+ warnOnce(`opencode-version-unreadable:${bin}`, `Could not read the version of ${bin}, so akm runs its model work as OpenCode 1: no --standalone (an OpenCode 2 would attach to its shared background service) and unrestricted. Check \`${bin} --version\`.`);
137
+ }
138
+ if (!oc2) {
139
+ warnOnce("opencode-1-model-work", "OpenCode 1 cannot restrict its tools, so model work on it runs unrestricted, in a scratch directory. OpenCode 2 limits its tools to reading and searching.");
117
140
  }
118
- const flags = ordinaryFlags(profile, req);
119
- return { argv: [profile.bin, ...flags, ...standalone(major, flags), "--", req.prompt] };
141
+ const named = req.model ?? modelFromArgs(args);
142
+ return {
143
+ argv: [
144
+ bin,
145
+ "run",
146
+ ...(oc2 ? ["--standalone", "--title", "akm", "--agent", MODEL_WORK_AGENT] : []),
147
+ ...(named ? ["--model", named] : []),
148
+ ],
149
+ env: { ...NO_FREE_MODELS, ...(oc2 ? { [CONFIG_CONTENT_ENV]: modelWorkConfig() } : {}) },
150
+ stdin: req.prompt,
151
+ };
120
152
  },
121
153
  };
@@ -1,55 +1,33 @@
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
- /**
5
- * OpenCode harness (#564).
6
- *
7
- * Per-harness barrel that gathers the OpenCode integration surfaces previously
8
- * scattered across the codebase:
9
- * - session-log reader → ./session-log.ts (OpenCodeProvider)
10
- * - agent command builder → ./agent-builder.ts (opencodeBuilder)
11
- * - config importer → ./config-import.ts (openCodeImporter)
12
- *
13
- * It also defines {@link OpencodeHarness}, the {@link AkmHarness} descriptor
14
- * that `HARNESS_REGISTRY` registers.
15
- *
16
- * id normalization: OpenCode's canonical id (`'opencode'`) is also its runtime
17
- * identity and session-log provider name — there is no historical split (unlike
18
- * Claude Code's 'claude' vs 'claude'), so no alias bridge is needed.
19
- */
20
- import { OPENCODE_ENV_PASSTHROUGH } from "../../../core/spawn-env.js";
21
- import { caps } from "../shared.js";
22
- import { BaseHarness } from "../types.js";
23
4
  import { opencodeBuilder } from "./agent-builder.js";
24
- import { openCodeImporter } from "./config-import.js";
25
5
  import { OpenCodeProvider } from "./session-log.js";
6
+ import { isOpencode2, OPENCODE_BIN } from "./version.js";
26
7
  export { opencodeBuilder } from "./agent-builder.js";
27
- export { openCodeImporter } from "./config-import.js";
28
8
  export { OpenCodeProvider } from "./session-log.js";
29
9
  /**
30
10
  * OpenCode.
31
11
  *
32
12
  * Canonical id is `'opencode'`; it has no distinct runtime identity or alias.
33
13
  */
34
- export class OpencodeHarness extends BaseHarness {
14
+ export class OpencodeHarness {
35
15
  id = "opencode";
36
16
  displayName = "OpenCode";
37
17
  // Home-relative config dir scanned by `akm setup` (#567). OpenCode has a
38
18
  // session-log provider, so offering it as a stash source is functional.
39
19
  setupDetectionDir = ".config/opencode";
40
- agentBuilder = opencodeBuilder;
41
- configImporter = openCodeImporter;
42
- profile = { bin: "opencode", args: ["run"], envPassthrough: OPENCODE_ENV_PASSTHROUGH };
20
+ build = opencodeBuilder.build;
21
+ profile = { bin: OPENCODE_BIN, args: ["run"] };
43
22
  // ── Workflow-engine descriptor (plan §"Capability matrix", P2) ────────────
44
23
  // Session-id env marker for run attribution.
45
24
  identityEnv = ["OPENCODE_SESSION_ID"];
46
25
  sessionLogProvider = () => new OpenCodeProvider();
47
- capabilities = caps({
48
- sessionLogs: true,
49
- agentDispatch: true,
50
- detection: true,
51
- modelWork: true,
52
- nativeAgent: true,
53
- configImport: true,
54
- });
26
+ systemPrompt = false;
27
+ nativeAgent = true;
28
+ // Model work has its tools limited to reading and searching on OpenCode 2 only: its CLI takes an agent defined
29
+ // inline for the run (./agent-builder.ts), OpenCode 1's cannot be restricted and runs it unrestricted, with a warning.
30
+ // Lowering asks for the limited run either way; setup asks whether the installed OpenCode can give it.
31
+ confinable = true;
32
+ confinableInstalled = (bin) => isOpencode2(bin);
55
33
  }