@intentius/chant 0.124.27 → 0.124.29

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 (681) hide show
  1. package/README.md +1 -1
  2. package/dist/__golden__/wave-loop/fan-out-gated.json +8 -0
  3. package/dist/__golden__/wave-loop/fan-out-no-members.json +4 -0
  4. package/dist/__golden__/wave-loop/fan-out-only.json +6 -0
  5. package/dist/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  6. package/dist/__golden__/wave-loop/op-cost-member.json +3 -0
  7. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  8. package/dist/__golden__/wave-loop/op-held-on.json +2 -0
  9. package/dist/__golden__/wave-loop/op-hooks-held.json +2 -0
  10. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  11. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  12. package/dist/__golden__/wave-loop/op-hooks-share.json +3 -0
  13. package/dist/__golden__/wave-loop/op-per-run.json +7 -0
  14. package/dist/__golden__/wave-loop/op-pr-review.json +7 -0
  15. package/dist/__golden__/wave-loop/op-sealed.json +3 -0
  16. package/dist/__golden__/wave-loop/op-spend.json +3 -0
  17. package/dist/__golden__/wave-loop/op-wave-commands.json +7 -0
  18. package/dist/__golden__/wave-loop/op-wide-waiting.json +4 -0
  19. package/dist/build-params.d.ts +34 -1
  20. package/dist/build-params.d.ts.map +1 -1
  21. package/dist/build-params.js +31 -1
  22. package/dist/change-set-graph.d.ts +63 -0
  23. package/dist/change-set-graph.d.ts.map +1 -0
  24. package/dist/change-set-graph.js +130 -0
  25. package/dist/change-set.d.ts +62 -3
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +36 -4
  28. package/dist/chant-version.d.ts +9 -0
  29. package/dist/chant-version.d.ts.map +1 -0
  30. package/dist/chant-version.js +16 -0
  31. package/dist/cli/build-params-cli.d.ts +7 -1
  32. package/dist/cli/build-params-cli.d.ts.map +1 -1
  33. package/dist/cli/build-params-cli.js +17 -8
  34. package/dist/cli/commands/build.d.ts +8 -0
  35. package/dist/cli/commands/build.d.ts.map +1 -1
  36. package/dist/cli/commands/build.js +15 -11
  37. package/dist/cli/commands/check-lexicon-docs.d.ts.map +1 -1
  38. package/dist/cli/commands/check-lexicon-docs.js +30 -2
  39. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  40. package/dist/cli/commands/check-lexicon.js +13 -2
  41. package/dist/cli/commands/init-lexicon/templates/docs.d.ts +4 -1
  42. package/dist/cli/commands/init-lexicon/templates/docs.d.ts.map +1 -1
  43. package/dist/cli/commands/init-lexicon/templates/docs.js +6 -6
  44. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  45. package/dist/cli/commands/init-lexicon.js +17 -8
  46. package/dist/cli/handlers/approve.d.ts.map +1 -1
  47. package/dist/cli/handlers/approve.js +64 -4
  48. package/dist/cli/handlers/build.d.ts.map +1 -1
  49. package/dist/cli/handlers/build.js +43 -4
  50. package/dist/cli/handlers/change-set.d.ts +10 -0
  51. package/dist/cli/handlers/change-set.d.ts.map +1 -1
  52. package/dist/cli/handlers/change-set.js +51 -1
  53. package/dist/cli/handlers/fan-out.d.ts +10 -1
  54. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  55. package/dist/cli/handlers/fan-out.js +54 -6
  56. package/dist/cli/handlers/lifecycle-gc.d.ts +19 -0
  57. package/dist/cli/handlers/lifecycle-gc.d.ts.map +1 -0
  58. package/dist/cli/handlers/lifecycle-gc.js +143 -0
  59. package/dist/cli/handlers/pr.d.ts +16 -2
  60. package/dist/cli/handlers/pr.d.ts.map +1 -1
  61. package/dist/cli/handlers/pr.js +269 -37
  62. package/dist/cli/handlers/promote.d.ts +7 -0
  63. package/dist/cli/handlers/promote.d.ts.map +1 -1
  64. package/dist/cli/handlers/promote.js +440 -28
  65. package/dist/cli/handlers/release.d.ts +91 -0
  66. package/dist/cli/handlers/release.d.ts.map +1 -0
  67. package/dist/cli/handlers/release.js +589 -0
  68. package/dist/cli/handlers/run.d.ts +38 -2
  69. package/dist/cli/handlers/run.d.ts.map +1 -1
  70. package/dist/cli/handlers/run.js +234 -16
  71. package/dist/cli/main.d.ts.map +1 -1
  72. package/dist/cli/main.js +143 -17
  73. package/dist/cli/mcp/workspace-tools.js +1 -1
  74. package/dist/cli/parse-args.d.ts.map +1 -1
  75. package/dist/cli/parse-args.js +73 -5
  76. package/dist/cli/registry.d.ts +43 -5
  77. package/dist/cli/registry.d.ts.map +1 -1
  78. package/dist/cli/run-events.d.ts +30 -0
  79. package/dist/cli/run-events.d.ts.map +1 -0
  80. package/dist/cli/run-events.js +49 -0
  81. package/dist/cli/version.d.ts +3 -5
  82. package/dist/cli/version.d.ts.map +1 -1
  83. package/dist/cli/version.js +3 -13
  84. package/dist/codegen/docs-in-site.d.ts +71 -0
  85. package/dist/codegen/docs-in-site.d.ts.map +1 -0
  86. package/dist/codegen/docs-in-site.js +177 -0
  87. package/dist/codegen/docs-types.d.ts +14 -1
  88. package/dist/codegen/docs-types.d.ts.map +1 -1
  89. package/dist/codegen/docs.d.ts +18 -1
  90. package/dist/codegen/docs.d.ts.map +1 -1
  91. package/dist/codegen/docs.js +40 -7
  92. package/dist/codegen/rehype-base-url.mjs +15 -9
  93. package/dist/components/auto-release.d.ts +6 -1
  94. package/dist/components/auto-release.d.ts.map +1 -1
  95. package/dist/components/auto-release.js +3 -0
  96. package/dist/components/capability.d.ts +9 -0
  97. package/dist/components/capability.d.ts.map +1 -1
  98. package/dist/components/cli-support.d.ts +6 -0
  99. package/dist/components/cli-support.d.ts.map +1 -1
  100. package/dist/components/cli-support.js +10 -9
  101. package/dist/components/driver.d.ts +50 -9
  102. package/dist/components/driver.d.ts.map +1 -1
  103. package/dist/components/driver.js +116 -54
  104. package/dist/components/fan-out-inputs.d.ts +69 -0
  105. package/dist/components/fan-out-inputs.d.ts.map +1 -0
  106. package/dist/components/fan-out-inputs.js +169 -0
  107. package/dist/components/fan-out-record.d.ts +13 -0
  108. package/dist/components/fan-out-record.d.ts.map +1 -1
  109. package/dist/components/fan-out-record.js +16 -0
  110. package/dist/components/fan-out-run.d.ts +7 -0
  111. package/dist/components/fan-out-run.d.ts.map +1 -1
  112. package/dist/components/fan-out-run.js +85 -26
  113. package/dist/components/fan-out.d.ts +4 -0
  114. package/dist/components/fan-out.d.ts.map +1 -1
  115. package/dist/components/pr-pipeline.d.ts +25 -0
  116. package/dist/components/pr-pipeline.d.ts.map +1 -1
  117. package/dist/components/pr-pipeline.js +22 -4
  118. package/dist/components/pr-run.d.ts +11 -0
  119. package/dist/components/pr-run.d.ts.map +1 -1
  120. package/dist/components/pr-run.js +20 -1
  121. package/dist/components/promote-order.d.ts +38 -0
  122. package/dist/components/promote-order.d.ts.map +1 -0
  123. package/dist/components/promote-order.js +62 -0
  124. package/dist/components/promote.d.ts +38 -2
  125. package/dist/components/promote.d.ts.map +1 -1
  126. package/dist/components/promote.js +77 -2
  127. package/dist/components/release-compile.d.ts +142 -0
  128. package/dist/components/release-compile.d.ts.map +1 -0
  129. package/dist/components/release-compile.js +382 -0
  130. package/dist/components/release-gate.d.ts +135 -0
  131. package/dist/components/release-gate.d.ts.map +1 -0
  132. package/dist/components/release-gate.js +288 -0
  133. package/dist/components/release-promote.d.ts +96 -0
  134. package/dist/components/release-promote.d.ts.map +1 -0
  135. package/dist/components/release-promote.js +204 -0
  136. package/dist/components/run-progress.d.ts +7 -0
  137. package/dist/components/run-progress.d.ts.map +1 -1
  138. package/dist/components/wave-plan.d.ts +8 -1
  139. package/dist/components/wave-plan.d.ts.map +1 -1
  140. package/dist/components/wave-plan.js +11 -3
  141. package/dist/config.d.ts +45 -0
  142. package/dist/config.d.ts.map +1 -1
  143. package/dist/config.js +3 -0
  144. package/dist/flag-params.d.ts +54 -0
  145. package/dist/flag-params.d.ts.map +1 -0
  146. package/dist/flag-params.js +130 -0
  147. package/dist/index.d.ts +1 -0
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +2 -0
  150. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts +120 -0
  151. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -0
  152. package/dist/lifecycle/__fixtures__/publish-fakes.js +304 -0
  153. package/dist/lifecycle/change-set-store.d.ts +68 -0
  154. package/dist/lifecycle/change-set-store.d.ts.map +1 -0
  155. package/dist/lifecycle/change-set-store.js +97 -0
  156. package/dist/lifecycle/commit-sha.d.ts +13 -0
  157. package/dist/lifecycle/commit-sha.d.ts.map +1 -0
  158. package/dist/lifecycle/commit-sha.js +21 -0
  159. package/dist/lifecycle/delivery-metrics.d.ts +139 -0
  160. package/dist/lifecycle/delivery-metrics.d.ts.map +1 -0
  161. package/dist/lifecycle/delivery-metrics.js +145 -0
  162. package/dist/lifecycle/deploy-outcome.d.ts +81 -0
  163. package/dist/lifecycle/deploy-outcome.d.ts.map +1 -0
  164. package/dist/lifecycle/deploy-outcome.js +101 -0
  165. package/dist/lifecycle/gate-change-set.d.ts +78 -0
  166. package/dist/lifecycle/gate-change-set.d.ts.map +1 -0
  167. package/dist/lifecycle/gate-change-set.js +138 -0
  168. package/dist/lifecycle/gate-ledger.d.ts +51 -4
  169. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  170. package/dist/lifecycle/gate-ledger.js +18 -0
  171. package/dist/lifecycle/git.d.ts +30 -1
  172. package/dist/lifecycle/git.d.ts.map +1 -1
  173. package/dist/lifecycle/git.js +31 -5
  174. package/dist/lifecycle/index.d.ts +4 -0
  175. package/dist/lifecycle/index.d.ts.map +1 -1
  176. package/dist/lifecycle/index.js +4 -0
  177. package/dist/lifecycle/mixed-environment.d.ts +95 -0
  178. package/dist/lifecycle/mixed-environment.d.ts.map +1 -0
  179. package/dist/lifecycle/mixed-environment.js +154 -0
  180. package/dist/lifecycle/publish-attachments.d.ts +79 -0
  181. package/dist/lifecycle/publish-attachments.d.ts.map +1 -0
  182. package/dist/lifecycle/publish-attachments.js +179 -0
  183. package/dist/lifecycle/publish-credentials.d.ts +37 -0
  184. package/dist/lifecycle/publish-credentials.d.ts.map +1 -0
  185. package/dist/lifecycle/publish-credentials.js +69 -0
  186. package/dist/lifecycle/publish-declaration.d.ts +97 -0
  187. package/dist/lifecycle/publish-declaration.d.ts.map +1 -0
  188. package/dist/lifecycle/publish-declaration.js +83 -0
  189. package/dist/lifecycle/publish-forge.d.ts +53 -0
  190. package/dist/lifecycle/publish-forge.d.ts.map +1 -0
  191. package/dist/lifecycle/publish-forge.js +298 -0
  192. package/dist/lifecycle/publish-npm.d.ts +61 -0
  193. package/dist/lifecycle/publish-npm.d.ts.map +1 -0
  194. package/dist/lifecycle/publish-npm.js +242 -0
  195. package/dist/lifecycle/publish-oci.d.ts +64 -0
  196. package/dist/lifecycle/publish-oci.d.ts.map +1 -0
  197. package/dist/lifecycle/publish-oci.js +383 -0
  198. package/dist/lifecycle/publish-record.d.ts +66 -0
  199. package/dist/lifecycle/publish-record.d.ts.map +1 -0
  200. package/dist/lifecycle/publish-record.js +84 -0
  201. package/dist/lifecycle/publish-targets.d.ts +45 -0
  202. package/dist/lifecycle/publish-targets.d.ts.map +1 -0
  203. package/dist/lifecycle/publish-targets.js +85 -0
  204. package/dist/lifecycle/release-cut.d.ts +154 -0
  205. package/dist/lifecycle/release-cut.d.ts.map +1 -0
  206. package/dist/lifecycle/release-cut.js +366 -0
  207. package/dist/lifecycle/release-join.d.ts +95 -0
  208. package/dist/lifecycle/release-join.d.ts.map +1 -0
  209. package/dist/lifecycle/release-join.js +139 -0
  210. package/dist/lifecycle/release-ledger.d.ts +54 -0
  211. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  212. package/dist/lifecycle/release-ledger.js +53 -20
  213. package/dist/lifecycle/release-publish.d.ts +312 -0
  214. package/dist/lifecycle/release-publish.d.ts.map +1 -0
  215. package/dist/lifecycle/release-publish.js +335 -0
  216. package/dist/lifecycle/release-revocation.d.ts +80 -0
  217. package/dist/lifecycle/release-revocation.d.ts.map +1 -0
  218. package/dist/lifecycle/release-revocation.js +123 -0
  219. package/dist/lifecycle/release-store.d.ts +200 -0
  220. package/dist/lifecycle/release-store.d.ts.map +1 -0
  221. package/dist/lifecycle/release-store.js +320 -0
  222. package/dist/lifecycle/release-verify.d.ts +61 -0
  223. package/dist/lifecycle/release-verify.d.ts.map +1 -0
  224. package/dist/lifecycle/release-verify.js +92 -0
  225. package/dist/lifecycle/release-workstation.d.ts +91 -0
  226. package/dist/lifecycle/release-workstation.d.ts.map +1 -0
  227. package/dist/lifecycle/release-workstation.js +180 -0
  228. package/dist/lifecycle/retention-policy.d.ts +45 -0
  229. package/dist/lifecycle/retention-policy.d.ts.map +1 -0
  230. package/dist/lifecycle/retention-policy.js +43 -0
  231. package/dist/lifecycle/retention.d.ts +185 -0
  232. package/dist/lifecycle/retention.d.ts.map +1 -0
  233. package/dist/lifecycle/retention.js +400 -0
  234. package/dist/lifecycle/run-ledger.d.ts +4 -0
  235. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  236. package/dist/lifecycle/run-ledger.js +2 -0
  237. package/dist/op/activities/change-coverage.d.ts.map +1 -1
  238. package/dist/op/activities/change-coverage.js +4 -2
  239. package/dist/op/activities/source-release.d.ts.map +1 -1
  240. package/dist/op/activities/source-release.js +7 -3
  241. package/dist/op/activities/source-rollback.d.ts.map +1 -1
  242. package/dist/op/activities/source-rollback.js +7 -3
  243. package/dist/op/gate-name.d.ts +11 -2
  244. package/dist/op/gate-name.d.ts.map +1 -1
  245. package/dist/op/gate-name.js +12 -3
  246. package/dist/op/gate-run-locator.d.ts +22 -0
  247. package/dist/op/gate-run-locator.d.ts.map +1 -1
  248. package/dist/op/gate-run-locator.js +31 -0
  249. package/dist/op/gate.d.ts +27 -3
  250. package/dist/op/gate.d.ts.map +1 -1
  251. package/dist/op/gate.js +57 -3
  252. package/dist/op/local-executor.d.ts +36 -1
  253. package/dist/op/local-executor.d.ts.map +1 -1
  254. package/dist/op/local-executor.js +158 -52
  255. package/dist/op/op-waves-run.d.ts.map +1 -1
  256. package/dist/op/op-waves-run.js +4 -0
  257. package/dist/op/run-live.d.ts +2 -0
  258. package/dist/op/run-live.d.ts.map +1 -1
  259. package/dist/op/run-live.js +1 -1
  260. package/dist/op/runtime.d.ts +46 -0
  261. package/dist/op/runtime.d.ts.map +1 -1
  262. package/dist/op/runtimes/local.d.ts.map +1 -1
  263. package/dist/op/runtimes/local.js +8 -0
  264. package/dist/plan-summary.d.ts.map +1 -1
  265. package/dist/plan-summary.js +8 -2
  266. package/dist/point-decision.d.ts +2 -0
  267. package/dist/point-decision.d.ts.map +1 -1
  268. package/dist/point-decision.js +9 -2
  269. package/dist/pr-loop.d.ts +7 -0
  270. package/dist/pr-loop.d.ts.map +1 -1
  271. package/dist/pr-loop.js +23 -4
  272. package/dist/pr-report-url.d.ts +82 -0
  273. package/dist/pr-report-url.d.ts.map +1 -0
  274. package/dist/pr-report-url.js +174 -0
  275. package/dist/provenance.d.ts +2 -2
  276. package/dist/provenance.d.ts.map +1 -1
  277. package/dist/run-event-store.d.ts +104 -0
  278. package/dist/run-event-store.d.ts.map +1 -0
  279. package/dist/run-event-store.js +251 -0
  280. package/dist/run-event-stream.d.ts +133 -0
  281. package/dist/run-event-stream.d.ts.map +1 -0
  282. package/dist/run-event-stream.js +242 -0
  283. package/dist/run-event.d.ts +285 -0
  284. package/dist/run-event.d.ts.map +1 -0
  285. package/dist/run-event.js +209 -0
  286. package/dist/wave-runtime.mjs +262 -226
  287. package/dist/workspace/__fixtures__/flag-workspace.d.ts +31 -0
  288. package/dist/workspace/__fixtures__/flag-workspace.d.ts.map +1 -0
  289. package/dist/workspace/__fixtures__/flag-workspace.js +114 -0
  290. package/dist/workspace/__fixtures__/run-event-check.d.ts +19 -0
  291. package/dist/workspace/__fixtures__/run-event-check.d.ts.map +1 -0
  292. package/dist/workspace/__fixtures__/run-event-check.js +59 -0
  293. package/dist/workspace/change-set-show.d.ts +56 -0
  294. package/dist/workspace/change-set-show.d.ts.map +1 -0
  295. package/dist/workspace/change-set-show.js +54 -0
  296. package/dist/workspace/change-set-show.schema.json +102 -0
  297. package/dist/workspace/change-set.schema.json +32 -1
  298. package/dist/workspace/changes-cli.d.ts.map +1 -1
  299. package/dist/workspace/changes-cli.js +10 -1
  300. package/dist/workspace/changes.d.ts +37 -0
  301. package/dist/workspace/changes.d.ts.map +1 -1
  302. package/dist/workspace/changes.js +49 -2
  303. package/dist/workspace/changes.schema.json +135 -0
  304. package/dist/workspace/check.schema.json +4 -2
  305. package/dist/workspace/checks/records.d.ts +9 -1
  306. package/dist/workspace/checks/records.d.ts.map +1 -1
  307. package/dist/workspace/checks/records.js +35 -1
  308. package/dist/workspace/checks.d.ts +1 -0
  309. package/dist/workspace/checks.d.ts.map +1 -1
  310. package/dist/workspace/checks.js +2 -1
  311. package/dist/workspace/ci-green-cli.d.ts +19 -4
  312. package/dist/workspace/ci-green-cli.d.ts.map +1 -1
  313. package/dist/workspace/ci-green-cli.js +75 -12
  314. package/dist/workspace/ci-green-forge.d.ts +20 -3
  315. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  316. package/dist/workspace/ci-green-forge.js +6 -4
  317. package/dist/workspace/ci-green-workflow.d.ts +11 -0
  318. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  319. package/dist/workspace/ci-green-workflow.js +6 -0
  320. package/dist/workspace/ci-green.d.ts +281 -13
  321. package/dist/workspace/ci-green.d.ts.map +1 -1
  322. package/dist/workspace/ci-green.js +456 -38
  323. package/dist/workspace/ci-last-green.schema.json +32 -2
  324. package/dist/workspace/ci-list.schema.json +525 -0
  325. package/dist/workspace/commit-links.d.ts +85 -0
  326. package/dist/workspace/commit-links.d.ts.map +1 -0
  327. package/dist/workspace/commit-links.js +163 -0
  328. package/dist/workspace/declaration.d.ts +35 -0
  329. package/dist/workspace/declaration.d.ts.map +1 -1
  330. package/dist/workspace/declaration.js +27 -1
  331. package/dist/workspace/declaration.schema.json +76 -0
  332. package/dist/workspace/declared-kinds.d.ts +16 -0
  333. package/dist/workspace/declared-kinds.d.ts.map +1 -1
  334. package/dist/workspace/declared-kinds.js +25 -0
  335. package/dist/workspace/delivery-metrics.d.ts +91 -0
  336. package/dist/workspace/delivery-metrics.d.ts.map +1 -0
  337. package/dist/workspace/delivery-metrics.js +217 -0
  338. package/dist/workspace/delivery-metrics.schema.json +519 -0
  339. package/dist/workspace/flags-read.d.ts +37 -0
  340. package/dist/workspace/flags-read.d.ts.map +1 -0
  341. package/dist/workspace/flags-read.js +103 -0
  342. package/dist/workspace/flags.d.ts +100 -0
  343. package/dist/workspace/flags.d.ts.map +1 -0
  344. package/dist/workspace/flags.js +98 -0
  345. package/dist/workspace/graph-cli.js +1 -1
  346. package/dist/workspace/identity-gate-rule.d.ts +37 -0
  347. package/dist/workspace/identity-gate-rule.d.ts.map +1 -1
  348. package/dist/workspace/identity-gate-rule.js +72 -7
  349. package/dist/workspace/identity.d.ts +12 -0
  350. package/dist/workspace/identity.d.ts.map +1 -1
  351. package/dist/workspace/identity.js +13 -1
  352. package/dist/workspace/intent-cli.d.ts +11 -2
  353. package/dist/workspace/intent-cli.d.ts.map +1 -1
  354. package/dist/workspace/intent-cli.js +54 -5
  355. package/dist/workspace/intent-trace.d.ts +219 -0
  356. package/dist/workspace/intent-trace.d.ts.map +1 -0
  357. package/dist/workspace/intent-trace.js +314 -0
  358. package/dist/workspace/intent.d.ts +36 -7
  359. package/dist/workspace/intent.d.ts.map +1 -1
  360. package/dist/workspace/intent.js +192 -22
  361. package/dist/workspace/intent.schema.json +702 -6
  362. package/dist/workspace/ls.d.ts +4 -0
  363. package/dist/workspace/ls.d.ts.map +1 -1
  364. package/dist/workspace/ls.js +2 -0
  365. package/dist/workspace/ls.schema.json +3 -1
  366. package/dist/workspace/member-pipeline.d.ts +6 -0
  367. package/dist/workspace/member-pipeline.d.ts.map +1 -1
  368. package/dist/workspace/member-pipeline.js +6 -0
  369. package/dist/workspace/overlap.d.ts +146 -0
  370. package/dist/workspace/overlap.d.ts.map +1 -0
  371. package/dist/workspace/overlap.js +276 -0
  372. package/dist/workspace/promotion-order.d.ts +41 -0
  373. package/dist/workspace/promotion-order.d.ts.map +1 -0
  374. package/dist/workspace/promotion-order.js +95 -0
  375. package/dist/workspace/reason-codes.d.ts +4 -0
  376. package/dist/workspace/reason-codes.d.ts.map +1 -1
  377. package/dist/workspace/reason-codes.js +7 -1
  378. package/dist/workspace/records.d.ts +15 -2
  379. package/dist/workspace/records.d.ts.map +1 -1
  380. package/dist/workspace/records.js +32 -0
  381. package/dist/workspace/records.schema.json +21 -2
  382. package/dist/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  383. package/dist/workspace/reference-kinds/flag/flag.schema.json +53 -0
  384. package/dist/workspace/releases.d.ts +81 -0
  385. package/dist/workspace/releases.d.ts.map +1 -0
  386. package/dist/workspace/releases.js +103 -0
  387. package/dist/workspace/releases.schema.json +513 -0
  388. package/dist/workspace/run-event.schema.json +295 -0
  389. package/dist/workspace/status-gates.d.ts +34 -1
  390. package/dist/workspace/status-gates.d.ts.map +1 -1
  391. package/dist/workspace/status-gates.js +31 -2
  392. package/dist/workspace/status-stewards.d.ts +4 -0
  393. package/dist/workspace/status-stewards.d.ts.map +1 -1
  394. package/dist/workspace/status-stewards.js +2 -0
  395. package/dist/workspace/status.d.ts +117 -0
  396. package/dist/workspace/status.d.ts.map +1 -1
  397. package/dist/workspace/status.js +218 -4
  398. package/dist/workspace/status.schema.json +268 -2
  399. package/dist/workspace/trust/ci-tag-statement.d.ts +102 -0
  400. package/dist/workspace/trust/ci-tag-statement.d.ts.map +1 -0
  401. package/dist/workspace/trust/ci-tag-statement.js +123 -0
  402. package/dist/workspace/trust/op-run-statement.d.ts +91 -0
  403. package/dist/workspace/trust/op-run-statement.d.ts.map +1 -0
  404. package/dist/workspace/trust/op-run-statement.js +143 -0
  405. package/dist/workspace/trust/rotation.d.ts +18 -2
  406. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  407. package/dist/workspace/trust/rotation.js +65 -16
  408. package/dist/workspace/trust/seal.d.ts +11 -0
  409. package/dist/workspace/trust/seal.d.ts.map +1 -1
  410. package/dist/workspace/trust/seal.js +9 -0
  411. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
  412. package/dist/workspace/trust/ssh-commit.js +10 -10
  413. package/dist/workspace/wip.d.ts.map +1 -1
  414. package/dist/workspace/wip.js +11 -3
  415. package/package.json +1 -1
  416. package/src/__golden__/wave-loop/fan-out-gated.json +8 -0
  417. package/src/__golden__/wave-loop/fan-out-no-members.json +4 -0
  418. package/src/__golden__/wave-loop/fan-out-only.json +6 -0
  419. package/src/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  420. package/src/__golden__/wave-loop/op-cost-member.json +3 -0
  421. package/src/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  422. package/src/__golden__/wave-loop/op-held-on.json +2 -0
  423. package/src/__golden__/wave-loop/op-hooks-held.json +2 -0
  424. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  425. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  426. package/src/__golden__/wave-loop/op-hooks-share.json +3 -0
  427. package/src/__golden__/wave-loop/op-per-run.json +7 -0
  428. package/src/__golden__/wave-loop/op-pr-review.json +7 -0
  429. package/src/__golden__/wave-loop/op-sealed.json +3 -0
  430. package/src/__golden__/wave-loop/op-spend.json +3 -0
  431. package/src/__golden__/wave-loop/op-wave-commands.json +7 -0
  432. package/src/__golden__/wave-loop/op-wide-waiting.json +4 -0
  433. package/src/build-params.test.ts +46 -0
  434. package/src/build-params.ts +55 -1
  435. package/src/change-set-graph.test.ts +72 -0
  436. package/src/change-set-graph.ts +141 -0
  437. package/src/change-set.ts +87 -6
  438. package/src/chant-version.ts +16 -0
  439. package/src/cli/build-params-cli.ts +22 -9
  440. package/src/cli/commands/build.ts +25 -11
  441. package/src/cli/commands/check-lexicon-docs.test.ts +51 -0
  442. package/src/cli/commands/check-lexicon-docs.ts +39 -2
  443. package/src/cli/commands/check-lexicon.ts +14 -2
  444. package/src/cli/commands/init-lexicon/templates/docs.ts +7 -6
  445. package/src/cli/commands/init-lexicon.test.ts +25 -0
  446. package/src/cli/commands/init-lexicon.ts +18 -8
  447. package/src/cli/handlers/approve-release.test.ts +84 -0
  448. package/src/cli/handlers/approve-revoked.test.ts +155 -0
  449. package/src/cli/handlers/approve.ts +65 -2
  450. package/src/cli/handlers/build.test.ts +67 -0
  451. package/src/cli/handlers/build.ts +46 -4
  452. package/src/cli/handlers/change-set.ts +49 -1
  453. package/src/cli/handlers/fan-out.test.ts +228 -1
  454. package/src/cli/handlers/fan-out.ts +53 -6
  455. package/src/cli/handlers/intent-trace.e2e.test.ts +201 -0
  456. package/src/cli/handlers/lifecycle-gc.test.ts +126 -0
  457. package/src/cli/handlers/lifecycle-gc.ts +146 -0
  458. package/src/cli/handlers/operator.test.ts +37 -0
  459. package/src/cli/handlers/pr.test.ts +341 -0
  460. package/src/cli/handlers/pr.ts +292 -47
  461. package/src/cli/handlers/promote.test.ts +669 -7
  462. package/src/cli/handlers/promote.ts +464 -29
  463. package/src/cli/handlers/release-implicit.e2e.test.ts +161 -0
  464. package/src/cli/handlers/release-join.e2e.test.ts +185 -0
  465. package/src/cli/handlers/release-publish-targets.e2e.test.ts +295 -0
  466. package/src/cli/handlers/release-verify.e2e.test.ts +117 -0
  467. package/src/cli/handlers/release-workstation-ci.e2e.test.ts +135 -0
  468. package/src/cli/handlers/release.e2e.test.ts +199 -0
  469. package/src/cli/handlers/release.ts +593 -0
  470. package/src/cli/handlers/run-auto-release.test.ts +80 -0
  471. package/src/cli/handlers/run-events-cmd.test.ts +92 -0
  472. package/src/cli/handlers/run-release.test.ts +55 -0
  473. package/src/cli/handlers/run.test.ts +30 -0
  474. package/src/cli/handlers/run.ts +243 -18
  475. package/src/cli/main.test.ts +8 -0
  476. package/src/cli/main.ts +143 -17
  477. package/src/cli/mcp/never-over-mcp.test.ts +2 -0
  478. package/src/cli/mcp/workspace-tools.ts +1 -1
  479. package/src/cli/parse-args.ts +56 -5
  480. package/src/cli/registry.ts +43 -5
  481. package/src/cli/run-events.ts +57 -0
  482. package/src/cli/version.ts +3 -13
  483. package/src/codegen/docs-in-site.test.ts +166 -0
  484. package/src/codegen/docs-in-site.ts +182 -0
  485. package/src/codegen/docs-site/AgentPrompt.astro +26 -1
  486. package/src/codegen/docs-types.ts +14 -1
  487. package/src/codegen/docs.ts +60 -7
  488. package/src/codegen/rehype-base-url.d.mts +3 -1
  489. package/src/codegen/rehype-base-url.mjs +15 -9
  490. package/src/codegen/rehype-base-url.test.ts +34 -0
  491. package/src/components/auto-release.test.ts +30 -0
  492. package/src/components/auto-release.ts +9 -1
  493. package/src/components/capability.ts +9 -0
  494. package/src/components/cli-support.test.ts +82 -0
  495. package/src/components/cli-support.ts +16 -9
  496. package/src/components/driver.test.ts +24 -0
  497. package/src/components/driver.ts +165 -56
  498. package/src/components/fan-out-inputs.test.ts +85 -0
  499. package/src/components/fan-out-inputs.ts +192 -0
  500. package/src/components/fan-out-record.test.ts +10 -0
  501. package/src/components/fan-out-record.ts +19 -0
  502. package/src/components/fan-out-run.ts +104 -35
  503. package/src/components/fan-out.ts +4 -0
  504. package/src/components/pr-pipeline.ts +35 -4
  505. package/src/components/pr-run.ts +30 -1
  506. package/src/components/promote-order.test.ts +90 -0
  507. package/src/components/promote-order.ts +75 -0
  508. package/src/components/promote.test.ts +10 -1
  509. package/src/components/promote.ts +94 -3
  510. package/src/components/release-compile.test.ts +147 -0
  511. package/src/components/release-compile.ts +459 -0
  512. package/src/components/release-gate.test.ts +215 -0
  513. package/src/components/release-gate.ts +355 -0
  514. package/src/components/release-promote.test.ts +159 -0
  515. package/src/components/release-promote.ts +232 -0
  516. package/src/components/run-progress.ts +7 -0
  517. package/src/components/wave-plan.ts +16 -3
  518. package/src/config.ts +15 -1
  519. package/src/flag-params.test.ts +144 -0
  520. package/src/flag-params.ts +134 -0
  521. package/src/index.ts +2 -0
  522. package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
  523. package/src/lifecycle/change-set-store.test.ts +217 -0
  524. package/src/lifecycle/change-set-store.ts +113 -0
  525. package/src/lifecycle/commit-sha.ts +23 -0
  526. package/src/lifecycle/delivery-metrics.ts +263 -0
  527. package/src/lifecycle/deploy-outcome.ts +147 -0
  528. package/src/lifecycle/gate-change-set.e2e.test.ts +122 -0
  529. package/src/lifecycle/gate-change-set.ts +164 -0
  530. package/src/lifecycle/gate-ledger.test.ts +33 -0
  531. package/src/lifecycle/gate-ledger.ts +68 -3
  532. package/src/lifecycle/git.ts +61 -8
  533. package/src/lifecycle/index.ts +4 -0
  534. package/src/lifecycle/mixed-environment.test.ts +97 -0
  535. package/src/lifecycle/mixed-environment.ts +204 -0
  536. package/src/lifecycle/publish-attachments.ts +196 -0
  537. package/src/lifecycle/publish-credentials.ts +84 -0
  538. package/src/lifecycle/publish-declaration.ts +95 -0
  539. package/src/lifecycle/publish-forge.ts +325 -0
  540. package/src/lifecycle/publish-npm.ts +259 -0
  541. package/src/lifecycle/publish-oci.ts +396 -0
  542. package/src/lifecycle/publish-record.ts +113 -0
  543. package/src/lifecycle/publish-resume.test.ts +168 -0
  544. package/src/lifecycle/publish-targets.test.ts +494 -0
  545. package/src/lifecycle/publish-targets.ts +100 -0
  546. package/src/lifecycle/release-cut-signed.test.ts +180 -0
  547. package/src/lifecycle/release-cut.test.ts +483 -0
  548. package/src/lifecycle/release-cut.ts +503 -0
  549. package/src/lifecycle/release-flag.test.ts +112 -0
  550. package/src/lifecycle/release-join.test.ts +68 -0
  551. package/src/lifecycle/release-join.ts +182 -0
  552. package/src/lifecycle/release-ledger.test.ts +14 -0
  553. package/src/lifecycle/release-ledger.ts +85 -17
  554. package/src/lifecycle/release-publish.test.ts +225 -0
  555. package/src/lifecycle/release-publish.ts +568 -0
  556. package/src/lifecycle/release-revocation.ts +147 -0
  557. package/src/lifecycle/release-store.ts +434 -0
  558. package/src/lifecycle/release-verify.test.ts +110 -0
  559. package/src/lifecycle/release-verify.ts +120 -0
  560. package/src/lifecycle/release-workstation.test.ts +204 -0
  561. package/src/lifecycle/release-workstation.ts +216 -0
  562. package/src/lifecycle/retention-growth.e2e.test.ts +279 -0
  563. package/src/lifecycle/retention-policy.ts +63 -0
  564. package/src/lifecycle/retention.test.ts +363 -0
  565. package/src/lifecycle/retention.ts +508 -0
  566. package/src/lifecycle/run-ledger.test.ts +10 -0
  567. package/src/lifecycle/run-ledger.ts +6 -0
  568. package/src/op/activities/change-coverage.ts +4 -1
  569. package/src/op/activities/source-release.ts +8 -3
  570. package/src/op/activities/source-rollback.ts +8 -4
  571. package/src/op/commit-run-gate-deploy-join.test.ts +117 -0
  572. package/src/op/gate-name.ts +13 -3
  573. package/src/op/gate-release.test.ts +126 -0
  574. package/src/op/gate-run-locator.test.ts +110 -0
  575. package/src/op/gate-run-locator.ts +35 -0
  576. package/src/op/gate.ts +88 -6
  577. package/src/op/local-executor.ts +207 -52
  578. package/src/op/op-waves-run.ts +4 -0
  579. package/src/op/run-events.test.ts +166 -0
  580. package/src/op/run-live.ts +1 -1
  581. package/src/op/runtime.ts +39 -0
  582. package/src/op/runtimes/local.test.ts +16 -0
  583. package/src/op/runtimes/local.ts +9 -0
  584. package/src/plan-summary.test.ts +20 -0
  585. package/src/plan-summary.ts +8 -1
  586. package/src/point-decision.ts +12 -2
  587. package/src/pr-loop.ts +25 -4
  588. package/src/pr-report-url.test.ts +131 -0
  589. package/src/pr-report-url.ts +209 -0
  590. package/src/provenance.ts +2 -2
  591. package/src/run-event-store.test.ts +144 -0
  592. package/src/run-event-store.ts +273 -0
  593. package/src/run-event-stream.test.ts +175 -0
  594. package/src/run-event-stream.ts +309 -0
  595. package/src/run-event.test.ts +277 -0
  596. package/src/run-event.ts +471 -0
  597. package/src/wave-loop-golden.test.ts +9 -0
  598. package/src/workspace/__fixtures__/flag-workspace.ts +132 -0
  599. package/src/workspace/__fixtures__/older-records/change-set-984534ea9.json +100 -0
  600. package/src/workspace/__fixtures__/older-records/older-records.json +326 -0
  601. package/src/workspace/__fixtures__/run-event-check.ts +58 -0
  602. package/src/workspace/ancestry-index.test.ts +93 -0
  603. package/src/workspace/change-set-show.schema.json +102 -0
  604. package/src/workspace/change-set-show.ts +72 -0
  605. package/src/workspace/change-set.schema.json +32 -1
  606. package/src/workspace/changes-cli.ts +10 -1
  607. package/src/workspace/changes.schema.json +135 -0
  608. package/src/workspace/changes.test.ts +1 -1
  609. package/src/workspace/changes.ts +84 -2
  610. package/src/workspace/check.schema.json +4 -2
  611. package/src/workspace/checks/records.ts +35 -1
  612. package/src/workspace/checks.ts +2 -1
  613. package/src/workspace/ci-green-cli.ts +75 -13
  614. package/src/workspace/ci-green-forge.ts +24 -4
  615. package/src/workspace/ci-green-runs.test.ts +242 -0
  616. package/src/workspace/ci-green-signed.test.ts +302 -0
  617. package/src/workspace/ci-green-workflow.test.ts +16 -0
  618. package/src/workspace/ci-green-workflow.ts +12 -0
  619. package/src/workspace/ci-green.test.ts +131 -2
  620. package/src/workspace/ci-green.ts +635 -42
  621. package/src/workspace/ci-last-green.schema.json +32 -2
  622. package/src/workspace/ci-list.schema.json +525 -0
  623. package/src/workspace/commit-links.test.ts +279 -0
  624. package/src/workspace/commit-links.ts +183 -0
  625. package/src/workspace/declaration.schema.json +76 -0
  626. package/src/workspace/declaration.test.ts +28 -0
  627. package/src/workspace/declaration.ts +60 -2
  628. package/src/workspace/declared-kinds.ts +40 -1
  629. package/src/workspace/delivery-metrics.schema.json +519 -0
  630. package/src/workspace/delivery-metrics.test.ts +236 -0
  631. package/src/workspace/delivery-metrics.ts +286 -0
  632. package/src/workspace/flags-read.ts +121 -0
  633. package/src/workspace/flags.test.ts +141 -0
  634. package/src/workspace/flags.ts +157 -0
  635. package/src/workspace/graph-cli.ts +1 -1
  636. package/src/workspace/identity-gate-rule.ts +91 -7
  637. package/src/workspace/identity.ts +14 -1
  638. package/src/workspace/intent-cli.ts +46 -5
  639. package/src/workspace/intent-trace.test.ts +173 -0
  640. package/src/workspace/intent-trace.ts +484 -0
  641. package/src/workspace/intent.schema.json +702 -6
  642. package/src/workspace/intent.ts +196 -26
  643. package/src/workspace/ls.schema.json +3 -1
  644. package/src/workspace/ls.ts +6 -0
  645. package/src/workspace/member-pipeline.test.ts +17 -0
  646. package/src/workspace/member-pipeline.ts +9 -0
  647. package/src/workspace/older-records.test.ts +412 -0
  648. package/src/workspace/overlap.test.ts +165 -0
  649. package/src/workspace/overlap.ts +340 -0
  650. package/src/workspace/promotion-order.ts +97 -0
  651. package/src/workspace/read-contract.e2e.test.ts +5 -1
  652. package/src/workspace/reason-codes.test.ts +7 -1
  653. package/src/workspace/reason-codes.ts +7 -1
  654. package/src/workspace/record-assets.test.ts +2 -1
  655. package/src/workspace/records-contract.e2e.test.ts +2 -1
  656. package/src/workspace/records.schema.json +21 -2
  657. package/src/workspace/records.ts +36 -2
  658. package/src/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  659. package/src/workspace/reference-kinds/flag/flag.schema.json +53 -0
  660. package/src/workspace/releases.schema.json +513 -0
  661. package/src/workspace/releases.test.ts +108 -0
  662. package/src/workspace/releases.ts +133 -0
  663. package/src/workspace/run-event.schema.json +295 -0
  664. package/src/workspace/status-contract.test.ts +81 -1
  665. package/src/workspace/status-gates.ts +64 -1
  666. package/src/workspace/status-mixed.test.ts +152 -0
  667. package/src/workspace/status-revoked.test.ts +153 -0
  668. package/src/workspace/status-stewards.ts +6 -0
  669. package/src/workspace/status.schema.json +268 -2
  670. package/src/workspace/status.ts +334 -4
  671. package/src/workspace/trust/ci-tag-statement.ts +151 -0
  672. package/src/workspace/trust/op-run-statement.ts +148 -0
  673. package/src/workspace/trust/rotation.ts +61 -14
  674. package/src/workspace/trust/seal.ts +10 -0
  675. package/src/workspace/trust/ssh-commit.ts +10 -9
  676. package/src/workspace/wip.ts +11 -2
  677. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/astro.config.mjs +0 -14
  678. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/package.json +0 -16
  679. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content/docs/index.mdx +0 -8
  680. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content.config.ts +0 -15
  681. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/tsconfig.json +0 -10
