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,25 +9,35 @@ import { appendEvent } from "../../core/events.js";
9
9
  import { warn } from "../../core/warn.js";
10
10
  import { insertEventOnce } from "../../storage/repositories/events-repository.js";
11
11
  import { withWorkflowRunsRepo, } from "../../storage/repositories/workflow-runs-repository.js";
12
- import { getCurrentWorkflowScopeKey } from "../authoring/scope-key.js";
13
- import { frozenSummaryJudge } from "../exec/frozen-judge.js";
12
+ import { frozenSummaryJudge, resolveJudgeCwd } from "../exec/frozen-judge.js";
14
13
  import { detectSecretShapedParams } from "../exec/param-secrets.js";
15
14
  import { freezeWorkflow } from "../freeze/freeze.js";
16
15
  import { applyWorkflowParamDefaults, materializeWorkflowParameterFlags, validateWorkflowParams, } from "../ir/params.js";
17
16
  import { canonicalPlanJson, computePlanHash } from "../ir/plan-hash.js";
17
+ import { resolveOrchestrationRefs, summarizeStepOrchestration } from "../renderer.js";
18
18
  import { clip, WORKFLOW_UNIT_DIAGNOSTIC_CLIP } from "../resource-limits.js";
19
19
  import { validateStepSummary } from "../validate-summary.js";
20
20
  import { resolveAgentIdentity } from "./agent-identity.js";
21
- import { frozenStepRows, readRunPlan } from "./run-plan.js";
22
- import { canonicalizeWorkflowRefInput, loadWorkflowAsset, resolveWorkflowEntryId } from "./workflow-asset-loader.js";
21
+ import { decodeWorkflowPlan, frozenStepRows, readRunPlan } from "./run-plan.js";
22
+ import { canonicalizeWorkflowRefInput, loadWorkflowAsset } from "./workflow-asset-loader.js";
23
23
  /**
24
24
  * Membership test for the journaled `runner` column, which is an untyped string.
25
25
  * The `Record<WorkflowRuntimeKind, …>` is exhaustiveness-checked, so a new runtime
26
26
  * kind cannot be added to the union without being accepted here too.
27
27
  */
28
- const IR_RUNTIME_KINDS = { llm: true, agent: true, sdk: true, exec: true };
28
+ const IR_RUNTIME_KINDS = { connection: true, harness: true, exec: true };
29
+ /** What a run of an earlier release journaled for the runner kinds that were renamed. */
30
+ const EARLIER_RUNTIME_KINDS = {
31
+ llm: "connection",
32
+ agent: "harness",
33
+ sdk: "harness",
34
+ };
29
35
  function runtimeKindOf(runner) {
30
- return runner !== null && Object.hasOwn(IR_RUNTIME_KINDS, runner) ? runner : null;
36
+ if (runner === null)
37
+ return null;
38
+ if (Object.hasOwn(IR_RUNTIME_KINDS, runner))
39
+ return runner;
40
+ return EARLIER_RUNTIME_KINDS[runner] ?? null;
31
41
  }
