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
@@ -0,0 +1,175 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Where akm's work runs, as one table: a row for each configured connection
6
+ * and harness, and a row for each kind of work naming the connection or
7
+ * harness, and the model, it resolves to. The work rows are resolved by the same
8
+ * resolvers the calls use, so the table never disagrees with what a call does.
9
+ *
10
+ * Pure but for the key and PATH lookups it reads. What needs the network or a
11
+ * process (is the endpoint reachable, what does the harness report as its
12
+ * version) is passed in by the caller that wants it: `akm health` supplies
13
+ * them, `akm info` does not.
14
+ */
15
+ import { ambiguousDefaultAdvice, defaultConnection, defaultHarness, } from "../core/config/config.js";
16
+ import { readCredential } from "../core/config/credentials.js";
17
+ import { IMPROVE_ENGINE_PROCESSES } from "../core/config/engine-semantics.js";
18
+ import { SHIPPED_ALIAS } from "../core/config/model-aliases.js";
19
+ import { envReferenceName } from "../core/config/schema/primitives.js";
20
+ import { ConfigError } from "../core/errors.js";
21
+ import { redactUrlCredentials } from "../core/redaction.js";
22
+ import { defaultWhich } from "../integrations/agent/detect.js";
23
+ import { resolveTarget } from "../integrations/agent/resolution.js";
24
+ import { DEFAULT_LOCAL_MODEL } from "../llm/embedder.js";
25
+ import { effectiveEmbedding } from "../llm/embedders/connection.js";
26
+ import { resolveIndexPassExecution } from "../llm/index-passes.js";
27
+ import { resolveImproveExecution } from "./improve/execution.js";
28
+ function keyState(connection, name, env) {
29
+ const variable = connection.apiKey === undefined ? undefined : envReferenceName(connection.apiKey);
30
+ if (variable !== undefined)
31
+ return env[variable]?.trim() ? "env-set" : "env-unset";
32
+ return readCredential({ connection: name }, connection.endpoint) !== undefined ? "credentials" : "none";
33
+ }
34
+ function connectionRows(input) {
35
+ const { config } = input;
36
+ const defaultName = defaultConnection(config)?.name;
37
+ return Object.entries(config.connections ?? {}).map(([name, connection]) => {
38
+ const reach = input.reachability?.get(name);
39
+ return {
40
+ type: "connection",
41
+ name,
42
+ default: name === defaultName,
43
+ endpoint: redactUrlCredentials(connection.endpoint),
44
+ key: keyState(connection, name, input.env ?? process.env),
45
+ ...(reach ? { reachable: reach.reachable, ...(reach.error ? { error: reach.error } : {}) } : {}),
46
+ };
47
+ });
48
+ }
49
+ /** A harness's binary, as a call to it would resolve it. */
50
+ function harnessBin(config, name, harness) {
51
+ try {
52
+ const target = resolveTarget({ config, layers: [{ harness: name }] });
53
+ if (target.kind === "harness")
54
+ return target.bin;
55
+ }
56
+ catch {
57
+ // Falls through: nothing to look up.
58
+ }
59
+ return harness.bin ?? harness.platform ?? name;
60
+ }
61
+ function harnessRows(input) {
62
+ const { config } = input;
63
+ const defaultName = defaultHarness(config)?.name;
64
+ const which = input.which ?? defaultWhich;
65
+ return Object.entries(config.harnesses ?? {}).map(([name, harness]) => {
66
+ const version = input.versions?.get(name);
67
+ const bin = harnessBin(config, name, harness);
68
+ return {
69
+ type: "harness",
70
+ name,
71
+ default: name === defaultName,
72
+ platform: harness.platform ?? name,
73
+ bin,
74
+ installed: Boolean(which(bin)),
75
+ ...(harness.modelWork === false ? { modelWork: false } : {}),
76
+ ...(version ? { version } : {}),
77
+ };
78
+ });
79
+ }
80
+ /** What a resolver says: a runner, nothing (not set up), or what is wrong with the config. */
81
+ function attempt(resolve) {
82
+ try {
83
+ const runner = resolve();
84
+ return runner ? { runner } : {};
85
+ }
86
+ catch (err) {
87
+ if (err instanceof ConfigError && (err.code === "LLM_NOT_CONFIGURED" || err.code === "AGENT_NOT_CONFIGURED")) {
88
+ return {};
89
+ }
90
+ return { problem: err instanceof Error ? err.message : String(err) };
91
+ }
92
+ }
93
+ const sameTarget = (a, b) => a.runner?.kind === b.runner?.kind && a.runner?.name === b.runner?.name && a.runner?.model === b.runner?.model;
94
+ /** A work row from its base resolution and the variants that may resolve somewhere else. */
95
+ function runnerRow(process, base, variants = [], ambiguous) {
96
+ const overrides = variants
97
+ .filter(([, variant]) => !sameTarget(variant, base))
98
+ .map(([name, variant]) => ({
99
+ name,
100
+ kind: variant.runner?.kind ?? null,
101
+ target: variant.runner?.name ?? null,
102
+ model: variant.runner?.model ?? null,
103
+ }));
104
+ // Work that resolves to nothing because the config has several entries and no default is not "not set up".
105
+ const problem = base.problem ??
106
+ variants.find(([, variant]) => variant.problem)?.[1].problem ??
107
+ (base.runner ? undefined : ambiguous);
108
+ return {
109
+ type: "process",
110
+ process,
111
+ kind: base.runner?.kind ?? null,
112
+ target: base.runner?.name ?? null,
113
+ model: base.runner?.model ?? null,
114
+ ...(overrides.length > 0 ? { overrides } : {}),
115
+ ...(problem ? { problem } : {}),
116
+ };
117
+ }
118
+ function embeddingRow(config, ambiguous) {
119
+ const off = { type: "process", process: "embedding", kind: null, target: null, model: null };
120
+ if (config.semanticSearchMode === "off")
121
+ return off;
122
+ // A model with no endpoint of its own is served by the default connection; with none to choose, the built-in embedder runs instead.
123
+ const wantsDefaultConnection = config.embedding?.model !== undefined && config.embedding.endpoint === undefined;
124
+ const embedding = effectiveEmbedding(config);
125
+ if (embedding?.endpoint === undefined) {
126
+ return {
127
+ ...off,
128
+ kind: "local",
129
+ target: "built-in",
130
+ model: embedding?.localModel ?? DEFAULT_LOCAL_MODEL,
131
+ ...(wantsDefaultConnection && ambiguous ? { problem: ambiguous } : {}),
132
+ };
133
+ }
134
+ const served = config.embedding?.endpoint === undefined;
135
+ return {
136
+ ...off,
137
+ kind: served ? "connection" : "endpoint",
138
+ target: served ? (defaultConnection(config)?.name ?? null) : redactUrlCredentials(embedding.endpoint),
139
+ model: embedding.model ?? null,
140
+ };
141
+ }
142
+ function rerankRow(config) {
143
+ const rerank = config.search?.curateRerank;
144
+ const on = rerank?.enabled === true && rerank.endpoint !== undefined;
145
+ return {
146
+ type: "process",
147
+ process: "curate-rerank",
148
+ kind: on ? "endpoint" : null,
149
+ target: on ? redactUrlCredentials(rerank.endpoint) : null,
150
+ model: on ? (rerank.model ?? null) : null,
151
+ };
152
+ }
153
+ function processRows(config) {
154
+ const ambiguous = ambiguousDefaultAdvice(config);
155
+ const improve = (processName, alias, rest = {}) => attempt(() => resolveImproveExecution({ config, processName, alias: SHIPPED_ALIAS[alias], ...rest })?.runner);
156
+ const gate = config.improve?.qualityGate;
157
+ return [
158
+ runnerRow("improve", improve("improve", "improve"), IMPROVE_ENGINE_PROCESSES.map((name) => [name, improve(name, "improve")]), ambiguous),
159
+ runnerRow("judges", improve("judge", "judge"), [
160
+ ["triage judgment", improve("triage-judgment", "judge", { process: "triage" })],
161
+ ["quality gate", improve("quality-judge", "judge", gate ? { current: gate } : {})],
162
+ ], ambiguous),
163
+ runnerRow("agents", attempt(() => resolveTarget({ config, layers: [{ model: SHIPPED_ALIAS.agent }] })), [], ambiguous),
164
+ runnerRow("extract", improve("extract", "extract"), [], ambiguous),
165
+ runnerRow("enrich", improve("remember-enrich", "enrich"), [], ambiguous),
166
+ runnerRow("index", attempt(() => resolveIndexPassExecution("memory", config).runner), [],
167
+ // A pass that is switched off is not waiting for a default.
168
+ config.index?.memory?.enabled === false ? undefined : ambiguous),
169
+ embeddingRow(config, ambiguous),
170
+ rerankRow(config),
171
+ ];
172
+ }
173
+ export function targetRows(input) {
174
+ return [...connectionRows(input), ...harnessRows(input), ...processRows(input.config)];
175
+ }
@@ -2,8 +2,7 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * `akm task explain <ref> [input flags]` — read-only task introspection
6
- * (spec docs/plans/specs/p2b-input-bindings.md §4.5, §1.7 B-N4).
5
+ * `akm task explain <ref> [input flags]` — read-only task introspection.
7
6
  *
