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
@@ -22,19 +22,22 @@ import { assetPathForName } from "../../core/asset/asset-placement.js";
22
22
  import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
23
23
  import { conceptIdFromTypeName, isFullRefInput } from "../../core/asset/resolve-ref.js";
24
24
  import { isWithin, resolveStashDir } from "../../core/common.js";
25
- import { loadConfig, mutateConfig, resetConfigCache } from "../../core/config/config.js";
26
- import { bundleKeyForContentRoot, resolveActiveConfiguredSources, resolveConfiguredSources, } from "../../core/config/config-sources.js";
25
+ import { defaultConnection, defaultHarness, loadConfig, mutateConfig, resetConfigCache, } from "../../core/config/config.js";
26
+ import { bundleKeyForContentRoot, resolveConfiguredSources } from "../../core/config/config-sources.js";
27
27
  import { IMPROVE_AUTONOMY_CONFIG_KEY, isImproveAutonomyEnabled } from "../../core/config/experimental.js";
28
28
  import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
29
- import { getTaskHistoryDir, getTaskLogDir } from "../../core/paths.js";
29
+ import { getTaskLogDir } from "../../core/paths.js";
30
30
  import { warn } from "../../core/warn.js";
31
- import { commitWriteTargetBoundary, isWriteCapableSourceKind, prepareWriteTargetForMutation, resolveWorkingStashTarget, resolveWriteTarget, writeAssetToSource, } from "../../core/write-source.js";
32
- import { withEngineFallback } from "../../integrations/agent/engine-fallback.js";
31
+ import { assertBundleNotDisabled, commitWriteTargetBoundary, isWriteCapableSourceKind, prepareWriteTargetForMutation, resolveWorkingStashTarget, resolveWriteTarget, writeAssetToSource, } from "../../core/write-source.js";
32
+ import { deriveInstallations } from "../../indexer/installations.js";
33
+ import { retiredEngineSelection } from "../../integrations/agent/resolution.js";
34
+ import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
33
35
  import { resolveAssetPath } from "../../sources/resolve.js";
34
36
  import { enabledRefsFromInstalled, schedulerEnabledRefs, setSchedulerRefEnabled } from "../../tasks/activation-config.js";
35
37
  import { backendNameForPlatform, selectBackend } from "../../tasks/backends/index.js";
36
38
  import { prepareTaskV3Execution } from "../../tasks/prepare/prepare.js";
37
39
  import { isCheckoutInvocation, resolveAkmInvocation } from "../../tasks/resolve-akm-bin.js";
40
+ import { activeTaskSources, resolveBundleAsset } from "../../tasks/run/load-task.js";
38
41
  import { createExecutionProvenanceContext } from "../../tasks/run/provenance.js";
39
42
  import { runTask } from "../../tasks/run/run-task.js";
40
43
  import { readTaskHistory } from "../../tasks/run/task-history.js";