32
42
  function toUnitDiagnostic(row) {
33
43
  let diagnostic = null;
@@ -98,38 +108,21 @@ export async function startWorkflowRun(ref, params = {}, options) {
98
108
  return withWorkflowRunsRepo(async (repo) => {
99
109
  const now = new Date().toISOString();
100
110
  const runId = randomUUID();
101
- const scopeKey = getCurrentWorkflowScopeKey();
102
111
  const currentStepId = plan.steps[0]?.stepId ?? null;
103
- const workflowEntryId = resolveWorkflowEntryId(asset.sourcePath, asset.ref, asset.adapterId);
104
112
  // Capture the invoking harness/session identity for this run. Explicit options
105
113
  // win; otherwise fall back to best-effort environment detection. This is
106
114
  // identity-only — no background thread or timer is started here.
107
115
  const detected = resolveAgentIdentity();
108
116
  const agentHarness = options?.agentHarness !== undefined ? options.agentHarness : detected.harness;
109
117
  const agentSessionId = options?.agentSessionId !== undefined ? options.agentSessionId : detected.sessionId;
110
- // Concurrency guard (#485): if an active run already exists in this
111
- // (workflow_ref, scope_key) pair, refuse to create a parallel run unless
112
- // `force: true` is set. Previously every call inserted unconditionally,
113
- // so two terminals starting the same workflow could leave two runs racing.
114
- // The active-alias query and all inserts share one immediate transaction.
115
- // #942: an active run of this ref in a different scope (e.g. a scheduled
116
- // task's cwd vs. a shell) is warned about once; the uniqueness guard stays
117
- // scope-local. The query excludes the caller's own scope in SQL.
118
- const crossScopeActive = repo.findActiveRunOutsideScope(workflowRefs, scopeKey);
119
- const crossScopeWarning = crossScopeActive
120
- ? `Workflow ${asset.ref} already has an active run in another scope ` +
121
- `(id ${crossScopeActive.id}, started ${crossScopeActive.created_at}, scope ${crossScopeActive.scope_key ?? "unknown"}); ` +
122
- `starting a separate run here. Resume it from anywhere with "akm workflow run ${crossScopeActive.id}" ` +
123
- `or free it with "akm workflow abandon ${crossScopeActive.id}".`
124
- : undefined;
118
+ // Starting a ref always starts a run. Other active runs of the same ref
119
+ // are not an error: name them once, after the start succeeds, so the
120
+ // operator can continue or abandon the ones they no longer want.
121
+ const otherActive = repo.listRuns({ workflowRefs, activeOnly: true });
125
122
  repo.publishWorkflowRunV4({
126
- workflowRefs,
127
- ...(options?.force ? { force: true } : {}),
128
123
  run: {
129
124
  id: runId,
130
125
  workflowRef: asset.ref,
131
- scopeKey,
132
- workflowEntryId,
133
126
  workflowTitle: asset.title,
134
127
  paramsJson: JSON.stringify(effectiveParams),
135
128
  currentStepId,
@@ -149,9 +142,12 @@ export async function startWorkflowRun(ref, params = {}, options) {
149
142
  planJson,
150
143
  planHash,
151
144
  });
145
+ if (otherActive.length > 0) {
146
+ const ids = otherActive.map((run) => run.id);
147
+ warn(`Workflow ${asset.ref} already has ${ids.length} active run(s) (${ids.join(", ")}); started another. ` +
148
+ `Continue one with "akm workflow run ${ids[0]}" or give up on it with "akm workflow abandon ${ids[0]}".`);
149
+ }
152
150
  const result = await getWorkflowStatus(runId);
153
- if (crossScopeWarning)
154
- result.warnings = [...(result.warnings ?? []), crossScopeWarning];
155
151
  // Params reach every unit prompt in clear (only the journal scrubs them).
156
152
  // Surface a loud, best-effort warning when a param LOOKS like a credential
157
153
  // so the author moves it to an env binding. Advisory only — never blocks
@@ -159,14 +155,19 @@ export async function startWorkflowRun(ref, params = {}, options) {
159
155
  const secretWarnings = detectSecretShapedParams(effectiveParams);
160
156
  if (secretWarnings.length > 0)
161
157
  result.warnings = [...(result.warnings ?? []), ...secretWarnings];
162
- // The implicit engine fallback is announced ONCE, here at run creation —
163
- // the frozen plan records the engine actually used, so a resume never
164
- // re-announces a decision it did not make.
165
- if (frozen.engineAnnouncement)
166
- result.warnings = [...(result.warnings ?? []), frozen.engineAnnouncement];
167
158
  return result;
168
159
  });
169
160
  }
161
+ function decodeStatusPlan(planJson) {
162
+ if (!planJson)
163
+ return undefined;
164
+ try {
165
+ return decodeWorkflowPlan(JSON.parse(planJson));
166
+ }
167
+ catch {
168
+ return undefined;
169
+ }
170
+ }
170
171
  export async function getWorkflowStatus(runId, opts) {
171
172
  return withWorkflowRunsRepo((repo) => {
172
173
  const run = readWorkflowRun(repo, runId);
@@ -176,25 +177,32 @@ export async function getWorkflowStatus(runId, opts) {
176
177
  // The honest diagnostic surface (#22): read the unit journal straight and
177
178
  // project each row, INCLUDING failures whose diagnostic text the
178
179
  // deterministic evidence graph drops. Read-only; never mutates the run.
179
- detail.units = repo.getUnitsForRun(run.id).map(toUnitDiagnostic);
180
+ const rows = repo.getUnitsForRun(run.id);
181
+ // The plan is decoded only to describe a failed unit, read-only: no run
182
+ // warning (`readRunPlan` says it is "running" an older plan) and no
183
+ // orchestration when the plan cannot be decoded.
184
+ const plan = rows.some((row) => row.status === "failed") ? decodeStatusPlan(run.plan_json) : undefined;
185
+ detail.units = rows.map((row) => {
186
+ const unit = toUnitDiagnostic(row);
187
+ const step = row.status === "failed" ? plan?.steps.find((candidate) => candidate.stepId === row.step_id) : undefined;
188
+ const summary = step ? summarizeStepOrchestration(step, undefined) : undefined;
189
+ return summary ? { ...unit, orchestration: resolveOrchestrationRefs(summary) } : unit;
190
+ });
180
191
  }
181
192
  return detail;
182
193
  });
183
194
  }
184
195
  export async function listWorkflowRuns(input) {
185
- const scopeKey = input?.allScopes === true ? null : getCurrentWorkflowScopeKey();
186
196
  const activeOnly = input?.activeOnly === true;
187
197
  const includeChildren = input?.includeChildren === true;
188
198
  if (input?.workflowRef === undefined) {
189
199
  return withWorkflowRunsRepo((repo) => ({
190
200
  runs: repo
191
201
  .listRuns({
192
- scopeKey,
193
202
  ...(activeOnly ? { activeOnly: true } : {}),
194
203
  ...(includeChildren ? { includeChildren: true } : {}),
195
204
  })
196
205
  .map(toWorkflowRunSummary),
197
- scopeKey,
198
206
  }));
199
207
  }
200
208
  const exactRef = input.workflowRef.trim();
@@ -212,12 +220,11 @@ export async function listWorkflowRuns(input) {
212
220
  }
213
221
  catch (error) {
214
222
  if (parsedExactRef.bundle !== undefined) {
215
- const exactRows = await withWorkflowRunsRepo((repo) => repo.listRuns({ scopeKey, workflowRef: exactRef, ...(includeChildren ? { includeChildren: true } : {}) }));
223
+ const exactRows = await withWorkflowRunsRepo((repo) => repo.listRuns({ workflowRef: exactRef, ...(includeChildren ? { includeChildren: true } : {}) }));
216
224
  if (exactRows.length === 0)
217
225
  throw error;
218
226
  return {
219
227
  runs: exactRows.filter((row) => !activeOnly || row.status === "active").map(toWorkflowRunSummary),
220
- scopeKey,
221
228
  };
222
229
  }
223
230
  if (!(error instanceof NotFoundError))
@@ -226,23 +233,20 @@ export async function listWorkflowRuns(input) {
226
233
  return withWorkflowRunsRepo((repo) => ({
227
234
  runs: repo
228
235
  .listRuns({
229
- scopeKey,
230
236
  workflowRefs,
231
237
  ...(activeOnly ? { activeOnly: true } : {}),
232
238
  ...(includeChildren ? { includeChildren: true } : {}),
233
239
  })
234
240
  .map(toWorkflowRunSummary),
235
- scopeKey,
236
241
  }));
237
242
  }
238
243
  export async function getNextWorkflowStep(specifier, params, options) {
239
244
  return withWorkflowRunsRepo(async (repo) => {
240
- const { run, autoStarted, resumed, startWarnings } = await resolveRunSpecifier(repo, specifier, params, options?.parameterFlags, options?.newRun);
245
+ const { run, autoStarted, startWarnings } = await resolveRunSpecifier(repo, specifier, params, options?.parameterFlags);
241
246
  const steps = readWorkflowRunSteps(repo, run.id);
242
247
  return {
243
248
  ...projectNextResult(run, steps),
244
249
  ...(autoStarted ? { autoStarted: true } : {}),
245
- ...(resumed ? { resumed: true } : {}),
246
250
  ...(startWarnings?.length ? { startWarnings } : {}),
247
251
  };
248
252
  });
@@ -348,7 +352,7 @@ export async function completeWorkflowStep(input) {
348
352
  const stepPlan = storedPlan.steps.find((step) => step.stepId === input.stepId);
349
353
  if (!stepPlan)
350
354
  throw new NotFoundError(`Step "${input.stepId}" was not found in workflow run ${run.id}.`);
351
- return { existing, plan: storedPlan, stepPlan };
355
+ return { existing, plan: storedPlan, stepPlan, workflowRef: run.workflow_ref };
352
356
  });
353
357
  const summary = input.summary?.trim();
354
358
  // #506: completing a step requires a summary of the work done.
@@ -365,14 +369,11 @@ export async function completeWorkflowStep(input) {
365
369
  ? // Manual completion journals no gate row, so there is no `<stepId>.gate:l<loop>`
366
370
  // identity to agree with — but the dispatch still names the REAL run and
367
371
  // step (frozen-judge falls back to the gate node id for the unit id).
368
- frozenSummaryJudge(preflight.stepPlan.gate.frozenJudge, input.signal, undefined, {
369
- runId: input.runId,
370
- stepId: input.stepId,
371
- })
372
+ frozenSummaryJudge(preflight.stepPlan.gate.frozenJudge, input.signal, undefined, { runId: input.runId, stepId: input.stepId }, undefined, resolveJudgeCwd(preflight.stepPlan.gate.frozenJudge, preflight.workflowRef))
372
373
  : input.summaryJudge;
373
374
  if (criteria.length > 0 && !judge) {
374
375
  throw new ConfigError(`Workflow run ${input.runId} has completion criteria for step "${input.stepId}" but its frozen plan has no judge. ` +
375
- "Set workflow.judgeEngine, abandon this run, and create a new one with `akm workflow run <ref>`.", "INVALID_CONFIG_FILE");
376
+ "Run `akm setup` to add a connection or harness, abandon this run, and create a new one with `akm workflow run <ref>`.", "INVALID_CONFIG_FILE");
376
377
  }
377
378
  const verdict = await validateStepSummary({ stepTitle: preflight.stepPlan.title, completionCriteria: criteria, summary }, judge ?? undefined, input.signal);
378
379
  if (!verdict.complete) {
@@ -457,57 +458,27 @@ export async function completeWorkflowStep(input) {
457
458
  return detail;
458
459
  });
459
460
  }
460
- async function resolveRunSpecifier(repo, specifier, params, parameterFlags, forceNew) {
461
- const hasParameters = (params && Object.keys(params).length > 0) || (parameterFlags?.length ?? 0) > 0;
461
+ async function resolveRunSpecifier(repo, specifier, params, parameterFlags) {
462
462
  const explicitRun = findRunByIdOrPrefix(repo, specifier);
463
463
  if (explicitRun) {
464
- // `--new` starts a fresh run FROM A REF; it never makes sense against a
465
- // run id (or an id prefix), which already names the run to act on (#919).
466
- if (forceNew) {
467
- throw new UsageError(`--new starts a fresh run from a workflow ref; "${specifier}" already names a run id.`, "INVALID_FLAG_VALUE");
468
- }
469
- if (hasParameters) {
464
+ if ((params && Object.keys(params).length > 0) || (parameterFlags?.length ?? 0) > 0) {
470
465
  throw new UsageError(`Workflow parameter flags can only be used when starting a new run, not with existing run id "${specifier}".`);
471
466
  }
472
467
  return { run: explicitRun, autoStarted: false };
473
468
  }
474
- const scopeKey = getCurrentWorkflowScopeKey();
475
- const exactRef = specifier.trim();
476
- const parsedExact = parseBundleRef(exactRef);
477
- const qualifiedExact = parsedExact.bundle !== undefined && parsedExact.fragment === undefined;
478
- const detached = qualifiedExact && !forceNew ? repo.getActiveRunRowForScope(exactRef, scopeKey) : undefined;
469
+ // A workflow ref always starts a new run; only a run id drives an existing one.
479
470
  let ref;
480
471
  try {
481
472
  ref = await canonicalizeWorkflowSpecifier(specifier);
482
473
  }
483
474
  catch (error) {
484
- if (detached) {
485
- if (hasParameters) {
486
- throw new UsageError(`Workflow parameter flags can only be set on a new run; ${specifier} is already active ` +
487
- `(id ${detached.id}, scope ${scopeKey}).`, "INVALID_FLAG_VALUE", `Pass --new to start a separate run, or run "akm workflow abandon ${detached.id}" to free up ${specifier} first.`);
488
- }
489
- return { run: detached, autoStarted: false, resumed: true };
490
- }
491
475
  if (error instanceof NotFoundError && !specifier.includes(":") && !specifier.includes("/")) {
492
476
  throw new NotFoundError(`Workflow run or workflow "${specifier}" not found.`, "WORKFLOW_NOT_FOUND");
493
477
  }
494
478
  throw error;
495
479
  }
496
- const active = forceNew ? undefined : repo.getActiveRunRowForScope(await workflowRunRefSet(ref, exactRef), scopeKey);
497
- if (active) {
498
- if (hasParameters) {
499
- throw new UsageError(`Workflow parameter flags can only be set on a new run; ${ref} is already active ` +
500
- `(id ${active.id}, scope ${scopeKey}).`, "INVALID_FLAG_VALUE", `Pass --new to start a separate run, or run "akm workflow abandon ${active.id}" to free up ${ref} first.`);
501
- }
502
- return { run: active, autoStarted: false, resumed: true };
503
- }
504
- // `force` (#485's own escape hatch) is what lets `--new` create a second
505
- // active run for this (ref, scope) pair instead of the concurrency guard
506
- // refusing it — the caller explicitly asked for a fresh run, so the guard
507
- // that exists to catch an ACCIDENTAL second run does not apply (#919).
508
480
  const started = await startWorkflowRun(ref, params ?? {}, {
509
481
  ...(parameterFlags !== undefined ? { parameterFlags } : {}),
510
- ...(forceNew ? { force: true } : {}),
511
482
  });
512
483
  return {
513
484
  run: readWorkflowRun(repo, started.run.id),
@@ -636,7 +607,7 @@ function toChildRunNode(repo, rootRunId, row) {
636
607
  ? {
637
608
  resume: {
638
609
  command: `akm workflow resume ${row.id}`,
639
- // biome-ignore lint/suspicious/noThenProperty: mirrors spec §4.5's real WorkflowChildRunNode.resume.then field name
610
+ // biome-ignore lint/suspicious/noThenProperty: mirrors the real WorkflowChildRunNode.resume.then field name
640
611
  then: `akm workflow resume ${rootRunId} && akm workflow run ${rootRunId}`,
641
612
  },
642
613
  }
@@ -648,7 +619,6 @@ function toWorkflowRunSummary(run) {
648
619
  return {
649
620
  id: run.id,
650
621
  workflowRef: run.workflow_ref,
651
- scopeKey: run.scope_key,
652
622
  workflowEntryId: run.workflow_entry_id,
653
623
  workflowTitle: run.workflow_title,
654
624
  status: run.status,
@@ -733,11 +703,3 @@ function parseJsonArray(value) {
733
703
  }
734
704
  return undefined;
735
705
  }
736
- export async function getActiveWorkflowRun(scopeKey = getCurrentWorkflowScopeKey()) {
737
- return withWorkflowRunsRepo((repo) => {
738
- const row = repo.findActiveOrBlockedRunForScope(scopeKey);
739
- if (!row)
740
- return null;
741
- return { runId: row.id, stepId: row.current_step_id, workflowRef: row.workflow_ref };
742
- }).catch(() => null); // fail-open: never crash show output due to DB error
743
- }
@@ -3,16 +3,13 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import { createHash } from "node:crypto";
5
5
  import fs from "node:fs";
6
- import { detectAdapterId } from "../../core/adapter/detect-adapter.js";
7
6
  import { makeBundleRef, parseBundleRef } from "../../core/asset/asset-ref.js";
8
7
  import { loadConfig } from "../../core/config/config.js";
9
8
  import { COMPOSITION_INVALID_MULTI_JOB_HINT, NotFoundError, UsageError } from "../../core/errors.js";
10
- import { getDbPath } from "../../core/paths.js";
11
9
  import { canonicalizeWorkflowName } from "../../core/recognition-util.js";
12
- import { deriveInstallations } from "../../indexer/installations.js";
13
- import { resolveAdapterConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
10
+ import { resolveConceptOwner } from "../../indexer/lookup/adapter-concept-owner.js";
14
11
  import { resolveSourceEntries } from "../../indexer/search/search-source.js";
15
- import { withIndexDb } from "../../storage/repositories/index-db.js";
12
+ import { resolveSourcesForOrigin } from "../../registry/origin-resolve.js";
16
13
  import { compileWorkflowSource } from "../compile.js";
17
14
  /**
18
15
  * Build the canonical `workflow_runs.workflow_ref` for an AKM workflow asset.
@@ -31,71 +28,70 @@ export function parseWorkflowRefInput(ref) {
31
28
  }
32
29
  return parsed;
33
30
  }
34
- /** Resolve input sugar to the workflow's canonical run identity. */
31
+ /** Resolve input sugar to the workflow's canonical run identity, without compiling it. */
35
32
  export async function canonicalizeWorkflowRefInput(ref) {
36
- return (await loadWorkflowAsset(ref)).ref;
33
+ return resolveWorkflowAsset(ref).fullRef;
37
34
  }
38
- /**
39
- * Resolve a workflow ref and compile its authored bytes into a plan.
40
- */
41
- export async function loadWorkflowAsset(ref) {
35
+ /** Resolve a workflow ref to its authored file and canonical run ref. */
36
+ function resolveWorkflowAsset(ref) {
42
37
  const bundleRef = parseWorkflowRefInput(ref);
43
- const config = loadConfig();
44
- const allSources = resolveSourceEntries(undefined, config);
45
- const installations = deriveInstallations(allSources);
46
- const searchSources = allSources.flatMap((source, index) => {
47
- const bundleId = installations[index]?.id;
48
- if (!bundleId || (bundleRef.bundle !== undefined && bundleRef.bundle !== bundleId))
49
- return [];
50
- return [{ source, bundleId }];
51
- });
52
- if (bundleRef.bundle && searchSources.length === 0) {
53
- throw new UsageError(`Bundle "${bundleRef.bundle}" was not found among configured sources.`, "WORKFLOW_SOURCE_INVALID");
54
- }
55
- let assetPath;
56
- let sourcePath;
57
- let sourceBundleId;
58
- let workflowName;
59
- let workflowAdapterId;
60
- let rejectedSource;
61
- for (const candidateSource of searchSources) {
62
- const { source, bundleId } = candidateSource;
63
- const adapterId = source.adapterId ?? detectAdapterId(source.path);
64
- const ownedSource = source.adapterId ? source : { ...source, adapterId };
65
- const owner = resolveAdapterConceptOwner(source.path, adapterId, bundleRef.conceptId);
66
- if (!owner)
67
- continue;
68
- if (!ownsNativeWorkflowRuntime(ownedSource) || !owner.workflowSource) {
69
- rejectedSource ??= { source: ownedSource, bundleId };
70
- break;
71
- }
72
- assetPath = owner.path;
73
- sourcePath = source.path;
74
- sourceBundleId = bundleId;
75
- workflowName = owner.workflowSource.canonicalName;
76
- workflowAdapterId = adapterId;
77
- break;
78
- }
79
- if (!assetPath) {
80
- if (rejectedSource) {
81
- const sourceName = rejectedSource.bundleId;
82
- const adapterId = rejectedSource.source.adapterId ?? "unassigned";
83
- throw new UsageError(`Bundle "${sourceName}" uses adapter "${adapterId}", which does not support native workflow execution.`, "WORKFLOW_SOURCE_INVALID");
38
+ const sources = resolveSourceEntries(undefined, loadConfig());
39
+ const match = resolveConceptOwner(bundleRef, sources);
40
+ if (!match) {
41
+ if (bundleRef.bundle && resolveSourcesForOrigin(bundleRef.bundle, sources).length === 0) {
42
+ throw new UsageError(`Bundle "${bundleRef.bundle}" was not found among configured sources.`, "WORKFLOW_SOURCE_INVALID");
84
43
  }
85
44
  throw new NotFoundError(`Workflow not found for ref: ${ref}`);
86
45
  }
87
- const resolvedSourcePath = sourcePath;
46
+ const { owner, source, bundleId, adapterId } = match;
47
+ if ((adapterId !== "akm" && adapterId !== "akm-workflow") || !owner.workflowSource) {
48
+ throw new UsageError(`Bundle "${bundleId}" uses adapter "${adapterId}", which does not support native workflow execution.`, "WORKFLOW_SOURCE_INVALID");
49
+ }
88
50
  // Canonicalize the stored ref: `workflows/foo.md` and `workflows/foo` resolve
89
51
  // to the same file, so they MUST share one run identity.
90
- const canonicalName = canonicalizeWorkflowName(workflowName);
91
- const fullRef = workflowAdapterId === "akm-workflow"
92
- ? makeBundleRef(sourceBundleId, canonicalName)
93
- : canonicalWorkflowRunRef(sourceBundleId, canonicalName);
52
+ const canonicalName = canonicalizeWorkflowName(owner.workflowSource.canonicalName);
53
+ const fullRef = adapterId === "akm-workflow"
54
+ ? makeBundleRef(bundleId, canonicalName)
55
+ : canonicalWorkflowRunRef(bundleId, canonicalName);
56
+ return { assetPath: owner.path, sourcePath: source.path, adapterId, canonicalName, fullRef };
57
+ }
58
+ /**
59
+ * The root of the bundle that owns a workflow ref right now: where the run's exec units and agents work.
60
+ * A bundle-qualified ref names its bundle, so the workflow file need not exist (a bundle update may have
61
+ * renamed or removed it; the frozen plan is the run's authority). An unqualified legacy ref finds its
62
+ * owner by the existing walk. When the bundle does not resolve, the error keeps its type (and exit code)
63
+ * and names the ref in its message.
64
+ */
65
+ export function resolveRunBundleRoot(ref) {
66
+ const { bundle } = parseWorkflowRefInput(ref);
67
+ if (bundle === undefined) {
68
+ try {
69
+ return resolveWorkflowAsset(ref).sourcePath;
70
+ }
71
+ catch (err) {
72
+ // Only a miss means the bundle does not resolve; any other error (an
73
+ // unsupported adapter, a collision) is reported as itself.
74
+ if (err instanceof NotFoundError) {
75
+ throw new NotFoundError(`workflow ${ref} does not resolve to a bundle: ${err.message}`, err.code, err.hint());
76
+ }
77
+ throw err;
78
+ }
79
+ }
80
+ const source = resolveSourcesForOrigin(bundle, resolveSourceEntries(undefined, loadConfig()))[0];
81
+ if (!source) {
82
+ throw new UsageError(`workflow ${ref} does not resolve to a bundle: bundle "${bundle}" is not configured`, "WORKFLOW_SOURCE_INVALID");
83
+ }
84
+ return source.path;
85
+ }
86
+ /**
87
+ * Resolve a workflow ref and compile its authored bytes into a plan.
88
+ */
89
+ export async function loadWorkflowAsset(ref) {
90
+ const { assetPath, adapterId, canonicalName, fullRef } = resolveWorkflowAsset(ref);
94
91
  const title = canonicalName.split("/").pop() || canonicalName;
95
92
  const bytes = fs.readFileSync(assetPath);
96
93
  const result = compileWorkflowSource(bytes.toString("utf8"), {
97
94
  path: assetPath,
98
- workspaceRoot: resolvedSourcePath,
99
95
  title,
100
96
  });
101
97
  if (!result.ok) {
@@ -106,36 +102,9 @@ export async function loadWorkflowAsset(ref) {
106
102
  return {
107
103
  ref: fullRef,
108
104
  path: assetPath,
109
- sourcePath: resolvedSourcePath,
110
- adapterId: workflowAdapterId,
105
+ adapterId,
111
106
  title,
112
107
  plan: result.plan,
113
108
  sourceHash: createHash("sha256").update(bytes).digest("hex"),
114
109
  };
115
110
  }
116
- function ownsNativeWorkflowRuntime(source) {
117
- return source.adapterId === "akm" || source.adapterId === "akm-workflow";
118
- }
119
- /**
120
- * Resolve the `entries.id` for an indexed workflow, or null when the index
121
- * database does not yet exist or has no matching entry.
122
- */
123
- export function resolveWorkflowEntryId(_sourcePath, ref, adapterId) {
124
- if (!fs.existsSync(getDbPath()))
125
- return null;
126
- const parsed = parseBundleRef(ref);
127
- if (!parsed.bundle)
128
- throw new UsageError(`Expected a bundle-qualified workflow ref, got "${ref}".`);
129
- const itemRef = makeBundleRef(parsed.bundle, parsed.conceptId);
130
- return withIndexDb((db) => {
131
- const row = db
132
- .prepare(`SELECT id
133
- FROM entries
134
- WHERE type = 'workflow'
135
- AND item_ref = ?
136
- ${adapterId ? "AND adapter_id = ?" : ""}
137
- LIMIT 1`)
138
- .get(itemRef, ...(adapterId ? [adapterId] : []));
139
- return row?.id ?? null;
140
- });
141
- }
@@ -66,15 +66,6 @@ export class WorkflowSourceLinkResolutionError extends WorkflowSourceRejectionEr
66
66
  Object.setPrototypeOf(this, new.target.prototype);
67
67
  }
68
68
  }
69
- export class WorkflowSourcePathIdentityError extends WorkflowSourceRejectionError {
70
- constructor(sourcePath, targetPath) {
71
- super(`Workflow source ${sourcePath} resolves outside the bundle root to ${targetPath}.`, "PATH_ESCAPE_VIOLATION", [
72
- sourcePath,
73
- ]);
74
- this.name = "WorkflowSourcePathIdentityError";
75
- Object.setPrototypeOf(this, new.target.prototype);
76
- }
77
- }
78
69
  /** Convert an adapter-owned concept id into its extensionless workflow name. */
79
70
  export function workflowNameForConceptId(adapterId, conceptId) {
80
71
  if (adapterId === "akm-workflow")
@@ -270,21 +261,18 @@ function inspectWorkflowSourceCandidate(candidate, canonicalName, realRoot) {
270
261
  issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
271
262
  return { issues };
272
263
  }
264
+ // A symlink may point anywhere (installing a bundle is the trust decision),
265
+ // but it may not change the source's format.
273
266
  const targetPath = toPosix(path.relative(realRoot, realPath));
274
- const contained = isWithinResolved(realPath, realRoot);
275
- if (!contained)
276
- issues.push(new WorkflowSourcePathIdentityError(candidate.relativePath, targetPath));
277
267
  if (isLink && path.extname(realPath).toLowerCase() !== candidate.lowerExtension) {
278
268
  issues.push(new WorkflowSourceLinkIdentityError(candidate.relativePath, targetPath));
279
269
  }
280
- if (contained) {
281
- try {
282
- if (!fs.statSync(realPath).isFile())
283
- issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
284
- }
285
- catch {
270
+ try {
271
+ if (!fs.statSync(realPath).isFile())
286
272
  issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
287
- }
273
+ }
274
+ catch {
275
+ issues.push(new WorkflowSourceLinkResolutionError(candidate.relativePath));
288
276
  }
289
277
  if (issues.length > 0)
290
278
  return { issues };
package/docs/README.md CHANGED
@@ -17,6 +17,7 @@ Full per-directory indexes: [Guides](guides/README.md),
17
17
  - [Getting Started](guides/getting-started.md) -- Install akm, connect a source, and pull a curated shortlist in five to seven minutes
18
18
  - [Concepts](guides/concepts.md) -- Capabilities, bundles, adapters, asset types, and refs -- the mental model in one page
19
19
  - [Agent Install Guide](agents/agent-install.md) -- Step-by-step automated (non-interactive) install for agents
20
+ - [Upgrade from 0.9 to 0.10](migration/v0.9-to-v0.10.md) -- The current upgrade path: the order to follow, every removed CLI spelling, config key and workflow feature with its replacement, and what a scheduled `akm improve` now does
20
21
  - `akm hints` (complete guide by default; `akm hints --detail brief` for the short one) -- The CLI reference agents load to use akm; always the embedded corpus at `src/assets/hints/cli-hints-{full,short}.md`
21
22
 
22
23
  ## Use
@@ -32,7 +33,6 @@ the task needs, and capture what you learn along the way.
32
33
  - [Environment & Secrets](reference/env-and-secrets.md) -- `akm env` and `akm secret`: exact operations, file modes, and the security guarantee
33
34
  - [Run Workflows](guides/run-workflows.md) -- Start or continue a run, check on it, resume it, or abandon it
34
35
  - [Scheduling](guides/scheduling.md) -- Run akm tasks through the OS scheduler (cron / launchd / schtasks) safely
35
- - [Migrate to 0.9.2](migration/v0.9.1-to-v0.9.2.md) -- Convert task-v2 sources safely and understand workflow resume compatibility
36
36
  - [Improve the Library](guides/improve-the-library.md) -- Feedback, history, and proposals -- how evidence turns into reviewable changes
37
37
  - Recipes: [Turn a Website into a Searchable Bundle](guides/recipes/website-source.md), [Headless Install](guides/recipes/headless-install.md)
38
38
 
@@ -42,23 +42,21 @@ Package complete capabilities and turn knowledge into repeatable work.
42
42
 
43
43
  - [Bundle Author's Guide](guides/author-bundles.md) -- Build a bundle, make it discoverable, and share it so others can install it with `akm bundle add`
44
44
  - [Author's Guide: Writing Workflows](guides/author-workflows.md) -- Write and test a workflow definition, from a minimal example to gates and outputs
45
- - [Claude Code workflows vs. akm workflows](guides/claude-code-vs-akm-workflows.md) -- Short decision guide for choosing between a session-native workflow and an akm workflow ([full technical comparison](architecture/comparisons/claude-code-vs-akm-workflows-full.md))
46
45
  - [Bundling akm](integration/bundling-akm.md) -- Ship akm inside your own product: the pin/migrate/health boot contract, plan JSON shapes, and exit codes for bundlers
47
46
 
48
47
  ### Maintainers
49
48
 
50
49
  Working on akm itself, not just using it.
51
50
 
52
- - [Maintainer Docs](maintainers/README.md) -- Start here: local development, measuring improvement, and the curate contract
51
+ - [Maintainer Docs](maintainers/README.md) -- Start here: local development, the release checklist, and measuring improvement
53
52
  - [Local Development](maintainers/local-development.md) -- Dogfooding akm while editing its own source
54
- - [Curate Workmap](maintainers/curate-workmap.md) -- The current `akm curate` contract and the highest-value next fixes
55
53
 
56
54
  ## Look up details
57
55
 
58
56
  - [CLI](reference/cli.md) -- All `akm` commands and flags
59
- - [Configuration](reference/configuration.md) -- Engines, strategies, bundles, and settings
57
+ - [Configuration](reference/configuration.md) -- Connections, harnesses, strategies, bundles, and settings
60
58
  - [Supported Formats](reference/supported-formats.md) -- Every bundle format akm recognizes, its detection marker, and current read/write support
61
- - [Tasks](reference/tasks.md) -- Task-v3 files, targets, triggers, and fail-closed migration
59
+ - [Tasks](reference/tasks.md) -- Task source v4 files, targets, triggers, and the explicit `akm migrate apply` conversion of v2 and v3 files
62
60
  - [Asset Types](reference/asset-types.md) -- The capability taxonomy, directory conventions, and per-type examples
63
61
  - [Refs](reference/refs.md) -- The ref grammar `akm search` emits and `akm show` consumes
64
62
  - [Memory](reference/memory.md) -- The `memory` asset type: capture, belief states, and derived memories
@@ -68,17 +66,14 @@ Working on akm itself, not just using it.
68
66
  - [Website Sources](reference/website-sources.md) -- The pluggable fetcher API for URL-based knowledge reads
69
67
  - [Data & Telemetry](reference/data-and-telemetry.md) -- Exactly what akm reads and writes on your machine (no remote telemetry)
70
68
  - [Architecture Overview](architecture/architecture.md) -- How akm's bundles, cache, index, and registries fit together
71
- - [Core Principles](architecture/akm-core-principles.md) -- Design principles and constraints
69
+ - [Core Principles](architecture/akm-core-principles.md) -- How the code, tests and docs in this repo are built: the engineering rules and what enforces each
72
70
  - [Adapters](architecture/adapters.md) -- How akm picks an adapter, indexes, validates, and writes into a bundle
73
71
  - [The Workflow Engine](architecture/workflow-engine.md) -- How a frozen plan is stored, dispatched, and resumed without replaying completed units
74
72
  - [The Improvement Loop](architecture/improvement.md) -- How a feedback signal becomes a ranking change, and how evidence becomes a proposal
75
- - [Runtime Boundary Design](architecture/runtime-boundary-design.md) -- Isolating `bun:sqlite`/`Bun.*` from the core
76
- - [Architecture Decision History](architecture/akm-architecture-decision-history.md) -- ADR-style record of the major architecture rulings
77
- - [Specs](architecture/README.md#specs-specs) -- Normative specifications (bundle/adapter model, ref grammar, bundle conventions)
78
- - [Internals](architecture/README.md#internals-internals) -- Current-truth subsystem references (storage, search, indexing, improve, health)
79
- - [Testing](architecture/README.md#testing-testing) -- Testing workflow and pre-release checklist
80
- - [Migration](migration/README.md) -- Upgrade guides and per-release migration notes
81
- - [Roadmap](https://github.com/itlackey/akm/blob/main/ROADMAP.md) -- High-level focus for the releases from here through 1.0
73
+ - [Specs](architecture/README.md#specs-specs) -- Normative specifications (ref grammar, OKF support)
74
+ - [Internals](architecture/README.md#internals-internals) -- Current-truth subsystem references (storage, indexing, classification, improve, health)
75
+ - [Testing](architecture/README.md#testing-testing) -- Testing workflow
76
+ - [Migration](migration/README.md) -- The current 0.9 to 0.10 upgrade guide, then the historical guides and per-release notes of earlier releases
82
77
 
83
78
  ## Execution boundary
84
79
 
@@ -86,8 +81,7 @@ AKM retrieves every supported capability type. It directly orchestrates
86
81
  defined execution surfaces such as workflows, agent dispatch, tasks, and
87
82
  guarded subprocess injection. It does not blindly execute arbitrary indexed
88
83
  content merely because that content appears in search results. See
89
- [Core Principles](architecture/akm-core-principles.md) for the full boundary,
90
- and [The Improvement Loop](architecture/improvement.md) for how that boundary
84
+ [The Improvement Loop](architecture/improvement.md) for how that boundary
91
85
  applies to akm's own self-generated changes.
92
86
 
93
87
  ## Posts