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
@@ -9,8 +9,7 @@
9
9
  "maxStringUtf8Bytes": 262144,
10
10
  "maxJsonDepth": 64,
11
11
  "maxJsonNodes": 10000,
12
- "canonicalRefsRequireNfc": true,
13
- "workingDirectoryRequiresWorkspaceRoot": true
12
+ "canonicalRefsRequireNfc": true
14
13
  },
15
14
  "type": "object",
16
15
  "required": ["version"],
@@ -55,8 +54,7 @@
55
54
  "working-directory": {
56
55
  "type": "string",
57
56
  "minLength": 1,
58
- "maxLength": 262144,
59
- "pattern": "^(?![\\\\/])(?![A-Za-z]:[\\\\/])(?!.*(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$))(?!.*[\\\\/]{2})(?!.*[\\\\/]$)[^\\u0000]+$"
57
+ "maxLength": 262144
60
58
  },
61
59
  "schedule": {
62
60
  "oneOf": [
@@ -70,6 +68,8 @@
70
68
  ]
71
69
  },
72
70
  "agent": { "$ref": "#/definitions/nullableSelector" },
71
+ "connection": { "$ref": "#/definitions/nullableSelector" },
72
+ "harness": { "$ref": "#/definitions/nullableSelector" },
73
73
  "engine": { "$ref": "#/definitions/nullableSelector" },
74
74
  "model": { "$ref": "#/definitions/nullableSelector" },
75
75
  "inference": {
@@ -74,7 +74,7 @@
74
74
  "minLength": 1,
75
75
  "maxLength": 63,
76
76
  "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
77
- "description": "Named engine: lowercase dash-separated words of letters and digits, starting with a letter. Same grammar the frozen-plan decoder enforces (src/workflows/resource-limits.ts WORKFLOW_ENGINE_NAME_PATTERN)."
77
+ "description": "Named connection or harness: lowercase dash-separated words of letters and digits, starting with a letter. Same grammar the frozen-plan decoder enforces (src/workflows/resource-limits.ts WORKFLOW_ENGINE_NAME_PATTERN)."
78
78
  },
