@intentius/chant 0.124.31 → 0.124.33

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 (509) hide show
  1. package/bin/chant +7 -2
  2. package/dist/ci-jobs.d.ts +4 -0
  3. package/dist/ci-jobs.d.ts.map +1 -1
  4. package/dist/ci-jobs.js +9 -2
  5. package/dist/cli/commands/check-lexicon-plugin.d.ts +7 -4
  6. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  7. package/dist/cli/commands/check-lexicon-plugin.js +10 -7
  8. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  9. package/dist/cli/commands/check-lexicon.js +18 -12
  10. package/dist/cli/commands/import.d.ts +10 -0
  11. package/dist/cli/commands/import.d.ts.map +1 -1
  12. package/dist/cli/commands/import.js +37 -0
  13. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  14. package/dist/cli/commands/init-lexicon/templates/project.js +4 -3
  15. package/dist/cli/commands/onboard.d.ts.map +1 -1
  16. package/dist/cli/commands/onboard.js +8 -4
  17. package/dist/cli/commands/update.d.ts.map +1 -1
  18. package/dist/cli/commands/update.js +2 -1
  19. package/dist/cli/dependencies.d.ts +18 -0
  20. package/dist/cli/dependencies.d.ts.map +1 -0
  21. package/dist/cli/dependencies.js +120 -0
  22. package/dist/cli/handlers/build.d.ts.map +1 -1
  23. package/dist/cli/handlers/build.js +38 -4
  24. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  25. package/dist/cli/handlers/fan-out.js +12 -4
  26. package/dist/cli/handlers/graph.d.ts.map +1 -1
  27. package/dist/cli/handlers/graph.js +16 -6
  28. package/dist/cli/handlers/lifecycle-health.d.ts +16 -0
  29. package/dist/cli/handlers/lifecycle-health.d.ts.map +1 -0
  30. package/dist/cli/handlers/lifecycle-health.js +150 -0
  31. package/dist/cli/handlers/lifecycle.d.ts +26 -0
  32. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  33. package/dist/cli/handlers/lifecycle.js +1 -1
  34. package/dist/cli/handlers/lint.d.ts.map +1 -1
  35. package/dist/cli/handlers/lint.js +6 -0
  36. package/dist/cli/handlers/operator.d.ts +2 -2
  37. package/dist/cli/handlers/operator.js +3 -3
  38. package/dist/cli/handlers/pr.d.ts +16 -0
  39. package/dist/cli/handlers/pr.d.ts.map +1 -1
  40. package/dist/cli/handlers/pr.js +610 -32
  41. package/dist/cli/handlers/promote.d.ts.map +1 -1
  42. package/dist/cli/handlers/promote.js +19 -2
  43. package/dist/cli/handlers/release.d.ts +16 -1
  44. package/dist/cli/handlers/release.d.ts.map +1 -1
  45. package/dist/cli/handlers/release.js +83 -11
  46. package/dist/cli/handlers/run.d.ts +13 -1
  47. package/dist/cli/handlers/run.d.ts.map +1 -1
  48. package/dist/cli/handlers/run.js +38 -15
  49. package/dist/cli/main.d.ts.map +1 -1
  50. package/dist/cli/main.js +121 -33
  51. package/dist/cli/parse-args.d.ts.map +1 -1
  52. package/dist/cli/parse-args.js +37 -0
  53. package/dist/cli/registry.d.ts +29 -6
  54. package/dist/cli/registry.d.ts.map +1 -1
  55. package/dist/cli/registry.js +6 -2
  56. package/dist/codegen/generate-post-synth-barrel.js +2 -2
  57. package/dist/codegen/lexicon-regen.d.ts +4 -0
  58. package/dist/codegen/lexicon-regen.d.ts.map +1 -1
  59. package/dist/codegen/lexicon-regen.js +1 -1
  60. package/dist/codegen/pinned-upgrade.js +2 -2
  61. package/dist/components/capability.d.ts +44 -3
  62. package/dist/components/capability.d.ts.map +1 -1
  63. package/dist/components/capability.js +21 -0
  64. package/dist/components/changed-files.d.ts +7 -1
  65. package/dist/components/changed-files.d.ts.map +1 -1
  66. package/dist/components/changed-files.js +9 -1
  67. package/dist/components/deploy-inputs.d.ts +91 -0
  68. package/dist/components/deploy-inputs.d.ts.map +1 -0
  69. package/dist/components/deploy-inputs.js +184 -0
  70. package/dist/components/driver.d.ts +38 -0
  71. package/dist/components/driver.d.ts.map +1 -1
  72. package/dist/components/driver.js +56 -6
  73. package/dist/components/fan-out-record.d.ts +6 -1
  74. package/dist/components/fan-out-record.d.ts.map +1 -1
  75. package/dist/components/fan-out-record.js +24 -0
  76. package/dist/components/fan-out-run.d.ts +20 -0
  77. package/dist/components/fan-out-run.d.ts.map +1 -1
  78. package/dist/components/fan-out-run.js +21 -1
  79. package/dist/components/gate-plan.d.ts +8 -0
  80. package/dist/components/gate-plan.d.ts.map +1 -1
  81. package/dist/components/gate-plan.js +6 -0
  82. package/dist/components/pr-pipeline.d.ts +98 -12
  83. package/dist/components/pr-pipeline.d.ts.map +1 -1
  84. package/dist/components/pr-pipeline.js +146 -23
  85. package/dist/components/pr-run.d.ts +128 -30
  86. package/dist/components/pr-run.d.ts.map +1 -1
  87. package/dist/components/pr-run.js +290 -70
  88. package/dist/components/release-compile.d.ts +37 -2
  89. package/dist/components/release-compile.d.ts.map +1 -1
  90. package/dist/components/release-compile.js +64 -8
  91. package/dist/components/release-promote.d.ts +17 -3
  92. package/dist/components/release-promote.d.ts.map +1 -1
  93. package/dist/components/release-promote.js +79 -18
  94. package/dist/components/verbs/bom-writer.d.ts +1 -1
  95. package/dist/components/verbs/bom-writer.d.ts.map +1 -1
  96. package/dist/components/verbs/lockfile-sbom-generator.d.ts +20 -0
  97. package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -1
  98. package/dist/components/verbs/lockfile-sbom-generator.js +41 -4
  99. package/dist/components/wave-plan.d.ts +15 -2
  100. package/dist/components/wave-plan.d.ts.map +1 -1
  101. package/dist/components/wave-plan.js +44 -5
  102. package/dist/discovery/fold-import.d.ts.map +1 -1
  103. package/dist/discovery/fold-import.js +16 -6
  104. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  105. package/dist/discovery/sandbox/bundle.js +6 -0
  106. package/dist/discovery/specifier-resolve.d.ts.map +1 -1
  107. package/dist/discovery/specifier-resolve.js +8 -2
  108. package/dist/fold/fold.d.ts.map +1 -1
  109. package/dist/fold/fold.js +68 -1
  110. package/dist/fold/subset.d.ts +37 -0
  111. package/dist/fold/subset.d.ts.map +1 -1
  112. package/dist/fold/subset.js +88 -0
  113. package/dist/graph-detail.d.ts.map +1 -1
  114. package/dist/graph-detail.js +32 -7
  115. package/dist/health.d.ts +110 -0
  116. package/dist/health.d.ts.map +1 -0
  117. package/dist/health.js +105 -0
  118. package/dist/health.schema.json +191 -0
  119. package/dist/lexicon-module.d.ts +10 -0
  120. package/dist/lexicon-module.d.ts.map +1 -1
  121. package/dist/lexicon-module.js +53 -8
  122. package/dist/lexicon-plugin-helpers.d.ts.map +1 -1
  123. package/dist/lexicon-plugin-helpers.js +6 -4
  124. package/dist/lexicon.d.ts +29 -0
  125. package/dist/lexicon.d.ts.map +1 -1
  126. package/dist/lifecycle/affected.d.ts.map +1 -1
  127. package/dist/lifecycle/affected.js +7 -1
  128. package/dist/lifecycle/merge-record.d.ts +104 -0
  129. package/dist/lifecycle/merge-record.d.ts.map +1 -0
  130. package/dist/lifecycle/merge-record.js +102 -0
  131. package/dist/lifecycle/publish-attachments.d.ts +8 -5
  132. package/dist/lifecycle/publish-attachments.d.ts.map +1 -1
  133. package/dist/lifecycle/publish-attachments.js +27 -13
  134. package/dist/lifecycle/publish-npm.d.ts +3 -2
  135. package/dist/lifecycle/publish-npm.d.ts.map +1 -1
  136. package/dist/lifecycle/publish-npm.js +4 -3
  137. package/dist/lifecycle/release-at.d.ts +40 -0
  138. package/dist/lifecycle/release-at.d.ts.map +1 -0
  139. package/dist/lifecycle/release-at.js +83 -0
  140. package/dist/lifecycle/release-cut.d.ts.map +1 -1
  141. package/dist/lifecycle/release-cut.js +23 -12
  142. package/dist/lifecycle/release-ledger.d.ts +21 -0
  143. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  144. package/dist/lifecycle/release-ledger.js +24 -0
  145. package/dist/lifecycle/release-publish.d.ts +28 -12
  146. package/dist/lifecycle/release-publish.d.ts.map +1 -1
  147. package/dist/lifecycle/release-publish.js +29 -17
  148. package/dist/lifecycle/release-store.d.ts +25 -2
  149. package/dist/lifecycle/release-store.d.ts.map +1 -1
  150. package/dist/lifecycle/release-store.js +40 -13
  151. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  152. package/dist/lifecycle/run-ledger.js +1 -0
  153. package/dist/lifecycle/work-dir.d.ts +45 -0
  154. package/dist/lifecycle/work-dir.d.ts.map +1 -0
  155. package/dist/lifecycle/work-dir.js +78 -0
  156. package/dist/lint/discover.d.ts +17 -9
  157. package/dist/lint/discover.d.ts.map +1 -1
  158. package/dist/lint/discover.js +62 -54
  159. package/dist/lint/rules/op/index.d.ts +2 -1
  160. package/dist/lint/rules/op/index.d.ts.map +1 -1
  161. package/dist/lint/rules/op/index.js +4 -2
  162. package/dist/lint/rules/op/ops018-shell-image-digest.d.ts +10 -0
  163. package/dist/lint/rules/op/ops018-shell-image-digest.d.ts.map +1 -0
  164. package/dist/lint/rules/op/ops018-shell-image-digest.js +38 -0
  165. package/dist/module-source.d.ts +57 -0
  166. package/dist/module-source.d.ts.map +1 -0
  167. package/dist/module-source.js +104 -0
  168. package/dist/op/activities/activity-contracts.d.ts +5 -0
  169. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  170. package/dist/op/activities/activity-contracts.js +3 -0
  171. package/dist/op/activities/factory.js +1 -1
  172. package/dist/op/activities/shell.d.ts +38 -0
  173. package/dist/op/activities/shell.d.ts.map +1 -1
  174. package/dist/op/activities/shell.js +89 -3
  175. package/dist/op/builders.d.ts +7 -0
  176. package/dist/op/builders.d.ts.map +1 -1
  177. package/dist/op/builders.js +7 -0
  178. package/dist/op/discover.d.ts.map +1 -1
  179. package/dist/op/discover.js +13 -3
  180. package/dist/op/gate.d.ts.map +1 -1
  181. package/dist/op/gate.js +3 -0
  182. package/dist/op/op-waves-run.d.ts.map +1 -1
  183. package/dist/op/op-waves-run.js +20 -5
  184. package/dist/op/operator.d.ts +2 -2
  185. package/dist/op/operator.js +2 -2
  186. package/dist/op/runtime.d.ts +2 -0
  187. package/dist/op/runtime.d.ts.map +1 -1
  188. package/dist/op/steward.d.ts +6 -4
  189. package/dist/op/steward.d.ts.map +1 -1
  190. package/dist/op/steward.js +5 -3
  191. package/dist/op/work-lease-run.d.ts +20 -7
  192. package/dist/op/work-lease-run.d.ts.map +1 -1
  193. package/dist/op/work-lease-run.js +56 -12
  194. package/dist/pr-forge.d.ts +10 -0
  195. package/dist/pr-forge.d.ts.map +1 -1
  196. package/dist/pr-forge.js +39 -0
  197. package/dist/pr-loop.d.ts +155 -7
  198. package/dist/pr-loop.d.ts.map +1 -1
  199. package/dist/pr-loop.js +137 -11
  200. package/dist/pr-report-url.d.ts +4 -4
  201. package/dist/pr-report-url.d.ts.map +1 -1
  202. package/dist/pr-report-url.js +5 -5
  203. package/dist/runner-start.d.ts +179 -0
  204. package/dist/runner-start.d.ts.map +1 -0
  205. package/dist/runner-start.js +277 -0
  206. package/dist/ts-loader.d.ts +38 -4
  207. package/dist/ts-loader.d.ts.map +1 -1
  208. package/dist/ts-loader.js +190 -16
  209. package/dist/wave-runtime.mjs +238 -231
  210. package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts +34 -0
  211. package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts.map +1 -0
  212. package/dist/workspace/chant-migrations/fountain-retired-kinds.js +176 -0
  213. package/dist/workspace/chant-migrations.d.ts.map +1 -1
  214. package/dist/workspace/chant-migrations.js +2 -0
  215. package/dist/workspace/check.schema.json +70 -2
  216. package/dist/workspace/checks/boxes.d.ts +6 -6
  217. package/dist/workspace/checks/boxes.js +9 -9
  218. package/dist/workspace/checks/security.d.ts +35 -0
  219. package/dist/workspace/checks/security.d.ts.map +1 -0
  220. package/dist/workspace/checks/security.js +305 -0
  221. package/dist/workspace/checks.d.ts +2 -0
  222. package/dist/workspace/checks.d.ts.map +1 -1
  223. package/dist/workspace/checks.js +5 -0
  224. package/dist/workspace/ci-builds.d.ts +163 -0
  225. package/dist/workspace/ci-builds.d.ts.map +1 -0
  226. package/dist/workspace/ci-builds.js +315 -0
  227. package/dist/workspace/ci-green-cli.d.ts +2 -1
  228. package/dist/workspace/ci-green-cli.d.ts.map +1 -1
  229. package/dist/workspace/ci-green-cli.js +25 -5
  230. package/dist/workspace/ci-green-forge.d.ts +18 -4
  231. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  232. package/dist/workspace/ci-green-forge.js +12 -0
  233. package/dist/workspace/ci-green-workflow.d.ts +55 -1
  234. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  235. package/dist/workspace/ci-green-workflow.js +128 -1
  236. package/dist/workspace/ci-green.d.ts +117 -16
  237. package/dist/workspace/ci-green.d.ts.map +1 -1
  238. package/dist/workspace/ci-green.js +358 -43
  239. package/dist/workspace/ci-last-green.schema.json +49 -0
  240. package/dist/workspace/ci-list.schema.json +47 -7
  241. package/dist/workspace/ci-report-url.d.ts +18 -0
  242. package/dist/workspace/ci-report-url.d.ts.map +1 -0
  243. package/dist/workspace/ci-report-url.js +33 -0
  244. package/dist/workspace/ci-run-index.d.ts +13 -1
  245. package/dist/workspace/ci-run-index.d.ts.map +1 -1
  246. package/dist/workspace/ci-run-index.js +6 -4
  247. package/dist/workspace/ci-run-index.schema.json +6 -4
  248. package/dist/workspace/ci-run.d.ts +85 -6
  249. package/dist/workspace/ci-run.d.ts.map +1 -1
  250. package/dist/workspace/ci-run.js +262 -64
  251. package/dist/workspace/ci-runner-key.d.ts +16 -3
  252. package/dist/workspace/ci-runner-key.d.ts.map +1 -1
  253. package/dist/workspace/ci-runner-key.js +30 -10
  254. package/dist/workspace/ci-runner-start.d.ts +77 -0
  255. package/dist/workspace/ci-runner-start.d.ts.map +1 -0
  256. package/dist/workspace/ci-runner-start.js +185 -0
  257. package/dist/workspace/ci-serve.d.ts +130 -11
  258. package/dist/workspace/ci-serve.d.ts.map +1 -1
  259. package/dist/workspace/ci-serve.js +323 -40
  260. package/dist/workspace/declaration.d.ts +25 -0
  261. package/dist/workspace/declaration.d.ts.map +1 -1
  262. package/dist/workspace/declaration.js +14 -2
  263. package/dist/workspace/declaration.schema.json +30 -2
  264. package/dist/workspace/export.d.ts +1 -1
  265. package/dist/workspace/export.d.ts.map +1 -1
  266. package/dist/workspace/export.js +7 -3
  267. package/dist/workspace/ls.d.ts +8 -1
  268. package/dist/workspace/ls.d.ts.map +1 -1
  269. package/dist/workspace/ls.js +2 -1
  270. package/dist/workspace/ls.schema.json +9 -2
  271. package/dist/workspace/member-pipeline.d.ts +1 -0
  272. package/dist/workspace/member-pipeline.d.ts.map +1 -1
  273. package/dist/workspace/member-pipeline.js +2 -0
  274. package/dist/workspace/merge-record.schema.json +49 -0
  275. package/dist/workspace/pin-integrity.d.ts.map +1 -1
  276. package/dist/workspace/pin-integrity.js +3 -2
  277. package/dist/workspace/pr-report.schema.json +75 -8
  278. package/dist/workspace/reason-codes.d.ts +18 -1
  279. package/dist/workspace/reason-codes.d.ts.map +1 -1
  280. package/dist/workspace/reason-codes.js +20 -2
  281. package/dist/workspace/release-candidates.d.ts +129 -0
  282. package/dist/workspace/release-candidates.d.ts.map +1 -0
  283. package/dist/workspace/release-candidates.js +233 -0
  284. package/dist/workspace/release-candidates.schema.json +353 -0
  285. package/dist/workspace/run-event.schema.json +3 -1
  286. package/dist/workspace/security.d.ts +40 -0
  287. package/dist/workspace/security.d.ts.map +1 -0
  288. package/dist/workspace/security.js +99 -0
  289. package/dist/workspace/status.schema.json +3 -1
  290. package/dist/workspace/write-scope.d.ts +9 -0
  291. package/dist/workspace/write-scope.d.ts.map +1 -1
  292. package/dist/workspace/write-scope.js +11 -1
  293. package/package.json +8 -1
  294. package/src/__fixtures__/pr-loop/pr-apply-wave-waiting.note.golden.md +48 -0
  295. package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +1 -1
  296. package/src/ci-jobs.ts +11 -2
  297. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +3 -3
  298. package/src/cli/commands/audit.test.ts +2 -2
  299. package/src/cli/commands/check-lexicon-plugin.test.ts +9 -0
  300. package/src/cli/commands/check-lexicon-plugin.ts +11 -8
  301. package/src/cli/commands/check-lexicon.test.ts +1 -1
  302. package/src/cli/commands/check-lexicon.ts +16 -11
  303. package/src/cli/commands/import.ts +40 -0
  304. package/src/cli/commands/init-lexicon/templates/project.ts +4 -3
  305. package/src/cli/commands/init-lexicon.test.ts +8 -5
  306. package/src/cli/commands/onboard.test.ts +45 -0
  307. package/src/cli/commands/onboard.ts +8 -4
  308. package/src/cli/commands/update.test.ts +6 -0
  309. package/src/cli/commands/update.ts +4 -1
  310. package/src/cli/compiled-cli.e2e.test.ts +76 -11
  311. package/src/cli/dependencies.e2e.test.ts +101 -0
  312. package/src/cli/dependencies.test.ts +93 -0
  313. package/src/cli/dependencies.ts +122 -0
  314. package/src/cli/handlers/build.test.ts +105 -0
  315. package/src/cli/handlers/build.ts +35 -4
  316. package/src/cli/handlers/fan-out.test.ts +73 -0
  317. package/src/cli/handlers/fan-out.ts +11 -4
  318. package/src/cli/handlers/graph.test.ts +76 -0
  319. package/src/cli/handlers/graph.ts +19 -12
  320. package/src/cli/handlers/lifecycle-health.test.ts +123 -0
  321. package/src/cli/handlers/lifecycle-health.ts +157 -0
  322. package/src/cli/handlers/lifecycle.ts +1 -1
  323. package/src/cli/handlers/lint.test.ts +42 -0
  324. package/src/cli/handlers/lint.ts +6 -0
  325. package/src/cli/handlers/operator.ts +3 -3
  326. package/src/cli/handlers/pr-deploy-inputs.test.ts +209 -0
  327. package/src/cli/handlers/pr-record.test.ts +201 -0
  328. package/src/cli/handlers/pr-waves.test.ts +449 -0
  329. package/src/cli/handlers/pr.test.ts +156 -0
  330. package/src/cli/handlers/pr.ts +648 -33
  331. package/src/cli/handlers/promote.test.ts +43 -1
  332. package/src/cli/handlers/promote.ts +19 -3
  333. package/src/cli/handlers/release-cut-at.e2e.test.ts +115 -0
  334. package/src/cli/handlers/release-publish-targets.e2e.test.ts +2 -2
  335. package/src/cli/handlers/release-verify.e2e.test.ts +12 -10
  336. package/src/cli/handlers/release.e2e.test.ts +19 -28
  337. package/src/cli/handlers/release.ts +81 -11
  338. package/src/cli/handlers/run-components-exit.test.ts +99 -0
  339. package/src/cli/handlers/run-signer.test.ts +79 -0
  340. package/src/cli/handlers/run.ts +34 -16
  341. package/src/cli/main.test.ts +18 -0
  342. package/src/cli/main.ts +120 -33
  343. package/src/cli/parse-args.ts +28 -0
  344. package/src/cli/registry.ts +35 -8
  345. package/src/codegen/generate-post-synth-barrel.ts +2 -2
  346. package/src/codegen/lexicon-regen.ts +1 -1
  347. package/src/codegen/pinned-upgrade.ts +2 -2
  348. package/src/codegen/post-synth-barrel-guards.test.ts +6 -11
  349. package/src/components/capability.ts +51 -3
  350. package/src/components/changed-files.test.ts +16 -1
  351. package/src/components/changed-files.ts +9 -1
  352. package/src/components/deploy-inputs.test.ts +108 -0
  353. package/src/components/deploy-inputs.ts +225 -0
  354. package/src/components/driver.test.ts +36 -1
  355. package/src/components/driver.ts +87 -4
  356. package/src/components/fan-out-record.ts +29 -1
  357. package/src/components/fan-out-run.test.ts +35 -0
  358. package/src/components/fan-out-run.ts +40 -1
  359. package/src/components/gate-plan.ts +9 -0
  360. package/src/components/pr-pipeline.test.ts +100 -0
  361. package/src/components/pr-pipeline.ts +184 -28
  362. package/src/components/pr-run.test.ts +323 -18
  363. package/src/components/pr-run.ts +355 -76
  364. package/src/components/release-compile.test.ts +34 -0
  365. package/src/components/release-compile.ts +89 -8
  366. package/src/components/release-promote.test.ts +55 -2
  367. package/src/components/release-promote.ts +93 -23
  368. package/src/components/verbs/bom-writer.ts +1 -1
  369. package/src/components/verbs/lockfile-sbom-generator.test.ts +36 -0
  370. package/src/components/verbs/lockfile-sbom-generator.ts +43 -5
  371. package/src/components/wave-plan.ts +48 -8
  372. package/src/discovery/fold-host-method.test.ts +87 -0
  373. package/src/discovery/fold-import.ts +15 -5
  374. package/src/discovery/fold-package-composite.test.ts +27 -0
  375. package/src/discovery/fold-specifiers.test.ts +8 -0
  376. package/src/discovery/sandbox/bundle.ts +6 -0
  377. package/src/discovery/specifier-resolve.ts +8 -2
  378. package/src/fold/fold.test.ts +72 -0
  379. package/src/fold/fold.ts +71 -0
  380. package/src/fold/subset.test.ts +31 -0
  381. package/src/fold/subset.ts +99 -0
  382. package/src/graph-detail.test.ts +57 -0
  383. package/src/graph-detail.ts +33 -7
  384. package/src/health.schema.json +191 -0
  385. package/src/health.test.ts +62 -0
  386. package/src/health.ts +178 -0
  387. package/src/lexicon-dist.e2e.test.ts +254 -0
  388. package/src/lexicon-module.test.ts +47 -0
  389. package/src/lexicon-module.ts +49 -7
  390. package/src/lexicon-plugin-helpers.ts +6 -4
  391. package/src/lexicon.ts +43 -1
  392. package/src/lifecycle/affected.test.ts +7 -0
  393. package/src/lifecycle/affected.ts +6 -1
  394. package/src/lifecycle/merge-record.test.ts +111 -0
  395. package/src/lifecycle/merge-record.ts +154 -0
  396. package/src/lifecycle/publish-attachments.ts +25 -13
  397. package/src/lifecycle/publish-npm.ts +4 -3
  398. package/src/lifecycle/publish-targets.test.ts +34 -4
  399. package/src/lifecycle/release-at.test.ts +48 -0
  400. package/src/lifecycle/release-at.ts +100 -0
  401. package/src/lifecycle/release-cut.test.ts +41 -0
  402. package/src/lifecycle/release-cut.ts +22 -11
  403. package/src/lifecycle/release-ledger.ts +34 -0
  404. package/src/lifecycle/release-publish.test.ts +43 -13
  405. package/src/lifecycle/release-publish.ts +38 -18
  406. package/src/lifecycle/release-store.ts +57 -13
  407. package/src/lifecycle/run-ledger.test.ts +13 -0
  408. package/src/lifecycle/run-ledger.ts +1 -0
  409. package/src/lifecycle/work-dir.test.ts +77 -0
  410. package/src/lifecycle/work-dir.ts +82 -0
  411. package/src/lint/discover.test.ts +46 -2
  412. package/src/lint/discover.ts +55 -49
  413. package/src/lint/rules/op/index.ts +4 -2
  414. package/src/lint/rules/op/ops018-shell-image-digest.test.ts +60 -0
  415. package/src/lint/rules/op/ops018-shell-image-digest.ts +48 -0
  416. package/src/module-source.test.ts +85 -0
  417. package/src/module-source.ts +112 -0
  418. package/src/op/activities/activity-contracts.ts +3 -0
  419. package/src/op/activities/factory.ts +1 -1
  420. package/src/op/activities/shell-container.e2e.test.ts +67 -0
  421. package/src/op/activities/shell.test.ts +44 -1
  422. package/src/op/activities/shell.ts +110 -3
  423. package/src/op/builders.ts +7 -0
  424. package/src/op/discover-root.test.ts +31 -2
  425. package/src/op/discover.ts +14 -4
  426. package/src/op/gate.test.ts +30 -0
  427. package/src/op/gate.ts +3 -0
  428. package/src/op/op-waves-run.ts +20 -5
  429. package/src/op/op-waves.test.ts +49 -0
  430. package/src/op/operator.ts +2 -2
  431. package/src/op/runtime.ts +2 -0
  432. package/src/op/step-console.test.ts +4 -2
  433. package/src/op/steward.ts +6 -4
  434. package/src/op/work-lease-run.test.ts +88 -2
  435. package/src/op/work-lease-run.ts +52 -12
  436. package/src/pr-forge-bundle.test.ts +2 -2
  437. package/src/pr-forge.test.ts +42 -0
  438. package/src/pr-forge.ts +40 -0
  439. package/src/pr-loop-bundle.test.ts +2 -1
  440. package/src/pr-loop.test.ts +146 -1
  441. package/src/pr-loop.ts +278 -17
  442. package/src/pr-report-url.ts +7 -7
  443. package/src/runner-start-bundle.test.ts +29 -0
  444. package/src/runner-start.test.ts +179 -0
  445. package/src/runner-start.ts +329 -0
  446. package/src/terraform/__fixtures__/advise.test.ts +21 -2
  447. package/src/ts-loader.test.ts +89 -1
  448. package/src/ts-loader.ts +180 -13
  449. package/src/workspace/changes.test.ts +1 -1
  450. package/src/workspace/chant-migrations/fountain-retired-kinds.test.ts +33 -0
  451. package/src/workspace/chant-migrations/fountain-retired-kinds.ts +190 -0
  452. package/src/workspace/chant-migrations.e2e.test.ts +5 -0
  453. package/src/workspace/chant-migrations.ts +2 -0
  454. package/src/workspace/check-contract.test.ts +3 -2
  455. package/src/workspace/check.schema.json +70 -2
  456. package/src/workspace/checks/boxes.ts +9 -9
  457. package/src/workspace/checks/security.test.ts +138 -0
  458. package/src/workspace/checks/security.ts +305 -0
  459. package/src/workspace/checks.ts +5 -0
  460. package/src/workspace/ci-builds.e2e.test.ts +208 -0
  461. package/src/workspace/ci-builds.test.ts +174 -0
  462. package/src/workspace/ci-builds.ts +385 -0
  463. package/src/workspace/ci-green-builds.test.ts +180 -0
  464. package/src/workspace/ci-green-cli.test.ts +54 -0
  465. package/src/workspace/ci-green-cli.ts +26 -5
  466. package/src/workspace/ci-green-forge.ts +30 -4
  467. package/src/workspace/ci-green-runs.test.ts +53 -11
  468. package/src/workspace/ci-green-workflow.test.ts +84 -1
  469. package/src/workspace/ci-green-workflow.ts +139 -2
  470. package/src/workspace/ci-green.test.ts +6 -3
  471. package/src/workspace/ci-green.ts +408 -48
  472. package/src/workspace/ci-last-green.schema.json +49 -0
  473. package/src/workspace/ci-list.schema.json +47 -7
  474. package/src/workspace/ci-report-url.test.ts +220 -0
  475. package/src/workspace/ci-report-url.ts +33 -0
  476. package/src/workspace/ci-run-index.schema.json +6 -4
  477. package/src/workspace/ci-run-index.test.ts +42 -3
  478. package/src/workspace/ci-run-index.ts +19 -5
  479. package/src/workspace/ci-run.test.ts +203 -8
  480. package/src/workspace/ci-run.ts +295 -63
  481. package/src/workspace/ci-runner-key.test.ts +55 -17
  482. package/src/workspace/ci-runner-key.ts +36 -11
  483. package/src/workspace/ci-runner-start.test.ts +151 -0
  484. package/src/workspace/ci-runner-start.ts +193 -0
  485. package/src/workspace/ci-serve-builds.test.ts +86 -0
  486. package/src/workspace/ci-serve.test.ts +209 -6
  487. package/src/workspace/ci-serve.ts +341 -42
  488. package/src/workspace/declaration.schema.json +30 -2
  489. package/src/workspace/declaration.test.ts +40 -0
  490. package/src/workspace/declaration.ts +40 -3
  491. package/src/workspace/export.ts +6 -3
  492. package/src/workspace/ls.schema.json +9 -2
  493. package/src/workspace/ls.ts +10 -4
  494. package/src/workspace/member-pipeline.ts +2 -1
  495. package/src/workspace/merge-record.schema.json +49 -0
  496. package/src/workspace/pin-integrity.test.ts +5 -0
  497. package/src/workspace/pin-integrity.ts +3 -2
  498. package/src/workspace/pr-report.schema.json +75 -8
  499. package/src/workspace/reason-codes.test.ts +2 -0
  500. package/src/workspace/reason-codes.ts +20 -2
  501. package/src/workspace/release-candidates.schema.json +353 -0
  502. package/src/workspace/release-candidates.test.ts +106 -0
  503. package/src/workspace/release-candidates.ts +315 -0
  504. package/src/workspace/run-event.schema.json +3 -1
  505. package/src/workspace/security.test.ts +70 -0
  506. package/src/workspace/security.ts +118 -0
  507. package/src/workspace/status.schema.json +3 -1
  508. package/src/workspace/write-scope.test.ts +29 -1
  509. package/src/workspace/write-scope.ts +12 -1
