akm-cli 0.10.261012-beta → 0.10.261014-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/CHANGELOG.md +710 -3
  2. package/README.md +15 -0
  3. package/SECURITY.md +11 -10
  4. package/STABILITY.md +47 -51
  5. package/dist/assets/hints/cli-hints-full.md +21 -19
  6. package/dist/assets/hints/cli-hints-short.md +3 -4
  7. package/dist/assets/opencode/akm-plugin.js +177 -0
  8. package/dist/assets/stash-skeleton/README.md +1 -1
  9. package/dist/assets/tasks/core/improve.yml +1 -1
  10. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
  11. package/dist/assets/ui/config.js +27 -10
  12. package/dist/assets/workflows/workflow-template.md +2 -2
  13. package/dist/cli/clack.js +3 -1
  14. package/dist/cli/selection.js +33 -0
  15. package/dist/cli/shared.js +14 -1
  16. package/dist/cli/unknown-flags.js +6 -37
  17. package/dist/cli.js +69 -48
  18. package/dist/commands/agent/agent-dispatch.js +17 -25
  19. package/dist/commands/agent/contribute-cli.js +9 -8
  20. package/dist/commands/command/command-cli.js +4 -8
  21. package/dist/commands/command/command-execution.js +25 -39
  22. package/dist/commands/command/execution-source-loader.js +10 -14
  23. package/dist/commands/completions.js +1 -1
  24. package/dist/commands/config-cli.js +14 -5
  25. package/dist/commands/env/child-env.js +12 -14
  26. package/dist/commands/env/env-binding.js +47 -58
  27. package/dist/commands/env/env-cli.js +22 -24
  28. package/dist/commands/env/env.js +10 -58
  29. package/dist/commands/env/secret-cli.js +11 -29
  30. package/dist/commands/env/secret.js +3 -10
  31. package/dist/commands/health/checks.js +10 -849
  32. package/dist/commands/health/connections-and-harnesses-check.js +109 -0
  33. package/dist/commands/health/egress.js +3 -3
  34. package/dist/commands/health/html-report.js +9 -10
  35. package/dist/commands/health/plugin-staleness.js +18 -11
  36. package/dist/commands/health/report-view-model.js +16 -12
  37. package/dist/commands/health/scheduler-binary.js +1 -1
  38. package/dist/commands/health/semantic-search-check.js +85 -0
  39. package/dist/commands/health/type-directory-check.js +0 -3
  40. package/dist/commands/health.js +30 -42
  41. package/dist/commands/improve/consolidate/pair-pass.js +10 -25
  42. package/dist/commands/improve/consolidate.js +10 -15
  43. package/dist/commands/improve/distill.js +5 -17
  44. package/dist/commands/improve/eligibility.js +1 -3
  45. package/dist/commands/improve/execution.js +37 -40
  46. package/dist/commands/improve/extract-cli.js +6 -11
  47. package/dist/commands/improve/extract-prompt.js +2 -2
  48. package/dist/commands/improve/extract.js +67 -97
  49. package/dist/commands/improve/improve-cli.js +22 -128
  50. package/dist/commands/improve/improve-report.js +1 -1
  51. package/dist/commands/improve/improve-strategies.js +25 -108
  52. package/dist/commands/improve/improve.js +10 -14
  53. package/dist/commands/improve/loop-stages.js +3 -0
  54. package/dist/commands/improve/memory/memory-improve.js +1 -1
  55. package/dist/commands/improve/preparation.js +8 -13
  56. package/dist/commands/improve/reflect.js +203 -332
  57. package/dist/commands/improve/retrieval-scope.js +1 -1
  58. package/dist/commands/improve/session-asset.js +3 -2
  59. package/dist/commands/improve/stage.js +87 -115
  60. package/dist/commands/lint/base-linter.js +3 -3
  61. package/dist/commands/lint/env-key-rules.js +7 -6
  62. package/dist/commands/lint/index.js +3 -3
  63. package/dist/commands/models-cli.js +103 -63
  64. package/dist/commands/proposal/drain.js +26 -39
  65. package/dist/commands/proposal/proposal-cli.js +14 -18
  66. package/dist/commands/proposal/propose-cli.js +4 -2
  67. package/dist/commands/proposal/propose.js +37 -64
  68. package/dist/commands/proposal/repository.js +17 -17
  69. package/dist/commands/proposal/validators/proposal-validators.js +3 -6
  70. package/dist/commands/read/curate.js +10 -6
  71. package/dist/commands/read/registry-search.js +2 -48
  72. package/dist/commands/read/search-cli.js +1 -8
  73. package/dist/commands/read/search.js +5 -6
  74. package/dist/commands/read/show.js +6 -29
  75. package/dist/commands/remember.js +25 -40
  76. package/dist/commands/sources/add-cli.js +8 -63
  77. package/dist/commands/sources/bundle-cli.js +8 -9
  78. package/dist/commands/sources/bundle-config-ops.js +2 -2
  79. package/dist/commands/sources/info.js +12 -1
  80. package/dist/commands/sources/init.js +1 -1
  81. package/dist/commands/sources/installed-stashes.js +119 -63
  82. package/dist/commands/sources/migration-help.js +1 -1
  83. package/dist/commands/sources/plugin-upgrade.js +8 -15
  84. package/dist/commands/sources/schema-repair.js +4 -10
  85. package/dist/commands/sources/source-add.js +2 -2
  86. package/dist/commands/sources/source-clone.js +31 -7
  87. package/dist/commands/sources/source-manage.js +4 -4
  88. package/dist/commands/targets.js +175 -0
  89. package/dist/commands/tasks/explain.js +104 -69
  90. package/dist/commands/tasks/tasks-cli.js +9 -11
  91. package/dist/commands/tasks/tasks.js +75 -97
  92. package/dist/commands/ui/api.js +11 -3
  93. package/dist/commands/ui/redact.js +5 -31
  94. package/dist/commands/ui/workspace-actions.js +1 -1
  95. package/dist/commands/workflow/plan.js +48 -9
  96. package/dist/commands/workflow-cli.js +40 -45
  97. package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
  98. package/dist/core/adapter/adapters/akm-adapter.js +36 -41
  99. package/dist/core/adapter/adapters/akm-lint.js +10 -12
  100. package/dist/core/adapter/adapters/akm-metadata.js +2 -2
  101. package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
  102. package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
  103. package/dist/core/adapter/adapters/claude-adapter.js +1 -1
  104. package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
  105. package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
  106. package/dist/core/adapter/adapters/index.js +3 -4
  107. package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
  108. package/dist/core/adapter/adapters/okf-adapter.js +8 -10
  109. package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
  110. package/dist/core/adapter/adapters/shared.js +3 -3
  111. package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
  112. package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
  113. package/dist/core/adapter/detect-adapter.js +1 -1
  114. package/dist/core/adapter/execution-source.js +13 -35
  115. package/dist/core/adapter/registry.js +1 -1
  116. package/dist/core/adapter/validate-context.js +2 -4
  117. package/dist/core/asset/asset-placement.js +1 -1
  118. package/dist/core/asset/asset-ref.js +3 -3
  119. package/dist/core/asset/resolve-ref.js +5 -0
  120. package/dist/core/bundle-rename.js +12 -4
  121. package/dist/core/closest-match.js +37 -0
  122. package/dist/core/common.js +37 -57
  123. package/dist/core/config/config-io.js +26 -18
  124. package/dist/core/config/config-schema.js +19 -106
  125. package/dist/core/config/config-sources.js +3 -3
  126. package/dist/core/config/config-types.js +4 -4
  127. package/dist/core/config/config-walker.js +50 -77
  128. package/dist/core/config/config.js +438 -109
  129. package/dist/core/config/convert-engine-references.js +114 -0
  130. package/dist/core/config/convert-engines-shared.js +40 -0
  131. package/dist/core/config/convert-engines.js +300 -0
  132. package/dist/core/config/convert-models-overlay.js +137 -0
  133. package/dist/core/config/credentials.js +304 -0
  134. package/dist/core/config/engine-semantics.js +3 -3
  135. package/dist/core/config/migrate-keys.js +222 -0
  136. package/dist/core/config/model-aliases.js +37 -0
  137. package/dist/core/config/models-file.js +34 -0
  138. package/dist/core/config/retired-engines.js +53 -0
  139. package/dist/core/config/schema/connections.js +41 -0
  140. package/dist/core/config/schema/embedding.js +2 -2
  141. package/dist/core/config/schema/harnesses.js +41 -0
  142. package/dist/core/config/schema/improve-processes.js +9 -28
  143. package/dist/core/config/schema/improve.js +36 -1
  144. package/dist/core/config/schema/index-config.js +18 -20
  145. package/dist/core/config/schema/primitives.js +42 -17
  146. package/dist/core/config/schema/search.js +6 -11
  147. package/dist/core/config/schema/sources-bundles.js +9 -9
  148. package/dist/core/config/schema/workflow.js +2 -6
  149. package/dist/core/config/unusable-entries.js +66 -0
  150. package/dist/core/content-safety.js +3 -6
  151. package/dist/core/endpoint-url.js +47 -0
  152. package/dist/core/env-secret-ref.js +84 -73
  153. package/dist/core/errors.js +10 -16
  154. package/dist/core/extra-params.js +3 -3
  155. package/dist/core/improve-result.js +8 -9
  156. package/dist/core/json-schema.js +1 -1
  157. package/dist/core/lesson-lint.js +1 -1
  158. package/dist/core/llm-inference.js +80 -0
  159. package/dist/core/parse.js +2 -2
  160. package/dist/core/paths.js +33 -10
  161. package/dist/core/recognition-util.js +8 -10
  162. package/dist/core/redaction.js +94 -55
  163. package/dist/core/ref-token.js +82 -0
  164. package/dist/core/secret-value.js +14 -0
  165. package/dist/core/state/migrations.js +17 -22
  166. package/dist/core/structured.js +2 -68
  167. package/dist/core/subprocess.js +63 -22
  168. package/dist/core/type-presentation.js +10 -14
  169. package/dist/core/write-source.js +20 -4
  170. package/dist/execution/input-contract.js +3 -6
  171. package/dist/execution/notices.js +49 -0
  172. package/dist/execution/resolved-request.js +24 -40
  173. package/dist/execution/source.js +21 -45
  174. package/dist/execution/target-ref.js +2 -2
  175. package/dist/indexer/bundle-identity-guard.js +6 -5
  176. package/dist/indexer/ensure-index.js +1 -1
  177. package/dist/indexer/index-writer-lock.js +1 -1
  178. package/dist/indexer/indexer.js +46 -42
  179. package/dist/indexer/installations.js +12 -22
  180. package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
  181. package/dist/indexer/materialize-embeddings.js +20 -16
  182. package/dist/indexer/passes/memory-inference.js +21 -50
  183. package/dist/indexer/passes/metadata.js +5 -5
  184. package/dist/indexer/scan/doc-to-entry.js +1 -1
  185. package/dist/indexer/scan/drain-dir.js +9 -11
  186. package/dist/indexer/search/db-search.js +9 -7
  187. package/dist/indexer/search/search-source.js +42 -22
  188. package/dist/indexer/usage/usage-events.js +2 -3
  189. package/dist/indexer/walk/index-context.js +2 -1
  190. package/dist/indexer/walk/matchers.js +3 -11
  191. package/dist/indexer/walk/path-resolver.js +13 -68
  192. package/dist/indexer/walk/walker.js +32 -26
  193. package/dist/integrations/agent/akm-read-tools.js +81 -0
  194. package/dist/integrations/agent/config.js +1 -1
  195. package/dist/integrations/agent/detect.js +32 -36
  196. package/dist/integrations/agent/execution.js +130 -428
  197. package/dist/integrations/agent/index.js +1 -1
  198. package/dist/integrations/agent/profiles.js +24 -28
  199. package/dist/integrations/agent/prompts.js +17 -30
  200. package/dist/integrations/agent/request-lowering.js +67 -101
  201. package/dist/integrations/agent/resolution.js +332 -0
  202. package/dist/integrations/agent/runner-dispatch.js +156 -181
  203. package/dist/integrations/agent/runner.js +20 -70
  204. package/dist/integrations/agent/runtime-port.js +4 -0
  205. package/dist/integrations/agent/runtime.js +10 -0
  206. package/dist/integrations/agent/spawn.js +65 -190
  207. package/dist/integrations/harnesses/aider/index.js +19 -39
  208. package/dist/integrations/harnesses/amazonq/index.js +17 -32
  209. package/dist/integrations/harnesses/claude/index.js +59 -28
  210. package/dist/integrations/harnesses/claude/session-log.js +7 -5
  211. package/dist/integrations/harnesses/codex/index.js +19 -31
  212. package/dist/integrations/harnesses/copilot/index.js +17 -35
  213. package/dist/integrations/harnesses/gemini/index.js +18 -34
  214. package/dist/integrations/harnesses/harness.js +36 -0
  215. package/dist/integrations/harnesses/index.js +20 -51
  216. package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
  217. package/dist/integrations/harnesses/opencode/index.js +11 -33
  218. package/dist/integrations/harnesses/opencode/roots.js +50 -0
  219. package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
  220. package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
  221. package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
  222. package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
  223. package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
  224. package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
  225. package/dist/integrations/harnesses/opencode/session-log.js +58 -137
  226. package/dist/integrations/harnesses/opencode/version.js +34 -53
  227. package/dist/integrations/harnesses/openhands/index.js +13 -37
  228. package/dist/integrations/harnesses/pi/index.js +21 -32
  229. package/dist/integrations/lockfile.js +1 -1
  230. package/dist/integrations/session-logs/index.js +11 -31
  231. package/dist/llm/client.js +93 -111
  232. package/dist/llm/embedder.js +19 -34
  233. package/dist/llm/embedders/connection.js +31 -0
  234. package/dist/llm/embedders/local-model-files.js +56 -0
  235. package/dist/llm/embedders/local.js +146 -115
  236. package/dist/llm/embedders/remote.js +26 -23
  237. package/dist/llm/embedders/types.js +1 -1
  238. package/dist/llm/index-passes.js +33 -39
  239. package/dist/llm/memory-infer.js +67 -77
  240. package/dist/llm/model-list.js +35 -0
  241. package/dist/llm/rerank-client.js +8 -14
  242. package/dist/llm/structured-call.js +45 -99
  243. package/dist/llm/structured.js +60 -0
  244. package/dist/output/renderers.js +2 -8
  245. package/dist/output/shapes/helpers.js +18 -44
  246. package/dist/output/shapes/passthrough.js +1 -0
  247. package/dist/output/shapes.js +1 -7
  248. package/dist/output/text/command-format.js +41 -39
  249. package/dist/output/text/health-format.js +8 -2
  250. package/dist/output/text/helpers.js +1 -1
  251. package/dist/output/text/migrate.js +12 -0
  252. package/dist/output/text/models.js +3 -2
  253. package/dist/output/text/registry-commands.js +1 -2
  254. package/dist/output/text/show-directives.js +16 -28
  255. package/dist/output/text/show-format.js +0 -2
  256. package/dist/output/text/targets-table.js +70 -0
  257. package/dist/output/text/workflow-format.js +44 -15
  258. package/dist/output/text.js +1 -1
  259. package/dist/registry/providers/skills-sh.js +1 -28
  260. package/dist/registry/providers/static-index.js +1 -71
  261. package/dist/runtime.js +6 -2
  262. package/dist/scripts/akm-migrate-node.js +47095 -44905
  263. package/dist/scripts/akm-migrate.js +46946 -44755
  264. package/dist/setup/detect.js +28 -273
  265. package/dist/setup/endpoint.js +36 -0
  266. package/dist/setup/semantic-assets.js +13 -19
  267. package/dist/setup/setup-flags.js +77 -0
  268. package/dist/setup/setup-plan.js +144 -0
  269. package/dist/setup/setup.js +134 -358
  270. package/dist/setup/steps/connection-shared.js +49 -101
  271. package/dist/setup/steps/connection.js +121 -524
  272. package/dist/setup/steps/embeddings.js +151 -0
  273. package/dist/setup/steps/harnesses.js +118 -0
  274. package/dist/setup/steps/platforms.js +2 -81
  275. package/dist/setup/steps/tasks.js +1 -2
  276. package/dist/setup/steps.js +10 -0
  277. package/dist/setup/summary.js +67 -0
  278. package/dist/sources/freshness.js +16 -21
  279. package/dist/sources/providers/git-provider.js +2 -9
  280. package/dist/sources/providers/provider-utils.js +13 -5
  281. package/dist/sources/resolve.js +12 -16
  282. package/dist/sources/snapshot-fetchers/robots.js +11 -12
  283. package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
  284. package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
  285. package/dist/sources/snapshot-fetchers/x.js +1 -1
  286. package/dist/standalone/onnxruntime-library.js +52 -0
  287. package/dist/storage/repositories/improve-ledger-repository.js +1 -1
  288. package/dist/storage/repositories/improve-runs-repository.js +0 -13
  289. package/dist/storage/repositories/index-entries-repository.js +2 -2
  290. package/dist/storage/repositories/proposals-repository.js +2 -2
  291. package/dist/storage/repositories/task-history-repository.js +2 -2
  292. package/dist/storage/repositories/workflow-runs-repository.js +44 -129
  293. package/dist/storage/sqlite-read-snapshot.js +33 -29
  294. package/dist/tasks/embedded.js +1 -1
  295. package/dist/tasks/log-redaction.js +7 -119
  296. package/dist/tasks/prepare/prepare-support.js +8 -7
  297. package/dist/tasks/prepare/prepare.js +8 -9
  298. package/dist/tasks/prepare/script-capture.js +9 -25
  299. package/dist/tasks/run/attempt-lifecycle.js +17 -35
  300. package/dist/tasks/run/load-task.js +54 -27
  301. package/dist/tasks/run/run-command-task.js +15 -10
  302. package/dist/tasks/run/run-native-task.js +8 -21
  303. package/dist/tasks/run/run-task.js +5 -8
  304. package/dist/tasks/run/run-workflow-task.js +14 -21
  305. package/dist/tasks/run/task-history.js +9 -17
  306. package/dist/tasks/run/task-log.js +1 -5
  307. package/dist/tasks/scheduler-invocation.js +13 -18
  308. package/dist/tasks/scheduler-sync.js +0 -1
  309. package/dist/tasks/source/bounded-document.js +31 -117
  310. package/dist/tasks/source/parse-task-source.js +0 -1
  311. package/dist/tasks/source/project-v4.js +5 -3
  312. package/dist/tasks/source/task-input-diagnostics.js +3 -4
  313. package/dist/tasks/source/task-source-v4.js +48 -72
  314. package/dist/tasks/source-v3.js +2 -5
  315. package/dist/tasks/task-run-reserved-flags.js +1 -2
  316. package/dist/workflows/authoring/authoring.js +2 -7
  317. package/dist/workflows/compile.js +1 -15
  318. package/dist/workflows/concurrency-policy.js +4 -4
  319. package/dist/workflows/exec/child-workflow.js +1 -4
  320. package/dist/workflows/exec/dispatch-redaction.js +35 -86
  321. package/dist/workflows/exec/environment.js +13 -77
  322. package/dist/workflows/exec/exec-unit.js +14 -55
  323. package/dist/workflows/exec/frozen-judge.js +26 -28
  324. package/dist/workflows/exec/native-executor.js +126 -71
  325. package/dist/workflows/exec/run-workflow.js +38 -42
  326. package/dist/workflows/exec/step-work.js +13 -17
  327. package/dist/workflows/exec/unit-dispatch.js +7 -21
  328. package/dist/workflows/freeze/environment.js +14 -119
  329. package/dist/workflows/freeze/freeze.js +14 -33
  330. package/dist/workflows/freeze/step-values.js +6 -13
  331. package/dist/workflows/freeze/targets/child-workflow.js +3 -5
  332. package/dist/workflows/freeze/targets/command.js +9 -15
  333. package/dist/workflows/freeze/targets/shell.js +0 -3
  334. package/dist/workflows/freeze/task-bindings.js +0 -1
  335. package/dist/workflows/parser.js +50 -59
  336. package/dist/workflows/plan.js +8 -2
  337. package/dist/workflows/renderer.js +83 -9
  338. package/dist/workflows/resource-limits.js +2 -2
  339. package/dist/workflows/runtime/run-plan.js +38 -23
  340. package/dist/workflows/runtime/runs.js +55 -93
  341. package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
  342. package/dist/workflows/source-files.js +7 -19
  343. package/docs/README.md +10 -16
  344. package/docs/architecture/README.md +2 -37
  345. package/docs/architecture/adapters.md +2 -2
  346. package/docs/architecture/akm-core-principles.md +256 -118
  347. package/docs/architecture/architecture.md +283 -99
  348. package/docs/architecture/improvement.md +8 -2
  349. package/docs/architecture/internals/classification.md +1 -3
  350. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
  351. package/docs/architecture/internals/health-advisories.md +35 -74
  352. package/docs/architecture/internals/improve-workflow.md +27 -26
  353. package/docs/architecture/internals/indexing.md +3 -3
  354. package/docs/architecture/internals/storage-locations.md +48 -15
  355. package/docs/architecture/persisted-data-compat.md +10 -6
  356. package/docs/architecture/specs/okf-support.md +9 -11
  357. package/docs/architecture/specs/ref.md +7 -9
  358. package/docs/architecture/testing/testing-workflow.md +172 -52
  359. package/docs/architecture/workflow-engine.md +51 -34
  360. package/docs/guides/README.md +0 -1
  361. package/docs/guides/author-bundles.md +15 -20
  362. package/docs/guides/author-workflows.md +93 -71
  363. package/docs/guides/bundles.md +20 -16
  364. package/docs/guides/discover-and-load.md +1 -1
  365. package/docs/guides/getting-started.md +49 -3
  366. package/docs/guides/improve-the-library.md +10 -4
  367. package/docs/guides/recipes/headless-install.md +11 -16
  368. package/docs/guides/run-workflows.md +29 -20
  369. package/docs/guides/scheduling.md +2 -2
  370. package/docs/guides/use-with-any-agent.md +20 -22
  371. package/docs/integration/bundling-akm.md +19 -9
  372. package/docs/maintainers/README.md +2 -6
  373. package/docs/maintainers/release-checklist.md +73 -126
  374. package/docs/migration/README.md +10 -3
  375. package/docs/migration/release-notes/0.10.0.md +81 -16
  376. package/docs/migration/release-notes/0.6.0.md +1 -1
  377. package/docs/migration/release-notes/0.7.0.md +1 -1
  378. package/docs/migration/release-notes/0.9.0.md +1 -1
  379. package/docs/migration/release-notes/README.md +1 -1
  380. package/docs/migration/v0.9-to-v0.10.md +300 -60
  381. package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
  382. package/docs/posts/config-v2-lessons-16.md +1 -1
  383. package/docs/posts/llm-mode-reflect-13.md +1 -1
  384. package/docs/posts/release-0.6.0.md +11 -11
  385. package/docs/posts/release-0.8.0.md +4 -4
  386. package/docs/posts/workflows-vaults-09.md +1 -1
  387. package/docs/reference/README.md +1 -1
  388. package/docs/reference/asset-types.md +2 -2
  389. package/docs/reference/cli.md +477 -388
  390. package/docs/reference/configuration.md +569 -550
  391. package/docs/reference/data-and-telemetry.md +9 -6
  392. package/docs/reference/env-and-secrets.md +72 -15
  393. package/docs/reference/refs.md +3 -20
  394. package/docs/reference/registry.md +12 -38
  395. package/docs/reference/supported-formats.md +1 -1
  396. package/docs/reference/tasks.md +22 -11
  397. package/docs/reference/ui-api.md +14 -9
  398. package/docs/reference/workflow-schema.md +199 -154
  399. package/docs/reference/workflows.md +4 -6
  400. package/package.json +9 -11
  401. package/schemas/akm-config.json +1696 -2922
  402. package/schemas/akm-task.json +4 -4
  403. package/schemas/akm-workflow.json +36 -9
  404. package/ROADMAP.md +0 -112
  405. package/dist/assets/models.json +0 -35
  406. package/dist/commands/health/engine-usage.js +0 -45
  407. package/dist/commands/sources/dangerous-env-audit.js +0 -134
  408. package/dist/core/activation-policy.js +0 -67
  409. package/dist/core/config/schema/engines.js +0 -160
  410. package/dist/core/config/schema/execution.js +0 -23
  411. package/dist/core/spawn-env.js +0 -268
  412. package/dist/execution/directory-identity.js +0 -78
  413. package/dist/integrations/agent/builder-shared.js +0 -33
  414. package/dist/integrations/agent/builders.js +0 -43
  415. package/dist/integrations/agent/engine-fallback.js +0 -59
  416. package/dist/integrations/agent/engine-resolution.js +0 -333
  417. package/dist/integrations/agent/model-map.js +0 -475
  418. package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
  419. package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
  420. package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
  421. package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
  422. package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
  423. package/dist/integrations/harnesses/claude/config-import.js +0 -67
  424. package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
  425. package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
  426. package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
  427. package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
  428. package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
  429. package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
  430. package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
  431. package/dist/integrations/harnesses/opencode/config-import.js +0 -149
  432. package/dist/integrations/harnesses/opencode/model-config.js +0 -33
  433. package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
  434. package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
  435. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
  436. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
  437. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
  438. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
  439. package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
  440. package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
  441. package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
  442. package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
  443. package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
  444. package/dist/integrations/harnesses/shared.js +0 -18
  445. package/dist/integrations/harnesses/types.js +0 -55
  446. package/dist/llm/feature-gate.js +0 -115
  447. package/dist/output/shapes/models-list.js +0 -16
  448. package/dist/output/shapes/registry-search.js +0 -10
  449. package/dist/setup/detected-engines.js +0 -136
  450. package/dist/setup/engine-config.js +0 -97
  451. package/dist/setup/harness-config-import.js +0 -47
  452. package/dist/setup/providers.js +0 -14
  453. package/dist/setup/steps/semantic.js +0 -39
  454. package/dist/workflows/authoring/scope-key.js +0 -79
  455. package/dist/workflows/exec/lowering-notices.js +0 -23
  456. package/dist/workflows/source-semantics.js +0 -110
  457. package/docs/architecture/0.10-process-rules.md +0 -832
  458. package/docs/architecture/akm-architecture-decision-history.md +0 -2055
  459. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
  460. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
  461. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
  462. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
  463. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
  464. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
  465. package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
  466. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
  467. package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
  468. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
  469. package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
  470. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
  471. package/docs/architecture/decisions/README.md +0 -62
  472. package/docs/architecture/internals/functional-contract-patterns.md +0 -340
  473. package/docs/architecture/internals/registry-network-boundary.md +0 -57
  474. package/docs/architecture/internals/search.md +0 -248
  475. package/docs/architecture/reviews/env-secret-access.md +0 -319
  476. package/docs/architecture/runtime-boundary-design.md +0 -153
  477. package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
  478. package/docs/architecture/specs/0.9.0-decisions.md +0 -532
  479. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
  480. package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
  481. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
  482. package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
  483. package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
  484. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
  485. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
  486. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
  487. package/docs/architecture/specs/di-seams-plan.md +0 -539
  488. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
  489. package/docs/architecture/specs/fact-asset-type.md +0 -142
  490. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
  491. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
  492. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
  493. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
  494. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
  495. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
  496. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
  497. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
  498. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
  499. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
  500. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
  501. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
  502. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
  503. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
  504. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
  505. package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
  506. package/docs/architecture/specs/stash-organization-conventions.md +0 -377
  507. package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
  508. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
  509. package/docs/architecture/specs/workflow-format-unification.md +0 -432
  510. package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
  511. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
  512. package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
  513. package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
  514. package/docs/guides/knowledge-management.md +0 -18
  515. package/docs/maintainers/curate-workmap.md +0 -335
  516. package/docs/migration/v0.5-to-v0.6.md +0 -759
  517. package/docs/migration/v0.7-to-v0.8.md +0 -1378
  518. package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
