@intentius/chant 0.124.45 → 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 (772) 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/capabilities/aws.paths +148 -0
  47. package/dist/capabilities/base-mappings.json +122 -0
  48. package/dist/capabilities/catalog.d.ts +89 -0
  49. package/dist/capabilities/catalog.d.ts.map +1 -0
  50. package/dist/capabilities/catalog.js +204 -0
  51. package/dist/capabilities/language.d.ts +103 -0
  52. package/dist/capabilities/language.d.ts.map +1 -0
  53. package/dist/capabilities/language.js +335 -0
  54. package/dist/capabilities/matcher.d.ts +65 -0
  55. package/dist/capabilities/matcher.d.ts.map +1 -0
  56. package/dist/capabilities/matcher.js +299 -0
  57. package/dist/capabilities/view.d.ts +207 -0
  58. package/dist/capabilities/view.d.ts.map +1 -0
  59. package/dist/capabilities/view.js +484 -0
  60. package/dist/cli/commands/carve.d.ts +3 -0
  61. package/dist/cli/commands/carve.d.ts.map +1 -1
  62. package/dist/cli/commands/carve.js +36 -7
  63. package/dist/cli/commands/import-report.d.ts +26 -0
  64. package/dist/cli/commands/import-report.d.ts.map +1 -0
  65. package/dist/cli/commands/import-report.js +65 -0
  66. package/dist/cli/commands/import.d.ts +11 -1
  67. package/dist/cli/commands/import.d.ts.map +1 -1
  68. package/dist/cli/commands/import.js +22 -3
  69. package/dist/cli/commands/lint.d.ts.map +1 -1
  70. package/dist/cli/commands/lint.js +1 -0
  71. package/dist/cli/commands/migrate.d.ts +13 -1
  72. package/dist/cli/commands/migrate.d.ts.map +1 -1
  73. package/dist/cli/commands/migrate.js +134 -10
  74. package/dist/cli/handlers/approve.d.ts.map +1 -1
  75. package/dist/cli/handlers/approve.js +21 -2
  76. package/dist/cli/handlers/build.d.ts.map +1 -1
  77. package/dist/cli/handlers/build.js +6 -1
  78. package/dist/cli/handlers/declared-graph.d.ts +44 -0
  79. package/dist/cli/handlers/declared-graph.d.ts.map +1 -0
  80. package/dist/cli/handlers/declared-graph.js +87 -0
  81. package/dist/cli/handlers/graph.d.ts +25 -0
  82. package/dist/cli/handlers/graph.d.ts.map +1 -1
  83. package/dist/cli/handlers/graph.js +93 -87
  84. package/dist/cli/handlers/ledger.d.ts +3 -0
  85. package/dist/cli/handlers/ledger.d.ts.map +1 -0
  86. package/dist/cli/handlers/ledger.js +55 -0
  87. package/dist/cli/handlers/migrate.d.ts.map +1 -1
  88. package/dist/cli/handlers/migrate.js +18 -11
  89. package/dist/cli/handlers/misc.d.ts.map +1 -1
  90. package/dist/cli/handlers/misc.js +12 -1
  91. package/dist/cli/handlers/pr-env.d.ts.map +1 -1
  92. package/dist/cli/handlers/pr-env.js +4 -3
  93. package/dist/cli/handlers/pr.d.ts +15 -1
  94. package/dist/cli/handlers/pr.d.ts.map +1 -1
  95. package/dist/cli/handlers/pr.js +143 -39
  96. package/dist/cli/handlers/query.d.ts +7 -2
  97. package/dist/cli/handlers/query.d.ts.map +1 -1
  98. package/dist/cli/handlers/query.js +16 -4
  99. package/dist/cli/handlers/release.d.ts.map +1 -1
  100. package/dist/cli/handlers/release.js +6 -3
  101. package/dist/cli/handlers/search-count.d.ts +89 -0
  102. package/dist/cli/handlers/search-count.d.ts.map +1 -0
  103. package/dist/cli/handlers/search-count.js +132 -0
  104. package/dist/cli/handlers/search.d.ts +356 -6
  105. package/dist/cli/handlers/search.d.ts.map +1 -1
  106. package/dist/cli/handlers/search.js +1039 -155
  107. package/dist/cli/main.d.ts.map +1 -1
  108. package/dist/cli/main.js +88 -17
  109. package/dist/cli/mcp/server.d.ts.map +1 -1
  110. package/dist/cli/mcp/server.js +3 -0
  111. package/dist/cli/mcp/tools/capabilities.d.ts +7 -0
  112. package/dist/cli/mcp/tools/capabilities.d.ts.map +1 -0
  113. package/dist/cli/mcp/tools/capabilities.js +27 -0
  114. package/dist/cli/mcp/workspace-tools.d.ts +3 -1
  115. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  116. package/dist/cli/mcp/workspace-tools.js +47 -2
  117. package/dist/cli/parse-args.d.ts.map +1 -1
  118. package/dist/cli/parse-args.js +100 -19
  119. package/dist/cli/registry.d.ts +36 -4
  120. package/dist/cli/registry.d.ts.map +1 -1
  121. package/dist/components/builders.d.ts +5 -1
  122. package/dist/components/builders.d.ts.map +1 -1
  123. package/dist/components/builders.js +5 -0
  124. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  125. package/dist/components/capability-plugin-loader.js +16 -1
  126. package/dist/components/capability-plugin.d.ts +14 -0
  127. package/dist/components/capability-plugin.d.ts.map +1 -1
  128. package/dist/components/pr-env-ports.d.ts +29 -0
  129. package/dist/components/pr-env-ports.d.ts.map +1 -0
  130. package/dist/components/pr-env-ports.js +77 -0
  131. package/dist/components/pr-env-run.d.ts +5 -21
  132. package/dist/components/pr-env-run.d.ts.map +1 -1
  133. package/dist/components/pr-env-run.js +6 -70
  134. package/dist/components/pr-environment.d.ts +2 -1
  135. package/dist/components/pr-environment.d.ts.map +1 -1
  136. package/dist/components/pr-environment.js +1 -1
  137. package/dist/components/pr-hooks.d.ts +21 -1
  138. package/dist/components/pr-hooks.d.ts.map +1 -1
  139. package/dist/components/pr-hooks.js +72 -4
  140. package/dist/components/pr-pipeline.d.ts +45 -10
  141. package/dist/components/pr-pipeline.d.ts.map +1 -1
  142. package/dist/components/pr-pipeline.js +47 -14
  143. package/dist/components/pr-policy.d.ts +36 -0
  144. package/dist/components/pr-policy.d.ts.map +1 -1
  145. package/dist/components/pr-policy.js +36 -0
  146. package/dist/components/starter-plugin.d.ts +1 -0
  147. package/dist/components/starter-plugin.d.ts.map +1 -1
  148. package/dist/components/starter-plugin.js +5 -1
  149. package/dist/components/verbs/index.d.ts +2 -0
  150. package/dist/components/verbs/index.d.ts.map +1 -1
  151. package/dist/components/verbs/index.js +2 -0
  152. package/dist/components/verbs/publish-artifact.d.ts +65 -0
  153. package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
  154. package/dist/components/verbs/publish-artifact.js +74 -0
  155. package/dist/components/verbs/publish-image.d.ts +129 -0
  156. package/dist/components/verbs/publish-image.d.ts.map +1 -0
  157. package/dist/components/verbs/publish-image.js +145 -0
  158. package/dist/config-environments.d.ts +112 -0
  159. package/dist/config-environments.d.ts.map +1 -0
  160. package/dist/config-environments.js +114 -0
  161. package/dist/config.d.ts +32 -84
  162. package/dist/config.d.ts.map +1 -1
  163. package/dist/config.js +13 -96
  164. package/dist/gate-decision.d.ts +11 -2
  165. package/dist/gate-decision.d.ts.map +1 -1
  166. package/dist/gate-decision.js +15 -3
  167. package/dist/graph-detail.d.ts.map +1 -1
  168. package/dist/graph-detail.js +15 -3
  169. package/dist/graph-effective.d.ts +33 -2
  170. package/dist/graph-effective.d.ts.map +1 -1
  171. package/dist/graph-effective.js +215 -68
  172. package/dist/graph-ir.d.ts +48 -0
  173. package/dist/graph-ir.d.ts.map +1 -1
  174. package/dist/graph-ir.js +130 -0
  175. package/dist/graph-sub-template.d.ts +11 -0
  176. package/dist/graph-sub-template.d.ts.map +1 -0
  177. package/dist/graph-sub-template.js +19 -0
  178. package/dist/graph-walk.d.ts +66 -0
  179. package/dist/graph-walk.d.ts.map +1 -0
  180. package/dist/graph-walk.js +70 -0
  181. package/dist/import/parser.d.ts +19 -0
  182. package/dist/import/parser.d.ts.map +1 -1
  183. package/dist/lexicon.d.ts +80 -6
  184. package/dist/lexicon.d.ts.map +1 -1
  185. package/dist/lifecycle/gate-ledger.d.ts +11 -0
  186. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  187. package/dist/lifecycle/git.d.ts +2 -5
  188. package/dist/lifecycle/git.d.ts.map +1 -1
  189. package/dist/lifecycle/ledger-read.d.ts +65 -0
  190. package/dist/lifecycle/ledger-read.d.ts.map +1 -0
  191. package/dist/lifecycle/ledger-read.js +160 -0
  192. package/dist/lifecycle/observe.d.ts +28 -0
  193. package/dist/lifecycle/observe.d.ts.map +1 -1
  194. package/dist/lifecycle/observe.js +23 -1
  195. package/dist/lifecycle/release-workstation.d.ts +7 -0
  196. package/dist/lifecycle/release-workstation.d.ts.map +1 -1
  197. package/dist/lifecycle/release-workstation.js +25 -0
  198. package/dist/lifecycle/run-ledger.d.ts +4 -3
  199. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  200. package/dist/lifecycle/run-ledger.js +1 -0
  201. package/dist/lint/discover.js +3 -1
  202. package/dist/lint/post-synth.d.ts +127 -1
  203. package/dist/lint/post-synth.d.ts.map +1 -1
  204. package/dist/lint/post-synth.js +84 -2
  205. package/dist/lint/rule.d.ts +6 -0
  206. package/dist/lint/rule.d.ts.map +1 -1
  207. package/dist/lint/rules/op/index.d.ts +1 -0
  208. package/dist/lint/rules/op/index.d.ts.map +1 -1
  209. package/dist/lint/rules/op/index.js +2 -0
  210. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
  211. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
  212. package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
  213. package/dist/live-endpoint.d.ts +1 -1
  214. package/dist/live-endpoint.d.ts.map +1 -1
  215. package/dist/live-endpoint.js +1 -1
  216. package/dist/observation.d.ts +48 -1
  217. package/dist/observation.d.ts.map +1 -1
  218. package/dist/observation.js +21 -5
  219. package/dist/op/activities/activity-contracts.d.ts +9 -6
  220. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  221. package/dist/op/activities/activity-contracts.js +5 -2
  222. package/dist/op/activities/index.d.ts +2 -2
  223. package/dist/op/activities/index.d.ts.map +1 -1
  224. package/dist/op/activities/index.js +1 -1
  225. package/dist/op/activities/review-agent.d.ts +90 -4
  226. package/dist/op/activities/review-agent.d.ts.map +1 -1
  227. package/dist/op/activities/review-agent.js +217 -19
  228. package/dist/op/activities/work-evidence.d.ts +8 -1
  229. package/dist/op/activities/work-evidence.d.ts.map +1 -1
  230. package/dist/op/activities/work-evidence.js +1 -0
  231. package/dist/op/builders.d.ts +9 -5
  232. package/dist/op/builders.d.ts.map +1 -1
  233. package/dist/op/builders.js +9 -5
  234. package/dist/op/composites/apply-op.d.ts +29 -2
  235. package/dist/op/composites/apply-op.d.ts.map +1 -1
  236. package/dist/op/composites/apply-op.js +20 -1
  237. package/dist/op/gate-approval.d.ts +11 -5
  238. package/dist/op/gate-approval.d.ts.map +1 -1
  239. package/dist/op/gate-approval.js +11 -6
  240. package/dist/op/gate-quorum.d.ts +100 -3
  241. package/dist/op/gate-quorum.d.ts.map +1 -1
  242. package/dist/op/gate-quorum.js +108 -6
  243. package/dist/op/gate-review.d.ts +9 -0
  244. package/dist/op/gate-review.d.ts.map +1 -1
  245. package/dist/op/gate-review.js +13 -0
  246. package/dist/op/gate.d.ts +44 -3
  247. package/dist/op/gate.d.ts.map +1 -1
  248. package/dist/op/gate.js +25 -4
  249. package/dist/op/index.d.ts +3 -3
  250. package/dist/op/index.d.ts.map +1 -1
  251. package/dist/op/index.js +1 -1
  252. package/dist/op/local-executor.d.ts +38 -3
  253. package/dist/op/local-executor.d.ts.map +1 -1
  254. package/dist/op/local-executor.js +48 -6
  255. package/dist/op/op-waves-run.d.ts +26 -1
  256. package/dist/op/op-waves-run.d.ts.map +1 -1
  257. package/dist/op/op-waves-run.js +259 -13
  258. package/dist/op/op-waves.d.ts +72 -5
  259. package/dist/op/op-waves.d.ts.map +1 -1
  260. package/dist/op/op-waves.js +110 -15
  261. package/dist/op/runtime.d.ts +11 -0
  262. package/dist/op/runtime.d.ts.map +1 -1
  263. package/dist/op/schedule-overdue.d.ts +16 -0
  264. package/dist/op/schedule-overdue.d.ts.map +1 -1
  265. package/dist/op/schedule-overdue.js +36 -0
  266. package/dist/op/stage-hooks.d.ts +9 -2
  267. package/dist/op/stage-hooks.d.ts.map +1 -1
  268. package/dist/op/stage-hooks.js +7 -5
  269. package/dist/op/workspace-run-env.d.ts +22 -0
  270. package/dist/op/workspace-run-env.d.ts.map +1 -0
  271. package/dist/op/workspace-run-env.js +21 -0
  272. package/dist/pr-forge.d.ts +24 -0
  273. package/dist/pr-forge.d.ts.map +1 -1
  274. package/dist/pr-forge.js +47 -0
  275. package/dist/pr-post.d.ts +42 -0
  276. package/dist/pr-post.d.ts.map +1 -1
  277. package/dist/pr-post.js +67 -1
  278. package/dist/read-filter.d.ts +65 -0
  279. package/dist/read-filter.d.ts.map +1 -0
  280. package/dist/read-filter.js +179 -0
  281. package/dist/run-event.d.ts +1 -1
  282. package/dist/run-event.d.ts.map +1 -1
  283. package/dist/terraform/carve.d.ts +24 -3
  284. package/dist/terraform/carve.d.ts.map +1 -1
  285. package/dist/terraform/carve.js +32 -14
  286. package/dist/terraform/cuts.d.ts +97 -0
  287. package/dist/terraform/cuts.d.ts.map +1 -0
  288. package/dist/terraform/cuts.js +138 -0
  289. package/dist/terraform/folds.d.ts +26 -0
  290. package/dist/terraform/folds.d.ts.map +1 -0
  291. package/dist/terraform/folds.js +38 -0
  292. package/dist/terraform/graph.d.ts.map +1 -1
  293. package/dist/terraform/graph.js +10 -0
  294. package/dist/terraform/reach.d.ts +140 -0
  295. package/dist/terraform/reach.d.ts.map +1 -0
  296. package/dist/terraform/reach.js +170 -0
  297. package/dist/terraform/score.d.ts +14 -0
  298. package/dist/terraform/score.d.ts.map +1 -1
  299. package/dist/terraform/score.js +14 -31
  300. package/dist/terraform/state.d.ts.map +1 -1
  301. package/dist/terraform/state.js +4 -2
  302. package/dist/terraform/types.d.ts +8 -0
  303. package/dist/terraform/types.d.ts.map +1 -1
  304. package/dist/wave-blocked.d.ts +10 -1
  305. package/dist/wave-blocked.d.ts.map +1 -1
  306. package/dist/wave-blocked.js +31 -3
  307. package/dist/wave-runtime.mjs +266 -256
  308. package/dist/workspace/capabilities-contract.d.ts +66 -0
  309. package/dist/workspace/capabilities-contract.d.ts.map +1 -0
  310. package/dist/workspace/capabilities-contract.js +107 -0
  311. package/dist/workspace/capabilities.schema.json +229 -0
  312. package/dist/workspace/check.schema.json +11 -2
  313. package/dist/workspace/checks/ci-branch.d.ts +44 -0
  314. package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
  315. package/dist/workspace/checks/ci-branch.js +133 -0
  316. package/dist/workspace/checks/links.d.ts +3 -0
  317. package/dist/workspace/checks/links.d.ts.map +1 -1
  318. package/dist/workspace/checks/links.js +12 -1
  319. package/dist/workspace/checks/org.d.ts +48 -0
  320. package/dist/workspace/checks/org.d.ts.map +1 -0
  321. package/dist/workspace/checks/org.js +156 -0
  322. package/dist/workspace/checks.d.ts +11 -1
  323. package/dist/workspace/checks.d.ts.map +1 -1
  324. package/dist/workspace/checks.js +59 -7
  325. package/dist/workspace/ci-branches.d.ts +16 -0
  326. package/dist/workspace/ci-branches.d.ts.map +1 -1
  327. package/dist/workspace/ci-branches.js +27 -0
  328. package/dist/workspace/ci-green-cli.js +7 -7
  329. package/dist/workspace/ci-green-workflow.d.ts +1 -1
  330. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  331. package/dist/workspace/ci-green-workflow.js +13 -8
  332. package/dist/workspace/ci-green.d.ts +14 -0
  333. package/dist/workspace/ci-green.d.ts.map +1 -1
  334. package/dist/workspace/ci-green.js +44 -11
  335. package/dist/workspace/ci-run.d.ts +9 -1
  336. package/dist/workspace/ci-run.d.ts.map +1 -1
  337. package/dist/workspace/ci-run.js +67 -6
  338. package/dist/workspace/ci-serve.d.ts +9 -0
  339. package/dist/workspace/ci-serve.d.ts.map +1 -1
  340. package/dist/workspace/ci-serve.js +114 -76
  341. package/dist/workspace/compose-graph.d.ts +23 -0
  342. package/dist/workspace/compose-graph.d.ts.map +1 -1
  343. package/dist/workspace/compose-graph.js +3 -1
  344. package/dist/workspace/composites.d.ts +4 -1
  345. package/dist/workspace/composites.d.ts.map +1 -1
  346. package/dist/workspace/composites.js +5 -2
  347. package/dist/workspace/composites.schema.json +22 -0
  348. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  349. package/dist/workspace/conformance/index.d.ts +1 -1
  350. package/dist/workspace/conformance/index.d.ts.map +1 -1
  351. package/dist/workspace/conformance/index.js +39 -2
  352. package/dist/workspace/cross-root-lint.d.ts +56 -0
  353. package/dist/workspace/cross-root-lint.d.ts.map +1 -0
  354. package/dist/workspace/cross-root-lint.js +111 -0
  355. package/dist/workspace/dbt-models-reader.d.ts +44 -0
  356. package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
  357. package/dist/workspace/dbt-models-reader.js +356 -0
  358. package/dist/workspace/dbt-project-common.d.ts +40 -0
  359. package/dist/workspace/dbt-project-common.d.ts.map +1 -0
  360. package/dist/workspace/dbt-project-common.js +106 -0
  361. package/dist/workspace/dbt-project-reader.d.ts +4 -3
  362. package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
  363. package/dist/workspace/dbt-project-reader.js +14 -108
  364. package/dist/workspace/decision-rank.d.ts +26 -0
  365. package/dist/workspace/decision-rank.d.ts.map +1 -0
  366. package/dist/workspace/decision-rank.js +16 -0
  367. package/dist/workspace/declaration.d.ts +43 -2
  368. package/dist/workspace/declaration.d.ts.map +1 -1
  369. package/dist/workspace/declaration.js +45 -11
  370. package/dist/workspace/declaration.schema.json +133 -24
  371. package/dist/workspace/environments.d.ts +26 -2
  372. package/dist/workspace/environments.d.ts.map +1 -1
  373. package/dist/workspace/environments.js +26 -2
  374. package/dist/workspace/flyway-dir.d.ts +39 -0
  375. package/dist/workspace/flyway-dir.d.ts.map +1 -0
  376. package/dist/workspace/flyway-dir.js +104 -0
  377. package/dist/workspace/flyway-layout.d.ts +96 -0
  378. package/dist/workspace/flyway-layout.d.ts.map +1 -0
  379. package/dist/workspace/flyway-layout.js +308 -0
  380. package/dist/workspace/graph-cache.d.ts +8 -0
  381. package/dist/workspace/graph-cache.d.ts.map +1 -1
  382. package/dist/workspace/graph-cache.js +27 -3
  383. package/dist/workspace/graph-cli.d.ts +39 -2
  384. package/dist/workspace/graph-cli.d.ts.map +1 -1
  385. package/dist/workspace/graph-cli.js +92 -32
  386. package/dist/workspace/graph.schema.json +182 -0
  387. package/dist/workspace/intent.d.ts +2 -3
  388. package/dist/workspace/intent.d.ts.map +1 -1
  389. package/dist/workspace/intent.js +5 -9
  390. package/dist/workspace/kind-link-readers.d.ts +59 -2
  391. package/dist/workspace/kind-link-readers.d.ts.map +1 -1
  392. package/dist/workspace/kind-link-readers.js +17 -1
  393. package/dist/workspace/kind-readers.d.ts +3 -0
  394. package/dist/workspace/kind-readers.d.ts.map +1 -1
  395. package/dist/workspace/kind-readers.js +7 -1
  396. package/dist/workspace/kinds.d.ts +66 -2
  397. package/dist/workspace/kinds.d.ts.map +1 -1
  398. package/dist/workspace/kinds.js +98 -4
  399. package/dist/workspace/ledger.schema.json +158 -0
  400. package/dist/workspace/lexicon-outputs.d.ts +20 -1
  401. package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
  402. package/dist/workspace/lexicon-outputs.js +102 -10
  403. package/dist/workspace/lineage-check.d.ts +3 -0
  404. package/dist/workspace/lineage-check.d.ts.map +1 -1
  405. package/dist/workspace/lineage-check.js +23 -4
  406. package/dist/workspace/links.d.ts +8 -1
  407. package/dist/workspace/links.d.ts.map +1 -1
  408. package/dist/workspace/links.js +25 -1
  409. package/dist/workspace/ls.d.ts +8 -0
  410. package/dist/workspace/ls.d.ts.map +1 -1
  411. package/dist/workspace/ls.js +7 -1
  412. package/dist/workspace/ls.schema.json +7 -0
  413. package/dist/workspace/member-commands.d.ts +10 -1
  414. package/dist/workspace/member-commands.d.ts.map +1 -1
  415. package/dist/workspace/member-commands.js +71 -6
  416. package/dist/workspace/migrate-links.d.ts +45 -0
  417. package/dist/workspace/migrate-links.d.ts.map +1 -0
  418. package/dist/workspace/migrate-links.js +100 -0
  419. package/dist/workspace/migration-dirs.d.ts +74 -0
  420. package/dist/workspace/migration-dirs.d.ts.map +1 -0
  421. package/dist/workspace/migration-dirs.js +254 -0
  422. package/dist/workspace/nested-graph.d.ts +2 -0
  423. package/dist/workspace/nested-graph.d.ts.map +1 -1
  424. package/dist/workspace/nested-graph.js +32 -1
  425. package/dist/workspace/reason-codes.d.ts +18 -0
  426. package/dist/workspace/reason-codes.d.ts.map +1 -1
  427. package/dist/workspace/reason-codes.js +23 -0
  428. package/dist/workspace/records-cli.d.ts +11 -0
  429. package/dist/workspace/records-cli.d.ts.map +1 -1
  430. package/dist/workspace/records-cli.js +57 -5
  431. package/dist/workspace/records.schema.json +5 -0
  432. package/dist/workspace/release-candidates.d.ts +2 -0
  433. package/dist/workspace/release-candidates.d.ts.map +1 -1
  434. package/dist/workspace/release-candidates.js +5 -2
  435. package/dist/workspace/release-train.d.ts +53 -0
  436. package/dist/workspace/release-train.d.ts.map +1 -0
  437. package/dist/workspace/release-train.js +134 -0
  438. package/dist/workspace/release-workflow.d.ts.map +1 -1
  439. package/dist/workspace/release-workflow.js +4 -3
  440. package/dist/workspace/repo-ref.d.ts +45 -0
  441. package/dist/workspace/repo-ref.d.ts.map +1 -0
  442. package/dist/workspace/repo-ref.js +114 -0
  443. package/dist/workspace/run-event.schema.json +2 -2
  444. package/dist/workspace/runs-cli.d.ts +9 -0
  445. package/dist/workspace/runs-cli.d.ts.map +1 -1
  446. package/dist/workspace/runs-cli.js +48 -3
  447. package/dist/workspace/runs.schema.json +7 -0
  448. package/dist/workspace/search-cli.d.ts +204 -0
  449. package/dist/workspace/search-cli.d.ts.map +1 -0
  450. package/dist/workspace/search-cli.js +466 -0
  451. package/dist/workspace/search-contract.d.ts +56 -0
  452. package/dist/workspace/search-contract.d.ts.map +1 -0
  453. package/dist/workspace/search-contract.js +70 -0
  454. package/dist/workspace/search.schema.json +822 -0
  455. package/dist/workspace/status-decisions.d.ts +37 -0
  456. package/dist/workspace/status-decisions.d.ts.map +1 -0
  457. package/dist/workspace/status-decisions.js +147 -0
  458. package/dist/workspace/status-gates.d.ts +9 -0
  459. package/dist/workspace/status-gates.d.ts.map +1 -1
  460. package/dist/workspace/status.d.ts +4 -0
  461. package/dist/workspace/status.d.ts.map +1 -1
  462. package/dist/workspace/status.js +14 -2
  463. package/dist/workspace/status.schema.json +6 -0
  464. package/dist/workspace/work-cli.d.ts.map +1 -1
  465. package/dist/workspace/work-cli.js +5 -3
  466. package/dist/workspace/work-evidence-ops.d.ts +83 -0
  467. package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
  468. package/dist/workspace/work-evidence-ops.js +169 -0
  469. package/dist/workspace/work-evidence.d.ts +12 -2
  470. package/dist/workspace/work-evidence.d.ts.map +1 -1
  471. package/dist/workspace/work-evidence.js +21 -3
  472. package/dist/workspace/work-evidence.schema.json +49 -2
  473. package/dist/workspace/workspace-gates.d.ts +110 -0
  474. package/dist/workspace/workspace-gates.d.ts.map +1 -0
  475. package/dist/workspace/workspace-gates.js +140 -0
  476. package/dist/workspace/workspace-kinds.schema.json +58 -3
  477. package/dist/workspace/workspace-ledger.d.ts +76 -0
  478. package/dist/workspace/workspace-ledger.d.ts.map +1 -0
  479. package/dist/workspace/workspace-ledger.js +91 -0
  480. package/dist/workspace/workspace-run.d.ts +112 -0
  481. package/dist/workspace/workspace-run.d.ts.map +1 -0
  482. package/dist/workspace/workspace-run.js +432 -0
  483. package/package.json +1 -1
  484. package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  485. package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  486. package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  487. package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  488. package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  489. package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  490. package/src/__golden__/wave-loop/op-cost-member.json +13 -0
  491. package/src/__golden__/wave-loop/op-denied-source.json +16 -0
  492. package/src/__golden__/wave-loop/op-denied.json +16 -0
  493. package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  494. package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  495. package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
  496. package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
  497. package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
  498. package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  499. package/src/__golden__/wave-loop/op-held-on.json +16 -0
  500. package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  501. package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  502. package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  503. package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  504. package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
  505. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  506. package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
  507. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  508. package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
  509. package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
  510. package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  511. package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  512. package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
  513. package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  514. package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  515. package/src/__golden__/wave-loop/op-overridden.json +16 -0
  516. package/src/__golden__/wave-loop/op-per-run.json +20 -0
  517. package/src/__golden__/wave-loop/op-point.json +13 -0
  518. package/src/__golden__/wave-loop/op-pr-review.json +10 -0
  519. package/src/__golden__/wave-loop/op-sealed.json +10 -0
  520. package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
  521. package/src/__golden__/wave-loop/op-spend.json +10 -0
  522. package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
  523. package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
  524. package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
  525. package/src/__golden__/wave-loop/op-wide.json +39 -0
  526. package/src/__snapshots__/okf.test.ts.snap +10 -0
  527. package/src/action-pins.test.ts +78 -0
  528. package/src/action-pins.ts +92 -0
  529. package/src/capabilities/aws.paths +148 -0
  530. package/src/capabilities/base-mappings.json +122 -0
  531. package/src/capabilities/catalog.ts +230 -0
  532. package/src/capabilities/language.test.ts +191 -0
  533. package/src/capabilities/language.ts +373 -0
  534. package/src/capabilities/matcher.ts +315 -0
  535. package/src/capabilities/view-compose.test.ts +76 -0
  536. package/src/capabilities/view.ts +631 -0
  537. package/src/cli/commands/carve-score-once.test.ts +99 -0
  538. package/src/cli/commands/carve.ts +37 -6
  539. package/src/cli/commands/check-lexicon.test.ts +2 -2
  540. package/src/cli/commands/import-report.ts +71 -0
  541. package/src/cli/commands/import.ts +33 -3
  542. package/src/cli/commands/lint.ts +1 -0
  543. package/src/cli/commands/migrate-dialect.test.ts +145 -0
  544. package/src/cli/commands/migrate.ts +132 -11
  545. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
  546. package/src/cli/handlers/approve.ts +23 -2
  547. package/src/cli/handlers/build.ts +7 -1
  548. package/src/cli/handlers/declared-graph.ts +99 -0
  549. package/src/cli/handlers/graph.test.ts +94 -3
  550. package/src/cli/handlers/graph.ts +123 -96
  551. package/src/cli/handlers/ledger.ts +54 -0
  552. package/src/cli/handlers/migrate.ts +21 -12
  553. package/src/cli/handlers/misc.ts +10 -1
  554. package/src/cli/handlers/pr-env.ts +3 -4
  555. package/src/cli/handlers/pr.ts +138 -36
  556. package/src/cli/handlers/query.ts +16 -4
  557. package/src/cli/handlers/release.ts +6 -3
  558. package/src/cli/handlers/search-build-roots.test.ts +144 -0
  559. package/src/cli/handlers/search-count.test.ts +191 -0
  560. package/src/cli/handlers/search-count.ts +165 -0
  561. package/src/cli/handlers/search-json.test.ts +333 -0
  562. package/src/cli/handlers/search-live.test.ts +387 -0
  563. package/src/cli/handlers/search-paths.test.ts +235 -0
  564. package/src/cli/handlers/search.ts +1291 -166
  565. package/src/cli/main.test.ts +43 -3
  566. package/src/cli/main.ts +88 -17
  567. package/src/cli/mcp/server.test.ts +3 -3
  568. package/src/cli/mcp/server.ts +3 -0
  569. package/src/cli/mcp/tools/capabilities.ts +32 -0
  570. package/src/cli/mcp/workspace-tools.e2e.test.ts +21 -1
  571. package/src/cli/mcp/workspace-tools.ts +47 -2
  572. package/src/cli/parse-args.ts +79 -15
  573. package/src/cli/registry.ts +36 -4
  574. package/src/components/builders.ts +8 -0
  575. package/src/components/capability-plugin-loader.ts +13 -1
  576. package/src/components/capability-plugin.ts +16 -0
  577. package/src/components/pr-env-ports.ts +89 -0
  578. package/src/components/pr-env-run-bundle.test.ts +54 -0
  579. package/src/components/pr-env-run.ts +5 -76
  580. package/src/components/pr-environment.ts +2 -1
  581. package/src/components/pr-hooks.test.ts +73 -5
  582. package/src/components/pr-hooks.ts +95 -5
  583. package/src/components/pr-pipeline.ts +64 -16
  584. package/src/components/pr-policy.test.ts +64 -1
  585. package/src/components/pr-policy.ts +53 -0
  586. package/src/components/registry.test.ts +1 -1
  587. package/src/components/starter-plugin.ts +6 -0
  588. package/src/components/verbs/index.ts +2 -0
  589. package/src/components/verbs/publish-artifact.test.ts +60 -0
  590. package/src/components/verbs/publish-artifact.ts +122 -0
  591. package/src/components/verbs/publish-image.test.ts +101 -0
  592. package/src/components/verbs/publish-image.ts +265 -0
  593. package/src/config-environments.ts +160 -0
  594. package/src/config.ts +44 -124
  595. package/src/gate-decision-bundle.test.ts +1 -0
  596. package/src/gate-decision-identity.test.ts +9 -0
  597. package/src/gate-decision.ts +26 -3
  598. package/src/graph-detail.ts +15 -3
  599. package/src/graph-effective.ts +226 -75
  600. package/src/graph-ir.test.ts +163 -0
  601. package/src/graph-ir.ts +174 -0
  602. package/src/graph-sub-template.ts +22 -0
  603. package/src/graph-walk.test.ts +44 -0
  604. package/src/graph-walk.ts +102 -0
  605. package/src/import/parser.ts +20 -0
  606. package/src/lexicon.ts +84 -6
  607. package/src/lifecycle/gate-ledger.ts +8 -0
  608. package/src/lifecycle/git.ts +2 -2
  609. package/src/lifecycle/ledger-read.test.ts +107 -0
  610. package/src/lifecycle/ledger-read.ts +195 -0
  611. package/src/lifecycle/observe.test.ts +27 -1
  612. package/src/lifecycle/observe.ts +43 -1
  613. package/src/lifecycle/release-workstation.ts +24 -0
  614. package/src/lifecycle/run-ledger.ts +5 -2
  615. package/src/lint/cross-root.test.ts +122 -0
  616. package/src/lint/discover.ts +3 -1
  617. package/src/lint/post-synth.ts +212 -2
  618. package/src/lint/rule.ts +6 -0
  619. package/src/lint/rules/op/index.ts +2 -0
  620. package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
  621. package/src/live-endpoint.ts +1 -1
  622. package/src/observation.test.ts +25 -0
  623. package/src/observation.ts +69 -5
  624. package/src/op/activities/activity-contracts.ts +5 -2
  625. package/src/op/activities/index.ts +2 -2
  626. package/src/op/activities/review-agent.test.ts +221 -4
  627. package/src/op/activities/review-agent.ts +265 -22
  628. package/src/op/activities/work-evidence.ts +9 -1
  629. package/src/op/builders.ts +9 -5
  630. package/src/op/composites/apply-op.test.ts +108 -0
  631. package/src/op/composites/apply-op.ts +37 -2
  632. package/src/op/gate-approval.test.ts +6 -1
  633. package/src/op/gate-approval.ts +12 -6
  634. package/src/op/gate-quorum-at-base.test.ts +211 -0
  635. package/src/op/gate-quorum.ts +156 -8
  636. package/src/op/gate-review.ts +14 -0
  637. package/src/op/gate.ts +67 -8
  638. package/src/op/index.ts +3 -2
  639. package/src/op/local-executor.ts +69 -9
  640. package/src/op/op-waves-depends-on.test.ts +81 -0
  641. package/src/op/op-waves-hook-targets.test.ts +4 -2
  642. package/src/op/op-waves-quorum-product.test.ts +158 -0
  643. package/src/op/op-waves-run.ts +288 -14
  644. package/src/op/op-waves.ts +143 -14
  645. package/src/op/runtime.ts +8 -0
  646. package/src/op/schedule-overdue.ts +33 -0
  647. package/src/op/stage-hooks.ts +13 -5
  648. package/src/op/workspace-run-env.ts +29 -0
  649. package/src/pr-forge-bundle.test.ts +2 -2
  650. package/src/pr-forge.test.ts +47 -0
  651. package/src/pr-forge.ts +68 -0
  652. package/src/pr-post-open.e2e.test.ts +36 -0
  653. package/src/pr-post.test.ts +102 -3
  654. package/src/pr-post.ts +89 -1
  655. package/src/read-filter.test.ts +54 -0
  656. package/src/read-filter.ts +193 -0
  657. package/src/run-event.ts +1 -1
  658. package/src/stage-hooks-bundle.test.ts +1 -0
  659. package/src/terraform/carve.ts +52 -15
  660. package/src/terraform/cuts.test.ts +173 -0
  661. package/src/terraform/cuts.ts +188 -0
  662. package/src/terraform/folds.ts +44 -0
  663. package/src/terraform/graph.ts +9 -0
  664. package/src/terraform/radius.test.ts +90 -0
  665. package/src/terraform/reach.test.ts +146 -0
  666. package/src/terraform/reach.ts +247 -0
  667. package/src/terraform/score.ts +27 -29
  668. package/src/terraform/state.ts +3 -1
  669. package/src/terraform/types.ts +8 -0
  670. package/src/wave-blocked.ts +28 -3
  671. package/src/wave-loop-golden.test.ts +4 -3
  672. package/src/workspace/behold-kinds.test.ts +1 -1
  673. package/src/workspace/capabilities-contract.test.ts +88 -0
  674. package/src/workspace/capabilities-contract.ts +132 -0
  675. package/src/workspace/capabilities.schema.json +229 -0
  676. package/src/workspace/check-contract.test.ts +7 -6
  677. package/src/workspace/check.schema.json +11 -2
  678. package/src/workspace/checks/ci-branch.test.ts +128 -0
  679. package/src/workspace/checks/ci-branch.ts +141 -0
  680. package/src/workspace/checks/links.ts +12 -1
  681. package/src/workspace/checks/org.ts +169 -0
  682. package/src/workspace/checks.ts +64 -7
  683. package/src/workspace/ci-branches.ts +31 -0
  684. package/src/workspace/ci-green-branches.test.ts +153 -0
  685. package/src/workspace/ci-green-cli.ts +7 -7
  686. package/src/workspace/ci-green-workflow.test.ts +4 -3
  687. package/src/workspace/ci-green-workflow.ts +13 -9
  688. package/src/workspace/ci-green.ts +49 -12
  689. package/src/workspace/ci-run.test.ts +72 -1
  690. package/src/workspace/ci-run.ts +68 -8
  691. package/src/workspace/ci-serve.test.ts +95 -0
  692. package/src/workspace/ci-serve.ts +106 -65
  693. package/src/workspace/component-environments.test.ts +25 -2
  694. package/src/workspace/compose-graph.ts +19 -3
  695. package/src/workspace/composites.schema.json +22 -0
  696. package/src/workspace/composites.test.ts +39 -8
  697. package/src/workspace/composites.ts +6 -2
  698. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  699. package/src/workspace/conformance/conformance.e2e.test.ts +14 -1
  700. package/src/workspace/conformance/index.ts +31 -2
  701. package/src/workspace/cross-root-lint.test.ts +90 -0
  702. package/src/workspace/cross-root-lint.ts +126 -0
  703. package/src/workspace/dbt-kind.test.ts +3 -2
  704. package/src/workspace/dbt-models-reader.ts +362 -0
  705. package/src/workspace/dbt-models.test.ts +248 -0
  706. package/src/workspace/dbt-project-common.ts +113 -0
  707. package/src/workspace/dbt-project-reader.ts +29 -112
  708. package/src/workspace/decision-rank.ts +40 -0
  709. package/src/workspace/declaration.schema.json +133 -24
  710. package/src/workspace/declaration.ts +84 -15
  711. package/src/workspace/environments.ts +40 -4
  712. package/src/workspace/flyway-dir.ts +113 -0
  713. package/src/workspace/flyway-layout.ts +337 -0
  714. package/src/workspace/graph-cache.ts +27 -3
  715. package/src/workspace/graph-cli.ts +119 -32
  716. package/src/workspace/graph-contract.test.ts +4 -2
  717. package/src/workspace/graph.schema.json +182 -0
  718. package/src/workspace/identity.test.ts +14 -2
  719. package/src/workspace/intent.ts +6 -14
  720. package/src/workspace/kind-link-readers.ts +68 -3
  721. package/src/workspace/kind-readers.e2e.test.ts +28 -0
  722. package/src/workspace/kind-readers.test.ts +1 -1
  723. package/src/workspace/kind-readers.ts +7 -1
  724. package/src/workspace/kinds.test.ts +12 -7
  725. package/src/workspace/kinds.ts +132 -7
  726. package/src/workspace/ledger.schema.json +158 -0
  727. package/src/workspace/lexicon-outputs.ts +132 -13
  728. package/src/workspace/lineage-check.ts +30 -7
  729. package/src/workspace/links.ts +24 -1
  730. package/src/workspace/ls-contract.test.ts +1 -1
  731. package/src/workspace/ls.schema.json +7 -0
  732. package/src/workspace/ls.ts +10 -1
  733. package/src/workspace/member-commands.ts +82 -3
  734. package/src/workspace/member-file-schema.test.ts +124 -0
  735. package/src/workspace/migrate-links.test.ts +99 -0
  736. package/src/workspace/migrate-links.ts +108 -0
  737. package/src/workspace/migration-dirs.test.ts +272 -0
  738. package/src/workspace/migration-dirs.ts +267 -0
  739. package/src/workspace/nested-graph.ts +32 -1
  740. package/src/workspace/org-scope.test.ts +238 -0
  741. package/src/workspace/reason-codes.test.ts +13 -1
  742. package/src/workspace/reason-codes.ts +23 -0
  743. package/src/workspace/records-cli.ts +58 -5
  744. package/src/workspace/records.schema.json +5 -0
  745. package/src/workspace/release-candidates.ts +7 -2
  746. package/src/workspace/release-train.ts +157 -0
  747. package/src/workspace/release-workflow.ts +4 -3
  748. package/src/workspace/repo-ref.ts +113 -0
  749. package/src/workspace/run-event.schema.json +2 -2
  750. package/src/workspace/runs-cli.ts +48 -4
  751. package/src/workspace/runs.schema.json +7 -0
  752. package/src/workspace/search-cli.e2e.test.ts +305 -0
  753. package/src/workspace/search-cli.ts +591 -0
  754. package/src/workspace/search-contract.ts +95 -0
  755. package/src/workspace/search.schema.json +822 -0
  756. package/src/workspace/status-contract.test.ts +46 -1
  757. package/src/workspace/status-decisions.test.ts +100 -0
  758. package/src/workspace/status-decisions.ts +151 -0
  759. package/src/workspace/status-gates.ts +9 -0
  760. package/src/workspace/status.schema.json +6 -0
  761. package/src/workspace/status.ts +17 -3
  762. package/src/workspace/where-filters.test.ts +39 -0
  763. package/src/workspace/work-cli.ts +5 -3
  764. package/src/workspace/work-evidence-ops.test.ts +176 -0
  765. package/src/workspace/work-evidence-ops.ts +189 -0
  766. package/src/workspace/work-evidence.schema.json +49 -2
  767. package/src/workspace/work-evidence.ts +22 -3
  768. package/src/workspace/workspace-gates.ts +200 -0
  769. package/src/workspace/workspace-kinds.schema.json +58 -3
  770. package/src/workspace/workspace-ledger.ts +130 -0
  771. package/src/workspace/workspace-run.test.ts +322 -0
  772. package/src/workspace/workspace-run.ts +461 -0
