@intentius/chant 0.124.46 → 0.124.48

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 (633) hide show
  1. package/dist/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  2. package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  3. package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  4. package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  5. package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  6. package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  7. package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
  8. package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
  9. package/dist/__golden__/wave-loop/op-denied.json +16 -0
  10. package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  11. package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  12. package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
  13. package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
  14. package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
  15. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  16. package/dist/__golden__/wave-loop/op-held-on.json +16 -0
  17. package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  18. package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  19. package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  20. package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  21. package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
  22. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  23. package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
  24. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  25. package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
  26. package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
  27. package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  28. package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  29. package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
  30. package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  31. package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  32. package/dist/__golden__/wave-loop/op-overridden.json +16 -0
  33. package/dist/__golden__/wave-loop/op-per-run.json +20 -0
  34. package/dist/__golden__/wave-loop/op-point.json +13 -0
  35. package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
  36. package/dist/__golden__/wave-loop/op-sealed.json +10 -0
  37. package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
  38. package/dist/__golden__/wave-loop/op-spend.json +10 -0
  39. package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
  40. package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
  41. package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
  42. package/dist/__golden__/wave-loop/op-wide.json +39 -0
  43. package/dist/action-pins.d.ts +61 -0
  44. package/dist/action-pins.d.ts.map +1 -0
  45. package/dist/action-pins.js +77 -0
  46. package/dist/cli/commands/carve.d.ts +3 -0
  47. package/dist/cli/commands/carve.d.ts.map +1 -1
  48. package/dist/cli/commands/carve.js +36 -7
  49. package/dist/cli/commands/import-report.d.ts +26 -0
  50. package/dist/cli/commands/import-report.d.ts.map +1 -0
  51. package/dist/cli/commands/import-report.js +65 -0
  52. package/dist/cli/commands/import.d.ts +11 -1
  53. package/dist/cli/commands/import.d.ts.map +1 -1
  54. package/dist/cli/commands/import.js +22 -3
  55. package/dist/cli/commands/migrate.d.ts +13 -1
  56. package/dist/cli/commands/migrate.d.ts.map +1 -1
  57. package/dist/cli/commands/migrate.js +134 -10
  58. package/dist/cli/handlers/approve.d.ts.map +1 -1
  59. package/dist/cli/handlers/approve.js +21 -2
  60. package/dist/cli/handlers/build.d.ts.map +1 -1
  61. package/dist/cli/handlers/build.js +6 -1
  62. package/dist/cli/handlers/ledger.d.ts +3 -0
  63. package/dist/cli/handlers/ledger.d.ts.map +1 -0
  64. package/dist/cli/handlers/ledger.js +55 -0
  65. package/dist/cli/handlers/migrate.d.ts.map +1 -1
  66. package/dist/cli/handlers/migrate.js +18 -11
  67. package/dist/cli/handlers/misc.d.ts.map +1 -1
  68. package/dist/cli/handlers/misc.js +12 -1
  69. package/dist/cli/handlers/pr-env.js +2 -2
  70. package/dist/cli/handlers/pr.d.ts +15 -1
  71. package/dist/cli/handlers/pr.d.ts.map +1 -1
  72. package/dist/cli/handlers/pr.js +143 -39
  73. package/dist/cli/handlers/query.d.ts +7 -2
  74. package/dist/cli/handlers/query.d.ts.map +1 -1
  75. package/dist/cli/handlers/query.js +16 -4
  76. package/dist/cli/handlers/release.d.ts.map +1 -1
  77. package/dist/cli/handlers/release.js +6 -3
  78. package/dist/cli/handlers/search.d.ts +2 -4
  79. package/dist/cli/handlers/search.d.ts.map +1 -1
  80. package/dist/cli/handlers/search.js +13 -39
  81. package/dist/cli/main.d.ts.map +1 -1
  82. package/dist/cli/main.js +65 -14
  83. package/dist/cli/parse-args.d.ts.map +1 -1
  84. package/dist/cli/parse-args.js +36 -2
  85. package/dist/cli/registry.d.ts +14 -4
  86. package/dist/cli/registry.d.ts.map +1 -1
  87. package/dist/components/builders.d.ts +5 -1
  88. package/dist/components/builders.d.ts.map +1 -1
  89. package/dist/components/builders.js +5 -0
  90. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  91. package/dist/components/capability-plugin-loader.js +16 -1
  92. package/dist/components/capability-plugin.d.ts +14 -0
  93. package/dist/components/capability-plugin.d.ts.map +1 -1
  94. package/dist/components/pr-hooks.d.ts +21 -1
  95. package/dist/components/pr-hooks.d.ts.map +1 -1
  96. package/dist/components/pr-hooks.js +72 -4
  97. package/dist/components/pr-pipeline.d.ts +45 -10
  98. package/dist/components/pr-pipeline.d.ts.map +1 -1
  99. package/dist/components/pr-pipeline.js +47 -14
  100. package/dist/components/pr-policy.d.ts +36 -0
  101. package/dist/components/pr-policy.d.ts.map +1 -1
  102. package/dist/components/pr-policy.js +36 -0
  103. package/dist/components/starter-plugin.d.ts +1 -0
  104. package/dist/components/starter-plugin.d.ts.map +1 -1
  105. package/dist/components/starter-plugin.js +5 -1
  106. package/dist/components/verbs/index.d.ts +2 -0
  107. package/dist/components/verbs/index.d.ts.map +1 -1
  108. package/dist/components/verbs/index.js +2 -0
  109. package/dist/components/verbs/publish-artifact.d.ts +65 -0
  110. package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
  111. package/dist/components/verbs/publish-artifact.js +74 -0
  112. package/dist/components/verbs/publish-image.d.ts +129 -0
  113. package/dist/components/verbs/publish-image.d.ts.map +1 -0
  114. package/dist/components/verbs/publish-image.js +145 -0
  115. package/dist/config-environments.d.ts +20 -0
  116. package/dist/config-environments.d.ts.map +1 -1
  117. package/dist/config-environments.js +12 -0
  118. package/dist/config.d.ts +9 -1
  119. package/dist/config.d.ts.map +1 -1
  120. package/dist/config.js +6 -2
  121. package/dist/gate-decision.d.ts +11 -2
  122. package/dist/gate-decision.d.ts.map +1 -1
  123. package/dist/gate-decision.js +15 -3
  124. package/dist/graph-ir.d.ts +25 -0
  125. package/dist/graph-ir.d.ts.map +1 -1
  126. package/dist/graph-walk.d.ts +66 -0
  127. package/dist/graph-walk.d.ts.map +1 -0
  128. package/dist/graph-walk.js +70 -0
  129. package/dist/import/parser.d.ts +19 -0
  130. package/dist/import/parser.d.ts.map +1 -1
  131. package/dist/lexicon.d.ts +71 -6
  132. package/dist/lexicon.d.ts.map +1 -1
  133. package/dist/lifecycle/gate-ledger.d.ts +11 -0
  134. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  135. package/dist/lifecycle/git.d.ts +2 -5
  136. package/dist/lifecycle/git.d.ts.map +1 -1
  137. package/dist/lifecycle/ledger-read.d.ts +65 -0
  138. package/dist/lifecycle/ledger-read.d.ts.map +1 -0
  139. package/dist/lifecycle/ledger-read.js +160 -0
  140. package/dist/lifecycle/release-workstation.d.ts +7 -0
  141. package/dist/lifecycle/release-workstation.d.ts.map +1 -1
  142. package/dist/lifecycle/release-workstation.js +25 -0
  143. package/dist/lifecycle/run-ledger.d.ts +4 -3
  144. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  145. package/dist/lifecycle/run-ledger.js +1 -0
  146. package/dist/lint/discover.js +3 -1
  147. package/dist/lint/post-synth.d.ts +127 -1
  148. package/dist/lint/post-synth.d.ts.map +1 -1
  149. package/dist/lint/post-synth.js +84 -2
  150. package/dist/lint/rules/op/index.d.ts +1 -0
  151. package/dist/lint/rules/op/index.d.ts.map +1 -1
  152. package/dist/lint/rules/op/index.js +2 -0
  153. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
  154. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
  155. package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
  156. package/dist/op/activities/activity-contracts.d.ts +5 -2
  157. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  158. package/dist/op/activities/activity-contracts.js +5 -2
  159. package/dist/op/activities/index.d.ts +2 -2
  160. package/dist/op/activities/index.d.ts.map +1 -1
  161. package/dist/op/activities/index.js +1 -1
  162. package/dist/op/activities/review-agent.d.ts +90 -4
  163. package/dist/op/activities/review-agent.d.ts.map +1 -1
  164. package/dist/op/activities/review-agent.js +217 -19
  165. package/dist/op/activities/work-evidence.d.ts +8 -1
  166. package/dist/op/activities/work-evidence.d.ts.map +1 -1
  167. package/dist/op/activities/work-evidence.js +1 -0
  168. package/dist/op/builders.d.ts +9 -5
  169. package/dist/op/builders.d.ts.map +1 -1
  170. package/dist/op/builders.js +9 -5
  171. package/dist/op/composites/apply-op.d.ts +29 -2
  172. package/dist/op/composites/apply-op.d.ts.map +1 -1
  173. package/dist/op/composites/apply-op.js +20 -1
  174. package/dist/op/gate-approval.d.ts +11 -5
  175. package/dist/op/gate-approval.d.ts.map +1 -1
  176. package/dist/op/gate-approval.js +11 -6
  177. package/dist/op/gate-quorum.d.ts +100 -3
  178. package/dist/op/gate-quorum.d.ts.map +1 -1
  179. package/dist/op/gate-quorum.js +108 -6
  180. package/dist/op/gate-review.d.ts +9 -0
  181. package/dist/op/gate-review.d.ts.map +1 -1
  182. package/dist/op/gate-review.js +13 -0
  183. package/dist/op/gate.d.ts +44 -3
  184. package/dist/op/gate.d.ts.map +1 -1
  185. package/dist/op/gate.js +25 -4
  186. package/dist/op/index.d.ts +3 -3
  187. package/dist/op/index.d.ts.map +1 -1
  188. package/dist/op/index.js +1 -1
  189. package/dist/op/local-executor.d.ts +38 -3
  190. package/dist/op/local-executor.d.ts.map +1 -1
  191. package/dist/op/local-executor.js +48 -6
  192. package/dist/op/op-waves-run.d.ts +26 -1
  193. package/dist/op/op-waves-run.d.ts.map +1 -1
  194. package/dist/op/op-waves-run.js +259 -13
  195. package/dist/op/op-waves.d.ts +72 -5
  196. package/dist/op/op-waves.d.ts.map +1 -1
  197. package/dist/op/op-waves.js +110 -15
  198. package/dist/op/runtime.d.ts +11 -0
  199. package/dist/op/runtime.d.ts.map +1 -1
  200. package/dist/op/schedule-overdue.d.ts +16 -0
  201. package/dist/op/schedule-overdue.d.ts.map +1 -1
  202. package/dist/op/schedule-overdue.js +36 -0
  203. package/dist/op/stage-hooks.d.ts +9 -2
  204. package/dist/op/stage-hooks.d.ts.map +1 -1
  205. package/dist/op/stage-hooks.js +7 -5
  206. package/dist/op/workspace-run-env.d.ts +22 -0
  207. package/dist/op/workspace-run-env.d.ts.map +1 -0
  208. package/dist/op/workspace-run-env.js +21 -0
  209. package/dist/pr-forge.d.ts +24 -0
  210. package/dist/pr-forge.d.ts.map +1 -1
  211. package/dist/pr-forge.js +47 -0
  212. package/dist/pr-post.d.ts +42 -0
  213. package/dist/pr-post.d.ts.map +1 -1
  214. package/dist/pr-post.js +67 -1
  215. package/dist/read-filter.d.ts +65 -0
  216. package/dist/read-filter.d.ts.map +1 -0
  217. package/dist/read-filter.js +179 -0
  218. package/dist/run-event.d.ts +1 -1
  219. package/dist/run-event.d.ts.map +1 -1
  220. package/dist/terraform/carve.d.ts +24 -3
  221. package/dist/terraform/carve.d.ts.map +1 -1
  222. package/dist/terraform/carve.js +32 -14
  223. package/dist/terraform/cuts.d.ts +97 -0
  224. package/dist/terraform/cuts.d.ts.map +1 -0
  225. package/dist/terraform/cuts.js +138 -0
  226. package/dist/terraform/folds.d.ts +26 -0
  227. package/dist/terraform/folds.d.ts.map +1 -0
  228. package/dist/terraform/folds.js +38 -0
  229. package/dist/terraform/graph.d.ts.map +1 -1
  230. package/dist/terraform/graph.js +10 -0
  231. package/dist/terraform/reach.d.ts +140 -0
  232. package/dist/terraform/reach.d.ts.map +1 -0
  233. package/dist/terraform/reach.js +170 -0
  234. package/dist/terraform/score.d.ts +14 -0
  235. package/dist/terraform/score.d.ts.map +1 -1
  236. package/dist/terraform/score.js +14 -31
  237. package/dist/terraform/state.d.ts.map +1 -1
  238. package/dist/terraform/state.js +4 -2
  239. package/dist/terraform/types.d.ts +8 -0
  240. package/dist/terraform/types.d.ts.map +1 -1
  241. package/dist/wave-blocked.d.ts +10 -1
  242. package/dist/wave-blocked.d.ts.map +1 -1
  243. package/dist/wave-blocked.js +31 -3
  244. package/dist/wave-runtime.mjs +263 -254
  245. package/dist/workspace/check.schema.json +11 -2
  246. package/dist/workspace/checks/ci-branch.d.ts +44 -0
  247. package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
  248. package/dist/workspace/checks/ci-branch.js +133 -0
  249. package/dist/workspace/checks/links.d.ts +3 -0
  250. package/dist/workspace/checks/links.d.ts.map +1 -1
  251. package/dist/workspace/checks/links.js +12 -1
  252. package/dist/workspace/checks/org.d.ts +48 -0
  253. package/dist/workspace/checks/org.d.ts.map +1 -0
  254. package/dist/workspace/checks/org.js +156 -0
  255. package/dist/workspace/checks.d.ts +11 -1
  256. package/dist/workspace/checks.d.ts.map +1 -1
  257. package/dist/workspace/checks.js +59 -7
  258. package/dist/workspace/ci-branches.d.ts +16 -0
  259. package/dist/workspace/ci-branches.d.ts.map +1 -1
  260. package/dist/workspace/ci-branches.js +27 -0
  261. package/dist/workspace/ci-green-cli.js +7 -7
  262. package/dist/workspace/ci-green-workflow.d.ts +1 -1
  263. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  264. package/dist/workspace/ci-green-workflow.js +13 -8
  265. package/dist/workspace/ci-green.d.ts +14 -0
  266. package/dist/workspace/ci-green.d.ts.map +1 -1
  267. package/dist/workspace/ci-green.js +44 -11
  268. package/dist/workspace/ci-run.d.ts +9 -1
  269. package/dist/workspace/ci-run.d.ts.map +1 -1
  270. package/dist/workspace/ci-run.js +67 -6
  271. package/dist/workspace/ci-serve.d.ts +9 -0
  272. package/dist/workspace/ci-serve.d.ts.map +1 -1
  273. package/dist/workspace/ci-serve.js +114 -76
  274. package/dist/workspace/compose-graph.d.ts +14 -0
  275. package/dist/workspace/compose-graph.d.ts.map +1 -1
  276. package/dist/workspace/composites.d.ts +4 -1
  277. package/dist/workspace/composites.d.ts.map +1 -1
  278. package/dist/workspace/composites.js +5 -2
  279. package/dist/workspace/composites.schema.json +22 -0
  280. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  281. package/dist/workspace/cross-root-lint.d.ts +56 -0
  282. package/dist/workspace/cross-root-lint.d.ts.map +1 -0
  283. package/dist/workspace/cross-root-lint.js +111 -0
  284. package/dist/workspace/dbt-models-reader.d.ts +44 -0
  285. package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
  286. package/dist/workspace/dbt-models-reader.js +356 -0
  287. package/dist/workspace/dbt-project-common.d.ts +40 -0
  288. package/dist/workspace/dbt-project-common.d.ts.map +1 -0
  289. package/dist/workspace/dbt-project-common.js +106 -0
  290. package/dist/workspace/dbt-project-reader.d.ts +4 -3
  291. package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
  292. package/dist/workspace/dbt-project-reader.js +14 -108
  293. package/dist/workspace/decision-rank.d.ts +26 -0
  294. package/dist/workspace/decision-rank.d.ts.map +1 -0
  295. package/dist/workspace/decision-rank.js +16 -0
  296. package/dist/workspace/declaration.d.ts +43 -2
  297. package/dist/workspace/declaration.d.ts.map +1 -1
  298. package/dist/workspace/declaration.js +45 -11
  299. package/dist/workspace/declaration.schema.json +133 -24
  300. package/dist/workspace/environments.d.ts +26 -2
  301. package/dist/workspace/environments.d.ts.map +1 -1
  302. package/dist/workspace/environments.js +26 -2
  303. package/dist/workspace/flyway-dir.d.ts +39 -0
  304. package/dist/workspace/flyway-dir.d.ts.map +1 -0
  305. package/dist/workspace/flyway-dir.js +104 -0
  306. package/dist/workspace/flyway-layout.d.ts +96 -0
  307. package/dist/workspace/flyway-layout.d.ts.map +1 -0
  308. package/dist/workspace/flyway-layout.js +308 -0
  309. package/dist/workspace/graph-cli.d.ts.map +1 -1
  310. package/dist/workspace/graph-cli.js +26 -8
  311. package/dist/workspace/graph.schema.json +34 -0
  312. package/dist/workspace/intent.d.ts +2 -3
  313. package/dist/workspace/intent.d.ts.map +1 -1
  314. package/dist/workspace/intent.js +5 -9
  315. package/dist/workspace/kind-link-readers.d.ts +59 -2
  316. package/dist/workspace/kind-link-readers.d.ts.map +1 -1
  317. package/dist/workspace/kind-link-readers.js +17 -1
  318. package/dist/workspace/kinds.d.ts +66 -2
  319. package/dist/workspace/kinds.d.ts.map +1 -1
  320. package/dist/workspace/kinds.js +98 -4
  321. package/dist/workspace/ledger.schema.json +158 -0
  322. package/dist/workspace/lexicon-outputs.d.ts +20 -1
  323. package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
  324. package/dist/workspace/lexicon-outputs.js +102 -10
  325. package/dist/workspace/lineage-check.d.ts +3 -0
  326. package/dist/workspace/lineage-check.d.ts.map +1 -1
  327. package/dist/workspace/lineage-check.js +23 -4
  328. package/dist/workspace/links.d.ts +8 -1
  329. package/dist/workspace/links.d.ts.map +1 -1
  330. package/dist/workspace/links.js +25 -1
  331. package/dist/workspace/ls.d.ts +8 -0
  332. package/dist/workspace/ls.d.ts.map +1 -1
  333. package/dist/workspace/ls.js +7 -1
  334. package/dist/workspace/ls.schema.json +7 -0
  335. package/dist/workspace/member-commands.d.ts.map +1 -1
  336. package/dist/workspace/member-commands.js +54 -5
  337. package/dist/workspace/migrate-links.d.ts +45 -0
  338. package/dist/workspace/migrate-links.d.ts.map +1 -0
  339. package/dist/workspace/migrate-links.js +100 -0
  340. package/dist/workspace/migration-dirs.d.ts +74 -0
  341. package/dist/workspace/migration-dirs.d.ts.map +1 -0
  342. package/dist/workspace/migration-dirs.js +254 -0
  343. package/dist/workspace/reason-codes.d.ts +8 -0
  344. package/dist/workspace/reason-codes.d.ts.map +1 -1
  345. package/dist/workspace/reason-codes.js +11 -0
  346. package/dist/workspace/records-cli.d.ts +11 -0
  347. package/dist/workspace/records-cli.d.ts.map +1 -1
  348. package/dist/workspace/records-cli.js +57 -5
  349. package/dist/workspace/records.schema.json +5 -0
  350. package/dist/workspace/release-candidates.d.ts +2 -0
  351. package/dist/workspace/release-candidates.d.ts.map +1 -1
  352. package/dist/workspace/release-candidates.js +5 -2
  353. package/dist/workspace/release-train.d.ts +53 -0
  354. package/dist/workspace/release-train.d.ts.map +1 -0
  355. package/dist/workspace/release-train.js +134 -0
  356. package/dist/workspace/release-workflow.d.ts.map +1 -1
  357. package/dist/workspace/release-workflow.js +4 -3
  358. package/dist/workspace/repo-ref.d.ts +45 -0
  359. package/dist/workspace/repo-ref.d.ts.map +1 -0
  360. package/dist/workspace/repo-ref.js +114 -0
  361. package/dist/workspace/run-event.schema.json +2 -2
  362. package/dist/workspace/runs-cli.d.ts +9 -0
  363. package/dist/workspace/runs-cli.d.ts.map +1 -1
  364. package/dist/workspace/runs-cli.js +48 -3
  365. package/dist/workspace/runs.schema.json +7 -0
  366. package/dist/workspace/search-contract.d.ts +1 -1
  367. package/dist/workspace/search-contract.d.ts.map +1 -1
  368. package/dist/workspace/status-decisions.d.ts +37 -0
  369. package/dist/workspace/status-decisions.d.ts.map +1 -0
  370. package/dist/workspace/status-decisions.js +147 -0
  371. package/dist/workspace/status-gates.d.ts +9 -0
  372. package/dist/workspace/status-gates.d.ts.map +1 -1
  373. package/dist/workspace/status.d.ts +4 -0
  374. package/dist/workspace/status.d.ts.map +1 -1
  375. package/dist/workspace/status.js +14 -2
  376. package/dist/workspace/status.schema.json +6 -0
  377. package/dist/workspace/work-cli.d.ts.map +1 -1
  378. package/dist/workspace/work-cli.js +5 -3
  379. package/dist/workspace/work-evidence-ops.d.ts +83 -0
  380. package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
  381. package/dist/workspace/work-evidence-ops.js +169 -0
  382. package/dist/workspace/work-evidence.d.ts +12 -2
  383. package/dist/workspace/work-evidence.d.ts.map +1 -1
  384. package/dist/workspace/work-evidence.js +21 -3
  385. package/dist/workspace/work-evidence.schema.json +49 -2
  386. package/dist/workspace/workspace-gates.d.ts +110 -0
  387. package/dist/workspace/workspace-gates.d.ts.map +1 -0
  388. package/dist/workspace/workspace-gates.js +140 -0
  389. package/dist/workspace/workspace-kinds.schema.json +58 -3
  390. package/dist/workspace/workspace-ledger.d.ts +76 -0
  391. package/dist/workspace/workspace-ledger.d.ts.map +1 -0
  392. package/dist/workspace/workspace-ledger.js +91 -0
  393. package/dist/workspace/workspace-run.d.ts +112 -0
  394. package/dist/workspace/workspace-run.d.ts.map +1 -0
  395. package/dist/workspace/workspace-run.js +432 -0
  396. package/package.json +1 -1
  397. package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  398. package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  399. package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  400. package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  401. package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  402. package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  403. package/src/__golden__/wave-loop/op-cost-member.json +13 -0
  404. package/src/__golden__/wave-loop/op-denied-source.json +16 -0
  405. package/src/__golden__/wave-loop/op-denied.json +16 -0
  406. package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  407. package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  408. package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
  409. package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
  410. package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
  411. package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  412. package/src/__golden__/wave-loop/op-held-on.json +16 -0
  413. package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  414. package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  415. package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  416. package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  417. package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
  418. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  419. package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
  420. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  421. package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
  422. package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
  423. package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  424. package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  425. package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
  426. package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  427. package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  428. package/src/__golden__/wave-loop/op-overridden.json +16 -0
  429. package/src/__golden__/wave-loop/op-per-run.json +20 -0
  430. package/src/__golden__/wave-loop/op-point.json +13 -0
  431. package/src/__golden__/wave-loop/op-pr-review.json +10 -0
  432. package/src/__golden__/wave-loop/op-sealed.json +10 -0
  433. package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
  434. package/src/__golden__/wave-loop/op-spend.json +10 -0
  435. package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
  436. package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
  437. package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
  438. package/src/__golden__/wave-loop/op-wide.json +39 -0
  439. package/src/action-pins.test.ts +78 -0
  440. package/src/action-pins.ts +92 -0
  441. package/src/cli/commands/carve-score-once.test.ts +99 -0
  442. package/src/cli/commands/carve.ts +37 -6
  443. package/src/cli/commands/check-lexicon.test.ts +2 -2
  444. package/src/cli/commands/import-report.ts +71 -0
  445. package/src/cli/commands/import.ts +33 -3
  446. package/src/cli/commands/migrate-dialect.test.ts +145 -0
  447. package/src/cli/commands/migrate.ts +132 -11
  448. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
  449. package/src/cli/handlers/approve.ts +23 -2
  450. package/src/cli/handlers/build.ts +7 -1
  451. package/src/cli/handlers/ledger.ts +54 -0
  452. package/src/cli/handlers/migrate.ts +21 -12
  453. package/src/cli/handlers/misc.ts +10 -1
  454. package/src/cli/handlers/pr-env.ts +2 -2
  455. package/src/cli/handlers/pr.ts +138 -36
  456. package/src/cli/handlers/query.ts +16 -4
  457. package/src/cli/handlers/release.ts +6 -3
  458. package/src/cli/handlers/search.ts +13 -34
  459. package/src/cli/main.test.ts +15 -0
  460. package/src/cli/main.ts +65 -14
  461. package/src/cli/parse-args.ts +27 -2
  462. package/src/cli/registry.ts +14 -4
  463. package/src/components/builders.ts +8 -0
  464. package/src/components/capability-plugin-loader.ts +13 -1
  465. package/src/components/capability-plugin.ts +16 -0
  466. package/src/components/pr-hooks.test.ts +73 -5
  467. package/src/components/pr-hooks.ts +95 -5
  468. package/src/components/pr-pipeline.ts +64 -16
  469. package/src/components/pr-policy.test.ts +64 -1
  470. package/src/components/pr-policy.ts +53 -0
  471. package/src/components/registry.test.ts +1 -1
  472. package/src/components/starter-plugin.ts +6 -0
  473. package/src/components/verbs/index.ts +2 -0
  474. package/src/components/verbs/publish-artifact.test.ts +60 -0
  475. package/src/components/verbs/publish-artifact.ts +122 -0
  476. package/src/components/verbs/publish-image.test.ts +101 -0
  477. package/src/components/verbs/publish-image.ts +265 -0
  478. package/src/config-environments.ts +28 -1
  479. package/src/config.ts +8 -1
  480. package/src/gate-decision-bundle.test.ts +1 -0
  481. package/src/gate-decision-identity.test.ts +9 -0
  482. package/src/gate-decision.ts +26 -3
  483. package/src/graph-ir.ts +27 -0
  484. package/src/graph-walk.test.ts +44 -0
  485. package/src/graph-walk.ts +102 -0
  486. package/src/import/parser.ts +20 -0
  487. package/src/lexicon.ts +74 -6
  488. package/src/lifecycle/gate-ledger.ts +8 -0
  489. package/src/lifecycle/git.ts +2 -2
  490. package/src/lifecycle/ledger-read.test.ts +107 -0
  491. package/src/lifecycle/ledger-read.ts +195 -0
  492. package/src/lifecycle/release-workstation.ts +24 -0
  493. package/src/lifecycle/run-ledger.ts +5 -2
  494. package/src/lint/cross-root.test.ts +122 -0
  495. package/src/lint/discover.ts +3 -1
  496. package/src/lint/post-synth.ts +212 -2
  497. package/src/lint/rules/op/index.ts +2 -0
  498. package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
  499. package/src/op/activities/activity-contracts.ts +5 -2
  500. package/src/op/activities/index.ts +2 -2
  501. package/src/op/activities/review-agent.test.ts +221 -4
  502. package/src/op/activities/review-agent.ts +265 -22
  503. package/src/op/activities/work-evidence.ts +9 -1
  504. package/src/op/builders.ts +9 -5
  505. package/src/op/composites/apply-op.test.ts +108 -0
  506. package/src/op/composites/apply-op.ts +37 -2
  507. package/src/op/gate-approval.test.ts +6 -1
  508. package/src/op/gate-approval.ts +12 -6
  509. package/src/op/gate-quorum-at-base.test.ts +211 -0
  510. package/src/op/gate-quorum.ts +156 -8
  511. package/src/op/gate-review.ts +14 -0
  512. package/src/op/gate.ts +67 -8
  513. package/src/op/index.ts +3 -2
  514. package/src/op/local-executor.ts +69 -9
  515. package/src/op/op-waves-depends-on.test.ts +81 -0
  516. package/src/op/op-waves-hook-targets.test.ts +4 -2
  517. package/src/op/op-waves-quorum-product.test.ts +158 -0
  518. package/src/op/op-waves-run.ts +288 -14
  519. package/src/op/op-waves.ts +143 -14
  520. package/src/op/runtime.ts +8 -0
  521. package/src/op/schedule-overdue.ts +33 -0
  522. package/src/op/stage-hooks.ts +13 -5
  523. package/src/op/workspace-run-env.ts +29 -0
  524. package/src/pr-forge-bundle.test.ts +2 -2
  525. package/src/pr-forge.test.ts +47 -0
  526. package/src/pr-forge.ts +68 -0
  527. package/src/pr-post-open.e2e.test.ts +36 -0
  528. package/src/pr-post.test.ts +102 -3
  529. package/src/pr-post.ts +89 -1
  530. package/src/read-filter.test.ts +54 -0
  531. package/src/read-filter.ts +193 -0
  532. package/src/run-event.ts +1 -1
  533. package/src/stage-hooks-bundle.test.ts +1 -0
  534. package/src/terraform/carve.ts +52 -15
  535. package/src/terraform/cuts.test.ts +173 -0
  536. package/src/terraform/cuts.ts +188 -0
  537. package/src/terraform/folds.ts +44 -0
  538. package/src/terraform/graph.ts +9 -0
  539. package/src/terraform/radius.test.ts +90 -0
  540. package/src/terraform/reach.test.ts +146 -0
  541. package/src/terraform/reach.ts +247 -0
  542. package/src/terraform/score.ts +27 -29
  543. package/src/terraform/state.ts +3 -1
  544. package/src/terraform/types.ts +8 -0
  545. package/src/wave-blocked.ts +28 -3
  546. package/src/wave-loop-golden.test.ts +4 -3
  547. package/src/workspace/behold-kinds.test.ts +1 -1
  548. package/src/workspace/check-contract.test.ts +7 -6
  549. package/src/workspace/check.schema.json +11 -2
  550. package/src/workspace/checks/ci-branch.test.ts +128 -0
  551. package/src/workspace/checks/ci-branch.ts +141 -0
  552. package/src/workspace/checks/links.ts +12 -1
  553. package/src/workspace/checks/org.ts +169 -0
  554. package/src/workspace/checks.ts +64 -7
  555. package/src/workspace/ci-branches.ts +31 -0
  556. package/src/workspace/ci-green-branches.test.ts +153 -0
  557. package/src/workspace/ci-green-cli.ts +7 -7
  558. package/src/workspace/ci-green-workflow.test.ts +4 -3
  559. package/src/workspace/ci-green-workflow.ts +13 -9
  560. package/src/workspace/ci-green.ts +49 -12
  561. package/src/workspace/ci-run.test.ts +72 -1
  562. package/src/workspace/ci-run.ts +68 -8
  563. package/src/workspace/ci-serve.test.ts +95 -0
  564. package/src/workspace/ci-serve.ts +106 -65
  565. package/src/workspace/component-environments.test.ts +25 -2
  566. package/src/workspace/compose-graph.ts +9 -2
  567. package/src/workspace/composites.schema.json +22 -0
  568. package/src/workspace/composites.test.ts +39 -8
  569. package/src/workspace/composites.ts +6 -2
  570. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  571. package/src/workspace/cross-root-lint.test.ts +90 -0
  572. package/src/workspace/cross-root-lint.ts +126 -0
  573. package/src/workspace/dbt-kind.test.ts +3 -2
  574. package/src/workspace/dbt-models-reader.ts +362 -0
  575. package/src/workspace/dbt-models.test.ts +248 -0
  576. package/src/workspace/dbt-project-common.ts +113 -0
  577. package/src/workspace/dbt-project-reader.ts +29 -112
  578. package/src/workspace/decision-rank.ts +40 -0
  579. package/src/workspace/declaration.schema.json +133 -24
  580. package/src/workspace/declaration.ts +84 -15
  581. package/src/workspace/environments.ts +40 -4
  582. package/src/workspace/flyway-dir.ts +113 -0
  583. package/src/workspace/flyway-layout.ts +337 -0
  584. package/src/workspace/graph-cli.ts +25 -10
  585. package/src/workspace/graph-contract.test.ts +4 -2
  586. package/src/workspace/graph.schema.json +34 -0
  587. package/src/workspace/identity.test.ts +14 -2
  588. package/src/workspace/intent.ts +6 -14
  589. package/src/workspace/kind-link-readers.ts +68 -3
  590. package/src/workspace/kinds.test.ts +12 -7
  591. package/src/workspace/kinds.ts +132 -7
  592. package/src/workspace/ledger.schema.json +158 -0
  593. package/src/workspace/lexicon-outputs.ts +132 -13
  594. package/src/workspace/lineage-check.ts +30 -7
  595. package/src/workspace/links.ts +24 -1
  596. package/src/workspace/ls-contract.test.ts +1 -1
  597. package/src/workspace/ls.schema.json +7 -0
  598. package/src/workspace/ls.ts +10 -1
  599. package/src/workspace/member-commands.ts +60 -2
  600. package/src/workspace/member-file-schema.test.ts +124 -0
  601. package/src/workspace/migrate-links.test.ts +99 -0
  602. package/src/workspace/migrate-links.ts +108 -0
  603. package/src/workspace/migration-dirs.test.ts +272 -0
  604. package/src/workspace/migration-dirs.ts +267 -0
  605. package/src/workspace/org-scope.test.ts +238 -0
  606. package/src/workspace/reason-codes.test.ts +6 -1
  607. package/src/workspace/reason-codes.ts +11 -0
  608. package/src/workspace/records-cli.ts +58 -5
  609. package/src/workspace/records.schema.json +5 -0
  610. package/src/workspace/release-candidates.ts +7 -2
  611. package/src/workspace/release-train.ts +157 -0
  612. package/src/workspace/release-workflow.ts +4 -3
  613. package/src/workspace/repo-ref.ts +113 -0
  614. package/src/workspace/run-event.schema.json +2 -2
  615. package/src/workspace/runs-cli.ts +48 -4
  616. package/src/workspace/runs.schema.json +7 -0
  617. package/src/workspace/status-contract.test.ts +46 -1
  618. package/src/workspace/status-decisions.test.ts +100 -0
  619. package/src/workspace/status-decisions.ts +151 -0
  620. package/src/workspace/status-gates.ts +9 -0
  621. package/src/workspace/status.schema.json +6 -0
  622. package/src/workspace/status.ts +17 -3
  623. package/src/workspace/where-filters.test.ts +39 -0
  624. package/src/workspace/work-cli.ts +5 -3
  625. package/src/workspace/work-evidence-ops.test.ts +176 -0
  626. package/src/workspace/work-evidence-ops.ts +189 -0
  627. package/src/workspace/work-evidence.schema.json +49 -2
  628. package/src/workspace/work-evidence.ts +22 -3
  629. package/src/workspace/workspace-gates.ts +200 -0
  630. package/src/workspace/workspace-kinds.schema.json +58 -3
  631. package/src/workspace/workspace-ledger.ts +130 -0
  632. package/src/workspace/workspace-run.test.ts +322 -0
  633. package/src/workspace/workspace-run.ts +461 -0