@@ -2,6 +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
  import { getStringArg, parsePositiveIntFlag } from "../../cli/parse-args.js";
5
+ import { RETIRED_ENGINE_ARG, SELECTION_ARGS, selectionFromArgs } from "../../cli/selection.js";
5
6
  import { defineGroupCommand, defineJsonCommand, EXIT_CODES, output } from "../../cli/shared.js";
6
7
  import { loadConfig } from "../../core/config/config.js";
7
8
  import { isVerbose, setVerbose, warn, warnVerbose } from "../../core/warn.js";
@@ -30,8 +31,8 @@ export const commandRunCommand = defineJsonCommand({
30
31
  type: "string",
31
32
  description: "Override the command's agent selector with a portable agent ref or native harness selector",
32
33
  },
33
- engine: { type: "string", description: "Override the selected execution engine" },
34
- model: { type: "string", description: "Override the selected model alias or exact model identifier" },
34
+ ...SELECTION_ARGS,
35
+ ...RETIRED_ENGINE_ARG,
35
36
  "timeout-ms": { type: "string", description: "Override the execution timeout in milliseconds" },
36
37
  cwd: { type: "string", description: "Override the execution workspace/current working directory" },
37
38
  "dry-run": {
@@ -46,15 +47,10 @@ export const commandRunCommand = defineJsonCommand({
46
47
  const timeoutMs = parsePositiveIntFlag(exactStringArg(args, "timeout-ms"), "--timeout-ms");
47
48
  const current = {};
48
49
  const agent = getStringArg(args, "agent");
49
- const engine = getStringArg(args, "engine");
50
- const model = getStringArg(args, "model");
51
50
  const workspace = getStringArg(args, "cwd");
52
51
  if (agent !== undefined)
53
52
  current.agent = agent;
54
- if (engine !== undefined)
55
- current.engine = engine;
56
- if (model !== undefined)
57
- current.model = model;
53
+ Object.assign(current, selectionFromArgs(args));
58
54
  if (timeoutMs !== undefined)
59
55
  current.timeout = timeoutMs;
60
56
  if (workspace !== undefined)
@@ -1,13 +1,14 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ import { SHIPPED_ALIAS } from "../../core/config/model-aliases.js";
4
5
  import { UsageError } from "../../core/errors.js";
6
+ import { mergeNotices } from "../../execution/notices.js";
5
7
  import { createInlineResolvedCommand, createResolvedCommand, createResolvedPersona, } from "../../execution/resolved-request.js";
6
8
  import { isPortableExecutionAgentSelector, } from "../../execution/source.js";
7
9
  import { recordIndexedShowUsage } from "../../indexer/usage/show-usage.js";
8
10
  import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
9
- import { fallbackAnnouncement } from "../../integrations/agent/engine-fallback.js";
10
- import { buildExecution, resolveExecution, } from "../../integrations/agent/execution.js";
11
+ import { buildExecution, currentLayer, resolveExecution, shippedAlias, } from "../../integrations/agent/execution.js";
11
12
  import { runExecution } from "../../integrations/agent/runner-dispatch.js";
12
13
  import { parseBuiltinCommandAction } from "./builtin-action.js";
13
14
  import { loadAdapterExecutionSource, } from "./execution-source-loader.js";
@@ -106,18 +107,22 @@ export async function prepareCommandInvocation(options) {
106
107
  renderedPersona = rendered;
107
108
  }
108
109
  const persona = renderedPersona ? createResolvedPersona(renderedPersona) : selectedAgent.present ? null : undefined;
110
+ const layers = [
111
+ shippedAlias(SHIPPED_ALIAS.agent),
112
+ ...(renderedPersona
113
+ ? [{ id: renderedPersona.identity.ref, kind: "agent", values: renderedPersona.defaults }]
114
+ : []),
115
+ { id: renderedCommand?.identity.ref ?? "inline-command", kind: "command", values: commandDefaults },
116
+ ...(options.invocationDefaults
117
+ ? [{ id: "invocation-defaults", kind: "invocation-defaults", values: options.invocationDefaults }]
118
+ : []),
119
+ ...(options.current ? [currentLayer(options.current)] : []),
120
+ ];
109
121
  return resolveExecution({
110
122
  command,
111
123
  config: options.config,
112
124
  ...(persona !== undefined ? { persona } : {}),
113
- ...(renderedPersona ? { agentLayer: { id: renderedPersona.identity.ref, values: renderedPersona.defaults } } : {}),
114
- commandLayer: {
115
- id: renderedCommand?.identity.ref ?? "inline-command",
116
- values: commandDefaults,
117
- },
118
- ...(options.invocationDefaults ? { invocationDefaults: options.invocationDefaults } : {}),
119
- ...(options.current ? { current: options.current } : {}),
120
- ...(options.modelMap ? { modelMap: options.modelMap } : {}),
125
+ layers,
121
126
  });
122
127
  }
123
128
  function compareText(left, right) {
@@ -126,38 +131,27 @@ function compareText(left, right) {
126
131
  const DIAGNOSTIC_PROVENANCE_FIELDS = new Set([
127
132
  "/inference",
128
133
  "agent",
129
- "authorization",
130
134
  "command",
131
- "engine",
132
- "engine.requested",
133
135
  "model",
134
136
  "outputSchema",
135
137
  "persona",
136
138
  "runtime.environment",
137
- "runtime.settings",
138
139
  "runtime.timeoutMs",
139
140
  "runtime.workspace",
140
- "tools",
141
+ "target",
141
142
  ]);
142
143
  const DIAGNOSTIC_NOTICE_FIELDS = new Set([
143
144
  "agent",
144
145
  "command.content",
145
- "command.extensions",
146
146
  "conversation",
147
- "engine",
148
- "engine.extensions",
149
- "extensions",
150
147
  "inference",
151
148
  "model",
152
149
  "outputSchema",
153
150
  "persona",
154
- "persona.extensions",
155
151
  "runtime.environment",
156
- "runtime.extensions",
157
- "runtime.settings",
158
152
  "runtime.timeoutMs",
159
153
  "runtime.workspace",
160
- "tools",
154
+ "target",
161
155
  ]);
162
156
  function canonicalDiagnosticProvenanceField(field) {
163
157
  if (field.startsWith("/inference/"))
@@ -219,20 +213,15 @@ function safeDiagnosticNotice(notice) {
219
213
  severity: "info",
220
214
  adapter: notice.adapter,
221
215
  field: "persona",
222
- message: "The selected engine has no native persona channel; AKM composed the persona into the prompt.",
216
+ message: "The selected harness has no native persona channel; AKM composed the persona into the prompt.",
223
217
  });
224
218
  default:
225
219
  return undefined;
226
220
  }
227
221
  }
228
222
  function diagnosticNotices(notices) {
229
- const canonical = new Map();
230
- for (const notice of notices) {
231
- const safe = safeDiagnosticNotice(notice);
232
- if (safe)
233
- canonical.set(JSON.stringify(safe), safe);
234
- }
235
- return Object.freeze([...canonical.values()].sort((left, right) => compareText(JSON.stringify(left), JSON.stringify(right))));
223
+ const safe = notices.flatMap((notice) => safeDiagnosticNotice(notice) ?? []);
224
+ return Object.freeze([...(mergeNotices(safe) ?? [])].sort((left, right) => compareText(JSON.stringify(left), JSON.stringify(right))));
236
225
  }
237
226
  /**
238
227
  * Build a prepared invocation and project only safe structural diagnostics.
@@ -245,7 +234,7 @@ export function inspectPreparedCommandInvocation(prepared) {
245
234
  shape: "command-dry-run",
246
235
  ok: true,
247
236
  dryRun: true,
248
- engine: prepared.request.engine.name,
237
+ engine: prepared.request.target.name,
249
238
  provenance: diagnosticProvenance(prepared.provenance),
250
239
  notices: diagnosticNotices(built.notices),
251
240
  };
@@ -270,22 +259,19 @@ function resultEnvelope(result, engine, warnings, notices) {
270
259
  export async function dispatchPreparedCommandInvocation(prepared, options = {}) {
271
260
  const { request } = prepared;
272
261
  const built = buildExecution(request, prepared.runner);
273
- const selectedEngine = request.engine.name;
262
+ const selectedEngine = request.target.name;
274
263
  const result = await runExecution(built, runOptionsFor(options));
275
264
  const consumedRefs = new Set();
276
265
  if (request.command.source)
277
266
  consumedRefs.add(request.command.source.ref);
278
267
  if (request.persona)
279
268
  consumedRefs.add(request.persona.source.ref);
280
- // F-1 (spec §5.2 point 3): options.eventSource is only a FALLBACK — an
281
- // ambient AKM_EVENT_SOURCE still wins (D5 clause d). Absent, this is
282
- // byte-identical to the pre-P1b bare resolveUsageEventSource() call (P-07's
283
- // own default is "user").
269
+ // options.eventSource is only a FALLBACK — an ambient AKM_EVENT_SOURCE still
270
+ // wins. Absent, the default is "user".
284
271
  const eventSource = resolveUsageEventSource(process.env, options.eventSource ?? "user");
285
272
  for (const ref of consumedRefs)
286
273
  recordIndexedShowUsage(ref, eventSource);
287
- const announcement = fallbackAnnouncement(prepared.fallbackEngineName, selectedEngine);
288
- return resultEnvelope(result, selectedEngine, announcement ? [announcement] : [], built.notices);
274
+ return resultEnvelope(result, selectedEngine, [], built.notices);
289
275
  }
290
276
  export async function executeCommandInvocation(options, dispatchOptions = {}) {
291
277
  return dispatchPreparedCommandInvocation(await prepareCommandInvocation(options), dispatchOptions);
@@ -6,7 +6,7 @@ import fs from "node:fs";
6
6
  import path from "node:path";
7
7
  import { adapterForId } from "../../core/adapter/registry.js";
8
8
  import { parseBundleRef } from "../../core/asset/asset-ref.js";
9
- import { isWithin } from "../../core/common.js";
9
+ import { isContainedResolvedPath, isWithin } from "../../core/common.js";
10
10
  import { loadConfig } from "../../core/config/config.js";
11
11
  import { bundleComponentConfig, bundlesToSourceEntries } from "../../core/config/config-sources.js";
12
12
  import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
@@ -55,7 +55,7 @@ function isLexicallyWithin(candidate, root) {
55
55
  const relative = path.relative(path.resolve(root), path.resolve(candidate));
56
56
  return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
57
57
  }
58
- function implicitComponentForEntry(entry, config, realRoot) {
58
+ function implicitComponentForEntry(entry, config) {
59
59
  const sources = resolveSourceEntries(undefined, config);
60
60
  const installations = deriveInstallations(sources);
61
61
  for (const [index, installation] of installations.entries()) {
@@ -66,9 +66,6 @@ function implicitComponentForEntry(entry, config, realRoot) {
66
66
  if (!source || !component)
67
67
  continue;
68
68
  const canonicalRoot = realDirectory(component.root, `Canonical implicit source root for ${entry.bundleId}`);
69
- if (canonicalRoot !== realRoot) {
70
- warnOnce(`execution-source-root-drift:${entry.itemRef}`, `[command] Indexed root for ${JSON.stringify(entry.itemRef)} no longer matches the working bundle source; re-resolving from live config. Run \`akm index --full\` to refresh it.`);
71
- }
72
69
  if (component.adapter !== entry.adapterId) {
73
70
  warnOnce(`execution-source-adapter-drift:${entry.itemRef}`, `[command] Indexed adapter ${JSON.stringify(entry.adapterId)} for ${JSON.stringify(entry.itemRef)} no longer matches the working source's adapter ${JSON.stringify(component.adapter)}; re-resolving from live config. Run \`akm index --full\` to refresh it.`);
74
71
  }
@@ -84,7 +81,7 @@ function implicitComponentForEntry(entry, config, realRoot) {
84
81
  function componentForEntry(entry, config, realRoot) {
85
82
  const configured = config.bundles?.[entry.bundleId];
86
83
  if (!configured) {
87
- const implicit = implicitComponentForEntry(entry, config, realRoot);
84
+ const implicit = implicitComponentForEntry(entry, config);
88
85
  if (implicit)
89
86
  return implicit;
90
87
  throw new ConfigError(`Indexed execution source ${JSON.stringify(entry.itemRef)} belongs to unconfigured bundle ${JSON.stringify(entry.bundleId)}.`, "INVALID_CONFIG_FILE", "Refresh the bundle configuration and rebuild the index before dispatching this asset.");
@@ -116,9 +113,6 @@ function componentForEntry(entry, config, realRoot) {
116
113
  if (!isWithin(configuredRoot, configuredSourceRoot)) {
117
114
  throw new ConfigError(`Configured component root for ${JSON.stringify(entry.itemRef)} resolves outside its materialized bundle source.`, "INVALID_CONFIG_FILE", "Remove the escaping symlink or component path, then run `akm index --full`.");
118
115
  }
119
- if (configuredRoot !== realRoot) {
120
- warnOnce(`execution-source-root-drift:${entry.itemRef}`, `[command] Indexed root for ${JSON.stringify(entry.itemRef)} no longer matches the ${JSON.stringify(configuredSource.type)} bundle source; re-resolving from live config. Run \`akm index --full\` to refresh it.`);
121
- }
122
116
  }
123
117
  const writable = component?.writable ?? configured.writable ?? configured.path !== undefined;
124
118
  return Object.freeze({
@@ -131,8 +125,8 @@ function componentForEntry(entry, config, realRoot) {
131
125
  function expectedIndexedType(kind) {
132
126
  return kind === "command" ? "command" : "agent";
133
127
  }
134
- function assertRenderedIdentity(source, entry, realRoot, realFile, content) {
135
- const expectedFile = path.relative(realRoot, realFile).replace(/\\/g, "/");
128
+ function assertRenderedIdentity(source, entry, content) {
129
+ const expectedFile = path.relative(path.resolve(entry.stashDir), path.resolve(entry.filePath)).replace(/\\/g, "/");
136
130
  const expectedHash = createHash("sha256").update(content, "utf8").digest("hex");
137
131
  if (source.identity.ref !== entry.itemRef ||
138
132
  source.identity.bundle !== entry.bundleId ||
@@ -157,8 +151,10 @@ export async function loadAdapterExecutionSource(refInput, expectedKind, options
157
151
  }
158
152
  const config = await effectiveConfig(options.config);
159
153
  const realRoot = realDirectory(entry.stashDir, `Indexed component root for ${entry.itemRef}`);
160
- const realFile = realRegularFile(entry.filePath, `Indexed execution source ${entry.itemRef}`);
161
- if (!isWithin(realFile, realRoot) || realFile === realRoot) {
154
+ realRegularFile(entry.filePath, `Indexed execution source ${entry.itemRef}`);
155
+ // An index row must name a file inside its own component root. Checked on the
156
+ // authored path, so a file that is a symlink to one elsewhere still loads.
157
+ if (!isContainedResolvedPath(path.resolve(entry.filePath), path.resolve(entry.stashDir))) {
162
158
  throw new ConfigError(`Indexed execution source ${JSON.stringify(entry.itemRef)} resolves outside its component root.`, "INVALID_CONFIG_FILE", "Remove the escaping path and rebuild the index.");
163
159
  }
164
160
  const component = componentForEntry(entry, config, realRoot);
@@ -174,6 +170,6 @@ export async function loadAdapterExecutionSource(refInput, expectedKind, options
174
170
  if (!rendered || rendered.kind !== expectedKind) {
175
171
  throw new ConfigError(`Bundle adapter ${JSON.stringify(entry.adapterId)} did not render ${JSON.stringify(entry.itemRef)} as a ${expectedKind}.`, "INVALID_CONFIG_FILE", "Rebuild the index; if the mismatch remains, repair the source file or owning adapter.");
176
172
  }
177
- assertRenderedIdentity(rendered, entry, realRoot, realFile, fileContext.content());
173
+ assertRenderedIdentity(rendered, entry, fileContext.content());
178
174
  return rendered;
179
175
  }
@@ -58,7 +58,7 @@ function walkCommandTree(cmd, parentPath = "") {
58
58
  const valueFlags = [];
59
59
  if (cmd.args) {
60
60
  for (const [flagName, arg] of Object.entries(cmd.args)) {
61
- if (arg.type === "positional")
61
+ if (arg.type === "positional" || arg.hidden === true)
62
62
  continue;
63
63
  flags.push(`--${flagName}`);
64
64
  if (arg.type === "boolean" && arg.default === true)
@@ -9,14 +9,15 @@
9
9
  * zero lines here — the walker handles get/set/unset/coercion uniformly.
10
10
  *
11
11
  * `configVersion` is controlled by the config lifecycle. All execution
12
- * settings use their canonical engine/strategy paths; retired aliases are not
12
+ * settings use their canonical connection, harness and strategy paths; retired aliases are not
13
13
  * rewritten at this boundary.
14
14
  */
15
15
  import { isDeepStrictEqual } from "node:util";
16
16
  import { defineGroupCommand, defineJsonCommand, output } from "../cli/shared.js";
17
17
  import { isRecord } from "../core/common.js";
18
- import { DEFAULT_CONFIG, getConfigValueSource, loadConfig, mutateConfig, parseAndValidateConfigText, resolveConfigRefSource, } from "../core/config/config.js";
18
+ import { DEFAULT_CONFIG, getConfigValueSource, loadConfig, mutateConfig, parseAndValidateConfigText, resolveConfigRefSource, unusableEntryAt, } from "../core/config/config.js";
19
19
  import { configGet, configSet, configUnset, unknownKeyHint } from "../core/config/config-walker.js";
20
+ import { isEnvReference } from "../core/config/schema/primitives.js";
20
21
  import { UsageError } from "../core/errors.js";
21
22
  import { getConfigPath } from "../core/paths.js";
22
23
  import { formatRegistryUrl } from "../core/registry-url.js";
@@ -31,11 +32,13 @@ export function unsetConfigValue(config, key) {
31
32
  return configUnset(config, key);
32
33
  }
33
34
  export function listConfig(config) {
34
- // 0.9.0 (spec §10.1): sources live in `bundles` (spread from config); the
35
+ // Sources live in `bundles` (spread from config); the
35
36
  // retired top-level `sources[]` array is no longer surfaced.
36
37
  return redactConfigValue({ ...DEFAULT_CONFIG, ...config });
37
38
  }
38
39
  function redactConfigValue(value, path = []) {
40
+ if (path.at(-1) === "apiKey" && typeof value === "string" && !isEnvReference(value))
41
+ return undefined;
39
42
  if (typeof value === "string" && isRegistryUrlPath(path))
40
43
  return formatRegistryUrl(value);
41
44
  if (Array.isArray(value))
@@ -44,8 +47,7 @@ function redactConfigValue(value, path = []) {
44
47
  return value;
45
48
  const result = {};
46
49
  for (const [key, child] of Object.entries(value)) {
47
- if (key !== "apiKey" ||
48
- (typeof child === "string" && /^\$(?:[A-Za-z_][A-Za-z0-9_]*|\{[A-Za-z_][A-Za-z0-9_]*\})$/.test(child))) {
50
+ if (key !== "apiKey" || (typeof child === "string" && isEnvReference(child))) {
49
51
  result[key] = redactConfigValue(child, [...path, key]);
50
52
  }
51
53
  }
@@ -195,6 +197,13 @@ export const configCommand = defineGroupCommand({
195
197
  if (source.startsWith("extends:")) {
196
198
  throw new UsageError(`Config key "${args.key}" is inherited from ${source} and cannot be unset here.`, "TARGET_NOT_UPDATABLE", `Override it locally with "akm config set ${args.key} <value>", or edit the base file directly.`);
197
199
  }
200
+ // An entry the reader drops is not in the config `unsetConfigValue` sees, so it would no-op and say ok.
201
+ const ignored = unusableEntryAt(args.key);
202
+ if (ignored) {
203
+ throw new UsageError(`Config key "${args.key}" is inside ${ignored.kind} "${ignored.name}", which akm ignores (${ignored.why}), so \`akm config\` cannot edit it.`, "TARGET_NOT_UPDATABLE", ignored.inFile
204
+ ? `Remove or fix the ${ignored.group}.${ignored.name} entry in ${getConfigPath()} by hand.`
205
+ : `${getConfigPath()} is still in the retired engines form: run \`akm migrate apply\` first, then fix or remove the entry.`);
206
+ }
198
207
  const result = mutateConfig((current) => unsetConfigValue(current, args.key), { absentNoop: true });
199
208
  const updated = result.config;
200
209
  if (!args.silent) {
@@ -1,7 +1,10 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { WIN32_SPAWN_ENV_FLOOR } from "../../core/spawn-env.js";
4
+ /**
5
+ * What `env run --clean` / `secret run --clean` keeps of the parent environment. The user typed
6
+ * the flag to get a minimal one; without the last eight names Windows cannot create the process.
7
+ */
5
8
  const CLEAN_ENV_ALLOWLIST = [
6
9
  "HOME",
7
10
  "PATH",
@@ -31,6 +34,14 @@ const CLEAN_ENV_ALLOWLIST = [
31
34
  "TZ",
32
35
  "NO_COLOR",
33
36
  "COLORTERM",
37
+ "SystemRoot",
38
+ "SystemDrive",
39
+ "WINDIR",
40
+ "COMSPEC",
41
+ "PATHEXT",
42
+ "USERPROFILE",
43
+ "HOMEDRIVE",
44
+ "HOMEPATH",
34
45
  ];
35
46
  export function buildChildEnv(parentEnv, options) {
36
47
  const base = options.clean ? {} : { ...parentEnv };
@@ -39,19 +50,6 @@ export function buildChildEnv(parentEnv, options) {
39
50
  if (parentEnv[key] !== undefined)
40
51
  base[key] = parentEnv[key];
41
52
  }
42
- // The allowlist above is POSIX-shaped. On Windows a child started without
43
- // SystemRoot/COMSPEC/PATHEXT and friends frequently cannot start at all —
44
- // which is why every other spawn path in the codebase applies this floor
45
- // (see spawnEnvNamesFor). `env run --clean` / `secret run --clean` did not,
46
- // so clean-mode injection was unusable there. The floor is names the OS
47
- // requires of any child, not user configuration, so it does not weaken what
48
- // "clean" means about inherited secrets.
49
- if (process.platform === "win32") {
50
- for (const key of WIN32_SPAWN_ENV_FLOOR) {
51
- if (parentEnv[key] !== undefined)
52
- base[key] = parentEnv[key];
53
- }
54
- }
55
53
  }
56
54
  for (const key of options.inherit) {
57
55
  if (parentEnv[key] !== undefined)
@@ -9,37 +9,43 @@
9
9
  * REUSES the exact same machinery instead of forking it. Every safety
10
10
  * invariant carries over unchanged:
11
11
  *
12
- * - `${secret:NAME}` tokens resolve against the env's own stash; a missing
13
- * secret is a hard error and NOTHING is injected (no partial injection).
14
- * - Known process-hijacking keys (LD_PRELOAD, PATH, …) are blocked for
15
- * third-party-sourced stashes and warned about for first-party ones.
12
+ * - `${ref}` tokens resolve through the one ref walk (a `secrets/` ref to the
13
+ * secret's trimmed value, any other asset ref to its absolute path); a
14
+ * missing ref is a hard error and NOTHING is injected (no partial injection).
16
15
  * - An `env_access` audit event records key NAMES only, never values.
17
16
  * - Resolved values must never be written to stdout or logs by callers.
18
17
  */
19
- import fs from "node:fs";
20
- import path from "node:path";
21
- import { decideDangerousEnvInjection } from "../../core/activation-policy.js";
22
- import { assetPathForName } from "../../core/asset/asset-placement.js";
23
- import { isWithin } from "../../core/common.js";
24
- import { makeEnvRef, makeSecretRef, resolveEnvPath } from "../../core/env-secret-ref.js";
18
+ import { isInstalledBundle, makeEnvRef, resolveEnvPath, resolveRefOwner } from "../../core/env-secret-ref.js";
25
19
  import { NotFoundError, UsageError } from "../../core/errors.js";
26
20
  import { appendEvent } from "../../core/events.js";
27
- import { isDangerousEnvKey } from "../lint/env-key-rules.js";
28
- import { loadEnv, resolveSecretTokens } from "./env.js";
29
- import { readValue } from "./secret.js";
21
+ import { substituteRefTokens } from "../../core/ref-token.js";
22
+ import { readValue } from "../../core/secret-value.js";
23
+ import { warnOnce } from "../../core/warn.js";
24
+ import { loadEnv } from "./env.js";
25
+ /** The retired `${secret:NAME}` env-value token (see `resolveEnvBinding`). */
26
+ const LEGACY_SECRET_TOKEN_RE = /\$\{secret:([^}\s]+)\}/g;
27
+ /**
28
+ * What a `${ref}` token stands for: a `secrets/` ref yields the secret's
29
+ * trimmed value, any other asset ref its absolute path, a ref no bundle owns
30
+ * `undefined`. The one resolver behind env values and exec argv.
31
+ */
32
+ export function resolveRefToken(ref) {
33
+ const owner = resolveRefOwner(ref);
34
+ if (owner === undefined)
35
+ return undefined;
36
+ return owner.type === "secret"
37
+ ? { kind: "secret", value: readValue(owner.absPath) }
38
+ : { kind: "path", path: owner.absPath };
39
+ }
30
40
  /**
31
41
  * Resolve an env ref to its injectable values: load the file, apply key
32
- * filtering, substitute `${secret:NAME}` tokens from the sibling secrets
33
- * directory, enforce the dangerous-key policy, and append the keys-only
42
+ * filtering, substitute `${ref}` tokens, and append the keys-only
34
43
  * `env_access` audit event.
35
44
  */
36
45
  export function resolveEnvBinding(target, options = {}) {
37
46
  const warn = options.warn ?? ((message) => process.stderr.write(`warning: ${message}\n`));
38
- const { name, absPath, source } = resolveEnvPath(target);
47
+ const { name, absPath, source, bundleId } = resolveEnvPath(target);
39
48
  const envRef = makeEnvRef(name, source);
40
- if (!fs.existsSync(absPath)) {
41
- throw new NotFoundError(`Env not found: ${envRef}`);
42
- }
43
49
  const allValues = loadEnv(absPath);
44
50
  // Value-safe key filtering (--only / --except operate on key NAMES only).
45
51
  let envValues = allValues;
@@ -58,49 +64,32 @@ export function resolveEnvBinding(target, options = {}) {
58
64
  const excluded = new Set(options.except);
59
65
  envValues = Object.fromEntries(Object.entries(allValues).filter(([k]) => !excluded.has(k)));
60
66
  }
61
- // Substitute `${secret:NAME}` tokens with the sibling secret asset in the
62
- // SAME stash. A missing secret is a hard error — inject NOTHING.
63
- const secretsRoot = path.join(source.path, "secrets");
64
- const resolveSecret = (secretName) => {
65
- const secretPath = assetPathForName("secret", secretsRoot, secretName);
66
- // Defense-in-depth: ensure the resolved path stays inside the secrets dir.
67
- if (!isWithin(secretPath, secretsRoot)) {
68
- throw new UsageError(`Secret name "${secretName}" escapes the secrets directory.`);
69
- }
70
- if (!fs.existsSync(secretPath))
71
- return undefined;
72
- // Match `secret run`: read utf8, do not trim (stay consistent with that path).
73
- return readValue(secretPath).toString("utf8");
74
- };
75
- const { values: substituted, missing } = resolveSecretTokens(envValues, resolveSecret);
67
+ // Read-compat: env files written for 0.9 / early 0.10 spell a secret
68
+ // `${secret:NAME}`, meaning `secrets/NAME` in this env asset's own bundle.
69
+ // Read it as the `${ref}` it stands for; the file is bundle content and is
70
+ // never rewritten.
71
+ let firstLegacy;
72
+ envValues = Object.fromEntries(Object.entries(envValues).map(([key, value]) => [
73
+ key,
74
+ value.replace(LEGACY_SECRET_TOKEN_RE, (_token, secretName) => {
75
+ const spelling = `\${${bundleId}//secrets/${secretName}}`;
76
+ firstLegacy ??= spelling;
77
+ return spelling;
78
+ }),
79
+ ]));
80
+ if (firstLegacy !== undefined) {
81
+ warnOnce(`legacy-secret-token:${envRef}`, `Env "${envRef}" uses the retired \${secret:NAME} spelling; reading it as ${firstLegacy}. Write the full ref in the env file.`);
82
+ }
83
+ // Substitute `${ref}` tokens. A missing ref is a hard error — inject NOTHING.
84
+ const { values: substituted, missing, secretValues, } = substituteRefTokens(envValues, resolveRefToken, isInstalledBundle);
76
85
  if (missing.length > 0) {
77
- throw new NotFoundError(`Env "${envRef}" references secret(s) not found in its stash: ${missing.map((n) => makeSecretRef(n)).join(", ")}. Nothing was injected.`, "FILE_NOT_FOUND", `Create the missing secret, e.g. \`akm secret set ${makeSecretRef(missing[0])}\`.`);
86
+ throw new NotFoundError(`Env "${envRef}" references asset(s) that no bundle owns: ${missing.join(", ")}. Nothing was injected.`, "FILE_NOT_FOUND",
87
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${ref}` token syntax documented for users, not interpolation
88
+ "Write each `${ref}` as a full akm ref that exists, e.g. `${secrets/name}` or `${team//scripts/run.sh}`.");
78
89
  }
79
90
  envValues = substituted;
80
91
  const keys = Object.keys(envValues);
81
- // Scan injected keys for known process-hijacking variables. The workspace
82
- // activation policy decides block (third-party, registryId set) vs. warn
83
- // (first-party stash, where the operator owns the file).
84
- const dangerous = keys.filter(isDangerousEnvKey);
85
- if (dangerous.length > 0) {
86
- const detail = `Env "${envRef}" injects process-hijacking variable(s): ${dangerous.join(", ")}.`;
87
- const decision = decideDangerousEnvInjection({
88
- dangerousKeys: dangerous,
89
- thirdParty: Boolean(source.registryId),
90
- allowDangerousEnvKeys: options.allowDangerousEnvKeys,
91
- });
92
- if (decision === "block") {
93
- throw new UsageError(`Refusing to inject env from a third-party stash. ${detail}\n` +
94
- ` Review the file, then copy the values into a first-party env if you trust them, ` +
95
- `or pass --allow-dangerous-env-keys once you have.`, "INVALID_FLAG_VALUE");
96
- }
97
- if (decision === "warn") {
98
- warn(options.allowDangerousEnvKeys && source.registryId
99
- ? `${detail} Injecting anyway (--allow-dangerous-env-keys).`
100
- : `${detail} Injecting anyway (first-party stash).`);
101
- }
102
- }
103
92
  // Audit trail: keys only, never values.
104
93
  appendEvent({ eventType: "env_access", ref: envRef, metadata: { keys } });
105
- return { ref: envRef, values: envValues, keys };
94
+ return { ref: envRef, values: envValues, keys, secretValues };
106
95
  }