@@ -12,7 +12,10 @@
12
12
  * - For `graph` only, members of a pinned package's kind whose kinds file
13
13
  * says how to read them (#2874, a `graph` block): each runs `chant graph`
14
14
  * in a reader project chant writes for it (`kind-readers.ts`). Other
15
- * package kinds are `kind-not-run`, as before.
15
+ * package kinds are `kind-not-run`, as before. A kind no built-in or
16
+ * pinned package supplies, such as `terraform` when the pinned lexicon is
17
+ * missing or at another version, is `unknown-kind` and fails the read,
18
+ * with the pin's problem in the message (#4380).
16
19
  * - For `build` and `lint` only, every project an example group matches
17
20
  * (ws-051): groups are built and linted, and have no ledger, audit or place
18
21
  * in the graph. On a large repository this is most of the run, so
@@ -141,12 +144,24 @@ export function planMembers(verb, root, options = {}) {
141
144
  });
142
145
  continue;
143
146
  }
147
+ // A kind no built-in or pinned package supplies is unknown, not a kind
148
+ // the read leaves out (#4380): a terraform member whose pinned lexicon is
149
+ // missing or at another version said kind-not-run before, as if the graph
150
+ // never read its kind. Say why, the pin's problem included.
151
+ if (verb === "graph" && !kinds.get(entry.kind)) {
152
+ const reason = memberReason(entry, tree, kinds) ?? { code: "unknown-kind", message: `no built-in kind or pinned package supplies kind ${entry.kind}` };
153
+ const problems = reason.code === "unknown-kind" ? (options.kindProblems ?? []) : [];
154
+ unreadable.push({ name: entry.name, dir: entry.dir, kind: entry.kind, reason: problems.length ? { ...reason, message: `${reason.message}; ${problems.join("; ")}` } : reason });
155
+ continue;
156
+ }
144
157
  if (entry.kind !== "chant") {
145
158
  const why = entry.kind === "workspace"
146
159
  ? "a nested workspace runs its own chant workspace commands"
147
- : entry.kind === "design"
148
- ? "a design member is data: chant reads its files for record pins and builds nothing"
149
- : `chant workspace ${verb} runs members of kind chant, and this one is kind ${entry.kind}`;
160
+ : entry.kind === "repo"
161
+ ? "a repo member is another repository's workspace, which runs its own chant workspace commands; chant workspace graph reads it at its pinned revision"
162
+ : entry.kind === "design"
163
+ ? "a design member is data: chant reads its files for record pins and builds nothing"
164
+ : `chant workspace ${verb} runs members of kind chant, and this one is kind ${entry.kind}`;
150
165
  skipped.push({ name: entry.name, dir: entry.dir, kind: entry.kind, reason: { code: "kind-not-run", message: why } });
151
166
  continue;
152
167
  }
