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
@@ -28,14 +28,13 @@ export async function searchRegistry(query, options) {
28
28
  const provider = createProvider(entry, warnings);
29
29
  if (!provider)
30
30
  return Promise.resolve(null);
31
- return provider.search({ query: trimmed, limit, includeAssets: options?.includeAssets });
31
+ return provider.search({ query: trimmed, limit });
32
32
  }));
33
33
  // Merge results grouped by provider
34
34
  // Each provider batch is normalized to [0, 1] before merging so that raw
35
35
  // scores from different providers (e.g. static-index can exceed 1.85 while
36
36
  // skills-sh uses installs-relative scoring) are comparable in the merged list.
37
37
  const allHits = [];
38
- const allAssetHits = [];
39
38
  for (let i = 0; i < results.length; i++) {
40
39
  const result = results[i];
41
40
  if (result.status === "rejected") {
@@ -61,21 +60,6 @@ export async function searchRegistry(query, options) {
61
60
  for (const hit of validHits) {
62
61
  allHits.push(hit);
63
62
  }
64
- if (value.assetHits) {
65
- const validAssetHits = [];
66
- for (const hit of value.assetHits) {
67
- if (isCompleteAssetHit(hit)) {
68
- validAssetHits.push(hit);
69
- }
70
- else {
71
- dropped++;
72
- }
73
- }
74
- normalizeScores(validAssetHits);
75
- for (const hit of validAssetHits) {
76
- allAssetHits.push(hit);
77
- }
78
- }
79
63
  if (dropped > 0) {
80
64
  warnings.push(`Registry ${registryLabel} returned ${dropped} incomplete hit(s); dropped from response.`);
81
65
  }
@@ -85,14 +69,7 @@ export async function searchRegistry(query, options) {
85
69
  // Sort merged hits by normalized score descending, apply limit
86
70
  allHits.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
87
71
  const limitedHits = allHits.slice(0, limit);
88
- allAssetHits.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
89
- const limitedAssetHits = allAssetHits.slice(0, limit);
90
- return {
91
- query: trimmed,
92
- hits: limitedHits,
93
- warnings,
94
- assetHits: limitedAssetHits.length > 0 ? limitedAssetHits : undefined,
95
- };
72
+ return { query: trimmed, hits: limitedHits, warnings };
96
73
  }
97
74
  // ── Registry resolution ─────────────────────────────────────────────────────
98
75
  /**
@@ -216,26 +193,3 @@ function isCompleteHit(hit) {
216
193
  typeof hit.installRef === "string" &&
217
194
  hit.installRef.length > 0);
218
195
  }
219
- function isCompleteAssetHit(hit) {
220
- if (!hit || typeof hit !== "object")
221
- return false;
222
- if (hit.type !== "registry-asset" ||
223
- typeof hit.assetType !== "string" ||
224
- hit.assetType.length === 0 ||
225
- typeof hit.assetName !== "string" ||
226
- hit.assetName.length === 0 ||
227
- typeof hit.action !== "string") {
228
- return false;
229
- }
230
- // `stash` is required by the consumer (output shaping + asset-action display);
231
- // rejecting incomplete stashes here keeps malformed objects out of the JSON
232
- // output. Flagged in PR #168 review (#9).
233
- const stash = hit.stash;
234
- if (!stash || typeof stash !== "object")
235
- return false;
236
- if (typeof stash.id !== "string" || stash.id.length === 0)
237
- return false;
238
- if (typeof stash.name !== "string" || stash.name.length === 0)
239
- return false;
240
- return true;
241
- }
@@ -47,11 +47,6 @@ export const searchCommand = defineJsonCommand({
47
47
  },
48
48
  limit: { type: "string", description: "Maximum number of results" },
49
49
  from: { type: "string", description: "Search source (local|registry|all)", default: "local" },
50
- assets: {
51
- type: "boolean",
52
- description: "Include asset-level search results (only meaningful with --from registry|all)",
53
- default: false,
54
- },
55
50
  filter: scopeFilterArg,
56
51
  "include-proposed": {
57
52
  type: "boolean",
@@ -77,7 +72,6 @@ export const searchCommand = defineJsonCommand({
77
72
  const includeProposed = args["include-proposed"] === true;
78
73
  const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
79
74
  const includeSessions = args["include-sessions"];
80
- const assets = args.assets === true;
81
75
  const outputMode = getOutputMode();
82
76
  const result = await akmSearch({
83
77
  query,
@@ -88,7 +82,6 @@ export const searchCommand = defineJsonCommand({
88
82
  includeProposed,
89
83
  belief,
90
84
  includeSessions,
91
- assets,
92
85
  eventSource: resolveUsageEventSource(),
93
86
  attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
94
87
  });
@@ -161,7 +154,7 @@ export async function runCurate(args, outputMode) {
161
154
  source: parseSearchSource(args.from ?? "local"),
162
155
  filters: parseScopeFilterFlags(args.filters ?? [], "--filter"),
163
156
  belief: parseBeliefFilterMode(args.belief ?? "current"),
164
- eventSource: resolveUsageEventSource(),
157
+ eventSource: args.eventSource ?? resolveUsageEventSource(),
165
158
  attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
166
159
  });
167
160
  }
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * `akm search` — entry point.
6
6
  *
7
- * Spec §6.1: search consults the local FTS5 index. There is one query path
7
+ * Search consults the local FTS5 index. There is one query path
8
8
  * because there is one data store. Provider fan-out is gone.
9
9
  *
10
10
  * The orchestration here is thin: build the FTS query, optionally interleave
@@ -125,9 +125,7 @@ export async function akmSearch(input) {
125
125
  includeExcludedTypes: input.includeSessions === true,
126
126
  readOnly: input.readOnly,
127
127
  });
128
- const registryResult = source === "local"
129
- ? undefined
130
- : await searchRegistry(query, { limit, includeAssets: input.assets === true, registries: config.registries });
128
+ const registryResult = source === "local" ? undefined : await searchRegistry(query, { limit, registries: config.registries });
131
129
  if (source === "local") {
132
130
  const localHits = localResult?.hits ?? [];
133
131
  const warnings = [...(localResult?.warnings ?? []), ...duplicateConceptWarnings(localHits, config.defaultBundle)];
@@ -154,6 +152,7 @@ export async function akmSearch(input) {
154
152
  id: hit.id,
155
153
  description: hit.description,
156
154
  action: `akm bundle add ${installRef} -> then search again`,
155
+ installRef,
157
156
  score: hit.score,
158
157
  registryName: hit.registryName,
159
158
  ...(hit.warnings && hit.warnings.length > 0 ? { warnings: hit.warnings } : {}),
@@ -317,8 +316,8 @@ function logSearchEvent(rawQuery, response, mode = "keyword", eventSource = "use
317
316
  }
318
317
  // ── Helpers ──────────────────────────────────────────────────────────────────
319
318
  /**
320
- * Validate a named `--from` against the bundle-derived source list (0.9.0
321
- * spec §10.1: a named source is a `bundles` key, matched via its derived
319
+ * Validate a named `--from` against the bundle-derived source list (a named
320
+ * source is a `bundles` key, matched via its derived
322
321
  * source entry's `name`, or an exact path). Throws INVALID_SOURCE_VALUE with
323
322
  * the known names before any stash access can fail differently.
324
323
  */
@@ -4,8 +4,6 @@
4
4
  /**
5
5
  * `akm show` — entry point.
6
6
  *
7
- * Spec §6.2:
8
- *
9
7
  * show(ref) → indexer.lookup(ref) → readFile(entry.filePath)
10
8
  *
11
9
  * The richer presentation logic (matchers, renderers, edit-hints,
@@ -26,7 +24,7 @@ import { extractSection, markdownFragmentSlugs } from "../../core/asset/markdown
26
24
  import { buildMarkdownLeadContext, fragmentForSelector, MARKDOWN_FRAGMENT_CONTEXT_DEFAULT_MAX_CHARS, } from "../../core/asset/markdown-fragments.js";
27
25
  import { displayRef, displayRefForConceptId, typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
28
26
  import { META_DIR, parseMetaRef, readMetaFile } from "../../core/asset/stash-meta.js";
29
- import { asNonEmptyString, isWithin } from "../../core/common.js";
27
+ import { asNonEmptyString, isContainedResolvedPath } from "../../core/common.js";
30
28
  import { loadConfig } from "../../core/config/config.js";
31
29
  import { NotFoundError, rethrowIfDataDirUnreadable, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
32
30
  import { appendEvent } from "../../core/events.js";
@@ -45,13 +43,11 @@ import { withIndexDb } from "../../storage/repositories/index-db.js";
45
43
  import { getEntryById, getEntryIdByFilePath } from "../../storage/repositories/index-entries-repository.js";
46
44
  import { getIndexedMarkdownFragment } from "../../storage/repositories/index-fts-repository.js";
47
45
  import { readEntryLinks } from "../../storage/repositories/index-links-repository.js";
48
- import { getCurrentWorkflowScopeKey } from "../../workflows/authoring/scope-key.js";
49
46
  import { buildWorkflowAction } from "../../workflows/renderer.js";
50
- import { getActiveWorkflowRun } from "../../workflows/runtime/runs.js";
51
47
  /**
52
48
  * Unified show: queries the local FTS5 index, then reads that row's file path.
53
49
  * A physical owner can arbitrate collisions during lookup, but show never
54
- * renders an asset without an indexed row. Spec §6.2; no provider or disk
50
+ * renders an asset without an indexed row; no provider or disk
55
51
  * fallback.
56
52
  *
57
53
  * When `detail` is `"brief"` or `"summary"`, the response omits
@@ -381,20 +377,6 @@ export async function showLocal(input) {
381
377
  }
382
378
  if (response.type === "workflow")
383
379
  response.action = buildWorkflowAction(canonicalRef);
384
- // 07 P1-D: provenance-aware toolPolicy CEILING. An agent's self-declared
385
- // `tools` frontmatter is honoured ONLY for the operator's own PRIMARY stash —
386
- // the assets they authored. Every other source is content pulled from
387
- // elsewhere and must not name its own tool grant: registry-installed packs, a
388
- // configured secondary source, and even a git source the operator marked
389
- // `--writable` to contribute edits upstream (writability is "can I push", not
390
- // "do I trust this content to grant itself tools"). Drop the policy so dispatch
391
- // falls back to the parent/default grant. Keys off primary-stash identity —
392
- // `allSources[0]` is always the primary (search-source.ts) — not a
393
- // name-derived registryId or the orthogonal `writable` bit. `source` undefined
394
- // (unresolved path) also fails closed.
395
- if (response.toolPolicy !== undefined && !isPrimaryStash) {
396
- delete response.toolPolicy;
397
- }
398
380
  const editable = isEditable(assetPath, config, allSources);
399
381
  // Evidence must describe the same revision as the rendered claim: ordinary
400
382
  // Markdown show is source-live, while indexed fragment show is a snapshot.
@@ -421,10 +403,6 @@ export async function showLocal(input) {
421
403
  ...(!editable ? { editHint: buildEditHint(canonicalRef) } : {}),
422
404
  ...showLinks(indexedEntry.itemRef, displayDefaultBundle, input.readOnly === true),
423
405
  };
424
- const activeRun = input.readOnly ? null : await getActiveWorkflowRun(getCurrentWorkflowScopeKey());
425
- if (activeRun) {
426
- fullResponse.activeRun = activeRun;
427
- }
428
406
  if (input.detail === "brief") {
429
407
  return buildBriefResponse(fullResponse, assetPath);
430
408
  }
@@ -513,16 +491,15 @@ function findUnrecognizedScriptSource(assetParts, sources) {
513
491
  continue;
514
492
  const sourceRoot = path.resolve(source.path);
515
493
  const candidate = path.resolve(assetPathForName("script", path.join(sourceRoot, scriptDir), assetParts.name));
516
- if (!isWithin(candidate, sourceRoot))
494
+ if (!isContainedResolvedPath(candidate, sourceRoot))
517
495
  continue;
518
496
  const authoredStat = fs.lstatSync(candidate);
519
497
  if (!authoredStat.isFile() && !authoredStat.isSymbolicLink())
520
498
  continue;
521
- const realRoot = fs.realpathSync(sourceRoot);
522
499
  const realCandidate = fs.realpathSync(candidate);
523
- if (!isWithin(realCandidate, realRoot) || !fs.statSync(realCandidate).isFile())
500
+ if (!fs.statSync(realCandidate).isFile())
524
501
  continue;
525
- return { extension, path: realCandidate, sourceRoot: realRoot };
502
+ return { extension, path: realCandidate, sourceRoot: fs.realpathSync(sourceRoot) };
526
503
  }
527
504
  catch {
528
505
  // Missing, unreadable, dangling, or otherwise unsafe paths remain normal
@@ -534,7 +511,7 @@ function findUnrecognizedScriptSource(assetParts, sources) {
534
511
  /**
535
512
  * Minimal `show`: ref → indexer lookup → file contents. Used by callers that
536
513
  * just need the raw file (e.g. clone, write-source) and don't want the full
537
- * renderer graph. Spec §6.2's literal flow.
514
+ * renderer graph.
538
515
  */
539
516
  export async function showByRef(ref) {
540
517
  const parsed = parseBundleRef(ref);
@@ -12,10 +12,12 @@ import { serializeFrontmatter } from "../core/asset/asset-serialize.js";
12
12
  import { DESCRIPTION_MAX_CHARS } from "../core/authoring-rules.js";
13
13
  import { toErrorMessage, tryReadStdinText } from "../core/common.js";
14
14
  import { loadConfig } from "../core/config/config.js";
15
+ import { SHIPPED_ALIAS } from "../core/config/model-aliases.js";
15
16
  import { ConfigError, UsageError } from "../core/errors.js";
16
17
  import { parseEmbeddedJsonResponse } from "../core/parse.js";
17
18
  import { DURATION_UNITS, parseDuration as parseDurationSpec } from "../core/time.js";
18
19
  import { warn } from "../core/warn.js";
20
+ import { noticeSet } from "../execution/notices.js";
19
21
  import { SCOPE_KEYS } from "../indexer/passes/metadata.js";
20
22
  import { callStructured } from "../llm/structured-call.js";
21
23
  import { withLlmStage } from "../llm/usage-telemetry.js";
@@ -222,7 +224,7 @@ export function parseEnrichObserved(parsed) {
222
224
  }
223
225
  return undefined;
224
226
  }
225
- /** Hard timeout for the `--enrich` LLM call. Write-path must not block on a misbehaving endpoint. */
227
+ /** Timeout for the `--enrich` LLM call, in place of the connection's own. */
226
228
  const LLM_ENRICH_TIMEOUT_MS = 10_000;
227
229
  /**
228
230
  * Attempt LLM enrichment of memory metadata. Returns merged metadata
@@ -232,14 +234,14 @@ const LLM_ENRICH_TIMEOUT_MS = 10_000;
232
234
  */
233
235
  export async function runLlmEnrich(body) {
234
236
  const config = loadConfig();
235
- const resolved = resolveImproveExecution({ config, processName: "remember-enrich" });
237
+ const resolved = resolveImproveExecution({ config, processName: "remember-enrich", alias: SHIPPED_ALIAS.enrich });
236
238
  if (!resolved) {
237
- warn("Warning: --enrich requires an engine to be configured. Run `akm setup` to configure one.");
239
+ warn("Warning: --enrich requires a connection or harness to be configured. Run `akm setup` to configure one.");
238
240
  return { tags: [] };
239
241
  }
240
242
  const runner = resolved.runner;
241
- const noticesByKey = new Map(resolved.notices.map((notice) => [JSON.stringify(notice), notice]));
242
- const noticeFields = () => noticesByKey.size > 0 ? { notices: Object.freeze([...noticesByKey.values()]) } : {};
243
+ const notices = noticeSet();
244
+ notices.add(resolved.notices);
243
245
  const prompt = `You are a memory tagger for a developer knowledge base.
244
246
  Given the memory text below, return ONLY a JSON object with these fields:
245
247
  - "tags": array of 1-5 short lowercase keyword tags
@@ -251,53 +253,36 @@ ${body.slice(0, 2000)}
251
253
 
252
254
  Return ONLY the JSON object, no prose, no markdown fences.`;
253
255
  try {
254
- let timeoutHandle;
255
- const result = await (async () => {
256
- try {
257
- return await Promise.race([
258
- withLlmStage("remember", () => callStructured({
259
- feature: "remember_enrich",
260
- runner,
261
- messages: [
262
- { role: "system", content: "Return only valid JSON. No prose." },
263
- { role: "user", content: prompt },
264
- ],
265
- request: { maxTokens: 256, temperature: 0.1 },
266
- onNotices: (value) => {
267
- for (const notice of value)
268
- noticesByKey.set(JSON.stringify(notice), notice);
269
- },
270
- parse: (raw) => raw ?? "",
271
- onError: () => "",
272
- fallback: "",
273
- })),
274
- new Promise((_, reject) => {
275
- timeoutHandle = setTimeout(() => reject(new Error("LLM enrichment timed out")), LLM_ENRICH_TIMEOUT_MS);
276
- }),
277
- ]);
278
- }
279
- finally {
280
- if (timeoutHandle !== undefined) {
281
- clearTimeout(timeoutHandle);
282
- }
283
- }
284
- })();
285
- const parsed = parseEmbeddedJsonResponse(result);
256
+ const outcome = await withLlmStage("remember", () => callStructured({
257
+ runner,
258
+ messages: [
259
+ { role: "system", content: "Return only valid JSON. No prose." },
260
+ { role: "user", content: prompt },
261
+ ],
262
+ // The write path must not block on a misbehaving endpoint.
263
+ request: { maxTokens: 256, temperature: 0.1, timeoutMs: LLM_ENRICH_TIMEOUT_MS },
264
+ onNotices: notices.add,
265
+ }));
266
+ if (!outcome.ok) {
267
+ warn(`Warning: --enrich failed (${outcome.error}). Writing memory without enrichment.`);
268
+ return { tags: [], ...notices.fields() };
269
+ }
270
+ const parsed = parseEmbeddedJsonResponse(outcome.raw);
286
271
  if (!parsed) {
287
272
  warn("Warning: --enrich received invalid JSON from the LLM. Writing memory without enrichment.");
288
- return { tags: [], ...noticeFields() };
273
+ return { tags: [], ...notices.fields() };
289
274
  }
290
275
  const tags = Array.isArray(parsed.tags)
291
276
  ? parsed.tags.filter((t) => typeof t === "string" && t.trim().length > 0)
292
277
  : [];
293
278
  const description = typeof parsed.description === "string" && parsed.description.trim() ? parsed.description.trim() : undefined;
294
- return { tags, description, observed_at: parseEnrichObserved(parsed), ...noticeFields() };
279
+ return { tags, description, observed_at: parseEnrichObserved(parsed), ...notices.fields() };
295
280
  }
296
281
  catch (err) {
297
282
  if (err instanceof ConfigError)
298
283
  throw err;
299
284
  warn(`Warning: --enrich failed (${toErrorMessage(err)}). Writing memory without enrichment.`);
300
- return { tags: [], ...noticeFields() };
285
+ return { tags: [], ...notices.fields() };
301
286
  }
302
287
  }
303
288
  // R-061(c): `resolveRememberContentArg` / `wasRememberFlagValueConsumedAsContent`
@@ -7,8 +7,7 @@ import { VALID_ADAPTER_IDS } from "../../core/adapter/adapter-ids.js";
7
7
  import { UsageError } from "../../core/errors.js";
8
8
  import { appendEvent } from "../../core/events.js";
9
9
  import { warn } from "../../core/warn.js";
10
- import { auditStashForDangerousKeys } from "./dangerous-env-audit.js";
11
- import { akmRemove, akmUpdate } from "./installed-stashes.js";
10
+ import { akmUpdate } from "./installed-stashes.js";
12
11
  import { akmAdd } from "./source-add.js";
13
12
  import { addStash, removeStash } from "./source-manage.js";
14
13
  // ── Shared website-options helper ──────────
@@ -36,31 +35,6 @@ export function shouldWarnOnPlainHttp(ref) {
36
35
  return true;
37
36
  }
38
37
  }
39
- /**
40
- * Audit a freshly-installed stash for dangerous env keys and decide whether the
41
- * install must be blocked. The scanner and decision policy are shared with
42
- * `bundle update` in dangerous-env-audit.ts.
43
- */
44
- export async function auditInstalledStashForDangerousKeys(opts) {
45
- const { installedStashRoot, ref, allowDangerousKeys, rollbackTarget, isTTY } = opts;
46
- return auditStashForDangerousKeys({
47
- stashRoot: installedStashRoot,
48
- ref,
49
- allowDangerousKeys,
50
- isTTY,
51
- operation: "install",
52
- rollback: async () => {
53
- try {
54
- await akmRemove({ target: rollbackTarget });
55
- return undefined;
56
- }
57
- catch {
58
- return (`Rollback failed — stash may still be installed at ${installedStashRoot}. ` +
59
- `Remove it manually with: akm bundle remove ${rollbackTarget}`);
60
- }
61
- },
62
- });
63
- }
64
38
  // ── Command definition ────────────────────────────────────────────────────────
65
39
  export const addCommand = defineJsonCommand({
66
40
  meta: {
@@ -90,7 +64,8 @@ export const addCommand = defineJsonCommand({
90
64
  after: { type: "string", description: "Insert the new bundle after this configured bundle" },
91
65
  credential: {
92
66
  type: "string",
93
- description: "Git HTTPS bearer credential reference ($VAR or secret://name); never a literal token",
67
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${ref}` token syntax documented for users, not interpolation
68
+ description: "Git HTTPS bearer credential reference ($VAR or ${secrets/name}); never a literal token",
94
69
  },
95
70
  "max-pages": { type: "string", description: "Maximum pages to crawl for website sources (default: 50)" },
96
71
  "max-depth": { type: "string", description: "Maximum crawl depth for website sources (default: 3)" },
@@ -99,16 +74,18 @@ export const addCommand = defineJsonCommand({
99
74
  description: "Allow a plain HTTP source URL after explicitly accepting transport substitution risk.",
100
75
  default: false,
101
76
  },
77
+ // Deprecated no-op, accepted through 0.10 so scripts that pass it do not
78
+ // fail with UNKNOWN_FLAG. Installing a bundle is the trust decision: its
79
+ // env files are no longer scanned for process-hijacking keys.
102
80
  "allow-dangerous-env-keys": {
103
81
  type: "boolean",
104
- description: "Allow reviewed process-hijacking env keys (e.g. LD_PRELOAD, PATH) in the installed bundle.",
82
+ description: "Deprecated, no effect: add no longer scans env files for process-hijacking keys. Accepted through 0.10 for existing scripts.",
105
83
  default: false,
106
84
  },
107
85
  },
108
86
  async run({ args }) {
109
87
  const ref = args.ref.trim();
110
88
  const allowInsecureTransport = args["allow-insecure-transport"];
111
- const allowDangerousKeys = args["allow-dangerous-env-keys"];
112
89
  if (args.before && args.after)
113
90
  throw new UsageError("Only one of --before or --after may be used.");
114
91
  // --provider → declarative bundle source (URL for git/website; bare
@@ -153,7 +130,7 @@ export const addCommand = defineJsonCommand({
153
130
  if (args.provider === "git" && result.added && result.entry?.name) {
154
131
  let updated;
155
132
  try {
156
- updated = await akmUpdate({ target: result.entry.name, allowDangerousEnvKeys: allowDangerousKeys });
133
+ updated = await akmUpdate({ target: result.entry.name });
157
134
  }
158
135
  catch (error) {
159
136
  removeStash(result.entry.name);
@@ -204,38 +181,6 @@ export const addCommand = defineJsonCommand({
204
181
  writable: args.writable === true,
205
182
  },
206
183
  });
207
- // ── Post-install env key audit ──────────────────────────────────────────
208
- // Resolve the stash root from the install result and scan any env files
209
- // for dangerous env var keys. When findings are present the install is
210
- // gated: TTY → interactive confirmation prompt; non-TTY without
211
- // --allow-dangerous-env-keys → hard failure (exit 1). Pass the dedicated
212
- // flag to skip the prompt non-interactively.
213
- const installedStashRoot = result.installed?.stashRoot ??
214
- (result.sourceAdded && "stashRoot" in result.sourceAdded ? result.sourceAdded.stashRoot : undefined);
215
- if (installedStashRoot) {
216
- // Use the canonical installed id (most reliably resolved by akmRemove) rather
217
- // than the raw user-supplied ref which may not match after URL normalisation.
218
- const rollbackTarget = result.installed?.id ?? result.sourceAdded?.stashRoot ?? ref;
219
- // The audit RETURNS its decision; we decide the exit outcome here,
220
- // OUTSIDE any catch, so the abort cannot be lost to a swallowed
221
- // exception (C3). F4: `process.exitCode = …; return;` instead of
222
- // `process.exit(...)` — the DANGEROUS_ENV_KEY error envelope has
223
- // already been written to stderr by the audit itself (or is about to
224
- // be), so an explicit `return` here (skipping the success `output("add",
225
- // …)` below) is load-bearing, not merely cosmetic: it is what stops a
226
- // blocked install from ALSO printing a success envelope.
227
- const decision = await auditInstalledStashForDangerousKeys({
228
- installedStashRoot,
229
- ref,
230
- allowDangerousKeys,
231
- rollbackTarget,
232
- isTTY: process.stdin.isTTY === true,
233
- });
234
- if (decision.blocked) {
235
- process.exitCode = decision.exitCode;
236
- return;
237
- }
238
- }
239
184
  output("add", result);
240
185
  },
241
186
  });
@@ -8,9 +8,7 @@
8
8
  * group, hard break, no alias kept at the top level:
9
9
  * - `create` (= old top-level `init`, src/commands/sources/init.ts)
10
10
  * - `add` (= old top-level `add`, src/commands/sources/add-cli.ts — the
11
- * command definition moved here; `add-cli.ts` keeps its exported helpers,
12
- * including `auditInstalledStashForDangerousKeys`, which a test imports
13
- * directly)
11
+ * command definition moved here; `add-cli.ts` keeps its exported helpers)
14
12
  * - `list` (= old top-level `list`)
15
13
  * - `remove` (= old top-level `remove`)
16
14
  * - `update` (= old top-level `update`)
@@ -134,18 +132,21 @@ const updateCommand = defineJsonCommand({
134
132
  description: "Exit successfully when index/state database contention shows another akm operation is active",
135
133
  default: false,
136
134
  },
135
+ // Deprecated no-op, accepted through 0.10 so scripts that pass it do not
136
+ // fail with UNKNOWN_FLAG. Installing a bundle is the trust decision: an
137
+ // update no longer scans env files for process-hijacking keys.
137
138
  "allow-dangerous-env-keys": {
138
139
  type: "boolean",
139
- description: "Allow an update containing dangerous env keys (e.g. LD_PRELOAD, PATH). Use only after explicitly reviewing the staged bundle.",
140
+ description: "Deprecated, no effect: update no longer scans env files for process-hijacking keys. Accepted through 0.10 for existing scripts.",
140
141
  default: false,
141
142
  },
142
143
  // Deprecated no-op, accepted through 0.10 so scripts that pass it do not
143
- // fail with UNKNOWN_FLAG. Deleting the previous directory of a read-only
144
- // install whose content moved no longer asks: it is a re-fetchable cache.
144
+ // fail with UNKNOWN_FLAG. Pruning old install directories of a read-only
145
+ // bundle no longer asks: they are a re-fetchable cache.
145
146
  yes: {
146
147
  type: "boolean",
147
148
  alias: "y",
148
- description: "Deprecated, no effect: update no longer asks before deleting a moved read-only install directory. Accepted through 0.10 for existing scripts.",
149
+ description: "Deprecated, no effect: update no longer asks before pruning old install directories of a read-only bundle. Accepted through 0.10 for existing scripts.",
149
150
  default: false,
150
151
  },
151
152
  },
@@ -156,7 +157,6 @@ const updateCommand = defineJsonCommand({
156
157
  target: args.target,
157
158
  all: args.all,
158
159
  force: args.force,
159
- allowDangerousEnvKeys: args["allow-dangerous-env-keys"],
160
160
  });
161
161
  }
162
162
  catch (error) {
@@ -173,7 +173,6 @@ const updateCommand = defineJsonCommand({
173
173
  target: args.target ?? null,
174
174
  all: args.all === true,
175
175
  force: args.force === true,
176
- allowDangerousEnvKeys: args["allow-dangerous-env-keys"] === true,
177
176
  processed: Array.isArray(result.processed)
178
177
  ? result.processed.length
179
178
  : 0,
@@ -2,13 +2,13 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Bundle-map config write helpers (0.9.0 config-shape cutover, spec §10.1).
5
+ * Bundle-map config write helpers.
6
6
  *
7
7
  * The `stashDir`/`sources[]`/`installed[]` trio is retired: every source is now
8
8
  * a `bundles.<slug>` entry, and the primary working stash is the `defaultBundle`.
9
9
  * These helpers give the source writers (`akm bundle create`, `akm setup`, `akm bundle add`,
10
10
  * `akm sources add/remove`) one place to derive slug-legal bundle keys (via the
11
- * shared {@link deriveBundleId} — D-R5), locate an existing bundle by its source
11
+ * shared {@link deriveBundleId}), locate an existing bundle by its source
12
12
  * descriptor, and set/repoint the primary bundle — without duplicating the
13
13
  * keying rules across call sites.
14
14
  */
@@ -16,6 +16,7 @@ import { countLinksByKind } from "../../storage/repositories/index-links-reposit
16
16
  import { getMeta } from "../../storage/repositories/index-meta-repository.js";
17
17
  import { isSqliteContentionError } from "../../storage/sqlite-transaction.js";
18
18
  import { pkgVersion } from "../../version.js";
19
+ import { targetRows } from "../targets.js";
19
20
  /**
20
21
  * Bound for `akm info`'s diagnostic index.db read — short enough that a
21
22
  * locked database never stalls the command, unlike the shared 30s
@@ -92,7 +93,7 @@ export function assembleInfo(options) {
92
93
  ...(r.provider ? { provider: r.provider } : {}),
93
94
  ...(r.enabled !== undefined ? { enabled: r.enabled } : {}),
94
95
  }));
95
- // Stash providers — the unified `bundles` source list (spec §10.1), which
96
+ // Stash providers — the unified `bundles` source list, which
96
97
  // already includes the primary (`defaultBundle`) stash first.
97
98
  const configuredSources = getSources(config);
98
99
  const sourceProviders = configuredSources.map((s) => ({
@@ -151,10 +152,20 @@ export function assembleInfo(options) {
151
152
  status: semanticStatus,
152
153
  },
153
154
  registries,
155
+ connectionsAndHarnesses: safeTargets(config),
154
156
  sourceProviders,
155
157
  indexStats,
156
158
  };
157
159
  }
160
+ /** The connections, harnesses and work table, or none when it cannot be built: `akm info` never throws. */
161
+ function safeTargets(config) {
162
+ try {
163
+ return targetRows({ config });
164
+ }
165
+ catch {
166
+ return [];
167
+ }
168
+ }
158
169
  /** Best-effort path resolution for a section that must degrade, not throw: an empty string in place of an exception. */
159
170
  function safePath(fn) {
160
171
  try {
@@ -115,7 +115,7 @@ async function akmInitReal(options) {
115
115
  let previousStashDir;
116
116
  if (options?.persistConfig !== false) {
117
117
  const result = mutateConfig((latest) => {
118
- // 0.9.0 (spec §10.1): the primary stash is the `defaultBundle`'s filesystem
118
+ // The primary stash is the `defaultBundle`'s filesystem
119
119
  // `path`, not the retired top-level `stashDir`.
120
120
  const currentPrimary = primaryBundlePath(latest);
121
121
  const shouldPersist = !dirExplicitlyProvided || !currentPrimary || setDefault;