akm-cli 0.9.0-rc.9 → 0.9.0

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 (450) hide show
  1. package/CHANGELOG.md +1063 -44
  2. package/README.md +51 -25
  3. package/SECURITY.md +14 -1
  4. package/STABILITY.md +497 -0
  5. package/dist/akm +148 -35
  6. package/dist/{akm-migrate-storage → akm-migrate} +6 -9
  7. package/dist/assets/hints/cli-hints-full.md +223 -95
  8. package/dist/assets/hints/cli-hints-short.md +85 -22
  9. package/dist/assets/improve-strategies/default.json +1 -1
  10. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  11. package/dist/assets/prompts/memory-infer-user.md +2 -3
  12. package/dist/assets/stash-skeleton/README.md +6 -5
  13. package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
  14. package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
  15. package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
  16. package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
  17. package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
  18. package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
  19. package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
  20. package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
  21. package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
  22. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
  23. package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
  24. package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
  25. package/dist/assets/tasks/core/extract.yml +1 -1
  26. package/dist/assets/tasks/core/version-check.yml +1 -1
  27. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
  28. package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
  29. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
  30. package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
  31. package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
  32. package/dist/assets/templates/html/health.html +1 -3
  33. package/dist/assets/workflows/workflow-template.md +32 -15
  34. package/dist/cli/invocation.js +40 -15
  35. package/dist/cli/parse-args.js +0 -22
  36. package/dist/cli/retired-commands.js +121 -0
  37. package/dist/cli/shared.js +154 -22
  38. package/dist/cli/unknown-flags.js +236 -0
  39. package/dist/cli-node.mjs +2 -1
  40. package/dist/cli.js +696 -258
  41. package/dist/commands/agent/agent-dispatch.js +14 -3
  42. package/dist/commands/agent/contribute-cli.js +73 -88
  43. package/dist/commands/completions.js +79 -22
  44. package/dist/commands/config-cli.js +17 -150
  45. package/dist/commands/env/env-cli.js +59 -143
  46. package/dist/commands/env/env.js +12 -163
  47. package/dist/commands/env/marker-path.js +6 -0
  48. package/dist/commands/env/secret-cli.js +36 -66
  49. package/dist/commands/env/secret.js +24 -57
  50. package/dist/commands/feedback-cli.js +141 -87
  51. package/dist/commands/health/accept-rate.js +58 -0
  52. package/dist/commands/health/advisories.js +3 -4
  53. package/dist/commands/health/checks.js +85 -23
  54. package/dist/commands/health/html-report.js +7 -10
  55. package/dist/commands/health/improve-metrics.js +25 -83
  56. package/dist/commands/health/md-report.js +5 -9
  57. package/dist/commands/health/metrics.js +62 -20
  58. package/dist/commands/health/renderers.js +47 -0
  59. package/dist/commands/health/report-view-model.js +4 -5
  60. package/dist/commands/health/stash-exposure.js +1 -1
  61. package/dist/commands/health/surfaces.js +3 -48
  62. package/dist/commands/health/task-runs.js +3 -67
  63. package/dist/commands/health/types-improve.js +7 -0
  64. package/dist/commands/health.js +99 -28
  65. package/dist/commands/improve/anti-collapse.js +2 -2
  66. package/dist/commands/improve/autonomy-gate.js +68 -0
  67. package/dist/commands/improve/collapse-detector.js +41 -40
  68. package/dist/commands/improve/consolidate/eligibility.js +1 -23
  69. package/dist/commands/improve/consolidate/merge.js +4 -0
  70. package/dist/commands/improve/consolidate.js +140 -1000
  71. package/dist/commands/improve/distill/promote-memory.js +12 -12
  72. package/dist/commands/improve/distill/quality-gate.js +6 -6
  73. package/dist/commands/improve/distill.js +58 -69
  74. package/dist/commands/improve/eligibility.js +95 -55
  75. package/dist/commands/improve/extract-cli.js +14 -133
  76. package/dist/commands/improve/improve-cli.js +98 -114
  77. package/dist/commands/improve/improve-result-file.js +1 -28
  78. package/dist/commands/improve/improve-strategies.js +8 -5
  79. package/dist/commands/improve/improve.js +128 -91
  80. package/dist/commands/improve/loop-stages.js +182 -20
  81. package/dist/commands/improve/memory/derived-ref.js +45 -43
  82. package/dist/commands/improve/memory/memory-belief.js +1 -1
  83. package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
  84. package/dist/commands/improve/memory/memory-improve.js +6 -5
  85. package/dist/commands/improve/outcome-loop.js +22 -65
  86. package/dist/commands/improve/preparation.js +114 -123
  87. package/dist/commands/improve/proactive-maintenance.js +2 -5
  88. package/dist/commands/improve/reflect.js +56 -160
  89. package/dist/commands/improve/salience.js +11 -122
  90. package/dist/commands/improve/source-identity.js +10 -38
  91. package/dist/commands/lint/base-linter.js +20 -124
  92. package/dist/commands/lint/env-key-rules.js +31 -47
  93. package/dist/commands/lint/index.js +249 -43
  94. package/dist/commands/{events.js → log.js} +33 -38
  95. package/dist/commands/migrate-cli.js +92 -12
  96. package/dist/commands/migration-tool.js +46 -0
  97. package/dist/commands/observability-cli.js +70 -209
  98. package/dist/commands/proposal/drain.js +101 -29
  99. package/dist/commands/proposal/proposal-cli.js +76 -48
  100. package/dist/commands/proposal/proposal.js +54 -18
  101. package/dist/commands/proposal/propose-cli.js +88 -0
  102. package/dist/commands/proposal/propose.js +23 -15
  103. package/dist/commands/proposal/repository.js +701 -278
  104. package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
  105. package/dist/commands/proposal/validators/proposal-validators.js +55 -7
  106. package/dist/commands/proposal/validators/proposals.js +4 -7
  107. package/dist/commands/read/curate.js +34 -53
  108. package/dist/commands/read/knowledge.js +150 -95
  109. package/dist/commands/read/registry-search.js +2 -2
  110. package/dist/commands/read/remember-cli.js +42 -15
  111. package/dist/commands/read/search-cli.js +180 -78
  112. package/dist/commands/read/search.js +58 -43
  113. package/dist/commands/read/show.js +197 -141
  114. package/dist/commands/registry-cli.js +12 -51
  115. package/dist/commands/remember.js +14 -57
  116. package/dist/commands/sources/add-cli.js +100 -31
  117. package/dist/commands/sources/bundle-cli.js +166 -0
  118. package/dist/commands/sources/bundle-config-ops.js +7 -2
  119. package/dist/commands/sources/info.js +18 -5
  120. package/dist/commands/sources/init.js +12 -12
  121. package/dist/commands/sources/installed-stashes.js +382 -98
  122. package/dist/commands/sources/schema-repair.js +3 -2
  123. package/dist/commands/sources/self-update.js +131 -38
  124. package/dist/commands/sources/source-add.js +72 -17
  125. package/dist/commands/sources/source-clone.js +129 -45
  126. package/dist/commands/sources/source-manage.js +43 -23
  127. package/dist/commands/sources/sources-cli.js +57 -208
  128. package/dist/commands/sources/stash-cli.js +46 -53
  129. package/dist/commands/tasks/tasks-cli.js +91 -97
  130. package/dist/commands/tasks/tasks.js +276 -421
  131. package/dist/commands/workflow-cli.js +175 -450
  132. package/dist/core/adapter/adapters/akm-adapter.js +47 -28
  133. package/dist/core/adapter/adapters/akm-lint.js +42 -27
  134. package/dist/core/adapter/adapters/akm-metadata.js +15 -44
  135. package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
  136. package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
  137. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
  138. package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
  139. package/dist/core/adapter/adapters/index.js +6 -6
  140. package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
  141. package/dist/core/adapter/adapters/okf-adapter.js +187 -19
  142. package/dist/core/adapter/adapters/shared.js +3 -19
  143. package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
  144. package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
  145. package/dist/core/adapter/detect-adapter.js +17 -0
  146. package/dist/core/adapter/recognize-match.js +6 -4
  147. package/dist/core/adapter/validate-context.js +214 -0
  148. package/dist/core/asset/akm-markdown.js +63 -0
  149. package/dist/core/asset/asset-placement.js +20 -6
  150. package/dist/core/asset/asset-ref.js +11 -9
  151. package/dist/core/asset/frontmatter-lint.js +30 -0
  152. package/dist/core/asset/frontmatter.js +25 -9
  153. package/dist/core/asset/markdown.js +40 -51
  154. package/dist/core/asset/resolve-ref.js +89 -18
  155. package/dist/core/asset/stash-meta.js +1 -1
  156. package/dist/core/bundle-id.js +51 -0
  157. package/dist/core/common.js +152 -38
  158. package/dist/core/config/config-io.js +12 -1
  159. package/dist/core/config/config-schema.js +35 -8
  160. package/dist/core/config/config-sources.js +55 -11
  161. package/dist/core/config/config-walker.js +25 -9
  162. package/dist/core/config/config.js +9 -48
  163. package/dist/core/config/experimental.js +21 -0
  164. package/dist/core/config/schema/embedding.js +5 -1
  165. package/dist/core/config/schema/experimental.js +30 -0
  166. package/dist/core/config/schema/improve-processes.js +0 -6
  167. package/dist/core/config/schema/improve.js +21 -3
  168. package/dist/core/config/schema/index-config.js +8 -15
  169. package/dist/core/config/schema/output.js +4 -1
  170. package/dist/core/config/schema/setup.js +9 -18
  171. package/dist/core/config/schema/sources-bundles.js +49 -33
  172. package/dist/core/config/schema/workflow.js +3 -3
  173. package/dist/core/env-secret-ref.js +76 -46
  174. package/dist/core/errors.js +18 -12
  175. package/dist/core/events.js +46 -128
  176. package/dist/core/file-change.js +6 -5
  177. package/dist/core/fs-txn.js +83 -7
  178. package/dist/core/git-message.js +2 -2
  179. package/dist/core/improve-result.js +1 -100
  180. package/dist/core/lesson-lint.js +1 -17
  181. package/dist/core/logs-db.js +2 -1
  182. package/dist/core/migration-operation.js +16 -0
  183. package/dist/core/mutation-target.js +78 -0
  184. package/dist/core/parse.js +4 -1
  185. package/dist/core/paths.js +17 -20
  186. package/dist/core/recognition-util.js +12 -14
  187. package/dist/core/redaction.js +34 -0
  188. package/dist/core/standards/resolve-standards-context.js +2 -14
  189. package/dist/core/standards/resolve-stash-standards.js +2 -2
  190. package/dist/core/standards/resolve-type-conventions.js +2 -2
  191. package/dist/core/state/migrations.js +41 -18
  192. package/dist/core/state-db.js +5 -14
  193. package/dist/core/structured.js +1 -1
  194. package/dist/core/subprocess.js +6 -4
  195. package/dist/core/text-truncation.js +9 -5
  196. package/dist/core/type-presentation.js +3 -3
  197. package/dist/core/warn.js +0 -3
  198. package/dist/core/write-source.js +771 -95
  199. package/dist/indexer/bundle-identity-guard.js +3 -2
  200. package/dist/indexer/db/graph-db.js +0 -24
  201. package/dist/indexer/ensure-index.js +1 -0
  202. package/dist/indexer/graph/graph-boost.js +9 -34
  203. package/dist/indexer/graph/graph-extraction.js +8 -5
  204. package/dist/indexer/index-writer-lock.js +53 -17
  205. package/dist/indexer/index-written-assets.js +16 -22
  206. package/dist/indexer/indexer.js +497 -239
  207. package/dist/indexer/installations.js +14 -96
  208. package/dist/indexer/passes/dir-staleness.js +16 -9
  209. package/dist/indexer/passes/memory-inference.js +11 -9
  210. package/dist/indexer/passes/metadata.js +113 -47
  211. package/dist/indexer/scan/doc-to-entry.js +38 -1
  212. package/dist/indexer/scan/drain-dir.js +13 -23
  213. package/dist/indexer/search/db-search.js +99 -54
  214. package/dist/indexer/search/fts-query.js +47 -24
  215. package/dist/indexer/search/ranking-contributors.js +42 -20
  216. package/dist/indexer/search/ranking.js +18 -99
  217. package/dist/indexer/search/search-fields.js +7 -2
  218. package/dist/indexer/search/search-source.js +82 -93
  219. package/dist/indexer/usage/usage-events.js +0 -89
  220. package/dist/indexer/walk/file-context.js +2 -1
  221. package/dist/indexer/walk/matchers.js +30 -43
  222. package/dist/indexer/walk/path-resolver.js +7 -2
  223. package/dist/indexer/walk/walker.js +38 -12
  224. package/dist/integrations/agent/builders.js +0 -6
  225. package/dist/integrations/agent/config.js +2 -2
  226. package/dist/integrations/agent/detect.js +49 -19
  227. package/dist/integrations/agent/engine-fallback.js +76 -0
  228. package/dist/integrations/agent/profiles.js +14 -0
  229. package/dist/integrations/agent/prompts.js +12 -8
  230. package/dist/integrations/agent/runner-dispatch.js +4 -2
  231. package/dist/integrations/agent/runner.js +0 -1
  232. package/dist/integrations/agent/spawn.js +5 -6
  233. package/dist/integrations/github.js +1 -1
  234. package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
  235. package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
  236. package/dist/integrations/harnesses/claude/session-log.js +0 -10
  237. package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
  238. package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
  239. package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
  240. package/dist/integrations/harnesses/index.js +3 -7
  241. package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
  242. package/dist/integrations/harnesses/opencode/session-log.js +0 -15
  243. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
  244. package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
  245. package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
  246. package/dist/integrations/lockfile.js +88 -7
  247. package/dist/integrations/session-logs/index.js +3 -28
  248. package/dist/llm/client.js +136 -100
  249. package/dist/llm/embedders/remote.js +13 -5
  250. package/dist/llm/feature-gate.js +4 -12
  251. package/dist/llm/graph-extract.js +5 -11
  252. package/dist/llm/memory-infer.js +144 -1
  253. package/dist/llm/metadata-enhance.js +5 -7
  254. package/dist/llm/structured-call.js +1 -1
  255. package/dist/llm/usage-persist.js +26 -5
  256. package/dist/llm/usage-telemetry.js +25 -2
  257. package/dist/output/cli-hints.js +1 -2
  258. package/dist/output/context.js +22 -7
  259. package/dist/output/format-exempt.js +80 -0
  260. package/dist/output/generic-render.js +259 -0
  261. package/dist/output/render-registry.js +57 -0
  262. package/dist/output/renderers.js +14 -36
  263. package/dist/output/shapes/curate.js +10 -1
  264. package/dist/output/shapes/events.js +12 -7
  265. package/dist/output/shapes/helpers.js +56 -83
  266. package/dist/output/shapes/migrate.js +8 -0
  267. package/dist/output/shapes/passthrough.js +7 -41
  268. package/dist/output/shapes/proposal/producer.js +15 -7
  269. package/dist/output/shapes.js +2 -9
  270. package/dist/output/text/{init.js → bundle-create.js} +3 -1
  271. package/dist/output/text/bundle-show.js +7 -0
  272. package/dist/output/text/command-format.js +164 -96
  273. package/dist/output/text/env.js +1 -3
  274. package/dist/output/text/events.js +8 -7
  275. package/dist/output/text/health-format.js +103 -0
  276. package/dist/output/text/health.js +7 -0
  277. package/dist/output/text/helpers.js +10 -8
  278. package/dist/output/text/lint-format.js +43 -0
  279. package/dist/output/text/{save.js → lint.js} +2 -2
  280. package/dist/output/text/migrate.js +88 -0
  281. package/dist/output/text/proposal/producer.js +4 -2
  282. package/dist/output/text/proposal-format.js +44 -72
  283. package/dist/output/text/registry-commands.js +1 -2
  284. package/dist/output/text/show-directives.js +15 -7
  285. package/dist/output/text/status-list.js +32 -0
  286. package/dist/output/text/sync.js +5 -0
  287. package/dist/output/text/workflow-format.js +24 -203
  288. package/dist/output/text/workflow.js +1 -7
  289. package/dist/output/text.js +16 -17
  290. package/dist/registry/factory.js +4 -6
  291. package/dist/registry/origin-resolve.js +16 -27
  292. package/dist/registry/providers/skills-sh.js +3 -3
  293. package/dist/registry/providers/static-index.js +13 -23
  294. package/dist/registry/resolve.js +42 -7
  295. package/dist/registry/semver.js +34 -84
  296. package/dist/runtime.js +2 -23
  297. package/dist/scripts/akm-migrate-node.js +60290 -0
  298. package/dist/scripts/akm-migrate.js +59628 -0
  299. package/dist/setup/detect.js +42 -15
  300. package/dist/setup/registry-stash-loader.js +2 -2
  301. package/dist/setup/setup.js +236 -136
  302. package/dist/setup/steps/connection.js +7 -9
  303. package/dist/setup/steps/platforms.js +9 -9
  304. package/dist/setup/steps/semantic.js +15 -3
  305. package/dist/setup/steps/sources.js +12 -13
  306. package/dist/setup/steps/stashdir.js +2 -3
  307. package/dist/setup/steps/tasks.js +237 -120
  308. package/dist/sources/freshness.js +1 -1
  309. package/dist/sources/provider-factory.js +11 -17
  310. package/dist/sources/providers/filesystem.js +2 -3
  311. package/dist/sources/providers/git-install.js +278 -34
  312. package/dist/sources/providers/git-provider.js +25 -23
  313. package/dist/sources/providers/git-stash.js +395 -106
  314. package/dist/sources/providers/git.js +2 -2
  315. package/dist/sources/providers/npm.js +16 -19
  316. package/dist/sources/providers/provider-utils.js +7 -4
  317. package/dist/sources/providers/sync-from-ref.js +3 -9
  318. package/dist/sources/providers/website.js +6 -1
  319. package/dist/sources/resolve.js +6 -5
  320. package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
  321. package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
  322. package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
  323. package/dist/sources/snapshot-fetchers/github.js +100 -0
  324. package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
  325. package/dist/sources/snapshot-fetchers/registry.js +17 -1
  326. package/dist/sources/snapshot-fetchers/robots.js +348 -0
  327. package/dist/sources/snapshot-fetchers/rss.js +282 -0
  328. package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
  329. package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
  330. package/dist/sources/snapshot-fetchers/x.js +910 -0
  331. package/dist/storage/database.js +7 -0
  332. package/dist/storage/engines/sqlite-migrations.js +23 -111
  333. package/dist/storage/managed-db.js +2 -2
  334. package/dist/storage/repositories/canaries-repository.js +1 -1
  335. package/dist/storage/repositories/events-repository.js +27 -11
  336. package/dist/storage/repositories/improve-runs-repository.js +6 -12
  337. package/dist/storage/repositories/index-connection.js +17 -6
  338. package/dist/storage/repositories/index-entries-repository.js +151 -240
  339. package/dist/storage/repositories/index-entry-mapper.js +15 -11
  340. package/dist/storage/repositories/index-fts-repository.js +5 -2
  341. package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
  342. package/dist/storage/repositories/index-meta-repository.js +2 -3
  343. package/dist/storage/repositories/index-schema.js +10 -25
  344. package/dist/storage/repositories/index-utility-repository.js +15 -28
  345. package/dist/storage/repositories/index-vec-repository.js +6 -1
  346. package/dist/storage/repositories/outcome-repository.js +119 -0
  347. package/dist/storage/repositories/proposals-repository.js +296 -59
  348. package/dist/storage/repositories/registry-cache.js +19 -0
  349. package/dist/storage/repositories/salience-repository.js +172 -0
  350. package/dist/storage/repositories/task-history-repository.js +15 -13
  351. package/dist/storage/repositories/workflow-runs-repository.js +52 -40
  352. package/dist/tasks/backends/cron.js +105 -15
  353. package/dist/tasks/backends/index.js +1 -1
  354. package/dist/tasks/backends/launchd.js +85 -38
  355. package/dist/tasks/backends/schtasks.js +135 -15
  356. package/dist/tasks/embedded.js +56 -40
  357. package/dist/tasks/parser.js +7 -157
  358. package/dist/tasks/resolve-akm-bin.js +137 -59
  359. package/dist/tasks/runner.js +79 -42
  360. package/dist/tasks/scheduler-invocation.js +220 -10
  361. package/dist/tasks/schema.js +24 -1
  362. package/dist/tasks/task-id.js +1 -3
  363. package/dist/tasks/validator.js +20 -6
  364. package/dist/workflows/authoring/authoring.js +94 -143
  365. package/dist/workflows/authoring/scope-key.js +1 -1
  366. package/dist/workflows/exec/frozen-judge.js +28 -2
  367. package/dist/workflows/exec/native-executor.js +77 -57
  368. package/dist/workflows/exec/param-secrets.js +9 -9
  369. package/dist/workflows/exec/run-workflow.js +133 -79
  370. package/dist/workflows/exec/step-work.js +219 -346
  371. package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
  372. package/dist/workflows/ir/compile.js +141 -270
  373. package/dist/workflows/ir/freeze.js +40 -30
  374. package/dist/workflows/ir/params.js +135 -11
  375. package/dist/workflows/ir/plan-hash.js +1 -1
  376. package/dist/workflows/ir/schema.js +25 -26
  377. package/dist/workflows/parser.js +872 -307
  378. package/dist/workflows/program/expressions.js +20 -208
  379. package/dist/workflows/program/schema.js +7 -10
  380. package/dist/workflows/renderer.js +95 -68
  381. package/dist/workflows/resource-limits.js +2 -0
  382. package/dist/workflows/runtime/checkin.js +3 -3
  383. package/dist/workflows/runtime/plan-classifier.js +16 -75
  384. package/dist/workflows/runtime/runs.js +186 -127
  385. package/dist/workflows/runtime/unit-checkin.js +1 -1
  386. package/dist/workflows/runtime/unit-phases.js +2 -2
  387. package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
  388. package/dist/workflows/schema.js +1 -11
  389. package/dist/workflows/validate-summary.js +30 -36
  390. package/dist/workflows/validator.js +21 -62
  391. package/docs/README.md +68 -0
  392. package/docs/migration/README.md +8 -0
  393. package/docs/migration/release-notes/0.7.0.md +11 -11
  394. package/docs/migration/release-notes/0.9.0.md +208 -27
  395. package/docs/migration/v0.7-to-v0.8.md +46 -47
  396. package/docs/migration/v0.8-to-v0.9.md +564 -208
  397. package/docs/migration/v0.9.0-troubleshooting.md +561 -0
  398. package/docs/reference/README.md +12 -0
  399. package/docs/reference/cli.md +2253 -0
  400. package/docs/reference/configuration.md +358 -0
  401. package/docs/reference/data-and-telemetry.md +105 -42
  402. package/docs/reference/workflows.md +647 -0
  403. package/package.json +22 -11
  404. package/schemas/akm-asset-envelope.json +93 -0
  405. package/schemas/akm-config.json +81 -128
  406. package/schemas/akm-workflow.json +74 -73
  407. package/dist/assets/tasks/core/backup.yml +0 -5
  408. package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
  409. package/dist/cli/config-migrate.js +0 -1878
  410. package/dist/cli/config-validate.js +0 -41
  411. package/dist/commands/backup-cli.js +0 -56
  412. package/dist/commands/bundle/bundle-cli.js +0 -68
  413. package/dist/commands/bundle/bundle.js +0 -219
  414. package/dist/commands/graph/graph-cli.js +0 -124
  415. package/dist/commands/graph/graph.js +0 -489
  416. package/dist/commands/improve/extract-watch.js +0 -140
  417. package/dist/commands/mv-cli.js +0 -1221
  418. package/dist/commands/sources/history.js +0 -201
  419. package/dist/commands/tasks/default-tasks.js +0 -186
  420. package/dist/core/migration-backup.js +0 -1231
  421. package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
  422. package/dist/llm/memory-infer-impl.js +0 -138
  423. package/dist/migrate/legacy/config-source-migration.js +0 -257
  424. package/dist/migrate/legacy/content-migration.js +0 -350
  425. package/dist/migrate/legacy/legacy-layout.js +0 -779
  426. package/dist/migrate/legacy/legacy-paths.js +0 -25
  427. package/dist/migrate/legacy/legacy-stash-json.js +0 -80
  428. package/dist/migrate/legacy/proposal-fs-import.js +0 -168
  429. package/dist/migrate/legacy/task-target-ref-migration.js +0 -278
  430. package/dist/migrate/legacy/three-db-cutover.js +0 -845
  431. package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
  432. package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
  433. package/dist/migrate/legacy-ref-grammar.js +0 -214
  434. package/dist/output/shapes/distill.js +0 -14
  435. package/dist/output/shapes/history.js +0 -11
  436. package/dist/output/text/distill.js +0 -6
  437. package/dist/output/text/enable-disable.js +0 -8
  438. package/dist/output/text/history.js +0 -6
  439. package/dist/registry/build-index.js +0 -382
  440. package/dist/schemas/akm-config.json +0 -4704
  441. package/dist/schemas/akm-task.json +0 -87
  442. package/dist/schemas/akm-workflow.json +0 -372
  443. package/dist/scripts/migrate-storage.js +0 -3816
  444. package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
  445. package/dist/workflows/cli.js +0 -53
  446. package/dist/workflows/exec/brief.js +0 -481
  447. package/dist/workflows/exec/report.js +0 -1460
  448. package/dist/workflows/exec/watch.js +0 -116
  449. package/dist/workflows/program/parser.js +0 -813
  450. package/dist/workflows/program/project.js +0 -104
