@intentius/chant 0.124.27 → 0.124.29

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 (681) hide show
  1. package/README.md +1 -1
  2. package/dist/__golden__/wave-loop/fan-out-gated.json +8 -0
  3. package/dist/__golden__/wave-loop/fan-out-no-members.json +4 -0
  4. package/dist/__golden__/wave-loop/fan-out-only.json +6 -0
  5. package/dist/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  6. package/dist/__golden__/wave-loop/op-cost-member.json +3 -0
  7. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  8. package/dist/__golden__/wave-loop/op-held-on.json +2 -0
  9. package/dist/__golden__/wave-loop/op-hooks-held.json +2 -0
  10. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  11. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  12. package/dist/__golden__/wave-loop/op-hooks-share.json +3 -0
  13. package/dist/__golden__/wave-loop/op-per-run.json +7 -0
  14. package/dist/__golden__/wave-loop/op-pr-review.json +7 -0
  15. package/dist/__golden__/wave-loop/op-sealed.json +3 -0
  16. package/dist/__golden__/wave-loop/op-spend.json +3 -0
  17. package/dist/__golden__/wave-loop/op-wave-commands.json +7 -0
  18. package/dist/__golden__/wave-loop/op-wide-waiting.json +4 -0
  19. package/dist/build-params.d.ts +34 -1
  20. package/dist/build-params.d.ts.map +1 -1
  21. package/dist/build-params.js +31 -1
  22. package/dist/change-set-graph.d.ts +63 -0
  23. package/dist/change-set-graph.d.ts.map +1 -0
  24. package/dist/change-set-graph.js +130 -0
  25. package/dist/change-set.d.ts +62 -3
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +36 -4
  28. package/dist/chant-version.d.ts +9 -0
  29. package/dist/chant-version.d.ts.map +1 -0
  30. package/dist/chant-version.js +16 -0
  31. package/dist/cli/build-params-cli.d.ts +7 -1
  32. package/dist/cli/build-params-cli.d.ts.map +1 -1
  33. package/dist/cli/build-params-cli.js +17 -8
  34. package/dist/cli/commands/build.d.ts +8 -0
  35. package/dist/cli/commands/build.d.ts.map +1 -1
  36. package/dist/cli/commands/build.js +15 -11
  37. package/dist/cli/commands/check-lexicon-docs.d.ts.map +1 -1
  38. package/dist/cli/commands/check-lexicon-docs.js +30 -2
  39. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  40. package/dist/cli/commands/check-lexicon.js +13 -2
  41. package/dist/cli/commands/init-lexicon/templates/docs.d.ts +4 -1
  42. package/dist/cli/commands/init-lexicon/templates/docs.d.ts.map +1 -1
  43. package/dist/cli/commands/init-lexicon/templates/docs.js +6 -6
  44. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  45. package/dist/cli/commands/init-lexicon.js +17 -8
  46. package/dist/cli/handlers/approve.d.ts.map +1 -1
  47. package/dist/cli/handlers/approve.js +64 -4
  48. package/dist/cli/handlers/build.d.ts.map +1 -1
  49. package/dist/cli/handlers/build.js +43 -4
  50. package/dist/cli/handlers/change-set.d.ts +10 -0
  51. package/dist/cli/handlers/change-set.d.ts.map +1 -1
  52. package/dist/cli/handlers/change-set.js +51 -1
  53. package/dist/cli/handlers/fan-out.d.ts +10 -1
  54. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  55. package/dist/cli/handlers/fan-out.js +54 -6
  56. package/dist/cli/handlers/lifecycle-gc.d.ts +19 -0
  57. package/dist/cli/handlers/lifecycle-gc.d.ts.map +1 -0
  58. package/dist/cli/handlers/lifecycle-gc.js +143 -0
  59. package/dist/cli/handlers/pr.d.ts +16 -2
  60. package/dist/cli/handlers/pr.d.ts.map +1 -1
  61. package/dist/cli/handlers/pr.js +269 -37
  62. package/dist/cli/handlers/promote.d.ts +7 -0
  63. package/dist/cli/handlers/promote.d.ts.map +1 -1
  64. package/dist/cli/handlers/promote.js +440 -28
  65. package/dist/cli/handlers/release.d.ts +91 -0
  66. package/dist/cli/handlers/release.d.ts.map +1 -0
  67. package/dist/cli/handlers/release.js +589 -0
  68. package/dist/cli/handlers/run.d.ts +38 -2
  69. package/dist/cli/handlers/run.d.ts.map +1 -1
  70. package/dist/cli/handlers/run.js +234 -16
  71. package/dist/cli/main.d.ts.map +1 -1
  72. package/dist/cli/main.js +143 -17
  73. package/dist/cli/mcp/workspace-tools.js +1 -1
  74. package/dist/cli/parse-args.d.ts.map +1 -1
  75. package/dist/cli/parse-args.js +73 -5
  76. package/dist/cli/registry.d.ts +43 -5
  77. package/dist/cli/registry.d.ts.map +1 -1
  78. package/dist/cli/run-events.d.ts +30 -0
  79. package/dist/cli/run-events.d.ts.map +1 -0
  80. package/dist/cli/run-events.js +49 -0
  81. package/dist/cli/version.d.ts +3 -5
  82. package/dist/cli/version.d.ts.map +1 -1
  83. package/dist/cli/version.js +3 -13
  84. package/dist/codegen/docs-in-site.d.ts +71 -0
  85. package/dist/codegen/docs-in-site.d.ts.map +1 -0
  86. package/dist/codegen/docs-in-site.js +177 -0
  87. package/dist/codegen/docs-types.d.ts +14 -1
  88. package/dist/codegen/docs-types.d.ts.map +1 -1
  89. package/dist/codegen/docs.d.ts +18 -1
  90. package/dist/codegen/docs.d.ts.map +1 -1
  91. package/dist/codegen/docs.js +40 -7
  92. package/dist/codegen/rehype-base-url.mjs +15 -9
  93. package/dist/components/auto-release.d.ts +6 -1
  94. package/dist/components/auto-release.d.ts.map +1 -1
  95. package/dist/components/auto-release.js +3 -0
  96. package/dist/components/capability.d.ts +9 -0
  97. package/dist/components/capability.d.ts.map +1 -1
  98. package/dist/components/cli-support.d.ts +6 -0
  99. package/dist/components/cli-support.d.ts.map +1 -1
  100. package/dist/components/cli-support.js +10 -9
  101. package/dist/components/driver.d.ts +50 -9
  102. package/dist/components/driver.d.ts.map +1 -1
  103. package/dist/components/driver.js +116 -54
  104. package/dist/components/fan-out-inputs.d.ts +69 -0
  105. package/dist/components/fan-out-inputs.d.ts.map +1 -0
  106. package/dist/components/fan-out-inputs.js +169 -0
  107. package/dist/components/fan-out-record.d.ts +13 -0
  108. package/dist/components/fan-out-record.d.ts.map +1 -1
  109. package/dist/components/fan-out-record.js +16 -0
  110. package/dist/components/fan-out-run.d.ts +7 -0
  111. package/dist/components/fan-out-run.d.ts.map +1 -1
  112. package/dist/components/fan-out-run.js +85 -26
  113. package/dist/components/fan-out.d.ts +4 -0
  114. package/dist/components/fan-out.d.ts.map +1 -1
  115. package/dist/components/pr-pipeline.d.ts +25 -0
  116. package/dist/components/pr-pipeline.d.ts.map +1 -1
  117. package/dist/components/pr-pipeline.js +22 -4
  118. package/dist/components/pr-run.d.ts +11 -0
  119. package/dist/components/pr-run.d.ts.map +1 -1
  120. package/dist/components/pr-run.js +20 -1
  121. package/dist/components/promote-order.d.ts +38 -0
  122. package/dist/components/promote-order.d.ts.map +1 -0
  123. package/dist/components/promote-order.js +62 -0
  124. package/dist/components/promote.d.ts +38 -2
  125. package/dist/components/promote.d.ts.map +1 -1
  126. package/dist/components/promote.js +77 -2
  127. package/dist/components/release-compile.d.ts +142 -0
  128. package/dist/components/release-compile.d.ts.map +1 -0
  129. package/dist/components/release-compile.js +382 -0
  130. package/dist/components/release-gate.d.ts +135 -0
  131. package/dist/components/release-gate.d.ts.map +1 -0
  132. package/dist/components/release-gate.js +288 -0
  133. package/dist/components/release-promote.d.ts +96 -0
  134. package/dist/components/release-promote.d.ts.map +1 -0
  135. package/dist/components/release-promote.js +204 -0
  136. package/dist/components/run-progress.d.ts +7 -0
  137. package/dist/components/run-progress.d.ts.map +1 -1
  138. package/dist/components/wave-plan.d.ts +8 -1
  139. package/dist/components/wave-plan.d.ts.map +1 -1
  140. package/dist/components/wave-plan.js +11 -3
  141. package/dist/config.d.ts +45 -0
  142. package/dist/config.d.ts.map +1 -1
  143. package/dist/config.js +3 -0
  144. package/dist/flag-params.d.ts +54 -0
  145. package/dist/flag-params.d.ts.map +1 -0
  146. package/dist/flag-params.js +130 -0
  147. package/dist/index.d.ts +1 -0
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +2 -0
  150. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts +120 -0
  151. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -0
  152. package/dist/lifecycle/__fixtures__/publish-fakes.js +304 -0
  153. package/dist/lifecycle/change-set-store.d.ts +68 -0
  154. package/dist/lifecycle/change-set-store.d.ts.map +1 -0
  155. package/dist/lifecycle/change-set-store.js +97 -0
  156. package/dist/lifecycle/commit-sha.d.ts +13 -0
  157. package/dist/lifecycle/commit-sha.d.ts.map +1 -0
  158. package/dist/lifecycle/commit-sha.js +21 -0
  159. package/dist/lifecycle/delivery-metrics.d.ts +139 -0
  160. package/dist/lifecycle/delivery-metrics.d.ts.map +1 -0
  161. package/dist/lifecycle/delivery-metrics.js +145 -0
  162. package/dist/lifecycle/deploy-outcome.d.ts +81 -0
  163. package/dist/lifecycle/deploy-outcome.d.ts.map +1 -0
  164. package/dist/lifecycle/deploy-outcome.js +101 -0
  165. package/dist/lifecycle/gate-change-set.d.ts +78 -0
  166. package/dist/lifecycle/gate-change-set.d.ts.map +1 -0
  167. package/dist/lifecycle/gate-change-set.js +138 -0
  168. package/dist/lifecycle/gate-ledger.d.ts +51 -4
  169. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  170. package/dist/lifecycle/gate-ledger.js +18 -0
  171. package/dist/lifecycle/git.d.ts +30 -1
  172. package/dist/lifecycle/git.d.ts.map +1 -1
  173. package/dist/lifecycle/git.js +31 -5
  174. package/dist/lifecycle/index.d.ts +4 -0
  175. package/dist/lifecycle/index.d.ts.map +1 -1
  176. package/dist/lifecycle/index.js +4 -0
  177. package/dist/lifecycle/mixed-environment.d.ts +95 -0
  178. package/dist/lifecycle/mixed-environment.d.ts.map +1 -0
  179. package/dist/lifecycle/mixed-environment.js +154 -0
  180. package/dist/lifecycle/publish-attachments.d.ts +79 -0
  181. package/dist/lifecycle/publish-attachments.d.ts.map +1 -0
  182. package/dist/lifecycle/publish-attachments.js +179 -0
  183. package/dist/lifecycle/publish-credentials.d.ts +37 -0
  184. package/dist/lifecycle/publish-credentials.d.ts.map +1 -0
  185. package/dist/lifecycle/publish-credentials.js +69 -0
  186. package/dist/lifecycle/publish-declaration.d.ts +97 -0
  187. package/dist/lifecycle/publish-declaration.d.ts.map +1 -0
  188. package/dist/lifecycle/publish-declaration.js +83 -0
  189. package/dist/lifecycle/publish-forge.d.ts +53 -0
  190. package/dist/lifecycle/publish-forge.d.ts.map +1 -0
  191. package/dist/lifecycle/publish-forge.js +298 -0
  192. package/dist/lifecycle/publish-npm.d.ts +61 -0
  193. package/dist/lifecycle/publish-npm.d.ts.map +1 -0
  194. package/dist/lifecycle/publish-npm.js +242 -0
  195. package/dist/lifecycle/publish-oci.d.ts +64 -0
  196. package/dist/lifecycle/publish-oci.d.ts.map +1 -0
  197. package/dist/lifecycle/publish-oci.js +383 -0
  198. package/dist/lifecycle/publish-record.d.ts +66 -0
  199. package/dist/lifecycle/publish-record.d.ts.map +1 -0
  200. package/dist/lifecycle/publish-record.js +84 -0
  201. package/dist/lifecycle/publish-targets.d.ts +45 -0
  202. package/dist/lifecycle/publish-targets.d.ts.map +1 -0
  203. package/dist/lifecycle/publish-targets.js +85 -0
  204. package/dist/lifecycle/release-cut.d.ts +154 -0
  205. package/dist/lifecycle/release-cut.d.ts.map +1 -0
  206. package/dist/lifecycle/release-cut.js +366 -0
  207. package/dist/lifecycle/release-join.d.ts +95 -0
  208. package/dist/lifecycle/release-join.d.ts.map +1 -0
  209. package/dist/lifecycle/release-join.js +139 -0
  210. package/dist/lifecycle/release-ledger.d.ts +54 -0
  211. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  212. package/dist/lifecycle/release-ledger.js +53 -20
  213. package/dist/lifecycle/release-publish.d.ts +312 -0
  214. package/dist/lifecycle/release-publish.d.ts.map +1 -0
  215. package/dist/lifecycle/release-publish.js +335 -0
  216. package/dist/lifecycle/release-revocation.d.ts +80 -0
  217. package/dist/lifecycle/release-revocation.d.ts.map +1 -0
  218. package/dist/lifecycle/release-revocation.js +123 -0
  219. package/dist/lifecycle/release-store.d.ts +200 -0
  220. package/dist/lifecycle/release-store.d.ts.map +1 -0
  221. package/dist/lifecycle/release-store.js +320 -0
  222. package/dist/lifecycle/release-verify.d.ts +61 -0
  223. package/dist/lifecycle/release-verify.d.ts.map +1 -0
  224. package/dist/lifecycle/release-verify.js +92 -0
  225. package/dist/lifecycle/release-workstation.d.ts +91 -0
  226. package/dist/lifecycle/release-workstation.d.ts.map +1 -0
  227. package/dist/lifecycle/release-workstation.js +180 -0
  228. package/dist/lifecycle/retention-policy.d.ts +45 -0
  229. package/dist/lifecycle/retention-policy.d.ts.map +1 -0
  230. package/dist/lifecycle/retention-policy.js +43 -0
  231. package/dist/lifecycle/retention.d.ts +185 -0
  232. package/dist/lifecycle/retention.d.ts.map +1 -0
  233. package/dist/lifecycle/retention.js +400 -0
  234. package/dist/lifecycle/run-ledger.d.ts +4 -0
  235. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  236. package/dist/lifecycle/run-ledger.js +2 -0
  237. package/dist/op/activities/change-coverage.d.ts.map +1 -1
  238. package/dist/op/activities/change-coverage.js +4 -2
  239. package/dist/op/activities/source-release.d.ts.map +1 -1
  240. package/dist/op/activities/source-release.js +7 -3
  241. package/dist/op/activities/source-rollback.d.ts.map +1 -1
  242. package/dist/op/activities/source-rollback.js +7 -3
  243. package/dist/op/gate-name.d.ts +11 -2
  244. package/dist/op/gate-name.d.ts.map +1 -1
  245. package/dist/op/gate-name.js +12 -3
  246. package/dist/op/gate-run-locator.d.ts +22 -0
  247. package/dist/op/gate-run-locator.d.ts.map +1 -1
  248. package/dist/op/gate-run-locator.js +31 -0
  249. package/dist/op/gate.d.ts +27 -3
  250. package/dist/op/gate.d.ts.map +1 -1
  251. package/dist/op/gate.js +57 -3
  252. package/dist/op/local-executor.d.ts +36 -1
  253. package/dist/op/local-executor.d.ts.map +1 -1
  254. package/dist/op/local-executor.js +158 -52
  255. package/dist/op/op-waves-run.d.ts.map +1 -1
  256. package/dist/op/op-waves-run.js +4 -0
  257. package/dist/op/run-live.d.ts +2 -0
  258. package/dist/op/run-live.d.ts.map +1 -1
  259. package/dist/op/run-live.js +1 -1
  260. package/dist/op/runtime.d.ts +46 -0
  261. package/dist/op/runtime.d.ts.map +1 -1
  262. package/dist/op/runtimes/local.d.ts.map +1 -1
  263. package/dist/op/runtimes/local.js +8 -0
  264. package/dist/plan-summary.d.ts.map +1 -1
  265. package/dist/plan-summary.js +8 -2
  266. package/dist/point-decision.d.ts +2 -0
  267. package/dist/point-decision.d.ts.map +1 -1
  268. package/dist/point-decision.js +9 -2
  269. package/dist/pr-loop.d.ts +7 -0
  270. package/dist/pr-loop.d.ts.map +1 -1
  271. package/dist/pr-loop.js +23 -4
  272. package/dist/pr-report-url.d.ts +82 -0
  273. package/dist/pr-report-url.d.ts.map +1 -0
  274. package/dist/pr-report-url.js +174 -0
  275. package/dist/provenance.d.ts +2 -2
  276. package/dist/provenance.d.ts.map +1 -1
  277. package/dist/run-event-store.d.ts +104 -0
  278. package/dist/run-event-store.d.ts.map +1 -0
  279. package/dist/run-event-store.js +251 -0
  280. package/dist/run-event-stream.d.ts +133 -0
  281. package/dist/run-event-stream.d.ts.map +1 -0
  282. package/dist/run-event-stream.js +242 -0
  283. package/dist/run-event.d.ts +285 -0
  284. package/dist/run-event.d.ts.map +1 -0
  285. package/dist/run-event.js +209 -0
  286. package/dist/wave-runtime.mjs +262 -226
  287. package/dist/workspace/__fixtures__/flag-workspace.d.ts +31 -0
  288. package/dist/workspace/__fixtures__/flag-workspace.d.ts.map +1 -0
  289. package/dist/workspace/__fixtures__/flag-workspace.js +114 -0
  290. package/dist/workspace/__fixtures__/run-event-check.d.ts +19 -0
  291. package/dist/workspace/__fixtures__/run-event-check.d.ts.map +1 -0
  292. package/dist/workspace/__fixtures__/run-event-check.js +59 -0
  293. package/dist/workspace/change-set-show.d.ts +56 -0
  294. package/dist/workspace/change-set-show.d.ts.map +1 -0
  295. package/dist/workspace/change-set-show.js +54 -0
  296. package/dist/workspace/change-set-show.schema.json +102 -0
  297. package/dist/workspace/change-set.schema.json +32 -1
  298. package/dist/workspace/changes-cli.d.ts.map +1 -1
  299. package/dist/workspace/changes-cli.js +10 -1
  300. package/dist/workspace/changes.d.ts +37 -0
  301. package/dist/workspace/changes.d.ts.map +1 -1
  302. package/dist/workspace/changes.js +49 -2
  303. package/dist/workspace/changes.schema.json +135 -0
  304. package/dist/workspace/check.schema.json +4 -2
  305. package/dist/workspace/checks/records.d.ts +9 -1
  306. package/dist/workspace/checks/records.d.ts.map +1 -1
  307. package/dist/workspace/checks/records.js +35 -1
  308. package/dist/workspace/checks.d.ts +1 -0
  309. package/dist/workspace/checks.d.ts.map +1 -1
  310. package/dist/workspace/checks.js +2 -1
  311. package/dist/workspace/ci-green-cli.d.ts +19 -4
  312. package/dist/workspace/ci-green-cli.d.ts.map +1 -1
  313. package/dist/workspace/ci-green-cli.js +75 -12
  314. package/dist/workspace/ci-green-forge.d.ts +20 -3
  315. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  316. package/dist/workspace/ci-green-forge.js +6 -4
  317. package/dist/workspace/ci-green-workflow.d.ts +11 -0
  318. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  319. package/dist/workspace/ci-green-workflow.js +6 -0
  320. package/dist/workspace/ci-green.d.ts +281 -13
  321. package/dist/workspace/ci-green.d.ts.map +1 -1
  322. package/dist/workspace/ci-green.js +456 -38
  323. package/dist/workspace/ci-last-green.schema.json +32 -2
  324. package/dist/workspace/ci-list.schema.json +525 -0
  325. package/dist/workspace/commit-links.d.ts +85 -0
  326. package/dist/workspace/commit-links.d.ts.map +1 -0
  327. package/dist/workspace/commit-links.js +163 -0
  328. package/dist/workspace/declaration.d.ts +35 -0
  329. package/dist/workspace/declaration.d.ts.map +1 -1
  330. package/dist/workspace/declaration.js +27 -1
  331. package/dist/workspace/declaration.schema.json +76 -0
  332. package/dist/workspace/declared-kinds.d.ts +16 -0
  333. package/dist/workspace/declared-kinds.d.ts.map +1 -1
  334. package/dist/workspace/declared-kinds.js +25 -0
  335. package/dist/workspace/delivery-metrics.d.ts +91 -0
  336. package/dist/workspace/delivery-metrics.d.ts.map +1 -0
  337. package/dist/workspace/delivery-metrics.js +217 -0
  338. package/dist/workspace/delivery-metrics.schema.json +519 -0
  339. package/dist/workspace/flags-read.d.ts +37 -0
  340. package/dist/workspace/flags-read.d.ts.map +1 -0
  341. package/dist/workspace/flags-read.js +103 -0
  342. package/dist/workspace/flags.d.ts +100 -0
  343. package/dist/workspace/flags.d.ts.map +1 -0
  344. package/dist/workspace/flags.js +98 -0
  345. package/dist/workspace/graph-cli.js +1 -1
  346. package/dist/workspace/identity-gate-rule.d.ts +37 -0
  347. package/dist/workspace/identity-gate-rule.d.ts.map +1 -1
  348. package/dist/workspace/identity-gate-rule.js +72 -7
  349. package/dist/workspace/identity.d.ts +12 -0
  350. package/dist/workspace/identity.d.ts.map +1 -1
  351. package/dist/workspace/identity.js +13 -1
  352. package/dist/workspace/intent-cli.d.ts +11 -2
  353. package/dist/workspace/intent-cli.d.ts.map +1 -1
  354. package/dist/workspace/intent-cli.js +54 -5
  355. package/dist/workspace/intent-trace.d.ts +219 -0
  356. package/dist/workspace/intent-trace.d.ts.map +1 -0
  357. package/dist/workspace/intent-trace.js +314 -0
  358. package/dist/workspace/intent.d.ts +36 -7
  359. package/dist/workspace/intent.d.ts.map +1 -1
  360. package/dist/workspace/intent.js +192 -22
  361. package/dist/workspace/intent.schema.json +702 -6
  362. package/dist/workspace/ls.d.ts +4 -0
  363. package/dist/workspace/ls.d.ts.map +1 -1
  364. package/dist/workspace/ls.js +2 -0
  365. package/dist/workspace/ls.schema.json +3 -1
  366. package/dist/workspace/member-pipeline.d.ts +6 -0
  367. package/dist/workspace/member-pipeline.d.ts.map +1 -1
  368. package/dist/workspace/member-pipeline.js +6 -0
  369. package/dist/workspace/overlap.d.ts +146 -0
  370. package/dist/workspace/overlap.d.ts.map +1 -0
  371. package/dist/workspace/overlap.js +276 -0
  372. package/dist/workspace/promotion-order.d.ts +41 -0
  373. package/dist/workspace/promotion-order.d.ts.map +1 -0
  374. package/dist/workspace/promotion-order.js +95 -0
  375. package/dist/workspace/reason-codes.d.ts +4 -0
  376. package/dist/workspace/reason-codes.d.ts.map +1 -1
  377. package/dist/workspace/reason-codes.js +7 -1
  378. package/dist/workspace/records.d.ts +15 -2
  379. package/dist/workspace/records.d.ts.map +1 -1
  380. package/dist/workspace/records.js +32 -0
  381. package/dist/workspace/records.schema.json +21 -2
  382. package/dist/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  383. package/dist/workspace/reference-kinds/flag/flag.schema.json +53 -0
  384. package/dist/workspace/releases.d.ts +81 -0
  385. package/dist/workspace/releases.d.ts.map +1 -0
  386. package/dist/workspace/releases.js +103 -0
  387. package/dist/workspace/releases.schema.json +513 -0
  388. package/dist/workspace/run-event.schema.json +295 -0
  389. package/dist/workspace/status-gates.d.ts +34 -1
  390. package/dist/workspace/status-gates.d.ts.map +1 -1
  391. package/dist/workspace/status-gates.js +31 -2
  392. package/dist/workspace/status-stewards.d.ts +4 -0
  393. package/dist/workspace/status-stewards.d.ts.map +1 -1
  394. package/dist/workspace/status-stewards.js +2 -0
  395. package/dist/workspace/status.d.ts +117 -0
  396. package/dist/workspace/status.d.ts.map +1 -1
  397. package/dist/workspace/status.js +218 -4
  398. package/dist/workspace/status.schema.json +268 -2
  399. package/dist/workspace/trust/ci-tag-statement.d.ts +102 -0
  400. package/dist/workspace/trust/ci-tag-statement.d.ts.map +1 -0
  401. package/dist/workspace/trust/ci-tag-statement.js +123 -0
  402. package/dist/workspace/trust/op-run-statement.d.ts +91 -0
  403. package/dist/workspace/trust/op-run-statement.d.ts.map +1 -0
  404. package/dist/workspace/trust/op-run-statement.js +143 -0
  405. package/dist/workspace/trust/rotation.d.ts +18 -2
  406. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  407. package/dist/workspace/trust/rotation.js +65 -16
  408. package/dist/workspace/trust/seal.d.ts +11 -0
  409. package/dist/workspace/trust/seal.d.ts.map +1 -1
  410. package/dist/workspace/trust/seal.js +9 -0
  411. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
  412. package/dist/workspace/trust/ssh-commit.js +10 -10
  413. package/dist/workspace/wip.d.ts.map +1 -1
  414. package/dist/workspace/wip.js +11 -3
  415. package/package.json +1 -1
  416. package/src/__golden__/wave-loop/fan-out-gated.json +8 -0
  417. package/src/__golden__/wave-loop/fan-out-no-members.json +4 -0
  418. package/src/__golden__/wave-loop/fan-out-only.json +6 -0
  419. package/src/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  420. package/src/__golden__/wave-loop/op-cost-member.json +3 -0
  421. package/src/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  422. package/src/__golden__/wave-loop/op-held-on.json +2 -0
  423. package/src/__golden__/wave-loop/op-hooks-held.json +2 -0
  424. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  425. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  426. package/src/__golden__/wave-loop/op-hooks-share.json +3 -0
  427. package/src/__golden__/wave-loop/op-per-run.json +7 -0
  428. package/src/__golden__/wave-loop/op-pr-review.json +7 -0
  429. package/src/__golden__/wave-loop/op-sealed.json +3 -0
  430. package/src/__golden__/wave-loop/op-spend.json +3 -0
  431. package/src/__golden__/wave-loop/op-wave-commands.json +7 -0
  432. package/src/__golden__/wave-loop/op-wide-waiting.json +4 -0
  433. package/src/build-params.test.ts +46 -0
  434. package/src/build-params.ts +55 -1
  435. package/src/change-set-graph.test.ts +72 -0
  436. package/src/change-set-graph.ts +141 -0
  437. package/src/change-set.ts +87 -6
  438. package/src/chant-version.ts +16 -0
  439. package/src/cli/build-params-cli.ts +22 -9
  440. package/src/cli/commands/build.ts +25 -11
  441. package/src/cli/commands/check-lexicon-docs.test.ts +51 -0
  442. package/src/cli/commands/check-lexicon-docs.ts +39 -2
  443. package/src/cli/commands/check-lexicon.ts +14 -2
  444. package/src/cli/commands/init-lexicon/templates/docs.ts +7 -6
  445. package/src/cli/commands/init-lexicon.test.ts +25 -0
  446. package/src/cli/commands/init-lexicon.ts +18 -8
  447. package/src/cli/handlers/approve-release.test.ts +84 -0
  448. package/src/cli/handlers/approve-revoked.test.ts +155 -0
  449. package/src/cli/handlers/approve.ts +65 -2
  450. package/src/cli/handlers/build.test.ts +67 -0
  451. package/src/cli/handlers/build.ts +46 -4
  452. package/src/cli/handlers/change-set.ts +49 -1
  453. package/src/cli/handlers/fan-out.test.ts +228 -1
  454. package/src/cli/handlers/fan-out.ts +53 -6
  455. package/src/cli/handlers/intent-trace.e2e.test.ts +201 -0
  456. package/src/cli/handlers/lifecycle-gc.test.ts +126 -0
  457. package/src/cli/handlers/lifecycle-gc.ts +146 -0
  458. package/src/cli/handlers/operator.test.ts +37 -0
  459. package/src/cli/handlers/pr.test.ts +341 -0
  460. package/src/cli/handlers/pr.ts +292 -47
  461. package/src/cli/handlers/promote.test.ts +669 -7
  462. package/src/cli/handlers/promote.ts +464 -29
  463. package/src/cli/handlers/release-implicit.e2e.test.ts +161 -0
  464. package/src/cli/handlers/release-join.e2e.test.ts +185 -0
  465. package/src/cli/handlers/release-publish-targets.e2e.test.ts +295 -0
  466. package/src/cli/handlers/release-verify.e2e.test.ts +117 -0
  467. package/src/cli/handlers/release-workstation-ci.e2e.test.ts +135 -0
  468. package/src/cli/handlers/release.e2e.test.ts +199 -0
  469. package/src/cli/handlers/release.ts +593 -0
  470. package/src/cli/handlers/run-auto-release.test.ts +80 -0
  471. package/src/cli/handlers/run-events-cmd.test.ts +92 -0
  472. package/src/cli/handlers/run-release.test.ts +55 -0
  473. package/src/cli/handlers/run.test.ts +30 -0
  474. package/src/cli/handlers/run.ts +243 -18
  475. package/src/cli/main.test.ts +8 -0
  476. package/src/cli/main.ts +143 -17
  477. package/src/cli/mcp/never-over-mcp.test.ts +2 -0
  478. package/src/cli/mcp/workspace-tools.ts +1 -1
  479. package/src/cli/parse-args.ts +56 -5
  480. package/src/cli/registry.ts +43 -5
  481. package/src/cli/run-events.ts +57 -0
  482. package/src/cli/version.ts +3 -13
  483. package/src/codegen/docs-in-site.test.ts +166 -0
  484. package/src/codegen/docs-in-site.ts +182 -0
  485. package/src/codegen/docs-site/AgentPrompt.astro +26 -1
  486. package/src/codegen/docs-types.ts +14 -1
  487. package/src/codegen/docs.ts +60 -7
  488. package/src/codegen/rehype-base-url.d.mts +3 -1
  489. package/src/codegen/rehype-base-url.mjs +15 -9
  490. package/src/codegen/rehype-base-url.test.ts +34 -0
  491. package/src/components/auto-release.test.ts +30 -0
  492. package/src/components/auto-release.ts +9 -1
  493. package/src/components/capability.ts +9 -0
  494. package/src/components/cli-support.test.ts +82 -0
  495. package/src/components/cli-support.ts +16 -9
  496. package/src/components/driver.test.ts +24 -0
  497. package/src/components/driver.ts +165 -56
  498. package/src/components/fan-out-inputs.test.ts +85 -0
  499. package/src/components/fan-out-inputs.ts +192 -0
  500. package/src/components/fan-out-record.test.ts +10 -0
  501. package/src/components/fan-out-record.ts +19 -0
  502. package/src/components/fan-out-run.ts +104 -35
  503. package/src/components/fan-out.ts +4 -0
  504. package/src/components/pr-pipeline.ts +35 -4
  505. package/src/components/pr-run.ts +30 -1
  506. package/src/components/promote-order.test.ts +90 -0
  507. package/src/components/promote-order.ts +75 -0
  508. package/src/components/promote.test.ts +10 -1
  509. package/src/components/promote.ts +94 -3
  510. package/src/components/release-compile.test.ts +147 -0
  511. package/src/components/release-compile.ts +459 -0
  512. package/src/components/release-gate.test.ts +215 -0
  513. package/src/components/release-gate.ts +355 -0
  514. package/src/components/release-promote.test.ts +159 -0
  515. package/src/components/release-promote.ts +232 -0
  516. package/src/components/run-progress.ts +7 -0
  517. package/src/components/wave-plan.ts +16 -3
  518. package/src/config.ts +15 -1
  519. package/src/flag-params.test.ts +144 -0
  520. package/src/flag-params.ts +134 -0
  521. package/src/index.ts +2 -0
  522. package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
  523. package/src/lifecycle/change-set-store.test.ts +217 -0
  524. package/src/lifecycle/change-set-store.ts +113 -0
  525. package/src/lifecycle/commit-sha.ts +23 -0
  526. package/src/lifecycle/delivery-metrics.ts +263 -0
  527. package/src/lifecycle/deploy-outcome.ts +147 -0
  528. package/src/lifecycle/gate-change-set.e2e.test.ts +122 -0
  529. package/src/lifecycle/gate-change-set.ts +164 -0
  530. package/src/lifecycle/gate-ledger.test.ts +33 -0
  531. package/src/lifecycle/gate-ledger.ts +68 -3
  532. package/src/lifecycle/git.ts +61 -8
  533. package/src/lifecycle/index.ts +4 -0
  534. package/src/lifecycle/mixed-environment.test.ts +97 -0
  535. package/src/lifecycle/mixed-environment.ts +204 -0
  536. package/src/lifecycle/publish-attachments.ts +196 -0
  537. package/src/lifecycle/publish-credentials.ts +84 -0
  538. package/src/lifecycle/publish-declaration.ts +95 -0
  539. package/src/lifecycle/publish-forge.ts +325 -0
  540. package/src/lifecycle/publish-npm.ts +259 -0
  541. package/src/lifecycle/publish-oci.ts +396 -0
  542. package/src/lifecycle/publish-record.ts +113 -0
  543. package/src/lifecycle/publish-resume.test.ts +168 -0
  544. package/src/lifecycle/publish-targets.test.ts +494 -0
  545. package/src/lifecycle/publish-targets.ts +100 -0
  546. package/src/lifecycle/release-cut-signed.test.ts +180 -0
  547. package/src/lifecycle/release-cut.test.ts +483 -0
  548. package/src/lifecycle/release-cut.ts +503 -0
  549. package/src/lifecycle/release-flag.test.ts +112 -0
  550. package/src/lifecycle/release-join.test.ts +68 -0
  551. package/src/lifecycle/release-join.ts +182 -0
  552. package/src/lifecycle/release-ledger.test.ts +14 -0
  553. package/src/lifecycle/release-ledger.ts +85 -17
  554. package/src/lifecycle/release-publish.test.ts +225 -0
  555. package/src/lifecycle/release-publish.ts +568 -0
  556. package/src/lifecycle/release-revocation.ts +147 -0
  557. package/src/lifecycle/release-store.ts +434 -0
  558. package/src/lifecycle/release-verify.test.ts +110 -0
  559. package/src/lifecycle/release-verify.ts +120 -0
  560. package/src/lifecycle/release-workstation.test.ts +204 -0
  561. package/src/lifecycle/release-workstation.ts +216 -0
  562. package/src/lifecycle/retention-growth.e2e.test.ts +279 -0
  563. package/src/lifecycle/retention-policy.ts +63 -0
  564. package/src/lifecycle/retention.test.ts +363 -0
  565. package/src/lifecycle/retention.ts +508 -0
  566. package/src/lifecycle/run-ledger.test.ts +10 -0
  567. package/src/lifecycle/run-ledger.ts +6 -0
  568. package/src/op/activities/change-coverage.ts +4 -1
  569. package/src/op/activities/source-release.ts +8 -3
  570. package/src/op/activities/source-rollback.ts +8 -4
  571. package/src/op/commit-run-gate-deploy-join.test.ts +117 -0
  572. package/src/op/gate-name.ts +13 -3
  573. package/src/op/gate-release.test.ts +126 -0
  574. package/src/op/gate-run-locator.test.ts +110 -0
  575. package/src/op/gate-run-locator.ts +35 -0
  576. package/src/op/gate.ts +88 -6
  577. package/src/op/local-executor.ts +207 -52
  578. package/src/op/op-waves-run.ts +4 -0
  579. package/src/op/run-events.test.ts +166 -0
  580. package/src/op/run-live.ts +1 -1
  581. package/src/op/runtime.ts +39 -0
  582. package/src/op/runtimes/local.test.ts +16 -0
  583. package/src/op/runtimes/local.ts +9 -0
  584. package/src/plan-summary.test.ts +20 -0
  585. package/src/plan-summary.ts +8 -1
  586. package/src/point-decision.ts +12 -2
  587. package/src/pr-loop.ts +25 -4
  588. package/src/pr-report-url.test.ts +131 -0
  589. package/src/pr-report-url.ts +209 -0
  590. package/src/provenance.ts +2 -2
  591. package/src/run-event-store.test.ts +144 -0
  592. package/src/run-event-store.ts +273 -0
  593. package/src/run-event-stream.test.ts +175 -0
  594. package/src/run-event-stream.ts +309 -0
  595. package/src/run-event.test.ts +277 -0
  596. package/src/run-event.ts +471 -0
  597. package/src/wave-loop-golden.test.ts +9 -0
  598. package/src/workspace/__fixtures__/flag-workspace.ts +132 -0
  599. package/src/workspace/__fixtures__/older-records/change-set-984534ea9.json +100 -0
  600. package/src/workspace/__fixtures__/older-records/older-records.json +326 -0
  601. package/src/workspace/__fixtures__/run-event-check.ts +58 -0
  602. package/src/workspace/ancestry-index.test.ts +93 -0
  603. package/src/workspace/change-set-show.schema.json +102 -0
  604. package/src/workspace/change-set-show.ts +72 -0
  605. package/src/workspace/change-set.schema.json +32 -1
  606. package/src/workspace/changes-cli.ts +10 -1
  607. package/src/workspace/changes.schema.json +135 -0
  608. package/src/workspace/changes.test.ts +1 -1
  609. package/src/workspace/changes.ts +84 -2
  610. package/src/workspace/check.schema.json +4 -2
  611. package/src/workspace/checks/records.ts +35 -1
  612. package/src/workspace/checks.ts +2 -1
  613. package/src/workspace/ci-green-cli.ts +75 -13
  614. package/src/workspace/ci-green-forge.ts +24 -4
  615. package/src/workspace/ci-green-runs.test.ts +242 -0
  616. package/src/workspace/ci-green-signed.test.ts +302 -0
  617. package/src/workspace/ci-green-workflow.test.ts +16 -0
  618. package/src/workspace/ci-green-workflow.ts +12 -0
  619. package/src/workspace/ci-green.test.ts +131 -2
  620. package/src/workspace/ci-green.ts +635 -42
  621. package/src/workspace/ci-last-green.schema.json +32 -2
  622. package/src/workspace/ci-list.schema.json +525 -0
  623. package/src/workspace/commit-links.test.ts +279 -0
  624. package/src/workspace/commit-links.ts +183 -0
  625. package/src/workspace/declaration.schema.json +76 -0
  626. package/src/workspace/declaration.test.ts +28 -0
  627. package/src/workspace/declaration.ts +60 -2
  628. package/src/workspace/declared-kinds.ts +40 -1
  629. package/src/workspace/delivery-metrics.schema.json +519 -0
  630. package/src/workspace/delivery-metrics.test.ts +236 -0
  631. package/src/workspace/delivery-metrics.ts +286 -0
  632. package/src/workspace/flags-read.ts +121 -0
  633. package/src/workspace/flags.test.ts +141 -0
  634. package/src/workspace/flags.ts +157 -0
  635. package/src/workspace/graph-cli.ts +1 -1
  636. package/src/workspace/identity-gate-rule.ts +91 -7
  637. package/src/workspace/identity.ts +14 -1
  638. package/src/workspace/intent-cli.ts +46 -5
  639. package/src/workspace/intent-trace.test.ts +173 -0
  640. package/src/workspace/intent-trace.ts +484 -0
  641. package/src/workspace/intent.schema.json +702 -6
  642. package/src/workspace/intent.ts +196 -26
  643. package/src/workspace/ls.schema.json +3 -1
  644. package/src/workspace/ls.ts +6 -0
  645. package/src/workspace/member-pipeline.test.ts +17 -0
  646. package/src/workspace/member-pipeline.ts +9 -0
  647. package/src/workspace/older-records.test.ts +412 -0
  648. package/src/workspace/overlap.test.ts +165 -0
  649. package/src/workspace/overlap.ts +340 -0
  650. package/src/workspace/promotion-order.ts +97 -0
  651. package/src/workspace/read-contract.e2e.test.ts +5 -1
  652. package/src/workspace/reason-codes.test.ts +7 -1
  653. package/src/workspace/reason-codes.ts +7 -1
  654. package/src/workspace/record-assets.test.ts +2 -1
  655. package/src/workspace/records-contract.e2e.test.ts +2 -1
  656. package/src/workspace/records.schema.json +21 -2
  657. package/src/workspace/records.ts +36 -2
  658. package/src/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  659. package/src/workspace/reference-kinds/flag/flag.schema.json +53 -0
  660. package/src/workspace/releases.schema.json +513 -0
  661. package/src/workspace/releases.test.ts +108 -0
  662. package/src/workspace/releases.ts +133 -0
  663. package/src/workspace/run-event.schema.json +295 -0
  664. package/src/workspace/status-contract.test.ts +81 -1
  665. package/src/workspace/status-gates.ts +64 -1
  666. package/src/workspace/status-mixed.test.ts +152 -0
  667. package/src/workspace/status-revoked.test.ts +153 -0
  668. package/src/workspace/status-stewards.ts +6 -0
  669. package/src/workspace/status.schema.json +268 -2
  670. package/src/workspace/status.ts +334 -4
  671. package/src/workspace/trust/ci-tag-statement.ts +151 -0
  672. package/src/workspace/trust/op-run-statement.ts +148 -0
  673. package/src/workspace/trust/rotation.ts +61 -14
  674. package/src/workspace/trust/seal.ts +10 -0
  675. package/src/workspace/trust/ssh-commit.ts +10 -9
  676. package/src/workspace/wip.ts +11 -2
  677. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/astro.config.mjs +0 -14
  678. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/package.json +0 -16
  679. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content/docs/index.mdx +0 -8
  680. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content.config.ts +0 -15
  681. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/tsconfig.json +0 -10
