@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
@@ -47,6 +47,7 @@ const BOOLEAN_FLAGS = new Set([
47
47
  "--up",
48
48
  "--down",
49
49
  "--include-dependents",
50
+ "--cross-root",
50
51
  "--local",
51
52
  "--json",
52
53
  "--progress-json",
@@ -153,13 +154,36 @@ export function parseArgs(args: string[]): ParsedArgs {
153
154
  // whose own value legitimately contains `=` (`--param=tier=production`
154
155
  // splits to flag `--param`, value `tier=production`, not further split on
155
156
  // the second `=`).
156
- args = splitJoinedFlags(args, BOOLEAN_FLAGS);
157
+ //
158
+ // Tokens after a bare `--` are positionals (#4369), so they are not split.
159
+ const end = args.indexOf("--");
160
+ args = end < 0 ? splitJoinedFlags(args, BOOLEAN_FLAGS) : [...splitJoinedFlags(args.slice(0, end), BOOLEAN_FLAGS), ...args.slice(end)];
161
+
162
+ // chant #4369 — every token after a bare `--` is a positional, whatever it
163
+ // starts with: `chant search -- "-kind:X"` is the spelling that always works.
164
+ let onlyPositionals = false;
165
+ const positional = (arg: string): void => {
166
+ if (result.command) (result.positionals ??= []).push(arg);
167
+ if (!result.command) {
168
+ result.command = arg;
169
+ } else if (result.path === ".") {
170
+ result.path = arg;
171
+ } else if (!result.extraPositional) {
172
+ result.extraPositional = arg;
173
+ } else {
174
+ result.extraPositional2 = arg;
175
+ }
176
+ };
157
177
 
158
178
  let i = 0;
159
179
  while (i < args.length) {
160
180
  const arg = args[i];
161
181
 
162
- if (arg === "--help" || arg === "-h") {
182
+ if (onlyPositionals) {
183
+ positional(arg);
184
+ } else if (arg === "--") {
185
+ onlyPositionals = true;
186
+ } else if (arg === "--help" || arg === "-h") {
163
187
  result.help = true;
164
188
  } else if (arg === "--version" || arg === "-V") {
165
189
  result.version = true;
@@ -339,6 +363,10 @@ export function parseArgs(args: string[]): ParsedArgs {
339
363
  result.explain = true;
340
364
  } else if (arg === "--show") {
341
365
  result.show = args[++i];
366
+ } else if (arg === "--count-by") {
367
+ // `chant search --count-by kind|module|attr:<name>` (#4360)
368
+ result.countBy = args[++i];
369
+ if (!result.countBy || result.countBy.startsWith("-")) throw new Error("--count-by needs a grouping: --count-by kind, --count-by module or --count-by attr:<name>");
342
370
  } else if (arg === "--up") {
343
371
  result.up = true;
344
372
  } else if (arg === "--down") {
@@ -353,6 +381,19 @@ export function parseArgs(args: string[]): ParsedArgs {
353
381
  result.head = args[++i];
354
382
  } else if (arg === "--include-dependents") {
355
383
  result.includeDependents = true;
384
+ } else if (arg === "--cross-root") {
385
+ // `chant workspace lint --cross-root` (#2549): the disagreement lint over every member's graph.
386
+ result.crossRoot = true;
387
+ } else if (arg === "--dependents-of") {
388
+ // `chant workspace run --dependents-of <member> --op <op>` (#2554).
389
+ const value = args[++i];
390
+ if (!value || value.startsWith("-")) throw new Error("--dependents-of needs a member name: --dependents-of <member>");
391
+ result.dependentsOf = value;
392
+ } else if (arg === "--pin") {
393
+ // `chant workspace train <env> --pin <member>=<label|digest>` (#2554), repeatable.
394
+ const value = args[++i];
395
+ if (!value || value.startsWith("-") || !value.includes("=")) throw new Error("--pin needs a member and a release: --pin <member>=<label|digest>");
396
+ (result.pins ??= []).push(value);
356
397
  } else if (arg === "--from-affected") {
357
398
  result.fromAffected = args[++i];
358
399
  } else if (arg === "--gate") {
@@ -508,6 +549,16 @@ export function parseArgs(args: string[]): ParsedArgs {
508
549
  result.deep = true;
509
550
  } else if (arg === "--at") {
510
551
  result.at = args[++i];
552
+ } else if (arg === "--capability-view") {
553
+ // `chant graph --format ir --capability-view` and `chant workspace graph --capability-view` (#4378)
554
+ result.capabilityView = true;
555
+ } else if (arg === "--capabilities") {
556
+ // `chant search --capabilities` and `chant workspace search --capabilities` (#4375)
557
+ result.capabilities = true;
558
+ } else if (arg === "--snapshot") {
559
+ // `chant search` and `chant workspace search --snapshot <ref>` (#4374)
560
+ result.snapshot = args[++i];
561
+ if (!result.snapshot || result.snapshot.startsWith("-")) throw new Error("--snapshot needs a snapshot ref: --snapshot latest");
511
562
  } else if (arg === "--kind") {
512
563
  // `chant workspace records|graph|check --kind <kind file>` (#2546, #2549)
513
564
  result.kind = args[++i];
@@ -895,8 +946,8 @@ export function parseArgs(args: string[]): ParsedArgs {
895
946
  } else if (arg === "--expire") {
896
947
  result.expire = true;
897
948
  } else if (arg === "--role") {
898
- // #2508 — a role the approver claims, which a gate's policy sees. A
899
- // quorum reads roles from .chant/trust.json at base instead (#4290).
949
+ // #2508 — a role the approver claims, recorded on the approval. A quorum
950
+ // (#4290) and a gate policy (#4324) read roles from .chant/trust.json at base.
900
951
  // Repeatable, and a comma list works too.
901
952
  const value = args[++i] ?? "";
902
953
  result.roles = [...(result.roles ?? []), ...value.split(",").map((r) => r.trim()).filter(Boolean)];
@@ -934,6 +985,12 @@ export function parseArgs(args: string[]): ParsedArgs {
934
985
  // #2537 — `chant build` and `chant lint` at a declared workspace root
935
986
  // run on the root project alone instead of refusing with WSP000.
936
987
  result.rootOnly = true;
988
+ } else if (arg === "--forge-repos") {
989
+ // #3168 — `chant workspace check --forge-repos <file>`: the forge's
990
+ // repository list, as a warden reads it, for an org workspace's checks.
991
+ const value = args[++i];
992
+ if (!value || value.startsWith("-")) throw new Error("--forge-repos needs a file: --forge-repos <repos.json>");
993
+ result.forgeRepos = value;
937
994
  } else if (arg === "--generated") {
938
995
  // #2641 — `chant workspace check --generated` runs each declared
939
996
  // generator and compares its output with the file in the tree.
@@ -954,6 +1011,11 @@ export function parseArgs(args: string[]): ParsedArgs {
954
1011
  result.url = args[++i];
955
1012
  } else if (arg === "--op") {
956
1013
  result.op = args[++i];
1014
+ } else if (arg === "--where") {
1015
+ // #4363 — a typed filter on a contract read; repeatable, every clause has to hold.
1016
+ const value = args[++i];
1017
+ if (value === undefined || value.startsWith("--")) throw new Error("--where needs a clause: --where <field><op><value>");
1018
+ result.where = [...(result.where ?? []), value];
957
1019
  } else if (arg === "--since") {
958
1020
  result.since = args[++i];
959
1021
  } else if (arg === "--limit") {
@@ -972,17 +1034,19 @@ export function parseArgs(args: string[]): ParsedArgs {
972
1034
  // every command, not scoped per-command, so "the command's known
973
1035
  // flags" isn't something this loop can name in isolation.
974
1036
  throw new Error(`Unknown flag: ${arg}\nRun "chant --help" to see supported flags.`);
975
- } else if (!arg.startsWith("-")) {
976
- if (result.command) (result.positionals ??= []).push(arg);
977
- if (!result.command) {
978
- result.command = arg;
979
- } else if (result.path === ".") {
980
- result.path = arg;
981
- } else if (!result.extraPositional) {
982
- result.extraPositional = arg;
983
- } else {
984
- result.extraPositional2 = arg;
985
- }
1037
+ } else if (/^-[A-Za-z]/.test(arg)) {
1038
+ // chant #4369 — an unrecognised short flag (`-x`) is refused like an
1039
+ // unrecognised `--flag` (#1127). It used to be dropped without a word,
1040
+ // the same silent misparse #1127 closed for long flags. A lexicon's own
1041
+ // mounted command still gets its short flags: `main` tries the plugin
1042
+ // commands before rethrowing a parse error.
1043
+ throw new Error(`Unknown flag: ${arg}\nRun "chant --help" to see supported flags.`);
1044
+ } else {
1045
+ // Anything else is a positional, including a token that starts with `-`
1046
+ // but is not flag-shaped (#4369): `->kind:Bucket` is a search query that
1047
+ // opens with an outgoing edge term, and dropping it made `chant search`
1048
+ // answer for "." instead. A bare `-` is a positional too.
1049
+ positional(arg);
986
1050
  }
987
1051
 
988
1052
  i++;
@@ -83,7 +83,7 @@ export interface ParsedArgs {
83
83
  /** `chant run events <run> --follow` (#4042) — stream the run's events as they happen, until `run-settle`. */
84
84
  follow?: boolean;
85
85
  live: boolean;
86
- /** `chant migrate --from <name>` (default "github") */
86
+ /** `chant migrate --from <name>` (default "github"); `lexicon/dialect` for the sql lexicon */
87
87
  migrateFrom?: string;
88
88
  /** `chant import --kustomize <dir>` — render the kustomization, then import (#1548) */
89
89
  kustomize?: string;
@@ -103,9 +103,9 @@ export interface ParsedArgs {
103
103
  write?: boolean;
104
104
  /** `chant carve apply --write-source` — stamp the ownership marker into the emitted source */
105
105
  writeSource?: boolean;
106
- /** `chant migrate --to <name>` (default "gitlab") */
106
+ /** `chant migrate --to <name>` (default "gitlab"); `lexicon/dialect` for the sql lexicon */
107
107
  migrateTo?: string;
108
- /** `chant migrate --emit yaml|ts` */
108
+ /** `chant migrate --emit yaml|ts|sql` */
109
109
  emit?: string;
110
110
  /** Escalate needs-review diagnostics to errors (migrate command) */
111
111
  strict?: boolean;
@@ -246,6 +246,8 @@ export interface ParsedArgs {
246
246
  show?: string;
247
247
  /** `chant search --explain` — append a footer: universe count + why non-matches were excluded (#1139). */
248
248
  explain?: boolean;
249
+ /** `chant search --count-by kind|module|attr:<name>`: print one count per group instead of one row per match (#4360). */
250
+ countBy?: string;
249
251
  /** `chant graph --lens blast:<node> --up` — include upstream producers */
250
252
  up?: boolean;
251
253
  /** `chant graph --lens blast:<node> --down` — include downstream dependents */
@@ -261,6 +263,12 @@ export interface ParsedArgs {
261
263
  head?: string;
262
264
  /** `chant lifecycle affected --include-dependents` — add downstream consumers */
263
265
  includeDependents?: boolean;
266
+ /** `chant workspace run --dependents-of <member> --op <op>` (#2554): run the Op in every member that links to this one, directly or not. */
267
+ dependentsOf?: string;
268
+ /** `chant workspace lint --cross-root` (#2549): also run the disagreement lint and the lexicons' cross-root checks over every member's graph. */
269
+ crossRoot?: boolean;
270
+ /** `chant workspace train <env> --pin <member>=<label|digest>` (#2554), repeatable: the release a train pins for that member instead of its newest. */
271
+ pins?: string[];
264
272
  /**
265
273
  * `chant components fan-out --from-affected <file>` (#2420) — read the
266
274
  * stack-level change signal from the JSON `chant lifecycle affected --json`
@@ -446,6 +454,26 @@ export interface ParsedArgs {
446
454
  * should win.
447
455
  */
448
456
  at?: string;
457
+ /**
458
+ * `chant search "<q>" --snapshot <ref> --env <name>` and `chant workspace
459
+ * search "<q>" --snapshot <ref>` (#4374): the recorded snapshot to answer
460
+ * from. Plain search also takes it as `--at <ref>`, for compatibility;
461
+ * everywhere else in the read contract `--at` is a git revision.
462
+ */
463
+ snapshot?: string;
464
+ /**
465
+ * `chant search --capabilities` and `chant workspace search --capabilities`
466
+ * (#4375): print the capability catalog, the `capabilities` document of the
467
+ * read contract, instead of answering a query.
468
+ */
469
+ capabilities?: boolean;
470
+ /**
471
+ * `chant graph --format ir --capability-view` (#4378): add the lexicon-neutral
472
+ * view capability rules read, mapped by this chant's lexicons, to the IR as
473
+ * `capabilityView`. `chant workspace graph --capability-view` asks each
474
+ * member's chant for it and carries it on the member.
475
+ */
476
+ capabilityView?: boolean;
449
477
  /** `chant workspace records --kind <path>` (#2546): the record kind file to read records through. */
450
478
  kind?: string;
451
479
  /** Every `--kind` given, in order: `chant workspace graph --intent` reads each (#2651). */
@@ -618,6 +646,8 @@ export interface ParsedArgs {
618
646
  * generators run member code.
619
647
  */
620
648
  generated?: boolean;
649
+ /** `chant workspace check --forge-repos <file>` (#3168): the forge's repository list, checked against an org workspace's repo members (WSP014, WSP015). */
650
+ forgeRepos?: string;
621
651
  /**
622
652
  * `chant workspace build|lint|audit|graph --member <name>` (#2537): run only
623
653
  * the named members or example groups. Repeatable, and a comma list works too.
@@ -766,7 +796,7 @@ export interface ParsedArgs {
766
796
  * on a model-authored channel.
767
797
  */
768
798
  allowSameOrigin?: boolean;
769
- /** `chant approve --role <name>` (#2508) — roles the approver claims, which a gate's policy sees. A quorum never counts them (#4290): its roles come from `.chant/trust.json` at base. Repeatable; a comma list also works. */
799
+ /** `chant approve --role <name>` (#2508) — roles the approver claims, recorded on the approval. Nothing trusts them: a quorum (#4290) and a gate policy (#4324) read roles from `.chant/trust.json` at base, for a sealed approval. Repeatable; a comma list also works. */
770
800
  roles?: string[];
771
801
  /** `chant approve --agent` (#2508) — record the approval as an agent's. An agent never counts toward a quorum; it passes a gate only through a policy permit in `enforce` mode. */
772
802
  agent?: boolean;
@@ -776,6 +806,8 @@ export interface ParsedArgs {
776
806
  op?: string;
777
807
  /** `chant operator log --since <iso>` (#2029) — only entries at or after this ISO-8601 instant. `chant workspace records --since <rev>` (#2673) — the revision to compare the records with. `chant workspace metrics --since <date>` (#4039) — the start of the window the metrics count. */
778
808
  since?: string;
809
+ /** `chant ledger`, `chant workspace records` and `chant workspace runs --where <field><op><value>` (#4363): typed filters, repeatable, all of which have to hold. */
810
+ where?: string[];
779
811
  /** `chant operator log --limit <n>` (#2029) — keep only the newest n entries (still printed oldest-first). */
780
812
  limit?: number;
781
813
  /** `chant approve <op> <gate> --url <url>` (#2028) — the address this resolution happened at (the PR/MR that carried the change), recorded typed on the gate-resolution fact so a reader is not sniffing `--note` for something link-shaped. Defaults to the PR/MR the surrounding CI job is for, when there is one. Must be an absolute http/https URL. */
@@ -19,6 +19,8 @@ import type {
19
19
  ZipPackageInput,
20
20
  JvmBuildInput,
21
21
  GenerateSbomInput,
22
+ PublishImageInput,
23
+ PublishArtifactInput,
22
24
  SignInput,
23
25
  AttestProvenanceInput,
24
26
  VerifyInput,
@@ -64,6 +66,12 @@ export const vulnGate = step<VulnGateInput>("vuln-gate");
64
66
  // The cloud-specific waits (`wait-for-stack`/`wait-steady-state`/`wait-job`)
65
67
  // ship as builders from the aws lexicon, alongside their capabilities.
66
68
  export const waitClusterHealthy = step<WaitClusterHealthyInput>("wait-cluster-healthy");
69
+ // ── publish (core owns the verb; each cloud lexicon contributes a registry login backend) ──
70
+ export const publishImage = step<PublishImageInput>("publish-image");
71
+ export const publishArtifact = step<PublishArtifactInput>("publish-artifact");
72
+ /** Alias for {@link publishArtifact}. */
73
+ export const publishAsset = publishArtifact;
74
+
67
75
  export const waitEndpoint = step<WaitEndpointInput>("wait-endpoint");
68
76
  export const healthGate = step<HealthGateInput>("health-gate");
69
77
 
@@ -26,6 +26,8 @@ import { lexiconModulePath, importLexiconPackage } from "../lexicon-module";
26
26
  import type { CapabilityPlugin } from "./capability-plugin";
27
27
  import { isCapabilityPlugin } from "./capability-plugin";
28
28
  import { starterCapabilityPlugin } from "./starter-plugin";
29
+ import { isRegistryBackendConsumer, type RegistryLoginBackend } from "./verbs/publish-image";
30
+ import { isStorageBackendConsumer, type ArtifactStorageBackend } from "./verbs/publish-artifact";
29
31
 
30
32
  /** Thrown when a dynamically-imported capability package does not satisfy `CapabilityPlugin` — the "malformed capability package" case #559 asks doctor/validation to detect. */
31
33
  export class MalformedCapabilityPluginError extends Error {
@@ -165,9 +167,19 @@ export function registerCapabilityPlugins(
165
167
  }
166
168
  }
167
169
 
170
+ const backends: RegistryLoginBackend[] = [];
171
+ for (const plugin of plugins) backends.push(...(plugin.registryBackends?.() ?? []));
172
+ const storage: ArtifactStorageBackend[] = [];
173
+ for (const plugin of plugins) storage.push(...(plugin.storageBackends?.() ?? []));
174
+
168
175
  for (const plugin of plugins) {
169
176
  for (const capability of plugin.capabilities()) {
170
- registry.register(capability);
177
+ // A capability that consumes registry login backends (`publish-image`)
178
+ // is re-bound to the backends of the plugins loaded for this registry.
179
+ let bound = capability;
180
+ if (isRegistryBackendConsumer(bound)) bound = bound.withRegistryBackends(backends) as typeof bound;
181
+ if (isStorageBackendConsumer(bound)) bound = bound.withStorageBackends(storage) as typeof bound;
182
+ registry.register(bound);
171
183
  }
172
184
  }
173
185
  return registry;
@@ -32,6 +32,8 @@ import { readFileSync } from "node:fs";
32
32
  import { dirname, join } from "node:path";
33
33
  import { fileURLToPath } from "node:url";
34
34
  import type { Capability } from "./capability";
35
+ import type { RegistryLoginBackend } from "./verbs/publish-image";
36
+ import type { ArtifactStorageBackend } from "./verbs/publish-artifact";
35
37
 
36
38
  /**
37
39
  * Manifest for a packaged capability plugin — the capability-side analogue
@@ -88,6 +90,20 @@ export interface CapabilityPlugin {
88
90
  /** Capability kinds grouped by family, informational — mirrors `STARTER_VERB_FAMILIES` (./registry.ts) shape for third-party plugins that want to publish the same grouping. */
89
91
  families?(): Record<string, readonly string[]>;
90
92
 
93
+ /**
94
+ * Registry login backends this plugin contributes to core's `publish-image`
95
+ * verb (aws: ECR, azure: ACR, gcp: Artifact Registry). Not capabilities, so
96
+ * several plugins may contribute without a duplicate-kind clash.
97
+ */
98
+ registryBackends?(): RegistryLoginBackend[];
99
+
100
+ /**
101
+ * Object-storage backends this plugin contributes to core's
102
+ * `publish-artifact` verb (aws: S3, azure: Blob, gcp: GCS). Like
103
+ * `registryBackends`, not capabilities, so several plugins may contribute.
104
+ */
105
+ storageBackends?(): ArtifactStorageBackend[];
106
+
91
107
  /** Optional initialization hook, called once after load (mirrors `LexiconPlugin.init`). */
92
108
  init?(): void | Promise<void>;
93
109
  }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * The ports `chant components pr-env` runs ./pr-env-run.ts with: the records
3
+ * on chant/lifecycle (`_pr-envs/records.jsonl`), the gate ledger there, and
4
+ * the note and status on the forge. They sit apart from ./pr-env-run.ts
5
+ * because the gate port loads ./pr-run.ts and ../op/gate.ts, which bring
6
+ * Ajv, js-yaml and the component driver. A product with its own ports
7
+ * imports `@intentius/chant/components/pr-env-run` and never loads these.
8
+ */
9
+
10
+ import type { PrForge } from "../pr-forge";
11
+ import type { PrEnvPorts } from "./pr-env-run";
12
+ import {
13
+ PR_ENV_LEDGER_DIR,
14
+ PR_ENV_LEDGER_FILE,
15
+ parsePrEnvRecords,
16
+ prEnvNoteMarker,
17
+ prEnvStatusContext,
18
+ prEnvStatusDescription,
19
+ prEnvStatusState,
20
+ renderPrEnvNote,
21
+ type PrEnvReport,
22
+ } from "./pr-environment";
23
+
24
+ /**
25
+ * The note and the `chant/pr-env` status on the forge. A refusal from the
26
+ * forge warns and never fails the run.
27
+ */
28
+ export function forgePrEnvPublisher(forge: PrForge, warn: (message: string) => void = () => {}): (report: PrEnvReport) => Promise<void> {
29
+ return async (report) => {
30
+ const { forgePrincipalOf } = await import("../pr-forge");
31
+ const note = renderPrEnvNote(report, forgePrincipalOf(forge.kind, forge.host, "<your-login>"));
32
+ if (report.head) {
33
+ try {
34
+ await forge.setStatus(report.head, { context: prEnvStatusContext(report.member), state: prEnvStatusState(report), description: prEnvStatusDescription(report), ...(forge.runUrl ? { url: forge.runUrl } : {}) });
35
+ } catch (err) {
36
+ warn(`could not set the ${prEnvStatusContext(report.member)} status: ${messageOf(err)}`);
37
+ }
38
+ }
39
+ try {
40
+ await forge.upsertNote(report.pr, prEnvNoteMarker(report.env, report.member), note);
41
+ } catch (err) {
42
+ warn(`could not post the note on #${report.pr}: ${messageOf(err)}`);
43
+ }
44
+ };
45
+ }
46
+
47
+ /**
48
+ * The ports over chant/lifecycle in `cwd` (default the working directory):
49
+ * the records at `_pr-envs/records.jsonl`, appended and pushed, and the gate
50
+ * ledger read without writing a pending fact. With `forge`, the note and
51
+ * status are posted and the sweep asks it whether a pull request is open.
52
+ */
53
+ export function lifecyclePrEnvPorts(opts: { cwd?: string; forge?: PrForge; log?: (line: string) => void; warn?: (message: string) => void } = {}): PrEnvPorts {
54
+ const at = opts.cwd ? { cwd: opts.cwd } : undefined;
55
+ const warn = opts.warn ?? (() => {});
56
+ const forge = opts.forge;
57
+ return {
58
+ async readRecords() {
59
+ const { fetchLifecycle, readBlobFromPath } = await import("../lifecycle/git");
60
+ await fetchLifecycle(at).catch(() => false);
61
+ return parsePrEnvRecords(await readBlobFromPath(PR_ENV_LEDGER_DIR, PR_ENV_LEDGER_FILE, at));
62
+ },
63
+ async appendRecord(record) {
64
+ const { appendLedgerLine, fetchLifecycle, pushLifecycleReport } = await import("../lifecycle/git");
65
+ try {
66
+ await fetchLifecycle(at).catch(() => false);
67
+ await appendLedgerLine(PR_ENV_LEDGER_DIR, PR_ENV_LEDGER_FILE, JSON.stringify(record), `Pull request environment ${record.env} ${record.kind} (${record.result})`, at);
68
+ const pushed = await pushLifecycleReport(at);
69
+ if (pushed.pushWarning) warn(pushed.pushWarning);
70
+ } catch (err) {
71
+ warn(`could not record ${record.env}'s ${record.kind} on chant/lifecycle: ${messageOf(err)}`);
72
+ }
73
+ },
74
+ async decideGate(input) {
75
+ const { approvalOf, decidePrGate, readOnlyLedger } = await import("./pr-run");
76
+ const { gitGateLedgerPort } = await import("../op/gate");
77
+ const approval = approvalOf(await decidePrGate(readOnlyLedger(gitGateLedgerPort(at)), input));
78
+ return { status: approval.status, ...(approval.approvedBy ? { approvedBy: approval.approvedBy } : {}) };
79
+ },
80
+ ...(forge ? { publish: forgePrEnvPublisher(forge, warn) } : {}),
81
+ ...(forge?.pullRequestState ? { pullRequestState: (pr: number) => forge.pullRequestState!(pr) } : {}),
82
+ ...(opts.log ? { log: opts.log } : {}),
83
+ warn,
84
+ };
85
+ }
86
+
87
+ function messageOf(err: unknown): string {
88
+ return err instanceof Error ? err.message : String(err);
89
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The pull request environment runs bundle alone (#4330 follow-up): a
3
+ * product that brings its own adapter and ports imports
4
+ * `@intentius/chant/components/pr-env-run` into one bundled file, without the
5
+ * gate, Ajv, js-yaml or the config loader. The ports chant uses live in
6
+ * ./pr-env-ports.ts. This bundles the module and reads esbuild's list of what
7
+ * went in.
8
+ */
9
+
10
+ import { join } from "node:path";
11
+ import { build } from "esbuild";
12
+ import { describe, expect, test } from "vitest";
13
+ import { REPO } from "../workspace/__fixtures__/contract-repo";
14
+
15
+ describe("the pr-env-run bundle", () => {
16
+ test("holds the runs and the records, and no gate, schema checks, YAML or config loader", async () => {
17
+ const result = await build({
18
+ entryPoints: [join(REPO, "packages", "core", "src", "components", "pr-env-run.ts")],
19
+ bundle: true,
20
+ platform: "node",
21
+ format: "esm",
22
+ write: false,
23
+ metafile: true,
24
+ outdir: "out",
25
+ logLevel: "silent",
26
+ });
27
+ const inputs = Object.keys(result.metafile.inputs).map((i) => i.replace(/^.*?packages\//, "packages/")).sort();
28
+ expect(inputs).toEqual([
29
+ "packages/core/src/change-set.ts",
30
+ "packages/core/src/ci-handover.ts",
31
+ "packages/core/src/ci-jobs.ts",
32
+ "packages/core/src/components/changed-files.ts",
33
+ "packages/core/src/components/pr-env-run.ts",
34
+ "packages/core/src/components/pr-environment.ts",
35
+ "packages/core/src/components/pr-pipeline.ts",
36
+ "packages/core/src/config-environments.ts",
37
+ "packages/core/src/content-digest.ts",
38
+ "packages/core/src/declarable.ts",
39
+ "packages/core/src/effect-receipt.ts",
40
+ "packages/core/src/gated-waves.ts",
41
+ "packages/core/src/intrinsic.ts",
42
+ "packages/core/src/lifecycle/plan-digest.ts",
43
+ "packages/core/src/lifecycle/teardown.ts",
44
+ "packages/core/src/live-endpoint.ts",
45
+ "packages/core/src/observation.ts",
46
+ "packages/core/src/op/activity-runtime.ts",
47
+ "packages/core/src/op/emulator-lifecycle.ts",
48
+ "packages/core/src/plan-summary.ts",
49
+ "packages/core/src/pr-loop.ts",
50
+ ]);
51
+ expect(inputs.some((i) => /node_modules\/(ajv|js-yaml)\//.test(i) || i.endsWith("/op/gate.ts") || i.endsWith("/src/config.ts") || i.endsWith("/ts-loader.ts"))).toBe(false);
52
+ expect(result.outputFiles.reduce((n, f) => n + f.contents.byteLength, 0)).toBeLessThan(40 * 1024);
53
+ });
54
+ });
@@ -16,9 +16,11 @@
16
16
  * - the report and the note ({@link renderPrEnvNote}).
17
17
  *
18
18
  * `chant components pr-env` (../cli/handlers/pr-env.ts) runs these with the
19
- * components adapter and the lexicons' teardown. The ports default to
20
- * chant/lifecycle in the working directory and the gate ledger there
21
- * ({@link lifecyclePrEnvPorts}).
19
+ * components adapter and the lexicons' teardown, and the ports over
20
+ * chant/lifecycle and the gate ledger in ./pr-env-ports.ts
21
+ * (`lifecyclePrEnvPorts`). Those ports load the gate and its schema checks,
22
+ * so they live apart: a product that brings its own ports bundles this
23
+ * module without them (pr-env-run-bundle.test.ts).
22
24
  */
23
25
 
24
26
  import { spawnSync } from "node:child_process";
@@ -29,19 +31,11 @@ import { withoutForgeTokens } from "../ci-handover";
29
31
  import type { ChantConfig } from "../config";
30
32
  import type { TeardownCandidate, TeardownHole, TeardownOutcome } from "../lexicon";
31
33
  import type { ObservationLexicon } from "../lexicon";
32
- import type { PrForge } from "../pr-forge";
33
34
  import {
34
35
  PR_ENV_EXIT,
35
36
  PR_ENV_GATE,
36
- PR_ENV_LEDGER_DIR,
37
- PR_ENV_LEDGER_FILE,
38
37
  expired,
39
38
  livePrEnvironments,
40
- parsePrEnvRecords,
41
- prEnvNoteMarker,
42
- prEnvStatusContext,
43
- prEnvStatusDescription,
44
- prEnvStatusState,
45
39
  prEnvironmentName,
46
40
  renderPrEnvNote,
47
41
  teardownComplete,
@@ -425,71 +419,6 @@ export async function prEnvSweep(input: PrEnvSweepInput): Promise<{ exit: number
425
419
  return { exit, results };
426
420
  }
427
421
 
428
- // ── the ports chant itself uses ────────────────────────────────────────────
429
-
430
- /**
431
- * The note and the `chant/pr-env` status on the forge. A refusal from the
432
- * forge warns and never fails the run.
433
- */
434
- export function forgePrEnvPublisher(forge: PrForge, warn: (message: string) => void = () => {}): (report: PrEnvReport) => Promise<void> {
435
- return async (report) => {
436
- const { forgePrincipalOf } = await import("../pr-forge");
437
- const note = renderPrEnvNote(report, forgePrincipalOf(forge.kind, forge.host, "<your-login>"));
438
- if (report.head) {
439
- try {
440
- await forge.setStatus(report.head, { context: prEnvStatusContext(report.member), state: prEnvStatusState(report), description: prEnvStatusDescription(report), ...(forge.runUrl ? { url: forge.runUrl } : {}) });
441
- } catch (err) {
442
- warn(`could not set the ${prEnvStatusContext(report.member)} status: ${messageOf(err)}`);
443
- }
444
- }
445
- try {
446
- await forge.upsertNote(report.pr, prEnvNoteMarker(report.env, report.member), note);
447
- } catch (err) {
448
- warn(`could not post the note on #${report.pr}: ${messageOf(err)}`);
449
- }
450
- };
451
- }
452
-
453
- /**
454
- * The ports over chant/lifecycle in `cwd` (default the working directory):
455
- * the records at `_pr-envs/records.jsonl`, appended and pushed, and the gate
456
- * ledger read without writing a pending fact. With `forge`, the note and
457
- * status are posted and the sweep asks it whether a pull request is open.
458
- */
459
- export function lifecyclePrEnvPorts(opts: { cwd?: string; forge?: PrForge; log?: (line: string) => void; warn?: (message: string) => void } = {}): PrEnvPorts {
460
- const at = opts.cwd ? { cwd: opts.cwd } : undefined;
461
- const warn = opts.warn ?? (() => {});
462
- const forge = opts.forge;
463
- return {
464
- async readRecords() {
465
- const { fetchLifecycle, readBlobFromPath } = await import("../lifecycle/git");
466
- await fetchLifecycle(at).catch(() => false);
467
- return parsePrEnvRecords(await readBlobFromPath(PR_ENV_LEDGER_DIR, PR_ENV_LEDGER_FILE, at));
468
- },
469
- async appendRecord(record) {
470
- const { appendLedgerLine, fetchLifecycle, pushLifecycleReport } = await import("../lifecycle/git");
471
- try {
472
- await fetchLifecycle(at).catch(() => false);
473
- await appendLedgerLine(PR_ENV_LEDGER_DIR, PR_ENV_LEDGER_FILE, JSON.stringify(record), `Pull request environment ${record.env} ${record.kind} (${record.result})`, at);
474
- const pushed = await pushLifecycleReport(at);
475
- if (pushed.pushWarning) warn(pushed.pushWarning);
476
- } catch (err) {
477
- warn(`could not record ${record.env}'s ${record.kind} on chant/lifecycle: ${messageOf(err)}`);
478
- }
479
- },
480
- async decideGate(input) {
481
- const { approvalOf, decidePrGate, readOnlyLedger } = await import("./pr-run");
482
- const { gitGateLedgerPort } = await import("../op/gate");
483
- const approval = approvalOf(await decidePrGate(readOnlyLedger(gitGateLedgerPort(at)), input));
484
- return { status: approval.status, ...(approval.approvedBy ? { approvedBy: approval.approvedBy } : {}) };
485
- },
486
- ...(forge ? { publish: forgePrEnvPublisher(forge, warn) } : {}),
487
- ...(forge?.pullRequestState ? { pullRequestState: (pr: number) => forge.pullRequestState!(pr) } : {}),
488
- ...(opts.log ? { log: opts.log } : {}),
489
- warn,
490
- };
491
- }
492
-
493
422
  // ── a teardown command ─────────────────────────────────────────────────────
494
423
 
495
424
  /** `ci.prEnvironment.teardown` (#4330): a command that tears down what no lexicon does. */
@@ -39,7 +39,8 @@
39
39
  * as a lexicon does.
40
40
  */
41
41
 
42
- import { environmentEndpoint, environmentName, isEnvironmentPattern, isOwnershipParamRef, matchesDeclaredEnvironment, resolveOwnershipStack, type ChantConfig, type EnvironmentDeclaration } from "../config";
42
+ import type { ChantConfig } from "../config";
43
+ import { environmentEndpoint, environmentName, isEnvironmentPattern, isOwnershipParamRef, matchesDeclaredEnvironment, resolveOwnershipStack, type EnvironmentDeclaration } from "../config-environments";
43
44
  import type { OwnershipMarker } from "../ownership";
44
45
  import { executeTeardown, planTeardown, type TeardownPlan, type TeardownPlanEntry, type TeardownReport } from "../lifecycle/teardown";
45
46
  import type { ObservationLexicon, TeardownCandidate, TeardownEnumeration, TeardownExecution } from "../lexicon";