@@ -30,6 +30,13 @@
30
30
  "$ref": "#/$defs/version",
31
31
  "description": "The oldest chant that may read this declaration. An older chant refuses it with reader-too-old."
32
32
  },
33
+ "scope": {
34
+ "enum": [
35
+ "repo",
36
+ "org"
37
+ ],
38
+ "description": "What the workspace spans (#3168). repo, the default, is one repository's workspace. org is an org-level workspace: it holds only members of kind repo, each a reference to another repository's workspace, and chant workspace check fails any other member (WSP013). A warden generates an org workspace from its policy, or checks one against the forge's repository list with chant workspace check --forge-repos. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer."
39
+ },
33
40
  "members": {
34
41
  "type": "array",
35
42
  "description": "Members and example groups, in the order readers list them.",
@@ -161,6 +168,13 @@
161
168
  "class": {
162
169
  "$ref": "#/$defs/className",
163
170
  "description": "The principal class the signer must be in, read from the role grants at base (#3080, ws-079): human, runner, service, or a domain class a pinned package supplies. A class no pinned package supplies lets no approval through (fail closed). Absent: any signer the signers file lists."
171
+ },
172
+ "quorum": {
173
+ "description": "The approval rules an Op gate of this name takes (#4324), in place of the Op's own approval.quorum: one rule or a list, each with count, and optionally targets globs over the run's environment and roles from .chant/trust.json at base. Read at base, so a change can't lower the quorum its own run needs. notAuthor is refused: an Op gate has no pull request to read the author from. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer.",
174
+ "oneOf": [
175
+ { "$ref": "#/$defs/gateQuorumRule" },
176
+ { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/gateQuorumRule" } }
177
+ ]
164
178
  }
165
179
  }
166
180
  }
