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
@@ -9,6 +9,107 @@ current-truth reference.
9
9
 
10
10
  ---
11
11
 
12
+ ## Invariants
13
+
14
+ These behaviors hold across every command. Each names the test that pins it;
15
+ one that names none is held by review. The rules for how the code itself is
16
+ written are in [Core Principles](akm-core-principles.md).
17
+
18
+ - **Files are the truth.** Capabilities are files in bundles. `index.db` is
19
+ a derived view that `akm index` rebuilds; `state.db` holds akm's
20
+ bookkeeping (events, proposals, runs, salience), never capability
21
+ content; `logs.db` holds purgeable log lines. Every change akm makes to a
22
+ capability lands as a file: an accepted proposal becomes the asset, memory
23
+ inference writes derived children, retirement leaves an archive and a
24
+ tombstone, extraction writes session assets. Pinned by
25
+ `tests/integration/indexer/ensure-index-serve.test.ts`.
26
+ - **One local retrieval layer.** Every source materializes to disk and is
27
+ indexed the same way; `show` resolves through the index and reads from
28
+ disk. Registry results are opt-in and arrive in `registryHits`, never
29
+ merged into `hits`. A source provider fetches and refreshes and implements
30
+ no search or show, so source resolution, registry install and provider
31
+ plumbing stay behind indexing and the path from `search` or `curate` to
32
+ `show` is a lookup in the local index. Pinned by the `SourceProvider`
33
+ interface in `src/sources/provider.ts` and
34
+ `tests/integration/output-baseline.test.ts`.
35
+ - **Discovery chooses, show delivers.** `search` and `curate` return enough
36
+ to pick an asset and its `ref` at every detail level (a registry hit
37
+ carries `installRef` instead); `show` returns the payload; `--detail agent`
38
+ results also carry `path` and `editable`. Pinned by
39
+ `tests/output-shapes-unit.test.ts` and `tests/output-baseline.test.ts`.
40
+ - **Every token earns its place.** Default output is lean: `--detail brief`
41
+ lists only what is needed to choose the next asset, and `normal`, `full`
42
+ and `agent` widen or reshape it. `show` returns what a consumer needs to
43
+ act on the asset (a script's run hints, a skill's instructions, a
44
+ command's template, an agent's prompt, knowledge content, a workflow's
45
+ steps and parameters, env key names, secret metadata) and never an env or
46
+ secret value. Pinned by `tests/output-shapes-unit.test.ts`.
47
+ - **Refs are path identities.** `[bundle//]conceptId`, with `#fragment`
48
+ accepted by `show` only. A short ref resolves against `defaultBundle`,
49
+ then the remaining bundles in installation order. A rename is a new
50
+ identity. An agent passes the ref `search` returned to `show` and never
51
+ parses or builds one. Pinned by `tests/asset-ref.test.ts`,
52
+ `tests/resolve-ref.test.ts` and
53
+ `tests/contracts/ref-resolver-contract.test.ts`.
54
+ - **Execution happens only through named surfaces.** Workflow runs, tasks,
55
+ agent and command dispatch, `env run` and `secret run`, the improve and
56
+ proposal processes, index passes, and fetcher modules in the working
57
+ bundle's `scripts/wiki-fetchers/` directory during website sync. `search`
58
+ and `show` execute nothing; a script runs only as a task or workflow
59
+ target. Held by review.
60
+ - **Improvement is review-first.** Proposals are the unit of change: reflect,
61
+ distill, extract and consolidate only emit proposals. Three lanes act
62
+ without a person, and only with `experimental.improveAutonomy` on: memory
63
+ inference, memory cleanup, and a triage promote that runs the judgment
64
+ tier (a promote through the deterministic gates alone needs no opt-in). A
65
+ fix a person types with `akm feedback --replace` is applied at once, as a
66
+ normal accept that `akm proposal revert` undoes. Regardless of the opt-in,
67
+ session extraction writes session assets, and `improve` purges graced
68
+ archives, commits accepted proposals and auto-syncs a git-backed bundle.
69
+ Pinned by
70
+ `tests/improve-plan-autonomy-wiring.test.ts` and
71
+ `tests/config-experimental-improve-autonomy.test.ts`.
72
+ - **Writes resolve one way.** An explicit `--bundle`, then
73
+ `defaultWriteTarget`, then the working bundle, then an error. A
74
+ destination that is not writable is an error, never a fallback. Env and
75
+ secret values are never printed. Pinned by
76
+ `tests/integration/write/write-source.test.ts`,
77
+ `tests/integration/env/env.test.ts` and
78
+ `tests/integration/secret/secret-indexing.test.ts`.
79
+ - **Output is for automation first.** `--format json` and `--detail brief`
80
+ by default; failures are `{ok, error, code}` on stderr with a stable exit
81
+ code. Pinned by `tests/integration/output-baseline.test.ts` and
82
+ `tests/integration/cli-errors.test.ts`.
83
+ - **A workflow run executes the plan frozen at creation.** The plan, the
84
+ resolved request, the runner selection and the fan-out widths are
85
+ journaled when the run starts; a resumed run reads the journal and never
86
+ config, so editing config changes the next run and not the one in flight.
87
+ The journaled runner is symbolic (a `$VAR` reference, or a connection's name
88
+ for its stored key), so a credential is not frozen: dispatch materializes the
89
+ current key, for the frozen endpoint only, and only if the runner was frozen
90
+ eligible for one (`storedKey: false` marks a connection an `extends` base
91
+ alone defines). Pinned by `tests/workflows/child-plan-immutability.test.ts`
92
+ and `tests/workflows/immutable-execution-v4-red.test.ts`.
93
+ - **Host authority is local and never inferred.** Inherited config shares
94
+ portable policy only. A disabled bundle (`enabled: false`) is inert across
95
+ content reads, writes, indexing and execution; an explicit bundle lifecycle
96
+ command may still update a named disabled bundle without activating it. The
97
+ default bundle is carried as explicit identity and default status, never
98
+ taken from array position. Runtime code never invents authority: the one
99
+ host-local choice it fills in by itself is `scheduler.enabled`, and only from
100
+ evidence the operator already created on this host (a config without the list
101
+ takes the akm-written rows already in the native scheduler as the choice;
102
+ see [Configuration](../reference/configuration.md#scheduler-activation)).
103
+ Anything else that would need a new trust decision is reported, never
104
+ invented. Pinned by `tests/config.test.ts` and
105
+ `tests/source-source.test.ts`.
106
+ - **An unsafe override names one risk.** `--allow-insecure-transport` allows
107
+ plain HTTP and nothing else, and there is no combined bypass. Pinned for the
108
+ flag by `tests/integration/registry/registry-network-boundary.test.ts`; the
109
+ absence of a combined bypass is held by review.
110
+
111
+ ---
112
+
12
113
  ## Asset Types
13
114
 
14
115
  The `akm` adapter's fourteen built-in asset types (`skill`, `command`,
@@ -100,9 +201,7 @@ User-facing item refs are path-identified:
100
201
  - a rename is delete plus create: the new path is a new identity and learned
101
202
  state does not follow it
102
203
 
103
- See [`specs/ref.md`](./specs/ref.md) for the normative grammar and
104
- [`specs/0.9.0-decisions.md`](./specs/0.9.0-decisions.md) for the rationale
105
- behind the 0.9.0 changes.
204
+ See [`specs/ref.md`](./specs/ref.md) for the normative grammar.
106
205
 
107
206
  Each indexed entry stores that identity as `item_ref`, with `bundle_id` and
108
207
  `concept_id` provenance, and stores its absolute materialized local file as
@@ -223,9 +322,8 @@ in the index, and fails closed when no configured source owns the path.
223
322
  ## Writing to Sources
224
323
 
225
324
  Writes go through one helper: `src/core/write-source.ts`. This is the only
226
- place in the codebase that branches on `source.kind`, and that is **enforced**
227
- by `scripts/lint-write-source-chokepoint.ts` in the `lint` chain — it was
228
- prose-only until 0.9.0, and drifted.
325
+ place in the codebase that branches on `source.kind`. Review holds that line
326
+ (core principle 2); the lint script that once checked it was deleted.
229
327
 
230
328
  Command layers therefore never hold provider knowledge. Where a step is
231
329
  meaningful only for a publication-backed target, `write-source.ts` exposes a
@@ -388,78 +486,110 @@ scripts tell "akm threw unexpectedly" apart from an ordinary `NotFoundError`
388
486
 
389
487
  ---
390
488
 
391
- ## Engine Boundary
392
-
393
- The approved target semantics that connect native agent and command assets to
394
- this engine boundary are specified in
395
- [Agent, Command, Engine, and Model Resolution](specs/agent-command-engine-model-design.md).
396
- The WP2/WP3 model-map and common-cascade path, WP4 command surface, WP5 runtime
397
- lowering convergence, WP6 task v3, and WP7 source-to-frozen durable workflow
398
- IR are implemented. Direct commands, task execution, and new workflow freezes
399
- share this boundary.
400
-
401
- Public execution selection uses named `engines`, never profiles. An engine is
402
- either `kind: "llm"` (an OpenAI-compatible chat-completions connection) or
403
- `kind: "agent"` (a registered harness platform). The SDK runtime is an
404
- internal transport kind for an `opencode-sdk` agent engine, not a public engine
405
- kind.
489
+ ## Connections and Harnesses
490
+
491
+ akm reaches models through two things, and nothing else is configured to run
492
+ work. A **connection** is an OpenAI-compatible endpoint with an optional key and
493
+ the models it serves under aliases. A **harness** is an agent program the user
494
+ already has (Claude Code, Codex, OpenCode, and the other platforms registered in
495
+ `HARNESS_REGISTRY`). The connection named `default`, or the only one, is the
496
+ default connection; harnesses follow the same rule. Public execution selection
497
+ names a connection or a harness, never a profile, and
498
+ [Configuration](../reference/configuration.md) is the reference for both.
499
+
500
+ What runs where follows from the kind of work:
501
+
502
+ - **Model work** (the improve processes, judges, index passes, extraction,
503
+ `remember --enrich`) runs on the default connection as a direct request to its
504
+ endpoint; with no connection, on the default harness, with its tools restricted
505
+ where the harness can be.
506
+ - **Agent work** (`akm agent`, `command run`, `proposal new`, agent tasks,
507
+ workflow agent steps) runs on the default harness; with no harness, on **akm's
508
+ own runtime** over the default connection. The runtime is a pinned OpenCode 2
509
+ binary that akm runs as a process, has no name in config, and is not a harness.
510
+ - With neither a connection nor a harness, those features are off, and each
511
+ command that needs one says so and points at `akm setup`. There is no fallback
512
+ and nothing hidden.
406
513
 
407
514
  Every execution — direct commands, tasks, workflows, improve, proposals, and
408
- index passes — takes the same four steps
409
- (`src/integrations/agent/execution.ts`, `runner-dispatch.ts`):
515
+ index passes — takes the same steps
516
+ (`src/integrations/agent/resolution.ts`, `execution.ts`, `runner-dispatch.ts`):
410
517
 
411
518
  ```text
412
519
  adapter-rendered or anonymous work
413
520
  -> resolveExecution(input) -> { request, runner (a RunnerSpec), provenance }
414
- -> buildExecution(request, runner) -> harness argv inputs or chat messages
415
- -> runExecution(built, options) -> agent CLI, OpenCode SDK, or direct LLM
521
+ -> buildExecution(request, runner) -> harness argv inputs, runtime inputs, or chat messages
522
+ -> runExecution(built, options) -> harness program, akm's OpenCode runtime, or direct chat
416
523
  ```
417
524
 
418
- `resolveExecution` picks the engine from an ordered list — the nearest layer
419
- that names one, then `defaults.engine`, then the implicit `opencode-sdk`
420
- fallback when its binary is present — and merges one set of defaults, nearest
421
- wins: the selected engine's own model/inference/timeout/workspace, then the
422
- persona, the command, the invocation defaults, and the current call. Omitted,
423
- explicit `null`, zero, and empty values stay distinct. A recognized
424
- `models.json` alias expands once, at the layer that chose it; the request
425
- records the exact final model. Tools are authorized against the host-local
426
- `execution.allowedTools` ceiling; no asset grants itself a tool. The result's
525
+ `resolveExecution` asks `resolveTarget` (the one resolver; `akm health`, `akm
526
+ info` and `akm task explain` use it too, so what they print is what a call does)
527
+ for the connection or harness and the model, then merges one set of defaults,
528
+ nearest wins. The layers run farthest to nearest: the shipped alias for the kind
529
+ of work, the configuration for the process, the persona, the command, the
530
+ invocation defaults, and the current call's flags. A connection or harness that
531
+ is named and not configured is an error (exit 78) that lists the configured names;
532
+ the default is used only when nothing was named. A
533
+ model is an alias, looked up on the selected connection or harness, or an exact
534
+ name; the request records the exact final model. A connection's request fields
535
+ and the model entry's are sent as written, under the portable settings
536
+ (`temperature`, `maxTokens`, ...) the layers ask for, which the one translation
537
+ in `src/core/llm-inference.ts` writes in the endpoint's own spelling. Omitted,
538
+ explicit `null`, zero, and empty values stay distinct. The result's
427
539
  `provenance` names the layer behind each field (`akm task explain`,
428
540
  `command run --dry-run`).
429
541
 
430
542
  `buildExecution` hands the request to the selected harness's own builder
431
- (registered on `HARNESS_REGISTRY`), or builds chat messages for a direct LLM.
432
- A tool policy the transport cannot enforce, or a denied tool selection, stops
433
- here; any other field the transport cannot carry becomes a secret-free
434
- `untranslated-field` notice and dispatch continues.
435
-
436
- Credentials stay symbolic (an env descriptor, an `apiKeyFile` path, or a
437
- `secret://` reference) in everything `resolveExecution` returns, so a request
438
- and runner can be journaled. `runExecution()` reads the current value at each
439
- dispatch and scrubs it, with every other secret-looking value the child could
440
- see, from the result. Workflow resume calls `buildExecutionFromWire()` on the
441
- journaled `{ request, runner }` and never reads config, `models.json`, or
442
- credentials, so a config edit after the freeze cannot change a resumed unit.
443
- The prompt-free interactive `akm agent` launch resolves its engine directly.
444
- An explicit missing or incompatible engine is an error and never falls
445
- through to another configured engine.
446
-
447
- Task-v3 execution and durable workflow-v4 dispatch use this runtime boundary.
448
- Markdown workflows compile through source IR v1; new starts freeze
449
- v4-family `irVersion: 5`. A stored plan that decodes runs whatever release
450
- froze it; one that does not is marked abandoned and `akm workflow run <ref>`
451
- starts afresh. Only a plan a newer akm froze is refused, naming the upgrade.
452
- AKM does not support full GitHub Actions semantics or arbitrary remote action
453
- execution.
543
+ (registered on `HARNESS_REGISTRY`), to the runtime's lowerer, or builds chat
544
+ messages for a direct request. A harness builder is a thin shell: it names the
545
+ program's arguments, delivers the prompt (on stdin where the program reads it,
546
+ as an argument otherwise) and takes standard output as the reply. A field the
547
+ transport cannot carry becomes a secret-free `untranslated-field` notice and
548
+ dispatch continues.
549
+
550
+ Credentials stay symbolic (a `$VAR` reference, or the connection's name for its
551
+ `credentials.json` entry) in everything `resolveExecution` returns, so a request
552
+ and runner can be journaled. `runExecution()` materializes the current value at
553
+ each dispatch (`src/core/config/credentials.ts`: the variable's value, else the
554
+ key stored for that connection and the endpoint it was frozen with) and scrubs it
555
+ from the result, together with the values of credential-named variables in the
556
+ environment the child inherited (names such as `*_API_KEY`, `*_TOKEN`, `*_SECRET`
557
+ and `*_PASSWORD`, eight characters or more: `collectInferredSecretValues`,
558
+ `src/core/redaction.ts`, the rule a task log uses). A harness has no key of akm's,
559
+ so a harness reply is scrubbed of the inherited values alone. Two things are
560
+ therefore different at resume: workflow resume calls
561
+ `buildExecutionFromWire()` on the journaled `{ request, runner }` and reads no
562
+ config, so a config edit after the freeze cannot change a resumed unit's
563
+ endpoint, model or settings; but the key is read again at dispatch (a stored key is used only for a
564
+ connection this host's own config defines, which `resolveTarget` records on the
565
+ runner as `storedKey: false` when it does not, so the answer does not depend on
566
+ whether a config is loaded), so a rotated key reaches the resumed unit, and only
567
+ at the endpoint it was frozen with. The prompt-free interactive `akm agent` launch resolves its
568
+ harness directly and starts it with the terminal inherited; a connection has
569
+ nothing to start.
570
+
571
+ A config in the older `engines` form is converted to `connections` and
572
+ `harnesses` by one pure function (`src/core/config/convert-engines.ts`), in
573
+ memory on every load and permanently by `akm migrate apply`.
574
+
575
+ Task source v4 execution and durable workflow dispatch use this runtime
576
+ boundary. Markdown workflows compile through source IR v1; new starts freeze
577
+ `irVersion: 8`, which records a connection or harness where earlier versions
578
+ recorded an engine. A stored plan that decodes runs whatever release froze it
579
+ (plans with only exec steps from `irVersion` 5 on decode); one that does not,
580
+ which includes every earlier plan with a command step, is marked abandoned and
581
+ `akm workflow run <ref>` starts afresh. Only a plan a newer akm froze is
582
+ refused, naming the upgrade. AKM does not support full GitHub Actions semantics
583
+ or arbitrary remote action execution.
454
584
 
455
585
  ### In-tree LLM helpers (`src/llm/`)
456
586
 
457
587
  Every helper under `src/llm/` is a **bounded, single-shot, stateless** call.
458
588
  Concretely:
459
589
 
460
- - Each public export is either a pure function (`chatCompletion`,
461
- `splitMemoryIntoAtomicFacts`, `resolveIndexPassExecution`,
462
- `resolveIndexPassRunner`, `parseJsonResponse`, …) or a factory that returns
590
+ - Each public export is either a stateless function (`chatCompletion` performs
591
+ one HTTP request and keeps nothing between calls; `splitMemoryIntoAtomicFacts`,
592
+ `resolveIndexPassExecution`, `parseJsonResponse`, …) or a factory that returns
463
593
  a one-shot client tied to the symbolic runner/config the caller passes in.
464
594
  - No module under `src/llm/` keeps session, conversation, or response state at
465
595
  module scope. The only module-level singleton is the local embedder
@@ -468,43 +598,94 @@ Concretely:
468
598
  `resetLocalEmbedder()` so tests can construct a fresh pipeline.
469
599
  - `callStructured()` is the common bounded structured-LLM seam: it adapts an
470
600
  already-resolved symbolic runner into an inline resolved request, lowers it,
471
- and dispatches without re-reading aliases or credentials. Index callers use
472
- `resolveIndexPassExecution()` to freeze the typed `{ runner, notices }`
473
- selection once per invocation. `resolveIndexPassRunner()` is its readiness
474
- projection, not a second dispatch seam. Improve processes are selected
475
- through `improve.strategies`; see `docs/reference/configuration.md` for
476
- canonical config paths.
601
+ and dispatches it through `runExecution`, which materializes the connection's
602
+ key at dispatch like every other dispatch and re-runs no alias resolution.
603
+ Index callers use `resolveIndexPassExecution()` to freeze the typed
604
+ `{ runner, notices }` selection once per invocation; there is no separate
605
+ readiness projection. Which improve processes run is chosen
606
+ by `improve.strategies`, and where each runs by `improve.processes`; see
607
+ `docs/reference/configuration.md` for canonical config paths.
477
608
 
478
- The seam is locked by `tests/architecture/llm-stateless-seam.test.ts`, which
479
- inspects the module shape of each `src/llm/*` entry — not the source text.
609
+ Review holds the seam; the test that once inspected the module shape of each
610
+ `src/llm/*` entry was deleted.
480
611
 
481
- ### External agents (`src/integrations/agent/`)
612
+ ### External agents (`src/integrations/agent/`, `src/integrations/harnesses/`)
482
613
 
483
- External coding agents are reachable via two execution paths:
614
+ Agent programs are reachable by two execution paths, both behind
615
+ `runExecution`:
484
616
 
485
617
  **Spawn path** (`src/integrations/agent/spawn.ts`):
486
618
 
487
- - `runAgent(profile, prompt, options)` is the single shell-out entry point.
488
- It owns process spawn, captured/interactive stdio, hard timeout, and
489
- structured failure reasons.
619
+ - `runAgent(profile, options)` is the single shell-out entry point. It owns
620
+ process spawn, captured/interactive stdio, hard timeout, and structured
621
+ failure reasons. The child's environment is the one akm runs in, with the
622
+ directories this akm resolved and the call's own variables set over it.
623
+ - The `opencode` harness is the user's installed OpenCode, both majors, through
624
+ `opencode run` with the prompt on stdin
625
+ (`src/integrations/harnesses/opencode/agent-builder.ts`). Their OpenCode owns
626
+ its configuration, logins and sessions; akm embeds, copies and reads none of it
627
+ to run. Agent work runs it as the user would; model work is akm's own process
628
+ ([How akm runs a harness](../reference/configuration.md#how-akm-runs-a-harness)).
490
629
  - The `AgentRunResult` envelope carries `{ ok, exitCode, stdout, stderr,
491
- durationMs, reason?, error?, parsed? }` where `reason` is one of
492
- `"timeout" | "spawn_failed" | "non_zero_exit" | "parse_error"`. Callers
630
+ durationMs, reason?, error?, ... }` where `reason` is a typed code such as
631
+ `"timeout"`, `"spawn_failed"`, `"non_zero_exit"` or `"parse_error"`. Callers
493
632
  never see raw process errors.
494
633
 
495
- **SDK path** (`src/integrations/harnesses/opencode-sdk/sdk-runner.ts`):
496
-
497
- - `runOpencodeSdk(profile, prompt, opts, llmConfig?)` uses the embedded
498
- `@opencode-ai/sdk` instead of `Bun.spawn`. No agent CLI binary is required.
499
- - Selected by an agent engine whose `platform` is `"opencode-sdk"`. Its optional
500
- `llmEngine` supplies the LLM fallback connection. With none, there is no
501
- fallback and opencode uses its own configuration; `defaults.llmEngine` is not
502
- borrowed.
503
- - Manages a single per-process singleton server, creating one fresh session
504
- per call to avoid history accumulation and unbounded token growth.
505
- - Concurrent calls share startup by server material, but each call races that
506
- startup against its own deadline (including `null`); no caller's timeout is
507
- stored in the shared lifecycle.
634
+ **akm's OpenCode runtime** (`src/integrations/harnesses/opencode/runtime/`):
635
+
636
+ - It is akm's agent runtime behind one application-owned port,
637
+ `src/integrations/agent/runtime-port.ts`: the lowering target a request is
638
+ lowered for (`lowering`) and `run` for one resolved dispatch. Lowering and
639
+ dispatch use only the port; the one module that names this folder is
640
+ `src/integrations/agent/runtime.ts`, and the folder reads no config
641
+ (`tests/contracts/runtime-port-boundary.test.ts` checks both).
642
+ - It is a pinned OpenCode 2 binary run as a process, one per run: `opencode run
643
+ --standalone --title akm` with the prompt on standard input and the reply on
644
+ standard output, the same command the `opencode` harness builds for OpenCode 2
645
+ model work. akm fetches the binary from the npm registry the first time the
646
+ runtime runs and keeps it in its cache (`binary.ts`: the package for the
647
+ platform, checked against the registry's integrity hash before anything is
648
+ extracted). It depends on no OpenCode library, so nothing of OpenCode is
649
+ installed with akm.
650
+ - The process is akm's own (`command.ts`): the connection a run was dispatched
651
+ with is its only provider (endpoint, key, model and context window as the run
652
+ froze them, never from the live config); its config, data, cache, state and
653
+ temp directories are `<akm data dir>/opencode-runtime/{config,data,cache,state,tmp}`;
654
+ no user or project OpenCode configuration is read (OpenCode still reads
655
+ `~/.agents` and its system config), nor are your Claude Code skills, its free
656
+ models and model-catalog fetch are off, and the `OPENCODE_*` variables akm runs with are not passed to it.
657
+ `--standalone` keeps a run to one process that ends with it, and replays no
658
+ killed session. OpenCode makes and migrates its database at start and two
659
+ processes doing that to one database break each other, so the first start of
660
+ this OpenCode version is a run of its own (`session list`, no model) under a
661
+ lock file in the runtime directory (`prepare.lock`, a dead holder reclaimed),
662
+ which leaves a `prepared-<version>` marker; runs that start with it, in this
663
+ akm process or another, wait for it.
664
+ - The process loads akm's plugin (`src/assets/opencode/akm-plugin.js`, written
665
+ to the runtime's config directory): `akm_search`, `akm_show` and `akm_curate`
666
+ run the akm that started the run, by the argv it runs as (`AKM_OPENCODE_CLI`,
667
+ a JSON array: the executable alone when compiled, the runtime and the script
668
+ otherwise), the
669
+ connection's request fields are laid over each model request, with OpenCode's
670
+ own output cap taken off, and the variables akm set for the process (its
671
+ directories and its OpenCode settings) are put back to akm's own, or removed,
672
+ in the environment of the commands the agent runs.
673
+ - The connection's key is in no environment: the inline config references it as
674
+ `{file:<data>/opencode-runtime/keys/<session>}`, a 0600 file written for the
675
+ run and removed after it.
676
+ - Agent work runs OpenCode's default agent with its normal tools. Model work never
677
+ runs here: on a connection it is a direct request to its endpoint.
678
+ - Every session is stored in akm's own OpenCode database
679
+ (`<akm data dir>/opencode-runtime/data/opencode/opencode.db`), which `akm
680
+ proposal extract --type opencode` reads back with SQLite alone, beside your own
681
+ OpenCode's database.
682
+ - Nobody can answer an akm run: OpenCode's headless `run` cancels questions and
683
+ rejects permission requests, and the model carries on.
684
+ - The run goes through the spawn path every agent run does (`runBuiltCommand`,
685
+ `src/integrations/agent/spawn.ts`): one deadline and one abort signal, the
686
+ SIGINT, SIGTERM, SIGKILL ladder, and captured output. A run that cannot start
687
+ (no binary and no registry to fetch it from) fails as `spawn_failed`, naming
688
+ the package, the URL and the cache path.
508
689
 
509
690
  New tasks are task source v4 `.yml` assets. Normal execution rejects v2 and v3
510
691
  and directs operators to the explicit preview/apply migrator. Task source v4
@@ -528,15 +709,20 @@ activity registry around them; `state.db` writers serialize on SQLite's own
528
709
  | `src/cli/` | citty composition helpers |
529
710
  | `src/core/asset/asset-placement.ts` | asset type registry and canonical source directories (`PLACEMENT_SPECS`) |
530
711
  | `src/core/asset/asset-ref.ts` | asset ref parsing and normalization (`parseBundleRef`) |
531
- | `src/core/config/config.ts` | config loading, validation, env resolution |
712
+ | `src/core/config/config.ts` | config loading, validation, env resolution; the default connection and harness |
713
+ | `src/core/config/credentials.ts` | `credentials.json` and the dispatch-time resolution of a connection's key (`$VAR`, else the stored entry) |
714
+ | `src/core/config/convert-engines.ts` | the one conversion of the older `engines` / `defaults` form to `connections` / `harnesses`, called by the loader and by `akm migrate apply` |
532
715
  | `src/core/errors.ts` | error classes with stable codes and hints |
533
716
  | `src/core/parse.ts` | shared JSON parsing: think/fence stripping, balanced-brace extraction |
534
717
  | `src/core/concurrent.ts` | bounded concurrency pool (`concurrentMap`, default 1 worker) |
535
718
  | `src/core/write-source.ts` | the single write helper (branches on `source.kind`) |
536
719
  | `src/execution/resolved-request.ts` | the versioned resolved execution request and its canonical wire form (tolerant decode) |
537
- | `src/integrations/agent/execution.ts` | `resolveExecution` (engine, layers, model alias, tools) and `buildExecution` / `buildExecutionFromWire` |
538
- | `src/integrations/agent/runner-dispatch.ts` | `runExecution`: reads credentials at dispatch, runs agent/SDK/LLM, redacts the result |
539
- | `src/integrations/agent/request-lowering.ts` | shared factory for the harness-owned request builders |
720
+ | `src/integrations/agent/resolution.ts` | `resolveTarget`: the connection or harness a call runs on, and its model, timeout and request fields |
721
+ | `src/integrations/agent/execution.ts` | `resolveExecution` (target, layers, model alias, persona) and `buildExecution` / `buildExecutionFromWire` |
722
+ | `src/integrations/agent/runner-dispatch.ts` | `runExecution`: reads credentials at dispatch, runs harness / runtime / chat, redacts the result |
723
+ | `src/integrations/agent/request-lowering.ts` | lowers a resolved request for a harness or the runtime, reporting what the target cannot carry |
724
+ | `src/integrations/harnesses/` | `HARNESS_REGISTRY` and one folder per harness (thin shells that turn a request into argv, env and stdin) |
725
+ | `src/commands/targets.ts` | the table of connections, harnesses and the work on them that `akm health`, `akm info` and `akm setup` print |
540
726
  | `src/sources/provider.ts` | minimal `SourceProvider` interface |
541
727
  | `src/sources/providers/` | filesystem / git / website / npm implementations |
542
728
  | `src/sources/resolve.ts` | filesystem path resolution for refs |
@@ -556,18 +742,16 @@ activity registry around them; `state.db` writers serialize on SQLite's own
556
742
  | `src/commands/agent/` | contribute/agent command surface |
557
743
  | `src/registry/providers/` | registry provider implementations (static-index, skills-sh) |
558
744
  | `src/output/shapes/`, `src/output/text/` | JSON-envelope and text-output registries per command (#490) — a parallel concern to `src/output/renderers.ts`'s per-asset-type `show` renderers, which is still live and self-registering, not replaced |
559
- | `src/workflows/authoring/` | workflow authoring + scope-key helpers |
745
+ | `src/workflows/authoring/` | workflow authoring |
560
746
  | `src/workflows/runtime/runs.ts` | workflow run persistence (raw SQL lives in `src/storage/repositories/workflow-runs-repository.ts`) |
561
747
  | `src/workflows/runtime/` | run lifecycle: runs, checkin, agent-identity |
562
748
  | `src/llm/client.ts` | OpenAI-compatible chat completions client (stateless, single request/response) |
563
- | `src/llm/index-passes.ts` | per-pass LLM config resolution for `akm index` |
564
- | `src/llm/memory-infer.ts` | atomic-fact split helper (selected through `improve.strategies.<name>.processes.memoryInference`) |
749
+ | `src/llm/index-passes.ts` | per-pass connection or harness resolution for `akm index` (`index.*`) |
750
+ | `src/llm/memory-infer.ts` | atomic-fact split helper (runs where `improve.processes.memoryInference` or `index.memory` says) |
565
751
  | `src/llm/embedder.ts` | local + remote embedder facade with cached pipeline |
566
752
  | `src/integrations/agent/spawn.ts` | agent CLI shell-out entry point (`runAgent`) |
567
- | `src/integrations/harnesses/opencode-sdk/sdk-runner.ts` | embedded SDK runner selected by an SDK `RunnerSpec` |
568
- | `src/integrations/agent/runner-dispatch.ts` | low-level exhaustive `RunnerSpec` transport dispatch and dispatch-time credential redaction |
569
- | `src/integrations/agent/profiles.ts` | internal spawn descriptors used after agent-engine lowering |
570
- | `src/integrations/agent/engine-resolution.ts` | named engine and symbolic transport-material resolution; exact request model projection happens in execution lowering |
753
+ | `src/integrations/harnesses/opencode/runtime/` | akm's own runtime: the pinned OpenCode binary, fetched and run as a process |
754
+ | `src/integrations/agent/profiles.ts` | internal spawn descriptors, built from the harness registry |
571
755
  | `src/llm/structured-call.ts` | bounded structured-LLM adapter through the common resolved/lowered execution seam |
572
756
  | `src/integrations/agent/detect.ts` | PATH-based agent CLI detection for `akm setup` |
573
757
 
@@ -37,7 +37,7 @@ everything else routes through `akm proposal accept`.
37
37
  for every entry and `akm feedback` for the entry it touched.
38
38
  - **Strategies** (`src/commands/improve/improve-strategies.ts`,
39
39
  `src/assets/improve-strategies/*.json`) — named presets that decide which
40
- improve processes run and with what engine/model/limits.
40
+ improve processes run and with what limits and gates (where each runs is `improve.processes`).
41
41
  - **Autonomy gate** (`src/commands/improve/autonomy-gate.ts`) — downgrades
42
42
  the handful of processes that would otherwise mutate assets without review
43
43
  (memory inference, memory cleanup, and a judged triage promote), unless
@@ -374,7 +374,13 @@ exactly this path (`proposal drain --promote` without judgment): 0.91 (terra) an
374
374
 
375
375
  Every downgrade is reported, not silent: it warns on stderr, appends an
376
376
  `improve_skipped` event with `reason: "autonomy_gated"`, and is counted in
377
- `akm health`'s improve skip-reason summary. Consolidation stays enabled with
377
+ `akm health`'s improve skip-reason summary. The `default` strategy enables
378
+ `memoryInference`, so every live `akm improve` run on an install without the
379
+ opt-in warns `[improve] memoryInference skipped` and names
380
+ `experimental.improveAutonomy`. That is by design, because a gated lane is never
381
+ a silent no-op (`applyAutonomyGate` in `src/commands/improve/autonomy-gate.ts`,
382
+ the warning in `runImproveStageSequence` in `src/commands/improve/improve.ts`).
383
+ Consolidation stays enabled with
378
384
  autonomy off: both its passes only ever emit a reviewable proposal. The one
379
385
  pair-pass `retire` proposal `triage` `applyMode: "promote"` accepts is a
380
386
  retirement the pair pass staged (nothing unique to the retired side, confirmed
@@ -93,7 +93,6 @@ ties broken by registration order (later wins). The signals:
93
93
  | Specificity | Signal | Result |
94
94
  | --- | --- | --- |
95
95
  | 25 | `SKILL.md` (skill directory) | `skill` |
96
- | 20 | `tools` frontmatter | `agent` |
97
96
  | 19 | workflow markdown structure | `workflow` |
98
97
  | 18 | command frontmatter / `$ARGUMENTS` body placeholders | `command` |
99
98
  | 15 | immediate parent dir hint | directory-specific type |
@@ -120,7 +119,6 @@ ties broken by registration order (later wins). The signals:
120
119
 
121
120
  | Signal | Type | Specificity |
122
121
  | --- | --- | --- |
123
- | `tools` in frontmatter | `agent` | 20 |
124
122
  | workflow heading/step structure | `workflow` | 19 |
125
123
  | `agent` in frontmatter | `command` | 18 |
126
124
  | `$ARGUMENTS` or `$1`-`$3` in body | `command` | 18 |
@@ -147,7 +145,7 @@ Unknown string values warn once at runtime and remain searchable.
147
145
  | `scripts/deploy.sh` | parent dir (15) → `script` | `scripts/deploy.sh` |
148
146
  | `skills/review/SKILL.md` | `SKILL.md` (25) → `skill` | `skills/review` |
149
147
  | `commands/release.md` with `agent: coder` | command frontmatter (18) | `commands/release` |
150
- | `agents/reviewer.md` with `tools:` | frontmatter (20) → `agent` | `agents/reviewer` |
148
+ | `agents/reviewer.md` | parent dir (15) → `agent` | `agents/reviewer` |
151
149
  | `workflows/release.md` with workflow structure | structure (19) → `workflow` | `workflows/release` |
152
150
  | `env/prod.env` | parent dir (15) → `env` | `env/prod` |
153
151
  | `secrets/deploy-token` | parent dir (15) → `secret` | `secrets/deploy-token` |
@@ -16,13 +16,14 @@ git (the 08-F1 recovery pattern — see step 3).
16
16
  `~/.config/akm/config.json` (`%APPDATA%\akm\config.json` on Windows;
17
17
  override with `AKM_CONFIG_DIR`). This file is gitignored on the host, so the
18
18
  recovery source is the ONE versioned copy committed to the bundle git
19
- (08-F1 pattern). Copy that file into place; it carries named `engines`,
20
- `defaults.engine` / `defaults.llmEngine`, and cron-load-bearing improve
19
+ (08-F1 pattern). Copy that file into place; it carries the `connections`,
20
+ `harnesses`, and cron-load-bearing improve
21
21
  strategies that are otherwise unrecoverable.
22
- 4. **Provide secrets/env.** `config.json` references API keys via `${VAR}`
23
- placeholders; export those environment variables (or restore your env/secret
24
- assets) so named engines and the embedding connection resolve. Never commit
25
- the resolved values.
22
+ 4. **Provide secrets/env.** `config.json` references API keys via `$VAR`
23
+ placeholders; export those environment variables (or restore
24
+ `credentials.json` from your own backup; it is never part of `config.json`)
25
+ so the connections and the embedding endpoint resolve. Never commit the
26
+ resolved values.
26
27
  5. **Restore the working bundle.** Clone your bundle git remote to the path
27
28
  named by your working bundle's entry under `bundles` in the restored
28
29
  config (`defaultBundle` selects which one; default path `~/akm`). There is