@@ -1,8 +1,4 @@
1
- #!/usr/bin/env node
2
1
  // This Source Code Form is subject to the terms of the Mozilla Public
3
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
4
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
-
6
- const { main } = await import("./scripts/migrate-storage.js");
7
-
8
- await main();
4
+ export {};
@@ -2,102 +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 -> unresolved workflow plan compilers.
5
+ * Frontend -> unresolved workflow plan compiler (workflow-format-unification).
6
6
  *
7
- * Two frontends, one source-plan shape. Engine resolution in `freeze.ts`
8
- * lowers this shape into the only executable format, workflow IR v3.
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:
9
12
  *
10
- * - {@link compileWorkflowProgram} YAML orchestration programs
11
- * (`program/parser.ts`). Pure and deterministic; performs FULL expression
12
- * validation (closed `${{ }}` grammar, earlier-step references,
13
- * whole-value contexts, `item`/`item_index` scoping) and MERGES the
14
- * Returns accumulated `WorkflowError`s rather than throwing.
15
- * - {@link compileWorkflowPlan} classic LINEAR markdown workflows
16
- * (`parser.ts`), the stable CLI contract: one unit node per step with the
17
- * fail-fast default. The P1
18
- * 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.
19
20
  *
20
21
  * Node-id convention (stable, unique within a plan):