@@ -446,6 +460,18 @@
446
460
  "type": "string",
447
461
  "pattern": "^[a-z][a-z0-9-]{0,39}$"
448
462
  },
463
+ "gateQuorumRule": {
464
+ "type": "object",
465
+ "additionalProperties": false,
466
+ "required": ["count"],
467
+ "description": "One approval rule (#4290): count distinct human approvers, from roles when it names them.",
468
+ "properties": {
469
+ "targets": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 }, "description": "Globs over the run's environment: * within one / segment, ** across segments, ? one character. Absent: every run. A rule with targets never covers a run with no environment." },
470
+ "count": { "type": "integer", "minimum": 1, "description": "Distinct human approvers the rule needs." },
471
+ "roles": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 }, "description": "Only an approver .chant/trust.json at base gives one of these roles counts, and only with an approval sealed by a signer listed at base." },
472
+ "notAuthor": { "type": "boolean", "description": "Refused on an Op gate, which has no author to judge by." }
473
+ }
474
+ },
449
475
  "className": {
450
476
  "type": "string",
451
477
  "pattern": "^(?!x-)[a-z][a-z0-9-]{0,39}$",
@@ -573,7 +599,6 @@
573
599
  "description": "A member (#2524 D2). Its directory leaves the root project, and it gets its own build, lint and ledger.",
574
600
  "required": [
575
601
  "name",
576
- "dir",
577
602
  "kind"
578
603
  ],
579
604
  "properties": {
@@ -586,7 +611,10 @@
586
611
  },
587
612
  "kind": {
588
613
  "$ref": "#/$defs/kindName",
589
- "description": "How to read the member: chant, workspace, other, or a kind a pinned plugin supplies (#2535)."
614
+ "description": "How to read the member: chant, workspace, repo, other, or a kind a pinned plugin supplies (#2535). Every kind but repo needs dir; a repo member has repo instead (#3168)."
615
+ },
616
+ "repo": {
617
+ "$ref": "#/$defs/repoRef"
590
618
  },
591
619
  "roles": {
592
620
  "type": "array",
@@ -685,6 +713,10 @@
685
713
  "type": "boolean",
686
714
  "description": "Whether the member goes with an export (#2524 D10, #2552). chant workspace export writes only members that set travel to true into the export member, and refuses to name one that does not. Added in schema 1 by chant 0.101.0, so a declaration that uses it sets minReader to 0.101.0 or newer."
687
715
  },
716
+ "acceptWorkspaceGates": {
717
+ "type": "boolean",
718
+ "description": "Whether an approval of a workspace gate may stand in for this member's own gates (#2554, ws-039). It does only when the approval's digest covers the plan the member's run reached its gate with, and only when the declaration at base sets this to true; a working-tree change never opts a member in. Absent or false, a workspace gate never satisfies this member's gates. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer."
719
+ },
688
720
  "security": {
689
721
  "type": "array",
690
722
  "uniqueItems": true,
@@ -706,28 +738,91 @@
706
738
  "^x-": true
707
739
  },
708
740
  "additionalProperties": false,
709
- "if": {
710
- "type": "object",
711
- "properties": {
712
- "kind": {
713
- "const": "other"
741
+ "allOf": [
742
+ {
743
+ "if": {
744
+ "type": "object",
745
+ "properties": {
746
+ "kind": {
747
+ "const": "other"
748
+ }
749
+ },
750
+ "required": [
751
+ "kind"
752
+ ]
753
+ },
754
+ "then": {
755
+ "type": "object",
756
+ "properties": {
757
+ "because": {
758
+ "type": "string"
759
+ }
760
+ },
761
+ "required": [
762
+ "because"
763
+ ]
714
764
  }
715
765
  },
716
- "required": [
717
- "kind"
718
- ]
719
- },
720
- "then": {
721
- "type": "object",
722
- "properties": {
723
- "because": {
724
- "type": "string"
766
+ {
767
+ "if": {
768
+ "type": "object",
769
+ "properties": {
770
+ "kind": {
771
+ "const": "repo"
772
+ }
773
+ },
774
+ "required": [
775
+ "kind"
776
+ ]
777
+ },
778
+ "then": {
779
+ "required": [
780
+ "repo"
781
+ ],
782
+ "properties": {
783
+ "repo": true,
784
+ "dir": false
785
+ }
786
+ },
787
+ "else": {
788
+ "required": [
789
+ "dir"
790
+ ],
791
+ "properties": {
792
+ "dir": true,
793
+ "repo": false
794
+ }
725
795
  }
796
+ }
797
+ ]
798
+ },
799
+ "repoRef": {
800
+ "type": "object",
801
+ "description": "Another repository's workspace, named by URL and pinned revision (#3168). A member of kind repo carries it and has no dir. chant reads that workspace read-only through the other repository's own read contract, its chant workspace graph at the revision, the way it reads a nested workspace member, and never writes there. Added in schema 1 by chant 0.124.47, so a declaration that uses it sets minReader to 0.124.47 or newer.",
802
+ "required": [
803
+ "url",
804
+ "rev"
805
+ ],
806
+ "properties": {
807
+ "url": {
808
+ "type": "string",
809
+ "pattern": "^[^\\s]+$",
810
+ "description": "Where git fetches the repository from: an https, ssh or file URL, a local path, or an scp-style git@host:org/repo. A URL that carries a password or token is refused when it is read."
726
811
  },
727
- "required": [
728
- "because"
729
- ]
730
- }
812
+ "rev": {
813
+ "type": "string",
814
+ "pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$",
815
+ "description": "The pinned revision, a full commit id. A branch or tag is not a pin."
816
+ },
817
+ "workspace": {
818
+ "$ref": "#/$defs/dir",
819
+ "description": "The workspace root inside that repository, relative to its git root. Defaults to \".\"."
820
+ }
821
+ },
822
+ "patternProperties": {
823
+ "^x-": true
824
+ },
825
+ "additionalProperties": false
731
826
  },
732
827
  "memberFields": {
733
828
  "type": "object",
@@ -1696,10 +1791,24 @@
1696
1791
  ],
1697
1792
  "properties": {
1698
1793
  "branch": {
1699
- "type": "string",
1700
- "minLength": 1,
1701
- "pattern": "^[^\\s~^:?*\\[\\\\]+$",
1702
- "description": "The branch whose commits are tagged, such as main. Only its first-parent commits count."
1794
+ "oneOf": [
1795
+ {
1796
+ "type": "string",
1797
+ "minLength": 1,
1798
+ "pattern": "^[^\\s~^:?*\\[\\\\]+$"
1799
+ },
1800
+ {
1801
+ "type": "array",
1802
+ "minItems": 1,
1803
+ "uniqueItems": true,
1804
+ "items": {
1805
+ "type": "string",
1806
+ "minLength": 1,
1807
+ "pattern": "^[^\\s~^:?*\\[\\\\]+$"
1808
+ }
1809
+ }
1810
+ ],
1811
+ "description": "The branch whose commits are tagged, such as main. Only its first-parent commits count. A list judges each branch, so a branch ci.branches routes members to gets a green verdict and can release (#4325); the first is the trunk that readers use when they are not told a branch. A string reads as it always did."
1703
1812
  },
1704
1813
  "window": {
1705
1814
  "type": "string",
@@ -23,6 +23,13 @@
23
23
  * would take it, or left out with `environments-component-undeclared` when
24
24
  * the config's environments don't cover it.
25
25
  *
26
+ * Each environment also names its `executor` (#4402): the forge and committed
27
+ * workflow that deploys it, as the member's config declares on the
28
+ * environment's entry (`{ name: "prod", executor: { forge: "github",
29
+ * workflow: "deploy-prod.yml" } }`), a literal entry before a pattern. When
30
+ * none is declared, `forge` and `workflow` are null and `reason` says why.
31
+ * chant never derives it from a generated workflow's name.
32
+ *
26
33
  * `chant run --env` refuses a name the config's `environments` doesn't cover
27
34
  * whenever it declares any (`unknownEnvError` in `../env.ts`), so a ledger
28
35
  * environment the config no longer covers is left out, with a reason. The
@@ -34,7 +41,7 @@
34
41
  * `--at` exported. The ledger is always the local `chant/lifecycle` branch,
35
42
  * as for `workspace status`, and is never fetched.
36
43
  */
37
- import { type EnvironmentDeclaration } from "../config.js";
44
+ import { type EnvironmentDeclaration, type EnvironmentExecutor } from "../config.js";
38
45
  import type { ComponentEnvironmentDeclaration } from "../components/component.js";
39
46
  import { type MemberRuntimes } from "./runtimes.js";
40
47
  /** The environment `chant run --components` deploys to without `--env`. */
@@ -42,6 +49,19 @@ export declare const LOCAL_ENVIRONMENT = "local";
42
49
  /** Why a member's environments are only `local`, or leave out one the ledger has. Closed: part of the read contract. */
43
50
  export declare const ENVIRONMENT_REASON_CODES: readonly ["runtimes-config-unreadable", "environments-none-declared", "environments-ledger-undeclared", "environments-ledger-unreadable", "environments-component-undeclared"];
44
51
  export type EnvironmentReasonCode = (typeof ENVIRONMENT_REASON_CODES)[number];
52
+ /** Why an environment names no executor (#4402). Closed: part of the read contract. */
53
+ export declare const EXECUTOR_REASON_CODES: readonly ["executor-none-declared", "executor-config-unreadable"];
54
+ export type ExecutorReasonCode = (typeof EXECUTOR_REASON_CODES)[number];
55
+ /** The forge workflow that deploys an environment (#4402), or why none is named. */
56
+ export interface ComponentExecutor {
57
+ forge: EnvironmentExecutor["forge"] | null;
58
+ workflow: string | null;
59
+ /** Null when `forge` and `workflow` are set. */
60
+ reason: {
61
+ code: ExecutorReasonCode;
62
+ message: string;
63
+ } | null;
64
+ }
45
65
  export interface EnvironmentReason {
46
66
  code: EnvironmentReasonCode;
47
67
  message: string;
@@ -56,6 +76,8 @@ export interface ComponentEnvironment {
56
76
  source: "config" | "ledger" | "builtin" | "component";
57
77
  /** Where a release of the component goes in this environment, as the component declares it (#3153), or null when it declares nothing for it. */
58
78
  site: ComponentSite | null;
79
+ /** The forge and committed workflow that deploys this environment, from the member's config (#4402). */
80
+ executor: ComponentExecutor;
59
81
  /** The command that deploys the component there, on the site's runtime when the member hosts it and else the default runtime, run in the member's directory. */
60
82
  command: string;
61
83
  }
@@ -79,7 +101,7 @@ export type LedgerEnvironmentReader = (member: {
79
101
  /** What one member's config and ledger say about environments. */
80
102
  export interface MemberEnvironments {
81
103
  /** Each environment in list order, without the per-component site and command. */
82
- environments: Omit<ComponentEnvironment, "command" | "site">[];
104
+ environments: Omit<ComponentEnvironment, "command" | "site" | "executor">[];
83
105
  reasons: EnvironmentReason[];
84
106
  /** The config's environments, for whether `chant run --env` takes a name: null when the config couldn't be read, `[]` when it declares none. */
85
107
  declared?: EnvironmentDeclaration[] | null;
@@ -93,6 +115,8 @@ export interface MemberEnvironments {
93
115
  export declare const readLedgerEnvironments: LedgerEnvironmentReader;
94
116
  /** Join a member's config and ledger into its environment list, `local` first, then config order, then the ledger's. */
95
117
  export declare function memberEnvironments(runtimes: MemberRuntimes | undefined, ledger: LedgerEnvironments | undefined): MemberEnvironments;
118
+ /** The executor the member's config declares for `env`, or why there is none. */
119
+ export declare function executorFor(env: string, member: MemberEnvironments | undefined): ComponentExecutor;
96
120
  /**
97
121
  * The environments one component may deploy to, each with its command line.
98
122
  * `declared` is what the component's contract says (#3153): an environment
@@ -1 +1 @@
1
- {"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/workspace/environments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAGH,OAAO,EAAqE,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAC3H,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhE,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC,wHAAwH;AACxH,eAAO,MAAM,wBAAwB,gLAWK,CAAC;AAC3C,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,OAAO,EAAE,OAAO,CAAC;IACjB,yHAAyH;IACzH,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACtD,gJAAgJ;IAChJ,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,gKAAgK;IAChK,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2GAA2G;AAC3G,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AAED,0EAA0E;AAC1E,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,KAAK,kBAAkB,CAAC;AAEjH,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,YAAY,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IAC/D,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,gJAAgJ;IAChJ,QAAQ,CAAC,EAAE,sBAAsB,EAAE,GAAG,IAAI,CAAC;CAC5C;AAeD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,uBAkBpC,CAAC;AAEF,wHAAwH;AACxH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,EAAE,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,kBAAkB,CA8BnI;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,OAAO,SAAgB,EACvB,QAAQ,GAAE,SAAS,+BAA+B,EAAO,EACzD,KAAK,GAAE,SAAS,MAAM,EAAO,EAC7B,OAAO,GAAE,iBAAiB,EAAO,GAChC,oBAAoB,EAAE,CAqBxB"}
1
+ {"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/workspace/environments.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,13 @@
23
23
  * would take it, or left out with `environments-component-undeclared` when
24
24
  * the config's environments don't cover it.
25
25
  *
26
+ * Each environment also names its `executor` (#4402): the forge and committed
27
+ * workflow that deploys it, as the member's config declares on the
28
+ * environment's entry (`{ name: "prod", executor: { forge: "github",
29
+ * workflow: "deploy-prod.yml" } }`), a literal entry before a pattern. When
30
+ * none is declared, `forge` and `workflow` are null and `reason` says why.
31
+ * chant never derives it from a generated workflow's name.
32
+ *
26
33
  * `chant run --env` refuses a name the config's `environments` doesn't cover
27
34
  * whenever it declares any (`unknownEnvError` in `../env.ts`), so a ledger
28
35
  * environment the config no longer covers is left out, with a reason. The
@@ -35,7 +42,7 @@
35
42
  * as for `workspace status`, and is never fetched.
36
43
  */
37
44
  import { execFileSync } from "node:child_process";
38
- import { environmentName, isEnvironmentPattern, matchesDeclaredEnvironment } from "../config.js";
45
+ import { environmentExecutor, environmentName, isEnvironmentPattern, matchesDeclaredEnvironment } from "../config.js";
39
46
  import { LOCAL_RUNTIME } from "./runtimes.js";
40
47
  import { ENV_PATTERN, LIFECYCLE_REF, MEMBERS_DIR } from "./status.js";
41
48
  /** The environment `chant run --components` deploys to without `--env`. */
@@ -53,6 +60,13 @@ export const ENVIRONMENT_REASON_CODES = [
53
60
  /** A component declares an environment the config's environments don't cover, so chant run --env would refuse it (#3153). */
54
61
  "environments-component-undeclared",
55
62
  ];
63
+ /** Why an environment names no executor (#4402). Closed: part of the read contract. */
64
+ export const EXECUTOR_REASON_CODES = [
65
+ /** The member's chant.config.ts declares no executor for the environment, so nothing says which forge workflow deploys it. */
66
+ "executor-none-declared",
67
+ /** The member's chant.config.ts could not be read, so whether a forge workflow deploys the environment is unknown. */
68
+ "executor-config-unreadable",
69
+ ];
56
70
  function git(cwd, args, input) {
57
71
  return execFileSync("git", args, { cwd, encoding: "utf-8", input, stdio: [input === undefined ? "ignore" : "pipe", "pipe", "pipe"] });
58
72
  }
@@ -129,6 +143,16 @@ export function memberEnvironments(runtimes, ledger) {
129
143
  add(name, "ledger");
130
144
  return { environments: out, reasons, declared };
131
145
  }
146
+ /** The executor the member's config declares for `env`, or why there is none. */
147
+ export function executorFor(env, member) {
148
+ if (member && member.declared === null) {
149
+ return { forge: null, workflow: null, reason: { code: "executor-config-unreadable", message: `chant.config.ts could not be read, so no executor is known for ${env}` } };
150
+ }
151
+ const found = environmentExecutor(member?.declared ?? undefined, env);
152
+ if (found)
153
+ return { forge: found.forge, workflow: found.workflow, reason: null };
154
+ return { forge: null, workflow: null, reason: { code: "executor-none-declared", message: `chant.config.ts declares no executor for ${env}` } };
155
+ }
132
156
  /**
133
157
  * The environments one component may deploy to, each with its command line.
134
158
  * `declared` is what the component's contract says (#3153): an environment
@@ -159,6 +183,6 @@ export function componentEnvironments(component, member, runtime = LOCAL_RUNTIME
159
183
  return list.map((e) => {
160
184
  const site = sites.get(e.name) ?? null;
161
185
  const on = site?.runtime && (site.runtime === LOCAL_RUNTIME || hosts.includes(site.runtime)) ? site.runtime : runtime;
162
- return { ...e, site, command: `chant run --components ${component}${on === LOCAL_RUNTIME ? "" : ` --on ${on}`}${e.default ? "" : ` --env ${e.name}`}` };
186
+ return { ...e, site, executor: executorFor(e.name, member), command: `chant run --components ${component}${on === LOCAL_RUNTIME ? "" : ` --on ${on}`}${e.default ? "" : ` --env ${e.name}`}` };
163
187
  });
164
188
  }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The `flyway-dir` reader (#4400): the migrations of a Flyway project, in the
3
+ * order `flyway migrate` applies them. It reads the layout with
4
+ * `./flyway-layout.ts`, the reading `yodel check` shares, and never runs
5
+ * Flyway or substitutes placeholders (a replay does that).
6
+ *
7
+ * File names follow Flyway's migration naming
8
+ * (https://documentation.red-gate.com/fd/migrations-271585107.html):
9
+ *
10
+ * - versioned `V<version>__<description>.sql`, the version digits joined by
11
+ * `.` or `_`;
12
+ * - repeatable `R__<description>.sql`, run after every versioned migration,
13
+ * in the order of their descriptions;
14
+ * - baseline `B<version>__<description>.sql`, listed with the versioned ones;
15
+ * - undo `U<version>__<description>.sql`, which is the `down` file of the
16
+ * versioned migration with that version and is not listed on its own.
17
+ *
18
+ * The prefixes, the separator and the suffixes come from the configuration.
19
+ * Versions compare part by part as numbers, so `V2` comes before `V10` and
20
+ * `V1.1` before `V1.2`. Callbacks are not migrations, and a Java or Kotlin
21
+ * migration is a gap: its code is not SQL.
22
+ */
23
+ import type { KindLinkRead, KindReadMigration, KindReaderInput } from "./kind-link-readers.js";
24
+ import { type FlywayConfig } from "./flyway-layout.js";
25
+ /** Compare dotted versions part by part as numbers; a missing part is 0. */
26
+ export declare function compareVersions(a: string, b: string): number;
27
+ export interface FlywayFile {
28
+ type: KindReadMigration["type"];
29
+ /** The version written with `.` between its parts; empty for a repeatable migration. */
30
+ version: string;
31
+ description: string;
32
+ file: string;
33
+ }
34
+ /** The file's migration role under `config`'s naming, or undefined when its name is not a migration's. */
35
+ export declare function classifyFlywayFile(file: string, config: FlywayConfig): FlywayFile | undefined;
36
+ /** The configuration file the replay depends on, besides the migrations: it holds the placeholders. */
37
+ export declare function flywayReplayFiles(input: Pick<KindReaderInput, "tree" | "dir">): string[];
38
+ export declare const readFlywayDir: (input: KindReaderInput) => KindLinkRead;
39
+ //# sourceMappingURL=flyway-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flyway-dir.d.ts","sourceRoot":"","sources":["../../src/workspace/flyway-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAwE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK1H,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChC,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0GAA0G;AAC1G,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAoB7F;AAED,uGAAuG;AACvG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,MAAM,EAAE,CAGxF;AAED,eAAO,MAAM,aAAa,UAAW,eAAe,KAAG,YAAiG,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * The `flyway-dir` reader (#4400): the migrations of a Flyway project, in the
3
+ * order `flyway migrate` applies them. It reads the layout with
4
+ * `./flyway-layout.ts`, the reading `yodel check` shares, and never runs
5
+ * Flyway or substitutes placeholders (a replay does that).
6
+ *
7
+ * File names follow Flyway's migration naming
8
+ * (https://documentation.red-gate.com/fd/migrations-271585107.html):
9
+ *
10
+ * - versioned `V<version>__<description>.sql`, the version digits joined by
11
+ * `.` or `_`;
12
+ * - repeatable `R__<description>.sql`, run after every versioned migration,
13
+ * in the order of their descriptions;
14
+ * - baseline `B<version>__<description>.sql`, listed with the versioned ones;
15
+ * - undo `U<version>__<description>.sql`, which is the `down` file of the
16
+ * versioned migration with that version and is not listed on its own.
17
+ *
18
+ * The prefixes, the separator and the suffixes come from the configuration.
19
+ * Versions compare part by part as numbers, so `V2` comes before `V10` and
20
+ * `V1.1` before `V1.2`. Callbacks are not migrations, and a Java or Kotlin
21
+ * migration is a gap: its code is not SQL.
22
+ */
23
+ import { codeMigrations, findFlywayConfig, isCallback, readFlywayConfig, walk } from "./flyway-layout.js";
24
+ import { fieldString, withReplay } from "./migration-dirs.js";
25
+ const escape = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
26
+ /** Compare dotted versions part by part as numbers; a missing part is 0. */
27
+ export function compareVersions(a, b) {
28
+ const pa = a.split(/[._]/).map(BigInt);
29
+ const pb = b.split(/[._]/).map(BigInt);
30
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
31
+ const x = pa[i] ?? 0n;
32
+ const y = pb[i] ?? 0n;
33
+ if (x !== y)
34
+ return x < y ? -1 : 1;
35
+ }
36
+ return 0;
37
+ }
38
+ /** The file's migration role under `config`'s naming, or undefined when its name is not a migration's. */
39
+ export function classifyFlywayFile(file, config) {
40
+ const name = file.split("/").pop() ?? file;
41
+ if (isCallback(name))
42
+ return undefined;
43
+ const suffix = config.sqlMigrationSuffixes.find((s) => name.endsWith(s));
44
+ if (!suffix)
45
+ return undefined;
46
+ const stem = name.slice(0, -suffix.length);
47
+ const sep = escape(config.sqlMigrationSeparator);
48
+ const repeatable = new RegExp(`^${escape(config.repeatableSqlMigrationPrefix)}${sep}(.+)$`).exec(stem);
49
+ if (repeatable)
50
+ return { type: "repeatable", version: "", description: repeatable[1].replace(/_/g, " "), file };
51
+ const roles = [
52
+ ["versioned", config.sqlMigrationPrefix],
53
+ ["baseline", config.baselineMigrationPrefix],
54
+ ["undo", config.undoSqlMigrationPrefix],
55
+ ];
56
+ for (const [type, prefix] of roles) {
57
+ if (!prefix)
58
+ continue;
59
+ const m = new RegExp(`^${escape(prefix)}([0-9]+(?:[._][0-9]+)*)${sep}(.+)$`).exec(stem);
60
+ if (m)
61
+ return { type, version: m[1].replace(/_/g, "."), description: m[2].replace(/_/g, " "), file };
62
+ }
63
+ return undefined;
64
+ }
65
+ /** The configuration file the replay depends on, besides the migrations: it holds the placeholders. */
66
+ export function flywayReplayFiles(input) {
67
+ const f = findFlywayConfig(input.tree, input.dir);
68
+ return f === undefined ? [] : [f];
69
+ }
70
+ export const readFlywayDir = (input) => withReplay(listFlywayDir(input), input.tree, input.dir, flywayReplayFiles(input));
71
+ function listFlywayDir(input) {
72
+ const { tree, dir } = input;
73
+ const gaps = [];
74
+ const result = { reader: "flyway-dir", links: [], gaps, migrations: [] };
75
+ const configFile = findFlywayConfig(tree, dir);
76
+ let config;
77
+ try {
78
+ config = readFlywayConfig(tree, configFile, dir);
79
+ }
80
+ catch (err) {
81
+ gaps.push({ file: configFile ?? dir, line: 1, message: `the Flyway configuration could not be read (${err.message}), so no migration was listed` });
82
+ return result;
83
+ }
84
+ const dialect = fieldString(input.fields, "dialect", config.dialect ?? "postgres");
85
+ for (const l of config.outside)
86
+ gaps.push({ file: configFile ?? dir, line: 1, message: `the location ${l} lies outside the workspace, so its migrations were not listed` });
87
+ const files = [...new Set(config.locations.flatMap((d) => walk(tree, d)))];
88
+ const classified = files.map((f) => classifyFlywayFile(f, config)).filter((f) => f !== undefined);
89
+ for (const code of codeMigrations(tree, config))
90
+ gaps.push({ file: code, line: 1, message: `${code.split("/").pop()} is a code migration; its code is not SQL, so it is not listed` });
91
+ const undo = new Map(classified.filter((f) => f.type === "undo").map((f) => [f.version, f.file]));
92
+ const ordered = classified.filter((f) => f.type === "versioned" || f.type === "baseline").sort((a, b) => compareVersions(a.version, b.version) || (a.type === "baseline" ? -1 : 1) || (a.file < b.file ? -1 : 1));
93
+ const repeatable = classified.filter((f) => f.type === "repeatable").sort((a, b) => (a.description < b.description ? -1 : a.description > b.description ? 1 : a.file < b.file ? -1 : 1));
94
+ const seen = new Map();
95
+ for (const f of ordered.filter((x) => x.type === "versioned")) {
96
+ const prior = [...seen.keys()].find((v) => compareVersions(v, f.version) === 0);
97
+ if (prior !== undefined)
98
+ gaps.push({ file: f.file, line: 1, message: `version ${f.version} is also ${seen.get(prior)}; Flyway refuses two migrations with one version` });
99
+ else
100
+ seen.set(f.version, f.file);
101
+ }
102
+ [...ordered, ...repeatable].forEach((f, i) => result.migrations.push({ position: i + 1, version: f.version, name: f.description, type: f.type, file: f.file, line: 1, down: f.type === "versioned" ? (undo.get(f.version) ?? false) : false, dialect }));
103
+ return result;
104
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * A Flyway project's layout, read from a workspace tree (#4400): its
3
+ * `flyway.toml` or `flyway.conf`, the locations it names, read recursively,
4
+ * and the placeholders it substitutes.
5
+ *
6
+ * This is the layout reading of sql-yodeler's `src/check/flyway.ts` (#250),
7
+ * moved here so the workspace kind and `yodel check` share one reader. It
8
+ * works on a {@link WorkspaceTree} and tree-relative paths instead of the
9
+ * file system, and it never runs Flyway or connects to a database.
10
+ *
11
+ * The configuration is the first `flyway.toml`, else `flyway.conf`, found in
12
+ * the directory checked or a directory above it, up to the tree's root. Its
13
+ * locations are read relative to the file's own directory:
14
+ *
15
+ * filesystem:<path> that directory
16
+ * classpath:<path> src/main/resources/<path> (and, for code
17
+ * <path> migrations, src/main/java/<path> and src/main/kotlin/<path>)
18
+ *
19
+ * With no configuration, or one that names no location, the directory
20
+ * checked is the one location. A location outside the tree is reported by
21
+ * {@link FlywayConfig.outside}, not read. A Java or Kotlin migration in a
22
+ * location is not SQL and is reported by {@link codeMigrations}.
23
+ *
24
+ * Placeholders are `${name}` (the prefix and suffix are configurable), from
25
+ * `flyway.placeholders.<name>` (conf) or `[flyway.placeholders]` (toml), plus
26
+ * Flyway's own: `flyway:defaultSchema`, `flyway:user`, `flyway:database`,
27
+ * `flyway:timestamp`, `flyway:filename`, `flyway:workingDirectory`,
28
+ * `flyway:table` and `flyway:environment`. {@link substitute} replaces them
29
+ * for a replay; the reader that lists migrations leaves the text as it is.
30
+ */
31
+ import { type WorkspaceTree } from "./tree.js";
32
+ export interface FlywayConfig {
33
+ /** The configuration file, tree-relative; undefined with none. */
34
+ file?: string;
35
+ /** Where file names are relative to: the configuration's directory, else the directory checked. Tree-relative. */
36
+ root: string;
37
+ /** The SQL locations, tree-relative directories. */
38
+ locations: string[];
39
+ /** Directories code migrations (Java, Kotlin) of a classpath location would be in. */
40
+ codeLocations: string[];
41
+ /** Locations the configuration names that lie outside the tree, as written. */
42
+ outside: string[];
43
+ placeholders: Record<string, string>;
44
+ placeholderPrefix: string;
45
+ placeholderSuffix: string;
46
+ placeholderReplacement: boolean;
47
+ sqlMigrationPrefix: string;
48
+ repeatableSqlMigrationPrefix: string;
49
+ baselineMigrationPrefix: string;
50
+ undoSqlMigrationPrefix: string;
51
+ sqlMigrationSeparator: string;
52
+ sqlMigrationSuffixes: string[];
53
+ defaultSchema?: string;
54
+ user?: string;
55
+ database?: string;
56
+ /** The JDBC URL, when the configuration has one. */
57
+ url?: string;
58
+ /** The dialect the URL names: `postgres` or `clickhouse`; undefined for another or none. */
59
+ dialect?: string;
60
+ table: string;
61
+ environment?: string;
62
+ }
63
+ /** The first `flyway.toml`, else `flyway.conf`, in `dir` or a directory above it, up to the tree's root. */
64
+ export declare function findFlywayConfig(tree: WorkspaceTree, dir: string): string | undefined;
65
+ type Values = Record<string, string | string[] | boolean>;
66
+ /** Java-properties `flyway.*` keys, without the `flyway.` prefix. */
67
+ export declare function parseFlywayConf(text: string): Values;
68
+ /** A TOML document, as far as Flyway's configuration uses it: tables, strings, arrays of strings, booleans and numbers. */
69
+ export declare function parseToml(text: string): Record<string, Values>;
70
+ /** The configuration `file` holds, or the defaults with `dir` as the one location when there is none. */
71
+ export declare function readFlywayConfig(tree: WorkspaceTree, file: string | undefined, dir: string): FlywayConfig;
72
+ /** Every file under `dir`, recursively, tree-relative, sorted; none when it does not exist. */
73
+ export declare function walk(tree: WorkspaceTree, dir: string): string[];
74
+ /** A Flyway SQL callback (`beforeMigrate.sql`, `afterEachMigrate__notify.sql`, ...): run around a migrate, not a migration. */
75
+ export declare const isCallback: (file: string) => boolean;
76
+ /** The code migrations (Java, Kotlin) in `config`'s locations, relative to the tree. */
77
+ export declare function codeMigrations(tree: WorkspaceTree, config: FlywayConfig): string[];
78
+ /** A placeholder with no value; `file` is as the caller passed it, `line` is from 1. */
79
+ export declare class FlywayPlaceholderError extends Error {
80
+ readonly file: string;
81
+ readonly line: number;
82
+ readonly placeholder: string;
83
+ readonly name: string;
84
+ readonly where: string;
85
+ constructor(file: string, line: number, placeholder: string, name: string, where: string);
86
+ }
87
+ /**
88
+ * `text` with its placeholders replaced, line by line so line numbers hold.
89
+ * A placeholder with no value throws a {@link FlywayPlaceholderError} naming
90
+ * `file` and the line, as Flyway's own run would fail.
91
+ */
92
+ export declare function substitute(text: string, file: string, config: FlywayConfig, fallback?: {
93
+ defaultSchema?: string | undefined;
94
+ }): string;
95
+ export {};
96
+ //# sourceMappingURL=flyway-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flyway-layout.d.ts","sourceRoot":"","sources":["../../src/workspace/flyway-layout.ts"],"names":[],"mappings":"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"}