@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
@@ -19,12 +19,24 @@
19
19
  * `resolveLinks` (`./links.ts`) resolves the links beside the declared ones,
20
20
  * with origin `kind-reader`; WSP093 and WSP094 name the reader's file and line,
21
21
  * and WSP099 reports the gaps.
22
+ *
23
+ * A migration directory's reader (#4400) lists its migrations in order, in
24
+ * {@link KindLinkRead.migrations}, and returns no links: what the migrations
25
+ * produce comes from a replay.
26
+ *
27
+ * A reader may also return outputs (#3935): names the member's files state,
28
+ * which other members link to. A dbt project's models are outputs, read the
29
+ * same way as its sources. `resolveLinks` adds them to the member's handles
30
+ * (`withReaderOutputs`), so a link to one resolves, and goes missing when the
31
+ * file that states it is gone.
22
32
  */
23
33
 
24
34
  import type { Declaration, Member } from "./declaration";
25
35
  import { resolveMemberFields, type FieldValue, type KindLinkReaderName, type KindRegistry } from "./kinds";
26
36
  import type { WorkspaceTree } from "./tree";
27
37
  import { readDbtProject } from "./dbt-project-reader";
38
+ import { readClickHouseMigrationsDir, readGolangMigrateDir, readGooseDir } from "./migration-dirs";
39
+ import { readFlywayDir } from "./flyway-dir";
28
40
 
29
41
  /** One link a reader found in the member's files. */
30
42
  export interface KindReadLink {
@@ -54,18 +66,67 @@ export interface KindReadGap {
54
66
  file: string;
55
67
  line: number;
56
68
  message: string;
69
+ /**
70
+ * True when the gap leaves an output out of {@link KindLinkRead.outputs}
71
+ * (#3935): a link to a name the member does not list is then unresolved,
72
+ * not missing.
73
+ */
74
+ outputs?: boolean;
75
+ }
76
+
77
+ /** One output a reader found in the member's files: a name other members may link to. */
78
+ export interface KindReadOutput {
79
+ name: string;
80
+ /** The file that states it, relative to the workspace root. */
81
+ file: string;
82
+ /** Its line, from 1. */
83
+ line: number;
84
+ }
85
+
86
+ /**
87
+ * One migration a migration-directory reader found (#4400), in the order the
88
+ * tool applies it. The reader lists files and never runs the tool, so the
89
+ * schema the migrations produce comes from a replay, not from here.
90
+ */
91
+ export interface KindReadMigration {
92
+ /** 1-based position in the order the tool applies the migrations. */
93
+ position: number;
94
+ /** The version as the file name writes it, such as `00002`, `20240101120000` or `1.2`. */
95
+ version: string;
96
+ name: string;
97
+ /** `versioned` runs once; `repeatable` runs again when its checksum changes (Flyway); `baseline` and `undo` are Flyway's B and U files. */
98
+ type: "versioned" | "repeatable" | "baseline" | "undo";
99
+ /** The file with the up statements, relative to the workspace root. */
100
+ file: string;
101
+ /** The line the up statements start on, from 1. */
102
+ line: number;
103
+ /** The file that undoes it, or true when the same file does (goose), or false when none does. */
104
+ down: string | boolean;
105
+ /** The SQL dialect the migration is written in: the member's `dialect` field, or what the directory's own configuration names. */
106
+ dialect: string;
107
+ /** False when the file asks to run outside a transaction (`-- +goose NO TRANSACTION`). */
108
+ transaction?: boolean;
57
109
  }
58
110
 
59
111
  export interface KindLinkRead {
60
- /** The reader that ran. */
61
- reader: KindLinkReaderName;
112
+ /** The reader that ran: a kind's reader, or `lexicon <name>` for links a member's lexicon read from its declarations (#4397). */
113
+ reader: KindLinkReaderName | `lexicon${string}`;
62
114
  links: KindReadLink[];
63
115
  gaps: KindReadGap[];
116
+ /**
117
+ * The outputs the member exposes that its files state (#3935), beside the
118
+ * ones its kind lists. `resolveLinks` adds them to the member's handles, so
119
+ * another member can link to them. A gap flagged `outputs` makes the list
120
+ * incomplete.
121
+ */
122
+ outputs?: KindReadOutput[];
64
123
  /**
65
124
  * The member field that names the producer, for messages that ask the
66
125
  * author to set it when the files don't say (`sqlMember` for dbt).
67
126
  */
68
127
  producerField?: string;
128
+ /** The migrations of a migration directory (#4400), in the order they apply; unset for other readers. */
129
+ migrations?: KindReadMigration[];
69
130
  }
70
131
 
71
132
  /** What a reader gets: the member, its directory and resolved fields, and the tree read. */
@@ -83,6 +144,10 @@ export type KindLinkReader = (input: KindReaderInput) => KindLinkRead;
83
144
  /** Every reader chant ships, by the name a kinds file uses. */
84
145
  export const LINK_READERS: Record<KindLinkReaderName, KindLinkReader> = {
85
146
  "dbt-project": readDbtProject,
147
+ "goose-dir": readGooseDir,
148
+ "golang-migrate-dir": readGolangMigrateDir,
149
+ "clickhouse-migrations-dir": readClickHouseMigrationsDir,
150
+ "flyway-dir": readFlywayDir,
86
151
  };
87
152
 
88
153
  /**
@@ -102,7 +167,7 @@ export function readKindLinks(declaration: Declaration, tree: WorkspaceTree, kin
102
167
  try {
103
168
  out.set(m.name, LINK_READERS[kind.reader]({ member: m, dir, fields, tree }));
104
169
  } catch (err) {
105
- out.set(m.name, { reader: kind.reader, links: [], gaps: [{ file: dir || ".", line: 1, message: `the ${kind.reader} reader failed: ${(err as Error).message}` }] });
170
+ out.set(m.name, { reader: kind.reader, links: [], gaps: [{ file: dir || ".", line: 1, message: `the ${kind.reader} reader failed: ${(err as Error).message}`, outputs: true }] });
106
171
  }
107
172
  }
108
173
  return out;
@@ -61,10 +61,10 @@ function pkg(name: string, version: string, kinds: unknown[] | null, extra: Reco
61
61
  }
62
62
 
63
63
  describe("the built-in kinds (#2535)", () => {
64
- test("are chant, workspace, design and other, and the group kind examples", () => {
65
- expect(BUILTIN_KINDS.map((k) => `${k.name}:${k.shape}`)).toEqual(["chant:member", "workspace:member", "other:member", "design:member", "examples:group"]);
64
+ test("are chant, workspace, repo, design and other, and the group kind examples", () => {
65
+ expect(BUILTIN_KINDS.map((k) => `${k.name}:${k.shape}`)).toEqual(["chant:member", "workspace:member", "repo:member", "other:member", "design:member", "examples:group"]);
66
66
  const registry = builtinKindRegistry();
67
- expect(registry.names()).toEqual(["chant", "design", "other", "workspace"]);
67
+ expect(registry.names()).toEqual(["chant", "design", "other", "repo", "workspace"]);
68
68
  expect(registry.get(EXAMPLES_KIND)?.shape).toBe("group");
69
69
  });
70
70
 
@@ -72,8 +72,13 @@ describe("the built-in kinds (#2535)", () => {
72
72
  const entry = declarationSchema.$defs.entry;
73
73
  expect(entry.if.properties.kind.const).toBe(EXAMPLES_KIND);
74
74
  expect(declarationSchema.$defs.group.properties.kind.const).toBe(EXAMPLES_KIND);
75
- expect(declarationSchema.$defs.member.if.properties.kind.const).toBe("other");
76
- expect(declarationSchema.$defs.member.then.required).toEqual(["because"]);
75
+ const [other, repo] = declarationSchema.$defs.member.allOf;
76
+ expect(other.if.properties.kind.const).toBe("other");
77
+ expect(other.then.required).toEqual(["because"]);
78
+ // A repo member (#3168) has repo and no dir; every other member has dir and no repo.
79
+ expect(repo.if.properties.kind.const).toBe("repo");
80
+ expect(repo.then.required).toEqual(["repo"]);
81
+ expect(repo.else?.required).toEqual(["dir"]);
77
82
  });
78
83
 
79
84
  test("a registry refuses a name twice", () => {
@@ -203,7 +208,7 @@ describe("loadKindRegistry: kinds from the pins", () => {
203
208
  const { registry, problems } = loadKindRegistry([{ package: "@acme/chant-lexicon-tf", version: "1.2.3", path: null }], root);
204
209
  expect(problems).toEqual([]);
205
210
  expect(registry.get("terraform")).toMatchObject({ source: "@acme/chant-lexicon-tf", precedence: 400 });
206
- expect(registry.names()).toEqual(["chant", "design", "other", "terraform", "workspace"]);
211
+ expect(registry.names()).toEqual(["chant", "design", "other", "repo", "terraform", "workspace"]);
207
212
  expect(existsSync(join(root, "node_modules/@acme/chant-lexicon-tf/IMPORTED"))).toBe(false);
208
213
  expect((globalThis as { __chantKindsImported?: boolean }).__chantKindsImported).toBeUndefined();
209
214
  });
@@ -223,7 +228,7 @@ describe("loadKindRegistry: kinds from the pins", () => {
223
228
  ],
224
229
  root,
225
230
  );
226
- expect(registry.names()).toEqual(["chant", "design", "other", "workspace"]);
231
+ expect(registry.names()).toEqual(["chant", "design", "other", "repo", "workspace"]);
227
232
  expect(problems).toEqual([
228
233
  { pin: 1, message: "pinned package absent is not installed; install it to read the kinds it supplies" },
229
234
  { pin: 2, message: "tf-kinds is pinned at 1.0.0, and 2.0.0 is installed" },
@@ -25,6 +25,7 @@ import { joinPath, skippedDir } from "./tree";
25
25
  import { checkPinIntegrity } from "./pin-integrity";
26
26
  import { dataExportTarget, findInstalledPackage } from "./class-data";
27
27
  import { loadAjv2020 } from "./ajv2020";
28
+ import yaml from "js-yaml";
28
29
 
29
30
  export const KINDS_SCHEMA_ID = schema.$id;
30
31
 
@@ -34,7 +35,9 @@ export const KINDS_SUBPATH = "./workspace-kinds";
34
35
  /**
35
36
  * The probe a package's kind carries (#2535, #2545). It passes when any of
36
37
  * its clauses does. A name in either clause may use `*`, which matches any
37
- * run of characters in one file name, so `*.tf` is every Terraform file.
38
+ * run of characters in one file name, so `*.tf` is every Terraform file, and
39
+ * `[0-9]` matches one digit (#4400), so `[0-9]*_*.sql` is a file that opens
40
+ * with a version number.
38
41
  */
39
42
  export interface FileProbe {
40
43
  /** A file matching one of these names sits directly in the directory. */
@@ -53,6 +56,13 @@ export interface FileProbe {
53
56
  * without claiming every Node package (#3151).
54
57
  */
55
58
  anyJsonKey?: { in: string[]; pointers: string[] };
59
+ /**
60
+ * A file directly in the directory whose name matches one of `in` has a
61
+ * line that starts, after leading space and ignoring case, with one of
62
+ * `starts` (#4400). This is how a goose directory is told from any other
63
+ * directory of `.sql` files: its files carry `-- +goose Up`.
64
+ */
65
+ anyLine?: { in: string[]; starts: string[] };
56
66
  }
57
67
 
58
68
  /** A string, integer or boolean field a kind declares for its members (#3151). */
@@ -81,7 +91,9 @@ export type KindProbe =
81
91
  /** The directory exists; nothing else is checked (`other`). */
82
92
  | { directory: true }
83
93
  /** The directory holds a chant project, as {@link holdsChantProject} says (`examples`). */
84
- | { chantProject: true };
94
+ | { chantProject: true }
95
+ /** Nothing local: the member names another repository's workspace (`repo`, #3168). */
96
+ | { repo: true };
85
97
 
86
98
  /**
87
99
  * Which outputs a member of a kind exposes as link targets (#2524 D6,
@@ -135,15 +147,38 @@ export interface MemberKind {
135
147
  * entry states.
136
148
  */
137
149
  reader?: KindLinkReaderName;
150
+ /** A file every member of the kind has, and the JSON Schema it must pass (#3672); unset, the kind checks no member file. */
151
+ memberFile?: KindMemberFile;
152
+ }
153
+
154
+ /**
155
+ * A kind's member file (#3672): `path` in each member's directory must pass
156
+ * the JSON Schema at `schema` in the supplying package. `chant workspace
157
+ * check` reads and validates it (WSP012). The schema is read as data when the
158
+ * package's kinds are read, so a schema that is missing or doesn't compile is
159
+ * a load problem (WSP002), and `validate` is unset.
160
+ */
161
+ export interface KindMemberFile {
162
+ /** The file, relative to the member's directory. */
163
+ path: string;
164
+ /** The schema, as the kinds file names it, relative to the package. */
165
+ schema: string;
166
+ /** The schema, absolute; unset until the package directory is known. */
167
+ schemaFile?: string;
168
+ /** The compiled schema; unset when it could not be read or compiled. */
169
+ validate?: MemberFileValidate;
138
170
  }
139
171
 
172
+ /** A compiled member-file schema, in Ajv's shape. */
173
+ export type MemberFileValidate = ((data: unknown) => boolean) & { errors?: { instancePath: string; message?: string; params?: Record<string, unknown> }[] | null };
174
+
140
175
  /**
141
176
  * The link readers chant ships (#3932). A kind names one in its kinds file as
142
177
  * `reader`. The readers are chant's own code, not the package's: a kinds file
143
178
  * stays data, and chant never imports the package that supplies it. Closed:
144
179
  * a kind naming another reader is kept without one, and the load reports it.
145
180
  */
146
- export const KIND_LINK_READERS = ["dbt-project"] as const;
181
+ export const KIND_LINK_READERS = ["dbt-project", "goose-dir", "golang-migrate-dir", "clickhouse-migrations-dir", "flyway-dir"] as const;
147
182
  export type KindLinkReaderName = (typeof KIND_LINK_READERS)[number];
148
183
 
149
184
  export interface KindRegistry {
@@ -157,6 +192,9 @@ export interface KindRegistry {
157
192
  /** The group kind (ws-051). An entry of this kind is a group, not a member. */
158
193
  export const EXAMPLES_KIND = "examples";
159
194
 
195
+ /** The member kind that names another repository's workspace by URL and pinned revision (#3168). */
196
+ export const REPO_KIND = "repo";
197
+
160
198
  /** The data member kind that holds design artifacts (#2549, ws-062). */
161
199
  export const DESIGN_KIND = "design";
162
200
 
@@ -179,6 +217,15 @@ export const BUILTIN_KINDS: readonly MemberKind[] = [
179
217
  outputs: { from: "none" },
180
218
  source: "builtin",
181
219
  },
220
+ {
221
+ name: REPO_KIND,
222
+ description: "another repository's workspace, named by URL and pinned revision; chant reads it through that repository's own chant workspace graph and never writes there",
223
+ probe: { repo: true },
224
+ precedence: 0,
225
+ shape: "member",
226
+ outputs: { from: "none" },
227
+ source: "builtin",
228
+ },
182
229
  {
183
230
  name: "other",
184
231
  description: "a directory chant does not read; the entry says why in `because`",
@@ -232,7 +279,8 @@ export function builtinKindRegistry(): KindRegistry {
232
279
  export function probeKind(kind: MemberKind, tree: WorkspaceTree, dir: string): boolean {
233
280
  if ("directory" in kind.probe) return true;
234
281
  if ("chantProject" in kind.probe) return holdsChantProject(tree, dir);
235
- const { anyFile, anyBlock, anyJsonKey } = kind.probe;
282
+ if ("repo" in kind.probe) return true;
283
+ const { anyFile, anyBlock, anyJsonKey, anyLine } = kind.probe;
236
284
  if (anyFile && filesMatching(tree, dir, anyFile).length > 0) return true;
237
285
  if (anyJsonKey) {
238
286
  for (const file of filesMatching(tree, dir, anyJsonKey.in)) {
@@ -244,6 +292,16 @@ export function probeKind(kind: MemberKind, tree: WorkspaceTree, dir: string): b
244
292
  }
245
293
  }
246
294
  }
295
+ if (anyLine) {
296
+ const starts = anyLine.starts.map((t) => t.toLowerCase());
297
+ for (const file of filesMatching(tree, dir, anyLine.in)) {
298
+ try {
299
+ if (tree.read(file).split(/\r?\n/).some((l) => starts.some((t) => l.trimStart().toLowerCase().startsWith(t)))) return true;
300
+ } catch {
301
+ // An unreadable file is no evidence either way.
302
+ }
303
+ }
304
+ }
247
305
  if (anyBlock) {
248
306
  const opener = new RegExp(`^\\s*(?:${anyBlock.blocks.map(escapeRegExp).join("|")})\\s*\\{`, "m");
249
307
  for (const file of filesMatching(tree, dir, anyBlock.in)) {
@@ -259,7 +317,7 @@ export function probeKind(kind: MemberKind, tree: WorkspaceTree, dir: string): b
259
317
 
260
318
  /** Whether a probe looks at the directory's files, and so can claim it. */
261
319
  function isFileProbe(probe: KindProbe): probe is FileProbe {
262
- return !("directory" in probe) && !("chantProject" in probe);
320
+ return !("directory" in probe) && !("chantProject" in probe) && !("repo" in probe);
263
321
  }
264
322
 
265
323
  /**
@@ -274,7 +332,7 @@ function filesMatching(tree: WorkspaceTree, dir: string, names: readonly string[
274
332
  if (!name.includes("*") && tree.stat(joinPath(dir, name)) === "file") out.push(joinPath(dir, name));
275
333
  }
276
334
  if (globs.length > 0) {
277
- const patterns = globs.map((g) => new RegExp(`^${g.split("*").map(escapeRegExp).join("[^/]*")}$`));
335
+ const patterns = globs.map((g) => new RegExp(`^${g.split("*").map((part) => escapeRegExp(part).replace(/\\\[0-9\\\]/g, "[0-9]")).join("[^/]*")}$`));
278
336
  for (const e of tree.list(dir) ?? []) {
279
337
  if (e.type === "file" && patterns.some((p) => p.test(e.name))) out.push(joinPath(dir, e.name));
280
338
  }
@@ -400,7 +458,7 @@ export function parseKindData(text: string, source: string): KindData {
400
458
  const problems: string[] = [];
401
459
  const kinds: MemberKind[] = [];
402
460
  const seen = new Set<string>();
403
- for (const k of (raw as { kinds: { name: string; description: string; precedence: number; probe: FileProbe; outputs?: string[]; graph?: KindGraph; fields?: Record<string, KindField>; reader?: string }[] }).kinds) {
461
+ for (const k of (raw as { kinds: { name: string; description: string; precedence: number; probe: FileProbe; outputs?: string[]; graph?: KindGraph; fields?: Record<string, KindField>; reader?: string; memberFile?: { path: string; schema: string } }[] }).kinds) {
404
462
  if (BUILTIN_KIND_NAMES.includes(k.name)) {
405
463
  problems.push(`${source}: kind ${k.name} is built in and can't be supplied by a package`);
406
464
  continue;
@@ -417,6 +475,7 @@ export function parseKindData(text: string, source: string): KindData {
417
475
  ...(k.probe.anyFile ? { anyFile: [...k.probe.anyFile] } : {}),
418
476
  ...(k.probe.anyBlock ? { anyBlock: { in: [...k.probe.anyBlock.in], blocks: [...k.probe.anyBlock.blocks] } } : {}),
419
477
  ...(k.probe.anyJsonKey ? { anyJsonKey: { in: [...k.probe.anyJsonKey.in], pointers: [...k.probe.anyJsonKey.pointers] } } : {}),
478
+ ...(k.probe.anyLine ? { anyLine: { in: [...k.probe.anyLine.in], starts: [...k.probe.anyLine.starts] } } : {}),
420
479
  },
421
480
  precedence: k.precedence,
422
481
  shape: "member",
@@ -425,6 +484,7 @@ export function parseKindData(text: string, source: string): KindData {
425
484
  ...(k.graph ? { graph: { lexicon: k.graph.lexicon, config: structuredClone(k.graph.config) } } : {}),
426
485
  ...(k.fields ? { fields: structuredClone(k.fields) } : {}),
427
486
  ...(k.reader && (KIND_LINK_READERS as readonly string[]).includes(k.reader) ? { reader: k.reader as KindLinkReaderName } : {}),
487
+ ...(k.memberFile ? { memberFile: { path: k.memberFile.path, schema: k.memberFile.schema } } : {}),
428
488
  });
429
489
  if (k.reader && !(KIND_LINK_READERS as readonly string[]).includes(k.reader)) {
430
490
  problems.push(`${source}: kind ${k.name} names link reader ${k.reader}, which this chant does not have (it has ${KIND_LINK_READERS.join(", ")}); the kind is kept, and its members' links are only those their entries state`);
@@ -477,6 +537,10 @@ export function readPackageKinds(packageDir: string, source?: string): PackageKi
477
537
  const packageName = typeof pkg.name === "string" ? pkg.name : undefined;
478
538
  for (const k of data.kinds) {
479
539
  k.packageDir = packageDir;
540
+ if (k.memberFile) {
541
+ const problem = loadMemberFileSchema(k.memberFile, packageDir);
542
+ if (problem) data.problems.push(`${name}: kind ${k.name} ${problem}; members of the kind fail WSP012 until it is fixed`);
543
+ }
480
544
  if (k.graph && packageName !== lexiconPackageName(k.graph.lexicon)) {
481
545
  data.problems.push(
482
546
  `${name}: kind ${k.name} reads its members with lexicon ${k.graph.lexicon}, which is ${lexiconPackageName(k.graph.lexicon)}, ` +
@@ -488,6 +552,67 @@ export function readPackageKinds(packageDir: string, source?: string): PackageKi
488
552
  return { ...data, file };
489
553
  }
490
554
 
555
+ /**
556
+ * Read and compile a kind's member-file schema from `packageDir` (#3672),
557
+ * setting `schemaFile` and `validate`. Returns why it can't be used, or
558
+ * undefined. The schema is a JSON file inside the package; it is data, so
559
+ * nothing is imported, and a `$ref` outside the file is not followed.
560
+ */
561
+ export function loadMemberFileSchema(memberFile: KindMemberFile, packageDir: string): string | undefined {
562
+ const file = resolve(packageDir, ...memberFile.schema.split("/"));
563
+ memberFile.schemaFile = file;
564
+ const inside = relative(packageDir, file);
565
+ if (inside.startsWith("..") || isAbsolute(inside)) return `names member-file schema ${memberFile.schema}, which is outside the package`;
566
+ let doc: unknown;
567
+ try {
568
+ doc = JSON.parse(readFileSync(file, "utf-8"));
569
+ } catch (err) {
570
+ const missing = (err as NodeJS.ErrnoException).code === "ENOENT";
571
+ return missing ? `names member-file schema ${memberFile.schema}, which does not exist` : `names member-file schema ${memberFile.schema}, which is not JSON (${(err as Error).message})`;
572
+ }
573
+ if (doc === null || typeof doc !== "object" || Array.isArray(doc)) return `names member-file schema ${memberFile.schema}, which is not a JSON Schema object`;
574
+ try {
575
+ const Ajv = loadAjv2020() as new (opts: object) => { compile(s: object): MemberFileValidate };
576
+ memberFile.validate = new Ajv({ allErrors: true, strict: false }).compile(doc);
577
+ } catch (err) {
578
+ return `names member-file schema ${memberFile.schema}, which does not compile as a draft 2020-12 schema (${(err as Error).message})`;
579
+ }
580
+ return undefined;
581
+ }
582
+
583
+ /** One reason a member's file fails its kind's schema (#3672): a JSON Pointer into the file, and why. */
584
+ export interface MemberFileProblem {
585
+ pointer: string;
586
+ message: string;
587
+ }
588
+
589
+ /**
590
+ * Check a member's file text against its kind's schema (#3672). `file` is the
591
+ * file's name, which picks the parser: YAML for `.yml` and `.yaml`, JSON
592
+ * otherwise. The kind's schema must have loaded; when it didn't, WSP002 has
593
+ * already said why, and this returns nothing.
594
+ */
595
+ export function checkMemberFile(memberFile: KindMemberFile, file: string, text: string): MemberFileProblem[] {
596
+ if (!memberFile.validate) return [];
597
+ let data: unknown;
598
+ try {
599
+ data = /\.ya?ml$/i.test(file) ? yaml.load(text) : JSON.parse(text);
600
+ } catch (err) {
601
+ return [{ pointer: "", message: `is not ${/\.ya?ml$/i.test(file) ? "YAML" : "JSON"} (${(err as Error).message.split("\n")[0]})` }];
602
+ }
603
+ if (memberFile.validate(data)) return [];
604
+ const seen = new Set<string>();
605
+ const out: MemberFileProblem[] = [];
606
+ for (const e of memberFile.validate.errors ?? []) {
607
+ const extra = e.params && typeof e.params.additionalProperty === "string" ? ` (${e.params.additionalProperty})` : "";
608
+ const message = `${e.instancePath || "the file"} ${e.message ?? "is invalid"}${extra}`;
609
+ if (seen.has(message)) continue;
610
+ seen.add(message);
611
+ out.push({ pointer: e.instancePath, message });
612
+ }
613
+ return out;
614
+ }
615
+
491
616
  /** The package a lexicon name resolves to. */
492
617
  export function lexiconPackageName(lexicon: string): string {
493
618
  return `@intentius/chant-lexicon-${lexicon}`;
@@ -0,0 +1,158 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/workspace/ledger/v1/ledger.schema.json",
4
+ "title": "chant ledger output",
5
+ "description": "What `chant ledger <table> --json` prints (#4363): the rows of one ledger on the local chant/lifecycle branch, filtered with typed filters instead of SQL. The tables and columns are the ones `chant query` loads (schema version 1 of its tables); a column chant query keeps as JSON text is an object or array here, and `signed` and `empty` are booleans. It reads the local branch and never fetches. Version 1 of the read contract. Readers ignore fields they do not know; a field is only ever added within a version. The codes are a closed list, each in the one closed list of `reason-codes.ts`.",
6
+ "oneOf": [
7
+ {
8
+ "$ref": "#/$defs/result"
9
+ },
10
+ {
11
+ "$ref": "#/$defs/failure"
12
+ }
13
+ ],
14
+ "$defs": {
15
+ "result": {
16
+ "type": "object",
17
+ "description": "The rows that every filter matched. Exit code 0.",
18
+ "required": [
19
+ "$schema",
20
+ "contract",
21
+ "table",
22
+ "columns",
23
+ "at",
24
+ "filter",
25
+ "total",
26
+ "rows",
27
+ "malformed"
28
+ ],
29
+ "properties": {
30
+ "$schema": {
31
+ "const": "https://intentius.io/chant/schemas/workspace/ledger/v1/ledger.schema.json"
32
+ },
33
+ "contract": {
34
+ "const": 1
35
+ },
36
+ "table": {
37
+ "enum": [
38
+ "resources",
39
+ "snapshots",
40
+ "runs",
41
+ "gates",
42
+ "deploys",
43
+ "releases",
44
+ "cuts"
45
+ ],
46
+ "description": "The table read: resources and snapshots from each lexicon's snapshots, runs from the Op run ledgers, gates from _gates/, deploys from <env>/releases.jsonl, releases and cuts from _releases/."
47
+ },
48
+ "columns": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "string"
52
+ },
53
+ "description": "The table's columns, in order. Every row has each of them."
54
+ },
55
+ "at": {
56
+ "type": [
57
+ "string",
58
+ "null"
59
+ ],
60
+ "description": "The revision of chant/lifecycle read (--at), as given, or null for the branch tip."
61
+ },
62
+ "filter": {
63
+ "type": "object",
64
+ "required": [
65
+ "where",
66
+ "since"
67
+ ],
68
+ "properties": {
69
+ "where": {
70
+ "type": "array",
71
+ "items": {
72
+ "type": "string"
73
+ },
74
+ "description": "Each --where clause, <field><op><value>, as given. Every one held for each row listed."
75
+ },
76
+ "since": {
77
+ "type": [
78
+ "string",
79
+ "null"
80
+ ],
81
+ "description": "--since as the ISO instant it was read as, or null. The rows whose time column (observed_at, started or timestamp) is at or after it are listed."
82
+ }
83
+ }
84
+ },
85
+ "total": {
86
+ "type": "integer",
87
+ "minimum": 0,
88
+ "description": "Rows in the table before the filter."
89
+ },
90
+ "rows": {
91
+ "type": "array",
92
+ "items": {
93
+ "$ref": "#/$defs/row"
94
+ }
95
+ },
96
+ "malformed": {
97
+ "type": "integer",
98
+ "minimum": 0,
99
+ "description": "Lines and files of this table that could not be read as their kind, left out of total and rows."
100
+ }
101
+ }
102
+ },
103
+ "row": {
104
+ "type": "object",
105
+ "description": "One row, keyed by column. Every row starts with member: the workspace member whose ledger it came from, or null outside a workspace. A value is a string, a number, a boolean, an object or array (a JSON column), or null.",
106
+ "required": [
107
+ "member"
108
+ ],
109
+ "additionalProperties": {
110
+ "type": [
111
+ "string",
112
+ "number",
113
+ "boolean",
114
+ "object",
115
+ "array",
116
+ "null"
117
+ ]
118
+ }
119
+ },
120
+ "failure": {
121
+ "type": "object",
122
+ "description": "Nothing was read. Exit code 1.",
123
+ "required": [
124
+ "$schema",
125
+ "contract",
126
+ "error"
127
+ ],
128
+ "properties": {
129
+ "$schema": {
130
+ "const": "https://intentius.io/chant/schemas/workspace/ledger/v1/ledger.schema.json"
131
+ },
132
+ "contract": {
133
+ "const": 1
134
+ },
135
+ "error": {
136
+ "type": "object",
137
+ "required": [
138
+ "code",
139
+ "message"
140
+ ],
141
+ "properties": {
142
+ "code": {
143
+ "enum": [
144
+ "filter-invalid",
145
+ "table-unknown",
146
+ "revision-unknown",
147
+ "ledger-unreadable"
148
+ ]
149
+ },
150
+ "message": {
151
+ "type": "string"
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }