@intentius/chant 0.124.28 → 0.124.30

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 (449) hide show
  1. package/dist/build-params.d.ts +34 -1
  2. package/dist/build-params.d.ts.map +1 -1
  3. package/dist/build-params.js +31 -1
  4. package/dist/change-set-graph.d.ts +8 -1
  5. package/dist/change-set-graph.d.ts.map +1 -1
  6. package/dist/change-set-graph.js +4 -2
  7. package/dist/change-set.d.ts +10 -0
  8. package/dist/change-set.d.ts.map +1 -1
  9. package/dist/change-set.js +4 -3
  10. package/dist/cli/build-params-cli.d.ts +7 -1
  11. package/dist/cli/build-params-cli.d.ts.map +1 -1
  12. package/dist/cli/build-params-cli.js +17 -8
  13. package/dist/cli/commands/build.d.ts.map +1 -1
  14. package/dist/cli/commands/build.js +6 -3
  15. package/dist/cli/handlers/approve.d.ts.map +1 -1
  16. package/dist/cli/handlers/approve.js +45 -0
  17. package/dist/cli/handlers/build.d.ts.map +1 -1
  18. package/dist/cli/handlers/build.js +18 -4
  19. package/dist/cli/handlers/fan-out.d.ts +9 -0
  20. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  21. package/dist/cli/handlers/fan-out.js +67 -8
  22. package/dist/cli/handlers/lifecycle-gc.d.ts +19 -0
  23. package/dist/cli/handlers/lifecycle-gc.d.ts.map +1 -0
  24. package/dist/cli/handlers/lifecycle-gc.js +143 -0
  25. package/dist/cli/handlers/pr.d.ts +11 -3
  26. package/dist/cli/handlers/pr.d.ts.map +1 -1
  27. package/dist/cli/handlers/pr.js +134 -26
  28. package/dist/cli/handlers/promote.d.ts +7 -0
  29. package/dist/cli/handlers/promote.d.ts.map +1 -1
  30. package/dist/cli/handlers/promote.js +210 -33
  31. package/dist/cli/handlers/release.d.ts +62 -5
  32. package/dist/cli/handlers/release.d.ts.map +1 -1
  33. package/dist/cli/handlers/release.js +414 -28
  34. package/dist/cli/handlers/run.d.ts +11 -1
  35. package/dist/cli/handlers/run.d.ts.map +1 -1
  36. package/dist/cli/handlers/run.js +67 -6
  37. package/dist/cli/main.d.ts.map +1 -1
  38. package/dist/cli/main.js +91 -10
  39. package/dist/cli/parse-args.d.ts.map +1 -1
  40. package/dist/cli/parse-args.js +73 -2
  41. package/dist/cli/registry.d.ts +32 -4
  42. package/dist/cli/registry.d.ts.map +1 -1
  43. package/dist/cli/run-events.d.ts +3 -2
  44. package/dist/cli/run-events.d.ts.map +1 -1
  45. package/dist/cli/run-events.js +5 -3
  46. package/dist/components/auto-release.d.ts +2 -0
  47. package/dist/components/auto-release.d.ts.map +1 -1
  48. package/dist/components/auto-release.js +1 -0
  49. package/dist/components/capability.d.ts +9 -0
  50. package/dist/components/capability.d.ts.map +1 -1
  51. package/dist/components/driver.d.ts +8 -0
  52. package/dist/components/driver.d.ts.map +1 -1
  53. package/dist/components/driver.js +35 -0
  54. package/dist/components/fan-out-inputs.d.ts +69 -0
  55. package/dist/components/fan-out-inputs.d.ts.map +1 -0
  56. package/dist/components/fan-out-inputs.js +169 -0
  57. package/dist/components/fan-out-record.d.ts +13 -0
  58. package/dist/components/fan-out-record.d.ts.map +1 -1
  59. package/dist/components/fan-out-record.js +16 -0
  60. package/dist/components/fan-out-run.d.ts.map +1 -1
  61. package/dist/components/fan-out-run.js +50 -0
  62. package/dist/components/fan-out.d.ts +4 -0
  63. package/dist/components/fan-out.d.ts.map +1 -1
  64. package/dist/components/pr-pipeline.d.ts +49 -0
  65. package/dist/components/pr-pipeline.d.ts.map +1 -1
  66. package/dist/components/pr-pipeline.js +38 -4
  67. package/dist/components/pr-run.d.ts +20 -2
  68. package/dist/components/pr-run.d.ts.map +1 -1
  69. package/dist/components/pr-run.js +26 -13
  70. package/dist/components/promote.d.ts +23 -0
  71. package/dist/components/promote.d.ts.map +1 -1
  72. package/dist/components/promote.js +60 -2
  73. package/dist/components/release-compile.d.ts +9 -0
  74. package/dist/components/release-compile.d.ts.map +1 -1
  75. package/dist/components/release-compile.js +9 -3
  76. package/dist/components/release-gate.d.ts +11 -1
  77. package/dist/components/release-gate.d.ts.map +1 -1
  78. package/dist/components/release-gate.js +10 -4
  79. package/dist/components/wave-plan.d.ts +16 -0
  80. package/dist/components/wave-plan.d.ts.map +1 -1
  81. package/dist/components/wave-plan.js +36 -2
  82. package/dist/config.d.ts +38 -0
  83. package/dist/config.d.ts.map +1 -1
  84. package/dist/config.js +2 -0
  85. package/dist/flag-params.d.ts +54 -0
  86. package/dist/flag-params.d.ts.map +1 -0
  87. package/dist/flag-params.js +130 -0
  88. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts +120 -0
  89. package/dist/lifecycle/__fixtures__/publish-fakes.d.ts.map +1 -0
  90. package/dist/lifecycle/__fixtures__/publish-fakes.js +304 -0
  91. package/dist/lifecycle/change-set-store.d.ts +2 -1
  92. package/dist/lifecycle/change-set-store.d.ts.map +1 -1
  93. package/dist/lifecycle/change-set-store.js +2 -1
  94. package/dist/lifecycle/delivery-metrics.d.ts +139 -0
  95. package/dist/lifecycle/delivery-metrics.d.ts.map +1 -0
  96. package/dist/lifecycle/delivery-metrics.js +145 -0
  97. package/dist/lifecycle/deploy-outcome.d.ts +81 -0
  98. package/dist/lifecycle/deploy-outcome.d.ts.map +1 -0
  99. package/dist/lifecycle/deploy-outcome.js +101 -0
  100. package/dist/lifecycle/gate-change-set.d.ts +10 -1
  101. package/dist/lifecycle/gate-change-set.d.ts.map +1 -1
  102. package/dist/lifecycle/gate-change-set.js +35 -3
  103. package/dist/lifecycle/gate-ledger.d.ts +2 -3
  104. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  105. package/dist/lifecycle/git.d.ts +30 -1
  106. package/dist/lifecycle/git.d.ts.map +1 -1
  107. package/dist/lifecycle/git.js +31 -5
  108. package/dist/lifecycle/index.d.ts +4 -0
  109. package/dist/lifecycle/index.d.ts.map +1 -1
  110. package/dist/lifecycle/index.js +4 -0
  111. package/dist/lifecycle/mixed-environment.d.ts +95 -0
  112. package/dist/lifecycle/mixed-environment.d.ts.map +1 -0
  113. package/dist/lifecycle/mixed-environment.js +154 -0
  114. package/dist/lifecycle/publish-attachments.d.ts +79 -0
  115. package/dist/lifecycle/publish-attachments.d.ts.map +1 -0
  116. package/dist/lifecycle/publish-attachments.js +179 -0
  117. package/dist/lifecycle/publish-credentials.d.ts +37 -0
  118. package/dist/lifecycle/publish-credentials.d.ts.map +1 -0
  119. package/dist/lifecycle/publish-credentials.js +69 -0
  120. package/dist/lifecycle/publish-declaration.d.ts +97 -0
  121. package/dist/lifecycle/publish-declaration.d.ts.map +1 -0
  122. package/dist/lifecycle/publish-declaration.js +83 -0
  123. package/dist/lifecycle/publish-forge.d.ts +53 -0
  124. package/dist/lifecycle/publish-forge.d.ts.map +1 -0
  125. package/dist/lifecycle/publish-forge.js +298 -0
  126. package/dist/lifecycle/publish-npm.d.ts +61 -0
  127. package/dist/lifecycle/publish-npm.d.ts.map +1 -0
  128. package/dist/lifecycle/publish-npm.js +242 -0
  129. package/dist/lifecycle/publish-oci.d.ts +64 -0
  130. package/dist/lifecycle/publish-oci.d.ts.map +1 -0
  131. package/dist/lifecycle/publish-oci.js +383 -0
  132. package/dist/lifecycle/publish-record.d.ts +66 -0
  133. package/dist/lifecycle/publish-record.d.ts.map +1 -0
  134. package/dist/lifecycle/publish-record.js +84 -0
  135. package/dist/lifecycle/publish-targets.d.ts +45 -0
  136. package/dist/lifecycle/publish-targets.d.ts.map +1 -0
  137. package/dist/lifecycle/publish-targets.js +85 -0
  138. package/dist/lifecycle/release-cut.d.ts +48 -1
  139. package/dist/lifecycle/release-cut.d.ts.map +1 -1
  140. package/dist/lifecycle/release-cut.js +116 -23
  141. package/dist/lifecycle/release-join.d.ts +95 -0
  142. package/dist/lifecycle/release-join.d.ts.map +1 -0
  143. package/dist/lifecycle/release-join.js +139 -0
  144. package/dist/lifecycle/release-ledger.d.ts +8 -3
  145. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  146. package/dist/lifecycle/release-ledger.js +2 -0
  147. package/dist/lifecycle/release-publish.d.ts +312 -0
  148. package/dist/lifecycle/release-publish.d.ts.map +1 -0
  149. package/dist/lifecycle/release-publish.js +335 -0
  150. package/dist/lifecycle/release-revocation.d.ts +80 -0
  151. package/dist/lifecycle/release-revocation.d.ts.map +1 -0
  152. package/dist/lifecycle/release-revocation.js +123 -0
  153. package/dist/lifecycle/release-store.d.ts +12 -2
  154. package/dist/lifecycle/release-store.d.ts.map +1 -1
  155. package/dist/lifecycle/release-store.js +4 -2
  156. package/dist/lifecycle/release-verify.d.ts +61 -0
  157. package/dist/lifecycle/release-verify.d.ts.map +1 -0
  158. package/dist/lifecycle/release-verify.js +92 -0
  159. package/dist/lifecycle/release-workstation.d.ts +91 -0
  160. package/dist/lifecycle/release-workstation.d.ts.map +1 -0
  161. package/dist/lifecycle/release-workstation.js +180 -0
  162. package/dist/lifecycle/retention-policy.d.ts +45 -0
  163. package/dist/lifecycle/retention-policy.d.ts.map +1 -0
  164. package/dist/lifecycle/retention-policy.js +43 -0
  165. package/dist/lifecycle/retention.d.ts +185 -0
  166. package/dist/lifecycle/retention.d.ts.map +1 -0
  167. package/dist/lifecycle/retention.js +400 -0
  168. package/dist/lifecycle/run-ledger.d.ts +1 -1
  169. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  170. package/dist/lifecycle/run-ledger.js +9 -0
  171. package/dist/op/activities/activity-contracts.d.ts +1 -0
  172. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  173. package/dist/op/activities/activity-contracts.js +1 -0
  174. package/dist/op/activities/shell.d.ts +6 -0
  175. package/dist/op/activities/shell.d.ts.map +1 -1
  176. package/dist/op/activities/shell.js +1 -1
  177. package/dist/op/local-executor.d.ts +23 -1
  178. package/dist/op/local-executor.d.ts.map +1 -1
  179. package/dist/op/local-executor.js +9 -3
  180. package/dist/op/runtime.d.ts +27 -0
  181. package/dist/op/runtime.d.ts.map +1 -1
  182. package/dist/op/runtime.js +20 -0
  183. package/dist/plan-summary.d.ts.map +1 -1
  184. package/dist/plan-summary.js +8 -2
  185. package/dist/pr-forge.d.ts +23 -0
  186. package/dist/pr-forge.d.ts.map +1 -1
  187. package/dist/pr-forge.js +44 -0
  188. package/dist/pr-loop.d.ts +17 -0
  189. package/dist/pr-loop.d.ts.map +1 -1
  190. package/dist/pr-loop.js +30 -4
  191. package/dist/pr-report-url.d.ts +82 -0
  192. package/dist/pr-report-url.d.ts.map +1 -0
  193. package/dist/pr-report-url.js +174 -0
  194. package/dist/provenance.d.ts +2 -2
  195. package/dist/provenance.d.ts.map +1 -1
  196. package/dist/run-event-store.d.ts +29 -2
  197. package/dist/run-event-store.d.ts.map +1 -1
  198. package/dist/run-event-store.js +50 -3
  199. package/dist/run-event-stream.d.ts +4 -3
  200. package/dist/run-event-stream.d.ts.map +1 -1
  201. package/dist/run-event-stream.js +7 -3
  202. package/dist/run-event.d.ts +34 -1
  203. package/dist/run-event.d.ts.map +1 -1
  204. package/dist/run-event.js +4 -0
  205. package/dist/wave-runtime.mjs +260 -229
  206. package/dist/workspace/__fixtures__/flag-workspace.d.ts +31 -0
  207. package/dist/workspace/__fixtures__/flag-workspace.d.ts.map +1 -0
  208. package/dist/workspace/__fixtures__/flag-workspace.js +114 -0
  209. package/dist/workspace/change-set.schema.json +5 -1
  210. package/dist/workspace/check.schema.json +4 -2
  211. package/dist/workspace/checks/records.d.ts +9 -1
  212. package/dist/workspace/checks/records.d.ts.map +1 -1
  213. package/dist/workspace/checks/records.js +35 -1
  214. package/dist/workspace/checks.d.ts +1 -0
  215. package/dist/workspace/checks.d.ts.map +1 -1
  216. package/dist/workspace/checks.js +2 -1
  217. package/dist/workspace/ci-green-forge.d.ts +2 -0
  218. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  219. package/dist/workspace/ci-green.d.ts +10 -0
  220. package/dist/workspace/ci-green.d.ts.map +1 -1
  221. package/dist/workspace/ci-green.js +14 -5
  222. package/dist/workspace/ci-run.d.ts +222 -0
  223. package/dist/workspace/ci-run.d.ts.map +1 -0
  224. package/dist/workspace/ci-run.js +464 -0
  225. package/dist/workspace/ci-serve.d.ts +214 -0
  226. package/dist/workspace/ci-serve.d.ts.map +1 -0
  227. package/dist/workspace/ci-serve.js +412 -0
  228. package/dist/workspace/declaration.d.ts +16 -0
  229. package/dist/workspace/declaration.d.ts.map +1 -1
  230. package/dist/workspace/declaration.js +26 -0
  231. package/dist/workspace/declaration.schema.json +64 -0
  232. package/dist/workspace/declared-kinds.d.ts +16 -0
  233. package/dist/workspace/declared-kinds.d.ts.map +1 -1
  234. package/dist/workspace/declared-kinds.js +25 -0
  235. package/dist/workspace/delivery-metrics.d.ts +91 -0
  236. package/dist/workspace/delivery-metrics.d.ts.map +1 -0
  237. package/dist/workspace/delivery-metrics.js +217 -0
  238. package/dist/workspace/delivery-metrics.schema.json +519 -0
  239. package/dist/workspace/flags-read.d.ts +37 -0
  240. package/dist/workspace/flags-read.d.ts.map +1 -0
  241. package/dist/workspace/flags-read.js +103 -0
  242. package/dist/workspace/flags.d.ts +100 -0
  243. package/dist/workspace/flags.d.ts.map +1 -0
  244. package/dist/workspace/flags.js +98 -0
  245. package/dist/workspace/graph-cli.js +1 -1
  246. package/dist/workspace/intent-cli.d.ts +11 -2
  247. package/dist/workspace/intent-cli.d.ts.map +1 -1
  248. package/dist/workspace/intent-cli.js +54 -5
  249. package/dist/workspace/intent-trace.d.ts +219 -0
  250. package/dist/workspace/intent-trace.d.ts.map +1 -0
  251. package/dist/workspace/intent-trace.js +314 -0
  252. package/dist/workspace/intent.d.ts +30 -6
  253. package/dist/workspace/intent.d.ts.map +1 -1
  254. package/dist/workspace/intent.js +141 -21
  255. package/dist/workspace/intent.schema.json +702 -6
  256. package/dist/workspace/overlap.d.ts +146 -0
  257. package/dist/workspace/overlap.d.ts.map +1 -0
  258. package/dist/workspace/overlap.js +276 -0
  259. package/dist/workspace/pr-report.schema.json +5 -0
  260. package/dist/workspace/reason-codes.d.ts +2 -0
  261. package/dist/workspace/reason-codes.d.ts.map +1 -1
  262. package/dist/workspace/reason-codes.js +3 -0
  263. package/dist/workspace/records.d.ts +15 -2
  264. package/dist/workspace/records.d.ts.map +1 -1
  265. package/dist/workspace/records.js +32 -0
  266. package/dist/workspace/records.schema.json +21 -2
  267. package/dist/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  268. package/dist/workspace/reference-kinds/flag/flag.schema.json +53 -0
  269. package/dist/workspace/releases.d.ts +9 -0
  270. package/dist/workspace/releases.d.ts.map +1 -1
  271. package/dist/workspace/releases.js +9 -0
  272. package/dist/workspace/releases.schema.json +123 -1
  273. package/dist/workspace/run-event.schema.json +24 -6
  274. package/dist/workspace/status-gates.d.ts +8 -0
  275. package/dist/workspace/status-gates.d.ts.map +1 -1
  276. package/dist/workspace/status-stewards.d.ts +2 -0
  277. package/dist/workspace/status-stewards.d.ts.map +1 -1
  278. package/dist/workspace/status-stewards.js +1 -0
  279. package/dist/workspace/status.d.ts +78 -0
  280. package/dist/workspace/status.d.ts.map +1 -1
  281. package/dist/workspace/status.js +170 -3
  282. package/dist/workspace/status.schema.json +210 -2
  283. package/dist/workspace/wip.d.ts.map +1 -1
  284. package/dist/workspace/wip.js +11 -3
  285. package/package.json +1 -1
  286. package/src/build-params.test.ts +46 -0
  287. package/src/build-params.ts +55 -1
  288. package/src/change-set-graph.ts +10 -2
  289. package/src/change-set.ts +14 -3
  290. package/src/cli/build-params-cli.ts +22 -9
  291. package/src/cli/commands/build.ts +6 -3
  292. package/src/cli/handlers/approve-release.test.ts +5 -1
  293. package/src/cli/handlers/approve-revoked.test.ts +155 -0
  294. package/src/cli/handlers/approve.ts +47 -0
  295. package/src/cli/handlers/build.test.ts +30 -0
  296. package/src/cli/handlers/build.ts +20 -4
  297. package/src/cli/handlers/fan-out.test.ts +262 -1
  298. package/src/cli/handlers/fan-out.ts +72 -8
  299. package/src/cli/handlers/intent-trace.e2e.test.ts +201 -0
  300. package/src/cli/handlers/lifecycle-gc.test.ts +126 -0
  301. package/src/cli/handlers/lifecycle-gc.ts +146 -0
  302. package/src/cli/handlers/pr.test.ts +148 -1
  303. package/src/cli/handlers/pr.ts +144 -28
  304. package/src/cli/handlers/promote.test.ts +280 -2
  305. package/src/cli/handlers/promote.ts +210 -34
  306. package/src/cli/handlers/release-implicit.e2e.test.ts +12 -4
  307. package/src/cli/handlers/release-join.e2e.test.ts +185 -0
  308. package/src/cli/handlers/release-publish-targets.e2e.test.ts +295 -0
  309. package/src/cli/handlers/release-verify.e2e.test.ts +117 -0
  310. package/src/cli/handlers/release-workstation-ci.e2e.test.ts +135 -0
  311. package/src/cli/handlers/release.e2e.test.ts +146 -32
  312. package/src/cli/handlers/release.ts +415 -28
  313. package/src/cli/handlers/run-auto-release.test.ts +9 -0
  314. package/src/cli/handlers/run-release.test.ts +55 -0
  315. package/src/cli/handlers/run.ts +69 -5
  316. package/src/cli/main.test.ts +1 -0
  317. package/src/cli/main.ts +91 -10
  318. package/src/cli/parse-args.ts +54 -2
  319. package/src/cli/registry.ts +32 -4
  320. package/src/cli/run-events.ts +5 -2
  321. package/src/components/auto-release.test.ts +9 -0
  322. package/src/components/auto-release.ts +3 -0
  323. package/src/components/capability.ts +9 -0
  324. package/src/components/driver.test.ts +24 -0
  325. package/src/components/driver.ts +36 -0
  326. package/src/components/fan-out-inputs.test.ts +85 -0
  327. package/src/components/fan-out-inputs.ts +192 -0
  328. package/src/components/fan-out-record.test.ts +10 -0
  329. package/src/components/fan-out-record.ts +19 -0
  330. package/src/components/fan-out-run.ts +48 -0
  331. package/src/components/fan-out.ts +4 -0
  332. package/src/components/pr-pipeline.ts +67 -4
  333. package/src/components/pr-run.test.ts +127 -0
  334. package/src/components/pr-run.ts +32 -12
  335. package/src/components/promote.ts +68 -2
  336. package/src/components/release-compile.ts +17 -3
  337. package/src/components/release-gate.ts +18 -4
  338. package/src/components/wave-plan.ts +45 -2
  339. package/src/config.ts +8 -0
  340. package/src/flag-params.test.ts +144 -0
  341. package/src/flag-params.ts +134 -0
  342. package/src/lifecycle/__fixtures__/publish-fakes.ts +351 -0
  343. package/src/lifecycle/change-set-store.ts +2 -1
  344. package/src/lifecycle/delivery-metrics.ts +263 -0
  345. package/src/lifecycle/deploy-outcome.ts +147 -0
  346. package/src/lifecycle/gate-change-set.ts +37 -6
  347. package/src/lifecycle/gate-ledger.ts +2 -2
  348. package/src/lifecycle/git.ts +61 -8
  349. package/src/lifecycle/index.ts +4 -0
  350. package/src/lifecycle/mixed-environment.test.ts +97 -0
  351. package/src/lifecycle/mixed-environment.ts +204 -0
  352. package/src/lifecycle/publish-attachments.ts +196 -0
  353. package/src/lifecycle/publish-credentials.ts +84 -0
  354. package/src/lifecycle/publish-declaration.ts +95 -0
  355. package/src/lifecycle/publish-forge.ts +325 -0
  356. package/src/lifecycle/publish-npm.ts +259 -0
  357. package/src/lifecycle/publish-oci.ts +396 -0
  358. package/src/lifecycle/publish-record.ts +113 -0
  359. package/src/lifecycle/publish-resume.test.ts +168 -0
  360. package/src/lifecycle/publish-targets.test.ts +494 -0
  361. package/src/lifecycle/publish-targets.ts +100 -0
  362. package/src/lifecycle/release-cut.test.ts +74 -2
  363. package/src/lifecycle/release-cut.ts +158 -22
  364. package/src/lifecycle/release-flag.test.ts +112 -0
  365. package/src/lifecycle/release-join.test.ts +68 -0
  366. package/src/lifecycle/release-join.ts +182 -0
  367. package/src/lifecycle/release-ledger.ts +9 -3
  368. package/src/lifecycle/release-publish.test.ts +225 -0
  369. package/src/lifecycle/release-publish.ts +568 -0
  370. package/src/lifecycle/release-revocation.ts +147 -0
  371. package/src/lifecycle/release-store.ts +15 -4
  372. package/src/lifecycle/release-verify.test.ts +110 -0
  373. package/src/lifecycle/release-verify.ts +120 -0
  374. package/src/lifecycle/release-workstation.test.ts +204 -0
  375. package/src/lifecycle/release-workstation.ts +216 -0
  376. package/src/lifecycle/retention-growth.e2e.test.ts +279 -0
  377. package/src/lifecycle/retention-policy.ts +63 -0
  378. package/src/lifecycle/retention.test.ts +363 -0
  379. package/src/lifecycle/retention.ts +508 -0
  380. package/src/lifecycle/run-ledger.ts +7 -1
  381. package/src/op/activities/activity-contracts.ts +1 -0
  382. package/src/op/activities/shell.ts +7 -1
  383. package/src/op/local-executor.ts +27 -4
  384. package/src/op/runtime.ts +42 -0
  385. package/src/plan-summary.test.ts +20 -0
  386. package/src/plan-summary.ts +8 -1
  387. package/src/pr-forge.test.ts +25 -0
  388. package/src/pr-forge.ts +62 -0
  389. package/src/pr-loop.test.ts +13 -1
  390. package/src/pr-loop.ts +41 -4
  391. package/src/pr-report-url.test.ts +131 -0
  392. package/src/pr-report-url.ts +209 -0
  393. package/src/provenance.ts +2 -2
  394. package/src/run-event-store.ts +63 -3
  395. package/src/run-event-stream.ts +8 -4
  396. package/src/run-event.ts +38 -1
  397. package/src/workspace/__fixtures__/flag-workspace.ts +132 -0
  398. package/src/workspace/__fixtures__/older-records/change-set-984534ea9.json +100 -0
  399. package/src/workspace/__fixtures__/older-records/older-records.json +326 -0
  400. package/src/workspace/change-set.schema.json +5 -1
  401. package/src/workspace/check.schema.json +4 -2
  402. package/src/workspace/checks/records.ts +35 -1
  403. package/src/workspace/checks.ts +2 -1
  404. package/src/workspace/ci-green-forge.ts +2 -0
  405. package/src/workspace/ci-green.ts +20 -5
  406. package/src/workspace/ci-run.test.ts +416 -0
  407. package/src/workspace/ci-run.ts +571 -0
  408. package/src/workspace/ci-serve.test.ts +268 -0
  409. package/src/workspace/ci-serve.ts +521 -0
  410. package/src/workspace/declaration.schema.json +64 -0
  411. package/src/workspace/declaration.test.ts +28 -0
  412. package/src/workspace/declaration.ts +38 -0
  413. package/src/workspace/declared-kinds.ts +40 -1
  414. package/src/workspace/delivery-metrics.schema.json +519 -0
  415. package/src/workspace/delivery-metrics.test.ts +236 -0
  416. package/src/workspace/delivery-metrics.ts +286 -0
  417. package/src/workspace/flags-read.ts +121 -0
  418. package/src/workspace/flags.test.ts +141 -0
  419. package/src/workspace/flags.ts +157 -0
  420. package/src/workspace/graph-cli.ts +1 -1
  421. package/src/workspace/intent-cli.ts +46 -5
  422. package/src/workspace/intent-trace.test.ts +173 -0
  423. package/src/workspace/intent-trace.ts +484 -0
  424. package/src/workspace/intent.schema.json +702 -6
  425. package/src/workspace/intent.ts +148 -25
  426. package/src/workspace/older-records.test.ts +412 -0
  427. package/src/workspace/overlap.test.ts +165 -0
  428. package/src/workspace/overlap.ts +340 -0
  429. package/src/workspace/pr-report.schema.json +5 -0
  430. package/src/workspace/read-contract.e2e.test.ts +2 -1
  431. package/src/workspace/reason-codes.test.ts +5 -0
  432. package/src/workspace/reason-codes.ts +3 -0
  433. package/src/workspace/record-assets.test.ts +2 -1
  434. package/src/workspace/records-contract.e2e.test.ts +2 -1
  435. package/src/workspace/records.schema.json +21 -2
  436. package/src/workspace/records.ts +36 -2
  437. package/src/workspace/reference-kinds/flag/flag.kind.mjs +32 -0
  438. package/src/workspace/reference-kinds/flag/flag.schema.json +53 -0
  439. package/src/workspace/releases.schema.json +123 -1
  440. package/src/workspace/releases.ts +11 -0
  441. package/src/workspace/run-event.schema.json +24 -6
  442. package/src/workspace/status-contract.test.ts +29 -0
  443. package/src/workspace/status-gates.ts +8 -0
  444. package/src/workspace/status-mixed.test.ts +152 -0
  445. package/src/workspace/status-revoked.test.ts +153 -0
  446. package/src/workspace/status-stewards.ts +3 -0
  447. package/src/workspace/status.schema.json +210 -2
  448. package/src/workspace/status.ts +254 -3
  449. package/src/workspace/wip.ts +11 -2
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Feature flags as workspace records (#4024, decided in #4016).
3
+ *
4
+ * A flag is a record of a kind with a `flag` block (`records.ts`). It names a
5
+ * member, one of that member's declared build-time parameters, an owner, the
6
+ * work item the flag hides and a value per environment. The member's build
7
+ * reads it as that parameter (`../flag-params.ts`), so turning a flag on in
8
+ * an environment is a commit that changes the record, and the release cut
9
+ * from that commit carries the new value as a `params` entry whose `source`
10
+ * is `flag:<id>` (ws-104).
11
+ *
12
+ * This module and `./flags-read.ts` do three things:
13
+ *
14
+ * - {@link applyFlags}: on a `records` read of a flag kind, gives each record
15
+ * its work item with that item's state, the decisions the item implements,
16
+ * and whether the flag is due for removal, with the warnings
17
+ * `flag-work-unknown` and `flag-stale`.
18
+ * - `readWorkspaceFlags` (`./flags-read.ts`): every flag of every flag kind
19
+ * the declaration names, for `workspace status` (`featureFlags`) and the
20
+ * build.
21
+ * - `memberFlagBindings` (`./flags-read.ts`): the flags of the member holding
22
+ * a directory, by parameter, for one environment.
23
+ *
24
+ * The readers live apart so that `records.ts`, which loads this module for a
25
+ * flag kind, never reaches `records-cli.ts` and what it imports.
26
+ *
27
+ * A flag is due for removal when its work item implements at least one
28
+ * decision and every decision it implements is confirmed: in one of its
29
+ * kind's closed states and superseded by nothing. For chant's decision kind
30
+ * that is `ratified` (a superseded decision has a superseder). The work is
31
+ * then settled, and the flag that hid it is dead weight.
32
+ */
33
+ import { type LoadedRecordKind, type ReadRecordsOptions, type RecordEntry } from "./records.js";
34
+ import type { WorkLink } from "./work.js";
35
+ /** Why a flag record carries a warning. Closed, like the record warning codes. */
36
+ export declare const FLAG_WARNING_CODES: readonly ["flag-work-unknown", "flag-stale"];
37
+ export type FlagWarningCode = (typeof FLAG_WARNING_CODES)[number];
38
+ /** A flag's value in one environment: what a build-time parameter can hold. */
39
+ export type FlagValue = string | number | boolean;
40
+ /** A decision a flag's work item implements, with whether it is confirmed. */
41
+ export interface FlagDecision extends WorkLink {
42
+ /** In one of its kind's closed states and superseded by nothing. */
43
+ confirmed: boolean;
44
+ }
45
+ /** What a read of a flag kind adds to each record (#4024). */
46
+ export interface FlagState {
47
+ /** The work item the flag hides, with its state, or null when the record names none. The state is null when no record has the id. */
48
+ work: WorkLink | null;
49
+ /** Each decision the work item implements, with its state. Empty when the item is unknown or implements none. */
50
+ implements: FlagDecision[];
51
+ /** True when the work item implements at least one decision and every one is confirmed: the flag is due for removal. */
52
+ stale: boolean;
53
+ }
54
+ /** A flag as `workspace status` and the build read it. */
55
+ export interface WorkspaceFlag {
56
+ /** The flag's name, its record's id. */
57
+ id: string;
58
+ /** The kind file from the workspace root. */
59
+ kind: string;
60
+ /** The record file from the workspace root, with / separators. */
61
+ path: string;
62
+ member: string;
63
+ param: string;
64
+ owner: string;
65
+ /** The value per environment, as the record writes it, in key order. */
66
+ values: Record<string, FlagValue>;
67
+ work: WorkLink | null;
68
+ implements: FlagDecision[];
69
+ stale: boolean;
70
+ }
71
+ /** A flag record that is not valid, so no build trusts it. */
72
+ export interface InvalidFlag {
73
+ kind: string;
74
+ path: string;
75
+ /** The member the record names, or null when it names none that can be read. */
76
+ member: string | null;
77
+ message: string;
78
+ }
79
+ /** Every flag a workspace's declared flag kinds hold. */
80
+ export interface WorkspaceFlags {
81
+ flags: WorkspaceFlag[];
82
+ invalid: InvalidFlag[];
83
+ }
84
+ /**
85
+ * Whether a decision is confirmed: in one of its kind's `closed` states and
86
+ * superseded by nothing. An unknown decision is not. The overlap report
87
+ * (#4025) shares it: a work item is in flight while any decision it
88
+ * implements is not confirmed.
89
+ */
90
+ export declare function decisionConfirmed(decision: {
91
+ state: string | null;
92
+ supersededBy: string | null;
93
+ } | undefined, closed: ReadonlySet<string>): boolean;
94
+ /**
95
+ * Give each record of a flag kind its {@link FlagState} and warnings, in
96
+ * place. Throws a `RecordReadError` when the work kind it names can't be read
97
+ * or is not a work kind.
98
+ */
99
+ export declare function applyFlags(loaded: LoadedRecordKind, entries: RecordEntry[], options: ReadRecordsOptions): Promise<void>;
100
+ //# sourceMappingURL=flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/workspace/flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,EAAgD,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAC3I,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,8CAKW,CAAC;AAC3C,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,8EAA8E;AAC9E,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,8DAA8D;AAC9D,MAAM,WAAW,SAAS;IACxB,qIAAqI;IACrI,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,iHAAiH;IACjH,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,wHAAwH;IACxH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAEnJ;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC7H"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Feature flags as workspace records (#4024, decided in #4016).
3
+ *
4
+ * A flag is a record of a kind with a `flag` block (`records.ts`). It names a
5
+ * member, one of that member's declared build-time parameters, an owner, the
6
+ * work item the flag hides and a value per environment. The member's build
7
+ * reads it as that parameter (`../flag-params.ts`), so turning a flag on in
8
+ * an environment is a commit that changes the record, and the release cut
9
+ * from that commit carries the new value as a `params` entry whose `source`
10
+ * is `flag:<id>` (ws-104).
11
+ *
12
+ * This module and `./flags-read.ts` do three things:
13
+ *
14
+ * - {@link applyFlags}: on a `records` read of a flag kind, gives each record
15
+ * its work item with that item's state, the decisions the item implements,
16
+ * and whether the flag is due for removal, with the warnings
17
+ * `flag-work-unknown` and `flag-stale`.
18
+ * - `readWorkspaceFlags` (`./flags-read.ts`): every flag of every flag kind
19
+ * the declaration names, for `workspace status` (`featureFlags`) and the
20
+ * build.
21
+ * - `memberFlagBindings` (`./flags-read.ts`): the flags of the member holding
22
+ * a directory, by parameter, for one environment.
23
+ *
24
+ * The readers live apart so that `records.ts`, which loads this module for a
25
+ * flag kind, never reaches `records-cli.ts` and what it imports.
26
+ *
27
+ * A flag is due for removal when its work item implements at least one
28
+ * decision and every decision it implements is confirmed: in one of its
29
+ * kind's closed states and superseded by nothing. For chant's decision kind
30
+ * that is `ratified` (a superseded decision has a superseder). The work is
31
+ * then settled, and the flag that hid it is dead weight.
32
+ */
33
+ import { dirname } from "node:path";
34
+ import { loadRecordKind, readRecords, RecordReadError } from "./records.js";
35
+ /** Why a flag record carries a warning. Closed, like the record warning codes. */
36
+ export const FLAG_WARNING_CODES = [
37
+ /** The flag names a work item no record of its kind's work kind has. */
38
+ "flag-work-unknown",
39
+ /** Every decision the flag's work item implements is confirmed, so the flag is due for removal. `check` reports it (WSP118). */
40
+ "flag-stale",
41
+ ];
42
+ const str = (v) => (typeof v === "string" && v !== "" ? v : null);
43
+ /**
44
+ * Whether a decision is confirmed: in one of its kind's `closed` states and
45
+ * superseded by nothing. An unknown decision is not. The overlap report
46
+ * (#4025) shares it: a work item is in flight while any decision it
47
+ * implements is not confirmed.
48
+ */
49
+ export function decisionConfirmed(decision, closed) {
50
+ return decision !== undefined && decision.state !== null && closed.has(decision.state) && decision.supersededBy === null;
51
+ }
52
+ /**
53
+ * Give each record of a flag kind its {@link FlagState} and warnings, in
54
+ * place. Throws a `RecordReadError` when the work kind it names can't be read
55
+ * or is not a work kind.
56
+ */
57
+ export async function applyFlags(loaded, entries, options) {
58
+ const flag = loaded.kind.flag;
59
+ const workKind = await loadRecordKind(flag.work.kind, dirname(loaded.file));
60
+ if (!workKind.kind.work) {
61
+ throw new RecordReadError("kind-invalid", `flag kind ${loaded.kind.name} names ${flag.work.kind} as its work kind, and that kind has no work block`);
62
+ }
63
+ const decisionKind = await loadRecordKind(workKind.kind.work.decisions, dirname(workKind.file));
64
+ const read = await readRecords(workKind, { root: options.root, source: options.source });
65
+ const items = new Map();
66
+ for (const r of read.records)
67
+ if (r.id !== null && !items.has(r.id))
68
+ items.set(r.id, r);
69
+ const decisions = new Map((read.decisions ?? []).map((d) => [d.id, d]));
70
+ const closed = new Set(decisionKind.kind.closedStates ?? []);
71
+ for (const e of entries) {
72
+ if (e.data === null)
73
+ continue;
74
+ const named = str(e.data[flag.work.field]);
75
+ if (named === null) {
76
+ e.flag = { work: null, implements: [], stale: false };
77
+ continue;
78
+ }
79
+ const item = items.get(named);
80
+ if (!item) {
81
+ e.flag = { work: { id: named, state: null }, implements: [], stale: false };
82
+ e.warnings.push({ code: "flag-work-unknown", message: `hides the work item ${named}, which no record in ${flag.work.kind} has` });
83
+ continue;
84
+ }
85
+ const implementsList = (item.implements ?? []).map((d) => {
86
+ const decision = decisions.get(d.id);
87
+ return { ...d, confirmed: decisionConfirmed(decision, closed) };
88
+ });
89
+ const stale = implementsList.length > 0 && implementsList.every((d) => d.confirmed);
90
+ e.flag = { work: { id: named, state: item.state }, implements: implementsList, stale };
91
+ if (stale) {
92
+ e.warnings.push({
93
+ code: "flag-stale",
94
+ message: `is due for removal: its work item ${named} implements ${implementsList.map((d) => `${d.id} (${d.state})`).join(", ")}, and every one is confirmed`,
95
+ });
96
+ }
97
+ }
98
+ }
@@ -51,7 +51,7 @@ export const GRAPH_OUTPUT_SCHEMA_ID = "https://intentius.io/chant/schemas/worksp
51
51
  export const GRAPH_ERROR_CODES = [...WORKSPACE_ERROR_CODES, "live-at-revision"];
52
52
  /** Why `--live` and `--at` don't go together (#2875). */
53
53
  const LIVE_AT_REVISION = "--live reads the account as it stands now, and --at reads the source at a revision; chant workspace graph takes one of them";
54
- const USAGE = "chant workspace graph [dir] [--at <rev>] [--member <name>] [--kind <kind file>] [-o <file>] [--env <env>] [--live [--overlay] [--traffic <level>]] [--no-cache] [--dry-run] | chant workspace graph --composites [--at <rev>] [--member <name>] [-o <file>] | chant workspace graph --intent <path[:start-end]|path#symbol> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]";
54
+ const USAGE = "chant workspace graph [dir] [--at <rev>] [--member <name>] [--kind <kind file>] [-o <file>] [--env <env>] [--live [--overlay] [--traffic <level>]] [--no-cache] [--dry-run] | chant workspace graph --composites [--at <rev>] [--member <name>] [-o <file>] | chant workspace graph --intent <path[:start-end]|path#symbol|member/node|sha> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]";
55
55
  /** The command line a member runs for its component graph (#2662). */
56
56
  export function componentGraphArgv(args) {
57
57
  return ["graph", ".", "--components", "--format", "ir", ...(args.env ? ["--env", args.env] : [])];
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `chant workspace graph --intent <path[:start-end]|path#symbol> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]`
2
+ * `chant workspace graph --intent <path[:start-end]|path#symbol|member/node|sha> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]`
3
3
  * (#2651, #3034): the intent graph over one region (`intent.ts`), printed as JSON
4
4
  * with `--json` or as a walk, one line per node, in the order of #2650
5
5
  * section B: the region, its decisions, their artifacts, the commits, and the
@@ -7,10 +7,13 @@
7
7
  * the decisions governing it, most relevant first. Under each decision come the commits made inside its window, and
8
8
  * when any of them is not the decision's own work, the question #2650 B puts
9
9
  * to the person about it (#2656). Without `--kind`, the walk reads every
10
- * record kind the declaration names (#2680).
10
+ * record kind the declaration names (#2680). Last comes the why chain (#4023):
11
+ * each commit's work item, ci tag and release, and each release's gates and
12
+ * deploys.
11
13
  */
12
14
  import type { CommandContext } from "../cli/registry.js";
13
15
  import { type IntentRecordDocument } from "./intent-record.js";
16
+ import type { IntentTrace } from "./intent-trace.js";
14
17
  import { type IntentDocument, type WhyAnswer } from "./intent.js";
15
18
  type Result = Exclude<IntentDocument, {
16
19
  error: unknown;
@@ -22,6 +25,12 @@ type RecordResult = Exclude<IntentRecordDocument, {
22
25
  export declare const IN_WINDOW_QUESTION = "is this drift, a superseding decision nobody wrote down, or the decision being wrong?";
23
26
  /** Why the region is like this (#3034): the decisions most relevant first, then who made each span of its current lines, then the gaps. */
24
27
  export declare function whyLines(doc: Result, why: WhyAnswer): string[];
28
+ /**
29
+ * The why chain (#4023), in its order: for each commit that names a work item
30
+ * or was tagged, released or deployed, a line; then each release with its
31
+ * cuts, gates and deploys, and the deploys of no release.
32
+ */
33
+ export declare function traceLines(trace: IntentTrace): string[];
25
34
  /** The walk as text, one line each, in the order of #2650 section B. */
26
35
  export declare function formatIntent(doc: Result): string;
27
36
  /** The record walk as text: the record, its window, then each commit with its bucket, and the counts. */
@@ -1 +1 @@
1
- {"version":3,"file":"intent-cli.d.ts","sourceRoot":"","sources":["../../src/workspace/intent-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAgB,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAsE,KAAK,cAAc,EAAkD,KAAK,SAAS,EAAiB,MAAM,UAAU,CAAC;AAKlM,KAAK,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAC1D,KAAK,YAAY,GAAG,OAAO,CAAC,oBAAoB,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAYtE,gIAAgI;AAChI,eAAO,MAAM,kBAAkB,0FAA0F,CAAC;AAwG1H,2IAA2I;AAC3I,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,EAAE,CAsB9D;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA6BhD;AAED,yGAAyG;AACzG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAwB5D;AAcD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB1F"}
1
+ {"version":3,"file":"intent-cli.d.ts","sourceRoot":"","sources":["../../src/workspace/intent-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAgB,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAsE,KAAK,cAAc,EAAkD,KAAK,SAAS,EAAiB,MAAM,UAAU,CAAC;AAKlM,KAAK,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAC1D,KAAK,YAAY,GAAG,OAAO,CAAC,oBAAoB,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAYtE,gIAAgI;AAChI,eAAO,MAAM,kBAAkB,0FAA0F,CAAC;AAwG1H,2IAA2I;AAC3I,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,EAAE,CAsB9D;AAKD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CA0BvD;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA+BhD;AAED,yGAAyG;AACzG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAwB5D;AAcD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB1F"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `chant workspace graph --intent <path[:start-end]|path#symbol> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]`
2
+ * `chant workspace graph --intent <path[:start-end]|path#symbol|member/node|sha> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]`
3
3
  * (#2651, #3034): the intent graph over one region (`intent.ts`), printed as JSON
4
4
  * with `--json` or as a walk, one line per node, in the order of #2650
5
5
  * section B: the region, its decisions, their artifacts, the commits, and the
@@ -7,13 +7,15 @@
7
7
  * the decisions governing it, most relevant first. Under each decision come the commits made inside its window, and
8
8
  * when any of them is not the decision's own work, the question #2650 B puts
9
9
  * to the person about it (#2656). Without `--kind`, the walk reads every
10
- * record kind the declaration names (#2680).
10
+ * record kind the declaration names (#2680). Last comes the why chain (#4023):
11
+ * each commit's work item, ci tag and release, and each release's gates and
12
+ * deploys.
11
13
  */
12
14
  import { resolve } from "node:path";
13
15
  import { formatError } from "../cli/format.js";
14
16
  import { intentRecord } from "./intent-record.js";
15
17
  import { intentGraph } from "./intent.js";
16
- const USAGE = "chant workspace graph --intent <path[:start-end]|path#symbol> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]";
18
+ const USAGE = "chant workspace graph --intent <path[:start-end]|path#symbol|member/node|sha> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]";
17
19
  const RECORD_USAGE = "chant workspace graph --intent --record <id> [--at <rev>] [--kind <kind file>...] [--follow-squash] [--json]";
18
20
  function edgesFrom(doc, from, kind) {
19
21
  return doc.edges.filter((e) => e.from === from && e.kind === kind);
@@ -157,6 +159,48 @@ export function whyLines(doc, why) {
157
159
  out.push(` gap ${g.code}: ${g.message}${g.lines ? ` (lines ${g.lines.map(span).join(", ")})` : ""}`);
158
160
  return out;
159
161
  }
162
+ const gateLabel = (g) => `${g.op}/${g.gate}${g.environment ? ` ${g.environment}` : ""}: ${g.empty ? "passed over an empty change set" : `${g.resolvedBy}${g.relayedBy ? ` relayed by ${g.relayedBy}` : ""}`}${g.channel ? ` on ${g.channel}` : ""} at ${g.at}${g.planDigest ? `, plan ${g.planDigest.slice(0, 24)}${g.changeSet ? " (change set stored)" : ""}` : ""}${g.sealed ? ", sealed" : ""}`;
163
+ /**
164
+ * The why chain (#4023), in its order: for each commit that names a work item
165
+ * or was tagged, released or deployed, a line; then each release with its
166
+ * cuts, gates and deploys, and the deploys of no release.
167
+ */
168
+ export function traceLines(trace) {
169
+ const out = [];
170
+ const label = (digest) => trace.releases.find((r) => r.releaseDigest === digest)?.label ?? digest.slice(0, 24);
171
+ for (const c of trace.commits) {
172
+ const parts = [];
173
+ if (c.work && c.work.state !== "unlinked")
174
+ parts.push(c.work.state === "linked" ? `work ${c.work.items.map((w) => `${w.id} (${w.source.field})`).join(", ") || "by a lease not checked"}` : `work ${c.work.state}`);
175
+ if (c.windowMatches.length > 0)
176
+ parts.push(`in the window of ${c.windowMatches.map((w) => w.id).join(", ")}`);
177
+ if (c.tag.state !== "none")
178
+ parts.push(c.tag.state);
179
+ for (const r of c.releases)
180
+ parts.push(`${r.link === "cut-from" ? "released as" : "shipped in"} ${label(r.release)}`);
181
+ for (const d of c.deploys)
182
+ parts.push(`${d.env} since ${trace.deploys.find((x) => x.id === d.deploy)?.timestamp ?? "?"}`);
183
+ if (parts.length > 0)
184
+ out.push(`trace ${short(c.sha)} ${parts.join("; ")}`);
185
+ }
186
+ for (const r of trace.releases) {
187
+ const cut = r.cuts[0];
188
+ out.push(`release ${r.label ?? r.releaseDigest.slice(0, 24)} from ${short(r.commit)}, ${r.tag.state}${cut ? `; cut by ${cut.actor} at ${cut.timestamp}${cut.signed ? ", signed" : ""}` : ""}`);
189
+ for (const g of r.gates)
190
+ out.push(` gate ${gateLabel(g)}`);
191
+ for (const id of r.deploys) {
192
+ const d = trace.deploys.find((x) => x.id === id);
193
+ if (d)
194
+ out.push(` deploy ${d.env} ${d.component} at ${d.timestamp} by ${d.actor}${d.admittedBy ? `, admitted by ${d.admittedBy.op}/${d.admittedBy.gate} (${d.admittedBy.resolvedBy})` : ""}`);
195
+ }
196
+ }
197
+ for (const d of trace.deploys.filter((x) => x.release === null)) {
198
+ out.push(`deploy ${d.env} ${d.component} at ${d.timestamp} by ${d.actor} from ${short(d.gitSha)}, no release${d.admittedBy ? `; admitted by ${gateLabel(d.admittedBy)}` : ""}${d.plan ? `; plan ${d.plan.document.digest.slice(0, 24)}` : ""}`);
199
+ }
200
+ for (const x of trace.reasons)
201
+ out.push(`reason ${x.code}: ${x.message}`);
202
+ return out;
203
+ }
160
204
  /** The walk as text, one line each, in the order of #2650 section B. */
161
205
  export function formatIntent(doc) {
162
206
  const out = [];
@@ -165,7 +209,10 @@ export function formatIntent(doc) {
165
209
  const lines = region.lines ? `:${region.lines.start}${region.lines.end === region.lines.start ? "" : `-${region.lines.end}`}` : "";
166
210
  const where = doc.at ? `at ${short(doc.at)}` : "in the working tree";
167
211
  const symbol = region.symbol ? `#${region.symbol.name} (${region.symbol.kind} ${region.symbol.qualified}, lines ${region.lines ? span(region.lines) : "none"})` : lines;
168
- out.push(`region ${region.path}${symbol} (${region.type}, member ${region.member ?? "none"}${region.generated ? ", generated" : ""}) ${where}${region.node ? `, from node ${region.node}` : ""}`);
212
+ if (region.commit)
213
+ out.push(`region commit ${short(region.commit)} (member ${region.member ?? "none"}) ${doc.at ? `at ${short(doc.at)}` : "in the working tree"}`);
214
+ else
215
+ out.push(`region ${region.path}${symbol} (${region.type}, member ${region.member ?? "none"}${region.generated ? ", generated" : ""}) ${where}${region.node ? `, from node ${region.node}` : ""}`);
169
216
  }
170
217
  const files = ofKind(doc, "file");
171
218
  if (files.length > 0)
@@ -190,6 +237,8 @@ export function formatIntent(doc) {
190
237
  out.push(`reason ${r.code}: ${r.message}`);
191
238
  if (doc.why)
192
239
  out.push(...whyLines(doc, doc.why));
240
+ if (doc.trace)
241
+ out.push(...traceLines(doc.trace));
193
242
  const kinds = doc.kinds.length === 0 ? "; no --kind, so no decisions were read" : "";
194
243
  const work = ofKind(doc, "work").length;
195
244
  out.push(`${doc.summary.commits} commits, ${doc.summary.decisions} decisions, ${work > 0 ? `${work} work ${work === 1 ? "item" : "items"}, ` : ""}${doc.summary.artifacts} artifacts, ${doc.summary.findings} findings${kinds}`);
@@ -245,7 +294,7 @@ export async function runWorkspaceIntent(ctx, cwd) {
245
294
  return runRecord(ctx, cwd, args.kinds ?? (args.kind !== undefined ? [args.kind] : undefined));
246
295
  }
247
296
  if (!args.intent) {
248
- console.error(formatError({ message: "--intent needs a region: a path, path:line, path:start-end or path#symbol", hint: USAGE }));
297
+ console.error(formatError({ message: "--intent needs a region: a path, path:line, path:start-end, path#symbol, a graph node id or a commit sha", hint: USAGE }));
249
298
  return 1;
250
299
  }
251
300
  // No --kind: undefined, so the walk reads the kinds the declaration names (#2680).
@@ -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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"}