@@ -0,0 +1,219 @@
1
+ /**
2
+ * The why chain of a region (#4023): for each commit the intent walk read,
3
+ * the work item it names, its ci tag, the release that shipped it, the gate
4
+ * resolutions that admitted that release and the deploy records per
5
+ * environment. "Who asked for this, and who let it ship" in one read.
6
+ *
7
+ * Every link is made by a record that already exists, and each one states
8
+ * that record in `source`, so a reader can follow it:
9
+ *
10
+ * - work item: a `Chant-Record` or `Chant-Lease` trailer, judged as #4029's
11
+ * `judgeCommitLink` judges it. A commit in a work item's window (the
12
+ * intent graph's `worked` bucket) is listed apart, as a window match, and
13
+ * never links it.
14
+ * - ci tag: `ci/green/<sha>` or `ci/revoked/<sha>`, judged as `release cut`
15
+ * judges it (#4031, `judgedCiTags`).
16
+ * - release: `_releases/<digest>.json`, whose `commit` is the commit itself
17
+ * (`cut-from`) or one that has it in its history (`contains`).
18
+ * - gates and deploys: `joinRelease` (#4043), and a deploy's `admission`
19
+ * read back to the resolution in `_gates/<op>.jsonl` (#4020).
20
+ * - the plan a gate bound: the change set stored under its `planDigest`
21
+ * (#4022), and a deploy's release plan in `_plans/` (ws-055).
22
+ *
23
+ * A commit is "contained" by a later commit when that commit has it as an
24
+ * ancestor in the history read. For each commit the chain names the releases
25
+ * cut from it, or failing those the first release cut after it, and the first
26
+ * deploy per environment that shipped it, so the document stays the size of
27
+ * the walk. Everything is read from local git: the tags and the local
28
+ * `chant/lifecycle` branch. Nothing is fetched.
29
+ */
30
+ import type { RunOrigin } from "../lifecycle/release-ledger.js";
31
+ import type { ReleasePlan } from "../lifecycle/plan-ledger.js";
32
+ import type { IgnoredCiTag, RevokedTagView } from "./ci-green.js";
33
+ import type { CommitLinkProblem, CommitLinkState, WorkIndex } from "./commit-links.js";
34
+ import type { CiGreen } from "./declaration.js";
35
+ import type { CommitTrailerJoins } from "./trailer-joins.js";
36
+ /** Where a link comes from: the record (`ref`), and the field of it whose `value` made the join. */
37
+ export interface TraceSource {
38
+ /** A commit sha, a tag ref (`refs/tags/...`), a record file, or a path on `chant/lifecycle` (`chant/lifecycle:<path>`). */
39
+ ref: string;
40
+ /** The trailer, field or edge that joins, such as `Chant-Record`, `commit`, `releaseDigest`, `admission` or `window`. */
41
+ field: string;
42
+ /** Its value, as the record holds it. */
43
+ value: string;
44
+ }
45
+ /** A work item a commit links to, or falls in the window of. */
46
+ export interface TraceWork {
47
+ /** `<kind>:<id>`. */
48
+ id: string;
49
+ /** The work node in `nodes`, or null when no kind read has the record. */
50
+ node: string | null;
51
+ source: TraceSource;
52
+ }
53
+ export interface TraceTagView {
54
+ tag: string;
55
+ tagged: string | null;
56
+ /** The runner whose statement the tag carries, or null for a tag that counts unsigned (#4031). */
57
+ signer: string | null;
58
+ source: TraceSource;
59
+ }
60
+ /** A commit's ci tags as readers count them (#4031, ws-103). */
61
+ export interface TraceTag {
62
+ /** `revoked` when a revoked tag counts, else `green` when a green tag counts, else `none`. */
63
+ state: "green" | "revoked" | "none";
64
+ green: TraceTagView | null;
65
+ revoked: (TraceTagView & Pick<RevokedTagView, "phase" | "run">) | null;
66
+ /** Tags on the commit that exist and don't count. */
67
+ ignored: IgnoredCiTag[];
68
+ }
69
+ /** One gate resolution: who let it through, on which channel, when, and for which plan. */
70
+ export interface TraceGate {
71
+ op: string;
72
+ gate: string;
73
+ environment: string | null;
74
+ resolvedBy: string;
75
+ relayedBy: string | null;
76
+ /** `cli`, `mcp` or `acp`, the channel the resolution was authored on (#2384), or null when the record doesn't say. */
77
+ channel: string | null;
78
+ at: string;
79
+ planDigest: string | null;
80
+ /** `planDigest`, when a change set is stored under it (#4022): `chant change-set show <changeSet>` prints it. */
81
+ changeSet: string | null;
82
+ changeSetSource: TraceSource | null;
83
+ /** A pass over an empty change set, written by the promote itself (#4045). */
84
+ empty: boolean;
85
+ /** Whether the approval carries an ssh seal (`chant approve --sign`, #3163). `status` judges it against the signers at base. */
86
+ sealed: boolean;
87
+ url: string | null;
88
+ source: TraceSource;
89
+ }
90
+ /** A release that shipped a commit of the walk. */
91
+ export interface TraceRelease {
92
+ releaseDigest: string;
93
+ label: string | null;
94
+ member: string | null;
95
+ /** The green commit it was cut from. */
96
+ commit: string;
97
+ /** That commit's ci tags. */
98
+ tag: TraceTag;
99
+ source: TraceSource;
100
+ cuts: {
101
+ label: string | null;
102
+ actor: string;
103
+ timestamp: string;
104
+ signed: boolean;
105
+ runOrigin: RunOrigin | null;
106
+ source: TraceSource;
107
+ }[];
108
+ /** The release gate's resolutions for it, oldest first. */
109
+ gates: TraceGate[];
110
+ /** The ids of its deploy records in `deploys`, oldest first. */
111
+ deploys: string[];
112
+ }
113
+ /** A deploy record (`ReleaseRecord` in `<env>/releases.jsonl`). */
114
+ export interface TraceDeploy {
115
+ /** `deploy:<member>/<env>/<component>/<runId>@<timestamp>`, with `.` for a ledger of no member. */
116
+ id: string;
117
+ member: string | null;
118
+ env: string;
119
+ component: string;
120
+ timestamp: string;
121
+ actor: string;
122
+ approver: string | null;
123
+ runId: string;
124
+ runOrigin: RunOrigin | null;
125
+ gitSha: string;
126
+ digest: string;
127
+ /** The release it was made from, by its `releaseDigest` or through the release gate resolution its admission names (#4043), or null. */
128
+ release: string | null;
129
+ releaseSource: TraceSource | null;
130
+ /** The gate resolution its `admission` names (#4020), or null for an ungated deploy, one recorded before 0.124.28, or one whose resolution is not on the branch. */
131
+ admittedBy: TraceGate | null;
132
+ /** The release plan its `digest` names in `_plans/` (ws-055), or null when none is stored. */
133
+ plan: {
134
+ document: ReleasePlan;
135
+ source: TraceSource;
136
+ } | null;
137
+ source: TraceSource;
138
+ }
139
+ export interface TraceCommit {
140
+ /** The commit node. */
141
+ commit: string;
142
+ sha: string;
143
+ /**
144
+ * The work items the commit names, judged as `check --changes` judges it
145
+ * (#4029): `linked`, `unlinked`, `wrong` or `merge`. Null when no work kind
146
+ * was read.
147
+ */
148
+ work: {
149
+ state: CommitLinkState;
150
+ items: TraceWork[];
151
+ problems: CommitLinkProblem[];
152
+ } | null;
153
+ /** The work items whose window holds the commit (the `worked` within edges). They don't link it. */
154
+ windowMatches: TraceWork[];
155
+ tag: TraceTag;
156
+ /** The releases cut from the commit, or when none, the first release cut from a commit that has it in its history. */
157
+ releases: {
158
+ release: string;
159
+ link: "cut-from" | "contains";
160
+ source: TraceSource;
161
+ }[];
162
+ /** Per environment, the first deploy record built from the commit or a commit that has it in its history. */
163
+ deploys: {
164
+ deploy: string;
165
+ env: string;
166
+ link: "built-from" | "contains";
167
+ source: TraceSource;
168
+ }[];
169
+ }
170
+ export type TraceReasonCode = "ledger-unreadable" | "declaration-invalid";
171
+ /** The why chain (#4023): commits in walk order, then the releases and deploys they name. */
172
+ export interface IntentTrace {
173
+ commits: TraceCommit[];
174
+ releases: TraceRelease[];
175
+ deploys: TraceDeploy[];
176
+ /** Parts of the chain that could not be read: the ci tags (`declaration-invalid`) or a ledger (`ledger-unreadable`). The rest stands. */
177
+ reasons: {
178
+ code: TraceReasonCode;
179
+ message: string;
180
+ }[];
181
+ }
182
+ export interface TraceInput {
183
+ top: string;
184
+ /** The commits of the walk, in its order. */
185
+ commits: {
186
+ id: string;
187
+ sha: string;
188
+ trailers: Record<string, string[]>;
189
+ joins: CommitTrailerJoins;
190
+ }[];
191
+ /** The work records the walk read, by work kind, and their nodes by `<kind>:<id>`. Null when no work kind was read. */
192
+ work: {
193
+ index: Omit<WorkIndex, "ledger">;
194
+ nodes: Map<string, string>;
195
+ } | null;
196
+ /** The work items whose window holds each commit, by sha. */
197
+ windows: Map<string, {
198
+ id: string;
199
+ node: string;
200
+ path: string;
201
+ }[]>;
202
+ /**
203
+ * The ledgers to read, each as the directory `chant/lifecycle` stores
204
+ * resolve it from. `within` is a path part every ledger of the member has,
205
+ * `_members/<name>/`, so a member with nothing on the branch is skipped
206
+ * unread; null when it can't be told, as for a member at the root.
207
+ */
208
+ ledgers: {
209
+ member: string | null;
210
+ cwd: string;
211
+ within: string | null;
212
+ }[];
213
+ green: CiGreen | null;
214
+ /** Whether `later` is `sha` or has it as an ancestor, in the history read. */
215
+ contains: (sha: string, later: string) => boolean;
216
+ }
217
+ /** Build the chain. Never throws for a ledger or tag it can't read: that is a reason. */
218
+ export declare function buildTrace(input: TraceInput): Promise<IntentTrace>;
219
+ //# sourceMappingURL=intent-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-trace.d.ts","sourceRoot":"","sources":["../../src/workspace/intent-trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,314 @@
1
+ /**
2
+ * The why chain of a region (#4023): for each commit the intent walk read,
3
+ * the work item it names, its ci tag, the release that shipped it, the gate
4
+ * resolutions that admitted that release and the deploy records per
5
+ * environment. "Who asked for this, and who let it ship" in one read.
6
+ *
7
+ * Every link is made by a record that already exists, and each one states
8
+ * that record in `source`, so a reader can follow it:
9
+ *
10
+ * - work item: a `Chant-Record` or `Chant-Lease` trailer, judged as #4029's
11
+ * `judgeCommitLink` judges it. A commit in a work item's window (the
12
+ * intent graph's `worked` bucket) is listed apart, as a window match, and
13
+ * never links it.
14
+ * - ci tag: `ci/green/<sha>` or `ci/revoked/<sha>`, judged as `release cut`
15
+ * judges it (#4031, `judgedCiTags`).
16
+ * - release: `_releases/<digest>.json`, whose `commit` is the commit itself
17
+ * (`cut-from`) or one that has it in its history (`contains`).
18
+ * - gates and deploys: `joinRelease` (#4043), and a deploy's `admission`
19
+ * read back to the resolution in `_gates/<op>.jsonl` (#4020).
20
+ * - the plan a gate bound: the change set stored under its `planDigest`
21
+ * (#4022), and a deploy's release plan in `_plans/` (ws-055).
22
+ *
23
+ * A commit is "contained" by a later commit when that commit has it as an
24
+ * ancestor in the history read. For each commit the chain names the releases
25
+ * cut from it, or failing those the first release cut after it, and the first
26
+ * deploy per environment that shipped it, so the document stays the size of
27
+ * the walk. Everything is read from local git: the tags and the local
28
+ * `chant/lifecycle` branch. Nothing is fetched.
29
+ */
30
+ import { execFileSync } from "node:child_process";
31
+ function tryGit(top, args) {
32
+ try {
33
+ return execFileSync("git", args, { cwd: top, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 256 * 1024 * 1024 });
34
+ }
35
+ catch {
36
+ return undefined;
37
+ }
38
+ }
39
+ const fileOf = (digest) => `${digest.replace(/:/g, "_")}.json`;
40
+ const onBranch = (path) => `chant/lifecycle:${path}`;
41
+ const byTime = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
42
+ function tagOf(sha, tags, revokedView) {
43
+ const green = tags?.green.get(sha);
44
+ const revoked = tags?.revoked.get(sha);
45
+ const view = (kind, t) => ({
46
+ tag: `ci/${kind}/${sha}`,
47
+ tagged: t.tagged,
48
+ signer: t.signer,
49
+ source: { ref: `refs/tags/ci/${kind}/${sha}`, field: "name", value: sha },
50
+ });
51
+ return {
52
+ state: revoked ? "revoked" : green ? "green" : "none",
53
+ green: green ? view("green", green) : null,
54
+ revoked: revoked ? { ...view("revoked", revoked), phase: revokedView(sha, revoked).phase, run: revokedView(sha, revoked).run } : null,
55
+ ignored: tags?.ignored.get(sha) ?? [],
56
+ };
57
+ }
58
+ /** Build the chain. Never throws for a ledger or tag it can't read: that is a reason. */
59
+ export async function buildTrace(input) {
60
+ const { top } = input;
61
+ const reasons = [];
62
+ const shas = input.commits.map((c) => c.sha);
63
+ // The ci tags, judged as release cut judges them.
64
+ let tags = null;
65
+ const { revokedTagView } = await import("./ci-green.js");
66
+ try {
67
+ const { judgedCiTags } = await import("../lifecycle/release-revocation.js");
68
+ tags = await judgedCiTags(top, input.green);
69
+ }
70
+ catch (err) {
71
+ reasons.push({ code: "declaration-invalid", message: `the ci tags could not be judged: ${err instanceof Error ? err.message : String(err)}` });
72
+ }
73
+ // The work item each commit names (#4029).
74
+ const { judgeCommitLink, hasLeaseLedger, mergeCommits } = await import("./commit-links.js");
75
+ const index = input.work ? { ...input.work.index, ledger: hasLeaseLedger(top) } : null;
76
+ const merges = index ? mergeCommits(top, shas) : new Set();
77
+ const workNode = (id) => input.work?.nodes.get(id) ?? null;
78
+ // The ledgers on the local chant/lifecycle branch.
79
+ const branch = tryGit(top, ["rev-parse", "--verify", "--quiet", "refs/heads/chant/lifecycle"]) !== undefined;
80
+ const ledgers = [];
81
+ // One listing of the branch, so a ledger that holds no release and no deploy costs nothing more.
82
+ const paths = branch ? (tryGit(top, ["ls-tree", "-r", "--name-only", "--full-tree", "refs/heads/chant/lifecycle"]) ?? "").split("\n").filter(Boolean) : [];
83
+ const holds = (prefix) => paths.some((p) => p.startsWith(prefix) && (p.startsWith(`${prefix}_releases/`) || /^[^/_][^/]*\/releases\.jsonl$/.test(p.slice(prefix.length))));
84
+ if (branch) {
85
+ const { resolveMemberLedger } = await import("../lifecycle/member-ledger.js");
86
+ const { readAllReleases } = await import("../lifecycle/release-store.js");
87
+ const { listReleaseEnvironments, readReleaseLedger } = await import("../lifecycle/release-ledger.js");
88
+ for (const l of input.ledgers) {
89
+ if (l.within !== null && !paths.some((p) => p.includes(l.within)))
90
+ continue;
91
+ const loc = { cwd: l.cwd };
92
+ try {
93
+ const prefix = (await resolveMemberLedger(l.cwd)).prefix;
94
+ if (ledgers.some((x) => x.prefix === prefix) || !holds(prefix))
95
+ continue;
96
+ const { releases } = await readAllReleases(loc);
97
+ const deploys = [];
98
+ for (const env of await listReleaseEnvironments(loc)) {
99
+ for (const record of (await readReleaseLedger(env, loc)).records)
100
+ deploys.push({ env, record });
101
+ }
102
+ ledgers.push({ member: l.member, loc, prefix, releases, deploys });
103
+ }
104
+ catch (err) {
105
+ reasons.push({ code: "ledger-unreadable", message: `${l.member ?? "the workspace"}'s ledger on chant/lifecycle: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}` });
106
+ }
107
+ }
108
+ }
109
+ // Each commit to the releases and deploys that shipped it.
110
+ const firstCut = new Map();
111
+ const releaseHits = new Map();
112
+ const deployHits = new Map();
113
+ const deployId = (l, env, r) => `deploy:${l.member ?? "."}/${env}/${r.component}/${r.runId}@${r.timestamp}`;
114
+ const perCommit = new Map();
115
+ if (ledgers.some((l) => l.releases.length > 0)) {
116
+ const { readCuts } = await import("../lifecycle/release-store.js");
117
+ for (const l of ledgers) {
118
+ if (l.releases.length === 0)
119
+ continue;
120
+ try {
121
+ for (const c of (await readCuts(l.loc)).cuts)
122
+ if (!firstCut.has(c.releaseDigest) || byTime(c.timestamp, firstCut.get(c.releaseDigest)) < 0)
123
+ firstCut.set(c.releaseDigest, c.timestamp);
124
+ }
125
+ catch {
126
+ // A release with no readable cut sorts last; its file still joins.
127
+ }
128
+ }
129
+ }
130
+ for (const sha of shas) {
131
+ const releases = [];
132
+ const deploys = [];
133
+ for (const l of ledgers) {
134
+ const releaseSource = (r) => ({ ref: onBranch(`${l.prefix}_releases/${fileOf(r.releaseDigest)}`), field: "commit", value: r.commit });
135
+ const cut = l.releases.filter((r) => r.commit === sha);
136
+ const chosen = cut.map((r) => ({ r, link: "cut-from" }));
137
+ if (chosen.length === 0) {
138
+ const later = l.releases.filter((r) => input.contains(sha, r.commit)).sort((a, b) => byTime(firstCut.get(a.releaseDigest) ?? "￿", firstCut.get(b.releaseDigest) ?? "￿") || byTime(a.releaseDigest, b.releaseDigest));
139
+ if (later.length > 0)
140
+ chosen.push({ r: later[0], link: "contains" });
141
+ }
142
+ for (const { r, link } of chosen) {
143
+ releases.push({ release: r.releaseDigest, link, source: releaseSource(r) });
144
+ (releaseHits.get(l) ?? releaseHits.set(l, new Set()).get(l)).add(r.releaseDigest);
145
+ }
146
+ const first = new Map();
147
+ for (const d of l.deploys) {
148
+ const link = d.record.gitSha === sha ? "built-from" : input.contains(sha, d.record.gitSha) ? "contains" : null;
149
+ if (!link)
150
+ continue;
151
+ const had = first.get(d.env);
152
+ if (!had || byTime(d.record.timestamp, had.record.timestamp) < 0)
153
+ first.set(d.env, { ...d, link });
154
+ }
155
+ for (const [env, d] of [...first].sort(([a], [b]) => byTime(a, b))) {
156
+ const id = deployId(l, env, d.record);
157
+ deployHits.set(id, { ledger: l, env, record: d.record });
158
+ deploys.push({ deploy: id, env, link: d.link, source: { ref: onBranch(`${l.prefix}${env}/releases.jsonl`), field: "gitSha", value: d.record.gitSha } });
159
+ }
160
+ }
161
+ perCommit.set(sha, { releases, deploys });
162
+ }
163
+ // The releases, through joinRelease, with their gates and deploys.
164
+ const { joinRelease } = await import("../lifecycle/release-join.js");
165
+ const { readGateLedger } = await import("../lifecycle/gate-ledger.js");
166
+ const { readStoredChangeSet, changeSetFile, CHANGE_SETS_DIR } = await import("../lifecycle/change-set-store.js");
167
+ const gateLedgers = new Map();
168
+ const resolutionsOf = (l, op) => {
169
+ const key = `${l.prefix}\0${op}`;
170
+ let hit = gateLedgers.get(key);
171
+ if (!hit) {
172
+ hit = readGateLedger(op, l.loc).then((g) => g.resolutions, () => []);
173
+ gateLedgers.set(key, hit);
174
+ }
175
+ return hit;
176
+ };
177
+ const changeSets = new Map();
178
+ const gateOf = async (l, r) => {
179
+ let stored;
180
+ if (r.planDigest) {
181
+ const key = `${l.prefix}\0${r.planDigest}`;
182
+ stored = changeSets.get(key);
183
+ if (!stored) {
184
+ stored = readStoredChangeSet(r.planDigest, l.loc).then((x) => x.status === "found", () => false);
185
+ changeSets.set(key, stored);
186
+ }
187
+ }
188
+ const has = stored ? await stored : false;
189
+ return {
190
+ op: r.op,
191
+ gate: r.gate,
192
+ environment: r.environment ?? null,
193
+ resolvedBy: r.resolvedBy,
194
+ relayedBy: r.relayedBy ?? null,
195
+ channel: r.origin ?? null,
196
+ at: r.timestamp,
197
+ planDigest: r.planDigest ?? null,
198
+ changeSet: has ? r.planDigest : null,
199
+ changeSetSource: has ? { ref: onBranch(`${l.prefix}${CHANGE_SETS_DIR}/${changeSetFile(r.planDigest)}`), field: "planDigest", value: r.planDigest } : null,
200
+ empty: r.empty === true,
201
+ sealed: r.seal !== undefined,
202
+ url: r.url ?? null,
203
+ source: { ref: onBranch(`${l.prefix}_gates/${r.op}.jsonl`), field: r.releaseDigest ? "releaseDigest" : "gate", value: r.releaseDigest ?? r.gate },
204
+ };
205
+ };
206
+ const releases = [];
207
+ const joinedDeploys = new Map();
208
+ for (const l of ledgers) {
209
+ const wanted = releaseHits.get(l);
210
+ if (!wanted || wanted.size === 0)
211
+ continue;
212
+ const commits = [...new Set(l.releases.filter((r) => wanted.has(r.releaseDigest)).map((r) => r.commit))];
213
+ let joined;
214
+ try {
215
+ joined = (await joinRelease({ commits }, l.loc)).releases;
216
+ }
217
+ catch (err) {
218
+ reasons.push({ code: "ledger-unreadable", message: `joining ${l.member ?? "the workspace"}'s releases: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}` });
219
+ continue;
220
+ }
221
+ for (const j of joined) {
222
+ for (const d of j.deploys)
223
+ joinedDeploys.set(deployId(l, d.env, d), { ledger: l, env: d.env, record: d, release: j });
224
+ releases.push({
225
+ releaseDigest: j.releaseDigest,
226
+ label: j.label,
227
+ member: j.release.member,
228
+ commit: j.commit,
229
+ tag: tagOf(j.commit, tags, revokedTagView),
230
+ source: { ref: onBranch(`${l.prefix}_releases/${fileOf(j.releaseDigest)}`), field: "releaseDigest", value: j.releaseDigest },
231
+ cuts: j.cuts.map((c) => ({
232
+ label: c.label,
233
+ actor: c.actor,
234
+ timestamp: c.timestamp,
235
+ signed: c.signature !== null,
236
+ runOrigin: c.runOrigin,
237
+ source: { ref: onBranch(`${l.prefix}_releases/cuts.jsonl`), field: "releaseDigest", value: c.releaseDigest },
238
+ })),
239
+ gates: await Promise.all([...j.gates.resolutions].sort((a, b) => byTime(a.timestamp, b.timestamp)).map((r) => gateOf(l, r))),
240
+ deploys: j.deploys.map((d) => deployId(l, d.env, d)),
241
+ });
242
+ }
243
+ }
244
+ // The deploys: those a commit names and those of each release, oldest first.
245
+ const { readReleasePlan } = await import("../lifecycle/plan-ledger.js");
246
+ const plans = new Map();
247
+ const all = new Map([...deployHits, ...joinedDeploys]);
248
+ const releaseResolutions = new Map();
249
+ const deploys = [];
250
+ for (const [id, d] of [...all].sort(([, a], [, b]) => byTime(a.record.timestamp, b.record.timestamp) || byTime(a.env, b.env))) {
251
+ const r = d.record;
252
+ const l = d.ledger;
253
+ let release = r.releaseDigest ?? null;
254
+ let releaseSource = release ? { ref: onBranch(`${l.prefix}${d.env}/releases.jsonl`), field: "releaseDigest", value: release } : null;
255
+ if (!release && r.admission?.op === "release") {
256
+ if (!releaseResolutions.has(l))
257
+ releaseResolutions.set(l, await resolutionsOf(l, "release"));
258
+ const { releaseOfDeploy } = await import("../lifecycle/release-join.js");
259
+ release = releaseOfDeploy(r, releaseResolutions.get(l)) ?? null;
260
+ if (release)
261
+ releaseSource = { ref: onBranch(`${l.prefix}${d.env}/releases.jsonl`), field: "admission", value: `${r.admission.gate}@${r.admission.resolvedAt}` };
262
+ }
263
+ let admittedBy = null;
264
+ if (r.admission) {
265
+ const found = (await resolutionsOf(l, r.admission.op)).find((x) => x.gate === r.admission.gate && x.timestamp === r.admission.resolvedAt);
266
+ if (found)
267
+ admittedBy = await gateOf(l, found);
268
+ }
269
+ const planKey = `${l.prefix}\0${r.digest}`;
270
+ let plan = plans.get(planKey);
271
+ if (!plan) {
272
+ plan = readReleasePlan(r.digest, l.loc).catch(() => null);
273
+ plans.set(planKey, plan);
274
+ }
275
+ const document = await plan;
276
+ deploys.push({
277
+ id,
278
+ member: l.member,
279
+ env: d.env,
280
+ component: r.component,
281
+ timestamp: r.timestamp,
282
+ actor: r.actor,
283
+ approver: r.approver ?? null,
284
+ runId: r.runId,
285
+ runOrigin: r.runOrigin ?? null,
286
+ gitSha: r.gitSha,
287
+ digest: r.digest,
288
+ release,
289
+ releaseSource,
290
+ admittedBy,
291
+ plan: document ? { document, source: { ref: onBranch(`${l.prefix}_plans/${fileOf(r.digest)}`), field: "digest", value: r.digest } } : null,
292
+ source: { ref: onBranch(`${l.prefix}${d.env}/releases.jsonl`), field: "runId", value: r.runId },
293
+ });
294
+ }
295
+ const commits = input.commits.map((c) => {
296
+ let work = null;
297
+ if (index) {
298
+ const judged = merges.has(c.sha) ? { state: "merge", ids: [], problems: [] } : judgeCommitLink(c.trailers, c.joins, index);
299
+ const items = judged.ids.map((id) => {
300
+ const named = c.joins.records.some((r) => `${r.kind}:${r.id}` === id);
301
+ return {
302
+ id,
303
+ node: workNode(id),
304
+ source: named ? { ref: c.sha, field: "Chant-Record", value: id } : { ref: c.sha, field: "Chant-Lease", value: c.joins.lease?.token ?? "" },
305
+ };
306
+ });
307
+ work = { state: judged.state, items, problems: judged.problems };
308
+ }
309
+ const windowMatches = (input.windows.get(c.sha) ?? []).map((w) => ({ id: w.id, node: w.node, source: { ref: w.path, field: "window", value: "worked" } }));
310
+ const hit = perCommit.get(c.sha) ?? { releases: [], deploys: [] };
311
+ return { commit: c.id, sha: c.sha, work, windowMatches, tag: tagOf(c.sha, tags, revokedTagView), releases: hit.releases, deploys: hit.deploys };
312
+ });
313
+ return { commits, releases, deploys, reasons };
314
+ }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The intent graph over one region: `chant workspace graph --intent
3
- * <path[:start-end]|path#symbol>` (#2651; #2650 sections B and C1; #2524 D8,
3
+ * <path[:start-end]|path#symbol|member/node|sha>` (#2651; #2650 sections B and C1; #2524 D8,
4
4
  * D15; #3034).
5
5
  *
6
6
  * A person points at some code and asks how it got this way and who decided
@@ -66,6 +66,7 @@ import { type RunCost, type RunJoin, type RunPin, type RunUsage } from "./runs.j
66
66
  import { type Forge } from "./squash.js";
67
67
  import { type SymbolPluginLoader } from "./lexicon-symbols.js";
68
68
  import { type CommitTrailerJoins } from "./trailer-joins.js";
69
+ import { type IntentTrace } from "./intent-trace.js";
69
70
  import { type ProvenanceLevel } from "./trust/attestor.js";
70
71
  import { type WorkLink, type WorkWarningCode } from "./work.js";
71
72
  /** The version of the `intent` document this chant writes. */
@@ -101,9 +102,12 @@ export interface RegionNode {
101
102
  /** The member whose directory holds the path, or null. */
102
103
  member: string | null;
103
104
  at: string | null;
104
- type: "file" | "dir";
105
- /** For a file region, whether the file is generated (#2524 D14); null for a directory. */
105
+ /** `commit` for a region given as a commit sha (#4023): the files that commit changed. */
106
+ type: "file" | "dir" | "commit";
107
+ /** For a file region, whether the file is generated (#2524 D14); null for a directory or a commit. */
106
108
  generated: boolean | null;
109
+ /** Set when the region was given as a commit sha (#4023): its full sha. `path` is then `.`. */
110
+ commit?: string;
107
111
  /** Set when the region was given as a graph node id. */
108
112
  node: string | null;
109
113
  /** Set when the region was given as `path#symbol` (#3034): the symbol as given, the declaration it resolved to, and its kind. `lines` holds its current lines. */
@@ -374,6 +378,19 @@ export interface WorkNode {
374
378
  * to the review through it. Empty when none does. Added within contract 1.
375
379
  */
376
380
  reviews?: WorkReview[];
381
+ /**
382
+ * The other in-flight work items whose linked commits touch a file this
383
+ * item's linked commits touch (#4025), as `workspace status --json` reports
384
+ * in `overlap`, each with the shared files. Empty when none does, or when
385
+ * this item is not in flight. Absent on a read with `--at` and when the
386
+ * overlap can't be read. The change-set entries two items share are in
387
+ * `status`, which reads the gates. Added within contract 1 by chant
388
+ * 0.124.29.
389
+ */
390
+ overlaps?: {
391
+ with: string;
392
+ files: string[];
393
+ }[];
377
394
  }
378
395
  /**
379
396
  * An agent run that made a commit in the walk (#3033): from the run ledger on
@@ -537,7 +554,7 @@ export type IntentDocument = (Head & {
537
554
  region: string;
538
555
  history: {
539
556
  rev: string | null;
540
- follows: "line-range" | "file" | "directory";
557
+ follows: "line-range" | "file" | "directory" | "commit";
541
558
  shallow: boolean;
542
559
  };
543
560
  kinds: {
@@ -556,6 +573,8 @@ export type IntentDocument = (Head & {
556
573
  findings: number;
557
574
  };
558
575
  why: WhyAnswer;
576
+ /** The why chain (#4023): each commit's work item, ci tag, release, gate resolutions and deploys. Added within contract 1 by chant 0.124.29. */
577
+ trace?: IntentTrace;
559
578
  }) | (Head & {
560
579
  error: {
561
580
  code: IntentErrorCode;
@@ -565,7 +584,7 @@ export type IntentDocument = (Head & {
565
584
  export interface IntentQuery {
566
585
  /** Where the walk up to the declaration starts, and what the region path is relative to. */
567
586
  cwd: string;
568
- /** `path`, `path:line`, `path:start-end` or `path#symbol`, or a graph node id `<member>/<id>`. */
587
+ /** `path`, `path:line`, `path:start-end` or `path#symbol`, a graph node id `<member>/<id>`, or a commit sha (#4023). */
569
588
  region: string;
570
589
  at?: string;
571
590
  /** Follow squash merges to their pull requests' original commits, fetching a missing pull request ref from `origin` (#3035). */
@@ -629,9 +648,20 @@ export declare function addingCommit(top: string, rev: string, path: string): st
629
648
  * added it.
630
649
  */
631
650
  export declare function closingCommit(top: string, rev: string, path: string, stateField: string, closed: readonly string[]): string | null;
651
+ /**
652
+ * The files a commit changed, from the workspace root (#4023): against its
653
+ * first parent, or every file for a root commit. Files outside the workspace
654
+ * are left out.
655
+ */
656
+ export declare function changedFiles(top: string, sha: string, workspacePrefix: string): string[];
632
657
  /** The commit a decision record's window opens at: the one that decided it, or, when it is not approved, the one that added it. */
633
658
  export declare function windowOpening(top: string, rev: string, view: Pick<RecordView, "path" | "decidedIn">): string | null;
634
- /** `commit` and every commit between it and `rev` that has it as an ancestor. */
659
+ /**
660
+ * `commit` and every commit between it and `rev` that has it as an ancestor:
661
+ * what `git rev-list --ancestry-path <commit>..<rev>` lists, plus `commit`.
662
+ * With full commit ids it is read from the children of what `rev` reaches,
663
+ * walked once per revision, instead of one `git rev-list` per record (#4032).
664
+ */
635
665
  export declare function descendants(top: string, commit: string, rev: string): Set<string>;
636
666
  /** Parse `path`, `path:line` or `path:start-end`. */
637
667
  export declare function parseRegion(arg: string): {
@@ -654,7 +684,6 @@ export interface LoadedKind {
654
684
  joins?: CommitJoins;
655
685
  }
656
686
  export declare function loadKinds(query: IntentQuery, top: string): Promise<LoadedKind[]>;
657
- /** Build the intent document. Never throws an {@link IntentError}, {@link WorkspaceReadError} or {@link RecordReadError}. */
658
687
  export declare function intentGraph(query: IntentQuery): Promise<IntentResult>;
659
688
  export {};
660
689
  //# sourceMappingURL=intent.d.ts.map