@intentius/chant 0.124.46 → 0.124.49

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 (726) 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 +41 -14
  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/graph-reader.d.ts +26 -0
  63. package/dist/cli/handlers/graph-reader.d.ts.map +1 -0
  64. package/dist/cli/handlers/graph-reader.js +41 -0
  65. package/dist/cli/handlers/graph.d.ts.map +1 -1
  66. package/dist/cli/handlers/graph.js +14 -0
  67. package/dist/cli/handlers/ledger.d.ts +3 -0
  68. package/dist/cli/handlers/ledger.d.ts.map +1 -0
  69. package/dist/cli/handlers/ledger.js +55 -0
  70. package/dist/cli/handlers/migrate.d.ts.map +1 -1
  71. package/dist/cli/handlers/migrate.js +18 -11
  72. package/dist/cli/handlers/misc.d.ts.map +1 -1
  73. package/dist/cli/handlers/misc.js +12 -1
  74. package/dist/cli/handlers/pr-env.js +2 -2
  75. package/dist/cli/handlers/pr.d.ts +15 -1
  76. package/dist/cli/handlers/pr.d.ts.map +1 -1
  77. package/dist/cli/handlers/pr.js +183 -40
  78. package/dist/cli/handlers/query.d.ts +7 -2
  79. package/dist/cli/handlers/query.d.ts.map +1 -1
  80. package/dist/cli/handlers/query.js +16 -4
  81. package/dist/cli/handlers/release.d.ts.map +1 -1
  82. package/dist/cli/handlers/release.js +6 -3
  83. package/dist/cli/handlers/search.d.ts +2 -4
  84. package/dist/cli/handlers/search.d.ts.map +1 -1
  85. package/dist/cli/handlers/search.js +13 -39
  86. package/dist/cli/main.d.ts.map +1 -1
  87. package/dist/cli/main.js +87 -14
  88. package/dist/cli/parse-args.d.ts.map +1 -1
  89. package/dist/cli/parse-args.js +47 -2
  90. package/dist/cli/registry.d.ts +22 -4
  91. package/dist/cli/registry.d.ts.map +1 -1
  92. package/dist/components/builders.d.ts +5 -1
  93. package/dist/components/builders.d.ts.map +1 -1
  94. package/dist/components/builders.js +5 -0
  95. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  96. package/dist/components/capability-plugin-loader.js +16 -1
  97. package/dist/components/capability-plugin.d.ts +14 -0
  98. package/dist/components/capability-plugin.d.ts.map +1 -1
  99. package/dist/components/pr-hooks.d.ts +21 -1
  100. package/dist/components/pr-hooks.d.ts.map +1 -1
  101. package/dist/components/pr-hooks.js +72 -4
  102. package/dist/components/pr-pipeline.d.ts +45 -10
  103. package/dist/components/pr-pipeline.d.ts.map +1 -1
  104. package/dist/components/pr-pipeline.js +47 -14
  105. package/dist/components/pr-policy.d.ts +36 -0
  106. package/dist/components/pr-policy.d.ts.map +1 -1
  107. package/dist/components/pr-policy.js +36 -0
  108. package/dist/components/pr-run.d.ts +3 -0
  109. package/dist/components/pr-run.d.ts.map +1 -1
  110. package/dist/components/pr-run.js +1 -0
  111. package/dist/components/starter-plugin.d.ts +1 -0
  112. package/dist/components/starter-plugin.d.ts.map +1 -1
  113. package/dist/components/starter-plugin.js +5 -1
  114. package/dist/components/verbs/index.d.ts +2 -0
  115. package/dist/components/verbs/index.d.ts.map +1 -1
  116. package/dist/components/verbs/index.js +2 -0
  117. package/dist/components/verbs/publish-artifact.d.ts +65 -0
  118. package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
  119. package/dist/components/verbs/publish-artifact.js +74 -0
  120. package/dist/components/verbs/publish-image.d.ts +129 -0
  121. package/dist/components/verbs/publish-image.d.ts.map +1 -0
  122. package/dist/components/verbs/publish-image.js +145 -0
  123. package/dist/config-environments.d.ts +20 -0
  124. package/dist/config-environments.d.ts.map +1 -1
  125. package/dist/config-environments.js +12 -0
  126. package/dist/config.d.ts +25 -1
  127. package/dist/config.d.ts.map +1 -1
  128. package/dist/config.js +10 -2
  129. package/dist/gate-decision.d.ts +20 -2
  130. package/dist/gate-decision.d.ts.map +1 -1
  131. package/dist/gate-decision.js +30 -3
  132. package/dist/graph-ir.d.ts +25 -0
  133. package/dist/graph-ir.d.ts.map +1 -1
  134. package/dist/graph-walk.d.ts +66 -0
  135. package/dist/graph-walk.d.ts.map +1 -0
  136. package/dist/graph-walk.js +70 -0
  137. package/dist/import/parser.d.ts +19 -0
  138. package/dist/import/parser.d.ts.map +1 -1
  139. package/dist/lexicon.d.ts +94 -6
  140. package/dist/lexicon.d.ts.map +1 -1
  141. package/dist/lifecycle/gate-ledger.d.ts +11 -0
  142. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  143. package/dist/lifecycle/git.d.ts +2 -5
  144. package/dist/lifecycle/git.d.ts.map +1 -1
  145. package/dist/lifecycle/ledger-read.d.ts +65 -0
  146. package/dist/lifecycle/ledger-read.d.ts.map +1 -0
  147. package/dist/lifecycle/ledger-read.js +160 -0
  148. package/dist/lifecycle/release-workstation.d.ts +7 -0
  149. package/dist/lifecycle/release-workstation.d.ts.map +1 -1
  150. package/dist/lifecycle/release-workstation.js +25 -0
  151. package/dist/lifecycle/run-ledger.d.ts +4 -3
  152. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  153. package/dist/lifecycle/run-ledger.js +1 -0
  154. package/dist/lint/discover.js +3 -1
  155. package/dist/lint/post-synth.d.ts +127 -1
  156. package/dist/lint/post-synth.d.ts.map +1 -1
  157. package/dist/lint/post-synth.js +84 -2
  158. package/dist/lint/rules/op/index.d.ts +1 -0
  159. package/dist/lint/rules/op/index.d.ts.map +1 -1
  160. package/dist/lint/rules/op/index.js +2 -0
  161. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
  162. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
  163. package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
  164. package/dist/op/activities/activity-contracts.d.ts +9 -6
  165. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  166. package/dist/op/activities/activity-contracts.js +5 -2
  167. package/dist/op/activities/index.d.ts +2 -2
  168. package/dist/op/activities/index.d.ts.map +1 -1
  169. package/dist/op/activities/index.js +1 -1
  170. package/dist/op/activities/review-agent.d.ts +90 -4
  171. package/dist/op/activities/review-agent.d.ts.map +1 -1
  172. package/dist/op/activities/review-agent.js +217 -19
  173. package/dist/op/activities/work-evidence.d.ts +8 -1
  174. package/dist/op/activities/work-evidence.d.ts.map +1 -1
  175. package/dist/op/activities/work-evidence.js +1 -0
  176. package/dist/op/builders.d.ts +9 -5
  177. package/dist/op/builders.d.ts.map +1 -1
  178. package/dist/op/builders.js +9 -5
  179. package/dist/op/composites/apply-op.d.ts +29 -2
  180. package/dist/op/composites/apply-op.d.ts.map +1 -1
  181. package/dist/op/composites/apply-op.js +20 -1
  182. package/dist/op/gate-approval-base.d.ts +25 -0
  183. package/dist/op/gate-approval-base.d.ts.map +1 -0
  184. package/dist/op/gate-approval-base.js +71 -0
  185. package/dist/op/gate-approval.d.ts +18 -9
  186. package/dist/op/gate-approval.d.ts.map +1 -1
  187. package/dist/op/gate-approval.js +13 -31
  188. package/dist/op/gate-name.d.ts +13 -0
  189. package/dist/op/gate-name.d.ts.map +1 -1
  190. package/dist/op/gate-name.js +14 -1
  191. package/dist/op/gate-quorum.d.ts +100 -3
  192. package/dist/op/gate-quorum.d.ts.map +1 -1
  193. package/dist/op/gate-quorum.js +108 -6
  194. package/dist/op/gate-review.d.ts +9 -0
  195. package/dist/op/gate-review.d.ts.map +1 -1
  196. package/dist/op/gate-review.js +13 -0
  197. package/dist/op/gate.d.ts +47 -5
  198. package/dist/op/gate.d.ts.map +1 -1
  199. package/dist/op/gate.js +25 -4
  200. package/dist/op/index.d.ts +3 -3
  201. package/dist/op/index.d.ts.map +1 -1
  202. package/dist/op/index.js +1 -1
  203. package/dist/op/local-executor.d.ts +45 -3
  204. package/dist/op/local-executor.d.ts.map +1 -1
  205. package/dist/op/local-executor.js +68 -7
  206. package/dist/op/op-waves-run.d.ts +26 -1
  207. package/dist/op/op-waves-run.d.ts.map +1 -1
  208. package/dist/op/op-waves-run.js +259 -13
  209. package/dist/op/op-waves.d.ts +72 -5
  210. package/dist/op/op-waves.d.ts.map +1 -1
  211. package/dist/op/op-waves.js +110 -15
  212. package/dist/op/runtime.d.ts +11 -0
  213. package/dist/op/runtime.d.ts.map +1 -1
  214. package/dist/op/schedule-overdue.d.ts +16 -0
  215. package/dist/op/schedule-overdue.d.ts.map +1 -1
  216. package/dist/op/schedule-overdue.js +36 -0
  217. package/dist/op/stage-hooks.d.ts +9 -2
  218. package/dist/op/stage-hooks.d.ts.map +1 -1
  219. package/dist/op/stage-hooks.js +7 -5
  220. package/dist/op/workspace-run-env.d.ts +22 -0
  221. package/dist/op/workspace-run-env.d.ts.map +1 -0
  222. package/dist/op/workspace-run-env.js +21 -0
  223. package/dist/pr-forge.d.ts +24 -0
  224. package/dist/pr-forge.d.ts.map +1 -1
  225. package/dist/pr-forge.js +47 -0
  226. package/dist/pr-loop.d.ts +10 -0
  227. package/dist/pr-loop.d.ts.map +1 -1
  228. package/dist/pr-loop.js +4 -0
  229. package/dist/pr-migrations.d.ts +62 -0
  230. package/dist/pr-migrations.d.ts.map +1 -0
  231. package/dist/pr-migrations.js +50 -0
  232. package/dist/pr-post.d.ts +42 -0
  233. package/dist/pr-post.d.ts.map +1 -1
  234. package/dist/pr-post.js +68 -2
  235. package/dist/read-filter.d.ts +65 -0
  236. package/dist/read-filter.d.ts.map +1 -0
  237. package/dist/read-filter.js +179 -0
  238. package/dist/run-event.d.ts +1 -1
  239. package/dist/run-event.d.ts.map +1 -1
  240. package/dist/terraform/carve.d.ts +24 -3
  241. package/dist/terraform/carve.d.ts.map +1 -1
  242. package/dist/terraform/carve.js +32 -14
  243. package/dist/terraform/cuts.d.ts +97 -0
  244. package/dist/terraform/cuts.d.ts.map +1 -0
  245. package/dist/terraform/cuts.js +138 -0
  246. package/dist/terraform/folds.d.ts +26 -0
  247. package/dist/terraform/folds.d.ts.map +1 -0
  248. package/dist/terraform/folds.js +38 -0
  249. package/dist/terraform/graph.d.ts.map +1 -1
  250. package/dist/terraform/graph.js +10 -0
  251. package/dist/terraform/reach.d.ts +140 -0
  252. package/dist/terraform/reach.d.ts.map +1 -0
  253. package/dist/terraform/reach.js +170 -0
  254. package/dist/terraform/score.d.ts +14 -0
  255. package/dist/terraform/score.d.ts.map +1 -1
  256. package/dist/terraform/score.js +14 -31
  257. package/dist/terraform/state.d.ts.map +1 -1
  258. package/dist/terraform/state.js +4 -2
  259. package/dist/terraform/types.d.ts +8 -0
  260. package/dist/terraform/types.d.ts.map +1 -1
  261. package/dist/wave-blocked.d.ts +10 -1
  262. package/dist/wave-blocked.d.ts.map +1 -1
  263. package/dist/wave-blocked.js +31 -3
  264. package/dist/wave-runtime.mjs +264 -254
  265. package/dist/workspace/check.schema.json +13 -2
  266. package/dist/workspace/checks/ci-branch.d.ts +44 -0
  267. package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
  268. package/dist/workspace/checks/ci-branch.js +133 -0
  269. package/dist/workspace/checks/gate-approval.d.ts +58 -0
  270. package/dist/workspace/checks/gate-approval.d.ts.map +1 -0
  271. package/dist/workspace/checks/gate-approval.js +103 -0
  272. package/dist/workspace/checks/links.d.ts +3 -0
  273. package/dist/workspace/checks/links.d.ts.map +1 -1
  274. package/dist/workspace/checks/links.js +12 -1
  275. package/dist/workspace/checks/org.d.ts +48 -0
  276. package/dist/workspace/checks/org.d.ts.map +1 -0
  277. package/dist/workspace/checks/org.js +156 -0
  278. package/dist/workspace/checks.d.ts +12 -1
  279. package/dist/workspace/checks.d.ts.map +1 -1
  280. package/dist/workspace/checks.js +63 -7
  281. package/dist/workspace/ci-branches.d.ts +16 -0
  282. package/dist/workspace/ci-branches.d.ts.map +1 -1
  283. package/dist/workspace/ci-branches.js +27 -0
  284. package/dist/workspace/ci-green-cli.js +7 -7
  285. package/dist/workspace/ci-green-workflow.d.ts +1 -1
  286. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  287. package/dist/workspace/ci-green-workflow.js +13 -8
  288. package/dist/workspace/ci-green.d.ts +14 -0
  289. package/dist/workspace/ci-green.d.ts.map +1 -1
  290. package/dist/workspace/ci-green.js +44 -11
  291. package/dist/workspace/ci-run.d.ts +9 -1
  292. package/dist/workspace/ci-run.d.ts.map +1 -1
  293. package/dist/workspace/ci-run.js +67 -6
  294. package/dist/workspace/ci-serve.d.ts +9 -0
  295. package/dist/workspace/ci-serve.d.ts.map +1 -1
  296. package/dist/workspace/ci-serve.js +114 -76
  297. package/dist/workspace/compose-graph.d.ts +14 -0
  298. package/dist/workspace/compose-graph.d.ts.map +1 -1
  299. package/dist/workspace/composites.d.ts +4 -1
  300. package/dist/workspace/composites.d.ts.map +1 -1
  301. package/dist/workspace/composites.js +5 -2
  302. package/dist/workspace/composites.schema.json +22 -0
  303. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  304. package/dist/workspace/cross-root-lint.d.ts +56 -0
  305. package/dist/workspace/cross-root-lint.d.ts.map +1 -0
  306. package/dist/workspace/cross-root-lint.js +111 -0
  307. package/dist/workspace/dbt-models-reader.d.ts +44 -0
  308. package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
  309. package/dist/workspace/dbt-models-reader.js +356 -0
  310. package/dist/workspace/dbt-project-common.d.ts +40 -0
  311. package/dist/workspace/dbt-project-common.d.ts.map +1 -0
  312. package/dist/workspace/dbt-project-common.js +106 -0
  313. package/dist/workspace/dbt-project-reader.d.ts +4 -3
  314. package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
  315. package/dist/workspace/dbt-project-reader.js +14 -108
  316. package/dist/workspace/decision-rank.d.ts +26 -0
  317. package/dist/workspace/decision-rank.d.ts.map +1 -0
  318. package/dist/workspace/decision-rank.js +16 -0
  319. package/dist/workspace/declaration.d.ts +50 -2
  320. package/dist/workspace/declaration.d.ts.map +1 -1
  321. package/dist/workspace/declaration.js +57 -11
  322. package/dist/workspace/declaration.schema.json +166 -24
  323. package/dist/workspace/environments.d.ts +26 -2
  324. package/dist/workspace/environments.d.ts.map +1 -1
  325. package/dist/workspace/environments.js +26 -2
  326. package/dist/workspace/exit-cli.d.ts +44 -0
  327. package/dist/workspace/exit-cli.d.ts.map +1 -0
  328. package/dist/workspace/exit-cli.js +198 -0
  329. package/dist/workspace/exit.d.ts +159 -0
  330. package/dist/workspace/exit.d.ts.map +1 -0
  331. package/dist/workspace/exit.js +480 -0
  332. package/dist/workspace/exit.schema.json +257 -0
  333. package/dist/workspace/flyway-dir.d.ts +39 -0
  334. package/dist/workspace/flyway-dir.d.ts.map +1 -0
  335. package/dist/workspace/flyway-dir.js +104 -0
  336. package/dist/workspace/flyway-layout.d.ts +96 -0
  337. package/dist/workspace/flyway-layout.d.ts.map +1 -0
  338. package/dist/workspace/flyway-layout.js +308 -0
  339. package/dist/workspace/graph-cache.d.ts +3 -1
  340. package/dist/workspace/graph-cache.d.ts.map +1 -1
  341. package/dist/workspace/graph-cache.js +12 -1
  342. package/dist/workspace/graph-cli.d.ts.map +1 -1
  343. package/dist/workspace/graph-cli.js +26 -8
  344. package/dist/workspace/graph.schema.json +34 -0
  345. package/dist/workspace/import-fetch.d.ts +38 -0
  346. package/dist/workspace/import-fetch.d.ts.map +1 -0
  347. package/dist/workspace/import-fetch.js +99 -0
  348. package/dist/workspace/import-init.d.ts +26 -0
  349. package/dist/workspace/import-init.d.ts.map +1 -0
  350. package/dist/workspace/import-init.js +130 -0
  351. package/dist/workspace/import-source.d.ts +147 -0
  352. package/dist/workspace/import-source.d.ts.map +1 -0
  353. package/dist/workspace/import-source.js +370 -0
  354. package/dist/workspace/init.d.ts +4 -0
  355. package/dist/workspace/init.d.ts.map +1 -1
  356. package/dist/workspace/init.js +70 -3
  357. package/dist/workspace/intent.d.ts +2 -3
  358. package/dist/workspace/intent.d.ts.map +1 -1
  359. package/dist/workspace/intent.js +5 -9
  360. package/dist/workspace/kind-link-readers.d.ts +59 -2
  361. package/dist/workspace/kind-link-readers.d.ts.map +1 -1
  362. package/dist/workspace/kind-link-readers.js +17 -1
  363. package/dist/workspace/kind-readers.d.ts +6 -0
  364. package/dist/workspace/kind-readers.d.ts.map +1 -1
  365. package/dist/workspace/kind-readers.js +18 -0
  366. package/dist/workspace/kinds.d.ts +90 -3
  367. package/dist/workspace/kinds.d.ts.map +1 -1
  368. package/dist/workspace/kinds.js +161 -7
  369. package/dist/workspace/ledger.schema.json +158 -0
  370. package/dist/workspace/lexicon-outputs.d.ts +20 -1
  371. package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
  372. package/dist/workspace/lexicon-outputs.js +102 -10
  373. package/dist/workspace/lineage-check.d.ts +3 -0
  374. package/dist/workspace/lineage-check.d.ts.map +1 -1
  375. package/dist/workspace/lineage-check.js +23 -4
  376. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  377. package/dist/workspace/lineage-upgrade.js +13 -4
  378. package/dist/workspace/links.d.ts +8 -1
  379. package/dist/workspace/links.d.ts.map +1 -1
  380. package/dist/workspace/links.js +25 -1
  381. package/dist/workspace/ls.d.ts +8 -0
  382. package/dist/workspace/ls.d.ts.map +1 -1
  383. package/dist/workspace/ls.js +7 -1
  384. package/dist/workspace/ls.schema.json +7 -0
  385. package/dist/workspace/member-commands.d.ts.map +1 -1
  386. package/dist/workspace/member-commands.js +54 -5
  387. package/dist/workspace/migrate-links.d.ts +45 -0
  388. package/dist/workspace/migrate-links.d.ts.map +1 -0
  389. package/dist/workspace/migrate-links.js +100 -0
  390. package/dist/workspace/migration-dirs.d.ts +74 -0
  391. package/dist/workspace/migration-dirs.d.ts.map +1 -0
  392. package/dist/workspace/migration-dirs.js +254 -0
  393. package/dist/workspace/new-migrations.d.ts +47 -0
  394. package/dist/workspace/new-migrations.d.ts.map +1 -0
  395. package/dist/workspace/new-migrations.js +91 -0
  396. package/dist/workspace/pr-report.schema.json +46 -0
  397. package/dist/workspace/promote.d.ts +96 -0
  398. package/dist/workspace/promote.d.ts.map +1 -0
  399. package/dist/workspace/promote.js +263 -0
  400. package/dist/workspace/reason-codes.d.ts +21 -0
  401. package/dist/workspace/reason-codes.d.ts.map +1 -1
  402. package/dist/workspace/reason-codes.js +25 -0
  403. package/dist/workspace/records-cli.d.ts +11 -0
  404. package/dist/workspace/records-cli.d.ts.map +1 -1
  405. package/dist/workspace/records-cli.js +57 -5
  406. package/dist/workspace/records.schema.json +5 -0
  407. package/dist/workspace/release-candidates.d.ts +2 -0
  408. package/dist/workspace/release-candidates.d.ts.map +1 -1
  409. package/dist/workspace/release-candidates.js +5 -2
  410. package/dist/workspace/release-train.d.ts +53 -0
  411. package/dist/workspace/release-train.d.ts.map +1 -0
  412. package/dist/workspace/release-train.js +134 -0
  413. package/dist/workspace/release-workflow.d.ts.map +1 -1
  414. package/dist/workspace/release-workflow.js +4 -3
  415. package/dist/workspace/repo-ref.d.ts +45 -0
  416. package/dist/workspace/repo-ref.d.ts.map +1 -0
  417. package/dist/workspace/repo-ref.js +114 -0
  418. package/dist/workspace/run-event.schema.json +2 -2
  419. package/dist/workspace/runs-cli.d.ts +9 -0
  420. package/dist/workspace/runs-cli.d.ts.map +1 -1
  421. package/dist/workspace/runs-cli.js +48 -3
  422. package/dist/workspace/runs.schema.json +7 -0
  423. package/dist/workspace/search-contract.d.ts +1 -1
  424. package/dist/workspace/search-contract.d.ts.map +1 -1
  425. package/dist/workspace/status-decisions.d.ts +37 -0
  426. package/dist/workspace/status-decisions.d.ts.map +1 -0
  427. package/dist/workspace/status-decisions.js +147 -0
  428. package/dist/workspace/status-gates.d.ts +9 -0
  429. package/dist/workspace/status-gates.d.ts.map +1 -1
  430. package/dist/workspace/status.d.ts +4 -0
  431. package/dist/workspace/status.d.ts.map +1 -1
  432. package/dist/workspace/status.js +14 -2
  433. package/dist/workspace/status.schema.json +6 -0
  434. package/dist/workspace/work-cli.d.ts.map +1 -1
  435. package/dist/workspace/work-cli.js +5 -3
  436. package/dist/workspace/work-evidence-ops.d.ts +83 -0
  437. package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
  438. package/dist/workspace/work-evidence-ops.js +169 -0
  439. package/dist/workspace/work-evidence.d.ts +12 -2
  440. package/dist/workspace/work-evidence.d.ts.map +1 -1
  441. package/dist/workspace/work-evidence.js +21 -3
  442. package/dist/workspace/work-evidence.schema.json +49 -2
  443. package/dist/workspace/workspace-gates.d.ts +110 -0
  444. package/dist/workspace/workspace-gates.d.ts.map +1 -0
  445. package/dist/workspace/workspace-gates.js +140 -0
  446. package/dist/workspace/workspace-kinds.schema.json +108 -10
  447. package/dist/workspace/workspace-ledger.d.ts +76 -0
  448. package/dist/workspace/workspace-ledger.d.ts.map +1 -0
  449. package/dist/workspace/workspace-ledger.js +91 -0
  450. package/dist/workspace/workspace-run.d.ts +112 -0
  451. package/dist/workspace/workspace-run.d.ts.map +1 -0
  452. package/dist/workspace/workspace-run.js +432 -0
  453. package/package.json +1 -1
  454. package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  455. package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  456. package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  457. package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  458. package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  459. package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  460. package/src/__golden__/wave-loop/op-cost-member.json +13 -0
  461. package/src/__golden__/wave-loop/op-denied-source.json +16 -0
  462. package/src/__golden__/wave-loop/op-denied.json +16 -0
  463. package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  464. package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  465. package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
  466. package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
  467. package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
  468. package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  469. package/src/__golden__/wave-loop/op-held-on.json +16 -0
  470. package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  471. package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  472. package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  473. package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  474. package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
  475. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  476. package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
  477. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  478. package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
  479. package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
  480. package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  481. package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  482. package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
  483. package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  484. package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  485. package/src/__golden__/wave-loop/op-overridden.json +16 -0
  486. package/src/__golden__/wave-loop/op-per-run.json +20 -0
  487. package/src/__golden__/wave-loop/op-point.json +13 -0
  488. package/src/__golden__/wave-loop/op-pr-review.json +10 -0
  489. package/src/__golden__/wave-loop/op-sealed.json +10 -0
  490. package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
  491. package/src/__golden__/wave-loop/op-spend.json +10 -0
  492. package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
  493. package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
  494. package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
  495. package/src/__golden__/wave-loop/op-wide.json +39 -0
  496. package/src/action-pins.test.ts +78 -0
  497. package/src/action-pins.ts +92 -0
  498. package/src/cli/commands/carve-score-once.test.ts +99 -0
  499. package/src/cli/commands/carve.ts +37 -6
  500. package/src/cli/commands/check-lexicon.test.ts +2 -2
  501. package/src/cli/commands/import-report.ts +71 -0
  502. package/src/cli/commands/import.ts +33 -3
  503. package/src/cli/commands/migrate-dialect.test.ts +145 -0
  504. package/src/cli/commands/migrate.ts +132 -11
  505. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
  506. package/src/cli/handlers/approve.ts +33 -4
  507. package/src/cli/handlers/build.ts +7 -1
  508. package/src/cli/handlers/graph-reader.test.ts +31 -0
  509. package/src/cli/handlers/graph-reader.ts +51 -0
  510. package/src/cli/handlers/graph.ts +14 -0
  511. package/src/cli/handlers/ledger.ts +54 -0
  512. package/src/cli/handlers/migrate.ts +21 -12
  513. package/src/cli/handlers/misc.ts +10 -1
  514. package/src/cli/handlers/pr-env.ts +2 -2
  515. package/src/cli/handlers/pr.ts +176 -37
  516. package/src/cli/handlers/query.ts +16 -4
  517. package/src/cli/handlers/release.ts +6 -3
  518. package/src/cli/handlers/search.ts +13 -34
  519. package/src/cli/main.test.ts +17 -0
  520. package/src/cli/main.ts +87 -14
  521. package/src/cli/parse-args.ts +35 -2
  522. package/src/cli/registry.ts +22 -4
  523. package/src/components/builders.ts +8 -0
  524. package/src/components/capability-plugin-loader.ts +13 -1
  525. package/src/components/capability-plugin.ts +16 -0
  526. package/src/components/pr-env-run-bundle.test.ts +1 -0
  527. package/src/components/pr-hooks.test.ts +73 -5
  528. package/src/components/pr-hooks.ts +95 -5
  529. package/src/components/pr-pipeline.ts +64 -16
  530. package/src/components/pr-policy.test.ts +64 -1
  531. package/src/components/pr-policy.ts +53 -0
  532. package/src/components/pr-run.ts +4 -0
  533. package/src/components/registry.test.ts +1 -1
  534. package/src/components/starter-plugin.ts +6 -0
  535. package/src/components/verbs/index.ts +2 -0
  536. package/src/components/verbs/publish-artifact.test.ts +60 -0
  537. package/src/components/verbs/publish-artifact.ts +122 -0
  538. package/src/components/verbs/publish-image.test.ts +101 -0
  539. package/src/components/verbs/publish-image.ts +265 -0
  540. package/src/config-environments.ts +28 -1
  541. package/src/config.ts +24 -1
  542. package/src/gate-decision-bundle.test.ts +5 -2
  543. package/src/gate-decision-identity.test.ts +20 -0
  544. package/src/gate-decision.ts +46 -3
  545. package/src/graph-ir.ts +27 -0
  546. package/src/graph-walk.test.ts +44 -0
  547. package/src/graph-walk.ts +102 -0
  548. package/src/import/parser.ts +20 -0
  549. package/src/lexicon.ts +98 -6
  550. package/src/lifecycle/gate-ledger.ts +8 -0
  551. package/src/lifecycle/git.ts +2 -2
  552. package/src/lifecycle/ledger-read.test.ts +107 -0
  553. package/src/lifecycle/ledger-read.ts +195 -0
  554. package/src/lifecycle/release-workstation.ts +24 -0
  555. package/src/lifecycle/run-ledger.ts +5 -2
  556. package/src/lint/cross-root.test.ts +122 -0
  557. package/src/lint/discover.ts +3 -1
  558. package/src/lint/post-synth.ts +212 -2
  559. package/src/lint/rules/op/index.ts +2 -0
  560. package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
  561. package/src/op/activities/activity-contracts.ts +5 -2
  562. package/src/op/activities/index.ts +2 -2
  563. package/src/op/activities/review-agent.test.ts +221 -4
  564. package/src/op/activities/review-agent.ts +265 -22
  565. package/src/op/activities/work-evidence.ts +9 -1
  566. package/src/op/builders.ts +9 -5
  567. package/src/op/composites/apply-op.test.ts +108 -0
  568. package/src/op/composites/apply-op.ts +37 -2
  569. package/src/op/gate-approval-at-base.test.ts +97 -0
  570. package/src/op/gate-approval-base.ts +72 -0
  571. package/src/op/gate-approval.test.ts +6 -1
  572. package/src/op/gate-approval.ts +22 -27
  573. package/src/op/gate-name.ts +16 -1
  574. package/src/op/gate-quorum-at-base.test.ts +211 -0
  575. package/src/op/gate-quorum.ts +156 -8
  576. package/src/op/gate-review.ts +14 -0
  577. package/src/op/gate.ts +69 -9
  578. package/src/op/index.ts +3 -2
  579. package/src/op/local-executor.ts +91 -11
  580. package/src/op/op-waves-depends-on.test.ts +81 -0
  581. package/src/op/op-waves-hook-targets.test.ts +4 -2
  582. package/src/op/op-waves-quorum-product.test.ts +158 -0
  583. package/src/op/op-waves-run.ts +288 -14
  584. package/src/op/op-waves.ts +143 -14
  585. package/src/op/runtime.ts +8 -0
  586. package/src/op/schedule-overdue.ts +33 -0
  587. package/src/op/stage-hooks.ts +13 -5
  588. package/src/op/workspace-run-env.ts +29 -0
  589. package/src/pr-forge-bundle.test.ts +2 -2
  590. package/src/pr-forge.test.ts +47 -0
  591. package/src/pr-forge.ts +68 -0
  592. package/src/pr-loop-bundle.test.ts +3 -2
  593. package/src/pr-loop.test.ts +52 -0
  594. package/src/pr-loop.ts +12 -0
  595. package/src/pr-migrations.ts +97 -0
  596. package/src/pr-post-open.e2e.test.ts +36 -0
  597. package/src/pr-post.test.ts +102 -3
  598. package/src/pr-post.ts +90 -2
  599. package/src/read-filter.test.ts +54 -0
  600. package/src/read-filter.ts +193 -0
  601. package/src/run-event.ts +1 -1
  602. package/src/stage-hooks-bundle.test.ts +1 -0
  603. package/src/terraform/carve.ts +52 -15
  604. package/src/terraform/cuts.test.ts +173 -0
  605. package/src/terraform/cuts.ts +188 -0
  606. package/src/terraform/folds.ts +44 -0
  607. package/src/terraform/graph.ts +9 -0
  608. package/src/terraform/radius.test.ts +90 -0
  609. package/src/terraform/reach.test.ts +146 -0
  610. package/src/terraform/reach.ts +247 -0
  611. package/src/terraform/score.ts +27 -29
  612. package/src/terraform/state.ts +3 -1
  613. package/src/terraform/types.ts +8 -0
  614. package/src/wave-blocked.ts +28 -3
  615. package/src/wave-loop-golden.test.ts +4 -3
  616. package/src/workspace/__fixtures__/import/spacelift.json +9 -0
  617. package/src/workspace/__fixtures__/import/tfc.json +13 -0
  618. package/src/workspace/behold-kinds.test.ts +2 -1
  619. package/src/workspace/check-contract.test.ts +8 -6
  620. package/src/workspace/check.schema.json +13 -2
  621. package/src/workspace/checks/ci-branch.test.ts +128 -0
  622. package/src/workspace/checks/ci-branch.ts +141 -0
  623. package/src/workspace/checks/gate-approval.test.ts +77 -0
  624. package/src/workspace/checks/gate-approval.ts +121 -0
  625. package/src/workspace/checks/links.ts +12 -1
  626. package/src/workspace/checks/org.ts +169 -0
  627. package/src/workspace/checks.ts +68 -7
  628. package/src/workspace/ci-branches.ts +31 -0
  629. package/src/workspace/ci-green-branches.test.ts +153 -0
  630. package/src/workspace/ci-green-cli.ts +7 -7
  631. package/src/workspace/ci-green-workflow.test.ts +4 -3
  632. package/src/workspace/ci-green-workflow.ts +13 -9
  633. package/src/workspace/ci-green.ts +49 -12
  634. package/src/workspace/ci-run.test.ts +72 -1
  635. package/src/workspace/ci-run.ts +68 -8
  636. package/src/workspace/ci-serve.test.ts +95 -0
  637. package/src/workspace/ci-serve.ts +106 -65
  638. package/src/workspace/component-environments.test.ts +25 -2
  639. package/src/workspace/compose-graph.ts +9 -2
  640. package/src/workspace/composites.schema.json +22 -0
  641. package/src/workspace/composites.test.ts +39 -8
  642. package/src/workspace/composites.ts +6 -2
  643. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  644. package/src/workspace/cross-root-lint.test.ts +90 -0
  645. package/src/workspace/cross-root-lint.ts +126 -0
  646. package/src/workspace/dbt-kind.test.ts +3 -2
  647. package/src/workspace/dbt-models-reader.ts +362 -0
  648. package/src/workspace/dbt-models.test.ts +248 -0
  649. package/src/workspace/dbt-project-common.ts +113 -0
  650. package/src/workspace/dbt-project-reader.ts +29 -112
  651. package/src/workspace/decision-rank.ts +40 -0
  652. package/src/workspace/declaration.schema.json +166 -24
  653. package/src/workspace/declaration.ts +101 -15
  654. package/src/workspace/environments.ts +40 -4
  655. package/src/workspace/exit-cli.ts +219 -0
  656. package/src/workspace/exit.schema.json +257 -0
  657. package/src/workspace/exit.test.ts +185 -0
  658. package/src/workspace/exit.ts +560 -0
  659. package/src/workspace/flyway-dir.ts +113 -0
  660. package/src/workspace/flyway-layout.ts +337 -0
  661. package/src/workspace/graph-cache.ts +12 -2
  662. package/src/workspace/graph-cli.ts +25 -10
  663. package/src/workspace/graph-contract.test.ts +4 -2
  664. package/src/workspace/graph.schema.json +34 -0
  665. package/src/workspace/identity.test.ts +29 -2
  666. package/src/workspace/import-fetch.ts +151 -0
  667. package/src/workspace/import-init.ts +147 -0
  668. package/src/workspace/import-source.test.ts +183 -0
  669. package/src/workspace/import-source.ts +462 -0
  670. package/src/workspace/init.test.ts +55 -1
  671. package/src/workspace/init.ts +66 -4
  672. package/src/workspace/intent.ts +6 -14
  673. package/src/workspace/kind-link-readers.ts +68 -3
  674. package/src/workspace/kind-readers.test.ts +36 -0
  675. package/src/workspace/kind-readers.ts +18 -1
  676. package/src/workspace/kinds.test.ts +35 -7
  677. package/src/workspace/kinds.ts +212 -11
  678. package/src/workspace/ledger.schema.json +158 -0
  679. package/src/workspace/lexicon-outputs.ts +132 -13
  680. package/src/workspace/lineage-check.ts +30 -7
  681. package/src/workspace/lineage-upgrade.test.ts +20 -0
  682. package/src/workspace/lineage-upgrade.ts +16 -7
  683. package/src/workspace/links.ts +24 -1
  684. package/src/workspace/ls-contract.test.ts +1 -1
  685. package/src/workspace/ls.schema.json +7 -0
  686. package/src/workspace/ls.ts +10 -1
  687. package/src/workspace/member-commands.ts +60 -2
  688. package/src/workspace/member-file-schema.test.ts +124 -0
  689. package/src/workspace/migrate-links.test.ts +99 -0
  690. package/src/workspace/migrate-links.ts +108 -0
  691. package/src/workspace/migration-dirs.test.ts +272 -0
  692. package/src/workspace/migration-dirs.ts +267 -0
  693. package/src/workspace/new-migrations.test.ts +98 -0
  694. package/src/workspace/new-migrations.ts +109 -0
  695. package/src/workspace/org-scope.test.ts +238 -0
  696. package/src/workspace/pr-report.schema.json +46 -0
  697. package/src/workspace/promote.test.ts +114 -0
  698. package/src/workspace/promote.ts +302 -0
  699. package/src/workspace/reason-codes.test.ts +10 -1
  700. package/src/workspace/reason-codes.ts +25 -0
  701. package/src/workspace/records-cli.ts +58 -5
  702. package/src/workspace/records.schema.json +5 -0
  703. package/src/workspace/release-candidates.ts +7 -2
  704. package/src/workspace/release-train.ts +157 -0
  705. package/src/workspace/release-workflow.ts +4 -3
  706. package/src/workspace/repo-ref.ts +113 -0
  707. package/src/workspace/run-event.schema.json +2 -2
  708. package/src/workspace/runs-cli.ts +48 -4
  709. package/src/workspace/runs.schema.json +7 -0
  710. package/src/workspace/status-contract.test.ts +46 -1
  711. package/src/workspace/status-decisions.test.ts +100 -0
  712. package/src/workspace/status-decisions.ts +151 -0
  713. package/src/workspace/status-gates.ts +9 -0
  714. package/src/workspace/status.schema.json +6 -0
  715. package/src/workspace/status.ts +17 -3
  716. package/src/workspace/where-filters.test.ts +39 -0
  717. package/src/workspace/work-cli.ts +5 -3
  718. package/src/workspace/work-evidence-ops.test.ts +176 -0
  719. package/src/workspace/work-evidence-ops.ts +189 -0
  720. package/src/workspace/work-evidence.schema.json +49 -2
  721. package/src/workspace/work-evidence.ts +22 -3
  722. package/src/workspace/workspace-gates.ts +200 -0
  723. package/src/workspace/workspace-kinds.schema.json +108 -10
  724. package/src/workspace/workspace-ledger.ts +130 -0
  725. package/src/workspace/workspace-run.test.ts +322 -0
  726. package/src/workspace/workspace-run.ts +461 -0