@@ -16,6 +16,13 @@ describe("parseArgs", () => {
16
16
  expect(() => parseArgs(["graph", "--traffic"])).toThrow(/--traffic needs a level/);
17
17
  });
18
18
 
19
+ test("--before-script is repeatable and keeps its order; --image takes a reference (#4002)", () => {
20
+ const args = parseArgs(["build", "--components", "--generate", "forgejo", "--image", "node:22-bookworm", "--before-script", "npm ci", "--before-script", "-x"]);
21
+ expect(args.image).toBe("node:22-bookworm");
22
+ expect(args.beforeScript).toEqual(["npm ci", "-x"]);
23
+ expect(() => parseArgs(["build", "--before-script"])).toThrow(/--before-script needs a shell line/);
24
+ });
25
+
19
26
  test("--skip-undeclarable reaches live import (#3911)", () => {
20
27
  expect(parseArgs(["import", "--from", "prod"]).skipUndeclarable).toBeUndefined();
21
28
  expect(parseArgs(["import", "--from", "prod", "--skip-undeclarable"]).skipUndeclarable).toBe(true);
@@ -821,6 +828,7 @@ describe("workspace init and ls (#2534)", () => {
821
828
  "workspace ls",
822
829
  "workspace member",
823
830
  "workspace member-run",
831
+ "workspace metrics",
824
832
  "workspace patch",
825
833
  "workspace pin",
826
834
  "workspace points",
package/src/cli/main.ts CHANGED
@@ -114,6 +114,7 @@ const runOpApprove = lazyHandler(runHandlers, (m) => m.runOpApprove);
114
114
  const runOpSignalRenamed = lazyHandler(runHandlers, (m) => m.runOpSignalRenamed);
115
115
  const runOpCancel = lazyHandler(runHandlers, (m) => m.runOpCancel);
116
116
  const runOpLog = lazyHandler(runHandlers, (m) => m.runOpLog);
117
+ const runOpEvents = lazyHandler(runHandlers, (m) => m.runOpEvents);
117
118
  const runWaveHandlers = () => import("./handlers/run-wave");
118
119
  const runOpWaveCommand = lazyHandler(runWaveHandlers, (m) => m.runOpWaveCommand);
119
120
  const operatorHandlers = () => import("./handlers/operator");
@@ -227,22 +228,82 @@ Commands:
227
228
  applied) and path. Read-only.
228
229
 
229
230
  CI:
230
- ci last-green [--json] The newest first-parent commit of ci.green's branch
231
- with a ci/green tag and no ci/revoked tag. Reads local
232
- tags only; fetch them first.
233
- ci tick [--dry-run] [--forge github] Tag each commit within ci.green's
234
- window whose required phases all passed ci/green/<sha>,
235
- and revoke a green one that now fails ci/revoked/<sha>.
236
- Reads check runs from the forge, pushes the tags.
231
+ ci last-green [--json] [--from <rev>] The newest first-parent commit of
232
+ ci.green's branch, or of --from, with a ci/green tag
233
+ and no ci/revoked tag. Reads local tags only; fetch
234
+ them first. With ci.green.signedSince, a tag without a
235
+ valid runner statement is ignored and reported.
236
+ ci list [--json] [--limit <n>] [--since <rev>] [--forge github] [--source checks|runs]
237
+ The first-parent commits of ci.green's branch within
238
+ its window, newest first, each green, revoked or
239
+ undecided with its required phases' results. Reads
240
+ local tags; --forge reads check runs for undecided
241
+ commits, and source runs reads the signed Op runs on
242
+ the local chant/lifecycle. --since replaces the window.
243
+ ci tick [--dry-run] [--forge github] [--source checks|runs] [--key <runner key.pem>]
244
+ Tag each commit within ci.green's window whose
245
+ required phases all passed ci/green/<sha>, and revoke
246
+ a green one that now fails ci/revoked/<sha>. Reads
247
+ check runs from the forge, or with source runs
248
+ (ci.green.source or --source) the Op runs on
249
+ chant/lifecycle that a runner key signed. Pushes the
250
+ tags. --key, or the PEM in CHANT_RUNNER_KEY, signs
251
+ each tag with a runner key.
237
252
  ci workflow [--workflow <name>]... [--output <file>] Write
238
253
  [--chant <command>] [--install <command>]
239
254
  [--token-secret <NAME> | --app-id-var <VAR> --app-key-secret <NAME>]
255
+ [--runner-key-secret <NAME>]
240
256
  .github/workflows/chant-ci-green.yml, which runs the
241
257
  tick when a required workflow completes and every 15m.
242
258
  --chant replaces the npx @intentius/chant pin the tick
243
259
  runs; --install adds a step before it. --token-secret,
244
260
  or a GitHub App's id and key, pushes the tags with a
245
261
  token that may tag commits changing workflow files.
262
+ --runner-key-secret hands the tick the runner key it
263
+ signs its tags with.
264
+
265
+ Releases:
266
+ release cut [<label>] [--yes] [--build <command>] [--param <k=v>]
267
+ [--params-file <file>] [--src <dir>] [-o <file>] [--lexicon <name>]
268
+ [--actor <name>] [--sign [<key file>]] [--json]
269
+ A dry run of a cut of this member from HEAD, which
270
+ must be clean, on trunk and pushed, and carry a
271
+ ci/green tag: compile every environment in the
272
+ config's environments and print what the cut would
273
+ build, record and tag, and what publishes where.
274
+ --yes cuts: builds the artifacts once, stores the
275
+ release on chant/lifecycle under its digest, records
276
+ the actor and run id, tags the commit release/<label>
277
+ here, and prints the next command.
278
+ --build runs before each environment's templates are
279
+ read, with CHANT_ENV set; {env} in --params-file is
280
+ replaced by the environment. --sign signs the cut with
281
+ the actor's ssh key; an identity.gates release entry
282
+ requires it. A project with no components releases
283
+ what chant build --env <env> writes: --src <dir> is
284
+ the build root, -o <file> the output (dist/build.yaml),
285
+ --lexicon narrows it.
286
+ release publish <label|digest> [--yes] [--allow-unsigned]
287
+ [--require-provenance] [--json]
288
+ Publish a cut release to the targets release.publish
289
+ in chant.config.ts declares (npm, OCI registries,
290
+ forge release assets), each with an SBOM and the
291
+ release's provenance. A dry run without --yes.
292
+ Refuses a revoked release, one whose signature does
293
+ not verify against .chant/allowed_signers unless
294
+ --allow-unsigned, and with a target a checkout that
295
+ is not the release's commit. Warns first when the run
296
+ has no OIDC token, so what it publishes carries no
297
+ OIDC provenance; --require-provenance refuses instead.
298
+ release verify <label|digest> [--json]
299
+ Check, offline, that the release was signed by a key
300
+ .chant/allowed_signers lists at the release's commit.
301
+ release list [--json] Every release of this member with its targets, its
302
+ cuts and the environments that run it.
303
+ release export <label|digest> --env <env> [-o <dir>] [--json]
304
+ Write the files the release recorded for <env>, each
305
+ checked against its digest, at their recorded paths
306
+ under <dir> (default: here), for a deploy to read.
246
307
 
247
308
  Change sets:
248
309
  change-set summary <file> The grouped plan summary of a change-set
@@ -251,6 +312,10 @@ Change sets:
251
312
  replacement, failure and hole named.
252
313
  markdown fits an MR/PR note of --limit
253
314
  characters (default 65536). Read-only.
315
+ change-set show <digest> The change set a pull-request or release gate
316
+ [--member <name>] [--json] bound, stored on
317
+ chant/lifecycle under its digest, each
318
+ entry with its graph node. Read-only.
254
319
 
255
320
  Ops:
256
321
  run <name> Run an Op on the resolved runtime (--on; local by default)
@@ -260,11 +325,18 @@ Ops:
260
325
  its Drift outcome is true (WatchOp failOn: "drift")
261
326
  --no-record: a test run that records nothing on
262
327
  chant/lifecycle and pushes nothing (local runtime)
328
+ --key <runner key.pem>, or the PEM in
329
+ CHANT_RUNNER_KEY: sign the run's record with a runner
330
+ key, so ci tick from runs counts it (#4044)
263
331
  run list List all Ops with the runtime's state for each
264
332
  run status <name> Show the runtime's state for one Op's latest run
265
333
  run approve <op> <gate> Record a gate's resolution and wake the runtime
266
334
  run cancel <name> Cancel the active run (requires --force)
267
335
  run log <name> Show run history for an Op
336
+ run events <run> Replay a run's events kept on this host (a run id, or
337
+ an Op or component name for its newest run). --json
338
+ prints the run-event lines; --follow streams a run in
339
+ progress until run-settle (#4042)
268
340
  run wave --spec <file> --wave <k> Plan, gate and apply wave k of an Op
269
341
  waves spec (#3679): the job a generated waves
270
342
  pipeline runs. --decide plans and decides only;
@@ -293,12 +365,19 @@ Ops:
293
365
  run, and prints that order first (#3950).
294
366
  On success, auto-emits a release-ledger record per
295
367
  component that published a digest (default: on;
296
- --no-release-record to opt out; #597)
368
+ --no-release-record to opt out; #597).
369
+ --release <label|digest>: the run is of that release,
370
+ cut from this checkout's commit; the records name it (#4043)
297
371
  --progress-json: stream one NDJSON RunProgressEvent
298
372
  per line to stdout while the run executes, for a
299
373
  consumer to render live wave/component/phase/step
300
374
  progress instead of tailing raw logs (additive; run
301
375
  semantics/exit code unchanged)
376
+ --events-json: stream the run's events instead, one
377
+ run-event.schema.json line each, with the run id,
378
+ commit and runtime on every line (#4041). Also on
379
+ run <op>, components promote|rollback|redeploy,
380
+ fan-out, pr-plan and pr-apply
302
381
  operator Run scheduled ticks for discovered ConvergeOps
303
382
  locally (#1485): acquire/renew a per-op
304
383
  lease (git ref CAS), tick on --interval, record every
@@ -387,6 +466,13 @@ Workspace (level 1, #2524):
387
466
  beside it and marks the members whose digests differ.
388
467
  Read only; never fetches. --json prints the
389
468
  read-contract document
469
+ workspace metrics [dir] [--env <env>] [--member <name>] [--since <date>] [--json]
470
+ The four DORA metrics per member and environment
471
+ (#4039): deployment frequency, lead time from commit
472
+ to running release, change failure rate and time to
473
+ restore, from the deploy records, releases and ci
474
+ revoked tags. Eight weeks back by default. Read only;
475
+ never fetches. --json prints the read-contract document
390
476
  workspace records [--kind <kind file>] [--current] [--uncommitted | --at <rev>] [--base <rev>] [--require attested] [--json]
391
477
  Without --kind, every record kind the declaration
392
478
  names. Read the records a record kind locates, validated
@@ -664,7 +750,13 @@ Workspace (level 1, #2524):
664
750
  the severity (warn by default) and ignore globs. When
665
751
  the declaration at base has writeScope or agents, each
666
752
  commit that writes outside its writer's scope fails
667
- the check (write-scope-member, write-scope-kind)
753
+ the check (write-scope-member, write-scope-kind). Each
754
+ first-parent commit of the range should name its work
755
+ item in a Chant-Record: <work kind>:<id> or a
756
+ Chant-Lease trailer. commit-unlinked is a commit that
757
+ names none, commit-wrongly-linked one whose trailers
758
+ name no work item that exists; both follow the
759
+ severity
668
760
  workspace patch <base>..<head>|<base>...<head>|<commit> [--path <p>...] [--max-bytes <n>] [--json]
669
761
  workspace patch [<commit>] --worktree [--path <p>...] [--max-bytes <n>] [--json]
670
762
  The hunks of a diff, file by file: a range, a work
@@ -695,7 +787,7 @@ Workspace (level 1, #2524):
695
787
  Each composite instance the members declare, with the
696
788
  components whose contract can deploy it; an instance
697
789
  with none lists an empty set
698
- workspace graph --intent <path[:start-end]|path#symbol> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]
790
+ workspace graph --intent <path[:start-end]|path#symbol|member/node|sha> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]
699
791
  The intent graph over one region: the commits that
700
792
  touched it, the decisions whose constrains cover it,
701
793
  the artifacts they pin, and findings with closed codes.
@@ -734,6 +826,13 @@ Lifecycle (alias: lc):
734
826
  executes the plan (production-like names also need
735
827
  --confirm-prod, or an interactive confirmation)
736
828
  lifecycle log [env] History of lifecycle snapshots
829
+ lifecycle gc [--yes] [--push] [--json]
830
+ Prune stored change sets, releases and run event
831
+ files by the retention policy (#4036). A dry run
832
+ without --yes; --yes writes one commit removing
833
+ them on the local chant/lifecycle and deletes the
834
+ run event files; --push pushes it. History is
835
+ never rewritten, and the ledgers are never pruned
737
836
 
738
837
  Plan scenarios (#1292):
739
838
  scenario check Evaluate every declared Scenario's expect clause
@@ -772,7 +871,11 @@ Component release ledger + status:
772
871
  --member <name>, both commands: a workspace
773
872
  member's loop, gate op pr-<n>-<member>;
774
873
  --resume <file> finishes an apply that failed
775
- partway under the same approval)
874
+ partway under the same approval;
875
+ --events-json, both commands: the run-event
876
+ stream on stdout; --report-url <s3 or file URL>,
877
+ both commands: copy the report, the change set
878
+ and the events to <url>/<pr>/<commit>/)
776
879
  components release <env> Append one immutable release record
777
880
  (--component <name> --digest <sha256:...>
778
881
  [--git-sha <sha>] [--run-id <id>] [--actor <name>]);
@@ -787,13 +890,18 @@ Component release ledger + status:
787
890
  byte-for-byte plus a self-describing manifest.json
788
891
  components promote Deploy the digests one environment's release
789
892
  ledger records to another, without a build
790
- (--from <env> --to <env> [--component <name>
791
- [--digest <sha256:...>]]; --dry-run prints the
792
- plan; the target's gates still apply)
893
+ (--to <env> [--from <env>] [--allow-skip]
894
+ [--release <label|digest>]
895
+ [--component <name> [--digest <sha256:...>]];
896
+ --from defaults to the environment before --to
897
+ in the config's environments; --dry-run prints
898
+ the plan; the target's gates still apply)
793
899
  components rollback <env> Redeploy an earlier release of an environment
794
900
  from its recorded digest (--component <name>
795
901
  [--digest <sha256:...>]; defaults to the release
796
- before the current one; --dry-run prints the plan)
902
+ before the current one; --dry-run prints the plan).
903
+ --release <label|digest> restores every component
904
+ of that release through the release gate (#4035)
797
905
  components redeploy <env> Redeploy the release an environment's ledger
798
906
  records as current, after a deploy that failed
799
907
  partway (--component <name> [--digest <sha256:...>];
@@ -934,7 +1042,7 @@ Options:
934
1042
  chant.config.ts's build.sandbox: true; #1045)
935
1043
  --param <name=value> (build, graph, run --components, components fan-out,
936
1044
  components promote, components rollback,
937
- components redeploy) Bind a
1045
+ components redeploy, release cut) Bind a
938
1046
  declared build-time parameter (chant.config.ts's buildParams)
939
1047
  to a value, for source to read as params.<name>
940
1048
  (#1064) instead of process.env — repeatable.
@@ -946,7 +1054,7 @@ Options:
946
1054
  chant.template.json declares instead (#2627).
947
1055
  --params-file <path> (build, graph, run --components, components fan-out,
948
1056
  components promote, components rollback,
949
- components redeploy) JSON file
1057
+ components redeploy, release cut) JSON file
950
1058
  of { "name": value } build-time parameter values
951
1059
  (#1064). Second precedence, after --param.
952
1060
  init --from refuses it: pass --param instead.
@@ -1195,10 +1303,22 @@ export const commandRegistry: CommandDef[] = [
1195
1303
  { name: "carve status", handler: runCarveStatus },
1196
1304
  // #3573 — which commits passed CI, kept as ci/green and ci/revoked tags (ws-103). Imported on first use.
1197
1305
  { name: "ci last-green", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli")).runCiLastGreen(ctx) },
1306
+ { name: "ci list", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli")).runCiList(ctx) },
1198
1307
  { name: "ci tick", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli")).runCiTick(ctx) },
1199
1308
  { name: "ci workflow", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli")).runCiWorkflow(ctx) },
1309
+ // #4026: the release cut from a green commit (ws-104). Imported on first use.
1310
+ { name: "release cut", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release")).runReleaseCut(ctx) },
1311
+ // #4027: publish a cut release, to the targets #4047 declares.
1312
+ { name: "release publish", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release")).runReleasePublish(ctx) },
1313
+ // #4049: check a release's signature offline.
1314
+ { name: "release verify", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release")).runReleaseVerify(ctx) },
1315
+ { name: "release list", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release")).runReleaseList(ctx) },
1316
+ { name: "release export", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release")).runReleaseExport(ctx) },
1317
+ { name: "release compile", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release")).runReleaseCompile(ctx) },
1200
1318
  // #3188 — the grouped plan summary of a change-set document. Reads one file; imported on first use.
1201
1319
  { name: "change-set summary", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/change-set")).runChangeSetSummary(ctx) },
1320
+ // #4022: the change set a gate bound, read from chant/lifecycle by its digest.
1321
+ { name: "change-set show", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/change-set")).runChangeSetShow(ctx) },
1202
1322
  { name: "init", handler: runInit, runsNoConfig: true },
1203
1323
  { name: "init lexicon", handler: runInitLexicon },
1204
1324
  { name: "update", handler: runUpdate },
@@ -1220,6 +1340,7 @@ export const commandRegistry: CommandDef[] = [
1220
1340
  { name: "run signal", handler: runOpSignalRenamed },
1221
1341
  { name: "run cancel", handler: runOpCancel },
1222
1342
  { name: "run log", handler: runOpLog },
1343
+ { name: "run events", handler: runOpEvents },
1223
1344
  { name: "run wave", handler: runOpWaveCommand },
1224
1345
  // #3683 — start the CI jobs that wait at gates whose approval arrived. Imported on first use.
1225
1346
  { name: "run resume", handler: async (ctx) => (await import("./handlers/gate-resume")).runResumeCommand(ctx) },
@@ -1249,6 +1370,8 @@ export const commandRegistry: CommandDef[] = [
1249
1370
  { name: "workspace work", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/work-cli")).runWorkspaceWork(ctx) },
1250
1371
  // #3033 — the agent run record: what each run cost and which commits it made. chant records runs and never starts one.
1251
1372
  { name: "workspace runs", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/runs-cli")).runWorkspaceRuns(ctx) },
1373
+ // #4039 — DORA metrics from the deploy, release and revocation records.
1374
+ { name: "workspace metrics", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/delivery-metrics")).runWorkspaceMetrics(ctx) },
1252
1375
  { name: "workspace status", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/status")).runWorkspaceStatus(ctx) },
1253
1376
  { name: "workspace lineage", handler: async (ctx) => (await import("../workspace/lineage-cli")).runWorkspaceLineage(ctx) },
1254
1377
  { name: "workspace upgrade", handler: async (ctx) => (await import("../workspace/lineage-upgrade-cli")).runWorkspaceUpgrade(ctx) },
@@ -1299,6 +1422,8 @@ export const commandRegistry: CommandDef[] = [
1299
1422
  { name: "lifecycle whoami", requiresPlugins: true, handler: runLifecycleWhoami },
1300
1423
  { name: "lifecycle teardown", requiresPlugins: true, handler: runLifecycleTeardown },
1301
1424
  { name: "lifecycle log", handler: runLifecycleLog },
1425
+ // #4036 — retention's garbage collection. Imported on first use.
1426
+ { name: "lifecycle gc", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/lifecycle-gc")).runLifecycleGc(ctx) },
1302
1427
 
1303
1428
  // Plan scenarios (#1292) — fully offline, no plugin network calls, but
1304
1429
  // requiresPlugins:true so the build step has serializers to partition
@@ -1335,6 +1460,7 @@ export const commandRegistry: CommandDef[] = [
1335
1460
  { name: "dev", handler: runDevUnknown },
1336
1461
  { name: "serve", handler: runServeUnknown },
1337
1462
  { name: "components", handler: runComponentsUnknown },
1463
+ { name: "release", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release")).runReleaseUnknown(ctx) },
1338
1464
  { name: "workspace", handler: async (ctx) => (await import("../workspace/records-cli")).runWorkspaceUnknown(ctx) },
1339
1465
  ];
1340
1466
 
@@ -217,6 +217,8 @@ describe("neverOverMcp (chant#3447)", () => {
217
217
  const gateOnlyOps: Array<{ op: string; gate: string }> = [
218
218
  { op: "workspace-upgrade", gate: "." },
219
219
  { op: "pr-12", gate: "pr-apply" },
220
+ // #4045: a release gate approves a change to an environment, as a pull request's does.
221
+ { op: "release", gate: "prod-release" },
220
222
  ];
221
223
 
222
224
  for (const { op, gate } of gateOnlyOps) {
@@ -126,7 +126,7 @@ export const workspaceReadTools: ToolDefinition[] = [
126
126
  {
127
127
  name: "workspace-changes",
128
128
  description:
129
- "The forward coverage check over a diff: chant workspace check --changes <range> --json (changes.schema.json, #2773). Each changed path with the current records whose constrains cover it, and a change-uncovered or change-out-of-scope finding for each gap, at the severity the declaration's changes block sets. Returns the document unchanged.",
129
+ "The forward coverage check over a diff: chant workspace check --changes <range> --json (changes.schema.json, #2773). Each changed path with the current records whose constrains cover it, and a change-uncovered or change-out-of-scope finding for each gap, at the severity the declaration's changes block sets. links says whether each trunk commit of the range names its work item, with commit-unlinked and commit-wrongly-linked findings at the same severity. Returns the document unchanged.",
130
130
  inputSchema: {
131
131
  type: "object",
132
132
  properties: {
@@ -48,6 +48,8 @@ const BOOLEAN_FLAGS = new Set([
48
48
  "--local",
49
49
  "--json",
50
50
  "--progress-json",
51
+ "--events-json",
52
+ "--follow",
51
53
  "--update-snapshot",
52
54
  "--update-baseline",
53
55
  "--run-examples",
@@ -71,11 +73,16 @@ const BOOLEAN_FLAGS = new Set([
71
73
  "--current",
72
74
  "--uncommitted",
73
75
  "--allow-code",
76
+ "--allow-skip",
77
+ "--allow-unsigned",
78
+ "--require-provenance",
74
79
  "--root-only",
75
80
  "--generated",
76
81
  "--decide",
77
82
  "--record-plans",
78
83
  "--loopback",
84
+ "--artifacts",
85
+ "--push",
79
86
  ]);
80
87
 
81
88
  /**
@@ -191,8 +198,9 @@ export function parseArgs(args: string[]): ParsedArgs {
191
198
  result.overlayAnchor = v;
192
199
  } else if (arg === "--from") {
193
200
  // Shared by `migrate --from <lexicon>`, `import --from <env>`,
194
- // `components promote --from <env>` and `init --from <repo>@<ref>`;
195
- // the commands never run together, so one field carries all four.
201
+ // `components promote --from <env>`, `init --from <repo>@<ref>` and
202
+ // `ci last-green --from <rev>` (#4031); the commands never run
203
+ // together, so one field carries all five.
196
204
  result.migrateFrom = args[++i];
197
205
  } else if (arg === "--kustomize") {
198
206
  // `chant import --kustomize <dir>` (#1548): render the overlay, import
@@ -243,6 +251,9 @@ export function parseArgs(args: string[]): ParsedArgs {
243
251
  result.dryRun = true;
244
252
  } else if (arg === "--yes") {
245
253
  result.yes = true;
254
+ } else if (arg === "--push") {
255
+ // `chant lifecycle gc --yes --push` (#4036): push the prune commit.
256
+ result.push = true;
246
257
  } else if (arg === "--confirm-prod") {
247
258
  result.confirmProd = true;
248
259
  } else if (arg === "--strict") {
@@ -370,8 +381,23 @@ export function parseArgs(args: string[]): ParsedArgs {
370
381
  if (!result.forge || result.forge.startsWith("-")) throw new Error("--forge needs a forge: --forge github|gitlab|forgejo");
371
382
  } else if (arg === "--require-review") {
372
383
  result.requireReview = true;
384
+ } else if (arg === "--report-url") {
385
+ // `chant components pr-plan|pr-apply --report-url <url>` (#4007).
386
+ const url = args[++i];
387
+ if (!url || url.startsWith("-")) throw new Error("--report-url needs a URL: --report-url s3://<bucket>/<prefix> or file://<directory>");
388
+ result.reportUrl = url;
389
+ } else if (arg === "--allow-unsigned") {
390
+ // `chant release publish --allow-unsigned` (#4049).
391
+ result.allowUnsigned = true;
392
+ } else if (arg === "--require-provenance") {
393
+ // `chant release publish --require-provenance` (#4049).
394
+ result.requireProvenance = true;
373
395
  } else if (arg === "--pr-loop") {
374
396
  result.prLoop = true;
397
+ } else if (arg === "--before-script") {
398
+ const line = args[++i];
399
+ if (line === undefined || line === "") throw new Error("--before-script needs a shell line: --before-script '<line>'");
400
+ (result.beforeScript ??= []).push(line);
375
401
  } else if (arg === "--resume") {
376
402
  // `chant approve <op> <gate> --resume` (#3683) takes no value; the
377
403
  // fan-out and pull-request apply take the attempt file they resume.
@@ -384,6 +410,11 @@ export function parseArgs(args: string[]): ParsedArgs {
384
410
  result.json = true;
385
411
  } else if (arg === "--progress-json") {
386
412
  result.progressJson = true;
413
+ } else if (arg === "--events-json") {
414
+ result.eventsJson = true;
415
+ } else if (arg === "--follow") {
416
+ // `chant run events <run> --follow` (#4042): tail a run in progress on this host.
417
+ result.follow = true;
387
418
  } else if (arg === "--gated-exit") {
388
419
  // `chant run <op> --gated-exit <code>` (#2243) — remap only the gated
389
420
  // outcome's exit code. Parsed as a number here and range-checked in the
@@ -413,11 +444,11 @@ export function parseArgs(args: string[]): ParsedArgs {
413
444
  // `chant workspace graph --composites` (#2662)
414
445
  result.composites = true;
415
446
  } else if (arg === "--intent") {
416
- // `chant workspace graph --intent <path[:start-end]|path#symbol>` (#2651), or `--intent --record <id>` with no region.
447
+ // `chant workspace graph --intent <path[:start-end]|path#symbol|member/node|sha>` (#2651), or `--intent --record <id>` with no region.
417
448
  const value = args[i + 1];
418
449
  if (value !== undefined && !value.startsWith("-")) result.intent = args[++i];
419
450
  else if (args.includes("--record")) result.intent = "";
420
- else throw new Error("--intent needs a region: --intent <path[:start-end]|path#symbol>, or --intent --record <id>");
451
+ else throw new Error("--intent needs a region: --intent <path[:start-end]|path#symbol|member/node|sha>, or --intent --record <id>");
421
452
  } else if (arg === "--follow-squash") {
422
453
  // `chant workspace graph --intent ... --follow-squash` and `chant workspace runs --follow-squash` (#3035)
423
454
  result.followSquash = true;
@@ -502,6 +533,10 @@ export function parseArgs(args: string[]): ParsedArgs {
502
533
  } else if (arg === "--app-key-secret") {
503
534
  result.ciAppKeySecret = args[++i];
504
535
  if (!result.ciAppKeySecret || result.ciAppKeySecret.startsWith("-")) throw new Error("--app-key-secret needs the secret holding the App's private key: --app-key-secret <NAME>");
536
+ } else if (arg === "--runner-key-secret") {
537
+ // `chant ci workflow --runner-key-secret <NAME>` (#4031): the secret holding the runner key the tick signs its tags with.
538
+ result.ciRunnerKeySecret = args[++i];
539
+ if (!result.ciRunnerKeySecret || result.ciRunnerKeySecret.startsWith("-")) throw new Error("--runner-key-secret needs the repository secret holding the runner key, such as CHANT_RUNNER_KEY: --runner-key-secret <NAME>");
505
540
  } else if (arg === "--verdict") {
506
541
  // `chant workspace records review <id> --verdict agree|dissent|abstain` (#2670)
507
542
  result.verdict = args[++i];
@@ -588,6 +623,17 @@ export function parseArgs(args: string[]): ParsedArgs {
588
623
  if (result.digest !== undefined) (result.digests ??= []).push(result.digest);
589
624
  } else if (arg === "--release-plan") {
590
625
  result.releasePlanFile = args[++i];
626
+ } else if (arg === "--release") {
627
+ // `chant components promote --release <label|digest>` (#4026)
628
+ result.release = args[++i];
629
+ if (!result.release || result.release.startsWith("-")) throw new Error("--release needs a release's label or digest: --release <label|digest>");
630
+ } else if (arg === "--build") {
631
+ // `chant release cut --build <command>` (#4026)
632
+ result.buildCommand = args[++i];
633
+ if (!result.buildCommand) throw new Error("--build needs a shell command: --build '<command>'");
634
+ } else if (arg === "--artifacts") {
635
+ // `chant release compile --artifacts` (#4026, internal)
636
+ result.artifacts = true;
591
637
  } else if (arg === "--git-sha") {
592
638
  result.gitSha = args[++i];
593
639
  } else if (arg === "--run-id") {
@@ -712,10 +758,15 @@ export function parseArgs(args: string[]): ParsedArgs {
712
758
  // #2550 — `chant workspace upgrade` runs a template's code migrations
713
759
  // only when asked to.
714
760
  result.allowCode = true;
761
+ } else if (arg === "--allow-skip") {
762
+ // #4030 — `chant components promote` skips a step of the member's
763
+ // declared promotion order only when asked to.
764
+ result.allowSkip = true;
715
765
  } else if (arg === "--source") {
716
766
  // #2551 — `chant workspace upgrade --source <repo>[#<member>]`.
717
767
  result.source = args[++i];
718
- if (!result.source || result.source.startsWith("-")) throw new Error("--source needs a template: --source <repo>[#<member>]");
768
+ // #4044: also `chant ci tick|list --source checks|runs`.
769
+ if (!result.source || result.source.startsWith("-")) throw new Error("--source needs a template: --source <repo>[#<member>] for workspace upgrade, or a source for ci tick and ci list: --source checks|runs");
719
770
  } else if (arg === "--tags") {
720
771
  // #2551 — `chant workspace adopt-lineage --tags <glob>`, also hash-index and versions.
721
772
  result.tags = args[++i];
@@ -72,6 +72,16 @@ export interface ParsedArgs {
72
72
  * unchanged; omitted (undefined, not false) when the flag isn't passed.
73
73
  */
74
74
  progressJson?: boolean;
75
+ /**
76
+ * `--events-json` (#4041) — stream the run's events to stdout, one
77
+ * `run-event.schema.json` line each (`../../run-event.ts`), on `chant run
78
+ * <op>`, `chant run --components`, `components promote|rollback|redeploy`,
79
+ * `components fan-out` and `components pr-plan|pr-apply`. Refused beside
80
+ * `--progress-json`, which prints the older shapes to the same stdout.
81
+ */
82
+ eventsJson?: boolean;
83
+ /** `chant run events <run> --follow` (#4042) — stream the run's events as they happen, until `run-settle`. */
84
+ follow?: boolean;
75
85
  live: boolean;
76
86
  /** `chant migrate --from <name>` (default "github") */
77
87
  migrateFrom?: string;
@@ -137,6 +147,12 @@ export interface ParsedArgs {
137
147
  namespace?: string;
138
148
  /** `chant workspace upgrade --allow-code` (#2550) — run migrations whose body is the template's own code. */
139
149
  allowCode?: boolean;
150
+ /** `chant components promote --allow-skip` (#4030): promote past a step of the member's declared promotion order. */
151
+ allowSkip?: boolean;
152
+ /** `chant release publish --allow-unsigned` (#4049): publish a release with no signature that verifies, with a warning. Never overrides identity.gates.release. */
153
+ allowUnsigned?: boolean;
154
+ /** `chant release publish --require-provenance` (#4049): refuse a run with no OIDC token, where it warns. */
155
+ requireProvenance?: boolean;
140
156
  /** `chant workspace upgrade --source <repo>[#<member>]` (#2551): move the scope to another template. */
141
157
  source?: string;
142
158
  /** `chant workspace adopt-lineage --tags <glob>` and `hash-index --tags` (#2551): the tags to compare. */
@@ -152,6 +168,8 @@ export interface ParsedArgs {
152
168
  /** `chant lifecycle teardown <env> --yes` — execute the planned deletion
153
169
  * (#1222). Without it the command plans and stops. */
154
170
  yes?: boolean;
171
+ /** `chant lifecycle gc --yes --push` (#4036): push the commit the prune wrote to chant/lifecycle. Without it the prune stays local. */
172
+ push?: boolean;
155
173
  /** `chant lifecycle teardown <env> --yes --confirm-prod` — the non-interactive
156
174
  * form of the extra confirmation a production-like environment name demands
157
175
  * (#1222). Meaningless without `--yes`. */
@@ -160,15 +178,21 @@ export interface ParsedArgs {
160
178
  verbatim?: boolean;
161
179
  /** `chant import --skip-undeclarable` — import what can be declared and warn about the live objects that cannot, instead of failing */
162
180
  skipUndeclarable?: boolean;
163
- /** `chant lifecycle … --src <dir>` — build root override for lifecycle commands */
181
+ /** `chant lifecycle … --src <dir>` — build root override for lifecycle commands. Also `chant release cut --src <dir>` (#4046): the build root of a project with no components. */
164
182
  src?: string;
165
183
  /** `--env <name>` — active environment: sets CHANT_ENV so env-aware source
166
184
  * re-evaluates for that environment (`build` + `graph`), and drives policy. */
167
185
  env?: string;
168
186
  /** `chant emulator up --port <container-port>=<host-port>`, repeatable (#3673); a bare `<host-port>` when one emulator is selected. */
169
187
  port?: string[];
170
- /** `chant emulator up --image <ref>` (#3952): the image to start, when one emulator is selected. */
188
+ /**
189
+ * `chant emulator up --image <ref>` (#3952): the image to start, when one
190
+ * emulator is selected. `chant build --components --generate --image <ref>`
191
+ * (#4002): the image every generated job runs in.
192
+ */
171
193
  image?: string;
194
+ /** `chant build --components --generate --before-script <line>`, repeatable (#4002): shell lines every generated job runs before its command. */
195
+ beforeScript?: string[];
172
196
  /** `chant emulator up --network <name>` (#3952): the Docker network each started container joins. */
173
197
  network?: string;
174
198
  /** `chant emulator up --setting <KEY>=<VALUE>`, repeatable (#3952): an emulator setting such as `FLOCI_<NAME>`, passed as `-e`. */
@@ -290,6 +314,12 @@ export interface ParsedArgs {
290
314
  * request. Needs `--forge`.
291
315
  */
292
316
  requireReview?: boolean;
317
+ /**
318
+ * `chant components pr-plan|pr-apply --report-url <url>` (#4007) — copy
319
+ * the stage's report, change set and run events to `<url>/<pr>/<commit>/`,
320
+ * an `s3://` or `file://` URL, the events as each wave and component settles.
321
+ */
322
+ reportUrl?: string;
293
323
  /**
294
324
  * `chant build --components --generate <lexicon> --pr-loop` (#3183) —
295
325
  * generate the pull-request pipeline: plan on the pull request, apply on
@@ -386,7 +416,7 @@ export interface ParsedArgs {
386
416
  noCache?: boolean;
387
417
  /** `chant workspace graph --composites` (#2662): print each composite instance with the components that can deploy it. */
388
418
  composites?: boolean;
389
- /** `chant workspace graph --intent <path[:start-end]|path#symbol>` (#2651): the region the intent graph is over. Empty with `--record`. */
419
+ /** `chant workspace graph --intent <path[:start-end]|path#symbol|member/node|sha>` (#2651): the region the intent graph is over. Empty with `--record`. */
390
420
  intent?: string;
391
421
  /** `chant workspace graph --intent` and `chant workspace runs` (#3035): follow squash merges to their pull requests' original commits, fetching missing pull request refs. */
392
422
  followSquash?: boolean;
@@ -434,6 +464,8 @@ export interface ParsedArgs {
434
464
  ciAppIdVar?: string;
435
465
  /** `chant ci workflow --app-key-secret <NAME>` (#3573): the secret holding that App's private key. */
436
466
  ciAppKeySecret?: string;
467
+ /** `chant ci workflow --runner-key-secret <NAME>` (#4031): the secret holding the runner key the tick signs its tags with. */
468
+ ciRunnerKeySecret?: string;
437
469
  /**
438
470
  * `chant workspace records review <id> --by <principal>` (#2670): the
439
471
  * reviewer, as the caller names them. Also `chant workspace records new
@@ -460,7 +492,7 @@ export interface ParsedArgs {
460
492
  prefix?: string;
461
493
  /** `chant workspace records|verify --require attested` (#2547): the provenance level a gate requires. */
462
494
  require?: string;
463
- /** `chant workspace evidence sign --key` (a runner's Ed25519 PEM) and `signers sign --key` (an ssh private key) (#2553). */
495
+ /** `chant workspace evidence sign --key` (a runner's Ed25519 PEM) and `signers sign --key` (an ssh private key) (#2553). Also `chant ci tick --key` (#4031): the runner key the tick signs its tags with. */
464
496
  key?: string;
465
497
  /** `chant workspace evidence sign --check-id <id>` (#2553): the check the evidence is for. */
466
498
  checkId?: string;
@@ -541,6 +573,12 @@ export interface ParsedArgs {
541
573
  digest?: string;
542
574
  /** `chant components release record --release-plan <file>` (ws-055, #2733) — path to a release plan JSON file, persisted content-addressed to `_plans/<digest>.json` on chant/lifecycle and read back through the read contract (`chant workspace status --json`). The plan's own `digest` field supplies `--digest` when it is omitted, and must match it when both are given. Distinct from `--plan` (#2300, below), the Op gate-approval plan digest. */
543
575
  releasePlanFile?: string;
576
+ /** `chant components promote --release <label|digest>` (#4026): deploy under that release, reading the templates its target for `--to` recorded. `chant run --components --release <label|digest>` (#4043): the run is of that release, which must have been cut from the checked-out commit and have a target for `--env`; the release records the run writes name it. */
577
+ release?: string;
578
+ /** `chant release cut --build <command>` (#4026): the shell command run in the member's directory before each environment's templates are read, with `CHANT_ENV` set to the environment. */
579
+ buildCommand?: string;
580
+ /** `chant release compile --artifacts` (#4026, internal): build the artifacts of `--component` instead of compiling the environment. */
581
+ artifacts?: boolean;
544
582
  /** Every `--digest` value, in order (#2602). `chant components promote --digest <component>=<sha256:...>` is repeatable, one per component; the other commands read the single {@link digest}. */
545
583
  digests?: string[];
546
584
  /** `chant components release record --git-sha <sha>` (#568) — git commit the deploy was built from. */
@@ -634,7 +672,7 @@ export interface ParsedArgs {
634
672
  plan?: string;
635
673
  /** `chant operator log --op <name>` (#2029) — restrict the tick history to one ConvergeOp by name. Omitted, every discovered ConvergeOp's ticks are merged into one timeline. */
636
674
  op?: string;
637
- /** `chant operator log --since <iso>` (#2029) — only entries at or after this ISO-8601 instant. `chant workspace records --since <rev>` (#2673) — the revision to compare the records with. */
675
+ /** `chant operator log --since <iso>` (#2029) — only entries at or after this ISO-8601 instant. `chant workspace records --since <rev>` (#2673) — the revision to compare the records with. `chant workspace metrics --since <date>` (#4039) — the start of the window the metrics count. */
638
676
  since?: string;
639
677
  /** `chant operator log --limit <n>` (#2029) — keep only the newest n entries (still printed oldest-first). */
640
678
  limit?: number;