21
- * step root → `<stepId>` (agent) or `<stepId>.map` (map)
22
+ * step root → `<stepId>` (unit) or `<stepId>.map` (map)
22
23
  * map unit → `<stepId>.unit` (template instantiated per item)
23
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.
24
28
  */
25
- import { formatReference, listReferences, parseTemplate } from "../program/expressions.js";
29
+ import { formatReference, parseReference } from "../program/expressions.js";
26
30
  /**
27
- * Compile a parsed YAML program into a frozen-plan-ready graph. Assumes the
28
- * program came out of `parseWorkflowProgram` ok (structure already valid);
29
- * this pass owns the expression-language rules the parser deliberately does
30
- * not check:
31
- *
32
- * - every `${{ … }}` in instructions / `map.over` / `route.input` parses
33
- * against the CLOSED grammar;
34
- * - `steps.<id>` references name an EARLIER step (a producer that has
35
- * already run when the reference resolves);
36
- * - `map.over` and `route.input` are single whole-value references — a bare
37
- * `${{ … }}` with no surrounding text;
38
- * - `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).
39
35
  */
40
- export function compileWorkflowProgram(program) {
36
+ export function compileWorkflowPlan(document, title) {
41
37
  const errors = [];
42
- const allStepIds = new Set(program.steps.map((s) => s.id));
38
+ const allStepIds = new Set(document.steps.map((s) => s.id));
43
39
  const earlierStepIds = new Set();
44
40
  const steps = [];
45
- program.steps.forEach((step, index) => {
41
+ document.steps.forEach((step) => {
46
42
  const check = { allStepIds, earlierStepIds, errors };
47
- if (step.unit) {
48
- checkTemplateExpressions(step.unit.instructions, {
49
- ...check,
50
- line: step.unit.source.start,
51
- label: `Step "${step.id}" instructions`,
52
- inMapUnit: false,
53
- });
54
- }
55
43
  if (step.map) {
56
- 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, {
57
48
  ...check,
58
49
  line: step.source.start,
59
- label: `Step "${step.id}" map.over`,
60
- });
61
- checkTemplateExpressions(step.map.unit.instructions, {
62
- ...check,
63
- line: step.map.unit.source.start,
64
- label: `Step "${step.id}" instructions`,
65
- inMapUnit: true,
50
+ label: `Step "${step.id}" route.input`,
66
51
  });
67
52
  }
68
- if (step.route) {
69
- checkWholeValueExpression(step.route.input, {
53
+ for (const [index, reference] of (step.inputs ?? []).entries()) {
54
+ checkInputReference(reference, index, {
70
55
  ...check,
71
56
  line: step.source.start,
72
- label: `Step "${step.id}" route.input`,
57
+ label: `Step "${step.id}" inputs`,
73
58
  });
74
59
  }
75
- steps.push(compileProgramStep(step, index, program.defaults));
60
+ steps.push(compileStep(step, defaultsOf(document)));
76
61
  earlierStepIds.add(step.id);
77
62
  });
78
63
  if (errors.length > 0)
79
64
  return { ok: false, errors };
80
- const paramNames = program.params ? Object.keys(program.params) : [];
65
+ const paramNames = document.params ? Object.keys(document.params) : [];
81
66
  return {
82
67
  ok: true,
83
- // Non-fatal advisories (redesign addendum). Warnings NEVER change the plan
84
- // or its hash — they are computed alongside the frozen plan and surfaced by
85
- // `workflow validate` / `workflow start`, never persisted onto the run row.
86
- warnings: collectProgramWarnings(program),
68
+ warnings: collectWorkflowWarnings(document),
87
69
  plan: {
88
- title: program.name,
70
+ title,
89
71
  ...(paramNames.length > 0 ? { params: paramNames } : {}),
90
- // Reviewer #12: freeze the per-param schemas into the plan so `--params`
91
- // can be validated at start and re-asserted at brief/report against the
92
- // exact schemas the run was created with (the plan hash covers them).
93
- ...(program.params && paramNames.length > 0 ? { paramSchemas: program.params } : {}),
94
- // Budget ceilings (addendum R2): frozen onto the plan so enforcement is
95
- // a pure function of (frozen plan, journal) — never the live asset.
96
- ...(program.budget
72
+ ...(document.params && paramNames.length > 0 ? { paramSchemas: document.params } : {}),
73
+ ...(document.budget
97
74
  ? {
98
75
  budget: {
99
- ...(program.budget.maxTokens !== undefined ? { maxTokens: program.budget.maxTokens } : {}),
100
- ...(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 } : {}),
101
78
  },
102
79
  }
103
80
  : {}),
@@ -105,38 +82,42 @@ export function compileWorkflowProgram(program) {
105
82
  },
106
83
  };
107
84
  }
108
- function compileProgramStep(step, index, defaults) {
85
+ function defaultsOf(document) {
86
+ return document.defaults;
87
+ }
88
+ function compileStep(step, defaults) {
109
89
  const gate = {
110
90
  kind: "gate",
111
91
  id: `${step.id}.gate`,
112
92
  stepId: step.id,
113
- criteria: step.gate?.criteria ?? [],
114
- // TODO(R2): maxLoops execution (bounded evaluator-optimizer) is engine
115
- // 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 needs no verification (criteria: []).
96
+ criteria: step.gateRubric?.text.trim() ? [step.gateRubric.text] : [],
116
97
  ...(step.gate?.maxLoops !== undefined ? { maxLoops: step.gate.maxLoops } : {}),
117
- // Reviewer #18: a required gate rides the frozen plan so BOTH surfaces
118
- // (engine + report) enforce it identically.
119
- ...(step.gate?.required !== undefined ? { required: step.gate.required } : {}),
120
98
  };
121
99
  let root;
122
- if (step.unit) {
123
- root = compileProgramUnit(step.unit, step.id, defaults);
124
- }
125
- else if (step.map) {
126
- root = {
127
- kind: "map",
128
- id: `${step.id}.map`,
129
- over: step.map.over,
130
- template: compileProgramUnit(step.map.unit, `${step.id}.unit`, defaults),
131
- ...(step.map.concurrency !== undefined ? { concurrency: step.map.concurrency } : {}),
132
- reducer: step.map.reducer ?? "collect",
133
- source: step.source,
134
- };
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
+ }
135
116
  }
136
117
  return {
137
118
  stepId: step.id,
138
- title: step.title ?? step.id,
139
- sequenceIndex: index,
119
+ title: step.id,
120
+ sequenceIndex: step.sequenceIndex,
140
121
  ...(root ? { root } : {}),
141
122
  ...(step.route
142
123
  ? {
@@ -147,229 +128,119 @@ function compileProgramStep(step, index, defaults) {
147
128
  },
148
129
  }
149
130
  : {}),
150
- // TODO(R2): validating the reducer result against this schema (typed step
151
- // artifacts) is engine-rework scope; the frozen plan carries it now.
152
131
  ...(step.output !== undefined ? { outputSchema: step.output } : {}),
153
132
  gate,
154
133
  };
155
134
  }
156
135
  /**
157
- * Lower one source unit into the unresolved structural plan. Engine/model/time
158
- * settings remain on the parsed source until the single freeze boundary.
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.
159
140
  */
160
- function compileProgramUnit(unit, id, defaults) {
141
+ function compileUnit(unit, id, instructions, defaults, inputs, source) {
161
142
  return {
162
143
  kind: "unit",
163
144
  id,
164
- instructions: unit.instructions,
165
- // YAML program instructions are `${{ … }}` templates (validated above);
166
- // the executor resolves them per unit.
167
- templating: "expressions",
168
- ...(unit.output !== undefined ? { schema: unit.output } : {}),
169
- // TODO(R2): retry dispatch is engine-rework scope; carried through now.
170
- ...(unit.retry ? { retry: { max: unit.retry.max, on: [...unit.retry.on] } } : {}),
171
- onError: unit.onError ?? defaults?.onError ?? "fail",
172
- ...(unit.env ? { env: [...unit.env] } : {}),
173
- ...(unit.isolation !== undefined ? { isolation: unit.isolation } : {}),
174
- 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 } : {}),
175
154
  };
176
155
  }
177
- /** Validate every `${{ … }}` in a free-text template (instructions). */
178
- function checkTemplateExpressions(text, check) {
179
- 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);
180
159
  if (!parsed.ok) {
181
- for (const err of parsed.errors) {
182
- check.errors.push({ line: check.line, message: `${check.label}: ${err.message}` });
183
- }
160
+ check.errors.push({ line: check.line, message: `${check.label}: ${parsed.message}` });
184
161
  return;
185
162
  }
186
- for (const ref of listReferences(parsed.segments)) {
187
- 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
+ });
188
171
  }
189
172
  }
190
- /**
191
- * Validate a whole-value field (`map.over`, `route.input`): the text must be
192
- * exactly one `${{ … }}` reference with no surrounding literal text, so the
193
- * engine can resolve it to a RAW value (array/object), never a string splice.
194
- */
195
- function checkWholeValueExpression(text, check) {
196
- 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);
197
176
  if (!parsed.ok) {
198
- for (const err of parsed.errors) {
199
- check.errors.push({ line: check.line, message: `${check.label}: ${err.message}` });
200
- }
177
+ check.errors.push({ line: check.line, message: `${check.label}[${index}]: ${parsed.message}` });
201
178
  return;
202
179
  }
203
- const [first] = parsed.segments;
204
- if (parsed.segments.length !== 1 || first?.kind !== "reference") {
180
+ if (parsed.expr.kind === "param") {
205
181
  check.errors.push({
206
182
  line: check.line,
207
- message: `${check.label} must be a single whole-value \${{ }} reference with no surrounding text ` +
208
- `(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...).`,
209
186
  });
210
187
  return;
211
188
  }
212
- // `item`/`item_index` never exist where a whole-value field resolves (the
213
- // item list itself, or a spine route input), so inMapUnit is always false.
214
- checkReference(first.expr, check, false);
215
- }
216
- function checkReference(ref, check, inMapUnit) {
217
- switch (ref.kind) {
218
- case "item":
219
- case "itemIndex": {
220
- if (!inMapUnit) {
221
- check.errors.push({
222
- line: check.line,
223
- message: `${check.label}: "\${{ ${formatReference(ref)} }}" is only valid inside a map unit's instructions.`,
224
- });
225
- }
226
- return;
227
- }
228
- case "stepOutput": {
229
- if (!check.earlierStepIds.has(ref.stepId)) {
230
- const why = check.allStepIds.has(ref.stepId)
231
- ? `step "${ref.stepId}" does not come before this step — references must name an earlier step (a producer that has already run)`
232
- : `"${ref.stepId}" is not a step in this workflow`;
233
- check.errors.push({
234
- line: check.line,
235
- message: `${check.label}: "\${{ ${formatReference(ref)} }}" cannot be resolved — ${why}.`,
236
- });
237
- }
238
- return;
239
- }
240
- case "param": {
241
- // Param presence is a RUN-SCOPE concern, never a compile-time one. A
242
- // declared `params:` block is NOT a closed set of legal references: the
243
- // runtime resolves any param SUPPLIED at start (`resolveReference`), and
244
- // `validateWorkflowParams` documents that undeclared params are permitted
245
- // — so `${{ params.mode }}` with `mode` passed via `--params` runs fine
246
- // even when only `files` is declared. At compile time an undeclared
247
- // reference is indistinguishable from that legitimate start-supplied
248
- // extra, so treating the block as closed would reject a runtime-supported
249
- // authoring pattern and put the two layers in disagreement. A genuine typo
250
- // (`params.changed_file` for `changed_files`) surfaces at run time with a
251
- // precise "is not defined in the run's params" error instead. As a lint-time
252
- // heads-up short of rejection, `collectProgramWarnings` (below) emits a
253
- // non-fatal WARNING for an undeclared reference when a `params:` block is
254
- // declared — never an error, so the runtime-supported pattern still compiles.
255
- return;
256
- }
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
+ });
257
197
  }
258
198
  }