@@ -45,17 +45,20 @@ describe("the gate-decision bundle", () => {
45
45
  "packages/core/src/lifecycle/plan-digest.ts",
46
46
  "packages/core/src/notify-verify.ts",
47
47
  "packages/core/src/notify.ts",
48
+ "packages/core/src/op/gate-approval-base.ts",
49
+ "packages/core/src/op/gate-plan-context.ts",
48
50
  "packages/core/src/op/gate-point.ts",
49
51
  "packages/core/src/op/gate-quorum.ts",
50
52
  "packages/core/src/op/op-waves.ts",
53
+ "packages/core/src/wave-blocked.ts",
51
54
  "packages/core/src/wave-layout.ts",
52
55
  "packages/core/src/workspace/class-data.ts",
53
56
  "packages/core/src/workspace/identity-gate-rule.ts",
54
57
  "packages/core/src/workspace/jsonc.ts",
55
58
  "packages/core/src/workspace/trust/trust-files.ts",
56
59
  ]);
57
- // About 49 KB unminified today: 7 KB of it the pinned classes read as data (#3888), 6 KB the approval rules (#4290).
60
+ // About 49 KB unminified today: 7 KB of it the pinned classes read as data (#3888), 6 KB the approval rules (#4290), and the base approval checks (#4404) bring it to about 55 KB.
58
61
  const bytes = result.outputFiles.reduce((n, f) => n + f.contents.byteLength, 0);