@@ -245,6 +260,9 @@ export function memberArgv(verb, unit, args) {
245
260
  // composites with their rolled-up status (#4228).
246
261
  if (args.detail !== undefined)
247
262
  argv.push("--detail", String(args.detail));
263
+ // Each member's chant maps its own capability view (#4378).
264
+ if (args.capabilityView)
265
+ argv.push("--capability-view");
248
266
  }
249
267
  return argv;
250
268
  }
@@ -451,14 +469,19 @@ export async function runWorkspaceMembers(ctx, verb) {
451
469
  return 0;
452
470
  }
453
471
  const results = await executePlan(plan, args);
454
- const anyFailed = results.some((r) => r.exitCode !== 0) || plan.unreadable.length > 0;
472
+ // #2549: the disagreement lint, over every member's graph, when asked for.
473
+ const cross = verb === "lint" && args.crossRoot ? await runCrossRoot(found.dir, args) : undefined;
474
+ const anyFailed = results.some((r) => r.exitCode !== 0) || plan.unreadable.length > 0 || cross?.failed === true;
455
475
  const workspace = { name: plan.workspace.name, root: plan.workspace.root };
456
476
  if (verb === "lint" && args.format === "sarif") {
457
477
  for (const r of results)
458
478
  if (r.stderr.trim())
459
479
  process.stderr.write(r.stderr.endsWith("\n") ? r.stderr : `${r.stderr}\n`);
460
480
  const unreadable = plan.unreadable.map((s) => ({ id: s.name, member: s.name, dir: s.dir ?? ".", exitCode: 1, stdout: "", stderr: `${s.reason.code}: ${s.reason.message}` }));
461
- emitDocument(mergeSarif([...results, ...unreadable], plan.workspace.root), args.output);
481
+ const sarif = mergeSarif([...results, ...unreadable], plan.workspace.root);
482
+ if (cross)
483
+ (sarif.runs ?? (sarif.runs = [])).push(crossRootSarifRun(cross));
484
+ emitDocument(sarif, args.output);
462
485
  console.error(summaryLine(plan, results));
463
486
  return anyFailed ? 1 : 0;
464
487
  }