259
199
  // ── Non-fatal warnings ───────────────────────────────────────────────────────
260
200
  /**
261
- * Collect the program's non-fatal WARNINGS — advisories that never fail
201
+ * Collect the document's non-fatal WARNINGS — advisories that never fail
262
202
  * compilation, never change the frozen plan or its hash, and are surfaced by
263
- * `workflow validate` (human + JSON) and as `warn()` lines at `workflow start`.
264
- *
265
- * Two promised-but-previously-missing warnings (redesign addendum):
203
+ * lint output (human + JSON) and as `warn()` lines at `workflow run`.
266
204
  *
267
205
  * A. A unit/map step with NO step-level `output:` schema carries its units'
268
- * raw results as an untyped artifact — permitted, but the addendum says
269
- * "the validator warns". Anchored on the STEP's `output` (the reducer /
270
- * step-artifact schema); a per-unit `output:` types the unit result but
271
- * leaves the step artifact untyped.
272
- * B. A `${{ params.<name> }}` reference to an UNDECLARED param, but ONLY when
273
- * the program declares a `params:` block. Compile-time REJECTION was tried
274
- * and reverted (see the `case "param"` note above): the runtime legitimately
275
- * resolves any param supplied at start, declared or not. The agreed middle
276
- * ground is a warning — a likely typo (`changed_file` for `changed_files`)
277
- * surfaces at lint time, while a genuinely start-supplied extra still runs.
278
- * With no `params:` block there is nothing to compare against, so B is silent.
279
- *
280
- * Pure and deterministic; the returned order is document order per step
281
- * (warning A, then each undeclared-param reference in field/document order).
282
- * 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.
283
212
  */