59
- expect(bytes).toBeLessThan(54 * 1024);
62
+ expect(bytes).toBeLessThan(58 * 1024);
60
63
  });
61
64
  });
@@ -19,6 +19,7 @@ import {
19
19
  import { gateAdmission } from "./workspace/identity";
20
20
  import { hasSshKeygen, TestRepo, type Key } from "./workspace/trust/test-repo";
21
21
  import { evaluateGate, memoryGateLedgerPort } from "./op/gate";
22
+ import { gatePolicyVersion } from "./op/gate-approval";
22
23
 
23
24
  const D1 = "sha256:" + "a".repeat(64);
24
25
  const GATES = { ship: {}, deploy: { class: "human" }, release: { class: "runner" }, ops: { class: "operator" } };
@@ -218,6 +219,25 @@ describe.skipIf(!hasSshKeygen)("identity.gates read at base, as chant reads it",
218
219
  expect(decided.status === "approved" && decided.via === "ledger" ? decided.resolution : null).toEqual(check.satisfied ? check.resolution : null);
219
220
  }
220
221
  });
222
+
223
+ test("a gate's quorum at base, as chant reads it (#4324)", () => {
224
+ const rules = [{ targets: ["prod"], count: 2, roles: ["platform"] }, { count: 1 }];
225
+ const { r, base } = setup(() => ({}), { identity: { gates: { ship: { quorum: rules }, deploy: { class: "human" } } } });
226
+ const here = identityGateAdmissionAt(r.dir, base, "ship")!;
227
+ expect(here.requirement.quorum).toEqual(rules);
228
+ expect(here.requirement.quorum).toEqual(gateAdmission(r.dir, "ship", base)!.requirement.quorum);
229
+ expect(identityGateAdmissionAt(r.dir, base, "deploy")!.requirement).toEqual({ gate: "deploy", class: "human" });
230
+ });
231
+
232
+ test("a gate's policy, mode and context at base, as chant reads them (#4404)", () => {
233
+ const text = "permit (principal, action, resource);";
234
+ const policy = { kind: "gate-policy", lexicon: "cedar", name: "ship", version: gatePolicyVersion(text), text };
235
+ const { r, base } = setup(() => ({}), { identity: { gates: { ship: { policy, mode: "enforce", context: { risk: "high" } } } } });
236
+ const here = identityGateAdmissionAt(r.dir, base, "ship")!.requirement;
237
+ const theirs = gateAdmission(r.dir, "ship", base)!.requirement;
238
+ expect(here).toMatchObject({ policy, mode: "enforce", context: { risk: "high" } });
239
+ expect({ policy: here.policy, mode: here.mode, context: here.context }).toEqual({ policy: theirs.policy, mode: theirs.mode, context: theirs.context });
240
+ });
221
241
  });