@@ -499,6 +522,7 @@ export async function runWorkspaceMembers(ctx, verb) {
499
522
  ...plan.unreadable.map((s) => ({ member: s.name, dir: s.dir, exitCode: 1, diagnostics: null, reason: s.reason })),
500
523
  ],
501
524
  skipped: plan.skipped,
525
+ ...(cross ? { crossRoot: crossRootJson(cross) } : {}),
502
526
  };
503
527
  }
504
528
  emitDocument(doc, args.output);
@@ -508,5 +532,46 @@ export async function runWorkspaceMembers(ctx, verb) {
508
532
  // Text: each member's own output under a heading. A build without -o prints
509
533
  // no templates, since several members' templates can't share one stdout.
510
534
  printSections(plan, results, verb !== "build" || args.output !== undefined);
535
+ if (cross)
536
+ printCrossRoot(cross);
511
537
  return anyFailed ? 1 : 0;
512
538
  }
539
+ async function runCrossRoot(root, args) {
540
+ const { workspaceGraph } = await import("./graph-cli.js");
541
+ const { crossRootLint } = await import("./cross-root-lint.js");
542
+ const { doc, failed } = await workspaceGraph({ cwd: root, ...(args.members?.length ? { members: args.members } : {}), onStderr: (t) => process.stderr.write(t) });
543
+ if ("error" in doc)
544
+ return { error: `${doc.error.code}: ${doc.error.message}`, failed: true };
545
+ const result = await crossRootLint(doc, args.env ? { env: args.env } : {});
546
+ return { result, failed: failed || result.findings.some((f) => f.severity === "error") };
547
+ }
548
+ function crossRootJson(cross) {
549
+ return cross.result ? { findings: cross.result.findings, checks: cross.result.checks, unloaded: cross.result.unloaded } : { error: cross.error };
550
+ }
551
+ function crossRootSarifRun(cross) {
552
+ const findings = cross.result?.findings ?? [];
553
+ return {
554
+ tool: { driver: { name: "chant", rules: [...new Set(findings.map((f) => f.checkId))].sort().map((id) => ({ id })) } },
555
+ automationDetails: { id: "cross-root/" },
556
+ properties: { crossRoot: true, checks: cross.result?.checks ?? [], unloaded: cross.result?.unloaded ?? [] },
557
+ results: findings.map((f) => ({
558
+ ruleId: f.checkId,
559
+ level: f.severity === "error" ? "error" : f.severity === "warning" ? "warning" : "note",
560
+ message: { text: f.message },
561
+ ...(f.root ? { properties: { member: f.root } } : {}),
562
+ })),
563
+ ...(cross.error ? { invocations: [{ executionSuccessful: false, toolExecutionNotifications: [{ message: { text: cross.error } }] }] } : {}),
564
+ };
565
+ }
566
+ function printCrossRoot(cross) {
567
+ if (!cross.result) {
568
+ console.log(`── cross-root (the members' graphs could not be read: ${cross.error})`);
569
+ return;
570
+ }
571
+ const { findings, checks, unloaded } = cross.result;
572
+ console.log(`── cross-root (${checks.join(", ")}; ${findings.length} finding${findings.length === 1 ? "" : "s"})`);
573
+ for (const f of findings)
574
+ console.log(` ${f.severity.padEnd(7)} ${f.checkId}${f.root ? ` [${f.root}]` : ""} ${f.message}`);
575
+ for (const u of unloaded)
576
+ console.log(` (lexicon ${u.lexicon}: its cross-root checks could not be loaded: ${u.reason})`);
577
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The workspace links `chant migrate` writes (#4399).
3
+ *
4
+ * A migration reads one member (the Postgres tables) and writes into another
5
+ * (the ClickHouse mirrors). When both sit in a workspace, the migrated
6
+ * output reads the source member's outputs, and the declaration should say
7
+ * so: `chant workspace check` then fails when the source drops or renames an
8
+ * output until the mirror follows (WSP093, `./checks/links.ts`).
9
+ *
10
+ * {@link planMigrateLinks} finds the declaration above the source, the member
11
+ * that holds the source and the member that holds the output file, and adds
12
+ * a `links` entry on the second for each output the migration names. It
13
+ * changes only the text of that member's `links`, as the other declaration
14
+ * write commands do (`./json-edit.ts`). It returns a plan; the caller writes
15
+ * it. A migration with no workspace around it, or whose source and output
16
+ * are one member, has nothing to link and returns a reason when that is
17
+ * worth telling.
18
+ */
19
+ export interface MigrateLinkPlan {
20
+ /** The declaration file, absolute. */
21
+ file: string;
22
+ /** The producer: the member that holds the source. */
23
+ producer: string;
24
+ /** The consumer: the member that holds the output file. */
25
+ consumer: string;
26
+ /** Outputs the consumer did not link to before. */
27
+ added: string[];
28
+ /** The declaration's new text; equal to the old when nothing was added. */
29
+ text: string;
30
+ }
31
+ export type MigrateLinkOutcome = {
32
+ plan: MigrateLinkPlan;
33
+ } | {
34
+ skipped: string;
35
+ } | undefined;
36
+ /**
37
+ * Plan the links from the member holding `sourcePath` to the outputs a
38
+ * migration read, on the member holding `outputPath`.
39
+ */
40
+ export declare function planMigrateLinks(opts: {
41
+ sourcePath: string;
42
+ outputPath: string | undefined;
43
+ outputs: readonly string[];
44
+ }): MigrateLinkOutcome;
45
+ //# sourceMappingURL=migrate-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-links.d.ts","sourceRoot":"","sources":["../../src/workspace/migrate-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AA6B7F;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,kBAAkB,CAqC7I"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * The workspace links `chant migrate` writes (#4399).
3
+ *
4
+ * A migration reads one member (the Postgres tables) and writes into another
5
+ * (the ClickHouse mirrors). When both sit in a workspace, the migrated
6
+ * output reads the source member's outputs, and the declaration should say
7
+ * so: `chant workspace check` then fails when the source drops or renames an
8
+ * output until the mirror follows (WSP093, `./checks/links.ts`).
9
+ *
10
+ * {@link planMigrateLinks} finds the declaration above the source, the member
11
+ * that holds the source and the member that holds the output file, and adds
12
+ * a `links` entry on the second for each output the migration names. It
13
+ * changes only the text of that member's `links`, as the other declaration
14
+ * write commands do (`./json-edit.ts`). It returns a plan; the caller writes
15
+ * it. A migration with no workspace around it, or whose source and output
16
+ * are one member, has nothing to link and returns a reason when that is
17
+ * worth telling.
18
+ */
19
+ import { existsSync, readFileSync } from "node:fs";
20
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
21
+ import { DECLARATION_FILES, parseDeclaration } from "./declaration.js";
22
+ import { appendElement, setProperty } from "./json-edit.js";
23
+ /** The workspace declaration at or above `start`. */
24
+ function findDeclaration(start) {
25
+ let dir = resolve(start);
26
+ for (;;) {
27
+ for (const name of DECLARATION_FILES) {
28
+ const candidate = join(dir, name);
29
+ if (existsSync(candidate))
30
+ return candidate;
31
+ }
32
+ const parent = dirname(dir);
33
+ if (parent === dir)
34
+ return undefined;
35
+ dir = parent;
36
+ }
37
+ }
38
+ /** The deepest member whose directory holds `path`. */
39
+ function memberHolding(declaration, root, path) {
40
+ let best;
41
+ for (const m of declaration.members) {
42
+ const memberRoot = resolve(root, m.dir);
43
+ const rel = relative(memberRoot, path);
44
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel))
45
+ continue;
46
+ // The longer root is the deeper member.
47
+ if (!best || memberRoot.length > best.depth)
48
+ best = { member: m, depth: memberRoot.length };
49
+ }
50
+ return best?.member;
51
+ }
52
+ /**
53
+ * Plan the links from the member holding `sourcePath` to the outputs a
54
+ * migration read, on the member holding `outputPath`.
55
+ */
56
+ export function planMigrateLinks(opts) {
57
+ const source = resolve(opts.sourcePath);
58
+ const file = findDeclaration(source);
59
+ if (!file)
60
+ return undefined;
61
+ if (opts.outputPath === undefined)
62
+ return { skipped: "pass --output inside the ClickHouse member to link its columns to the Postgres member" };
63
+ const root = dirname(file);
64
+ const text = readFileSync(file, "utf8");
65
+ let declaration;
66
+ try {
67
+ declaration = parseDeclaration(text, file);
68
+ }
69
+ catch (err) {
70
+ return { skipped: `the workspace declaration ${file} does not read, so no link was written: ${err instanceof Error ? err.message : String(err)}` };
71
+ }
72
+ const producer = memberHolding(declaration, root, source);
73
+ const consumer = memberHolding(declaration, root, resolve(opts.outputPath));
74
+ if (!producer)
75
+ return { skipped: `${opts.sourcePath} is in no member of ${file}, so no link was written` };
76
+ if (!consumer)
77
+ return { skipped: `${opts.outputPath} is in no member of ${file}, so no link was written` };
78
+ if (producer.name === consumer.name)
79
+ return { skipped: `the source and the output are both in member ${producer.name}; a member does not link to itself` };
80
+ const have = new Set(consumer.links.filter((l) => l.member === producer.name && l.kind === null).map((l) => l.output));
81
+ const added = [...new Set(opts.outputs)].filter((o) => !have.has(o));
82
+ if (added.length === 0)
83
+ return { plan: { file, producer: producer.name, consumer: consumer.name, added, text } };
84
+ const jsonc = file.endsWith(".jsonc");
85
+ const links = added.map((output) => ({ member: producer.name, output }));
86
+ let next = text;
87
+ if (consumer.links.length === 0) {
88
+ next = setProperty(next, jsonc, consumer.pointer, "links", links);
89
+ }
90
+ else {
91
+ for (const l of links)
92
+ next = appendElement(next, jsonc, `${consumer.pointer}/links`, l);
93
+ }
94
+ // The edit is never written unless it reads back with the links it meant to add.
95
+ const back = parseDeclaration(next, file).members.find((m) => m.name === consumer.name);
96
+ if (!back || back.links.length !== consumer.links.length + added.length) {
97
+ return { skipped: `the edit to ${file} did not read back as the links it meant to add, so nothing was written` };
98
+ }
99
+ return { plan: { file, producer: producer.name, consumer: consumer.name, added, text: next } };
100
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The readers for goose, golang-migrate and clickhouse-migrations
3
+ * directories (#4400). Each lists the migrations in the order the tool
4
+ * applies them. None runs the tool or a server: the schema the migrations
5
+ * produce comes from a replay.
6
+ *
7
+ * File layouts, checked against the tools' own docs and source:
8
+ *
9
+ * - goose (pressly/goose 9a201bb): `<version>_<name>.sql` directly in the
10
+ * directory, the version a positive integer before the first `_`
11
+ * (`NumericComponent`, migration.go); ordered by that number, so a
12
+ * sequential `00001` and a timestamp `20240101120000` sort together.
13
+ * A file holds `-- +goose Up` and, optionally, a later `-- +goose Down`
14
+ * (internal/sqlparser/parser.go); `-- +goose NO TRANSACTION` runs it
15
+ * outside a transaction. `.go` migrations are listed in the version order
16
+ * but are code, so each is a gap.
17
+ * - golang-migrate (golang-migrate/migrate 504568a): `<version>_<name>.up.<ext>`
18
+ * and `.down.<ext>` directly in the directory, matched by
19
+ * `^([0-9]+)_(.*)\.(down|up)\.(.*)$` (source/parse.go); ordered by the
20
+ * version, a 64-bit unsigned integer. The up files are the migrations; a
21
+ * version with a down file and no up file, or two files for one version
22
+ * and direction, is a gap.
23
+ * - clickhouse-migrations, the Python tool (zifter/clickhouse-migrations) and
24
+ * the Node tool (npm clickhouse-migrations): `<version>_<name>.sql` directly
25
+ * in the migrations directory, the version an integer before the first `_`,
26
+ * applied in ascending numeric order. The Python tool also reads an
27
+ * optional `<version>_<name>.down.sql` rollback beside it. The dialect is
28
+ * always ClickHouse.
29
+ *
30
+ * What the migrations produce comes from a replay (`chant sql replay`), which
31
+ * records the tables and columns in {@link REPLAY_FILE} beside the
32
+ * migrations. Each reader returns them as the member's outputs when the
33
+ * recorded digest still matches the files, and a gap that says to replay
34
+ * again when it does not (see {@link withReplay}).
35
+ *
36
+ * The member's `migrationsDir` field names the directory under the member's
37
+ * own, and `dialect` names the dialect for goose and golang-migrate, whose
38
+ * tools take it from a driver or URL the directory does not hold.
39
+ */
40
+ import type { KindLinkRead, KindReadMigration, KindReaderInput } from "./kind-link-readers.js";
41
+ import { type WorkspaceTree } from "./tree.js";
42
+ /** The dialects a migration directory's `dialect` field names. */
43
+ export declare const MIGRATION_DIALECTS: readonly ["postgres", "clickhouse"];
44
+ export declare function fieldString(fields: KindReaderInput["fields"], name: string, fallback: string): string;
45
+ /** The directory a reader lists: the member's `migrationsDir` under its own directory. */
46
+ export declare function migrationsDirOf(input: KindReaderInput): string;
47
+ /** The goose annotation on `line` (`up`, `down`, `no transaction`, ...), or undefined when it holds none. Mirrors the parser's rule: a comment that contains `+goose`. */
48
+ export declare function gooseAnnotation(line: string): string | undefined;
49
+ /** The file a replay writes in the member's directory: the tables and columns the migrations produced, and the digest of the files it ran (#4400). */
50
+ export declare const REPLAY_FILE = "chant.replay.json";
51
+ /** What {@link REPLAY_FILE} holds. */
52
+ export interface ReplaySnapshot {
53
+ schema: 1;
54
+ dialect: string;
55
+ /** {@link migrationDigest} of the files the replay ran. */
56
+ digest: string;
57
+ /** Names as `<schema>.<table>` and `<schema>.<table>.<column>` (Postgres), or `<database>...` (ClickHouse), the contract of #3931. */
58
+ outputs: string[];
59
+ }
60
+ /** A digest of the migration files in order, so a snapshot can tell the files changed. `extra` are files beside them that change what runs, such as Flyway's configuration. */
61
+ export declare function migrationDigest(read: (file: string) => string, files: readonly string[]): string;
62
+ /** The files a replay of `migrations` depends on, in order. */
63
+ export declare function replayFiles(tree: WorkspaceTree, migrations: readonly KindReadMigration[], extra?: readonly string[]): string[];
64
+ /**
65
+ * Add the recorded replay to a reader's result: the snapshot's names as
66
+ * outputs when its digest matches the files, else a gap flagged `outputs`
67
+ * (a link into the member is then unresolved, not missing). A snapshot
68
+ * that does not parse is a gap too.
69
+ */
70
+ export declare function withReplay(result: KindLinkRead, tree: WorkspaceTree, dir: string, extra?: readonly string[]): KindLinkRead;
71
+ export declare const readGooseDir: (input: KindReaderInput) => KindLinkRead;
72
+ export declare const readGolangMigrateDir: (input: KindReaderInput) => KindLinkRead;
73
+ export declare const readClickHouseMigrationsDir: (input: KindReaderInput) => KindLinkRead;
74
+ //# sourceMappingURL=migration-dirs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-dirs.d.ts","sourceRoot":"","sources":["../../src/workspace/migration-dirs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAe,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEzG,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEtD,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,YAAI,UAAU,EAAE,YAAY,CAAU,CAAC;AAEtE,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrG;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAG9D;AAWD,0KAA0K;AAC1K,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIhE;AA4HD,sJAAsJ;AACtJ,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAE/C,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,sIAAsI;IACtI,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,+KAA+K;AAC/K,wBAAgB,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAShG;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,iBAAiB,EAAE,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,EAAE,CAElI;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO,GAAG,YAAY,CA6B9H;AAED,eAAO,MAAM,YAAY,UAAW,eAAe,KAAG,YAAsE,CAAC;AAC7H,eAAO,MAAM,oBAAoB,UAAW,eAAe,KAAG,YAA8E,CAAC;AAC7I,eAAO,MAAM,2BAA2B,UAAW,eAAe,KAAG,YAAqF,CAAC"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * The readers for goose, golang-migrate and clickhouse-migrations
3
+ * directories (#4400). Each lists the migrations in the order the tool
4
+ * applies them. None runs the tool or a server: the schema the migrations
5
+ * produce comes from a replay.
6
+ *
7
+ * File layouts, checked against the tools' own docs and source:
8
+ *
9
+ * - goose (pressly/goose 9a201bb): `<version>_<name>.sql` directly in the
10
+ * directory, the version a positive integer before the first `_`
11
+ * (`NumericComponent`, migration.go); ordered by that number, so a
12
+ * sequential `00001` and a timestamp `20240101120000` sort together.
13
+ * A file holds `-- +goose Up` and, optionally, a later `-- +goose Down`
14
+ * (internal/sqlparser/parser.go); `-- +goose NO TRANSACTION` runs it
15
+ * outside a transaction. `.go` migrations are listed in the version order
16
+ * but are code, so each is a gap.
17
+ * - golang-migrate (golang-migrate/migrate 504568a): `<version>_<name>.up.<ext>`
18
+ * and `.down.<ext>` directly in the directory, matched by
19
+ * `^([0-9]+)_(.*)\.(down|up)\.(.*)$` (source/parse.go); ordered by the
20
+ * version, a 64-bit unsigned integer. The up files are the migrations; a
21
+ * version with a down file and no up file, or two files for one version
22
+ * and direction, is a gap.
23
+ * - clickhouse-migrations, the Python tool (zifter/clickhouse-migrations) and
24
+ * the Node tool (npm clickhouse-migrations): `<version>_<name>.sql` directly
25
+ * in the migrations directory, the version an integer before the first `_`,
26
+ * applied in ascending numeric order. The Python tool also reads an
27
+ * optional `<version>_<name>.down.sql` rollback beside it. The dialect is
28
+ * always ClickHouse.
29
+ *
30
+ * What the migrations produce comes from a replay (`chant sql replay`), which
31
+ * records the tables and columns in {@link REPLAY_FILE} beside the
32
+ * migrations. Each reader returns them as the member's outputs when the
33
+ * recorded digest still matches the files, and a gap that says to replay
34
+ * again when it does not (see {@link withReplay}).
35
+ *
36
+ * The member's `migrationsDir` field names the directory under the member's
37
+ * own, and `dialect` names the dialect for goose and golang-migrate, whose
38
+ * tools take it from a driver or URL the directory does not hold.
39
+ */
40
+ import { createHash } from "node:crypto";
41
+ import { joinPath } from "./tree.js";
42
+ /** The dialects a migration directory's `dialect` field names. */
43
+ export const MIGRATION_DIALECTS = ["postgres", "clickhouse"];
44
+ export function fieldString(fields, name, fallback) {
45
+ const v = fields?.[name];
46
+ return typeof v === "string" && v !== "" ? v : fallback;
47
+ }
48
+ /** The directory a reader lists: the member's `migrationsDir` under its own directory. */
49
+ export function migrationsDirOf(input) {
50
+ const sub = fieldString(input.fields, "migrationsDir", ".");
51
+ return joinPath(input.dir, sub.replace(/^\.\/?/, ""));
52
+ }
53
+ function filesIn(tree, dir) {
54
+ return (tree.list(dir) ?? []).filter((e) => e.type === "file").map((e) => e.name).sort();
55
+ }
56
+ const lineOf = (text, pred) => {
57
+ const i = text.split(/\r?\n/).findIndex(pred);
58
+ return i < 0 ? 0 : i + 1;
59
+ };
60
+ /** The goose annotation on `line` (`up`, `down`, `no transaction`, ...), or undefined when it holds none. Mirrors the parser's rule: a comment that contains `+goose`. */
61
+ export function gooseAnnotation(line) {
62
+ const t = line.trim();
63
+ if (!t.startsWith("--") || !t.includes("+goose"))
64
+ return undefined;
65
+ return t.replace("+goose", "").replace(/^--\s*/, "").trim().toLowerCase();
66
+ }
67
+ function listGooseDir(input) {
68
+ const { tree } = input;
69
+ const dir = migrationsDirOf(input);
70
+ const dialect = fieldString(input.fields, "dialect", "postgres");
71
+ const gaps = [];
72
+ const result = { reader: "goose-dir", links: [], gaps, migrations: [] };
73
+ const found = [];
74
+ for (const name of filesIn(tree, dir)) {
75
+ const ext = name.endsWith(".sql") ? ".sql" : name.endsWith(".go") && !name.endsWith("_test.go") ? ".go" : null;
76
+ if (!ext)
77
+ continue;
78
+ const file = joinPath(dir, name);
79
+ const before = name.split("_")[0] ?? "";
80
+ const n = /^[0-9]+$/.test(before) && name.includes("_") ? Number(before) : NaN;
81
+ if (!Number.isSafeInteger(n) || n < 1) {
82
+ gaps.push({ file, line: 1, message: `${name} has no version goose can read: the name starts with a positive integer, then _, so goose would stop here` });
83
+ continue;
84
+ }
85
+ if (ext === ".go") {
86
+ gaps.push({ file, line: 1, message: `${name} is a Go migration; its code is not SQL, so it is not listed` });
87
+ found.push({ n, migration: null, file });
88
+ continue;
89
+ }
90
+ const text = tree.read(file);
91
+ const up = lineOf(text, (l) => gooseAnnotation(l) === "up");
92
+ if (up === 0) {
93
+ gaps.push({ file, line: 1, message: `${name} has no -- +goose Up annotation, so goose refuses it` });
94
+ continue;
95
+ }
96
+ const down = lineOf(text, (l) => gooseAnnotation(l) === "down");
97
+ if (down !== 0 && down < up)
98
+ gaps.push({ file, line: down, message: `${name}: -- +goose Down comes before -- +goose Up, which goose refuses` });
99
+ found.push({
100
+ n,
101
+ file,
102
+ migration: {
103
+ position: 0,
104
+ version: String(n),
105
+ name: name.slice(before.length + 1, -ext.length),
106
+ type: "versioned",
107
+ file,
108
+ line: up,
109
+ down: down !== 0,
110
+ dialect,
111
+ transaction: !text.split(/\r?\n/).some((l) => gooseAnnotation(l) === "no transaction"),
112
+ },
113
+ });
114
+ }
115
+ found.sort((a, b) => a.n - b.n || (a.file < b.file ? -1 : 1));
116
+ const seen = new Map();
117
+ for (const f of found) {
118
+ const prior = seen.get(f.n);
119
+ if (prior)
120
+ gaps.push({ file: f.file, line: 1, message: `version ${String(f.n)} is also ${prior}; goose refuses a duplicate version` });
121
+ else
122
+ seen.set(f.n, f.file);
123
+ }
124
+ for (const f of found)
125
+ if (f.migration)
126
+ result.migrations.push(f.migration);
127
+ result.migrations.forEach((m, i) => (m.position = i + 1));
128
+ return result;
129
+ }
130
+ const MIGRATE_NAME = /^([0-9]+)_(.*)\.(down|up)\.(.*)$/;
131
+ function listGolangMigrateDir(input) {
132
+ const { tree } = input;
133
+ const dir = migrationsDirOf(input);
134
+ const dialect = fieldString(input.fields, "dialect", "postgres");
135
+ const gaps = [];
136
+ const result = { reader: "golang-migrate-dir", links: [], gaps, migrations: [] };
137
+ const ups = new Map();
138
+ const downs = new Map();
139
+ for (const name of filesIn(tree, dir)) {
140
+ const m = MIGRATE_NAME.exec(name);
141
+ if (!m)
142
+ continue;
143
+ const version = BigInt(m[1]);
144
+ const file = joinPath(dir, name);
145
+ if (version > 18446744073709551615n) {
146
+ gaps.push({ file, line: 1, message: `${name}: the version does not fit a 64-bit unsigned integer, which golang-migrate requires` });
147
+ continue;
148
+ }
149
+ const table = m[3] === "up" ? ups : downs;
150
+ if (table.has(version)) {
151
+ gaps.push({ file, line: 1, message: `${name}: another ${m[3]} file already has version ${m[1]}; golang-migrate refuses a duplicate` });
152
+ continue;
153
+ }
154
+ if (m[3] === "up")
155
+ ups.set(version, { name: m[2], file, version: m[1] });
156
+ else
157
+ downs.set(version, file);
158
+ }
159
+ for (const [v, file] of downs)
160
+ if (!ups.has(v))
161
+ gaps.push({ file, line: 1, message: `version ${String(v)} has a down file and no up file` });
162
+ [...ups.entries()]
163
+ .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))
164
+ .forEach(([v, u], i) => result.migrations.push({ position: i + 1, version: u.version, name: u.name, type: "versioned", file: u.file, line: 1, down: downs.get(v) ?? false, dialect }));
165
+ return result;
166
+ }
167
+ const CLICKHOUSE_NAME = /^([0-9]+)_(.+)\.sql$/;
168
+ function listClickHouseMigrationsDir(input) {
169
+ const { tree } = input;
170
+ const dir = migrationsDirOf(input);
171
+ const gaps = [];
172
+ const result = { reader: "clickhouse-migrations-dir", links: [], gaps, migrations: [] };
173
+ const names = filesIn(tree, dir).filter((n) => n.endsWith(".sql"));
174
+ const rollbacks = new Map(names.filter((n) => n.endsWith(".down.sql")).map((n) => [n.slice(0, -".down.sql".length), joinPath(dir, n)]));
175
+ const ups = [];
176
+ for (const name of names) {
177
+ if (name.endsWith(".down.sql"))
178
+ continue;
179
+ const m = CLICKHOUSE_NAME.exec(name);
180
+ if (!m) {
181
+ gaps.push({ file: joinPath(dir, name), line: 1, message: `${name} has no version before its first _, so clickhouse-migrations reports a bad file name` });
182
+ continue;
183
+ }
184
+ ups.push({ n: BigInt(m[1]), version: m[1], name: m[2], file: joinPath(dir, name) });
185
+ }
186
+ ups.sort((a, b) => (a.n < b.n ? -1 : a.n > b.n ? 1 : a.file < b.file ? -1 : 1));
187
+ const seen = new Map();
188
+ for (const u of ups) {
189
+ const prior = seen.get(u.n);
190
+ if (prior)
191
+ gaps.push({ file: u.file, line: 1, message: `version ${u.version} is also ${prior}; leading zeros are not significant, so clickhouse-migrations reports a duplicate version` });
192
+ else
193
+ seen.set(u.n, u.file);
194
+ }
195
+ ups.forEach((u, i) => result.migrations.push({ position: i + 1, version: u.version, name: u.name, type: "versioned", file: u.file, line: 1, down: rollbacks.get(u.file.split("/").pop().slice(0, -".sql".length)) ?? false, dialect: "clickhouse" }));
196
+ return result;
197
+ }
198
+ /** The file a replay writes in the member's directory: the tables and columns the migrations produced, and the digest of the files it ran (#4400). */
199
+ export const REPLAY_FILE = "chant.replay.json";
200
+ /** A digest of the migration files in order, so a snapshot can tell the files changed. `extra` are files beside them that change what runs, such as Flyway's configuration. */
201
+ export function migrationDigest(read, files) {
202
+ const h = createHash("sha256");
203
+ for (const f of files) {
204
+ h.update(f);
205
+ h.update("\0");
206
+ h.update(read(f));
207
+ h.update("\0");
208
+ }
209
+ return `sha256:${h.digest("hex")}`;
210
+ }
211
+ /** The files a replay of `migrations` depends on, in order. */
212
+ export function replayFiles(tree, migrations, extra = []) {
213
+ return [...extra.filter((f) => tree.stat(f) === "file"), ...migrations.map((m) => m.file)];
214
+ }
215
+ /**
216
+ * Add the recorded replay to a reader's result: the snapshot's names as
217
+ * outputs when its digest matches the files, else a gap flagged `outputs`
218
+ * (a link into the member is then unresolved, not missing). A snapshot
219
+ * that does not parse is a gap too.
220
+ */
221
+ export function withReplay(result, tree, dir, extra = []) {
222
+ const file = joinPath(dir, REPLAY_FILE);
223
+ const migrations = result.migrations ?? [];
224
+ const gap = (message, line = 1) => result.gaps.push({ file: tree.stat(file) === "file" ? file : dir || ".", line, message, outputs: true });
225
+ if (tree.stat(file) !== "file") {
226
+ gap(`no ${REPLAY_FILE}: replay the migrations to record the tables and columns they produce (chant sql replay ${dir || "."})`);
227
+ return result;
228
+ }
229
+ let text;
230
+ let snap;
231
+ try {
232
+ text = tree.read(file);
233
+ snap = JSON.parse(text);
234
+ }
235
+ catch (err) {
236
+ gap(`${REPLAY_FILE} could not be read (${err.message}), so the tables the migrations produce are unknown`);
237
+ return result;
238
+ }
239
+ if (snap.schema !== 1 || typeof snap.digest !== "string" || !Array.isArray(snap.outputs) || snap.outputs.some((o) => typeof o !== "string")) {
240
+ gap(`${REPLAY_FILE} is not a replay snapshot (schema 1 with a digest and outputs), so the tables the migrations produce are unknown`);
241
+ return result;
242
+ }
243
+ const digest = migrationDigest((f) => tree.read(f), replayFiles(tree, migrations, extra));
244
+ if (digest !== snap.digest) {
245
+ gap(`the migrations changed since ${REPLAY_FILE} was recorded, so the tables they produce are unknown; replay again (chant sql replay ${dir || "."})`);
246
+ return result;
247
+ }
248
+ const lines = text.split("\n");
249
+ result.outputs = snap.outputs.map((name) => ({ name, file, line: Math.max(1, lines.findIndex((l) => l.includes(JSON.stringify(name))) + 1) }));
250
+ return result;
251
+ }
252
+ export const readGooseDir = (input) => withReplay(listGooseDir(input), input.tree, input.dir);
253
+ export const readGolangMigrateDir = (input) => withReplay(listGolangMigrateDir(input), input.tree, input.dir);
254
+ export const readClickHouseMigrationsDir = (input) => withReplay(listClickHouseMigrationsDir(input), input.tree, input.dir);
@@ -45,6 +45,8 @@ export declare function readNestedDocument(stdout: string, exitCode: number, std
45
45
  export declare function readNested(abs: string, args: Partial<ParsedArgs>, at: string | null | undefined, schemaId: string, contract: number, toolchain?: Toolchain | undefined): Promise<NestedRead & {
46
46
  stderr: string;
47
47
  }>;
48
+ /** Whether a chant refused `--capability-view` as a flag it doesn't know (#4378): one from before it. */
49
+ export declare function refusedCapabilityView(stderr: string): boolean;
48
50
  /**
49
51
  * Fold a nested workspace's graph into the outer one, under the outer member
50
52
  * `outer`, and fill that member's entry. The outer graph's other sections are
@@ -1 +1 @@
1
- {"version":3,"file":"nested-graph.d.ts","sourceRoot":"","sources":["../../src/workspace/nested-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAA8B,KAAK,cAAc,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE1H,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,cAAc,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC9F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElI,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAa1G;AAeD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAwBnI;AAED,uEAAuE;AACvE,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EACzB,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,SAAS,GAAG,SAAqB,GAC3C,OAAO,CAAC,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAG1C;AAYD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwD5H"}
1
+ {"version":3,"file":"nested-graph.d.ts","sourceRoot":"","sources":["../../src/workspace/nested-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAA8B,KAAK,cAAc,EAAqB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE1H,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,cAAc,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC9F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElI,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAc1G;AAeD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAwBnI;AAED,uEAAuE;AACvE,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,EACzB,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,SAAS,GAAG,SAAqB,GAC3C,OAAO,CAAC,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAS1C;AAED,yGAAyG;AACzG,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7D;AAYD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA0E5H"}