284
- export function collectProgramWarnings(program) {
213
+ export function collectWorkflowWarnings(document) {
285
214
  const warnings = [];
286
- const declaredParams = program.params ? new Set(Object.keys(program.params)) : undefined;
287
- for (const step of program.steps) {
288
- // Warning A a unit/map step with no step-level output schema.
289
- 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) {
290
218
  warnings.push({
291
219
  line: step.source.start,
292
220
  message: `Step "${step.id}" declares no \`output:\` schema — its unit results are carried as an untyped ` +
293
221
  `artifact (permitted). Add an \`output:\` JSON Schema to type and validate the step artifact.`,
294
222
  });
295
223
  }
296
- // Warning B — references to a param the declared `params:` block omits.
297
- if (declaredParams)
298
- collectUndeclaredParamWarnings(step, declaredParams, warnings);
299
- }
300
- return warnings;
301
- }
302
- /**
303
- * Push a warning for every `${{ params.<name> }}` reference in `step` whose
304
- * name is not in the declared param set. Walks the same template-bearing
305
- * fields the compiler validates (unit / map.over + map unit / route.input) so
306
- * the step + field context in the message matches the error labels.
307
- */
308
- function collectUndeclaredParamWarnings(step, declared, warnings) {
309
- const declaredList = [...declared].join(", ");
310
- const scan = (text, line, label) => {
311
- const parsed = parseTemplate(text);
312
- if (!parsed.ok)
313
- return; // OK compile guarantees this parses; defensive only.
314
- for (const ref of listReferences(parsed.segments)) {
315
- if (ref.kind !== "param" || declared.has(ref.name))
316
- continue;
317
- warnings.push({
318
- line,
319
- message: `${label}: "\${{ ${formatReference(ref)} }}" references a param not declared in \`params:\` ` +
320
- `(declared: ${declaredList || "none"}) — likely a typo. An undeclared param supplied at start still ` +
321
- `resolves at run time.`,
322
- });
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`);
323
243
  }
324
- };
325
- if (step.unit)
326
- scan(step.unit.instructions, step.unit.source.start, `Step "${step.id}" instructions`);
327
- if (step.map) {
328
- scan(step.map.over, step.source.start, `Step "${step.id}" map.over`);
329
- scan(step.map.unit.instructions, step.map.unit.source.start, `Step "${step.id}" instructions`);
330
244
  }
331
- if (step.route)
332
- scan(step.route.input, step.source.start, `Step "${step.id}" route.input`);
333
- }
334
- // ─────────────────────────────────────────────────────────────────────────────
335
- // Frontend B — classic markdown workflow
336
- // ─────────────────────────────────────────────────────────────────────────────
337
- /**
338
- * Compile a markdown `WorkflowDocument` to an unresolved structural plan. Pure
339
- * and deterministic: the same document always compiles to the same plan.
340
- * Linear workflows produce one fail-fast unit per step guarded by its gate.
341
- */
342
- export function compileWorkflowPlan(document) {
343
- const params = document.parameters?.map((p) => p.name);
344
- return {
345
- title: document.title,
346
- ...(params && params.length > 0 ? { params } : {}),
347
- steps: document.steps.map(compileMarkdownStep),
348
- };
349
- }
350
- function compileMarkdownStep(step) {
351
- const gate = {
352
- kind: "gate",
353
- id: `${step.id}.gate`,
354
- stepId: step.id,
355
- criteria: step.completionCriteria?.map((c) => c.text) ?? [],
356
- };
357
- return {
358
- stepId: step.id,
359
- title: step.title,
360
- sequenceIndex: step.sequenceIndex,
361
- root: {
362
- kind: "unit",
363
- id: step.id,
364
- instructions: step.instructions.text,
365
- // Stable contract: markdown instructions are opaque data, passed to the
366
- // agent byte-exact. A literal `${{ … }}` (GitHub Actions syntax, docs of
367
- // the YAML format) is content here, never expression grammar.
368
- templating: "verbatim",
369
- // Markdown has no failure-policy surface; the fail-fast default applies.
370
- onError: "fail",
371
- source: step.instructions.source,
372
- },
373
- gate,
374
- };
245
+ return warnings;
375
246
  }