222
242
 
223
243
  describe("admitApprover", () => {
@@ -30,7 +30,10 @@
30
30
  * Approval rules (#4290), a quorum as a list of `{ targets, count, roles,
31
31
  * notAuthor }`, are judged with `./op/gate-quorum.ts`, re-exported here:
32
32
  * {@link trustRolesAt} and {@link gateSignersAt} read what
33
- * `trustQuorumJudge` judges by, at base.
33
+ * `trustQuorumJudge` judges by, at base. A product's own review lines
34
+ * (#4333) become one approval per reviewer with `recordedReviewApprovals`,
35
+ * and `changeInvolvement` names everyone involved in a change for the
36
+ * judge to leave out.
34
37
  *
35
38
  * The module reads the ledger lines and the review it is handed; reading
36
39
  * them is the caller's. It imports no TypeScript, esbuild, zod, ajv, lint,
@@ -63,6 +66,9 @@ import { CORE_CLASSES, admitApprover, type ClassGrant, type GateAdmissionRule, t
63
66
  import { diskFiles, findInstalledPackage, mergePinClasses, parseClassDataByHand, readClassFiles, type PinClassRead } from "./workspace/class-data";
64
67
  import type { GateResolutionRecord, PendingGateRecord } from "./lifecycle/gate-ledger";
65
68
  import type { MergedReview } from "./op/gate-review";
69
+ import { quorumProblems as quorumProblemsOf, type GateQuorumSpec as QuorumSpec } from "./op/gate-quorum";
70
+ import { gateBaseApprovalProblems } from "./op/gate-approval-base";
71
+ import type { GateApprovalMode, GatePolicyRef } from "./op/gate-approval";
66
72
  import type { GateApprovalSource } from "./op/op-waves";
67
73
 
68
74
  export { GATE_APPROVAL_SOURCES, type GateApprovalSource } from "./op/op-waves";
@@ -124,6 +130,14 @@ export {
124
130
  targetGlobMatch,
125
131
  trustQuorumJudge,
126
132
  UNPROVEN_JUDGE,
133
+ changeInvolvement,
134
+ involvedWhy,
135
+ principalNames,
136
+ recordedReviewApprovals,
137
+ recordedReviewOf,
138
+ requestedByTrailers,
139
+ type QuorumInvolvement,
140
+ type RecordedReview,
127
141
  type GateQuorumJudge,
128
142
  type GateQuorumRule,
129
143
  type GateQuorumRuleProgress,
@@ -213,6 +227,19 @@ export function trustRolesAt(repo: string, base: string): Record<string, string[
213
227
  export interface IdentityGate {
214
228
  gate: string;
215
229
  class: string | null;
230
+ /**
231
+ * `identity.gates.<gate>.quorum` (#4324): the approval rules an Op gate of
232
+ * this name takes in place of its own. Absent when the entry sets none.
233
+ */
234
+ quorum?: QuorumSpec;
235
+ /**
236
+ * `identity.gates.<gate>.policy`, `.mode` and `.context` (#4404): what an Op
237
+ * gate of this name takes in place of its own `approval` fields. Each is
238
+ * absent when the entry sets none.
239
+ */
240
+ policy?: GatePolicyRef;
241
+ mode?: GateApprovalMode;
242
+ context?: Record<string, string | number | boolean | string[]>;
216
243
  }
217
244
 
218
245
  /** The declaration at `base`, parsed, or null when there is none. Throws when it cannot be parsed. */
@@ -228,8 +255,24 @@ function declarationAt(repo: string, base: string): { file: string; value: unkno
228
255
  }
229
256
 
230
257
  function identityGatesOf(declaration: unknown): IdentityGate[] {
231
- const gates = (declaration as { identity?: { gates?: Record<string, { class?: unknown } | null> } } | null)?.identity?.gates ?? {};
232
- return Object.entries(gates).map(([gate, entry]) => ({ gate, class: typeof entry?.class === "string" ? entry.class : null }));
258
+ const gates = (declaration as { identity?: { gates?: Record<string, { class?: unknown; quorum?: unknown; policy?: unknown; mode?: unknown; context?: unknown } | null> } } | null)?.identity?.gates ?? {};
259
+ return Object.entries(gates).map(([gate, entry]) => {
260
+ const out: IdentityGate = { gate, class: typeof entry?.class === "string" ? entry.class : null };
261
+ if (!entry) return out;
262
+ if (entry.quorum !== undefined) {
263
+ // #4324: a quorum chant would refuse leaves the gate undecidable, as chant's own read does.
264
+ const [problem] = quorumProblemsOf(entry.quorum, `identity.gates.${gate}.quorum`, { notAuthor: false });
265
+ if (problem) throw new Error(`chant.workspace.json at base: ${problem.replace(/`/g, "")}, so the gate cannot be decided`);
266
+ out.quorum = structuredClone(entry.quorum) as QuorumSpec;
267
+ }
268
+ // #4404: the same for the policy, mode and context.
269
+ const [rest] = gateBaseApprovalProblems(entry, `identity.gates.${gate}`);
270
+ if (rest) throw new Error(`chant.workspace.json at base: ${rest.replace(/`/g, "")}, so the gate cannot be decided`);
271
+ if (entry.policy !== undefined) out.policy = structuredClone(entry.policy) as GatePolicyRef;
272
+ if (entry.mode !== undefined) out.mode = entry.mode as GateApprovalMode;
273
+ if (entry.context !== undefined) out.context = structuredClone(entry.context) as NonNullable<IdentityGate["context"]>;
274
+ return out;
275
+ });
233
276
  }
234
277
 
235
278
  /**
package/src/graph-ir.ts CHANGED
@@ -210,6 +210,33 @@ export interface LexiconWorkspaceOutputs {
210
210
  gaps?: string[];
211
211
  }
212
212
 
213
+ /**
214
+ * One link a lexicon reads from its own declarations (#4397): an output of
215
+ * another member that a declaration depends on, such as a table an otel
216
+ * `clickhouse` exporter writes.
217
+ */
218
+ export interface LexiconWorkspaceLink {
219
+ /** The producer's output the declaration reads or writes: `default.otel_logs`, `default.otel_logs.Body`. */
220
+ output: string;
221
+ /**
222
+ * The output that picks the producer when `member` is unset; unset, the
223
+ * output itself. A column is anchored on its table, so a dropped column is
224
+ * missing from the member that still has the table.
225
+ */
226
+ anchor?: string;
227
+ /** The producer, when the declaration names it. Unset, the one member exposing `anchor`. */
228
+ member?: string;
229
+ /** The entity key that states the link, for the finding's file and line. */
230
+ entity: string;
231
+ }
232
+
233
+ /** What a lexicon's `workspaceLinks` hook returns (#4397). */
234
+ export interface LexiconWorkspaceLinks {
235
+ links: LexiconWorkspaceLink[];
236
+ /** Places the hook could not read without the environment, one line each. Their links are left out. */
237
+ gaps?: string[];
238
+ }
239
+
213
240
  /** What a lexicon's `graphEdges` hook returns (#3910). */
214
241
  export interface LexiconGraphEdges {
215
242
  references: LexiconGraphReference[];
@@ -0,0 +1,44 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { adjacencyOf, walkBreadthFirst } from "./graph-walk";
3
+
4
+ const edges = [
5
+ { from: "a", to: "b" },
6
+ { from: "b", to: "c" },
7
+ { from: "c", to: "a" },
8
+ { from: "c", to: "d" },
9
+ ];
10
+ const idx = adjacencyOf(edges);
11
+ const out = (id: string) => (idx.out.get(id) ?? []).map((e) => ({ far: e.to, hops: [e] }));
12
+
13
+ describe("walkBreadthFirst", () => {
14
+ test("offers every node at its shortest depth first, and ends on a cycle", () => {
15
+ const first = new Map<string, number>();
16
+ const found = walkBreadthFirst("a", {
17
+ steps: out,
18
+ arrive: ({ id, depth }) => {
19
+ if (!first.has(id)) first.set(id, depth);
20
+ return false;
21
+ },
22
+ });
23
+ expect(found).toBeNull();
24
+ expect([...first]).toEqual([["b", 1], ["c", 2], ["a", 3], ["d", 3]]);
25
+ });
26
+
27
+ test("stops on the first accepted arrival and returns its hops", () => {
28
+ const found = walkBreadthFirst("a", { steps: out, arrive: ({ id }) => id === "d" });
29
+ expect(found?.depth).toBe(3);
30
+ expect(found?.hops.map((h) => `${h.from}->${h.to}`)).toEqual(["a->b", "b->c", "c->d"]);
31
+ });
32
+
33
+ test("min and max bound which arrivals are offered and how far it steps", () => {
34
+ const offered: string[] = [];
35
+ walkBreadthFirst("a", { steps: out, min: 2, max: 2, arrive: ({ id }) => (offered.push(id), false) });
36
+ expect(offered).toEqual(["c"]);
37
+ });
38
+
39
+ test("walks from several starts at once", () => {
40
+ const offered = new Set<string>();
41
+ walkBreadthFirst(["c", "b"], { steps: out, arrive: ({ id }) => (offered.add(id), false) });
42
+ expect([...offered].sort()).toEqual(["a", "b", "c", "d"]);
43
+ });
44
+ });
@@ -0,0 +1,102 @@
1
+ /**
2
+ * The one breadth-first edge walk in core.
3
+ *
4
+ * `chant search`'s transitive edge terms (#4359) walk the graph IR, and carve's
5
+ * reachability (#2325) and reference-closed sets (#3909) walk a `TfGraph`. The
6
+ * two graphs have different node and edge shapes but the same walk: an index of
7
+ * each node's edges by direction, built once, and a frontier that steps along
8
+ * it. This module is that walk, generic over what a step carries, so neither
9
+ * caller keeps a traversal of its own.
10
+ *
11
+ * Pure: no IR or Terraform types, no filesystem.
12
+ */
13
+
14
+ /** Edges grouped by the node they leave (`out`) and the node they enter (`in`). */
15
+ export interface Adjacency<E> {
16
+ out: Map<string, E[]>;
17
+ in: Map<string, E[]>;
18
+ }
19
+
20
+ /**
21
+ * Index edges by both ends, once. Looking a node's edges up in here is O(1),
22
+ * where filtering the edge list for them is O(E) per node and O(V·E) per walk
23
+ * (#2325 measured 21 s against 52 ms at 6 000 nodes).
24
+ */
25
+ export function adjacencyOf<E extends { from: string; to: string }>(edges: Iterable<E>): Adjacency<E> {
26
+ const idx: Adjacency<E> = { out: new Map(), in: new Map() };
27
+ for (const e of edges) {
28
+ let out = idx.out.get(e.from);
29
+ if (!out) idx.out.set(e.from, (out = []));
30
+ out.push(e);
31
+ let inn = idx.in.get(e.to);
32
+ if (!inn) idx.in.set(e.to, (inn = []));
33
+ inn.push(e);
34
+ }
35
+ return idx;
36
+ }
37
+
38
+ /** One step out of a node: where it lands, and the hops (edges) it took to get there. */
39
+ export interface WalkStep<H> {
40
+ far: string;
41
+ hops: readonly H[];
42
+ }
43
+
44
+ /** A node reached by the walk: its id, how many steps from the start, and the hops on the way. */
45
+ export interface WalkArrival<H> {
46
+ id: string;
47
+ depth: number;
48
+ hops: H[];
49
+ }
50
+
51
+ export interface WalkOptions<H> {
52
+ /** The steps out of a node. The walk follows exactly these; filter here. */
53
+ steps: (id: string) => readonly WalkStep<H>[];
54
+ /** Arrivals shallower than this are walked through but not offered. Default 1. */
55
+ min?: number;
56
+ /** No step is taken from a node this deep. Default unbounded. */
57
+ max?: number;
58
+ /**
59
+ * Called for each arrival at a depth of at least `min`, in breadth-first
60
+ * order, so a node's first arrival is at its shortest depth. A node can
61
+ * arrive more than once (by several edges, or again past `min` on a cycle);
62
+ * return true to stop the walk and return this arrival.
63
+ */
64
+ arrive?: (arrival: WalkArrival<H>) => boolean;
65
+ }
66
+
67
+ /**
68
+ * Walk breadth-first from one or more start nodes (#4359, #2325).
69
+ *
70
+ * Termination on a cycle: a state is (node, depth capped at `min`). Past the
71
+ * minimum, arriving at a node again by a longer walk can reach nothing the
72
+ * first arrival could not, so it is not queued twice. The state space is
73
+ * finite and the walk always ends, which matters for carve: chant never runs
74
+ * Terraform, so a `depends_on` cycle in a malformed estate reaches it
75
+ * unvalidated.
76
+ *
77
+ * Returns the arrival `arrive` stopped on, or null when the walk ran out.
78
+ */
79
+ export function walkBreadthFirst<H>(start: string | Iterable<string>, opts: WalkOptions<H>): WalkArrival<H> | null {
80
+ const min = opts.min ?? 1;
81
+ const max = opts.max ?? Infinity;
82
+ const starts = typeof start === "string" ? [start] : [...start];
83
+ const seen = new Set<string>(starts.map((id) => `${id}|0`));
84
+ let frontier: WalkArrival<H>[] = starts.map((id) => ({ id, depth: 0, hops: [] }));
85
+ while (frontier.length > 0) {
86
+ const next: WalkArrival<H>[] = [];
87
+ for (const s of frontier) {
88
+ if (s.depth >= max) continue;
89
+ for (const step of opts.steps(s.id)) {
90
+ const depth = s.depth + 1;
91
+ const arrival: WalkArrival<H> = { id: step.far, depth, hops: step.hops.length ? [...s.hops, ...step.hops] : s.hops };
92
+ if (depth >= min && opts.arrive?.(arrival)) return arrival;
93
+ const key = `${step.far}|${Math.min(depth, min)}`;
94
+ if (seen.has(key)) continue;
95
+ seen.add(key);
96
+ next.push(arrival);
97
+ }
98
+ }
99
+ frontier = next;
100
+ }
101
+ return null;
102
+ }
@@ -57,6 +57,24 @@ export interface OutputIR {
57
57
  readonly condition?: string;
58
58
  }
59
59
 
60
+ /**
61
+ * A finding a parser reports about the translation it made (#4398): a
62
+ * judgment call the author must confirm, or something it could not carry.
63
+ * `chant import --report <path>` writes these as SARIF and `--strict` fails
64
+ * while any `warning` or `error` is open, as `chant migrate` does.
65
+ */
66
+ export interface ImportDiagnostic {
67
+ readonly ruleId: string;
68
+ readonly severity: "error" | "warning" | "info";
69
+ readonly message: string;
70
+ /** 1-based line in the template, when the parser knows it. */
71
+ readonly line?: number;
72
+ /** 1-based column in the template. */
73
+ readonly column?: number;
74
+ /** The object the finding is about, as the source names it. */
75
+ readonly entity?: string;
76
+ }
77
+
60
78
  /**
61
79
  * Intermediate representation of a parsed template
62
80
  */
@@ -71,6 +89,8 @@ export interface TemplateIR {
71
89
  /** Sections or keys the parser read but import cannot carry, named so the
72
90
  * import surfaces them instead of dropping them silently (#2069). */
73
91
  readonly warnings?: string[];
92
+ /** Findings for `--report` and `--strict` (#4398); a parser that has none leaves it out. */
93
+ readonly diagnostics?: ImportDiagnostic[];
74
94
  }
75
95
 
76
96
  /**
package/src/lexicon.ts CHANGED
@@ -3,8 +3,8 @@ import type { Serializer } from "./serializer";
3
3
  import type { Declarable } from "./declarable";
4
4
  import type { LintRule } from "./lint/rule";
5
5
  import type { RuleSpec } from "./lint/declarative";
6
- import type { PostSynthCheck } from "./lint/post-synth";
7
- import type { TemplateParser, TemplateIR, ParseContext, ParserOptions, ParserOptionSpec } from "./import/parser";
6
+ import type { CrossRootCheck, PostSynthCheck } from "./lint/post-synth";
7
+ import type { TemplateParser, TemplateIR, ParseContext, ParserOptions, ParserOptionSpec, ImportDiagnostic } from "./import/parser";
8
8
  import type { TypeScriptGenerator } from "./import/generator";
9
9
  import type { EmbeddedContentImporter } from "./import/embedded";
10
10
  import type { AgentConfigImporter } from "./agents/importer";
@@ -24,7 +24,7 @@ import type { OwnershipChannel, OwnershipMarker } from "./ownership";
24
24
  import type { LexiconConfigSchema } from "./lexicon-config";
25
25
  import type { RuleMeta } from "./audit/catalog";
26
26
  import type { ReferenceCatalog } from "./graph-refs";
27
- import type { IREdge, LexiconGraphEdges, LexiconUnreadSource, LexiconWorkspaceOutputs } from "./graph-ir";
27
+ import type { IREdge, LexiconGraphEdges, LexiconUnreadSource, LexiconWorkspaceLinks, LexiconWorkspaceOutputs } from "./graph-ir";
28
28
  import type { DescribeResourcesResult, UnobservedReason } from "./observation";
29
29
  import type { DescribeIdentityOptions, DescribeIdentityResult } from "./identity";
30
30
  import type { DeepNormalizationHooks, DeepObservationResult } from "./deep-observation";
@@ -382,8 +382,11 @@ export function intrinsicCallFoldsEagerly(def: { isTag?: boolean; foldsEagerly?:
382
382
  * Options passed to a MigrationSource by `chant migrate`.
383
383
  */
384
384
  export interface MigrateOptions {
385
- /** Output format. */
386
- emit?: "yaml" | "ts";
385
+ /**
386
+ * Output format. `yaml` and `ts` are the gitlab pair's; `sql` writes plain
387
+ * DDL for a pair whose target is a database (#4399).
388
+ */
389
+ emit?: "yaml" | "ts" | "sql";
387
390
  /** Recognise composite patterns when emitting. */
388
391
  useComposites?: boolean;
389
392
  /** Source file path (for provenance display only). */
@@ -411,6 +414,20 @@ export interface MigrationResult {
411
414
  diagnostics: Array<Record<string, unknown>>;
412
415
  /** Markdown "Security posture" section, when security analysis ran (#306). */
413
416
  securityPosture?: string;
417
+ /**
418
+ * Outputs of the source member that the rendered output reads, by the names
419
+ * a workspace link takes (#4399). In a workspace, `chant migrate` writes
420
+ * them as `links` of the member the output lands in, so a source that drops
421
+ * or renames one fails `chant workspace check`.
422
+ */
423
+ links?: string[];
424
+ /**
425
+ * The checks that need the target's own server, run for `--validate`
426
+ * instead of the external linter (#4399). Returns the diagnostics found,
427
+ * `error` severity for a refusal. Throws when the server cannot start, which
428
+ * `chant migrate` reports as a validation that did not run.
429
+ */
430
+ validate?(): Promise<Array<Record<string, unknown>>>;
414
431
  }
415
432
 
416
433
  /**
@@ -420,6 +437,12 @@ export interface MigrationResult {
420
437
  export interface MigrationSource {
421
438
  /** Lightweight detector: does this content look like the expected source? */
422
439
  detect(content: string): boolean;
440
+ /**
441
+ * The source may be a directory, which `transform` reads itself from
442
+ * `opts.sourceFile` (a workspace member, #4399). `chant migrate` then skips
443
+ * `detect` and passes empty content.
444
+ */
445
+ directory?: boolean;
423
446
  /** Run the translation. */
424
447
  transform(content: string, opts: MigrateOptions): Promise<MigrationResult>;
425
448
  }
@@ -870,6 +893,19 @@ export interface ScheduledOpSpec {
870
893
  * per-job environment mapping to put a value in.
871
894
  */
872
895
  variables?: Record<string, string>;
896
+ /**
897
+ * The Op runs a `reviewAgent` step in `handoff` mode (#4326): generate the
898
+ * review as two jobs. The first runs `chant run <name>` with no forge write
899
+ * token (the checkout's fetches get the job's token and nothing after
900
+ * them does) and hands the review on as job outputs. The second checks
901
+ * nothing out, takes the review as data and posts it as one note with the
902
+ * write token (`postReviewNote`). GitHub and Forgejo only: a GitLab merge
903
+ * request pipeline hands every job the project's unprotected variables, so
904
+ * the gitlab generator refuses this by name. The trigger must be
905
+ * `pull_request` and the finding-mode `report`, since the first job posts
906
+ * nothing.
907
+ */
908
+ reviewAgent?: boolean;
873
909
  }
874
910
 
875
911
  /**
@@ -1191,6 +1227,14 @@ export interface LexiconPlugin {
1191
1227
  /** Return post-synthesis checks for build validation */
1192
1228
  postSynthChecks?(): PostSynthCheck[];
1193
1229
 
1230
+ /**
1231
+ * Checks that read across build roots (chant #1939). Only a cross-root run
1232
+ * (`runCrossRootChecks`, ./lint/post-synth.ts) calls this; `chant build`
1233
+ * and `chant lint` never do, so a lexicon that adds one costs a
1234
+ * single-build project nothing.
1235
+ */
1236
+ crossRootChecks?(): CrossRootCheck[];
1237
+
1194
1238
  /**
1195
1239
  * Activity contracts (`ActivityContract`, `./op/activity-contract.ts`) for
1196
1240
  * the activities this lexicon implements, so another lexicon's post-synth
@@ -1305,6 +1349,15 @@ export interface LexiconPlugin {
1305
1349
  */
1306
1350
  parserOptions?(): ParserOptionSpec[];
1307
1351
 
1352
+ /**
1353
+ * `chant import --validate` (#4398): check what the import would write
1354
+ * against the lexicon's own emulator, and return one diagnostic per
1355
+ * failure (severity `error`). Called with the parsed IR and the checked
1356
+ * parser options. A lexicon without an emulator leaves this out, and
1357
+ * `--validate` then fails the import with a message saying so.
1358
+ */
1359
+ validateImport?(ir: TemplateIR, options: ParserOptions): Promise<ImportDiagnostic[]>;
1360
+
1308
1361
  /** Return a generator for converting IR to TypeScript */
1309
1362
  templateGenerator?(): TypeScriptGenerator;
1310
1363
 
@@ -1499,6 +1552,17 @@ export interface LexiconPlugin {
1499
1552
  */
1500
1553
  workspaceOutputs?(entities: ReadonlyMap<string, Declarable>, unread?: readonly LexiconUnreadSource[]): LexiconWorkspaceOutputs | undefined;
1501
1554
 
1555
+ /**
1556
+ * The outputs of other workspace members this lexicon's declarations read
1557
+ * or write (#4397), such as the ClickHouse tables an otel `clickhouse`
1558
+ * exporter writes. `chant workspace check` calls it offline on the member's
1559
+ * folded source, as it calls `workspaceOutputs`, and checks each link like
1560
+ * one a kind's reader found (WSP093 to WSP095, WSP099 for `gaps`), naming
1561
+ * the file and line of the declaring entity. Pure: no I/O. Return
1562
+ * `undefined` when the project declares nothing that links.
1563
+ */
1564
+ workspaceLinks?(entities: ReadonlyMap<string, Declarable>, unread?: readonly LexiconUnreadSource[]): LexiconWorkspaceLinks | undefined;
1565
+
1502
1566
  // LSP
1503
1567
  /** Provide completions for LSP */
1504
1568
  completionProvider?(ctx: CompletionContext): CompletionItem[];
@@ -1544,10 +1608,14 @@ export interface LexiconPlugin {
1544
1608
  * Return a migration source for translating from another lexicon's
1545
1609
  * format into this lexicon. Returns undefined if `from` is not supported.
1546
1610
  *
1611
+ * `to` is the target as `--to` names it. A side may add a dialect after the
1612
+ * lexicon, `sql/clickhouse` (#4399); `from` is passed as written, and a
1613
+ * lexicon with one target ignores `to`.
1614
+ *
1547
1615
  * Example: the gitlab lexicon implements `migrationSource("github")` to
1548
1616
  * translate `.github/workflows/*.yml` into `.gitlab-ci.yml`.
1549
1617
  */
1550
- migrationSource?(from: string): MigrationSource | undefined;
1618
+ migrationSource?(from: string, to?: string): MigrationSource | undefined;
1551
1619
 
1552
1620
  // State
1553
1621
  /**
@@ -1674,6 +1742,30 @@ export interface LexiconPlugin {
1674
1742
  changes: DisruptionQuery[];
1675
1743
  }): Record<string, DisruptionVerdict> | Promise<Record<string, DisruptionVerdict>>;
1676
1744
 
1745
+ /**
1746
+ * Classify the migration files a pull request adds (#4407), offline. Core
1747
+ * lists the new files of a migration-directory workspace member (goose,
1748
+ * golang-migrate, clickhouse-migrations, Flyway) and asks the lexicon whose
1749
+ * dialect they are written in; the lexicon reads each file's up statements
1750
+ * and gives each the class its schema-diff classifier gives the same change.
1751
+ * A statement that alone cannot decide a class comes back `undecided`,
1752
+ * naming the candidate rules. The answer is shown in the plan note; nothing
1753
+ * is applied and no server is contacted. Omit for a lexicon with no
1754
+ * migration dialect.
1755
+ */
1756
+ classifyMigrations?(options: {
1757
+ /** The member's kind reader: `goose-dir`, `golang-migrate-dir`, `clickhouse-migrations-dir` or `flyway-dir`. */
1758
+ reader: string;
1759
+ /** The SQL dialect the member's migrations are written in. A lexicon answers only for its own dialects (an empty list otherwise). */
1760
+ dialect: string;
1761
+ /** The tree the files are read from (the pull request's head), rooted at the workspace root. */
1762
+ tree: import("./workspace/tree").WorkspaceTree;
1763
+ /** The member's directory in that tree; "" for the root. */
1764
+ dir: string;
1765
+ /** The new files to classify, relative to the workspace root. */
1766
+ files: string[];
1767
+ }): import("./pr-migrations").MigrationFileClassification[] | Promise<import("./pr-migrations").MigrationFileClassification[]>;
1768
+
1677
1769
  /**
1678
1770
  * Report the undeclared resources this estate *depends on* (#1273), as
1679
1771
  * opposed to the ones it manages.
@@ -181,6 +181,14 @@ export interface GateResolutionRecord {
181
181
  * other resolution.
182
182
  */
183
183
  empty?: true;
184
+ /**
185
+ * The workspace gate that stood in for this member gate (#2554, ws-039):
186
+ * its name and the digest of the member plans it covers. Set only on the
187
+ * resolution a run builds when a workspace approval passes the gate; it is
188
+ * never written to the member's ledger, where the approval stays the
189
+ * workspace's (`_members/_workspace/_gates/`).
190
+ */
191
+ workspaceGate?: { gate: string; digest: string };
184
192
  /**
185
193
  * The channel this resolution was authored on (chant#2384) — set by the
186
194
  * writer, never by the caller. `chant approve` records `"cli"`, the
@@ -148,7 +148,7 @@ export async function writeBlobToPath(
148
148
  filename: string,
149
149
  content: string,
150
150
  commitMessage: string,
151
- opts?: { cwd?: string; expectPriorPathSha?: string | null },
151
+ opts?: LedgerLocation & { expectPriorPathSha?: string | null },
152
152
  ): Promise<string> {
153
153
  const dir = await ledgerDir(environment, opts);
154
154
  return writeLedgerFiles(
@@ -447,7 +447,7 @@ export async function readBlobFromPath(
447
447
  export async function readPathSha(
448
448
  environment: string,
449
449
  filename: string,
450
- opts?: { cwd?: string },
450
+ opts?: LedgerLocation,
451
451
  ): Promise<string | null> {
452
452
  const rt = getRuntime();
453
453
  const dir = await ledgerDir(environment, opts);