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
@@ -1,138 +0,0 @@
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
- * Amazon Q Developer CLI agent command builder (P2, plan §"The adapter
6
- * contract" step 2 / §"Capability matrix").
7
- *
8
- * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
9
- * headless argv the `q` CLI expects. Per the capability matrix the headless
10
- * invocation is:
11
- *
12
- * q chat --no-interactive --trust-all-tools "<prompt>"
13
- *
14
- * with `--model <m>` for model selection and `--resume` for resume — NOTE:
15
- * unlike every other harness's resume, Q's `--resume` is a bare flag that
16
- * replays the previous conversation *of the working directory*; it takes no
17
- * session id. There is nothing to thread from `workflow_run_units` — akm's own
18
- * unit rows remain the durable resume source of truth regardless (plan
19
- * §"Session, MCP, and identity across harnesses").
20
- *
21
- * Platform-specific mapping decisions (all localized here, per the adapter
22
- * contract):
23
- *
24
- * - **subcommand** — headless dispatch is the `chat` subcommand. The builder
25
- * prepends `chat` itself (mirroring the codex builder's `exec` handling); a
26
- * user profile that already pins `chat` as its first arg is not doubled.
27
- * - **prompt** — the trailing positional `[INPUT]` argument of `q chat`,
28
- * preceded by the `--` end-of-options separator (mirroring the
29
- * claude/codex/pi builders) so a prompt whose text begins with `-`/`--` can
30
- * never be parsed as flags. `--no-interactive` makes Q print the response
31
- * and exit instead of opening the REPL.
32
- * - **systemPrompt** — `q chat` has no system-prompt flag (persona/context
33
- * comes from Q's own agent config files), so the system prompt is folded
34
- * into the positional payload ahead of the task prompt, separated by a
35
- * blank line.
36
- * - **schema** — the matrix places Q in the NO-structured-output tier
37
- * ("via prompt+validate": *(none documented)* — there is no `--json` or
38
- * `--output-format` to ask for). The JSON Schema therefore reaches it only
39
- * as the instruction the shared request lowering appends to the prompt.
40
- * Stdout stays plain text; `./result-extractor.ts` strips terminal framing
41
- * and the engine's shared embedded-JSON parse + retry-until-valid loop does
42
- * the rest. No schema temp file is written — that seam is codex-only
43
- * (`--output-schema`); inventing a flag here would produce a silently
44
- * broken command.
45
- * - **tools** — a string/array tool policy maps to Q's documented
46
- * `--trust-tools=<t1,t2>` allowlist flag (equals-joined, per `q chat
47
- * --help`). With no policy at all, headless runs need autonomy, so
48
- * `--trust-all-tools` is emitted per the matrix. A *structured* policy
49
- * object is NOT expressible as Q flags; it is deliberately dropped without
50
- * falling back to `--trust-all-tools` (never silently widen a restriction)
51
- * — Q then refuses untrusted tool actions in non-interactive mode, which is
52
- * the conservative failure mode.
53
- * - **inference** — not translated: the shared lowering reports each field of
54
- * the request's inference as untranslated.
55
- *
56
- * Registered: `amazonqBuilder` is `AmazonqHarness.agentBuilder`
57
- * (`./index.ts`), one of the ten harnesses `HARNESS_REGISTRY` constructs
58
- * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
59
- * that registry, so this builder is reachable under the `"amazonq"` platform
60
- * name without any further wiring.
61
- */
62
- import { resolveDispatchModel } from "../../agent/builder-shared.js";
63
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
64
- /** Canonical harness/platform id used for model-alias resolution. */
65
- export const AMAZONQ_PLATFORM = "amazonq";
66
- /**
67
- * Split a tool policy into individual tool names for `--trust-tools`.
68
- * Strings are comma-separated lists; arrays are taken as-is. Structured
69
- * policy objects return `undefined` (not expressible as Q flags — see
70
- * module doc).
71
- */
72
- function toolPolicyEntries(tools) {
73
- if (typeof tools === "string") {
74
- return tools
75
- .split(",")
76
- .map((t) => t.trim())
77
- .filter(Boolean);
78
- }
79
- if (Array.isArray(tools)) {
80
- return tools.map((t) => t.trim()).filter(Boolean);
81
- }
82
- return undefined;
83
- }
84
- /** Assemble the positional prompt payload: optional system prompt, then the task prompt. */
85
- function buildPromptPayload(req) {
86
- const sections = [];
87
- if (req.systemPrompt)
88
- sections.push(req.systemPrompt);
89
- sections.push(req.prompt);
90
- return sections.join("\n\n");
91
- }
92
- /**
93
- * Amazon Q Developer CLI builder.
94
- * Command shape:
95
- * q chat --no-interactive (--trust-all-tools | --trust-tools=<t1,t2>)
96
- * [--model <m>] -- "<systemPrompt?\n\nprompt>"
97
- */
98
- export const amazonqBuilder = {
99
- platform: AMAZONQ_PLATFORM,
100
- personaChannel: "prompt",
101
- lower: createAgentRequestLowerer({
102
- adapter: AMAZONQ_PLATFORM,
103
- personaChannel: "prompt",
104
- tools: "flat",
105
- }),
106
- build(profile, req) {
107
- // Built-in q profiles would ship `args: []`; headless dispatch is the
108
- // `chat` subcommand. Don't double it when a user profile already pins it.
109
- const extra = profile.args[0] === "chat" ? profile.args.slice(1) : [...profile.args];
110
- const args = ["chat", ...extra];
111
- // Print the response and exit — required for captured dispatch.
112
- args.push("--no-interactive");
113
- if (req.tools) {
114
- // Structured policy objects (entries === undefined) emit NO trust
115
- // flags: dropping a restriction must never widen to --trust-all-tools.
116
- const entries = toolPolicyEntries(req.tools);
117
- if (entries !== undefined) {
118
- // Q's documented allowlist form is equals-joined and comma-separated
119
- // (`--trust-tools=fs_read,fs_write`); an empty list trusts no tools.
120
- args.push(`--trust-tools=${entries.join(",")}`);
121
- }
122
- }
123
- else {
124
- // Headless default per the capability matrix: units must run without
125
- // interactive tool-approval prompts.
126
- args.push("--trust-all-tools");
127
- }
128
- if (req.model) {
129
- const resolved = resolveDispatchModel(req, profile, AMAZONQ_PLATFORM);
130
- args.push("--model", resolved);
131
- }
132
- // No system-prompt flag exists on `q chat` — it travels in the positional
133
- // payload, after the end-of-options separator.
134
- args.push("--");
135
- args.push(buildPromptPayload(req));
136
- return { argv: [profile.bin, ...args] };
137
- },
138
- };
@@ -1,48 +0,0 @@
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
- const ESC = "\u001B";
5
- const BEL = "\u0007";
6
- /**
7
- * Matches ANSI CSI sequences (colors, cursor movement, erase-line) and OSC
8
- * sequences (title, hyperlink) terminated by BEL or ST. Built via the RegExp
9
- * constructor so the control characters live in named string constants
10
- * instead of regex-literal escapes.
11
- */
12
- const ANSI_SEQUENCE = new RegExp(`${ESC}\\[[0-9;?]*[ -/]*[@-~]` + `|${ESC}\\][^${BEL}${ESC}]*(?:${BEL}|${ESC}\\\\)`, "g");
13
- /**
14
- * Resolve carriage-return overwrites within one physical line: a terminal
15
- * would redraw from column 0 at each `\r`, so only the segment after the last
16
- * `\r` survives (spinner frames like "⠋ Thinking..." disappear exactly as
17
- * they do on screen). A trailing bare `\r` (CRLF line endings) is handled by
18
- * splitting on `\r?\n` before this runs.
19
- */
20
- function resolveCarriageReturns(line) {
21
- const lastCr = line.lastIndexOf("\r");
22
- return lastCr === -1 ? line : line.slice(lastCr + 1);
23
- }
24
- /** Strip terminal framing from raw captured stdout. See module doc, rule 1. */
25
- export function stripTerminalFraming(raw) {
26
- const lines = raw.split(/\r?\n/).map((line) => resolveCarriageReturns(line).replace(ANSI_SEQUENCE, ""));
27
- // Drop Q's "> " response marker from the first non-empty line only — deeper
28
- // occurrences may be legitimate content (markdown blockquotes).
29
- for (let i = 0; i < lines.length; i++) {
30
- const line = lines[i] ?? "";
31
- if (line.trim().length === 0)
32
- continue;
33
- if (line.startsWith("> "))
34
- lines[i] = line.slice(2);
35
- break;
36
- }
37
- return lines.join("\n").trim();
38
- }
39
- /**
40
- * Normalize a raw Amazon Q run result into `{ text, sessionId? }`.
41
- * See the module doc for the rules.
42
- */
43
- export const amazonqResultExtractor = (result) => {
44
- const sessionId = result.sessionId;
45
- // Rule 2: a pre-parsed whole-stdout JSON *string* is the answer itself.
46
- const text = typeof result.parsed === "string" ? result.parsed.trim() : stripTerminalFraming(result.stdout);
47
- return { text, ...(sessionId ? { sessionId } : {}) };
48
- };
@@ -1,106 +0,0 @@
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
- * Claude Code agent command builder (migrated from `agent/builders.ts`, #563).
6
- *
7
- * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
8
- * argv the `claude` CLI expects. This is the Claude-specific slice of the
9
- * builder strategy; the shared infrastructure (`AgentCommandBuilder`,
10
- * `getCommandBuilder`, the OpenCode/default builders, flag/tool helpers) stays
11
- * in `agent/builders.ts`, which imports this builder back into
12
- * `BUILTIN_BUILDERS`.
13
- *
14
- * ## Structured output
15
- *
16
- * For a schema-bearing request this builder emits `--output-format json`,
17
- * which wraps the run in a RESULT ENVELOPE
18
- * (`{"type":"result","result":"<final answer>","session_id":"…", …}`); the
19
- * shared request lowering has already appended the schema instruction to the
20
- * prompt. The envelope is unwrapped by `./result-extractor.ts`, and the
21
- * engine's shared `runStructured` retry-until-valid loop validates the
22
- * extracted text against the schema (hinted output is trusted but verified).
23
- * Without a schema the argv carries no output flag.
24
- *
25
- * Claude Code 2.1.283 also has `--json-schema <schema>` (JSON Schema for
26
- * structured output validation, with `--print`). akm does not pass it; the
27
- * instruction and the validation loop above are what enforce a schema.
28
- *
29
- * The builder's `platform` stays `'claude'` (the canonical harness id).
30
- */
31
- import { modelFromArgs, normalizeTools, resolveDispatchModel, } from "../../agent/builder-shared.js";
32
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
33
- /** The model-work tool policy on Claude Code: read, edit in the working directory, `akm search`, `akm show`. */
34
- export const MODEL_WORK_CLAUDE_FLAGS = Object.freeze([
35
- "--restricted",
36
- "--strict-mcp-config",
37
- "--tools",
38
- "Read,Edit,Bash",
39
- "--allowedTools",
40
- "Read,Edit,Bash(akm search *),Bash(akm show *)",
41
- "--permission-mode",
42
- "dontAsk",
43
- ]);
44
- /**
45
- * Claude Code builder.
46
- * Command shape:
47
- * claude [--agent <name>] [--system-prompt "..."] [--model <m>] [--allowedTools <t>]
48
- * [--output-format json] --print -- "<prompt>"
49
- *
50
- * --print switches Claude Code to non-interactive captured output mode.
51
- *
52
- * The model-work tool policy lowers to {@link MODEL_WORK_CLAUDE_FLAGS} in place
53
- * of the engine's `args` and `--allowedTools`, verified against Claude Code
54
- * 2.1.283 and a local stub:
55
- * - `--restricted` ignores the user, project and local settings files (whose
56
- * allow rules would otherwise pre-approve any command or path) and confines
57
- * the file tools to the working directory;
58
- * - `--strict-mcp-config` starts no MCP server, and `--tools` offers only
59
- * Read, Edit and Bash;
60
- * - `--allowedTools` pre-approves Read, Edit, `akm search` and `akm show`,
61
- * and `--permission-mode dontAsk` denies everything else instead of
62
- * prompting, including a compound, redirected or substituted command.
63
- * The engine's `args` are left out because `--add-dir`, `--settings` or a
64
- * second `--allowedTools` would widen that. Only the model they name is kept.
65
- */
66
- export const claudeBuilder = {
67
- platform: "claude",
68
- personaChannel: "native",
69
- lower: createAgentRequestLowerer({
70
- adapter: "claude",
71
- personaChannel: "native",
72
- tools: "all",
73
- }),
74
- build(profile, req) {
75
- const modelWork = req.modelWork === true;
76
- const args = modelWork ? [...MODEL_WORK_CLAUDE_FLAGS] : [...profile.args];
77
- if (req.agent) {
78
- args.push("--agent", req.agent);
79
- }
80
- if (req.systemPrompt) {
81
- args.push("--system-prompt", req.systemPrompt);
82
- }
83
- if (req.model) {
84
- const resolved = resolveDispatchModel(req, profile, "claude");
85
- args.push("--model", resolved);
86
- }
87
- else if (modelWork) {
88
- const model = modelFromArgs(profile.args);
89
- if (model)
90
- args.push("--model", model);
91
- }
92
- if (req.tools) {
93
- args.push("--allowedTools", normalizeTools(req.tools));
94
- }
95
- if (req.schema) {
96
- // Structured unit: request the documented JSON result envelope so
97
- // `./result-extractor.ts` can pull the final answer + session id.
98
- args.push("--output-format", "json");
99
- }
100
- // --print = non-interactive, outputs to stdout — required for captured mode
101
- args.push("--print");
102
- args.push("--");
103
- args.push(req.prompt);
104
- return { argv: [profile.bin, ...args] };
105
- },
106
- };
@@ -1,67 +0,0 @@
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
- * Claude Code LLM-config importer (migrated from `setup/harness-config-import.ts`,
6
- * #563).
7
- *
8
- * Detects a Claude Code installation (filesystem only, no network) and reads
9
- * its config to extract LLM connection details. API key VALUES are never
10
- * stored — only the env var name that holds them. `ClaudeHarness` declares it
11
- * as its `configImporter`.
12
- *
13
- * Behaviour-preserving relocation.
14
- */
15
- import fs from "node:fs";
16
- import path from "node:path";
17
- import { homeDir } from "../shared.js";
18
- /**
19
- * Imports LLM config from a Claude Code installation.
20
- *
21
- * Claude Code stores settings in `~/.claude/settings.json` or `~/.claude.json`.
22
- * The model field may appear at the root or under `env.ANTHROPIC_MODEL`.
23
- * The API key is always `ANTHROPIC_API_KEY`.
24
- */
25
- export const claudeCodeImporter = {
26
- harnessName: "Claude Code",
27
- detect() {
28
- const home = homeDir();
29
- // Claude Code is installed if the ~/.claude/ directory exists
30
- return fs.existsSync(path.join(home, ".claude"));
31
- },
32
- importConfig() {
33
- const home = homeDir();
34
- // Try ~/.claude/settings.json, then ~/.claude.json
35
- const candidates = [path.join(home, ".claude", "settings.json"), path.join(home, ".claude.json")];
36
- for (const filePath of candidates) {
37
- try {
38
- if (!fs.existsSync(filePath))
39
- continue;
40
- const raw = JSON.parse(fs.readFileSync(filePath, "utf8"));
41
- // Claude Code settings: model may be at root or nested under env
42
- const envBlock = raw.env;
43
- const model = typeof raw.model === "string"
44
- ? raw.model
45
- : typeof envBlock?.ANTHROPIC_MODEL === "string"
46
- ? String(envBlock.ANTHROPIC_MODEL)
47
- : undefined;
48
- return {
49
- harnessName: "Claude Code",
50
- provider: "anthropic",
51
- model: model ?? "claude-sonnet-4-5",
52
- apiKeyEnvVar: "ANTHROPIC_API_KEY",
53
- };
54
- }
55
- catch {
56
- // try next candidate
57
- }
58
- }
59
- // ~/.claude exists but no readable settings — still return basic Anthropic config
60
- return {
61
- harnessName: "Claude Code",
62
- provider: "anthropic",
63
- model: "claude-sonnet-4-5",
64
- apiKeyEnvVar: "ANTHROPIC_API_KEY",
65
- };
66
- },
67
- };
@@ -1,67 +0,0 @@
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
- * Claude Code CLI result extractor (Codex round-3 finding A; plan §"The adapter
6
- * contract" step 3 / §"Structured-output normalization", tier "native-json").
7
- *
8
- * Normalizes one raw {@link AgentRunResult} from a headless `claude -p` run into
9
- * `{ text, sessionId? }` — the {@link AgentResultExtraction} seam. The engine's
10
- * shared schema-validation / retry-until-valid loop runs *after* this; the
11
- * extractor only strips transport framing.
12
- *
13
- * A schema-bearing unit is dispatched with `--output-format json` (see
14
- * `./agent-builder.ts`), so stdout is Claude Code's documented RESULT ENVELOPE —
15
- * a single JSON object:
16
- *
17
- * {"type":"result","subtype":"success","is_error":false,
18
- * "result":"<final answer>","session_id":"<uuid>","total_cost_usd":…,"usage":…}
19
- *
20
- * The final answer the model produced lives in `result` (a string); the
21
- * harness-native session id in `session_id`, stored opportunistically on the
22
- * unit row for `claude --resume <id>` (akm never depends on it —
23
- * `workflow_run_units` stays the source of truth).
24
- *
25
- * A SCHEMALESS unit is dispatched WITHOUT `--output-format json`, so stdout is
26
- * plain text — passed through verbatim (untrimmed) so the schemaless dispatch
27
- * path is byte-identical to the pre-extractor behaviour. Only a genuine result
28
- * envelope (a `type: "result"` object, or one carrying both a string `result`
29
- * and a `session_id`) is unwrapped; anything else degrades to raw pass-through,
30
- * so a point-release envelope rename fails soft (the engine's embedded-JSON
31
- * parsing still runs downstream for schema units) rather than hard.
32
- */
33
- import { asNonEmptyString, isRecord, tryParseJson } from "../../../core/common.js";
34
- /**
35
- * Is this parsed object Claude Code's `--output-format json` RESULT ENVELOPE
36
- * (rather than a bare JSON answer a schema unit produced without the flag)? A
37
- * genuine envelope declares `type: "result"`, or carries the two envelope-only
38
- * fields together (a string `result` AND a `session_id`). A bare structured
39
- * answer — `{"result":"ok"}` — carries neither marker, so it is passed through
40
- * raw and the engine's schema validator sees the whole object.
41
- */
42
- function isResultEnvelope(value) {
43
- if (value.type === "result")
44
- return true;
45
- return typeof value.result === "string" && asNonEmptyString(value.session_id) !== undefined;
46
- }
47
- /**
48
- * Normalize a raw claude run result into `{ text, sessionId? }`. See the module
49
- * doc for the two stdout shapes (JSON result envelope vs plain text).
50
- */
51
- export const claudeResultExtractor = (result) => {
52
- const fallbackSessionId = result.sessionId;
53
- const raw = result.stdout;
54
- const trimmed = raw.trim();
55
- // Only attempt an envelope parse when stdout looks like a single JSON object
56
- // (`--output-format json`). A plain-text run is passed through UNCHANGED
57
- // (untrimmed) so schemaless dispatch stays byte-identical to today.
58
- if (trimmed.startsWith("{")) {
59
- const whole = result.parsed !== undefined ? result.parsed : tryParseJson(trimmed);
60
- if (isRecord(whole) && isResultEnvelope(whole)) {
61
- const text = typeof whole.result === "string" ? whole.result : trimmed;
62
- const sessionId = asNonEmptyString(whole.session_id) ?? fallbackSessionId;
63
- return { text, ...(sessionId ? { sessionId } : {}) };
64
- }
65
- }
66
- return { text: raw, ...(fallbackSessionId ? { sessionId: fallbackSessionId } : {}) };
67
- };
@@ -1,150 +0,0 @@
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
- * OpenAI Codex CLI agent command builder (P2, plan §"The adapter contract" /
6
- * §"Capability matrix").
7
- *
8
- * Translates a platform-agnostic {@link AgentDispatchRequest} into the exact
9
- * headless argv the `codex` CLI expects:
10
- *
11
- * codex exec --sandbox workspace-write [--model <m>] --json [--output-schema <file>] -- "<prompt>"
12
- *
13
- * Capability-matrix facts this builder encodes (July 2026 research):
14
- * - Headless invocation is the `exec` subcommand (`codex exec "<p>"`), not a
15
- * flag. The built-in codex profiles carry `args: []`, so the builder
16
- * prepends `exec` itself; a user profile that already pins `exec` as its
17
- * first arg is not doubled.
18
- * - `--json` switches stdout to a JSONL event stream — the input contract of
19
- * `./result-extractor.ts`. Always emitted, mirroring how the Claude builder
20
- * always emits `--print`: dispatch is the captured, non-interactive path.
21
- * - Codex is the NATIVE-SCHEMA tier (plan §"Structured-output
22
- * normalization"): `req.schema` is written to a file and passed via
23
- * `--output-schema <file>`. The file is named by the hash of the schema
24
- * and lives in akm's cache dir, so a schema is written once however many
25
- * units dispatch with it: `BuiltCommand` has no post-run hook, and the
26
- * spawned process reads the file after `build()` returns, so a file per
27
- * dispatch could only leak (#1051). The engine still validates the output
28
- * defensively (the constrained output is trusted but verified).
29
- * - `codex exec` has no system-prompt flag; `req.systemPrompt` is folded
30
- * into the prompt payload (system text first, blank line, then the task),
31
- * after the `--` end-of-options separator so it can never be parsed as a
32
- * flag.
33
- * - Tool policy is omitted, but the builder DOES inject `--sandbox
34
- * workspace-write` so dispatched units can write to their working
35
- * directory. `codex exec` defaults to a read-only sandbox that silently
36
- * blocks file writes; without this flag the unit returns "workspace is
37
- * read-only" and the engine marks the step complete with no real mutation.
38
- * `--ask-for-approval` is NOT injected — that flag only exists on the
39
- * interactive `codex` command, not on `codex exec`, and exec mode is
40
- * already non-approval-blocking. Profile-supplied `--sandbox` flags
41
- * (long or short form) are preserved (not duplicated).
42
- * - Resume is the `codex exec resume <id>` SUBCOMMAND, not a flag, so it is
43
- * not expressible through `AgentDispatchRequest` (which has no session
44
- * field yet); {@link codexResumeArgs} exposes the argv prefix for the
45
- * integration task that wires session-id reuse from `workflow_run_units`.
46
- * - The request's inference is not translated: the shared lowering reports
47
- * each field as untranslated. codex would take `reasoningEffort` as
48
- * `-c model_reasoning_effort=<v>`, which is left to the integration task.
49
- *
50
- * Registered: `codexBuilder` is `CodexHarness.agentBuilder` (`./index.ts`),
51
- * one of the ten harnesses `HARNESS_REGISTRY` constructs
52
- * (`harnesses/index.ts`); `agent/builders.ts` derives `BUILTIN_BUILDERS` from
53
- * that registry, so this builder is reachable under the `"codex"` platform
54
- * name without any further wiring.
55
- */
56
- import { mkdirSync } from "node:fs";
57
- import { join } from "node:path";
58
- import { writeFileAtomic } from "../../../core/common.js";
59
- import { getCacheDir } from "../../../core/paths.js";
60
- import { sha256Hex } from "../../../runtime.js";
61
- import { resolveDispatchModel } from "../../agent/builder-shared.js";
62
- import { createAgentRequestLowerer } from "../../agent/request-lowering.js";
63
- /**
64
- * Write a node's JSON Schema to a file for `--output-schema`, named by the hash
65
- * of its text, in akm's cache dir. Returns the absolute file path (the value
66
- * handed to the flag).
67
- *
68
- * The same schema is the same file, so concurrent fan-out units share it, and
69
- * the atomic rename makes a write of identical bytes safe under a reader: no
70
- * unit can see a half-written schema, and none removes it from another. Nothing
71
- * is cleaned up, because nothing accumulates but one file per distinct schema.
72
- */
73
- export function writeCodexOutputSchemaFile(schema) {
74
- const text = `${JSON.stringify(schema, null, 2)}\n`;
75
- const dir = join(getCacheDir(), "codex-output-schemas");
76
- mkdirSync(dir, { recursive: true });
77
- const file = join(dir, `${sha256Hex(text)}.json`);
78
- writeFileAtomic(file, text);
79
- return file;
80
- }
81
- /**
82
- * Argv prefix that resumes a previous codex session: `exec resume <id>`.
83
- * Codex resume is a subcommand chain, not a flag. The harness-native session
84
- * id comes from the unit row (stored opportunistically by the result
85
- * extractor); akm never depends on it (plan §"Session, MCP, and identity").
86
- */
87
- export function codexResumeArgs(sessionId) {
88
- return ["exec", "resume", sessionId];
89
- }
90
- /**
91
- * Return `base` plus the `--sandbox workspace-write` flag that makes `codex exec`
92
- * able to write to its working directory. `codex exec` defaults to a read-only
93
- * sandbox that silently blocks file writes — without this flag the unit returns
94
- * "workspace is read-only" and the engine marks the step complete with no real
95
- * mutation. If the profile already pins `--sandbox` (long or short form) the
96
- * default is not duplicated.
97
- *
98
- * Note: `--ask-for-approval` is an *interactive* codex flag only — `codex exec`
99
- * does not accept it (it errors with "unexpected argument"). Non-interactive
100
- * exec mode is implicitly non-approval-blocking; `--sandbox workspace-write`
101
- * alone is sufficient for dispatched units.
102
- */
103
- function ensureSandboxFlags(base) {
104
- const out = [...base];
105
- if (!out.includes("--sandbox") && !out.includes("-s")) {
106
- out.push("--sandbox", "workspace-write");
107
- }
108
- return out;
109
- }
110
- /**
111
- * OpenAI Codex builder.
112
- * Command shape: codex exec --sandbox workspace-write [--model <m>] --json [--output-schema <file>] -- "<prompt>"
113
- */
114
- export const codexBuilder = {
115
- platform: "codex",
116
- personaChannel: "prompt",
117
- lower: createAgentRequestLowerer({
118
- adapter: "codex",
119
- personaChannel: "prompt",
120
- tools: "none",
121
- }),
122
- build(profile, req) {
123
- // Built-in codex profiles ship `args: []`; headless dispatch is the `exec`
124
- // subcommand. Don't double it when a user profile already pins it.
125
- const extra = profile.args[0] === "exec" ? profile.args.slice(1) : [...profile.args];
126
- // `codex exec` defaults to a read-only sandbox that silently blocks file
127
- // writes — dispatched units would return "workspace is read-only" and the
128
- // engine would mark them complete with no real mutation. Force
129
- // `workspace-write` (writes scoped to cwd) unless the profile already pins
130
- // its own --sandbox flag (`--ask-for-approval` is not injectable here —
131
- // see ensureSandboxFlags).
132
- const sandboxArgs = ensureSandboxFlags(extra);
133
- const args = ["exec", ...sandboxArgs];
134
- if (req.model) {
135
- const resolved = resolveDispatchModel(req, profile, "codex");
136
- args.push("--model", resolved);
137
- }
138
- // JSONL event stream on stdout — the codex result extractor's input.
139
- args.push("--json");
140
- if (req.schema) {
141
- // Native-schema tier: pass the node schema straight through.
142
- args.push("--output-schema", writeCodexOutputSchemaFile(req.schema));
143
- }
144
- // No system-prompt flag exists on `codex exec` — fold it into the prompt.
145
- const prompt = req.systemPrompt ? `${req.systemPrompt}\n\n${req.prompt}` : req.prompt;
146
- args.push("--");
147
- args.push(prompt);
148
- return { argv: [profile.bin, ...args] };
149
- },
150
- };