akm-cli 0.9.0-rc.1 → 0.9.0-rc.13

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 (587) hide show
  1. package/CHANGELOG.md +1190 -52
  2. package/README.md +62 -37
  3. package/SECURITY.md +46 -31
  4. package/dist/akm +162 -38
  5. package/dist/akm-migrate +44 -0
  6. package/dist/assets/backends/schtasks-template.xml +2 -1
  7. package/dist/assets/hints/cli-hints-full.md +268 -118
  8. package/dist/assets/hints/cli-hints-short.md +87 -24
  9. package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
  10. package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
  11. package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
  12. package/dist/assets/improve-strategies/frequent.json +15 -0
  13. package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
  14. package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
  15. package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
  16. package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
  17. package/dist/assets/improve-strategies/reflect-distill.json +30 -0
  18. package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
  19. package/dist/assets/prompts/consolidate-system.md +5 -5
  20. package/dist/assets/prompts/extract-session.md +2 -6
  21. package/dist/assets/prompts/memory-infer-user.md +2 -3
  22. package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
  23. package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
  24. package/dist/assets/prompts/reflect-output-repair.md +3 -0
  25. package/dist/assets/stash-skeleton/README.md +38 -10
  26. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
  27. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
  28. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
  29. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
  30. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
  31. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
  32. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
  33. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
  34. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
  35. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
  36. package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
  37. package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
  38. package/dist/assets/tasks/core/extract.yml +3 -2
  39. package/dist/assets/tasks/core/improve.yml +2 -1
  40. package/dist/assets/tasks/core/index-refresh.yml +1 -0
  41. package/dist/assets/tasks/core/sync.yml +1 -0
  42. package/dist/assets/tasks/core/version-check.yml +2 -1
  43. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  44. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  45. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  46. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  47. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  48. package/dist/assets/templates/html/health.html +5 -4
  49. package/dist/assets/workflows/workflow-template.md +31 -15
  50. package/dist/cli/invocation.js +279 -0
  51. package/dist/cli/parse-args.js +5 -90
  52. package/dist/cli/retired-commands.js +78 -0
  53. package/dist/cli/shared.js +158 -48
  54. package/dist/cli-node.mjs +2 -1
  55. package/dist/cli.js +747 -293
  56. package/dist/commands/agent/agent-dispatch.js +19 -18
  57. package/dist/commands/agent/agent-support.js +0 -24
  58. package/dist/commands/agent/contribute-cli.js +43 -97
  59. package/dist/commands/completions.js +80 -23
  60. package/dist/commands/config-cli.js +44 -281
  61. package/dist/commands/env/env-binding.js +13 -9
  62. package/dist/commands/env/env-cli.js +76 -159
  63. package/dist/commands/env/env.js +12 -163
  64. package/dist/commands/env/marker-path.js +6 -0
  65. package/dist/commands/env/secret-cli.js +45 -61
  66. package/dist/commands/env/secret.js +32 -62
  67. package/dist/commands/feedback-cli.js +179 -85
  68. package/dist/commands/health/accept-rate.js +58 -0
  69. package/dist/commands/health/advisories.js +7 -8
  70. package/dist/commands/health/checks.js +279 -94
  71. package/dist/commands/health/html-report.js +197 -578
  72. package/dist/commands/health/improve-metrics.js +277 -246
  73. package/dist/commands/health/llm-usage.js +19 -19
  74. package/dist/commands/health/md-report.js +16 -7
  75. package/dist/commands/health/metrics.js +67 -32
  76. package/dist/commands/health/renderers.js +47 -0
  77. package/dist/commands/health/report-view-model.js +508 -0
  78. package/dist/commands/health/stash-exposure.js +1 -1
  79. package/dist/commands/health/surfaces.js +16 -56
  80. package/dist/commands/health/task-runs.js +3 -67
  81. package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
  82. package/dist/commands/health/types-improve.js +29 -0
  83. package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
  84. package/dist/commands/health/types-result.js +7 -0
  85. package/dist/commands/health/types-runs.js +4 -0
  86. package/dist/commands/health/types-session-log.js +4 -0
  87. package/dist/commands/health/types-windows.js +4 -0
  88. package/dist/commands/health/types.js +26 -21
  89. package/dist/commands/health/windows.js +2 -3
  90. package/dist/commands/health.js +296 -167
  91. package/dist/commands/improve/anti-collapse.js +5 -5
  92. package/dist/commands/improve/autonomy-gate.js +68 -0
  93. package/dist/commands/improve/collapse-detector.js +65 -52
  94. package/dist/commands/improve/consolidate/chunking.js +9 -7
  95. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  96. package/dist/commands/improve/consolidate/merge.js +4 -0
  97. package/dist/commands/improve/consolidate.js +454 -1354
  98. package/dist/commands/improve/content-hash.js +39 -0
  99. package/dist/commands/improve/distill/content-repair.js +4 -10
  100. package/dist/commands/improve/distill/promote-memory.js +89 -64
  101. package/dist/commands/improve/distill/quality-gate.js +118 -42
  102. package/dist/commands/improve/distill-guards.js +1 -1
  103. package/dist/commands/improve/distill-promotion-policy.js +33 -888
  104. package/dist/commands/improve/distill.js +607 -363
  105. package/dist/commands/improve/eligibility.js +165 -79
  106. package/dist/commands/improve/extract-cli.js +35 -126
  107. package/dist/commands/improve/extract-prompt.js +6 -35
  108. package/dist/commands/improve/extract.js +640 -391
  109. package/dist/commands/improve/feedback-valence.js +2 -12
  110. package/dist/commands/improve/improve-cli.js +134 -135
  111. package/dist/commands/improve/improve-result-file.js +30 -50
  112. package/dist/commands/improve/improve-run-types.js +4 -0
  113. package/dist/commands/improve/improve-strategies.js +135 -0
  114. package/dist/commands/improve/improve.js +904 -701
  115. package/dist/commands/improve/locks.js +64 -111
  116. package/dist/commands/improve/loop-stages.js +1110 -923
  117. package/dist/commands/improve/memory/derived-ref.js +124 -0
  118. package/dist/commands/improve/memory/memory-belief.js +79 -7
  119. package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
  120. package/dist/commands/improve/memory/memory-improve.js +25 -37
  121. package/dist/commands/improve/outcome-loop.js +25 -88
  122. package/dist/commands/improve/preparation.js +1034 -813
  123. package/dist/commands/improve/proactive-maintenance.js +34 -9
  124. package/dist/commands/improve/proposal-envelope.js +31 -0
  125. package/dist/commands/improve/reflect.js +983 -794
  126. package/dist/commands/improve/run-context.js +119 -0
  127. package/dist/commands/improve/salience.js +24 -127
  128. package/dist/commands/improve/session-asset.js +7 -3
  129. package/dist/commands/improve/shared.js +14 -34
  130. package/dist/commands/improve/source-identity.js +28 -0
  131. package/dist/commands/improve/triage.js +20 -17
  132. package/dist/commands/lint/base-linter.js +340 -313
  133. package/dist/commands/lint/env-key-rules.js +31 -47
  134. package/dist/commands/lint/index.js +185 -30
  135. package/dist/commands/{events.js → log.js} +28 -38
  136. package/dist/commands/migrate-cli.js +54 -0
  137. package/dist/commands/migration-tool.js +55 -0
  138. package/dist/commands/observability-cli.js +70 -208
  139. package/dist/commands/proposal/diff-format.js +50 -0
  140. package/dist/commands/proposal/drain-policies.js +0 -6
  141. package/dist/commands/proposal/drain.js +91 -40
  142. package/dist/commands/proposal/proposal-cli.js +134 -132
  143. package/dist/commands/proposal/proposal-types.js +56 -0
  144. package/dist/commands/proposal/proposal.js +83 -65
  145. package/dist/commands/proposal/propose-cli.js +88 -0
  146. package/dist/commands/proposal/propose.js +105 -88
  147. package/dist/commands/proposal/repository.js +1303 -278
  148. package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
  149. package/dist/commands/proposal/validators/proposal-validators.js +61 -12
  150. package/dist/commands/proposal/validators/proposals.js +6 -8
  151. package/dist/commands/read/curate.js +78 -73
  152. package/dist/commands/read/knowledge.js +510 -13
  153. package/dist/commands/read/registry-search.js +2 -2
  154. package/dist/commands/read/remember-cli.js +84 -15
  155. package/dist/commands/read/search-cli.js +203 -96
  156. package/dist/commands/read/search.js +126 -94
  157. package/dist/commands/read/show.js +226 -250
  158. package/dist/commands/registry-cli.js +34 -60
  159. package/dist/commands/remember.js +18 -57
  160. package/dist/commands/sources/add-cli.js +104 -49
  161. package/dist/commands/sources/bundle-cli.js +166 -0
  162. package/dist/commands/sources/bundle-config-ops.js +63 -0
  163. package/dist/commands/sources/info.js +27 -15
  164. package/dist/commands/sources/init.js +30 -40
  165. package/dist/commands/sources/installed-stashes.js +469 -172
  166. package/dist/commands/sources/schema-repair.js +10 -9
  167. package/dist/commands/sources/self-update.js +182 -121
  168. package/dist/commands/sources/source-add.js +169 -178
  169. package/dist/commands/sources/source-clone.js +144 -41
  170. package/dist/commands/sources/source-manage.js +94 -59
  171. package/dist/commands/sources/sources-cli.js +64 -205
  172. package/dist/commands/sources/stash-cli.js +91 -54
  173. package/dist/commands/sources/stash-skeleton.js +1 -1
  174. package/dist/commands/tasks/tasks-cli.js +106 -104
  175. package/dist/commands/tasks/tasks.js +445 -262
  176. package/dist/commands/workflow-cli.js +75 -228
  177. package/dist/core/action-contributors.js +1 -1
  178. package/dist/core/activation-policy.js +49 -0
  179. package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
  180. package/dist/core/adapter/adapters/akm-adapter.js +528 -0
  181. package/dist/core/adapter/adapters/akm-lint.js +392 -0
  182. package/dist/core/adapter/adapters/akm-metadata.js +387 -0
  183. package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
  184. package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
  185. package/dist/core/adapter/adapters/claude-adapter.js +61 -0
  186. package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
  187. package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
  188. package/dist/core/adapter/adapters/index.js +80 -0
  189. package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
  190. package/dist/core/adapter/adapters/okf-adapter.js +391 -0
  191. package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
  192. package/dist/core/adapter/adapters/shared.js +286 -0
  193. package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
  194. package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
  195. package/dist/core/adapter/bundle-adapter.js +4 -0
  196. package/dist/core/adapter/detect-adapter.js +17 -0
  197. package/dist/core/adapter/recognize-match.js +44 -0
  198. package/dist/core/adapter/registry.js +56 -0
  199. package/dist/core/adapter/types.js +4 -0
  200. package/dist/core/asset/akm-markdown.js +30 -0
  201. package/dist/core/asset/asset-placement.js +243 -0
  202. package/dist/core/asset/asset-ref.js +110 -79
  203. package/dist/core/asset/asset-serialize.js +20 -0
  204. package/dist/core/asset/frontmatter.js +28 -12
  205. package/dist/core/asset/markdown.js +40 -51
  206. package/dist/core/asset/resolve-ref.js +274 -0
  207. package/dist/core/asset/stash-meta.js +2 -2
  208. package/dist/core/bundle-id.js +51 -0
  209. package/dist/core/common.js +281 -86
  210. package/dist/core/config/config-io.js +42 -128
  211. package/dist/core/config/config-schema.js +233 -855
  212. package/dist/core/config/config-sources.js +162 -39
  213. package/dist/core/config/config-types.js +16 -11
  214. package/dist/core/config/config-version.js +29 -0
  215. package/dist/core/config/config-walker.js +126 -37
  216. package/dist/core/config/config.js +154 -331
  217. package/dist/core/config/deep-merge.js +41 -0
  218. package/dist/core/config/engine-semantics.js +28 -0
  219. package/dist/core/config/experimental.js +21 -0
  220. package/dist/core/config/schema/embedding.js +38 -0
  221. package/dist/core/config/schema/engines.js +116 -0
  222. package/dist/core/config/schema/experimental.js +47 -0
  223. package/dist/core/config/schema/feedback.js +31 -0
  224. package/dist/core/config/schema/improve-processes.js +389 -0
  225. package/dist/core/config/schema/improve.js +94 -0
  226. package/dist/core/config/schema/index-config.js +176 -0
  227. package/dist/core/config/schema/output.js +18 -0
  228. package/dist/core/config/schema/primitives.js +94 -0
  229. package/dist/core/config/schema/search.js +30 -0
  230. package/dist/core/config/schema/setup.js +18 -0
  231. package/dist/core/config/schema/sources-bundles.js +169 -0
  232. package/dist/core/config/schema/workflow.js +29 -0
  233. package/dist/core/env-secret-ref.js +155 -20
  234. package/dist/core/errors.js +17 -15
  235. package/dist/core/events-types.js +4 -0
  236. package/dist/core/events.js +46 -128
  237. package/dist/core/extra-params.js +62 -0
  238. package/dist/core/file-change.js +17 -0
  239. package/dist/core/file-lock.js +202 -57
  240. package/dist/core/fs-txn.js +392 -0
  241. package/dist/core/git-message.js +59 -0
  242. package/dist/core/improve-result.js +167 -0
  243. package/dist/core/lesson-lint.js +1 -17
  244. package/dist/core/logs-db.js +1 -1
  245. package/dist/core/maintenance-barrier.js +135 -0
  246. package/dist/core/migration-operation.js +44 -0
  247. package/dist/core/mutation-target.js +78 -0
  248. package/dist/core/paths.js +22 -25
  249. package/dist/core/platform.js +10 -0
  250. package/dist/core/recognition-util.js +128 -0
  251. package/dist/core/redaction.js +392 -0
  252. package/dist/core/standards/resolve-standards-context.js +36 -65
  253. package/dist/core/standards/resolve-stash-standards.js +2 -2
  254. package/dist/core/standards/resolve-type-conventions.js +5 -5
  255. package/dist/core/state/migrations.js +242 -11
  256. package/dist/core/state-db.js +98 -10
  257. package/dist/core/structured.js +1 -1
  258. package/dist/core/subprocess.js +303 -0
  259. package/dist/core/text-truncation.js +9 -5
  260. package/dist/core/time.js +20 -0
  261. package/dist/core/type-presentation.js +130 -0
  262. package/dist/core/warn.js +0 -3
  263. package/dist/core/write-source.js +834 -118
  264. package/dist/indexer/bundle-identity-guard.js +92 -0
  265. package/dist/indexer/db/graph-db.js +1 -25
  266. package/dist/indexer/db/llm-cache.js +1 -1
  267. package/dist/indexer/ensure-index.js +30 -9
  268. package/dist/indexer/graph/graph-boost.js +9 -30
  269. package/dist/indexer/graph/graph-extraction.js +41 -27
  270. package/dist/indexer/graph/graph-types.js +4 -0
  271. package/dist/indexer/index-writer-lock.js +93 -49
  272. package/dist/indexer/index-written-assets.js +100 -53
  273. package/dist/indexer/indexer.js +746 -329
  274. package/dist/indexer/init.js +18 -25
  275. package/dist/indexer/installations.js +142 -0
  276. package/dist/indexer/passes/dir-staleness.js +18 -10
  277. package/dist/indexer/passes/memory-inference.js +25 -15
  278. package/dist/indexer/passes/metadata.js +412 -243
  279. package/dist/indexer/scan/doc-to-entry.js +160 -0
  280. package/dist/indexer/scan/drain-dir.js +134 -0
  281. package/dist/indexer/search/db-search.js +292 -108
  282. package/dist/indexer/search/fts-query.js +64 -0
  283. package/dist/indexer/search/ranking-contributors.js +145 -25
  284. package/dist/indexer/search/ranking-types.js +4 -0
  285. package/dist/indexer/search/ranking.js +28 -71
  286. package/dist/indexer/search/search-attribution.js +67 -0
  287. package/dist/indexer/search/search-fields.js +18 -3
  288. package/dist/indexer/search/search-hit-enrichers.js +30 -40
  289. package/dist/indexer/search/search-source.js +157 -111
  290. package/dist/indexer/search/semantic-status.js +4 -1
  291. package/dist/indexer/usage/usage-events.js +10 -30
  292. package/dist/indexer/walk/file-context.js +3 -45
  293. package/dist/indexer/walk/matchers.js +42 -73
  294. package/dist/indexer/walk/path-resolver.js +11 -5
  295. package/dist/indexer/walk/walker.js +42 -14
  296. package/dist/integrations/agent/builder-shared.js +7 -0
  297. package/dist/integrations/agent/builders.js +5 -58
  298. package/dist/integrations/agent/config.js +3 -143
  299. package/dist/integrations/agent/detect.js +17 -2
  300. package/dist/integrations/agent/engine-resolution.js +231 -0
  301. package/dist/integrations/agent/index.js +1 -2
  302. package/dist/integrations/agent/model-aliases.js +8 -3
  303. package/dist/integrations/agent/profiles.js +6 -99
  304. package/dist/integrations/agent/prompts.js +46 -18
  305. package/dist/integrations/agent/runner-dispatch.js +78 -13
  306. package/dist/integrations/agent/runner.js +76 -208
  307. package/dist/integrations/agent/spawn.js +48 -279
  308. package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
  309. package/dist/integrations/harnesses/aider/index.js +2 -12
  310. package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
  311. package/dist/integrations/harnesses/amazonq/index.js +3 -17
  312. package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
  313. package/dist/integrations/harnesses/claude/config-import.js +1 -3
  314. package/dist/integrations/harnesses/claude/index.js +1 -14
  315. package/dist/integrations/harnesses/claude/session-log.js +27 -75
  316. package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
  317. package/dist/integrations/harnesses/codex/index.js +2 -13
  318. package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
  319. package/dist/integrations/harnesses/copilot/index.js +1 -13
  320. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
  321. package/dist/integrations/harnesses/gemini/index.js +1 -13
  322. package/dist/integrations/harnesses/ids.js +24 -0
  323. package/dist/integrations/harnesses/index.js +31 -33
  324. package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
  325. package/dist/integrations/harnesses/opencode/config-import.js +1 -3
  326. package/dist/integrations/harnesses/opencode/index.js +1 -18
  327. package/dist/integrations/harnesses/opencode/session-log.js +67 -125
  328. package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
  329. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
  330. package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
  331. package/dist/integrations/harnesses/openhands/index.js +2 -12
  332. package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
  333. package/dist/integrations/harnesses/pi/index.js +3 -16
  334. package/dist/integrations/harnesses/shared.js +17 -0
  335. package/dist/integrations/harnesses/types.js +38 -34
  336. package/dist/integrations/lockfile.js +211 -24
  337. package/dist/integrations/session-logs/index.js +24 -40
  338. package/dist/integrations/session-logs/provider-base.js +113 -0
  339. package/dist/llm/client.js +182 -110
  340. package/dist/llm/embedders/deterministic.js +2 -2
  341. package/dist/llm/embedders/remote.js +21 -9
  342. package/dist/llm/feature-gate.js +17 -57
  343. package/dist/llm/graph-extract.js +12 -13
  344. package/dist/llm/index-passes.js +8 -42
  345. package/dist/llm/memory-infer.js +144 -1
  346. package/dist/llm/metadata-enhance.js +45 -30
  347. package/dist/llm/structured-call.js +16 -8
  348. package/dist/llm/usage-persist.js +30 -5
  349. package/dist/llm/usage-telemetry.js +59 -6
  350. package/dist/output/cli-hints.js +1 -2
  351. package/dist/output/command-registry.js +27 -0
  352. package/dist/output/context.js +22 -7
  353. package/dist/output/format-exempt.js +80 -0
  354. package/dist/output/generic-render.js +251 -0
  355. package/dist/output/html-render.js +11 -16
  356. package/dist/output/render-registry.js +57 -0
  357. package/dist/output/renderers.js +15 -281
  358. package/dist/output/shapes/curate.js +10 -1
  359. package/dist/output/shapes/events.js +12 -7
  360. package/dist/output/shapes/helpers.js +58 -84
  361. package/dist/output/shapes/passthrough.js +8 -40
  362. package/dist/output/shapes/proposal/producer.js +15 -7
  363. package/dist/output/shapes/registry.js +12 -6
  364. package/dist/output/shapes.js +0 -9
  365. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  366. package/dist/output/text/bundle-show.js +7 -0
  367. package/dist/output/text/command-format.js +562 -0
  368. package/dist/output/text/env.js +1 -3
  369. package/dist/output/text/events.js +8 -7
  370. package/dist/output/text/helpers.js +15 -1375
  371. package/dist/output/text/proposal/producer.js +4 -2
  372. package/dist/output/text/proposal-format.js +202 -0
  373. package/dist/output/text/registry-commands.js +1 -2
  374. package/dist/output/text/registry.js +12 -6
  375. package/dist/output/text/show-directives.js +117 -0
  376. package/dist/output/text/show-format.js +103 -0
  377. package/dist/output/text/sync.js +5 -0
  378. package/dist/output/text/workflow-format.js +332 -0
  379. package/dist/output/text/workflow.js +1 -2
  380. package/dist/output/text.js +10 -19
  381. package/dist/registry/factory.js +4 -6
  382. package/dist/registry/origin-resolve.js +16 -27
  383. package/dist/registry/providers/skills-sh.js +3 -3
  384. package/dist/registry/providers/static-index.js +15 -25
  385. package/dist/registry/resolve.js +43 -94
  386. package/dist/registry/semver.js +43 -0
  387. package/dist/runtime.js +81 -12
  388. package/dist/scripts/akm-migrate.js +35529 -0
  389. package/dist/setup/detect.js +5 -7
  390. package/dist/setup/detected-engines.js +136 -0
  391. package/dist/setup/engine-config.js +100 -0
  392. package/dist/setup/registry-stash-loader.js +3 -3
  393. package/dist/setup/semantic-assets.js +12 -9
  394. package/dist/setup/setup.js +444 -208
  395. package/dist/setup/steps/connection-shared.js +120 -0
  396. package/dist/setup/steps/connection.js +108 -305
  397. package/dist/setup/steps/platforms.js +13 -12
  398. package/dist/setup/steps/semantic.js +15 -3
  399. package/dist/setup/steps/sources.js +21 -15
  400. package/dist/setup/steps/stashdir.js +6 -4
  401. package/dist/setup/steps/tasks.js +236 -119
  402. package/dist/setup/steps.js +3 -2
  403. package/dist/sources/freshness.js +39 -0
  404. package/dist/sources/provider-factory.js +11 -17
  405. package/dist/sources/providers/filesystem.js +2 -3
  406. package/dist/sources/providers/git-install.js +278 -34
  407. package/dist/sources/providers/git-provider.js +54 -56
  408. package/dist/sources/providers/git-stash.js +420 -91
  409. package/dist/sources/providers/git.js +2 -2
  410. package/dist/sources/providers/npm.js +16 -19
  411. package/dist/sources/providers/provider-utils.js +47 -22
  412. package/dist/sources/providers/sync-from-ref.js +3 -9
  413. package/dist/sources/providers/website.js +2 -2
  414. package/dist/sources/resolve.js +11 -10
  415. package/dist/sources/snapshot-fetchers/types.js +4 -0
  416. package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
  417. package/dist/storage/database.js +60 -4
  418. package/dist/storage/engines/sqlite-migrations.js +156 -5
  419. package/dist/storage/locations.js +1 -2
  420. package/dist/storage/repositories/canaries-repository.js +1 -1
  421. package/dist/storage/repositories/events-repository.js +51 -11
  422. package/dist/storage/repositories/improve-runs-repository.js +6 -32
  423. package/dist/storage/repositories/index-connection.js +79 -0
  424. package/dist/storage/repositories/index-db.js +4 -3
  425. package/dist/storage/repositories/index-entries-repository.js +863 -0
  426. package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
  427. package/dist/storage/repositories/index-entry-types.js +4 -0
  428. package/dist/storage/repositories/index-fts-repository.js +167 -0
  429. package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
  430. package/dist/storage/repositories/index-meta-repository.js +49 -0
  431. package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
  432. package/dist/storage/repositories/index-sql.js +12 -0
  433. package/dist/storage/repositories/index-utility-repository.js +356 -0
  434. package/dist/storage/repositories/index-vec-repository.js +250 -0
  435. package/dist/storage/repositories/outcome-repository.js +119 -0
  436. package/dist/storage/repositories/proposals-repository.js +317 -75
  437. package/dist/storage/repositories/registry-cache.js +1 -1
  438. package/dist/storage/repositories/salience-repository.js +172 -0
  439. package/dist/storage/repositories/task-history-repository.js +110 -3
  440. package/dist/storage/repositories/workflow-runs-repository.js +68 -35
  441. package/dist/tasks/backends/cron.js +169 -46
  442. package/dist/tasks/backends/exec-utils.js +76 -3
  443. package/dist/tasks/backends/index.js +6 -9
  444. package/dist/tasks/backends/launchd.js +292 -55
  445. package/dist/tasks/backends/schtasks.js +557 -70
  446. package/dist/tasks/backends/types.js +4 -0
  447. package/dist/tasks/command-executable.js +93 -0
  448. package/dist/tasks/embedded.js +56 -38
  449. package/dist/tasks/parser.js +156 -64
  450. package/dist/tasks/resolve-akm-bin.js +144 -51
  451. package/dist/tasks/runner.js +377 -209
  452. package/dist/tasks/schedule.js +108 -19
  453. package/dist/tasks/scheduler-invocation.js +296 -0
  454. package/dist/tasks/schema.js +1 -1
  455. package/dist/tasks/task-id.js +35 -0
  456. package/dist/tasks/validator.js +30 -16
  457. package/dist/workflows/authoring/authoring.js +96 -148
  458. package/dist/workflows/authoring/scope-key.js +1 -1
  459. package/dist/workflows/cli.js +0 -20
  460. package/dist/workflows/concurrency-policy.js +15 -0
  461. package/dist/workflows/exec/brief.js +25 -59
  462. package/dist/workflows/exec/frozen-judge.js +47 -0
  463. package/dist/workflows/exec/native-executor.js +157 -94
  464. package/dist/workflows/exec/report.js +365 -200
  465. package/dist/workflows/exec/run-workflow.js +46 -40
  466. package/dist/workflows/exec/scheduler.js +12 -41
  467. package/dist/workflows/exec/step-work.js +239 -205
  468. package/dist/workflows/exec/workflow-engine-gate.js +67 -0
  469. package/dist/workflows/ir/compile.js +141 -283
  470. package/dist/workflows/ir/freeze.js +233 -0
  471. package/dist/workflows/ir/plan-hash.js +40 -5
  472. package/dist/workflows/ir/schema.js +537 -1
  473. package/dist/workflows/parser.js +878 -306
  474. package/dist/workflows/program/expressions.js +20 -208
  475. package/dist/workflows/program/schema.js +7 -10
  476. package/dist/workflows/renderer.js +99 -121
  477. package/dist/workflows/resource-limits.js +22 -0
  478. package/dist/workflows/runtime/checkin.js +1 -1
  479. package/dist/workflows/runtime/plan-classifier.js +131 -0
  480. package/dist/workflows/runtime/runs.js +200 -113
  481. package/dist/workflows/runtime/unit-checkin.js +1 -1
  482. package/dist/workflows/runtime/unit-phases.js +20 -0
  483. package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
  484. package/dist/workflows/schema.js +1 -11
  485. package/dist/workflows/validate-summary.js +4 -26
  486. package/dist/workflows/validator.js +52 -30
  487. package/docs/README.md +42 -78
  488. package/docs/migration/README.md +8 -0
  489. package/docs/migration/release-notes/0.6.0.md +1 -1
  490. package/docs/migration/release-notes/0.7.0.md +9 -8
  491. package/docs/migration/release-notes/0.9.0.md +158 -14
  492. package/docs/migration/v0.7-to-v0.8.md +46 -47
  493. package/docs/migration/v0.8-to-v0.9.md +844 -0
  494. package/docs/reference/README.md +12 -0
  495. package/docs/reference/data-and-telemetry.md +333 -0
  496. package/package.json +21 -17
  497. package/schemas/akm-asset-envelope.json +93 -0
  498. package/schemas/akm-config.json +4636 -0
  499. package/schemas/akm-task.json +87 -0
  500. package/{dist/schemas → schemas}/akm-workflow.json +127 -82
  501. package/dist/akm-migrate-storage +0 -38
  502. package/dist/assets/help/help-accept.md +0 -12
  503. package/dist/assets/help/help-improve.md +0 -84
  504. package/dist/assets/help/help-proposals.md +0 -17
  505. package/dist/assets/help/help-propose.md +0 -17
  506. package/dist/assets/help/help-reject.md +0 -11
  507. package/dist/assets/profiles/frequent.json +0 -13
  508. package/dist/assets/profiles/recombine-only.json +0 -21
  509. package/dist/assets/profiles/reflect-distill.json +0 -30
  510. package/dist/assets/profiles/synthesize.json +0 -15
  511. package/dist/assets/prompts/procedural-system.md +0 -44
  512. package/dist/assets/prompts/recombine-system.md +0 -40
  513. package/dist/assets/prompts/staleness-detect-system.md +0 -6
  514. package/dist/assets/tasks/core/backup.yml +0 -4
  515. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  516. package/dist/assets/templates/html/default.html +0 -78
  517. package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
  518. package/dist/assets/wiki/index-template.md +0 -12
  519. package/dist/assets/wiki/ingest-workflow-template.md +0 -83
  520. package/dist/assets/wiki/log-template.md +0 -8
  521. package/dist/assets/wiki/schema-template.md +0 -61
  522. package/dist/cli/config-migrate.js +0 -150
  523. package/dist/cli/config-validate.js +0 -39
  524. package/dist/commands/graph/graph-cli.js +0 -124
  525. package/dist/commands/graph/graph.js +0 -487
  526. package/dist/commands/improve/calibration.js +0 -161
  527. package/dist/commands/improve/dedup.js +0 -482
  528. package/dist/commands/improve/extract-watch.js +0 -140
  529. package/dist/commands/improve/hot-probation.js +0 -45
  530. package/dist/commands/improve/improve-auto-accept.js +0 -276
  531. package/dist/commands/improve/improve-profiles.js +0 -168
  532. package/dist/commands/improve/procedural.js +0 -398
  533. package/dist/commands/improve/recombine.js +0 -818
  534. package/dist/commands/improve/schema-similarity-gate.js +0 -168
  535. package/dist/commands/lint/agent-linter.js +0 -44
  536. package/dist/commands/lint/command-linter.js +0 -44
  537. package/dist/commands/lint/default-linter.js +0 -16
  538. package/dist/commands/lint/fact-linter.js +0 -39
  539. package/dist/commands/lint/knowledge-linter.js +0 -16
  540. package/dist/commands/lint/memory-linter.js +0 -61
  541. package/dist/commands/lint/registry.js +0 -41
  542. package/dist/commands/lint/skill-linter.js +0 -45
  543. package/dist/commands/lint/task-linter.js +0 -50
  544. package/dist/commands/lint/workflow-linter.js +0 -81
  545. package/dist/commands/proposal/legacy-import.js +0 -115
  546. package/dist/commands/sources/history.js +0 -196
  547. package/dist/commands/tasks/default-tasks.js +0 -186
  548. package/dist/commands/wiki-cli.js +0 -292
  549. package/dist/core/asset/asset-registry.js +0 -76
  550. package/dist/core/asset/asset-spec.js +0 -316
  551. package/dist/core/config/config-migration.js +0 -602
  552. package/dist/core/deep-merge.js +0 -38
  553. package/dist/core/eval/rank-metrics.js +0 -113
  554. package/dist/core/ripgrep/install.js +0 -163
  555. package/dist/core/ripgrep/resolve.js +0 -81
  556. package/dist/indexer/db/db.js +0 -1414
  557. package/dist/indexer/manifest.js +0 -170
  558. package/dist/indexer/passes/metadata-contributors.js +0 -31
  559. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
  560. package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
  561. package/dist/llm/call-ai.js +0 -62
  562. package/dist/llm/memory-infer-impl.js +0 -138
  563. package/dist/output/shapes/distill.js +0 -14
  564. package/dist/output/shapes/history.js +0 -11
  565. package/dist/output/text/distill.js +0 -6
  566. package/dist/output/text/enable-disable.js +0 -8
  567. package/dist/output/text/history.js +0 -6
  568. package/dist/output/text/wiki.js +0 -16
  569. package/dist/registry/build-index.js +0 -386
  570. package/dist/schemas/akm-config.json +0 -14225
  571. package/dist/scripts/migrate-storage.js +0 -13169
  572. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
  573. package/dist/scripts/migrations/v16-to-v17.js +0 -141
  574. package/dist/setup/legacy-config.js +0 -106
  575. package/dist/storage/repositories/consolidation-repository.js +0 -38
  576. package/dist/storage/repositories/recombine-repository.js +0 -213
  577. package/dist/wiki/wiki-templates.js +0 -15
  578. package/dist/wiki/wiki.js +0 -1012
  579. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  580. package/dist/workflows/db.js +0 -350
  581. package/dist/workflows/exec/watch.js +0 -116
  582. package/dist/workflows/program/parser.js +0 -760
  583. package/dist/workflows/program/project.js +0 -105
  584. package/docs/data-and-telemetry.md +0 -227
  585. package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
  586. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
  587. /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
