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
@@ -5,8 +5,7 @@
5
5
  * `akm env` command family. Extracted verbatim from src/cli.ts (WS6) so the God
6
6
  * Module shrinks; the `main.subCommands.env` key and every subcommand's
7
7
  * args/output shape are byte-identical. The ref-resolution helpers
8
- * (parseEnvRef / findEnvSource / makeEnvRef / resolveEnvPath + the env-path
9
- * traversal guard) live in src/core/env-secret-ref.ts so env + secret share one
8
+ * (parseEnvRef / makeEnvRef / resolveEnvPath) live in src/core/env-secret-ref.ts so env + secret share one
10
9
  * copy.
11
10
  *
12
11
  * `akm env` manages whole `.env` files under each stash's env/ directory.
@@ -42,7 +41,7 @@ const envCreateCommand = defineJsonCommand({
42
41
  args: {
43
42
  name: {
44
43
  type: "positional",
45
- description: "Env name (flat, e.g. prod → prod.env; use --path for a subdirectory)",
44
+ description: "Env ref (flat name, e.g. env/prod → prod.env; use --path for a subdirectory)",
46
45
  required: true,
47
46
  },
48
47
  path: {
@@ -119,10 +118,7 @@ const envPathCommand = defineJsonCommand({
119
118
  quiet: { type: "boolean", alias: "q", description: "Suppress the unsafe-source warning", default: false },
120
119
  },
121
120
  async run({ args }) {
122
- const { name, absPath, source } = resolveEnvPath(args.ref);
123
- if (!fs.existsSync(absPath)) {
124
- throw new NotFoundError(`Env not found: ${makeEnvRef(name, source)}`);
125
- }
121
+ const { absPath } = resolveEnvPath(args.ref);
126
122
  // The raw `.env` may contain `X=$(cmd)`, which executes if `source`d.
127
123
  // Warning goes to stderr (never contaminates the path on stdout) and is
128
124
  // suppressed with --quiet for the legitimate `_FILE` / `--env-file` use.
@@ -166,9 +162,6 @@ const envExportCommand = defineJsonCommand({
166
162
  " session). export never prints values to stdout, to avoid leaking them into a captured context.", "MISSING_REQUIRED_ARGUMENT");
167
163
  }
168
164
  const { name, absPath, source } = resolveEnvPath(args.ref);
169
- if (!fs.existsSync(absPath)) {
170
- throw new NotFoundError(`Env not found: ${makeEnvRef(name, source)}`);
171
- }
172
165
  const { buildShellExportScript } = await import("./env.js");
173
166
  const resolvedOut = path.resolve(outPath);
174
167
  writeFileAtomic(resolvedOut, buildShellExportScript(absPath), 0o600);
@@ -177,16 +170,19 @@ const envExportCommand = defineJsonCommand({
177
170
  });
178
171
  /**
179
172
  * Shared implementation for `env run`. Injects an entire env file's values into
180
- * the child process env — never via a shell — after scanning the injected keys
181
- * for process-hijacking variables.
173
+ * the child process env — never via a shell.
182
174
  */
183
175
  async function runEnvInjected(target, opts) {
184
176
  const command = getParsedInvocation().passthroughArgs();
185
177
  if (command.length === 0) {
186
178
  throw new UsageError("Missing command. Usage: akm env run <ref> -- <command>");
187
179
  }
188
- const { name, absPath, source } = resolveEnvPath(target);
189
- if (!fs.existsSync(absPath)) {
180
+ try {
181
+ resolveEnvPath(target);
182
+ }
183
+ catch (error) {
184
+ if (!(error instanceof NotFoundError))
185
+ throw error;
190
186
  // Help users who reach for the removed single-key `ref/KEY` form.
191
187
  const slash = target.lastIndexOf("/");
192
188
  if (slash > 0) {
@@ -194,7 +190,8 @@ async function runEnvInjected(target, opts) {
194
190
  if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(maybeKey)) {
195
191
  let baseExists = false;
196
192
  try {
197
- baseExists = fs.existsSync(resolveEnvPath(target.slice(0, slash)).absPath);
193
+ resolveEnvPath(target.slice(0, slash));
194
+ baseExists = true;
198
195
  }
199
196
  catch {
200
197
  baseExists = false;
@@ -205,16 +202,15 @@ async function runEnvInjected(target, opts) {
205
202
  }
206
203
  }
207
204
  }
208
- throw new NotFoundError(`Env not found: ${makeEnvRef(name, source)}`);
205
+ throw error;
209
206
  }
210
- // Load → filter → secret-substitute → dangerous-key policy → keys-only
207
+ // Load → filter → secret-substitute → keys-only
211
208
  // audit event. Shared with the workflow engine's per-unit env bindings —
212
209
  // see env-binding.ts for the extracted core and its safety invariants.
213
210
  const { resolveEnvBinding } = await import("./env-binding.js");
214
211
  const { values: envValues } = resolveEnvBinding(target, {
215
212
  only: opts.only,
216
213
  except: opts.except,
217
- allowDangerousEnvKeys: opts.allowDangerousEnvKeys,
218
214
  });
219
215
  const mergedEnv = buildChildEnv(process.env, {
220
216
  clean: opts.clean === true,
@@ -241,8 +237,8 @@ async function runEnvInjected(target, opts) {
241
237
  throw err;
242
238
  }
243
239
  // R-067: was `process.exit(result.status ?? 0)`, which terminates the
244
- // process synchronously and skips the `finally { await
245
- // disposeDispatchResources(); }` block in src/cli.ts's `runCommand` — even
240
+ // process synchronously and skips the `finally { disposeLlmUsageSink(); }`
241
+ // block in src/cli.ts's `runCommand` — even
246
242
  // on the success path, since this call was unconditional. Setting
247
243
  // `process.exitCode` and returning lets cleanup run while still exiting
248
244
  // with the child's exact status once the event loop drains, matching the
@@ -264,8 +260,8 @@ const envRunCommand = defineJsonCommand({
264
260
  meta: {
265
261
  name: "run",
266
262
  description:
267
- // biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${secret:NAME}` token syntax documented for users, not interpolation
268
- "Run a command with the env file injected into its environment: `akm env run <ref> -- <command>`. Use `-- $SHELL` for an interactive session. Restrict which variables are injected with --only / --except. Values may embed `${secret:NAME}` tokens, replaced at run time with the sibling `${secret:NAME}` value from the same bundle. Pass --clean to start the child with a minimal inherited environment instead of the full parent environment.",
263
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${ref}` token syntax documented for users, not interpolation
264
+ "Run a command with the env file injected into its environment: `akm env run <ref> -- <command>`. Use `-- $SHELL` for an interactive session. Restrict which variables are injected with --only / --except. Values may embed `${ref}` tokens, replaced at run time: a `${secrets/NAME}` (or `${bundle//secrets/NAME}`) token with the secret's value, any other asset ref with its absolute path. Pass --clean to start the child with a minimal inherited environment instead of the full parent environment.",
269
265
  },
270
266
  args: {
271
267
  target: { type: "positional", description: "Env ref", required: true },
@@ -283,9 +279,12 @@ const envRunCommand = defineJsonCommand({
283
279
  type: "string",
284
280
  description: "When used with --clean, also inherit these parent env vars (comma-separated). Ignored without --clean.",
285
281
  },
282
+ // Deprecated no-op, accepted through 0.10 so scripts that pass it do not
283
+ // fail with UNKNOWN_FLAG. Installing a bundle is the trust decision: env
284
+ // run no longer blocks process-hijacking keys.
286
285
  "allow-dangerous-env-keys": {
287
286
  type: "boolean",
288
- description: "Allow injecting a process-hijacking variable (e.g. LD_PRELOAD, GIT_SSH_COMMAND) from a third-party stash, which otherwise blocks. Use only after explicitly reviewing the env file.",
287
+ description: "Deprecated, no effect: env run no longer blocks process-hijacking variables. Accepted through 0.10 for existing scripts.",
289
288
  default: false,
290
289
  },
291
290
  },
@@ -295,7 +294,6 @@ const envRunCommand = defineJsonCommand({
295
294
  except: parseKeyListFlag(args.except),
296
295
  clean: args.clean === true,
297
296
  inherit: parseKeyListFlag(args.inherit) ?? [],
298
- allowDangerousEnvKeys: args["allow-dangerous-env-keys"] === true,
299
297
  });
300
298
  },
301
299
  });
@@ -37,13 +37,11 @@
37
37
  *
38
38
  * Value parsing is delegated to the `dotenv` package.
39
39
  *
40
- * Secret-token substitution: env VALUES may embed `${secret:NAME}` tokens, which
41
- * are replaced at `env run` time with the value of the sibling `secret:NAME`
42
- * asset in the SAME stash (see `resolveSecretTokens`). Substitution applies to
43
- * values only, never keys; only the `${secret:...}` form is recognised —
44
- * shell-style `${VAR}` / `$VAR` are left untouched. The secret lookup is
45
- * injected so this module keeps its narrow dependency surface (dotenv +
46
- * core/common) and never reaches into the secret resolver/source machinery.
40
+ * Ref-token substitution: env VALUES may embed `${ref}` tokens (a secret's
41
+ * value, or any other asset's path), replaced when the env is injected (see
42
+ * `substituteRefTokens` in core/ref-token.ts and `resolveEnvBinding`).
43
+ * Substitution applies to values only, never keys; shell-style `${VAR}` /
44
+ * `$VAR` are left untouched.
47
45
  */
48
46
  import fs from "node:fs";
49
47
  import path from "node:path";
@@ -91,11 +89,11 @@ export function loadEnv(envPath) {
91
89
  * it to the literal string `$(rm -rf ~)` and we re-emit it single-quoted. This
92
90
  * backs `akm env export <ref> --out <file>` (file-only; never printed to stdout).
93
91
  *
94
- * NOTE: `${secret:NAME}` token substitution is intentionally NOT applied here.
95
- * The export path emits values single-quoted as literals, so an unsubstituted
96
- * `${secret:NAME}` is written verbatim (it would expand to nothing under POSIX
97
- * shells, never to the secret). Secret-token resolution is scoped to the
98
- * `env run` value-injection path only; see `resolveSecretTokens`.
92
+ * NOTE: `${ref}` token substitution is intentionally NOT applied here. The
93
+ * export path emits values single-quoted as literals, so an unsubstituted
94
+ * `${secrets/name}` is written verbatim (it would expand to nothing under POSIX
95
+ * shells, never to the secret). Token resolution is scoped to the value
96
+ * injection path only; see `resolveEnvBinding`.
99
97
  */
100
98
  export function buildShellExportScript(envPath) {
101
99
  const env = loadEnv(envPath);
@@ -110,52 +108,6 @@ export function buildShellExportScript(envPath) {
110
108
  }
111
109
  return lines.length > 0 ? `${lines.join("\n")}\n` : "";
112
110
  }
113
- /**
114
- * Matches a `${secret:NAME}` substitution token in an env value. The captured
115
- * NAME accepts the same character set as a secret asset name (letters, digits,
116
- * `_`, `.`, `/`, `-`). Only this exact form is recognised — shell-style
117
- * `${VAR}` and `$VAR` deliberately do not match and are left untouched.
118
- */
119
- const SECRET_TOKEN_RE = /\$\{secret:([A-Za-z0-9_./-]+)\}/g;
120
- /**
121
- * Replace every `${secret:NAME}` token in each value with the corresponding
122
- * secret value, looked up via the injected `resolveSecret`. Keys are never
123
- * touched. Multiple tokens per value and tokens embedded in larger strings
124
- * (e.g. `Bearer ${secret:a}:${secret:b}`) are all substituted.
125
- *
126
- * `resolveSecret` returns `undefined` for an unknown secret name; such names are
127
- * collected into `missing` (de-duplicated, in first-seen order) and their tokens
128
- * are left unsubstituted in the returned values. Callers MUST treat a non-empty
129
- * `missing` as a hard error and inject NOTHING — never partially inject.
130
- *
131
- * The lookup is injected so this module does not import the secret
132
- * resolver/source machinery directly, preserving its narrow dependency surface.
133
- * Resolved secret values must never be logged or printed by callers.
134
- */
135
- export function resolveSecretTokens(values, resolveSecret) {
136
- const missing = [];
137
- const missingSeen = new Set();
138
- const out = {};
139
- const cache = new Map();
140
- for (const [key, value] of Object.entries(values)) {
141
- out[key] = value.replace(SECRET_TOKEN_RE, (match, name) => {
142
- let resolved = cache.get(name);
143
- if (!cache.has(name)) {
144
- resolved = resolveSecret(name);
145
- cache.set(name, resolved);
146
- }
147
- if (resolved === undefined) {
148
- if (!missingSeen.has(name)) {
149
- missingSeen.add(name);
150
- missing.push(name);
151
- }
152
- return match;
153
- }
154
- return resolved;
155
- });
156
- }
157
- return { values: out, missing };
158
- }
159
111
  /** Create an empty env file (does nothing if it already exists). */
160
112
  export function createEnv(envPath) {
161
113
  ensureParentDir(envPath);
@@ -5,8 +5,7 @@
5
5
  * `akm secret` command family. Extracted verbatim from src/cli.ts (WS6) so the
6
6
  * God Module shrinks; the `main.subCommands.secret` key and every subcommand's
7
7
  * args/output shape are byte-identical. The ref-resolution helpers
8
- * (parseSecretRef / makeSecretRef / resolveSecretPath, plus the shared
9
- * findEnvSource) live in src/core/env-secret-ref.ts so env + secret share one
8
+ * (parseSecretRef / makeSecretRef / resolveSecretPath) live in src/core/env-secret-ref.ts so env + secret share one
10
9
  * copy.
11
10
  *
12
11
  * `akm secret` manages whole-file secrets under each stash's secrets/ directory.
@@ -32,14 +31,13 @@ import path from "node:path";
32
31
  import { getParsedInvocation } from "../../cli/invocation.js";
33
32
  import { getStringArg } from "../../cli/parse-args.js";
34
33
  import { defineGroupCommand, defineJsonCommand, output } from "../../cli/shared.js";
35
- import { decideDangerousEnvInjection } from "../../core/activation-policy.js";
36
34
  import { deriveCanonicalAssetName } from "../../core/asset/asset-placement.js";
37
35
  import { loadConfig } from "../../core/config/config.js";
38
36
  import { makeSecretRef, resolveSecretPath, resolveSecretWriteTarget, sensitiveMarkerPath, withEnvSecretWrite, } from "../../core/env-secret-ref.js";
39
37
  import { ConfigError, NotFoundError, UsageError } from "../../core/errors.js";
40
38
  import { appendEvent } from "../../core/events.js";
41
- import { warn } from "../../core/warn.js";
42
39
  import { resolveSourceEntries } from "../../indexer/search/search-source.js";
40
+ import { isFileOrFileSymlink } from "../../indexer/walk/walker.js";
43
41
  import { readStdin } from "../../runtime.js";
44
42
  import { buildChildEnv } from "./child-env.js";
45
43
  function parseKeyListFlag(raw) {
@@ -65,7 +63,7 @@ function listSecretsRecursive() {
65
63
  walk(full);
66
64
  continue;
67
65
  }
68
- if (!entry.isFile())
66
+ if (!entry.isFile() && !(entry.isSymbolicLink() && isFileOrFileSymlink(full)))
69
67
  continue;
70
68
  if (entry.name.endsWith(".lock") || entry.name.endsWith(".sensitive"))
71
69
  continue;
@@ -99,7 +97,7 @@ const secretSetCommand = defineJsonCommand({
99
97
  args: {
100
98
  ref: {
101
99
  type: "positional",
102
- description: "Secret ref (flat name, e.g. secrets/deploy-key or just deploy-key; use --path for a subdirectory)",
100
+ description: "Secret ref (flat name, e.g. secrets/deploy-key; use --path for a subdirectory)",
103
101
  required: true,
104
102
  },
105
103
  path: {
@@ -170,9 +168,9 @@ const secretRunCommand = defineJsonCommand({
170
168
  },
171
169
  },
172
170
  async run({ args }) {
173
- // Validate the target env var name FIRST (before the command split) so a
174
- // dangerous/invalid name is rejected regardless of how the command is
175
- // supplied — and so the failure does not depend on argv parsing.
171
+ // Validate the target env var name FIRST (before the command split) so an
172
+ // invalid name is rejected regardless of how the command is supplied — and
173
+ // so the failure does not depend on argv parsing.
176
174
  const varName = args.var;
177
175
  if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(varName)) {
178
176
  throw new UsageError(`"${varName}" is not a valid environment variable name.`, "INVALID_FLAG_VALUE");
@@ -182,28 +180,12 @@ const secretRunCommand = defineJsonCommand({
182
180
  throw new UsageError("Missing command. Usage: akm secret run <ref> <VAR> -- <command>");
183
181
  }
184
182
  const { name, absPath, source } = resolveSecretPath(args.ref);
185
- if (!fs.existsSync(absPath)) {
186
- throw new NotFoundError(`Secret not found: ${makeSecretRef(name, source)}`);
187
- }
188
- const { isDangerousEnvKey } = await import("../lint/env-key-rules.js");
189
- if (isDangerousEnvKey(varName)) {
190
- const detail = `"${varName}" is a known process-hijacking variable (e.g. LD_PRELOAD, PATH).`;
191
- const decision = decideDangerousEnvInjection({
192
- dangerousKeys: [varName],
193
- thirdParty: Boolean(source.registryId),
194
- });
195
- if (decision === "block") {
196
- throw new UsageError(`Refusing to inject a secret from a third-party stash into ${detail}\n` +
197
- " Review the secret, then copy it into a first-party secret if you trust it.", "INVALID_FLAG_VALUE");
198
- }
199
- warn(`Injecting a secret into ${detail} Injecting anyway (first-party stash).`);
200
- }
201
- const { readValue } = await import("./secret.js");
183
+ const { readValue } = await import("../../core/secret-value.js");
202
184
  const mergedEnv = buildChildEnv(process.env, {
203
185
  clean: args.clean === true,
204
186
  inherit: parseKeyListFlag(args.inherit) ?? [],
205
187
  });
206
- mergedEnv[varName] = readValue(absPath).toString("utf8");
188
+ mergedEnv[varName] = readValue(absPath);
207
189
  // Audit trail: record access by ref + var name only — never the value.
208
190
  appendEvent({
209
191
  eventType: "secret_access",
@@ -225,8 +207,8 @@ const secretRunCommand = defineJsonCommand({
225
207
  throw err;
226
208
  }
227
209
  // R-067: was `process.exit(result.status ?? 0)`, unconditional even on
228
- // the success path — it skipped the `finally { await
229
- // disposeDispatchResources(); }` cleanup in src/cli.ts's `runCommand`.
210
+ // the success path — it skipped the `finally { disposeLlmUsageSink(); }`
211
+ // cleanup in src/cli.ts's `runCommand`.
230
212
  // Setting `process.exitCode` and returning still exits with the child's
231
213
  // exact status once the event loop drains, but lets cleanup run first —
232
214
  // same pattern `emitJsonError` (src/cli/shared.ts) already established.
@@ -17,7 +17,7 @@
17
17
  * The supported value-use path is:
18
18
  *
19
19
  * - `akm secret run <ref> <VAR> -- <cmd>` — value injected into the child
20
- * process env as `VAR=<value>` (see `readValue`).
20
+ * process env as `VAR=<value>` (see `readValue` in `core/secret-value.ts`).
21
21
  *
22
22
  * `akm secret path <ref>` (print the file path for the Docker `/run/secrets` +
23
23
  * `_FILE` convention) was removed in 0.9.0 alongside `akm secret remove` — an
@@ -25,8 +25,8 @@
25
25
  * and could silently target different files. A ref's file still lives at
26
26
  * `<stash>/secrets/<name>`; locate or delete it there directly.
27
27
  *
28
- * Values are stored as raw bytes (no quoting, multi-line allowed) so they
29
- * round-trip byte-exact, unlike env values which forbid literal newlines.
28
+ * Values are stored as raw bytes (no quoting, multi-line allowed), unlike env
29
+ * values which forbid literal newlines; they are read back trimmed (`core/secret-value.ts`).
30
30
  */
31
31
  import { createHash } from "node:crypto";
32
32
  import fs from "node:fs";
@@ -82,13 +82,6 @@ function ensureParentDir(filePath) {
82
82
  fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
83
83
  }
84
84
  // ── Public API ──────────────────────────────────────────────────────────────
85
- /**
86
- * Read a secret's raw bytes. Internal use only (for `secret run`). Callers
87
- * MUST NOT write the returned value to stdout or any log.
88
- */
89
- export function readValue(secretPath) {
90
- return fs.readFileSync(secretPath);
91
- }
92
85
  /**
93
86
  * Write (create or overwrite) a secret with the given raw bytes, atomically at
94
87
  * mode 0600 under a write-lock. No quoting; multi-line / binary allowed.