@@ -8,26 +8,42 @@
8
8
  * everything before applying anything is what makes the two digests
9
9
  * comparable: each member is planned against the same state both times.
10
10
  *
11
- * ## Dependents read the outputs standing now
11
+ * ## What a dependent is planned against
12
12
  *
13
13
  * A member that reads another one's output through `stackOutput()` is
14
- * planned with the value that output has now, read through the capability's
15
- * `outputs` (`readComponentOutputs`). When the change moves that output, the
16
- * dependent's approved plan still carries the old value; the apply applies
17
- * it as approved and marks the member `inputsMoved`, and the next run plans
18
- * it against the new value. A change that must carry a moved output through
19
- * its dependents in one rollout is what gated waves are for (#3049): each
20
- * wave is planned after the one before it applied.
14
+ * planned with one of three values (#3999):
21
15
  *
22
- * A dependency the change did not select is read the same way (#4104), so
23
- * a change to one cluster plans it against the network it sits on. That is
24
- * why `components` is every component in the project and not the selection.
25
- * `--seed-outputs` wins over a read, and a dependency whose steps cannot say
26
- * leaves its dependents' references unresolved. The apply stage's plan reads
27
- * the same dependencies, so on the same estate it gets the digest the plan
28
- * stage showed, and it applies against the outputs its plans read
29
- * (`set.outputs`). A resume plans against the outputs the approved plans
30
- * read, from the record (`planOutputs`), and reads nothing those cover.
16
+ * - the upstream is in the change too: the value its plan says it will
17
+ * expose (`CapabilityPlan.outputs`). The report lists these under
18
+ * `plannedOutputs`.
19
+ * - the upstream is not in the change (#4104): the value it has now, read
20
+ * through its capability's `outputs` (`readComponentOutputs`). The report
21
+ * lists these under `deployedOutputs`. A change to one cluster is planned
22
+ * against the network it sits on, which is why `components` is every
23
+ * component in the project and not the selection.
24
+ * - the upstream is in the change and its plan cannot say, or says the value
25
+ * is known only after apply: no value. The dependent's members list the
26
+ * reference under `unknownInputs`, and the approval does not cover what
27
+ * it will do with it.
28
+ *
29
+ * `--seed-outputs` wins over both. The apply stage's plan reads the same
30
+ * values, so on the same estate it gets the digest the plan stage showed.
31
+ * A resume plans against the outputs the approved plans read, from the
32
+ * record (`planOutputs`), and reads nothing those cover.
33
+ *
34
+ * ## Planning again once an upstream applied
35
+ *
36
+ * The apply runs each member's approved plan, except a member whose plan
37
+ * read an upstream output that is not the value standing when its turn
38
+ * comes (`movedWiringReferences`): the upstream applied as another value
39
+ * than its plan said, or the value was unknown. That member, and what is
40
+ * downstream of it, is held back. Once the rest settled, the held members
41
+ * are planned again against the outputs the apply left, and that set's
42
+ * digest is decided at its own gate, `<gate>-round-<n>` (`prRoundGate`), as
43
+ * a gated wave decides each wave (#3049). Approved, it applies, and a member
44
+ * that is held again goes to the next round. Not approved, the apply stops
45
+ * `waiting` with the new digest named, and the same apply with its
46
+ * `--resume` record carries on from there.
31
47
  *
32
48
  * ## Finishing an apply that failed partway
33
49
  *
@@ -41,15 +57,24 @@
41
57
  * the rest applies. Planning everything again would give the applied members
42
58
  * empty plans and the set a new digest, and so ask for a second approval of
43
59
  * work already approved.
60
+ *
61
+ * ## A gate per wave on merge
62
+ *
63
+ * `pr-apply --wave-gate` (#4003) applies the approved set a wave at a time.
64
+ * {@link prWavePlan} narrows the derivation to one wave, which is planned
65
+ * against the outputs the waves before it left, and {@link waveNotCovered}
66
+ * says whether the approved change set covers what it planned, by the same
67
+ * test a resume uses ({@link planCoveredBy}). Covered, the wave applies under
68
+ * the pull request's approval; not covered, it needs its own.
44
69
  */
45
70
  import { composeChangeSet, verifyChangeSetDigest } from "../change-set.js";
46
71
  import { evaluateGate } from "../op/gate.js";
47
- import { memberCounts, PR_REPORT_CONTRACT, PR_REPORT_SCHEMA_ID, } from "../pr-loop.js";
48
- import { deployContext } from "./driver.js";
72
+ import { memberCounts, PR_APPLY_GATE, prRoundGate, PR_REPORT_CONTRACT, PR_REPORT_SCHEMA_ID, } from "../pr-loop.js";
73
+ import { deployContext, movedWiringReferences, unresolvedWiringReferences, } from "./driver.js";
49
74
  import { deployUnits } from "./deploy-units.js";
50
75
  import { runFanOut } from "./fan-out-run.js";
51
76
  import { remainingFanOut } from "./fan-out.js";
52
- import { planWaveComponent, readDeployedOutputs } from "./wave-plan.js";
77
+ import { capabilitySteps, planWaveComponent, readDeployedOutputs } from "./wave-plan.js";
53
78
  /** The phase a pull request's planning is, in its run's events. */
54
79
  export const PR_PLAN_PHASE = "plan";
55
80
  /** A failed component's members: the units its steps target, else the component itself. */
@@ -61,36 +86,51 @@ function failedParts(component, error) {
61
86
  }));
62
87
  }
63
88
  /**
64
- * Plan every component in `plan.order`, a wave at a time, each against the
65
- * outputs its dependencies have now. Never throws for a component that fails
66
- * to plan: it becomes a failed member, and `failed` is set. Throws when a
67
- * planned member's dependency is not among `components`, which means the
68
- * caller passed the selection where the whole graph belongs.
89
+ * Plan every component in `plan.order`, a wave at a time, each against its
90
+ * dependencies' planned outputs when the change plans them too, and against
91
+ * the outputs they have now otherwise. Never throws for a component that
92
+ * fails to plan: it becomes a failed member, and `failed` is set. Throws
93
+ * when a planned member's dependency is not among `components`, which means
94
+ * the caller passed the selection where the whole graph belongs.
69
95
  */
70
96
  export async function planPrSet(options) {
71
97
  const byName = new Map(options.components.map((c) => [c.name, c]));
72
98
  const outputs = { ...(options.seededOutputs ?? {}) };
73
99
  const read = new Set(Object.keys(outputs));
100
+ const inChange = new Set(options.plan.order);
101
+ /** What each component of the change planned to expose, once its wave planned. */
102
+ const plannedBy = new Map();
74
103
  const deployed = {};
104
+ const planned = {};
75
105
  const parts = [];
76
106
  const componentOf = new Map();
107
+ const unknownOf = new Map();
77
108
  const plans = {};
78
109
  let failed = false;
79
110
  const emit = options.onRunEvent;
80
111
  emit?.({ type: "phase-start", component: null, phase: PR_PLAN_PHASE });
81
112
  for (const wave of options.plan.waves) {
82
- // The dependencies' outputs first, each read once. A dependency that
83
- // cannot say leaves its references unresolved, which its dependent's
84
- // plan reports if it needs them. A dependency outside the selection is
85
- // read the same way (#4104).
113
+ // The dependencies' outputs first, each once. One the change plans is
114
+ // read from its plan, which an earlier wave made (#3999). Any other is
115
+ // read from the deployed estate (#4104). A dependency that cannot say
116
+ // leaves its references unresolved, which its dependent's plan reports
117
+ // if it needs them.
86
118
  const deps = [...new Set(wave.flatMap((name) => byName.get(name)?.dependsOn ?? []))].filter((dep) => !read.has(dep));
119
+ const fromEstate = [];
87
120
  for (const dep of deps) {
88
121
  read.add(dep);
89
122
  if (!byName.has(dep))
90
123
  throw new Error(`planPrSet: ${dep}, a dependency of a planned member, is not among the components; pass every component in the project`);
124
+ if (!inChange.has(dep)) {
125
+ fromEstate.push(dep);
126
+ continue;
127
+ }
128
+ const known = plannedBy.get(dep)?.known ?? {};
129
+ outputs[dep] = { ...known };
130
+ planned[dep] = Object.keys(known).sort();
91
131
  }
92
- Object.assign(deployed, await readDeployedOutputs(deps, byName, options.registry, (dep) => deployContext(options, dep), outputs));
93
- const planned = await Promise.all(wave.map(async (name) => {
132
+ Object.assign(deployed, await readDeployedOutputs(fromEstate, byName, options.registry, (dep) => deployContext(options, dep), outputs));
133
+ const results = await Promise.all(wave.map(async (name) => {
94
134
  const at = { component: name, phase: PR_PLAN_PHASE, step: "plan" };
95
135
  emit?.({ type: "step-start", ...at });
96
136
  const start = Date.now();
@@ -104,16 +144,21 @@ export async function planPrSet(options) {
104
144
  });
105
145
  return p;
106
146
  }));
107
- for (const p of planned) {
147
+ for (const p of results) {
108
148
  const component = byName.get(p.component);
149
+ const unknown = unknownInputsOf(component, outputs, inChange);
150
+ if (unknown.unknown.length > 0 || unknown.build.length > 0)
151
+ unknownOf.set(p.component, unknown);
109
152
  if ("error" in p) {
110
153
  failed = true;
154
+ plannedBy.set(p.component, undefined);
111
155
  for (const part of failedParts(component, p.error)) {
112
156
  parts.push(part);
113
157
  componentOf.set(part.member.member, p.component);
114
158
  }
115
159
  continue;
116
160
  }
161
+ plannedBy.set(p.component, p.outputs);
117
162
  plans[p.component] = p.plans;
118
163
  for (const part of p.parts) {
119
164
  parts.push(part);
@@ -123,16 +168,71 @@ export async function planPrSet(options) {
123
168
  }
124
169
  emit?.({ type: "phase-settle", component: null, phase: PR_PLAN_PHASE, status: failed ? "failed" : "ok" });
125
170
  const doc = composeChangeSet(parts);
126
- const members = doc.members.map((m) => ({
127
- member: m.member,
128
- component: componentOf.get(m.member) ?? m.member,
129
- planDigest: m.planDigest,
130
- status: m.status === "failed" ? "plan-failed" : "planned",
131
- counts: memberCounts(doc, m.member),
132
- ...(m.error ? { error: m.error } : {}),
133
- }));
134
- const deployedOutputs = Object.fromEntries(Object.entries(deployed).sort(([a], [b]) => a.localeCompare(b)));
135
- return { doc, members, plans, outputs, failed, ...(Object.keys(deployedOutputs).length > 0 ? { deployedOutputs } : {}) };
171
+ const members = doc.members.map((m) => {
172
+ const component = componentOf.get(m.member) ?? m.member;
173
+ const unknown = unknownOf.get(component);
174
+ return {
175
+ member: m.member,
176
+ component,
177
+ planDigest: m.planDigest,
178
+ status: m.status === "failed" ? "plan-failed" : "planned",
179
+ counts: memberCounts(doc, m.member),
180
+ ...(m.error ? { error: m.error } : {}),
181
+ ...(unknown?.unknown.length ? { unknownInputs: unknown.unknown } : {}),
182
+ ...(unknown?.build.length ? { buildInputs: unknown.build } : {}),
183
+ };
184
+ });
185
+ const sorted = (r) => Object.fromEntries(Object.entries(r).sort(([a], [b]) => a.localeCompare(b)));
186
+ const deployedOutputs = sorted(deployed);
187
+ const plannedOutputs = sorted(planned);
188
+ return {
189
+ doc,
190
+ members,
191
+ plans,
192
+ outputs,
193
+ failed,
194
+ ...(Object.keys(deployedOutputs).length > 0 ? { deployedOutputs } : {}),
195
+ ...(Object.keys(plannedOutputs).length > 0 ? { plannedOutputs } : {}),
196
+ };
197
+ }
198
+ /**
199
+ * The references `component`'s steps make to an output of a component in
200
+ * the change that `outputs` holds no value for (#3999), known only after
201
+ * that upstream applies, each sorted. `build` are the published artifact
202
+ * identities a build in the change produces (`WiringReference.publish`):
203
+ * the build's provenance binds those, so they are never approved again.
204
+ * `unknown` are the rest.
205
+ */
206
+ function unknownInputsOf(component, outputs, inChange) {
207
+ const unknown = new Set();
208
+ const build = new Set();
209
+ for (const step of capabilitySteps(component.deploy)) {
210
+ const { kind: _kind, ...rest } = step;
211
+ for (const r of unresolvedWiringReferences(rest, outputs)) {
212
+ if (inChange.has(r.source))
213
+ (r.publish ? build : unknown).add(r.ref);
214
+ }
215
+ }
216
+ return { unknown: [...unknown].sort(), build: [...build].sort() };
217
+ }
218
+ /**
219
+ * Why `component` cannot apply the plan that read `read` now that `now`
220
+ * stands (#3999): each reference its steps make that resolves to another
221
+ * value, said once. `undefined` when every one resolves as it did. A
222
+ * published artifact's identity from a build in `inChange` never holds a
223
+ * member back: the build's provenance binds it, not this approval.
224
+ */
225
+ export function heldReason(component, read, now, inChange = new Set()) {
226
+ const refs = new Set();
227
+ for (const step of capabilitySteps(component.deploy)) {
228
+ const { kind: _kind, ...rest } = step;
229
+ for (const r of movedWiringReferences(rest, read, now))
230
+ if (!(r.publish && inChange.has(r.source)))
231
+ refs.add(r.ref);
232
+ }
233
+ if (refs.size === 0)
234
+ return undefined;
235
+ return `its plan read ${[...refs].sort().join(", ")} before ${refs.size === 1 ? "that output" : "those outputs"} applied as another value`;
136
236
  }
137
237
  /**
138
238
  * A ledger that reads the real one and records nothing. The plan stage
@@ -178,58 +278,132 @@ export function approversWithoutReview(approvedBy, reviewers) {
178
278
  const allowed = new Set(reviewers.map(norm));
179
279
  return approvedBy.filter((by) => !allowed.has(norm(by)));
180
280
  }
181
- const sameJson = (a, b) => JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
281
+ /**
282
+ * Who approved the gate but wrote the change (#4000): each approval's
283
+ * `resolvedBy` that names one of `authors`, the forge's naming of the pull
284
+ * request's author and of its commits' authors and committers. Their own
285
+ * approval never counts, whether a forge review or a ledger line backs it.
286
+ */
287
+ export function approversWhoAuthored(approvedBy, authors) {
288
+ const norm = (s) => s.trim().toLowerCase();
289
+ const wrote = new Set(authors.map(norm));
290
+ return approvedBy.filter((by) => wrote.has(norm(by)));
291
+ }
292
+ /** Two runs of one apply as one: `b` ran after `a`, against the outputs `a` left. */
293
+ function joinRuns(a, b) {
294
+ const status = a.status === "fail" || b.status === "fail" ? "fail" : a.status === "gated" || b.status === "gated" ? "gated" : "ok";
295
+ const gate = a.gate ?? b.gate;
296
+ return {
297
+ plan: a.plan,
298
+ status,
299
+ results: [...a.results, ...b.results],
300
+ completed: [...new Set([...a.completed, ...b.completed])].sort(),
301
+ failed: [...new Set([...a.failed, ...b.failed])].sort(),
302
+ blocked: [...a.blocked, ...b.blocked],
303
+ componentOutputs: b.componentOutputs,
304
+ ...(gate ? { gate } : {}),
305
+ ...(b.held ? { held: b.held } : {}),
306
+ };
307
+ }
182
308
  /**
183
309
  * Apply the approved plans in dependency order. A failed component blocks
184
- * its dependents and nothing else (`runFanOut`).
310
+ * its dependents and nothing else (`runFanOut`). A member whose plan read an
311
+ * upstream output that is not the value standing when its turn comes is held
312
+ * back with what is downstream of it, planned again once the rest settled,
313
+ * and applied when `decideRound` approves that plan (#3999).
185
314
  */
186
315
  export async function applyPrSet(options) {
187
- const before = options.set.outputs;
188
- const run = await runFanOut(options.plan, options.components, options.registry, {
316
+ const byName = new Map(options.components.map((c) => [c.name, c]));
317
+ const priorCompleted = new Set(options.resumed?.completed ?? []);
318
+ const inChange = new Set([...options.set.members.map((m) => m.component), ...options.plan.order]);
319
+ const toApply = new Set([...inChange].filter((name) => !priorCompleted.has(name)));
320
+ // The outputs standing as the apply starts: what the plans read of
321
+ // components outside the change, and what an earlier attempt's components
322
+ // left (the values the plans read, where its record kept none). A planned
323
+ // value of a component still to apply stands nowhere until it applies.
324
+ const standing = {
325
+ ...Object.fromEntries(Object.entries(options.set.outputs).filter(([name]) => !toApply.has(name))),
326
+ ...(options.resumed?.outputs ?? {}),
327
+ };
328
+ const runRound = (plan, plans, read, outputs) => runFanOut(plan, options.components, options.registry, {
189
329
  env: options.env,
190
330
  ...(options.vars ? { vars: options.vars } : {}),
191
- plans: options.set.plans,
192
- componentOutputs: { ...before },
331
+ plans,
332
+ componentOutputs: outputs,
333
+ hold: (name, now) => heldReason(byName.get(name), read, now, inChange),
193
334
  ...(options.onProgress ? { onProgress: options.onProgress } : {}),
194
335
  ...(options.onRunEvent ? { onRunEvent: options.onRunEvent } : {}),
195
336
  ...(options.onComponentSettled ? { onComponentSettled: options.onComponentSettled } : {}),
196
337
  });
338
+ let run = await runRound(options.plan, options.set.plans, options.set.outputs, { ...standing });
339
+ const rounds = [];
340
+ /** Per component, the round that applied it or holds it, and that round's set, after the first. */
341
+ const roundOf = new Map();
342
+ let stopped;
343
+ while (run.held && run.held.length > 0 && run.status === "ok" && options.decideRound) {
344
+ const round = rounds.length + 2;
345
+ const gate = prRoundGate(options.gate ?? PR_APPLY_GATE, round);
346
+ const heldNames = new Set(run.held.map((h) => h.component));
347
+ const plan = remainingFanOut(options.plan, options.components, { completed: options.plan.order.filter((name) => !heldNames.has(name)) });
348
+ const set = await planPrSet({
349
+ components: options.components,
350
+ plan,
351
+ registry: options.registry,
352
+ env: options.env,
353
+ ...(options.vars ? { vars: options.vars } : {}),
354
+ seededOutputs: run.componentOutputs,
355
+ });
356
+ for (const name of plan.order)
357
+ roundOf.set(name, { round, set });
358
+ const record = (status, approval, message) => {
359
+ rounds.push({ round, gate, digest: set.doc.digest, components: plan.order, approval, status, ...(message ? { message } : {}), changeSet: set.doc });
360
+ };
361
+ if (set.failed) {
362
+ record("plan-failed", { status: "pending" });
363
+ stopped = "plan-failed";
364
+ break;
365
+ }
366
+ const decision = await options.decideRound({ round, gate, set, plan });
367
+ if (!decision.satisfied) {
368
+ record("waiting", decision.approval, decision.message);
369
+ stopped = "waiting";
370
+ break;
371
+ }
372
+ const next = await runRound(plan, set.plans, set.outputs, run.componentOutputs);
373
+ record(next.status === "fail" ? "failed" : "applied", decision.approval);
374
+ run = joinRuns(run, next);
375
+ }
197
376
  const completed = new Set(run.completed);
198
- const priorCompleted = new Set(options.resumed?.completed ?? []);
199
- /**
200
- * Whether a dependency's outputs moved from what the plans read: by this
201
- * run's apply, or by the earlier attempt's when the record kept them.
202
- */
203
- const movedBy = (dep) => {
204
- if (completed.has(dep))
205
- return !sameJson(before[dep], run.componentOutputs[dep]);
206
- const earlier = options.resumed?.outputs;
207
- return priorCompleted.has(dep) && earlier !== undefined && dep in earlier && !sameJson(before[dep], earlier[dep]);
208
- };
377
+ const held = new Map((run.held ?? []).map((h) => [h.component, h]));
209
378
  const blocked = new Set(run.blocked.map((b) => b.component));
210
379
  const errorOf = (component) => {
211
- const result = run.results.find((r) => r.component === component);
380
+ const result = [...run.results].reverse().find((r) => r.component === component);
212
381
  if (result?.status === "gated")
213
382
  return `stopped at its own gate ${result.gate?.gate ?? ""}`.trim();
214
383
  return result?.records.find((r) => r.status === "fail")?.error;
215
384
  };
216
- const byName = new Map(options.components.map((c) => [c.name, c]));
217
385
  const members = options.set.members.map((m) => {
218
386
  if (priorCompleted.has(m.component))
219
387
  return { ...m, status: "applied" };
220
- if (completed.has(m.component)) {
221
- const moved = (byName.get(m.component)?.dependsOn ?? [])
222
- .filter(movedBy)
223
- .sort();
224
- return { ...m, status: "applied", ...(moved.length > 0 ? { inputsMoved: moved } : {}) };
225
- }
388
+ const later = roundOf.get(m.component);
389
+ const fresh = later?.set.members.find((x) => x.member === m.member);
390
+ const asPlanned = later && fresh ? { ...m, planDigest: fresh.planDigest, counts: fresh.counts, round: later.round } : m;
391
+ if (completed.has(m.component))
392
+ return { ...asPlanned, status: "applied" };
393
+ const h = held.get(m.component);
394
+ if (h)
395
+ return { ...asPlanned, status: "waiting", held: h.heldBy ? `${h.heldBy} is held: ${h.reason}` : h.reason };
396
+ if (fresh?.status === "plan-failed")
397
+ return { ...asPlanned, status: "plan-failed", ...(fresh.error ? { error: fresh.error } : {}) };
226
398
  if (blocked.has(m.component))
227
- return { ...m, status: "blocked" };
399
+ return { ...asPlanned, status: "blocked" };
228
400
  const error = errorOf(m.component);
229
- return { ...m, status: "failed", ...(error ? { error } : {}) };
401
+ return { ...asPlanned, status: "failed", ...(error ? { error } : {}) };
230
402
  });
231
- return { members, status: run.status === "ok" ? "applied" : "failed", run };
403
+ const status = run.status !== "ok" || stopped === "plan-failed" ? "failed" : held.size > 0 || stopped === "waiting" ? "waiting" : "applied";
404
+ return { members, status, run, ...(rounds.length > 0 ? { rounds } : {}) };
232
405
  }
406
+ const sameJson = (a, b) => JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
233
407
  const entryKey = (e) => `${e.member}\u0000${e.address}\u0000${e.deposed ?? ""}`;
234
408
  /**
235
409
  * Why `member`'s fresh plan is not covered by the approved change set, or
@@ -361,6 +535,48 @@ export async function resumePrSet(options) {
361
535
  },
362
536
  };
363
537
  }
538
+ /**
539
+ * The fan-out narrowed to wave `wave` of `plan` (1-based), less the
540
+ * components in `completed` (#4003). Its one wave is what is left of that
541
+ * wave; a dependency outside it, an earlier wave's component among them, is
542
+ * a seed. The digest is the derivation's, as {@link remainingFanOut} keeps it.
543
+ */
544
+ export function prWavePlan(plan, components, wave, completed = []) {
545
+ const done = new Set(completed);
546
+ const order = (plan.waves[wave - 1] ?? []).filter((name) => !done.has(name));
547
+ const inWave = new Set(order);
548
+ const byName = new Map(components.map((c) => [c.name, c]));
549
+ const seeds = [
550
+ ...new Set([...plan.seeds, ...order.flatMap((name) => (byName.get(name)?.dependsOn ?? []).filter((dep) => !inWave.has(dep)))]),
551
+ ].sort();
552
+ return { order, waves: order.length > 0 ? [order] : [], skipped: [], seeds, indeterminate: plan.indeterminate, digest: plan.digest };
553
+ }
554
+ /**
555
+ * Why the approved change set does not cover a wave's new plan, one line per
556
+ * member, or `[]` when it covers every member (#4003). A member is covered
557
+ * as {@link planCoveredBy} says, with one rule more: a member whose planner
558
+ * describes no changes (chant's own empty part, for a capability that
559
+ * returns no change set) is covered only by the digest it was approved
560
+ * with, since with no entries there is nothing to compare a moved plan by.
561
+ */
562
+ export function waveNotCovered(approved, fresh, approvedMembers = []) {
563
+ // #3999: a member whose approved plan waited only on an artifact a build in
564
+ // the change publishes is covered by that build's provenance, as it is
565
+ // without --wave-gate.
566
+ const byBuild = new Set(approvedMembers.filter((m) => m.buildInputs?.length && !m.unknownInputs?.length).map((m) => m.member));
567
+ return fresh.members
568
+ .map((m) => {
569
+ if (byBuild.has(m.member))
570
+ return undefined;
571
+ const was = approved.members.find((a) => a.member === m.member);
572
+ const opaque = m.planner === "chant" && m.lexicon === "chant" && m.status === "planned";
573
+ if (opaque && was && was.planDigest !== m.planDigest) {
574
+ return `${m.member} now plans to ${m.planDigest}, not the approved ${was.planDigest ?? "(none)"}, and its planner describes no changes to compare`;
575
+ }
576
+ return planCoveredBy(approved, fresh, m.member);
577
+ })
578
+ .filter((r) => r !== undefined);
579
+ }
364
580
  /** The report a stage writes. */
365
581
  export function prReport(input) {
366
582
  const changed = new Set(input.signal.changed);
@@ -381,7 +597,11 @@ export function prReport(input) {
381
597
  ...(input.message ? { message: input.message } : {}),
382
598
  ...(input.resumed ? { resumed: { applied: [...input.resumed].sort() } } : {}),
383
599
  ...(input.set.deployedOutputs ? { deployedOutputs: input.set.deployedOutputs } : {}),
600
+ ...(input.set.plannedOutputs ? { plannedOutputs: input.set.plannedOutputs } : {}),
601
+ ...(input.rounds && input.rounds.length > 0 ? { rounds: input.rounds } : {}),
384
602
  approval: input.approval,
603
+ ...(input.waveGate ? { waveGate: input.waveGate } : {}),
604
+ ...(input.waveGate && input.waves?.length ? { waves: [...input.waves].sort((a, b) => a.wave - b.wave) } : {}),
385
605
  selection: {
386
606
  changed: input.plan.order.filter((c) => changed.has(c)),
387
607
  dependents: input.plan.order.filter((c) => !changed.has(c)),
@@ -15,7 +15,14 @@
15
15
  * ./promote.ts: a literal path in a deploy step's `template`, `manifest` or
16
16
  * `values` field ({@link TEMPLATE_FIELDS}), read after the environment's build
17
17
  * command has run. A path with the `archive:` prefix names the file after it.
18
- * A path that names a directory, such as a chart, is not a template.
18
+ *
19
+ * Since #4155 a cut also records the other local paths a deploy step names
20
+ * ({@link recordedInputRefs}: a Helm chart, a kustomize directory, a sync's
21
+ * source tree, the fields `./deploy-inputs.ts` lists). A directory is
22
+ * recorded file by file and named in the target's `trees`; a file that is not
23
+ * UTF-8 is recorded as base64. Such a path that does not exist after the
24
+ * build, as a chart named from a repository, is not recorded, and the
25
+ * promote leaves it as written.
19
26
  *
20
27
  * A project with no components (#4046) is compiled the way `chant build --env
21
28
  * <env> -o <output>` builds it ({@link compileBuildOutput}): every file that
@@ -28,7 +35,7 @@ import { type DriverComponent, type DriverStep } from "./driver.js";
28
35
  import type { CapabilityRegistry } from "./capability.js";
29
36
  import type { ReleaseArtifact, ReleaseParam } from "../lifecycle/release-store.js";
30
37
  /** The deploy step fields whose literal file paths are a component's templates. */
31
- export declare const TEMPLATE_FIELDS: readonly string[];
38
+ export { TEMPLATE_FIELDS } from "./deploy-inputs.js";
32
39
  /** One template a component's deploy reads, as the step names it. */
33
40
  export interface TemplateRef {
34
41
  component: string;
@@ -44,7 +51,9 @@ export interface TemplateRef {
44
51
  export interface CompiledTemplate {
45
52
  component: string | null;
46
53
  path: string;
54
+ /** The text, or the base64 of the bytes under `encoding: "base64"`. */
47
55
  content: string;
56
+ encoding?: "base64";
48
57
  }
49
58
  /** What one environment compiles to. */
50
59
  export interface CompiledTarget {
@@ -66,6 +75,11 @@ export interface CompiledTarget {
66
75
  /** For each component, the file that declares it, relative to the member's directory. */
67
76
  componentFiles: Record<string, string>;
68
77
  templates: CompiledTemplate[];
78
+ /** The directories recorded file by file in `templates` (#4155). Absent from a compiler written before #4155. */
79
+ trees?: Array<{
80
+ component: string | null;
81
+ path: string;
82
+ }>;
69
83
  }
70
84
  /** Compiles a member for one environment, and builds its artifacts. The cut talks to a compiler only, so a test can hand it fixtures. */
71
85
  export interface TargetCompiler {
@@ -74,6 +88,17 @@ export interface TargetCompiler {
74
88
  }
75
89
  /** The templates a component's deploy reads: literal paths in {@link TEMPLATE_FIELDS} of its steps other than build and publish steps. */
76
90
  export declare function templateRefs(component: DriverComponent): TemplateRef[];
91
+ /** A path a deploy step names that a cut records (#4155): a {@link TemplateRef}, and whether its field is a template field, which must exist. */
92
+ export interface RecordedInputRef extends TemplateRef {
93
+ /** True for `template`, `manifest` and `values`, whose path must exist after the build. */
94
+ required: boolean;
95
+ }
96
+ /** Every literal path a component's deploy names that a cut records: {@link templateRefs}, plus each kind's own fields in `DEPLOY_INPUT_FIELDS`. */
97
+ export declare function recordedInputRefs(component: DriverComponent): RecordedInputRef[];
98
+ /** The fields of a step of `kind` whose paths a cut records and a promote points at the recorded copy. */
99
+ export declare function recordedFields(kind: string): string[];
100
+ /** A file's bytes as a template: its text when it is UTF-8, else base64. */
101
+ export declare function templateOf(component: string | null, path: string, file: string): CompiledTemplate;
77
102
  /** A component's build-time steps ({@link BUILD_STEP_KINDS}), each as declared, in composition order. */
78
103
  export declare function buildStepsOf(component: DriverComponent): DriverStep[];
79
104
  /** A component's publish steps ({@link PUBLISH_STEP_KINDS}), each as declared, in composition order. */
@@ -98,7 +123,17 @@ export interface CompileInputs {
98
123
  output?: string;
99
124
  /** For a project with no components: build only this lexicon, as `chant build --lexicon` does. */
100
125
  lexicon?: string;
126
+ /**
127
+ * The release's label (#4168, decision 5), passed to every compile and
128
+ * artifact build as `CHANT_RELEASE_LABEL`, so a version reaches the build
129
+ * without a version-bump commit. A build parameter reads it by declaring
130
+ * `env: "CHANT_RELEASE_LABEL"`, and a build step's own tool (cargo, npm)
131
+ * reads the variable. Unset for a cut with no label.
132
+ */
133
+ releaseLabel?: string;
101
134
  }
135
+ /** The variable a cut's label reaches the build through (#4168). */
136
+ export declare const RELEASE_LABEL_ENV = "CHANT_RELEASE_LABEL";
102
137
  /**
103
138
  * Where a project with no components writes its build output when the cut
104
139
  * names no `-o`. YAML, since the k8s and helm serializers write YAML whatever
@@ -1 +1 @@
1
- {"version":3,"file":"release-compile.d.ts","sourceRoot":"","sources":["../../src/components/release-compile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"release-compile.d.ts","sourceRoot":"","sources":["../../src/components/release-compile.ts"],"names":[],"mappings":"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"}