@@ -0,0 +1,67 @@
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
+ * The `akm workflow` engine gate (`experimental.workflowEngine`, Q-05).
6
+ *
7
+ * Mirrors the shape of `src/commands/improve/autonomy-gate.ts` (D8) for a
8
+ * different failure mode. `akm improve`'s gated lanes have a safe downgrade —
9
+ * skip the lane, keep the rest of the run going — but a workflow step either
10
+ * executes or it does not: there is no partial-execution fallback to degrade
11
+ * into. So this gate REFUSES outright rather than silently skipping: an
12
+ * ungated call throws a classified `ConfigError` naming the exact config key,
13
+ * which the CLI's JSON error envelope (`emitJsonError`, `src/cli/shared.ts`)
14
+ * always routes to stderr with a non-zero exit — in every `--format`, not
15
+ * just `json` — so the refusal is visible and never a silent no-op. (A
16
+ * second, plain-text `warn()` call alongside the throw was deliberately
17
+ * rejected: it would interleave non-JSON text with the JSON error envelope on
18
+ * the SAME stream, corrupting stderr for any `--json` caller — a real defect,
19
+ * not just a test inconvenience.)
20
+ *
21
+ * Gated surfaces:
22
+ * - `akm workflow run` — the native step-execution engine
23
+ * - `akm workflow brief` — the harness-neutral driver protocol (read half)
24
+ * - `akm workflow report` — the harness-neutral driver protocol (write half)
25
+ *
26
+ * Deliberately NOT gated: authoring/linting the unified markdown format and
27
+ * the manual workflow CLI contract (`start`, `next`, `complete`, `status`,
28
+ * `list`, `create`, `resume`, `abandon`) remain stable per STABILITY.md.
29
+ */
30
+ import { ConfigError } from "../../core/errors.js";
31
+ /**
32
+ * The config key an operator sets to enable the workflow engine.
33
+ *
34
+ * Named rather than inlined because it is user-facing text: it goes into the
35
+ * thrown error's message and `akm task doctor`, and those must name the same
36
+ * key as the schema.
37
+ */
38
+ export const WORKFLOW_ENGINE_CONFIG_KEY = "experimental.workflowEngine";
39
+ /**
40
+ * True only when the user has explicitly opted into the workflow engine.
41
+ * Absent, an absent `experimental` section, and an explicit `false` all read
42
+ * as off — the engine is never enabled by inference.
43
+ */
44
+ export function isWorkflowEngineEnabled(config) {
45
+ return config?.experimental?.workflowEngine === true;
46
+ }
47
+ /** The message shown to the user AND matched by tests naming the config key. */
48
+ export function workflowEngineGateMessage(surface) {
49
+ return (`\`akm workflow ${surface}\` is EXPERIMENTAL and refuses to run until ` +
50
+ `\`${WORKFLOW_ENGINE_CONFIG_KEY}\` is set. Run \`akm config set ${WORKFLOW_ENGINE_CONFIG_KEY} true\` to enable it.`);
51
+ }
52
+ /**
53
+ * Refuse a gated workflow-engine surface unless the opt-in is set.
54
+ *
55
+ * `surface` is the human name of the subcommand/action being refused (e.g.
56
+ * `"run"`, `"brief"`, `"create <name>.yaml"`) — it is folded into the thrown
57
+ * error's message so the refusal names both the surface and the exact config
58
+ * key that would enable it. The throw alone is the whole mechanism: every
59
+ * command defined with `defineJsonCommand` routes an uncaught throw through
60
+ * `runWithJsonErrors`/`emitJsonError`, which prints the error to stderr and
61
+ * exits non-zero regardless of `--format` — so this is never a silent no-op.
62
+ */
63
+ export function requireWorkflowEngineEnabled(config, surface) {
64
+ if (isWorkflowEngineEnabled(config))
65
+ return;
66
+ throw new ConfigError(workflowEngineGateMessage(surface), "WORKFLOW_ENGINE_NOT_ENABLED");
67
+ }
@@ -2,105 +2,79 @@
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  /**
5
- * Frontends → Workflow Plan Graph (IR v2) compilers.
5
+ * Frontend -> unresolved workflow plan compiler (workflow-format-unification).
6
6
  *
7
- * Two frontends, one IR (redesign addendum, R1):
7
+ * ONE frontend now: {@link compileWorkflowPlan} lowers a parsed unified
8
+ * `WorkflowDocument` (`../parser.ts`) into the same `WorkflowPlanDraft` shape
9
+ * IR v3 has always consumed — the pre-unification split between a linear
10
+ * markdown compiler and a YAML-program compiler is gone. This pass owns the
11
+ * semantic rules the parser deliberately does not check:
8
12
  *
9
- * - {@link compileWorkflowProgram} — YAML orchestration programs
10
- * (`program/parser.ts`). Pure and deterministic; performs FULL expression
11
- * validation (closed `${{ … }}` grammar, earlier-step references,
12
- * whole-value contexts, `item`/`item_index` scoping) and MERGES the
13
- * program's `defaults` block into every unit node so the frozen plan is
14
- * self-contained. Returns accumulated `WorkflowError`s rather than
15
- * throwing.
16
- * - {@link compileWorkflowPlan} — classic LINEAR markdown workflows
17
- * (`parser.ts`), the stable CLI contract: one `agent` node per step with
18
- * `runner: inherit` and the fail-fast default, exactly as today. The P1
19
- * markdown orchestration grammar is gone — this path is linear-only.
13
+ * - every reference string (`map.over` / `route.input` / `inputs[]`) parses
14
+ * against the CLOSED two-root grammar (`program/expressions.ts`);
15
+ * - `steps.<id>` references name an EARLIER step (a producer that has
16
+ * already run when the reference resolves);
17
+ * - `inputs:` entries must reference a STEP OUTPUT, never `params.*` — params
18
+ * are already attached to every unit unconditionally, so naming one as a
19
+ * declared input would be redundant.
20
20
  *
21
21
  * Node-id convention (stable, unique within a plan):
22
- * step root → `<stepId>` (agent) or `<stepId>.map` (map)
22
+ * step root → `<stepId>` (unit) or `<stepId>.map` (map)
23
23
  * map unit → `<stepId>.unit` (template instantiated per item)
24
24
  * gate → `<stepId>.gate`
25
+ *
26
+ * Returns accumulated `WorkflowError`s rather than throwing. Pure and
27
+ * deterministic: the same document always compiles to the same plan.
25
28
  */