8
7
  * Prints the task source path and owning bundle, its input declarations with
9
8
  * defaults, the supplied values WITH PROVENANCE (`default` | `flag` |
@@ -14,13 +13,12 @@
14
13
  * (`src/tasks/run/attempt-lifecycle.ts` is never imported here), never writes
15
14
  * history or a log (`src/tasks/run/task-history.ts` /
16
15
  * `src/tasks/run/task-log.ts` are never imported here), never touches the
17
- * scheduler (`src/tasks/scheduler-*.ts` are never imported here), and never
18
- * resolves a composed command/persona REF against the local index
19
- * (`src/tasks/prepare/prepare.ts`'s own command branch always does, via
20
- * `prepareCommandInvocation`'s default `sourceLoader` — an unindexed bundle
21
- * would otherwise make a read-only introspection command fail with "Run `akm
22
- * index` to build it", which is the wrong shape of dependency for a command
23
- * whose whole point is to work on a task the caller just wrote).
16
+ * scheduler (`src/tasks/scheduler-*.ts` are never imported here), and reads a
17
+ * composed command/persona REF only through the read-only lookup `akm command
18
+ * run --dry-run` uses (an isolated snapshot of the index, never the live one).
19
+ * A command or persona that cannot be read is reported as the envelope's
20
+ * `execution.problem`, not thrown: the task the caller just wrote is the thing
21
+ * being explained.
24
22
  *
25
23
  * SECRET-FREE BY CONSTRUCTION for the structural bans below — these hold
26
24
  * regardless of any value's shape, because the excluded data never reaches
@@ -33,20 +31,16 @@
33
31
  * rendered command/persona source — so a `run:` command string,
34
32
  * `with.content`, an inline `akm/command` prompt body, or a stored
35
33
  * command's own rendered content is never read, let alone printed;
36
- * - effective execution settings (engine/model/timeout) reuse
37
- * `resolveExecution` (`src/integrations/agent/execution.ts`) — the SAME
38
- * resolution entry point every command/persona invocation goes through —
39
- * fed a BLANK inline placeholder command (`createInlineResolvedCommand`)
40
- * and an EMPTY command-layer values map, instead of the task's real referenced
41
- * command source. This is a deliberate, documented trade-off: a
42
- * referenced command's OWN frontmatter overrides (its own `engine:`/
43
- * `model:`, if any) do not contribute a layer here, in exchange for never
44
- * needing the index, never reading the referenced file's bytes, and never
45
- * risking a leaked `runtime.environment` value (the cascade's own
46
- * "current" layer, built here from the TASK's own `execution` overrides
47
- * ONLY — engine/model/inference/outputSchema/tools/timeout, deliberately
48
- * never `environment`/`workspace`/`agent`, so a portable persona selector
49
- * can never demand a persona this module never loads). Only
34
+ * - effective execution settings (engine/model/timeout) come from the SAME
35
+ * entry point `akm command run` uses (`prepareCommandInvocation`), so a
36
+ * stored command's own frontmatter (its `harness:`, `model:`, `agent:`) and
37
+ * the persona it names contribute their layers and the target named is the
38
+ * target `command run --dry-run` names. An inline `akm/command` prompt has
39
+ * no frontmatter: it goes through `resolveExecution` with a BLANK inline
40
+ * command. The cascade's "current" layer is built from the TASK's own
41
+ * `execution` overrides ONLY — connection/harness/engine/model/agent/inference/
42
+ * outputSchema/timeout, deliberately never `environment`/`workspace`, so no
43
+ * `runtime.environment` value is ever near this module. Only
50
44
  * `engine`/`model`/`runtime.timeoutMs` and the cascade's own
51
45
  * `{layer,kind,via}` provenance map are read back — never
52
46
  * `request.command`, `request.persona`, `request.conversation`, or
@@ -62,45 +56,47 @@
62
56
  * `redacted: true`, instead of the real value — applied uniformly across
63
57
  * every place a declared or supplied VALUE can appear in this envelope: a
64
58
  * declaration's own `default`, each entry of a declaration's own `enum`
65
- * list (checked per-entry, not as one blanked list — code-review finding,
66
- * explain.ts:184), a `suppliedInputs` entry regardless of provenance, and a
67
- * `schedule[].inputs` entry (code-review finding: the declaration row alone
68
- * left the identical value printed verbatim one section over, in
69
- * `suppliedInputs`). Do not paste this command's output into an untrusted
59
+ * list (checked per-entry, not as one blanked list), a `suppliedInputs` entry
60
+ * regardless of provenance, and a `schedule[].inputs` entry (the declaration
61
+ * row alone would leave the identical value printed verbatim one section over,
62
+ * in `suppliedInputs`). Do not paste this command's output into an untrusted
70
63
  * place on the assumption that it can never contain a credential.
71
64
  *
72
65
  * Field-level execution provenance is READ from `resolveExecution`'s own
73
66
  * `provenance` — this module is a CONSUMER of the one common resolver, never a
74
- * second resolver: it never re-derives engine/model precedence itself.
67
+ * second resolver: it never re-derives connection, harness or model precedence itself.
75
68
  */
76
69
  import fs from "node:fs";
77
70
  import { detectAdapterId } from "../../core/adapter/detect-adapter.js";
78
- import { makeBundleRef } from "../../core/asset/asset-ref.js";
71
+ import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
79
72
  import { loadConfig } from "../../core/config/config.js";
80
- import { NotFoundError } from "../../core/errors.js";
73
+ import { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
74
+ import { ConfigError, NotFoundError } from "../../core/errors.js";
81
75
  import { applyInputDefaults, materializeInputFlags, } from "../../execution/input-contract.js";
82
76
  import { createInlineResolvedCommand } from "../../execution/resolved-request.js";
77
+ import { isPortableExecutionAgentSelector } from "../../execution/source.js";
78
+ import { lookupBundleRefReadonly } from "../../indexer/indexer.js";
83
79
  import { resolveAdapterConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
84
- import { resolveExecution } from "../../integrations/agent/execution.js";
80
+ import { currentLayer, resolveExecution, shippedAlias, } from "../../integrations/agent/execution.js";
85
81
  import { isSchedulerRefEnabled } from "../../tasks/activation-config.js";
86
82
  import { parseTaskSource } from "../../tasks/source/parse-task-source.js";
87
83
  import { projectTaskSourceV4 } from "../../tasks/source/project-v4.js";
88
84
  import { TASK_INPUT_DIAGNOSTICS } from "../../tasks/source/task-input-diagnostics.js";
89
85
  import { validateTaskConceptId, validateTaskId } from "../../tasks/task-id.js";
90
86
  import { detectSecretShapedParams } from "../../workflows/exec/param-secrets.js";
87
+ import { prepareCommandInvocation } from "../command/command-execution.js";
91
88
  import { parseTaskRef, resolveTaskReadBundle, taskIdForAdapter } from "./tasks.js";
92
89
  function isSecretShapedValue(name, value) {
93
90
  return detectSecretShapedParams({ [name]: value }).length > 0;
94
91
  }
95
92
  /**
96
- * Code-review finding (explain.ts:175, B-N4): `buildInputDeclarations`
97
- * already redacted a secret-shaped DEFAULT, but `buildSuppliedInputs` (and
98
- * a v4 schedule entry's own `inputs`, printed verbatim from the source)
99
- * echoed the identical value unredacted in the same envelope — a
100
- * `sk-live-…` default appeared in full in both output formats. Applied to
93
+ * `buildInputDeclarations` redacts a secret-shaped DEFAULT, so
94
+ * `buildSuppliedInputs` (and a v4 schedule entry's own `inputs`, printed
95
+ * verbatim from the source) must redact the identical value too, or a
96
+ * `sk-live-…` default would appear in full in the same envelope. Applied to
101
97
  * every supplied/schedule-binding row regardless of provenance, so the same
102
- * best-effort redaction (see this file's header) applies uniformly across
103
- * the whole envelope, not just the declaration row.
98
+ * best-effort redaction (see this file's header) applies uniformly across the
99
+ * whole envelope, not just the declaration row.
104
100
  */
105
101
  function redactIfSecretShaped(name, value) {
106
102
  if (!isSecretShapedValue(name, value))
@@ -114,13 +110,10 @@ function declarationEnum(schema) {
114
110
  return Array.isArray(schema.enum) ? schema.enum : undefined;
115
111
  }
116
112
  /**
117
- * Code-review finding (explain.ts:184, B-N4): `buildInputDeclarations`
118
- * already redacted a secret-shaped `default`, via {@link redactIfSecretShaped}
119
- * applied to the WHOLE default value, but the identical value appearing in
120
- * that same declaration's JSON-Schema `enum:` list printed unredacted one
121
- * key over — an `enum: [..., "sk-live-…"]` list echoed the credential in
122
- * full even though the matching `default:` on the same declaration was
123
- * already redacted. Fixed by applying the SAME per-value check
113
+ * `buildInputDeclarations` redacts a secret-shaped `default` via
114
+ * {@link redactIfSecretShaped} applied to the WHOLE default value, but the
115
+ * identical value appearing in that same declaration's JSON-Schema `enum:`
116
+ * list would print unredacted one key over. Apply the SAME per-value check
124
117
  * ({@link isSecretShapedValue}) to each entry independently, replacing only
125
118
  * the secret-shaped ones with `"<redacted>"` — deliberately NOT collapsing
126
119
  * the whole list to one `"<redacted>"` sentinel the way a single `default`
@@ -173,7 +166,7 @@ function targetSection(document) {
173
166
  const uses = document.target.uses;
174
167
  return { kind: uses.kind, ref: uses.ref };
175
168
  }
176
- /** True only for the two `uses:` kinds an execution cascade (engine/model resolution) actually applies to. */
169
+ /** True only for the two `uses:` kinds an execution cascade (connection, harness and model resolution) actually applies to. */
177
170
  function isCommandTarget(document) {
178
171
  return (document.target.kind === "uses" &&
179
172
  (document.target.uses.kind === "builtin-command" || document.target.uses.kind === "command"));
@@ -183,46 +176,88 @@ function isCommandTarget(document) {
183
176
  * home for both a v3 document's authored `akm.*` and a v4 document's
184
177
  * projected `execution` block) as a cascade "current" layer — the exact
185
178
  * non-secret subset `src/tasks/prepare/prepare-support.ts`'s
186
- * `currentExecutionValues` also forwards, minus `agent`/`workspace`/
187
- * `environment` (this module never loads a persona and never reads `env:`,
188
- * see this file's header).
179
+ * `currentExecutionValues` also forwards, minus `workspace`/`environment`
180
+ * (this module never reads `env:`, see this file's header).
189
181
  */
190
- function currentExecutionValues(document) {
182
+ function currentExecutionValues(document, bundleName) {
191
183
  const akm = document.akm;
192
184
  if (!akm)
193
185
  return {};
194
186
  const out = {};
195
- for (const key of ["engine", "model", "inference", "outputSchema", "tools", "timeout"]) {
187
+ for (const key of ["connection", "harness", "engine", "model", "inference", "outputSchema", "timeout"]) {
196
188
  if (Object.hasOwn(akm, key))
197
189
  out[key] = akm[key];
198
190
  }
191
+ if (Object.hasOwn(akm, "agent")) {
192
+ const agent = akm.agent;
193
+ out.agent =
194
+ typeof agent === "string" && isPortableExecutionAgentSelector(agent) ? qualifyInBundle(agent, bundleName) : agent;
195
+ }
199
196
  return out;
200
197
  }
198
+ /** A ref the task wrote, relative to its own bundle unless it names one. */
199
+ function qualifyInBundle(ref, bundleName) {
200
+ const parsed = parseBundleRef(ref);
201
+ return makeBundleRef(parsed.bundle ?? bundleName, parsed.conceptId);
202
+ }
203
+ /** The stored command the task runs, if it runs one; an inline `akm/command` prompt has none. */
204
+ function storedCommandRef(document) {
205
+ if (document.target.kind !== "uses")
206
+ return undefined;
207
+ if (document.target.uses.kind === "command")
208
+ return document.target.uses.ref;
209
+ const command = document.target.command;
210
+ return command?.kind === "stored" ? command.ref : undefined;
211
+ }
201
212
  /**
202
213
  * Effective execution settings + field-level provenance for a command-kind
203
- * target — see this file's header for why this is a BLANK-command cascade
204
- * call rather than a real command/persona load.
214
+ * target. A stored command is prepared the way `akm command run --dry-run`
215
+ * prepares it; one that cannot be (a missing command or persona) falls back to
216
+ * the cascade without it, with the reason in `problem`.
205
217
  */
206
- function resolveExecutionSettings(document) {
218
+ async function resolveExecutionSettings(document, bundleName) {
207
219
  if (!isCommandTarget(document))
208
220
  return { provenance: {} };
209
- const current = currentExecutionValues(document);
210
- const prepared = resolveExecution({
221
+ const config = loadConfig();
222
+ const current = currentExecutionValues(document, bundleName);
223
+ const ref = storedCommandRef(document);
224
+ let problem;
225
+ let prepared;
226
+ if (ref !== undefined) {
227
+ try {
228
+ prepared = await prepareCommandInvocation({
229
+ action: { ref: qualifyInBundle(ref, bundleName) },
230
+ config,
231
+ current: current,
232
+ sourceLookup: lookupBundleRefReadonly,
233
+ });
234
+ }
235
+ catch (error) {
236
+ if (error instanceof ConfigError)
237
+ throw error;
238
+ problem = error instanceof Error ? error.message : String(error);
239
+ }
240
+ }
241
+ prepared ??= resolveExecution({
211
242
  command: createInlineResolvedCommand({ template: "", content: "" }),
212
- config: loadConfig(),
213
- commandLayer: { id: "task-explain", values: {} },
214
- ...(Object.keys(current).length > 0 ? { current } : {}),
243
+ config,
244
+ layers: [
245
+ shippedAlias(SHIPPED_ALIAS.agent),
246
+ { id: "task-explain", kind: "command", values: {} },
247
+ ...(Object.keys(current).length > 0 ? [currentLayer(current)] : []),
248
+ ],
215
249
  });
216
- const engine = prepared.request.engine;
250
+ const target = prepared.request.target;
217
251
  return {
218
252
  engine: {
219
- name: engine.name,
220
- kind: engine.kind,
221
- ...(Object.hasOwn(engine, "platform") ? { platform: engine.platform } : {}),
253
+ name: target.name,
254
+ kind: target.kind,
255
+ ...(target.platform !== undefined ? { platform: target.platform } : {}),
222
256
  },
223
257
  ...(prepared.request.model !== undefined ? { model: prepared.request.model } : {}),
224
258
  ...(prepared.request.runtime.timeoutMs !== undefined ? { timeoutMs: prepared.request.runtime.timeoutMs } : {}),
225
259
  provenance: prepared.provenance,
260
+ ...(problem !== undefined ? { problem } : {}),
226
261
  };
227
262
  }
228
263
  /**
@@ -247,9 +282,9 @@ export async function akmTaskExplain(ref, options = {}) {
247
282
  }
248
283
  const sourcePath = owner.path;
249
284
  const yaml = fs.readFileSync(sourcePath, "utf8");
250
- const parsed = parseTaskSource({ yaml, filePath: sourcePath, workspaceRoot: bundle.source.path });
285
+ const parsed = parseTaskSource({ yaml, filePath: sourcePath });
251
286
  const inputContract = parsed.v4.inputs ?? {};
252
- // Code-review finding (explain.ts:299, B-N4): `akm task run`'s
287
+ // `akm task run`'s
253
288
  // load-task.ts copies this same materialize -> applyInputDefaults ->
254
289
  // validateInputs ladder, but its own trailing `validateInputs` +
255
290
  // `contractViolation` throw is load-task's OWN enforcement that a task
@@ -259,8 +294,8 @@ export async function akmTaskExplain(ref, options = {}) {
259
294
  // input is exactly the fact `explain` exists to surface, not a condition
260
295
  // that should make the command refuse to print. Deliberately NOT calling
261
296
  // `validateInputs` here: `materializeInputFlags` above still runs its own
262
- // per-flag validation (an unknown flag name still fails UNKNOWN_FLAG,
263
- // B-55; a supplied value failing its own declared schema still fails
297
+ // per-flag validation (an unknown flag name still fails UNKNOWN_FLAG; a
298
+ // supplied value failing its own declared schema still fails
264
299
  // here), so only the "required and never supplied at all" case is left
265
300
  // unenforced. `buildSuppliedInputs` below naturally renders that case as a
266
301
  // declaration row (always present, carrying `required: true`) with no
@@ -298,7 +333,7 @@ export async function akmTaskExplain(ref, options = {}) {
298
333
  target: targetSection(document),
299
334
  inputDeclarations: buildInputDeclarations(inputContract),
300
335
  suppliedInputs: buildSuppliedInputs(defaultedInputs, materializedInputs),
301
- execution: resolveExecutionSettings(document),
336
+ execution: await resolveExecutionSettings(document, bundle.source.name),
302
337
  schedule,
303
338
  };
304
339
  }
@@ -25,6 +25,7 @@
25
25
  import { defineCommand } from "citty";
26
26
  import { getParsedInvocation } from "../../cli/invocation.js";
27
27
  import { parsePositiveIntFlag } from "../../cli/parse-args.js";
28
+ import { RETIRED_ENGINE_ARG, SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
28
29
  import { defineGroupCommand, defineJsonCommand, EXIT_CODES, GLOBAL_OUTPUT_ARGS, output, outputWithExitCode, runWithJsonErrors, } from "../../cli/shared.js";
29
30
  import { UsageError } from "../../core/errors.js";
30
31
  import { TASK_RUN_BOOLEAN_FLAGS, TASK_RUN_VALUE_FLAGS } from "../../tasks/task-run-reserved-flags.js";
@@ -47,7 +48,7 @@ const bundleArg = {
47
48
  * other value spelling (`--<name>=false`, `--<name>=1`, `--<name>=`) walks
48
49
  * straight past it and is then absorbed downstream — by citty's non-strict
49
50
  * parser, or by `parseTaskInputFlags`' reserved-name skip — exactly the
50
- * silent-discard defect these rejecters exist to close (review round 1). The
51
+ * silent-discard defect these rejecters exist to close. The
51
52
  * name is taken as everything before the FIRST `=`, which is
52
53
  * `parseTaskInputFlags`' own split (see its `body.indexOf("=")` below), so the
53
54
  * rejecter and the scanner can never disagree about what a token names.
@@ -94,21 +95,20 @@ function rejectExplainScheduledFlag() {
94
95
  return;
95
96
  throw new UsageError('Unknown flag "--scheduled".', "UNKNOWN_FLAG");
96
97
  }
97
- // ── `akm task run` input flags — Stage 1: capture (spec §5.1) ──────────────
98
+ // ── `akm task run` input flags — Stage 1: capture ───────────────────────────
98
99
  //
99
100
  // Mirrors `parseWorkflowParameterFlags` (src/commands/workflow-cli.ts:232-289)
100
101
  // exactly: the CLI carries RAW string/boolean flag values to the boundary
101
102
  // that knows the task's declared contract (Stage 2, src/tasks/run/load-task.ts)
102
103
  // — coercion happens once, there. `akm task run`'s own declared flags
103
104
  // (GLOBAL_OUTPUT_ARGS, --bundle, --scheduled) are excluded so they are never
104
- // mistaken for inputs (B-33).
105
+ // mistaken for inputs.
105
106
  // `TASK_RUN_VALUE_FLAGS` / `TASK_RUN_BOOLEAN_FLAGS` are re-exported here
106
107
  // (unchanged in name, location, and value) from a dependency-free leaf module
107
108
  // so `src/tasks/source/task-source-v4.ts` can reject a declared `inputs:`
108
109
  // name that collides with one of them without importing this CLI file —
109
110
  // which would cycle back through `./tasks` -> `../../tasks/source/*` into the
110
- // parser (code-review finding, docs/plans/specs/p2b-input-bindings.md review
111
- // round 2; see `../../tasks/task-run-reserved-flags.ts`'s own header).
111
+ // parser (see `../../tasks/task-run-reserved-flags.ts`'s own header).
112
112
  export { TASK_RUN_BOOLEAN_FLAGS, TASK_RUN_VALUE_FLAGS };
113
113
  const TASK_RUN_VALUE_FLAG_SET = new Set(TASK_RUN_VALUE_FLAGS);
114
114
  const TASK_RUN_BOOLEAN_FLAG_SET = new Set(TASK_RUN_BOOLEAN_FLAGS);
@@ -182,8 +182,8 @@ const tasksAddCommand = defineJsonCommand({
182
182
  type: "string",
183
183
  description: 'Exact shell string to run on the schedule (no AI agent), e.g. "akm improve --strategy consolidate".',
184
184
  },
185
- engine: { type: "string", description: "Engine to use for prompt targets (default: defaults.engine)" },
186
- model: { type: "string", description: "Model override for prompt targets" },
185
+ ...SELECTION_ARGS,
186
+ ...RETIRED_ENGINE_ARG,
187
187
  "timeout-ms": { type: "string", description: "Positive timeout in milliseconds for prompt or command targets" },
188
188
  params: { type: "string", description: "Workflow params as a JSON object" },
189
189
  name: { type: "string", description: "Human-readable name for the task" },
@@ -206,8 +206,7 @@ const tasksAddCommand = defineJsonCommand({
206
206
  workflow: args.workflow,
207
207
  prompt: args.prompt,
208
208
  command: args.command,
209
- engine: args.engine,
210
- model: args.model,
209
+ ...selectionFromArgs(args),
211
210
  timeoutMs: args["timeout-ms"] === undefined ? undefined : parsePositiveIntFlag(args["timeout-ms"]),
212
211
  params: args.params,
213
212
  name: args.name,
@@ -354,8 +353,7 @@ const tasksSyncCommand = defineJsonCommand({
354
353
  outputWithExitCode("task-sync", result, result.failures.length > 0 ? EXIT_CODES.GENERAL : undefined);
355
354
  },
356
355
  });
357
- // ── `akm task explain` — read-only introspection (P2b Lane B, spec
358
- // docs/plans/specs/p2b-input-bindings.md §4.5, §1.7 B-N4) ──────────────────
356
+ // ── `akm task explain` — read-only introspection ────────────────────────────
359
357
  const tasksExplainCommand = defineJsonCommand({
360
358
  meta: {
361
359
  name: "explain",