79
79
  "onError": {
80
80
  "description": "Failure policy: fail the step on the first unit failure (default), or record failures and let the gate decide.",
@@ -86,9 +86,9 @@
86
86
  "properties": {
87
87
  "temperature": { "type": "number" },
88
88
  "max_tokens": { "type": "integer", "minimum": 1 },
89
- "supports_json_schema": { "type": "boolean" },
89
+ "supports_json_schema": { "description": "Retired and ignored: akm retries without a schema when the endpoint rejects one.", "type": "boolean" },
90
90
  "extra_params": { "$ref": "#/definitions/extraParams" },
91
- "context_length": { "type": "integer", "minimum": 1 },
91
+ "context_length": { "description": "Retired and ignored: the context window is a connection's setting.", "type": "integer", "minimum": 1 },
92
92
  "enable_thinking": { "type": "boolean" },
93
93
  "reasoning_effort": { "type": "string", "minLength": 1 }
94
94
  }
@@ -189,13 +189,20 @@
189
189
  "description": "Run-level defaults, overridable per unit.",
190
190
  "additionalProperties": false,
191
191
  "properties": {
192
- "engine": {
192
+ "connection": {
193
+ "$ref": "#/definitions/engineName"
194
+ },
195
+ "harness": {
193
196
  "$ref": "#/definitions/engineName"
194
197
  },
198
+ "engine": {
199
+ "$ref": "#/definitions/engineName",
200
+ "description": "Retired spelling of `connection` / `harness`: a connection by this name, else a harness."
201
+ },
195
202
  "model": {
196
203
  "type": "string",
197
204
  "minLength": 1,
198
- "description": "Model alias (tier) or exact id; resolved per-harness at dispatch."
205
+ "description": "Model alias (tier) or exact id; resolved on the connection or harness at dispatch."
199
206
  },
200
207
  "timeout": {
201
208
  "$ref": "#/definitions/timeout"
@@ -210,7 +217,7 @@
210
217
  },
211
218
  "exec": {
212
219
  "type": "object",
213
- "description": "Run a shell command as this unit instead of dispatching to an engine. `command` is an ARGV ARRAY and there is no shell-string form: the child is spawned directly, so shell metacharacters (`;` `|` `&&` `$(…)` `>` `*`) are inert literal argument bytes — the quoting/injection class simply does not exist. Write the interpreter explicitly (e.g. [\"bash\", \"-lc\", \"a | b\"]) when a pipeline is really wanted. stdout is the promoted step artifact with trailing newlines stripped (like shell `$(…)`); when the unit declares an `output` schema, stdout must instead be exactly one JSON value, which is validated against it. A non-zero exit fails the unit with failure reason `non_zero_exit`, honoring `retry:` and `on_error:` like any other unit. The child's environment is an ALLOWLIST by default (PATH, HOME, locale/temp vars, the Windows process-creation essentials) — widen it only with named `env:` environment bindings or `pass_env`.",
220
+ "description": "Run a shell command as this unit instead of dispatching to an engine. `command` is an ARGV ARRAY and there is no shell-string form: the child is spawned directly, so shell metacharacters (`;` `|` `&&` `$(…)` `>` `*`) are inert literal argument bytes — the quoting/injection class simply does not exist. Write the interpreter explicitly (e.g. [\"bash\", \"-lc\", \"a | b\"]) when a pipeline is really wanted. stdout is the promoted step artifact with trailing newlines stripped (like shell `$(…)`); when the unit declares an `output` schema, stdout must instead be exactly one JSON value, which is validated against it. A non-zero exit fails the unit with failure reason `non_zero_exit`, honoring `retry:` and `on_error:` like any other unit. The child inherits the environment akm runs in, with the directories akm resolved and the unit's `env:` environment bindings set over it.",
214
221
  "required": ["command"],
215
222
  "additionalProperties": false,
216
223
  "properties": {
@@ -231,7 +238,7 @@
231
238
  },
232
239
  "pass_env": {
233
240
  "type": "array",
234
- "description": "Extra environment variable NAMES copied through from akm's own environment on top of the default allowlist — for a per-machine toolchain variable (e.g. CARGO_HOME) that no committed `env:` asset could carry. NAMES ONLY: values never appear in a workflow, and unlike `env:` bindings these values are NOT redacted from the command's output, so never list a credential here.",
241
+ "description": "Environment variable NAMES kept for workflows written when the child started from an empty environment. It selects nothing: the command inherits akm's environment. NAMES ONLY: values never appear in a workflow.",
235
242
  "minItems": 1,
236
243
  "uniqueItems": true,
237
244
  "items": {
@@ -243,7 +250,7 @@
243
250
  },
244
251
  "unit": {
245
252
  "type": "object",
246
- "description": "Optional dispatch-override bag for a unit/map step. A step with none of these carries the run's engine/model/timeout defaults verbatim. Declaring `exec` turns the step into a shell-command unit: it names no engine, so `engine`, `model`, and `llm` are rejected alongside it. Declaring `workflow` (Experimental, not allowed inside `map.unit`) makes the step start a child workflow run: it names no engine or env either, and the child's last step output is the step's result.",
253
+ "description": "Optional dispatch-override bag for a unit/map step. A step with none of these carries the run's engine/model/timeout defaults verbatim. Declaring `exec` turns the step into a shell-command unit: it names no connection or harness, so `connection`, `harness`, `engine`, `model`, and `llm` are rejected alongside it. Declaring `workflow` (Experimental, not allowed inside `map.unit`) makes the step start a child workflow run: it names no engine or env either, and the child's last step output is the step's result.",
247
254
  "additionalProperties": false,
248
255
  "allOf": [
249
256
  {
@@ -253,6 +260,12 @@
253
260
  "then": {
254
261
  "not": {
255
262
  "anyOf": [
263
+ {
264
+ "required": ["connection"]
265
+ },
266
+ {
267
+ "required": ["harness"]
268
+ },
256
269
  {
257
270
  "required": ["engine"]
258
271
  },
@@ -276,6 +289,12 @@
276
289
  {
277
290
  "required": ["exec"]
278
291
  },
292
+ {
293
+ "required": ["connection"]
294
+ },
295
+ {
296
+ "required": ["harness"]
297
+ },
279
298
  {
280
299
  "required": ["engine"]
281
300
  },
@@ -314,9 +333,17 @@
314
333
  "type": "object",
315
334
  "description": "Experimental. Binds the child workflow's params: each key is a declared child param, each value a literal or `{ from: <reference> }`."
316
335
  },
336
+ "connection": {
337
+ "$ref": "#/definitions/engineName",
338
+ "description": "Named connection selected when the workflow run is created."
339
+ },
340
+ "harness": {
341
+ "$ref": "#/definitions/engineName",
342
+ "description": "Named harness selected when the workflow run is created."
343
+ },
317
344
  "engine": {
318
345
  "$ref": "#/definitions/engineName",
319
- "description": "Named engine selected when the workflow run is created."
346
+ "description": "Retired spelling of `connection` / `harness`: a connection by this name, else a harness."
320
347
  },
321
348
  "model": {
322
349
  "type": "string",
package/ROADMAP.md DELETED
@@ -1,112 +0,0 @@
1
- # Roadmap
2
-
3
- This page outlines the high-level focus for the next two releases.
4
-
5
- It is intentionally directional rather than exhaustive. Detailed command,
6
- schema, and migration behavior still lives in the release notes, the
7
- migration guides, and [STABILITY.md](STABILITY.md), which classifies
8
- today's public contract by surface. The internal design specs behind the
9
- 0.9.0 architecture consolidation live under
10
- [`docs/architecture/specs/`](docs/architecture/specs/).
11
-
12
- ## 0.8 Foundation
13
-
14
- Release `0.8.0` already established much of the product shape that `0.9` and
15
- `1.0` build on.
16
-
17
- - The CLI and config surface were substantially redesigned.
18
- - `akm improve` became the main self-improvement and maintenance entry point.
19
- - Task assets, proposal workflows, health reporting, and agent command-building
20
- all landed as first-class capabilities.
21
- - Storage, indexing, graph extraction, and migration paths were tightened to
22
- support the v1 contract freeze.
23
-
24
- That means the next two releases are less about inventing a new direction and
25
- more about hardening, simplifying, and freezing what `0.8.0` put in place.
26
-
27
- ## 0.9
28
-
29
- Release `0.9` is the architecture-consolidation release ahead of the `1.0`
30
- contract freeze. It replaces the flat asset-type registry with a
31
- **bundle / adapter** model and settles the durable contracts `1.0` will freeze.
32
-
33
- - **One canonical ref grammar.** Refs are `[bundle//]conceptId` — a
34
- subdir-qualified concept id such as `skills/code-review` or `memories/vpn-note`
35
- — replacing the pre-`0.9` `type:name` spelling. Durable state stores the
36
- fully-qualified form; the short bundle-omitted form is input sugar. This is a
37
- deliberate, one-time break, taken pre-`1.0` while it is still cheap.
38
- - **Format-neutral bundles.** Installed sources are bundles, each recognized by
39
- a built-in adapter (Agent Skills, Claude/OpenCode commands and agents,
40
- knowledge, YAML workflows, tasks, env/secret files, scripts, OKF and LLM-wiki
41
- knowledge bases) instead of a closed asset-type list.
42
- - **Storage consolidation.** The durable databases collapse from four to three
43
- (`state.db` / `index.db` / a separate `logs.db`); config migrates from the
44
- flat `stashDir` / `sources` / `installed` keys to `bundles` / `defaultBundle`.
45
- The one-time cutover is journaled and crash-resumable via `akm migrate apply`,
46
- with a verified backup taken first.
47
- - **Debt paydown.** The improve / proposal / workflow internals are decomposed
48
- onto one file-change transaction model and an ambient run context, the
49
- deprecated `0.8` CLI aliases are removed, and the `vault` asset type is
50
- retired in favor of `env` / `secret`.
51
-
52
- In short: `0.9` reduces ambiguity, pays down pre-`1.0` debt, and arrives at a
53
- small, durable core ready for the `1.0` freeze.
54
-
55
- ### The 0.9.x series
56
-
57
- `0.9.x` is a series of refactoring and clean-up releases. The intent is to
58
- have **all technical debt paid off and all planned breaking changes handled
59
- before the 0.10.x series begins**. To get there quickly, 0.9.x patch releases
60
- may include breaking changes (see [STABILITY.md](STABILITY.md)); every
61
- break ships with a CHANGELOG migration note.
62
-
63
- Alongside the bug fixes and compatibility improvements, `0.9.x` also focuses
64
- on **tuning the improve processes** — reflect, distill, consolidate, memory
65
- inference, graph extraction, and proactive maintenance — and **settling the
66
- final design of those features** so the `0.10.0` release starts from a
67
- finished improve surface rather than one still being reshaped.
68
-
69
- ## 0.10
70
-
71
- The `0.10.x` series is focused on **bug fixes and tuning** on top of the
72
- debt-free 0.9 core — no new architecture. With the clean-up done, 0.10.x
73
- attempts to return to the normal semver discipline: breaking changes only in
74
- major and minor releases, never in patches.
75
-
76
- ## 0.X
77
-
78
- There may be other minor releases between 0.10.x and 1.0.0. The goal is to minimize the number of minor releases after 0.10.x, and they will only be used for addressing breaking changes that are justifiable before the 1.0.0 release.
79
-
80
- ## 1.0
81
-
82
- Release `1.0` is focused on freezing the public contract and shipping the first
83
- stable ecosystem layer around that core.
84
-
85
- - Freeze the supported source model, the `[bundle//]conceptId` ref format,
86
- search behavior, and write-target rules — the surfaces
87
- [STABILITY.md](STABILITY.md)'s own 1.0 contract-freeze section
88
- already names — and settle the surfaces it currently classifies as
89
- Evolving or Experimental.
90
- - Carry the `0.8` agent and improvement workflow forward as a stable,
91
- documented product surface rather than a collection of pre-release features.
92
- - Ship an official akm SDK for building integrations against the stable v1
93
- contract instead of reverse-engineering CLI behavior.
94
- - Ship in-process akm plugins for Claude Code and OpenCode, built on that SDK,
95
- so those tools can integrate more deeply without changing the CLI-first core
96
- model that akm itself relies on.
97
- - Keep the CLI as the canonical foundation so the SDK and plugin story extends
98
- the existing system rather than forking it into separate integration models.
99
-
100
- In short: `1.0` is where akm stops being only a strong CLI and becomes a stable
101
- platform for both direct use and deeper tool integration.
102
-
103
- ## Scope Notes
104
-
105
- - The CLI remains the foundation in both releases.
106
- - `0.9` prioritizes hardening over expansion.
107
- - `1.0` adds the SDK and in-process plugin story on top of a frozen core, not
108
- instead of it.
109
- - The roadmap assumes the `0.8.0` redesign is the baseline; later releases are
110
- about stabilizing and extending that baseline, not replacing it.
111
- - Specific features may move between releases as implementation and testing
112
- shake out, but the themes above are the intended direction.
@@ -1,35 +0,0 @@
1
- {
2
- "version": 1,
3
- "aliases": {
4
- "fast": {
5
- "claude": "claude-haiku-4-5-20251001",
6
- "opencode": "opencode/claude-haiku-4-5",
7
- "opencode-sdk": "anthropic/claude-haiku-4-5"
8
- },
9
- "balanced": {
10
- "claude": "claude-sonnet-4-6",
11
- "opencode": "opencode/claude-sonnet-4-6",
12
- "opencode-sdk": "anthropic/claude-sonnet-4-6"
13
- },
14
- "reasoning": {
15
- "claude": {
16
- "model": "claude-opus-4-7",
17
- "inference": {
18
- "effort": "high"
19
- }
20
- },
21
- "opencode": {
22
- "model": "opencode/claude-opus-4-7",
23
- "inference": {
24
- "effort": "high"
25
- }
26
- },
27
- "opencode-sdk": {
28
- "model": "anthropic/claude-opus-4-7",
29
- "inference": {
30
- "effort": "high"
31
- }
32
- }
33
- }
34
- }
35
- }
@@ -1,45 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- /**
5
- * `engine-last-used` support for `akm health` (#950).
6
- *
7
- * An engine bound to an enabled improve process that has not actually been
8
- * invoked in weeks looks identical to a healthy one on every existing check —
9
- * `default-llm-engine`/`configured-engines` only probe availability/reachability,
10
- * never USE. This module answers "when did this engine last run, and for
11
- * whom" by folding `llm_usage` events over a fixed lookback window,
12
- * independent of the report's `--since` (mirrors `session-extraction`'s
13
- * independent `SESSION_EXTRACTION_LEDGER_WINDOW_DAYS` window in `checks.ts`).
14
- */
15
- import { daysToMs } from "../../core/common.js";
16
- import { readEvents } from "../../core/events.js";
17
- import { LLM_USAGE_EVENT } from "../../llm/usage-persist.js";
18
- import { decodeLlmUsageRecord } from "../../llm/usage-telemetry.js";
19
- /** Rolling window `engine-last-used` reads over, independent of `--since`. */
20
- export const ENGINE_LAST_USED_LOOKBACK_DAYS = 30;
21
- /** ISO cutoff for the `ENGINE_LAST_USED_LOOKBACK_DAYS` window, ending at `now()`. */
22
- export function engineLastUsedSince(now) {
23
- return new Date(now() - daysToMs(ENGINE_LAST_USED_LOOKBACK_DAYS)).toISOString();
24
- }
25
- /**
26
- * Fold `llm_usage` events over the lookback window into the most recent call
27
- * per engine. Best-effort like every other health probe: an event with no
28
- * `engine` field (pre-#576 rows, or a call outside any resolved engine) is
29
- * skipped rather than bucketed under a synthetic key.
30
- */
31
- export function readLastEngineUsage(stateDbPath, now, readOnly = false) {
32
- const since = engineLastUsedSince(now);
33
- const events = readEvents({ since, type: LLM_USAGE_EVENT }, { dbPath: stateDbPath, readOnly }).events;
34
- const lastUsed = new Map();
35
- for (const event of events) {
36
- const record = decodeLlmUsageRecord(event.metadata);
37
- if (!record?.engine)
38
- continue;
39
- const existing = lastUsed.get(record.engine);
40
- if (!existing || event.ts > existing.lastUsedAt) {
41
- lastUsed.set(record.engine, { lastUsedAt: event.ts, process: record.process });
42
- }
43
- }
44
- return lastUsed;
45
- }
@@ -1,134 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import * as p from "../../cli/clack.js";
7
- import { decideDangerousKeyInstall } from "../../core/activation-policy.js";
8
- import { ConfigError } from "../../core/errors.js";
9
- import { warn } from "../../core/warn.js";
10
- import { sanitizeString } from "../../sources/providers/provider-utils.js";
11
- import { scanEnvKeyNames } from "../env/env.js";
12
- import { isDangerousEnvKey } from "../lint/env-key-rules.js";
13
- let scannerOverride;
14
- /** TEST-ONLY. Inject a scanner fault at the audit boundary; undefined restores. */
15
- export function _setDangerousKeyScannerForTests(scanner) {
16
- scannerOverride = scanner;
17
- }
18
- function collectEnvFilePathsRecursive(rootDir) {
19
- const results = [];
20
- const walk = (dir) => {
21
- const entries = fs.readdirSync(dir, { withFileTypes: true });
22
- for (const entry of entries) {
23
- const full = path.join(dir, entry.name);
24
- if (entry.isDirectory()) {
25
- walk(full);
26
- continue;
27
- }
28
- if (!entry.isFile())
29
- continue;
30
- if (entry.name !== ".env" && !entry.name.endsWith(".env"))
31
- continue;
32
- results.push(full);
33
- }
34
- };
35
- walk(rootDir);
36
- return results;
37
- }
38
- function collectDangerousKeyFindings(installedStashRoot, checkEnvForDangerousKeys) {
39
- const allFindings = [];
40
- if (!fs.statSync(installedStashRoot).isDirectory()) {
41
- throw new Error(`Expected ${installedStashRoot} to be a directory.`);
42
- }
43
- const dir = path.join(installedStashRoot, "env");
44
- try {
45
- if (!fs.statSync(dir).isDirectory()) {
46
- throw new Error(`Expected ${dir} to be a directory.`);
47
- }
48
- }
49
- catch (error) {
50
- if (error.code === "ENOENT")
51
- return allFindings;
52
- throw error;
53
- }
54
- for (const envPath of collectEnvFilePathsRecursive(dir)) {
55
- const relToEnvDir = path.relative(dir, envPath);
56
- const segments = relToEnvDir.split(path.sep);
57
- const lastSegment = segments[segments.length - 1] ?? "";
58
- const lastSegmentBase = lastSegment.endsWith(".env") ? lastSegment.slice(0, -".env".length) : lastSegment;
59
- const refSegments = [...segments.slice(0, -1), lastSegmentBase === "" ? "default" : lastSegmentBase];
60
- const envRef = `env/${refSegments.join("/")}`;
61
- const relPath = path.join("env", relToEnvDir);
62
- for (const finding of checkEnvForDangerousKeys(envPath, relPath, envRef)) {
63
- const keyMatch = finding.detail.match(/Env key `([^`]+)`/);
64
- allFindings.push({ envRef, keyName: keyMatch?.[1] ?? finding.file, relPath });
65
- }
66
- }
67
- return allFindings;
68
- }
69
- function scanStashForDangerousKeys(installedStashRoot) {
70
- const scanner = scannerOverride ??
71
- ((envPath, relPath) => scanEnvKeyNames(fs.readFileSync(envPath, "utf8"))
72
- .filter(isDangerousEnvKey)
73
- .map((key) => ({ file: relPath, detail: `Env key \`${key}\`` })));
74
- return collectDangerousKeyFindings(installedStashRoot, scanner);
75
- }
76
- export async function auditStashForDangerousKeys(opts) {
77
- let allFindings;
78
- try {
79
- allFindings = scanStashForDangerousKeys(opts.stashRoot);
80
- }
81
- catch (error) {
82
- const rollbackWarning = await opts.rollback?.();
83
- throw new ConfigError(`Dangerous environment-key audit failed for "${opts.ref}"; refusing to ${opts.operation} unverified content. ${error instanceof Error ? error.message : String(error)}${rollbackWarning ? ` ${rollbackWarning}` : ""}`, "DANGEROUS_ENV_AUDIT_FAILED");
84
- }
85
- const stance = decideDangerousKeyInstall({
86
- findingsPresent: allFindings.length > 0,
87
- allowDangerousEnvKeys: opts.allowDangerousKeys,
88
- });
89
- if (stance === "allow")
90
- return { blocked: false, findings: allFindings };
91
- if (stance === "warn-allow") {
92
- for (const finding of allFindings) {
93
- warn(`[dangerous-env-key] ${finding.relPath}: key \`${finding.keyName}\` in ${finding.envRef} can hijack process execution via \`akm env run\`. Proceeding because --allow-dangerous-env-keys was set.`);
94
- }
95
- return { blocked: false, findings: allFindings };
96
- }
97
- const operationTitle = opts.operation === "install" ? "Install" : "Update";
98
- const operationPast = opts.operation === "install" ? "installed" : "updated";
99
- let error;
100
- if (opts.isTTY) {
101
- const groupedByEnv = new Map();
102
- for (const finding of allFindings) {
103
- const existing = groupedByEnv.get(finding.envRef) ?? [];
104
- existing.push(finding.keyName);
105
- groupedByEnv.set(finding.envRef, existing);
106
- }
107
- for (const [envRef, keys] of groupedByEnv) {
108
- warn(`[warn] Env "${sanitizeString(envRef)}" in stash "${sanitizeString(opts.ref)}" contains potentially dangerous keys:`);
109
- for (const key of keys)
110
- warn(` - ${sanitizeString(key)}: can hijack process execution via \`akm env run\``);
111
- }
112
- const confirmed = await p.confirm({ message: `${operationTitle} anyway?`, initialValue: false });
113
- if (!p.isCancel(confirmed) && confirmed === true)
114
- return { blocked: false, findings: allFindings };
115
- error = `${operationTitle} aborted: stash contains dangerous env keys. Remove the keys or re-run with --allow-dangerous-env-keys to bypass.`;
116
- }
117
- else {
118
- const keyList = allFindings.map((finding) => ` - ${finding.keyName} (${finding.envRef})`).join("\n");
119
- error = `${operationTitle} blocked: stash "${opts.ref}" contains dangerous env keys that can hijack process execution via \`akm env run\`:\n${keyList}\nRe-run with --allow-dangerous-env-keys to bypass this check after reviewing the env file.`;
120
- }
121
- const rollbackWarning = await opts.rollback?.();
122
- if (opts.renderBlockedError !== false) {
123
- console.error(JSON.stringify({
124
- ok: false,
125
- error,
126
- code: "DANGEROUS_ENV_KEY",
127
- ...(rollbackWarning ? { rollbackWarning } : {}),
128
- }, null, 2));
129
- }
130
- if (rollbackWarning) {
131
- warn(`The blocked ${opts.operation} could not be fully rolled back after content was ${operationPast}: ${rollbackWarning}`);
132
- }
133
- return { blocked: true, exitCode: 1, code: "DANGEROUS_ENV_KEY", error, findings: allFindings };
134
- }
@@ -1,67 +0,0 @@
1
- // This Source Code Form is subject to the terms of the Mozilla Public
2
- // License, v. 2.0. If a copy of the MPL was not distributed with this
3
- // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- /**
5
- * `EDITOR`/`VISUAL`/`PAGER` are flagged by `isDangerousEnvKey` for a
6
- * documented RCE vector (many tools invoke them to launch an editor/pager),
7
- * but env-key-rules.ts's own module doc calls out their "high FP rate" in
8
- * the same breath — an installed bundle's env file can supply a value, but
9
- * nothing in akm's own env-injection path ever *invokes* EDITOR/VISUAL/PAGER
10
- * with that value, so the RCE vector these three describe cannot fire from
11
- * an injected env the way LD_PRELOAD or GIT_SSH_COMMAND can. Blocking a
12
- * third-party install over them protects nothing while making "the operator
13
- * legitimately wants to set their editor" the common case that eats the
14
- * refusal. Kept as a name-level literal set (not an import of
15
- * `commands/lint/env-key-rules.ts`) so this module stays the pure leaf its
16
- * own doc comment promises — no new import edges into the rest of the tree.
17
- */
18
- const INTERACTIVE_TOOL_ENV_KEYS = new Set(["EDITOR", "VISUAL", "PAGER"]);
19
- /**
20
- * Decide whether injecting an env with the given dangerous keys is allowed,
21
- * warned, or blocked. Third-party (registry-installed) stashes hard-block a
22
- * genuine RCE-class key; first-party stashes warn. The interactive-tool
23
- * group (see {@link INTERACTIVE_TOOL_ENV_KEYS}) only ever warns, since akm's
24
- * own env-injection path never invokes those keys as a command. An explicit
25
- * `--allow-dangerous-env-keys` (threaded through by the caller, same override
26
- * `decideDangerousKeyInstall`'s `"warn-allow"` already honors for rule 2)
27
- * downgrades a remaining block to a warning too — the operator is not racing
28
- * themselves. See rule 1 above.
29
- *
30
- * @param dangerousKeys The subset of injected keys flagged as process-hijacking
31
- * (already filtered by the caller via `isDangerousEnvKey`).
32
- * @param thirdParty `true` when the env's source is a third-party stash — i.e.
33
- * its origin carries a `registryId`.
34
- * @param allowDangerousEnvKeys `true` when the operator passed `--allow-dangerous-env-keys` (or
35
- * its equivalent) for this injection. Defaults to `false`.
36
- */
37
- export function decideDangerousEnvInjection(input) {
38
- if (input.dangerousKeys.length === 0)
39
- return "allow";
40
- if (!input.thirdParty)
41
- return "warn";
42
- if (input.allowDangerousEnvKeys)
43
- return "warn";
44
- const onlyInteractiveTool = input.dangerousKeys.every((key) => INTERACTIVE_TOOL_ENV_KEYS.has(key));
45
- return onlyInteractiveTool ? "warn" : "block";
46
- }
47
- /**
48
- * Decide the baseline install stance for a freshly-installed stash's
49
- * dangerous-key scan. The interactive confirm / rollback UX is applied by the
50
- * caller on top of the `"gate"` stance — this predicate only fixes the policy.
51
- * See rule 2 above.
52
- */
53
- export function decideDangerousKeyInstall(input) {
54
- if (!input.findingsPresent)
55
- return "allow";
56
- return input.allowDangerousEnvKeys ? "warn-allow" : "gate";
57
- }
58
- // ── Rule 3: write activation (search-source.ts, installations.ts) ────────────
59
- /**
60
- * Whether a resolved source is write-activated. Only the primary stash and
61
- * sources explicitly marked `writable: true` are writable; registry-cached
62
- * (installed, read-only) sources are never written in place because
63
- * `akm update` overwrites them. See rule 3 above.
64
- */
65
- export function isSourceWriteActivated(source) {
66
- return source.writable === true;
67
- }