@@ -63,13 +66,15 @@ export async function akmTasksAdd(input, deps = {}) {
63
66
  if (!isWithin(assetPath, typeRoot)) {
64
67
  throw new UsageError(`Resolved task path escapes the stash: "${id}".`, "PATH_ESCAPE_VIOLATION");
65
68
  }
69
+ const engineAs = input.engine === undefined ? undefined : retiredEngineSelection(bundle.config, input.engine);
66
70
  const yaml = renderTaskYaml({
67
71
  id,
68
72
  schedule: input.schedule,
69
73
  workflow: input.workflow,
70
74
  prompt: input.prompt,
71
75
  command: input.command,
72
- engine: input.engine,
76
+ connection: input.connection ?? (engineAs?.kind === "connection" ? engineAs.name : undefined),
77
+ harness: input.harness ?? (engineAs?.kind === "harness" ? engineAs.name : undefined),
73
78
  model: input.model,
74
79
  timeoutMs: input.timeoutMs,
75
80
  params: input.params,
@@ -78,7 +83,7 @@ export async function akmTasksAdd(input, deps = {}) {
78
83
  when_to_use: input.when_to_use,
79
84
  tags: input.tags,
80
85
  });
81
- const parsedTask = parseTaskSource({ yaml, filePath: assetPath, workspaceRoot: stashDir });
86
+ const parsedTask = parseTaskSource({ yaml, filePath: assetPath });
82
87
  const task = projectTaskSourceV4(parsedTask.v4);
83
88
  const qualifiedRef = makeBundleRef(bundle.bundleName, `tasks/${id}`);
84
89
  await prepareTaskV3Execution(task, {
@@ -152,13 +157,17 @@ function assertTaskAddTargetShape(input) {
152
157
  if (targetCount !== 1) {
153
158
  throw new UsageError("Pass exactly one of --workflow <ref>, --prompt <inline-text>, or --command <shell-command>.", "INVALID_FLAG_VALUE");
154
159
  }
155
- // `--timeout-ms` is the workflow's whole-run bound. Engine and model stay
156
- // prompt-only because workflow engines come from the frozen plan.
157
- if (input.workflow && (input.engine !== undefined || input.model !== undefined)) {
158
- throw new UsageError("Workflow tasks accept --params and --timeout-ms; engine and model are prompt-task fields.", "INVALID_FLAG_VALUE");
160
+ // `--timeout-ms` is the workflow's whole-run bound. Connection, harness and
161
+ // model stay prompt-only because a workflow's connections and harnesses come from the frozen plan.
162
+ const selects = input.connection !== undefined ||
163
+ input.harness !== undefined ||
164
+ input.engine !== undefined ||
165
+ input.model !== undefined;
166
+ if (input.workflow && selects) {
167
+ throw new UsageError("Workflow tasks accept --params and --timeout-ms; connection, harness and model are prompt-task fields.", "INVALID_FLAG_VALUE");
159
168
  }
160
- if (hasCommand && (input.engine !== undefined || input.model !== undefined)) {
161
- throw new UsageError("Command tasks accept --timeout-ms but not --engine or --model.", "INVALID_FLAG_VALUE");
169
+ if (hasCommand && selects) {
170
+ throw new UsageError("Command tasks accept --timeout-ms but not --connection, --harness or --model.", "INVALID_FLAG_VALUE");
162
171
  }
163
172
  if (input.prompt !== undefined)
164
173
  assertInlineTaskPrompt(input.prompt);
@@ -169,24 +178,18 @@ export async function akmTasksRun(id, options = {}) {
169
178
  const adapterId = bundle.source.adapterId ?? detectAdapterId(bundle.source.path);
170
179
  const resolvedId = taskIdForAdapter(parsed.id, adapterId);
171
180
  const scheduled = options.scheduled === true;
172
- // D5 "Construction" (spec docs/plans/specs/p1b-model-extraction.md §1.2/
173
- // §5.2): built ONCE at this invocation boundary. eventSource is "task"
174
- // whether or not --scheduled was passed (§1.6 D5-N1) — scheduled stays a
181
+ // Built ONCE at this invocation boundary. eventSource is "task"
182
+ // whether or not --scheduled was passed — scheduled stays a
175
183
  // separate field carrying its own pre-existing meaning (activation policy,
176
184
  // scheduler env), never selecting the event source.
177
185
  const provenance = createExecutionProvenanceContext(scheduled);
178
- // F-3 (spec §5.4): RunTaskOptions.stashDir renamed to bundleDir — VALUE-
179
- // preserving, no CLI flag change.
180
- //
181
- // P2a Lane C (spec docs/plans/specs/p2a-task-source-v4.md §5.1): the raw,
182
- // exact-name input flags `tasks-cli.ts`'s Stage 1 captures ride through
183
- // unchanged to `runTask` -> `loadPreparedTask`'s Stage 2 materializer,
186
+ // The raw, exact-name input flags `tasks-cli.ts`'s Stage 1 captures ride
187
+ // through unchanged to `runTask` -> `loadPreparedTask`'s Stage 2 materializer,
184
188
  // which owns declaring `inputFlags` on `RunTaskOptions` and attaching the
185
189
  // materialized literals to the constructed `TaskInvocation`. This is only
186
- // the pass-through surface: a valid flag set stays byte-identical to the
187
- // same run without flags (§0), and P2a delivers nothing to the target.
190
+ // the pass-through surface.
188
191
  //
189
- // No `as` cast (test-review finding, spec §6 F-5): `RunTaskOptions` (this
192
+ // No `as` cast: `RunTaskOptions` (this
190
193
  // literal's inferred type is checked directly against it, below) declares
191
194
  // every one of these fields, so the compiler — not a suppressed excess-
192
195
  // property check — enforces this seam. A future rename or removal on
@@ -202,11 +205,9 @@ export async function akmTasksRun(id, options = {}) {
202
205
  // The runner owns the prepare-before-reserve boundary. Invalid source,
203
206
  // projectability, and resolver failures therefore create no history row.
204
207
  const result = await runTask(resolvedId, runOptions);
205
- // C-7 (spec §5.6): after D8's result-vocabulary re-code, "command" means
206
- // the agent/LLM arm — the native shell/script arm now reports "shell" /
207
- // "script". Rewired in the SAME commit as the vocabulary re-code so a
208
- // shell/script task's process exit 78 still passes through as CLI exit 78
209
- // (documented behavior, src/assets/hints/cli-hints-short.md:95).
208
+ // "command" means the agent/LLM arm — the native shell/script arm reports
209
+ // "shell" / "script" — so a shell/script task's process exit 78 still passes
210
+ // through as CLI exit 78 (documented behavior, src/assets/hints/cli-hints-short.md).
210
211
  const exitCode = result.status === "failed" &&
211
212
  (result.target.kind === "shell" || result.target.kind === "script") &&
212
213
  result.detail?.exitCode === 78
@@ -234,7 +235,6 @@ function resolveTaskActivation(ref, target, requireSchedulable) {
234
235
  const parsedSource = parseTaskSource({
235
236
  yaml: fs.readFileSync(sourcePath, "utf8"),
236
237
  filePath: sourcePath,
237
- workspaceRoot: bundle.source.path,
238
238
  });
239
239
  if (parsedSource.v4.schedule.length === 0) {
240
240
  throw new UsageError(`Task ${JSON.stringify(ref)} has no schedule to enable.`, "INVALID_FLAG_VALUE");
@@ -361,24 +361,26 @@ async function buildSchedulerSyncPlan(deps, bundleTarget, options) {
361
361
  if (options.dryRun !== true)
362
362
  config = loadConfig();
363
363
  }
364
- const activeSources = resolveActiveConfiguredSources(config);
364
+ // The one active-bundle set search, show and workflows walk, working stash included.
365
+ // A working stash that is a disabled configured bundle is left out: an
366
+ // unscoped sync still removes that bundle's rows (below) and syncs the others,
367
+ // and a scoped sync reports it as disabled only when it is the selected one.
368
+ const sources = activeTaskSources(config);
369
+ const ids = deriveInstallations(sources).map((installation) => installation.id);
370
+ const kinds = sources.map((source) => source.type);
371
+ const configuredSources = resolveConfiguredSources(config);
365
372
  if (bundleTarget) {
366
373
  // Only filesystem and git bundles can carry scheduler state.
367
- const targetSource = activeSources.find((source) => source.name === bundleTarget);
368
- if (targetSource && !isWriteCapableSourceKind(targetSource.type)) {
369
- throw new UsageError(`Bundle "${bundleTarget}" has kind "${targetSource.type}"; task scheduling is only supported for filesystem and git bundles.`, "INVALID_FLAG_VALUE");
374
+ const targetType = kinds[ids.indexOf(bundleTarget)];
375
+ if (targetType !== undefined && !isWriteCapableSourceKind(targetType)) {
376
+ throw new UsageError(`Bundle "${bundleTarget}" has kind "${targetType}"; task scheduling is only supported for filesystem and git bundles.`, "INVALID_FLAG_VALUE");
370
377
  }
371
378
  }
372
- const configuredSources = resolveConfiguredSources(config);
373
- const schedulable = activeSources
374
- .filter((source) => isWriteCapableSourceKind(source.type))
375
- .map((source) => source.name);
376
- // No configured bundle at all: the working stash (e.g. `AKM_BUNDLE_DIR`).
377
- const selected = bundleTarget
378
- ? [bundleTarget]
379
- : schedulable.length > 0 || configuredSources.length > 0
380
- ? schedulable
381
- : [undefined];
379
+ const schedulable = ids.filter((_, index) => {
380
+ const type = kinds[index];
381
+ return type !== undefined && isWriteCapableSourceKind(type);
382
+ });
383
+ const selected = bundleTarget ? [bundleTarget] : schedulable;
382
384
  const enabledRefSet = new Set(enabledRefs);
383
385
  const desired = [];
384
386
  const failures = [];
@@ -591,19 +593,18 @@ export async function akmTasksDoctor(deps = {}) {
591
593
  }
592
594
  }
593
595
  const bindings = groupInstalledBindings(installed);
594
- // Report the EFFECTIVE engine view — the same one the runner resolves —
595
- // so doctor never says "no engine" on an install where tasks actually run.
596
- const { config } = withEngineFallback(loadConfig());
597
- const defaultEngine = config.defaults?.engine;
598
- const engines = Object.keys(config.engines ?? {});
596
+ // Report the EFFECTIVE view — the default harness (else connection) agent work runs on, and what is configured.
597
+ const config = loadConfig();
598
+ const defaultEngine = (defaultHarness(config) ?? defaultConnection(config))?.name;
599
+ const engines = [...Object.keys(config.connections ?? {}), ...Object.keys(config.harnesses ?? {})];
599
600
  // §6.1: surface the effective triage settings for the default improve
600
601
  // strategy. The struct is a fixed shape, so this is a deliberate addition.
601
- const improveStrategyName = typeof config.defaults?.improveStrategy === "string" ? config.defaults.improveStrategy : "default";
602
+ const improveStrategyName = config.improve?.strategy ?? "default";
602
603
  // D8 — report the EFFECTIVE strategy, not the raw one. Resolving the raw
603
604
  // strategy here would report `applyMode: "promote"` for a promote strategy
604
605
  // under a review-first config, while the run actually uses "queue" — a doctor
605
606
  // command lying about the thing it exists to diagnose.
606
- const rawStrategy = resolveImproveStrategy(config.defaults?.improveStrategy, config).config;
607
+ const rawStrategy = resolveImproveStrategy(config.improve?.strategy, config).config;
607
608
  const { config: effectiveStrategy, gated } = applyAutonomyGate(rawStrategy, config);
608
609
  const autonomyEnabled = isImproveAutonomyEnabled(config);
609
610
  // Memory cleanup has no strategy flag to downgrade, so add that direct lane
@@ -631,7 +632,6 @@ export async function akmTasksDoctor(deps = {}) {
631
632
  ? { remediation: "akm task sync --rebind" }
632
633
  : {}),
633
634
  logDir: getTaskLogDir(),
634
- historyDir: getTaskHistoryDir(),
635
635
  engine: { defaultEngine, available: engines },
636
636
  scheduleSubset: SCHEDULE_SUPPORTED_SUBSET_HINT,
637
637
  warnings,
@@ -696,17 +696,11 @@ function taskProjectionAssetResolver(config, bundleName, bundleRoot) {
696
696
  if (bundle === bundleName) {
697
697
  return { file: await resolveAssetPath(bundleRoot, type, name), bundleRoot };
698
698
  }
699
- // `bundle` is the qualifier of an asset ref in the task, not a flag.
700
- const target = resolveWriteTarget(config, bundle, { requireWritable: false, flag: "The asset ref's bundle" });
701
- return {
702
- file: await resolveAssetPath(target.source.path, type, name),
703
- bundleRoot: target.source.path,
704
- };
699
+ return resolveBundleAsset(config, { bundle, type, name });
705
700
  };
706
701
  }
707
702
  /**
708
- * Exported for `src/commands/tasks/explain.ts` (P2b Lane B, spec
709
- * docs/plans/specs/p2b-input-bindings.md §4.5, B-N4): `akm task explain`
703
+ * Exported for `src/commands/tasks/explain.ts`: `akm task explain`
710
704
  * resolves its `--bundle` axis identically to every other read-only task
711
705
  * verb here (`akm task history`, `akm task run`) — the SAME resolver, not a
712
706
  * second one.
@@ -722,44 +716,27 @@ export function resolveTaskReadBundle(refBundle, flagBundle) {
722
716
  resolved = resolveWorkingStashTarget(config, { requireWritable: false });
723
717
  }
724
718
  else {
725
- const configured = resolveActiveConfiguredSources(config).some((source) => source.name === selector);
726
- const implicit = configured ? undefined : resolveImplicitScheduledBundleTarget(config, selector);
727
- resolved =
728
- implicit ??
729
- resolveWriteTarget(config, selector, {
730
- requireWritable: false,
731
- // The selector is `--bundle` when given, else the task ref's own bundle qualifier.
732
- flag: flagBundle !== undefined ? "--bundle" : "The task ref's bundle",
733
- });
719
+ // Reading needs no write target: any bundle of the active set resolves.
720
+ const sources = activeTaskSources(config);
721
+ const source = resolveSourcesForOrigin(selector, sources)[0];
722
+ if (!source) {
723
+ assertBundleNotDisabled(config, selector);
724
+ throw new UsageError(`${flagBundle !== undefined ? "--bundle" : "The task ref's bundle"} must reference a source name from your config. No source named "${selector}" is configured. Run \`akm bundle list\` to see available sources.`, "INVALID_FLAG_VALUE");
725
+ }
726
+ resolved = {
727
+ source: {
728
+ kind: source.type ?? "filesystem",
729
+ name: selector,
730
+ path: source.path,
731
+ adapterId: source.adapterId ?? detectAdapterId(source.path),
732
+ },
733
+ };
734
734
  }
735
735
  if (refBundle && resolved.source.name !== refBundle) {
736
736
  throw new UsageError(`Task ref bundle ${JSON.stringify(refBundle)} does not match the resolved source.`, "INVALID_FLAG_VALUE");
737
737
  }
738
738
  return resolved;
739
739
  }
740
- /**
741
- * New scheduler bindings always carry a canonical `--bundle <owner>` token,
742
- * including an env-selected working stash. That stash need not be persisted in
743
- * config (CI, one-shot tools, and fresh installs commonly use only
744
- * AKM_BUNDLE_DIR), so its scheduled child — every row sets AKM_BUNDLE_DIR to
745
- * the working stash it was synced from — must accept precisely its derived
746
- * owner name.
747
- *
748
- * This is intentionally narrower than an unknown-bundle fallback: a configured
749
- * source always wins, and an unconfigured selector is accepted only when it is
750
- * exactly the current env-selected working stash identity.
751
- */
752
- function resolveImplicitScheduledBundleTarget(config, selector) {
753
- if (!process.env.AKM_BUNDLE_DIR?.trim())
754
- return undefined;
755
- try {
756
- const working = resolveWorkingStashTarget(config, { requireWritable: false });
757
- return working.source.name === selector ? working : undefined;
758
- }
759
- catch {
760
- return undefined;
761
- }
762
- }
763
740
  /** True when `candidate` resolves to the same directory as the primary stash. */
764
741
  function isPrimaryStashPath(candidate) {
765
742
  let primary;
@@ -776,8 +753,7 @@ function errorMessage(cause) {
776
753
  }
777
754
  /**
778
755
  * Infer a JSON-Schema-subset `type` keyword from one `--params` value's
779
- * runtime shape (spec docs/plans/specs/p4-deletions-closeout.md §3.2.6, row
780
- * B-20). `null` is not one of the five runtime types the spec enumerates
756
+ * runtime shape. `null` is not one of the five runtime types
781
757
  * (string/number/boolean/object/array) but is a value JSON.parse can still
782
758
  * produce for a param; `src/core/json-schema.ts`'s subset validator accepts
783
759
  * `"null"` as a `type`, so it is handled rather than mis-typed.
@@ -830,8 +806,10 @@ function renderTaskYaml(input) {
830
806
  obj.when_to_use = input.when_to_use;
831
807
  if (input.tags && input.tags.length > 0)
832
808
  obj.tags = input.tags;
833
- if (input.engine !== undefined)
834
- obj.engine = input.engine;
809
+ if (input.connection !== undefined)
810
+ obj.connection = input.connection;
811
+ if (input.harness !== undefined)
812
+ obj.harness = input.harness;
835
813
  if (input.model !== undefined)
836
814
  obj.model = input.model;
837
815
  if (input.timeoutMs !== undefined)
@@ -319,16 +319,24 @@ function config() {
319
319
  value,
320
320
  source: configSource(path),
321
321
  }));
322
- const engines = Object.entries((effective.engines ?? {})).map(([name, engine]) => ({
322
+ const named = (entries) => Object.entries((entries ?? {})).map(([name, entry]) => ({
323
323
  name,
324
- ...engine,
324
+ ...entry,
325
325
  }));
326
326
  const env = Object.keys(process.env)
327
327
  .filter((name) => name.startsWith("AKM_"))
328
328
  .sort()
329
329
  .map((name) => ({ name, value: isSecretEnvName(name) ? "[redacted]" : (process.env[name] ?? "") }));
330
330
  const configPath = getConfigPath();
331
- return { path: configPath, exists: fs.existsSync(configPath), config: effective, entries, engines, env };
331
+ return {
332
+ path: configPath,
333
+ exists: fs.existsSync(configPath),
334
+ config: effective,
335
+ entries,
336
+ connections: named(effective.connections),
337
+ harnesses: named(effective.harnesses),
338
+ env,
339
+ };
332
340
  }
333
341
  // ── /api/proposals ───────────────────────────────────────────────────────────
334
342
  export function proposalSummary(proposal) {
@@ -7,41 +7,15 @@
7
7
  * anything secret-like by key name, because the UI shows config the CLI's
8
8
  * `config list` never had to defend against a browser leaking.
9
9
  *
10
- * Symbolic references (`$VAR`, `${VAR}`, `secret://name`) are kept: they say
10
+ * Symbolic references (`$VAR`, `${VAR}`, `${secrets/name}`) are kept: they say
11
11
  * where a credential comes from without being one.
12
12
  */
13
- const REDACTED = "[redacted]";
13
+ import { isApiKeyReference } from "../../core/config/schema/primitives.js";
14
+ import { REDACTED, redactUrlCredentials } from "../../core/redaction.js";
14
15
  /** Key names whose string values are credentials, or sit in a bag of them. */
15
16
  const SECRET_KEY = /(api[-_]?key|token|password|passwd|secret|credential|authorization|bearer|private[-_]?key)/i;
16
17
  /** A whole subtree of values (`env`, `secrets`) that is data, not settings. */
17
18
  const SECRET_BAG_KEY = /^(env|secrets?)$/i;
18
- const SYMBOLIC_REFERENCE = /^(\$[A-Za-z_][A-Za-z0-9_]*|\$\{[A-Za-z_][A-Za-z0-9_]*\}|secret:\/\/.+)$/;
19
- /** Query parameters that carry a credential in a URL. */
20
- const SECRET_QUERY_PARAM = /^(api[-_]?key|key|token|access[-_]?token|auth|password|secret|sig|signature)$/i;
21
- /** `scheme://user:pass@host/?token=x` with the credentials masked. Anything that is not a URL is returned as is. */
22
- export function redactUrlCredentials(value) {
23
- if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(value))
24
- return value;
25
- try {
26
- const url = new URL(value);
27
- let changed = false;
28
- if (url.username || url.password) {
29
- url.username = "";
30
- url.password = "";
31
- changed = true;
32
- }
33
- for (const key of [...url.searchParams.keys()]) {
34
- if (SECRET_QUERY_PARAM.test(key)) {
35
- url.searchParams.set(key, REDACTED);
36
- changed = true;
37
- }
38
- }
39
- return changed ? url.toString() : value;
40
- }
41
- catch {
42
- return value;
43
- }
44
- }
45
19
  /** `text` with the credentials in every URL it contains masked (`llm default: https://host/?token=x`). */
46
20
  export function redactUrlsInText(text) {
47
21
  return text.includes("://") ? text.replace(/https?:\/\/[^\s"'<>)\]]+/gi, (url) => redactUrlCredentials(url)) : text;
@@ -65,7 +39,7 @@ export function redactForUi(value, inSecretBag = false) {
65
39
  if (Array.isArray(value))
66
40
  return value.map((child) => redactForUi(child, inSecretBag));
67
41
  if (typeof value === "string") {
68
- if (SYMBOLIC_REFERENCE.test(value))
42
+ if (isApiKeyReference(value))
69
43
  return value;
70
44
  return inSecretBag ? REDACTED : redactUrlCredentials(value);
71
45
  }
@@ -73,7 +47,7 @@ export function redactForUi(value, inSecretBag = false) {
73
47
  return inSecretBag && value !== null ? REDACTED : value;
74
48
  const result = {};
75
49
  for (const [key, child] of Object.entries(value)) {
76
- if (typeof child === "string" && SECRET_KEY.test(key) && !SYMBOLIC_REFERENCE.test(child)) {
50
+ if (typeof child === "string" && SECRET_KEY.test(key) && !isApiKeyReference(child)) {
77
51
  result[key] = REDACTED;
78
52
  }
79
53
  else {
@@ -44,7 +44,7 @@ function positional(body, key) {
44
44
  }
45
45
  function preserveUnrelatedConfig(config = loadConfig()) {
46
46
  if (!isDeepStrictEqual(sanitizeConfigForWrite(config, { quiet: true }), config)) {
47
- throw new UsageError("AKM's config sanitizer would remove unrelated credentials. Move literal API keys to $VAR or secret:// references and remove registry URL credentials using the CLI before changing bundle configuration in the UI.");
47
+ throw new UsageError("AKM's config sanitizer would remove unrelated credentials. Remove registry URL credentials using the CLI before changing bundle configuration in the UI.");
48
48
  }
49
49
  }
50
50
  /** The error kind behind each exit code of the CLI contract (`EXIT_CODES`, `src/cli/shared.ts`). */
@@ -8,18 +8,22 @@
8
8
  * (`loadWorkflowAsset`, `freezeWorkflow`) and NOTHING else — never
9
9
  * `publishWorkflowRunV4`, `startWorkflowRun`, `appendEvent`, or `akmIndex`.
10
10
  *
11
- * SECRET-FREE, by construction (§4.6's closed print list): a resolved
12
- * reference VALUE is never printed (references resolve at pre-attempt, not
11
+ * SECRET-FREE, by construction (§4.6's closed print list): a step's
12
+ * `orchestration` is the authored argv, cwd and env names plus the
13
+ * bundle-qualified refs they resolve to (the projection `akm show` prints,
14
+ * never a value or a path); a resolved reference VALUE is never printed (references resolve at pre-attempt, not
13
15
  * here); a `literal` **environment** binding's value is never printed (only
14
- * `environment[].kind`/`.name`, and an `env-ref`'s `.ref`/`.keys`/
15
- * `.secretNames` — all NAMES); `request.command.content`,
16
+ * `environment[].kind`/`.name`, and an `env-ref`'s `.ref` — all NAMES);
17
+ * `request.command.content`,
16
18
  * `request.persona`, `request.conversation`, `request.runtime.environment`,
17
19
  * and a script target's `bytesBase64` are never read at all.
18
20
  */
19
21
  import { loadConfig } from "../../core/config/config.js";
22
+ import { NotFoundError } from "../../core/errors.js";
20
23
  import { buildExecutionFromWire } from "../../integrations/agent/execution.js";
21
24
  import { freezeWorkflow } from "../../workflows/freeze/freeze.js";
22
25
  import { computePlanHash } from "../../workflows/ir/plan-hash.js";
26
+ import { resolveOrchestrationRefs, summarizeStepOrchestration } from "../../workflows/renderer.js";
23
27
  import { loadWorkflowAsset } from "../../workflows/runtime/workflow-asset-loader.js";
24
28
  /** The step's dispatch unit — the map template for a fan-out, else the root unit. Undefined for a step not yet frozen. */
25
29
  function stepUnit(step) {
@@ -30,7 +34,7 @@ function stepUnit(step) {
30
34
  }
31
35
  function projectEnvironmentBinding(binding) {
32
36
  if (binding.kind === "env-ref") {
33
- return { kind: binding.kind, ref: binding.ref, keys: binding.keys, secretNames: binding.secretNames };
37
+ return { kind: binding.kind, ref: binding.ref };
34
38
  }
35
39
  // literal / pass-through: kind + name only — a literal's VALUE is never printed.
36
40
  return { kind: binding.kind, name: binding.name };
@@ -46,14 +50,23 @@ function childExpansion(target) {
46
50
  via: "child",
47
51
  childRef: target.ref,
48
52
  childPlanHash: target.planHash,
49
- steps: target.frozenPlan.steps.map((step, index) => projectStep(step, index)),
53
+ steps: target.frozenPlan.steps.map((step, index) => projectStep(step, index, stepOrchestration(step, target.frozenPlan))),
50
54
  };
51
55
  }
52
56
  /** The child expansion boundary for one step (§4.6). */
53
57
  function stepExpansion(frozenTarget) {
54
58
  return frozenTarget?.kind === "child-workflow" ? childExpansion(frozenTarget) : { via: "direct" };
55
59
  }
56
- function projectStep(step, sequenceIndex) {
60
+ /**
61
+ * The step's `show` orchestration projection plus the refs it resolves to.
62
+ * `authored` is the compiled step (it keeps the spelling the author wrote);
63
+ * a child plan's steps have only their frozen form.
64
+ */
65
+ function stepOrchestration(step, plan) {
66
+ const summary = summarizeStepOrchestration(step, plan.defaults);
67
+ return summary && resolveOrchestrationRefs(summary);
68
+ }
69
+ function projectStep(step, sequenceIndex, orchestration) {
57
70
  const unit = stepUnit(step);
58
71
  const frozenTarget = unit?.frozenTarget;
59
72
  const kind = step.root?.kind === "map" ? "map" : "unit";
@@ -65,12 +78,13 @@ function projectStep(step, sequenceIndex) {
65
78
  targetKind: frozenTarget?.kind ?? null,
66
79
  ...(step.root?.kind === "map" ? { concurrency: step.root.concurrency } : {}),
67
80
  inputs: unit?.inputs ?? [],
81
+ ...(orchestration ? { orchestration } : {}),
68
82
  environment: (unit?.environment ?? []).map(projectEnvironmentBinding),
69
83
  ...(inputBindings && inputBindings.length > 0 ? { inputBindings: inputBindings.map(projectInputBinding) } : {}),
70
84
  gate: {
71
85
  criteria: step.gate.criteria,
72
86
  maxLoops: step.gate.maxLoops,
73
- judgeEngine: step.gate.frozenJudge ? step.gate.frozenJudge.request.engine.name : null,
87
+ judgeEngine: step.gate.frozenJudge ? step.gate.frozenJudge.request.target.name : null,
74
88
  },
75
89
  ...(step.outputSchema !== undefined ? { outputSchema: step.outputSchema } : {}),
76
90
  expansion: stepExpansion(frozenTarget),
@@ -102,15 +116,40 @@ function collectLoweringNotices(plan, config) {
102
116
  }
103
117
  return notices;
104
118
  }
119
+ /** Every ref the steps' orchestration names that no bundle owns, as `ref (where of step "id")`. */
120
+ function unresolvedRefs(steps, orchestrations) {
121
+ return orchestrations.flatMap((orchestration, index) => (orchestration?.unresolved ?? []).map((missing) => `${missing.ref} (${missing.in} of step "${steps[index]?.stepId}")`));
122
+ }
123
+ /** The unresolved refs of every embedded child plan, recursively, each prefixed with the child workflow it is in. */
124
+ function unresolvedInChildren(plan) {
125
+ return plan.steps.flatMap((step) => {
126
+ const target = stepUnit(step)?.frozenTarget;
127
+ if (target?.kind !== "child-workflow")
128
+ return [];
129
+ const child = target.frozenPlan;
130
+ const own = unresolvedRefs(child.steps, child.steps.map((childStep) => stepOrchestration(childStep, child)));
131
+ return [...own.map((entry) => `${entry} in child ${target.ref}`), ...unresolvedInChildren(child)];
132
+ });
133
+ }
134
+ function failOnUnresolved(ref, unresolved) {
135
+ if (unresolved.length === 0)
136
+ return;
137
+ throw new NotFoundError(`Workflow ${ref} names asset(s) that no bundle owns: ${unresolved.join(", ")}.`, "FILE_NOT_FOUND");
138
+ }
105
139
  /**
106
140
  * Compile + freeze `ref` and project the frozen plan into the read-only
107
141
  * `akm workflow plan` envelope. Never publishes, never writes, never warns.
108
142
  */
109
143
  export async function akmWorkflowPlan(ref) {
110
144
  const asset = await loadWorkflowAsset(ref);
145
+ // Resolve what the authored steps name before freezing: a `${ref}`, env ref or child workflow no bundle owns fails the plan.
146
+ const orchestrations = asset.plan.steps.map((step) => stepOrchestration(step, asset.plan));
147
+ failOnUnresolved(asset.ref, unresolvedRefs(asset.plan.steps, orchestrations));
111
148
  const config = loadConfig();
112
149
  const frozen = await freezeWorkflow(asset, config);
113
150
  const plan = frozen.plan;
151
+ // A child workflow's steps exist only once frozen; they fail the plan exactly as the top level's do.
152
+ failOnUnresolved(asset.ref, unresolvedInChildren(plan));
114
153
  return {
115
154
  ok: true,
116
155
  ref: asset.ref,
@@ -123,7 +162,7 @@ export async function akmWorkflowPlan(ref) {
123
162
  execution: plan.execution,
124
163
  ...(plan.budget ? { budget: plan.budget } : {}),
125
164
  ...(plan.params ? { params: plan.params } : {}),
126
- steps: plan.steps.map((step, index) => projectStep(step, index)),
165
+ steps: plan.steps.map((step, index) => projectStep(step, index, orchestrations[index])),
127
166
  notices: collectLoweringNotices(plan, config),
128
167
  warnings: frozen.warnings.map((warning) => warning.message),
129
168
  };