26
- import { formatReference, listReferences, parseTemplate } from "../program/expressions.js";
27
- import { WORKFLOW_IR_VERSION, } from "./schema.js";
29
+ import { formatReference, parseReference } from "../program/expressions.js";
28
30
  /**
29
- * Compile a parsed YAML program into a frozen-plan-ready graph. Assumes the
30
- * program came out of `parseWorkflowProgram` ok (structure already valid);
31
- * this pass owns the expression-language rules the parser deliberately does
32
- * not check:
33
- *
34
- * - every `${{ … }}` in instructions / `map.over` / `route.input` parses
35
- * against the CLOSED grammar;
36
- * - `steps.<id>` references name an EARLIER step (a producer that has
37
- * already run when the reference resolves);
38
- * - `map.over` and `route.input` are single whole-value references — a bare
39
- * `${{ … }}` with no surrounding text;
40
- * - `item` / `item_index` appear only inside a map unit's instructions.
31
+ * Compile a parsed unified workflow document into a frozen-plan-ready graph.
32
+ * `title` is the run-level display title (the asset's canonical name — the
33
+ * format carries no authored title). Assumes the document came out of
34
+ * `parseWorkflow` ok (structure already valid).
41
35
  */
42
- export function compileWorkflowProgram(program) {
36
+ export function compileWorkflowPlan(document, title) {
43
37
  const errors = [];
44
- const allStepIds = new Set(program.steps.map((s) => s.id));
38
+ const allStepIds = new Set(document.steps.map((s) => s.id));
45
39
  const earlierStepIds = new Set();
46
40
  const steps = [];
47
- program.steps.forEach((step, index) => {
41
+ document.steps.forEach((step) => {
48
42
  const check = { allStepIds, earlierStepIds, errors };
49
- if (step.unit) {
50
- checkTemplateExpressions(step.unit.instructions, {
51
- ...check,
52
- line: step.unit.source.start,
53
- label: `Step "${step.id}" instructions`,
54
- inMapUnit: false,
55
- });
56
- }
57
43
  if (step.map) {
58
- checkWholeValueExpression(step.map.over, {
44
+ checkReferenceField(step.map.over, { ...check, line: step.source.start, label: `Step "${step.id}" map.over` });
45
+ }
46
+ if (step.route) {
47
+ checkReferenceField(step.route.input, {
59
48
  ...check,
60
49
  line: step.source.start,
61
- label: `Step "${step.id}" map.over`,
62
- });
63
- checkTemplateExpressions(step.map.unit.instructions, {
64
- ...check,
65
- line: step.map.unit.source.start,
66
- label: `Step "${step.id}" instructions`,
67
- inMapUnit: true,
50
+ label: `Step "${step.id}" route.input`,
68
51
  });
69
52
  }
70
- if (step.route) {
71
- checkWholeValueExpression(step.route.input, {
53
+ for (const [index, reference] of (step.inputs ?? []).entries()) {
54
+ checkInputReference(reference, index, {
72
55
  ...check,
73
56
  line: step.source.start,
74
- label: `Step "${step.id}" route.input`,
57
+ label: `Step "${step.id}" inputs`,
75
58
  });
76
59
  }
77
- steps.push(compileProgramStep(step, index, program.defaults));
60
+ steps.push(compileStep(step, defaultsOf(document)));
78
61
  earlierStepIds.add(step.id);
79
62
  });
80
63
  if (errors.length > 0)
81
64
  return { ok: false, errors };
82
- const paramNames = program.params ? Object.keys(program.params) : [];
65
+ const paramNames = document.params ? Object.keys(document.params) : [];
83
66
  return {
84
67
  ok: true,
85
- // Non-fatal advisories (redesign addendum). Warnings NEVER change the plan
86
- // or its hash — they are computed alongside the frozen plan and surfaced by
87
- // `workflow validate` / `workflow start`, never persisted onto the run row.
88
- warnings: collectProgramWarnings(program),
68
+ warnings: collectWorkflowWarnings(document),
89
69
  plan: {
90
- irVersion: WORKFLOW_IR_VERSION,
91
- title: program.name,
70
+ title,
92
71
  ...(paramNames.length > 0 ? { params: paramNames } : {}),
93
- // Reviewer #12: freeze the per-param schemas into the plan so `--params`
94
- // can be validated at start and re-asserted at brief/report against the
95
- // exact schemas the run was created with (the plan hash covers them).
96
- ...(program.params && paramNames.length > 0 ? { paramSchemas: program.params } : {}),
97
- // Budget ceilings (addendum R2): frozen onto the plan so enforcement is
98
- // a pure function of (frozen plan, journal) — never the live asset.
99
- ...(program.budget
72
+ ...(document.params && paramNames.length > 0 ? { paramSchemas: document.params } : {}),
73
+ ...(document.budget
100
74
  ? {
101
75
  budget: {
102
- ...(program.budget.maxTokens !== undefined ? { maxTokens: program.budget.maxTokens } : {}),
103
- ...(program.budget.maxUnits !== undefined ? { maxUnits: program.budget.maxUnits } : {}),
76
+ ...(document.budget.maxTokens !== undefined ? { maxTokens: document.budget.maxTokens } : {}),
77
+ ...(document.budget.maxUnits !== undefined ? { maxUnits: document.budget.maxUnits } : {}),
104
78
  },
105
79
  }
106
80
  : {}),
@@ -108,38 +82,42 @@ export function compileWorkflowProgram(program) {
108
82
  },
109
83
  };
110
84
  }
111
- function compileProgramStep(step, index, defaults) {
85
+ function defaultsOf(document) {
86
+ return document.defaults;
87
+ }
88
+ function compileStep(step, defaults) {
112
89
  const gate = {
113
90
  kind: "gate",
114
91
  id: `${step.id}.gate`,
115
92
  stepId: step.id,
116
- criteria: step.gate?.criteria ?? [],
117
- // TODO(R2): maxLoops execution (bounded evaluator-optimizer) is engine
118
- // rework scope; carried through the frozen plan now.
93
+ // The body `### gate` rubric is carried through as the ONE criterion string
94
+ // — the judge receives the whole section byte-exact (spec §2.4). A step
95
+ // with no rubric has no gate at all (fail-open, criteria: []).
96
+ criteria: step.gateRubric?.text.trim() ? [step.gateRubric.text] : [],
119
97
  ...(step.gate?.maxLoops !== undefined ? { maxLoops: step.gate.maxLoops } : {}),
120
- // Reviewer #18: a required gate rides the frozen plan so BOTH surfaces
121
- // (engine + report) enforce it identically.
122
- ...(step.gate?.required !== undefined ? { required: step.gate.required } : {}),
123
98
  };
124
99
  let root;
125
- if (step.unit) {
126
- root = compileProgramUnit(step.unit, step.id, defaults);
127
- }
128
- else if (step.map) {
129
- root = {
130
- kind: "map",
131
- id: `${step.id}.map`,
132
- over: step.map.over,
133
- template: compileProgramUnit(step.map.unit, `${step.id}.unit`, defaults),
134
- ...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
135
- reducer: step.map.reducer ?? "collect",
136
- source: step.source,
137
- };
100
+ if (step.route === undefined) {
101
+ const instructionsText = step.instructions?.text ?? "";
102
+ if (step.map) {
103
+ root = {
104
+ kind: "map",
105
+ id: `${step.id}.map`,
106
+ over: step.map.over,
107
+ template: compileUnit(step.map.unit, `${step.id}.unit`, instructionsText, defaults, step.inputs, step.source),
108
+ ...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
109
+ reducer: step.map.reducer ?? "collect",
110
+ source: step.source,
111
+ };
112
+ }
113
+ else {
114
+ root = compileUnit(step.unit, step.id, instructionsText, defaults, step.inputs, step.instructions?.source);
115
+ }
138
116
  }
139
117
  return {
140
118
  stepId: step.id,
141
- title: step.title ?? step.id,
142
- sequenceIndex: index,
119
+ title: step.id,
120
+ sequenceIndex: step.sequenceIndex,
143
121
  ...(root ? { root } : {}),
144
122
  ...(step.route
145
123
  ? {
@@ -150,239 +128,119 @@ function compileProgramStep(step, index, defaults) {
150
128
  },
151
129
  }
152
130
  : {}),
153
- // TODO(R2): validating the reducer result against this schema (typed step
154
- // artifacts) is engine-rework scope; the frozen plan carries it now.
155
131
  ...(step.output !== undefined ? { outputSchema: step.output } : {}),
156
132
  gate,
157
133
  };
158
134
  }
159
135
  /**
160
- * Lower one program unit into an agent node, merging the run-level `defaults`
161
- * block (frozen resolution — addendum: "the plan is self-contained"). Per-unit
162
- * declarations always win; the fail-fast `on_error` default applies last.
136
+ * Lower one source unit into the unresolved structural plan. Instructions are
137
+ * ALWAYS the step's body prose, byte-exact — never templated, never scanned
138
+ * for reference syntax. Engine/model/timeout settings remain on the parsed
139
+ * override bag until the single freeze boundary.
163
140
  */
164
- function compileProgramUnit(unit, id, defaults) {
165
- const model = unit.model ?? defaults?.model;
166
- const timeoutMs = unit.timeoutMs !== undefined ? unit.timeoutMs : defaults?.timeoutMs;
141
+ function compileUnit(unit, id, instructions, defaults, inputs, source) {
167
142
  return {
168
- kind: "agent",
143
+ kind: "unit",
169
144
  id,
170
- instructions: unit.instructions,
171
- // YAML program instructions are `${{ … }}` templates (validated above);
172
- // the executor resolves them per unit.
173
- templating: "expressions",
174
- runner: unit.runner ?? defaults?.runner ?? "inherit",
175
- ...(unit.profile !== undefined ? { profile: unit.profile } : {}),
176
- ...(model !== undefined ? { model } : {}),
177
- ...(unit.output !== undefined ? { schema: unit.output } : {}),
178
- ...(timeoutMs !== undefined ? { timeoutMs } : {}),
179
- // TODO(R2): retry dispatch is engine-rework scope; carried through now.
180
- ...(unit.retry ? { retry: { max: unit.retry.max, on: [...unit.retry.on] } } : {}),
181
- onError: unit.onError ?? defaults?.onError ?? "fail",
182
- ...(unit.env ? { env: [...unit.env] } : {}),
183
- ...(unit.isolation !== undefined ? { isolation: unit.isolation } : {}),
184
- source: unit.source,
145
+ instructions,
146
+ templating: "verbatim",
147
+ ...(inputs && inputs.length > 0 ? { inputs: [...inputs] } : {}),
148
+ ...(unit?.output !== undefined ? { schema: unit.output } : {}),
149
+ ...(unit?.retry ? { retry: { max: unit.retry.max, on: [...unit.retry.on] } } : {}),
150
+ onError: unit?.onError ?? defaults?.onError ?? "fail",
151
+ ...(unit?.env ? { env: [...unit.env] } : {}),
152
+ ...(unit?.isolation !== undefined ? { isolation: unit.isolation } : {}),
153
+ ...(source ? { source } : {}),
185
154
  };
186
155
  }
187
- /** Validate every `${{ … }}` in a free-text template (instructions). */
188
- function checkTemplateExpressions(text, check) {
189
- const parsed = parseTemplate(text);
156
+ /** Validate a whole-value reference field (`map.over`, `route.input`). */
157
+ function checkReferenceField(text, check) {
158
+ const parsed = parseReference(text);
190
159
  if (!parsed.ok) {
191
- for (const err of parsed.errors) {
192
- check.errors.push({ line: check.line, message: `${check.label}: ${err.message}` });
193
- }
160
+ check.errors.push({ line: check.line, message: `${check.label}: ${parsed.message}` });
194
161
  return;
195
162
  }
196
- for (const ref of listReferences(parsed.segments)) {
197
- checkReference(ref, check, check.inMapUnit);
163
+ if (parsed.expr.kind === "stepOutput" && !check.earlierStepIds.has(parsed.expr.stepId)) {
164
+ const why = check.allStepIds.has(parsed.expr.stepId)
165
+ ? `step "${parsed.expr.stepId}" does not come before this step — references must name an earlier step (a producer that has already run)`
166
+ : `"${parsed.expr.stepId}" is not a step in this workflow`;
167
+ check.errors.push({
168
+ line: check.line,
169
+ message: `${check.label}: "${formatReference(parsed.expr)}" cannot be resolved — ${why}.`,
170
+ });
198
171
  }
199
172
  }
200
- /**
201
- * Validate a whole-value field (`map.over`, `route.input`): the text must be
202
- * exactly one `${{ … }}` reference with no surrounding literal text, so the
203
- * engine can resolve it to a RAW value (array/object), never a string splice.
204
- */
205
- function checkWholeValueExpression(text, check) {
206
- const parsed = parseTemplate(text);
173
+ /** Validate one `inputs[]` entry: must be a step-output reference to an earlier step. */
174
+ function checkInputReference(text, index, check) {
175
+ const parsed = parseReference(text);
207
176
  if (!parsed.ok) {
208
- for (const err of parsed.errors) {
209
- check.errors.push({ line: check.line, message: `${check.label}: ${err.message}` });
210
- }
177
+ check.errors.push({ line: check.line, message: `${check.label}[${index}]: ${parsed.message}` });
211
178
  return;
212
179
  }
213
- const [first] = parsed.segments;
214
- if (parsed.segments.length !== 1 || first?.kind !== "reference") {
180
+ if (parsed.expr.kind === "param") {
215
181
  check.errors.push({
216
182
  line: check.line,
217
- message: `${check.label} must be a single whole-value \${{ … }} reference with no surrounding text ` +
218
- `(e.g. "\${{ steps.discover.output.files }}"), got ${JSON.stringify(text)}.`,
183
+ message: `${check.label}[${index}]: "${formatReference(parsed.expr)}" names a param, not a step output — ` +
184
+ `params are already attached to every unit, so declaring one as an input is redundant. "inputs:" only ` +
185
+ `names step outputs (steps.<id>.output...).`,
219
186
  });
220
187
  return;
221
188
  }
222
- // `item`/`item_index` never exist where a whole-value field resolves (the
223
- // item list itself, or a spine route input), so inMapUnit is always false.
224
- checkReference(first.expr, check, false);
225
- }
226
- function checkReference(ref, check, inMapUnit) {
227
- switch (ref.kind) {
228
- case "item":
229
- case "itemIndex": {
230
- if (!inMapUnit) {
231
- check.errors.push({
232
- line: check.line,
233
- message: `${check.label}: "\${{ ${formatReference(ref)} }}" is only valid inside a map unit's instructions.`,
234
- });
235
- }
236
- return;
237
- }
238
- case "stepOutput": {
239
- if (!check.earlierStepIds.has(ref.stepId)) {
240
- const why = check.allStepIds.has(ref.stepId)
241
- ? `step "${ref.stepId}" does not come before this step — references must name an earlier step (a producer that has already run)`
242
- : `"${ref.stepId}" is not a step in this workflow`;
243
- check.errors.push({
244
- line: check.line,
245
- message: `${check.label}: "\${{ ${formatReference(ref)} }}" cannot be resolved — ${why}.`,
246
- });
247
- }
248
- return;
249
- }
250
- case "param": {
251
- // Param presence is a RUN-SCOPE concern, never a compile-time one. A
252
- // declared `params:` block is NOT a closed set of legal references: the
253
- // runtime resolves any param SUPPLIED at start (`resolveReference`), and
254
- // `validateWorkflowParams` documents that undeclared params are permitted
255
- // — so `${{ params.mode }}` with `mode` passed via `--params` runs fine
256
- // even when only `files` is declared. At compile time an undeclared
257
- // reference is indistinguishable from that legitimate start-supplied
258
- // extra, so treating the block as closed would reject a runtime-supported
259
- // authoring pattern and put the two layers in disagreement. A genuine typo
260
- // (`params.changed_file` for `changed_files`) surfaces at run time with a
261
- // precise "is not defined in the run's params" error instead. As a lint-time
262
- // heads-up short of rejection, `collectProgramWarnings` (below) emits a
263
- // non-fatal WARNING for an undeclared reference when a `params:` block is
264
- // declared — never an error, so the runtime-supported pattern still compiles.
265
- return;
266
- }
189
+ if (!check.earlierStepIds.has(parsed.expr.stepId)) {
190
+ const why = check.allStepIds.has(parsed.expr.stepId)
191
+ ? `step "${parsed.expr.stepId}" does not come before this step — references must name an earlier step (a producer that has already run)`
192
+ : `"${parsed.expr.stepId}" is not a step in this workflow`;
193
+ check.errors.push({
194
+ line: check.line,
195
+ message: `${check.label}[${index}]: "${formatReference(parsed.expr)}" cannot be resolved — ${why}.`,
196
+ });
267
197
  }
268
198
  }
269
199
  // ── Non-fatal warnings ───────────────────────────────────────────────────────
270
200
  /**
271
- * Collect the program's non-fatal WARNINGS — advisories that never fail
201
+ * Collect the document's non-fatal WARNINGS — advisories that never fail
272
202
  * compilation, never change the frozen plan or its hash, and are surfaced by
273
203
  * `workflow validate` (human + JSON) and as `warn()` lines at `workflow start`.
274
204
  *
275
- * Two promised-but-previously-missing warnings (redesign addendum):
276
- *
277
205
  * A. A unit/map step with NO step-level `output:` schema carries its units'
278
- * raw results as an untyped artifact — permitted, but the addendum says
279
- * "the validator warns". Anchored on the STEP's `output` (the reducer /
280
- * step-artifact schema); a per-unit `output:` types the unit result but
281
- * leaves the step artifact untyped.
282
- * B. A `${{ params.<name> }}` reference to an UNDECLARED param, but ONLY when
283
- * the program declares a `params:` block. Compile-time REJECTION was tried
284
- * and reverted (see the `case "param"` note above): the runtime legitimately
285
- * resolves any param supplied at start, declared or not. The agreed middle
286
- * ground is a warning — a likely typo (`changed_file` for `changed_files`)
287
- * surfaces at lint time, while a genuinely start-supplied extra still runs.
288
- * With no `params:` block there is nothing to compare against, so B is silent.
289
- *
290
- * Pure and deterministic; the returned order is document order per step
291
- * (warning A, then each undeclared-param reference in field/document order).
292
- * Only called on an OK compile, so every template here already parsed cleanly.
206
+ * raw results as an untyped artifact — permitted, but worth flagging.
207
+ * B. A `params.<name>` reference (in `map.over`/`route.input`) to an
208
+ * UNDECLARED param, but ONLY when the document declares a `params:`
209
+ * block — a likely typo. Prose can no longer carry param references at
210
+ * all (it is never scanned), so this warning's surface shrinks to the
211
+ * two whole-value fields that can legally contain one.
293
212
  */
294
- export function collectProgramWarnings(program) {
213
+ export function collectWorkflowWarnings(document) {
295
214
  const warnings = [];
296
- const declaredParams = program.params ? new Set(Object.keys(program.params)) : undefined;
297
- for (const step of program.steps) {
298
- // Warning A — a unit/map step with no step-level output schema.
299
- if ((step.unit || step.map) && step.output === undefined) {
215
+ const declaredParams = document.params ? new Set(Object.keys(document.params)) : undefined;
216
+ for (const step of document.steps) {
217
+ if ((step.map || step.route === undefined) && step.output === undefined) {
300
218
  warnings.push({
301
219
  line: step.source.start,
302
220
  message: `Step "${step.id}" declares no \`output:\` schema — its unit results are carried as an untyped ` +
303
221
  `artifact (permitted). Add an \`output:\` JSON Schema to type and validate the step artifact.`,
304
222
  });
305
223
  }
306
- // Warning B — references to a param the declared `params:` block omits.
307
- if (declaredParams)
308
- collectUndeclaredParamWarnings(step, declaredParams, warnings);
309
- }
310
- return warnings;
311
- }
312
- /**
313
- * Push a warning for every `${{ params.<name> }}` reference in `step` whose
314
- * name is not in the declared param set. Walks the same template-bearing
315
- * fields the compiler validates (unit / map.over + map unit / route.input) so
316
- * the step + field context in the message matches the error labels.
317
- */
318
- function collectUndeclaredParamWarnings(step, declared, warnings) {
319
- const declaredList = [...declared].join(", ");
320
- const scan = (text, line, label) => {
321
- const parsed = parseTemplate(text);
322
- if (!parsed.ok)
323
- return; // OK compile guarantees this parses; defensive only.
324
- for (const ref of listReferences(parsed.segments)) {
325
- if (ref.kind !== "param" || declared.has(ref.name))
326
- continue;
327
- warnings.push({
328
- line,
329
- message: `${label}: "\${{ ${formatReference(ref)} }}" references a param not declared in \`params:\` ` +
330
- `(declared: ${declaredList || "none"}) — likely a typo. An undeclared param supplied at start still ` +
331
- `resolves at run time.`,
332
- });
224
+ if (declaredParams) {
225
+ const declaredList = [...declaredParams].join(", ");
226
+ const scan = (text, label) => {
227
+ if (!text)
228
+ return;
229
+ const parsed = parseReference(text);
230
+ if (!parsed.ok || parsed.expr.kind !== "param" || declaredParams.has(parsed.expr.name))
231
+ return;
232
+ warnings.push({
233
+ line: step.source.start,
234
+ message: `${label}: "${formatReference(parsed.expr)}" references a param not declared in \`params:\` ` +
235
+ `(declared: ${declaredList || "none"}) — likely a typo. An undeclared param supplied at start still ` +
236
+ `resolves at run time.`,
237
+ });
238
+ };
239
+ if (step.map)
240
+ scan(step.map.over, `Step "${step.id}" map.over`);
241
+ if (step.route)
242
+ scan(step.route.input, `Step "${step.id}" route.input`);
333
243
  }
334
- };
335
- if (step.unit)
336
- scan(step.unit.instructions, step.unit.source.start, `Step "${step.id}" instructions`);
337
- if (step.map) {
338
- scan(step.map.over, step.source.start, `Step "${step.id}" map.over`);
339
- scan(step.map.unit.instructions, step.map.unit.source.start, `Step "${step.id}" instructions`);
340
244
  }
341
- if (step.route)
342
- scan(step.route.input, step.source.start, `Step "${step.id}" route.input`);
343
- }
344
- // ─────────────────────────────────────────────────────────────────────────────
345
- // Frontend B — classic markdown workflow
346
- // ─────────────────────────────────────────────────────────────────────────────
347
- /**
348
- * Compile a markdown `WorkflowDocument` to IR v2. Pure and deterministic: the
349
- * same document always compiles to the same plan. Linear workflows — the
350
- * stable contract — produce one `agent` node per step (`runner: inherit`,
351
- * fail-fast) guarded by its gate, identical behavior to today's step loop.
352
- */
353
- export function compileWorkflowPlan(document) {
354
- const params = document.parameters?.map((p) => p.name);
355
- return {
356
- irVersion: WORKFLOW_IR_VERSION,
357
- title: document.title,
358
- ...(params && params.length > 0 ? { params } : {}),
359
- steps: document.steps.map(compileMarkdownStep),
360
- };
361
- }
362
- function compileMarkdownStep(step) {
363
- const gate = {
364
- kind: "gate",
365
- id: `${step.id}.gate`,
366
- stepId: step.id,
367
- criteria: step.completionCriteria?.map((c) => c.text) ?? [],
368
- };
369
- return {
370
- stepId: step.id,
371
- title: step.title,
372
- sequenceIndex: step.sequenceIndex,
373
- root: {
374
- kind: "agent",
375
- id: step.id,
376
- instructions: step.instructions.text,
377
- // Stable contract: markdown instructions are opaque data, passed to the
378
- // agent byte-exact. A literal `${{ … }}` (GitHub Actions syntax, docs of
379
- // the YAML format) is content here, never expression grammar.
380
- templating: "verbatim",
381
- runner: "inherit",
382
- // Markdown has no failure-policy surface; the fail-fast default applies.
383
- onError: "fail",
384
- source: step.instructions.source,
385
- },
386
- gate,
387
- };
245
+ return warnings;
388
246
  }