@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,180 @@
1
+ /**
2
+ * Cutting a release from a workstation as from CI (#4027).
3
+ *
4
+ * `chant release cut` runs the same steps wherever it runs. What differs
5
+ * between a laptop and a CI job is read here, from git and the process
6
+ * environment, so the CLI and its tests resolve it the same way:
7
+ *
8
+ * - trunk: the branch `ci.green.branch` names in the declaration at base,
9
+ * else the branch `origin/HEAD` points at, else `main`. The commit must be
10
+ * reachable from `origin/<branch>` as this clone last fetched it, so a
11
+ * commit that is on the local branch only is refused as not pushed. Nothing
12
+ * is fetched: a stale `origin/<branch>` can only refuse a commit that was
13
+ * pushed since, never admit one that wasn't.
14
+ * - a clean tree: no tracked change and no untracked file that git does not
15
+ * ignore, since the compile reads the directory and a new
16
+ * `*.component.ts` would be compiled into the release.
17
+ * - the actor: `--actor`, else the principal the signers file at base lists
18
+ * for the signing key, else the CI's actor, else git's `user.email`, else
19
+ * `$USER`.
20
+ * - the tag: `release/<label>`, or `release/<member>/<label>` in a workspace
21
+ * member, an annotated tag on the commit that is created locally and never
22
+ * pushed by chant.
23
+ */
24
+ import { execFileSync, spawnSync } from "node:child_process";
25
+ import { existsSync, readFileSync } from "node:fs";
26
+ /** A refusal before anything is compiled or written. */
27
+ export class WorkstationCheckError extends Error {
28
+ constructor(code, message, fix) {
29
+ super(message);
30
+ this.code = code;
31
+ this.fix = fix;
32
+ this.name = "WorkstationCheckError";
33
+ }
34
+ }
35
+ function tryGit(cwd, args) {
36
+ try {
37
+ return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] }).trim();
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ const isAncestor = (cwd, a, b) => spawnSync("git", ["merge-base", "--is-ancestor", a, b], { cwd, stdio: "ignore" }).status === 0;
44
+ /** The remote a release's commit must be pushed to. */
45
+ export const RELEASE_REMOTE = "origin";
46
+ /** The trunk of the repository at `cwd`: `ci.green.branch` when declared, else what `origin/HEAD` names, else `main`. */
47
+ export function resolveTrunk(cwd, greenBranch) {
48
+ if (greenBranch)
49
+ return { remote: RELEASE_REMOTE, branch: greenBranch, from: "ci.green.branch" };
50
+ const head = tryGit(cwd, ["symbolic-ref", "--quiet", `refs/remotes/${RELEASE_REMOTE}/HEAD`]);
51
+ const prefix = `refs/remotes/${RELEASE_REMOTE}/`;
52
+ if (head?.startsWith(prefix))
53
+ return { remote: RELEASE_REMOTE, branch: head.slice(prefix.length), from: "origin/HEAD" };
54
+ return { remote: RELEASE_REMOTE, branch: "main", from: "default" };
55
+ }
56
+ /**
57
+ * Refuse `commit` unless it is reachable from `<remote>/<branch>` as this
58
+ * clone knows it. A commit on the local branch only is `release-commit-not-pushed`;
59
+ * any other is `release-commit-not-on-trunk`.
60
+ */
61
+ export function checkOnTrunk(cwd, commit, trunk) {
62
+ const remoteRef = `refs/remotes/${trunk.remote}/${trunk.branch}`;
63
+ const short = commit.slice(0, 12);
64
+ const named = `${trunk.remote}/${trunk.branch}`;
65
+ const why = trunk.from === "ci.green.branch" ? " (the branch ci.green names)" : trunk.from === "origin/HEAD" ? ` (the branch ${trunk.remote}/HEAD names)` : "";
66
+ const remoteTip = tryGit(cwd, ["rev-parse", "--verify", "--quiet", `${remoteRef}^{commit}`]);
67
+ if (remoteTip && isAncestor(cwd, commit, remoteTip))
68
+ return;
69
+ const localTip = tryGit(cwd, ["rev-parse", "--verify", "--quiet", `refs/heads/${trunk.branch}^{commit}`]);
70
+ if (localTip && isAncestor(cwd, commit, localTip)) {
71
+ throw new WorkstationCheckError("release-commit-not-pushed", remoteTip
72
+ ? `commit ${short} is on ${trunk.branch}${why} but not on ${named}, so it has not been pushed`
73
+ : `commit ${short} is on ${trunk.branch}${why}, and this clone knows no ${named}, so it can't be shown pushed`, `Push it, or fetch if it was pushed elsewhere: git push ${trunk.remote} ${trunk.branch}, or git fetch ${trunk.remote} ${trunk.branch}`);
74
+ }
75
+ throw new WorkstationCheckError("release-commit-not-on-trunk", remoteTip
76
+ ? `commit ${short} is not on ${named}${why}, so a release cut from it would ship what trunk never had`
77
+ : `commit ${short} is not on ${trunk.branch}${why}, and this clone knows no ${named}`, `Check out a commit of ${named} after fetching it: git fetch ${trunk.remote} ${trunk.branch}`);
78
+ }
79
+ /** Refuse a tree with a tracked change or an untracked file git does not ignore. */
80
+ export function checkCleanTree(cwd, commit) {
81
+ const status = tryGit(cwd, ["status", "--porcelain", "--untracked-files=normal"]);
82
+ if (status === null || status === "")
83
+ return;
84
+ const lines = status.split("\n");
85
+ const untracked = lines.filter((l) => l.startsWith("??")).map((l) => l.slice(3));
86
+ const tracked = lines.length - untracked.length;
87
+ const parts = [
88
+ ...(tracked > 0 ? [`${tracked} tracked file(s) with uncommitted changes`] : []),
89
+ ...(untracked.length > 0 ? [`${untracked.length} untracked file(s) such as ${untracked[0]}`] : []),
90
+ ];
91
+ throw new WorkstationCheckError("release-worktree-dirty", `the working tree has ${parts.join(" and ")}, so a compile here would not be commit ${commit.slice(0, 12)}'s`, "Commit, stash or remove them (or add them to .gitignore), or cut from a clean checkout of the commit.");
92
+ }
93
+ /** The public key `keyFile` holds or names, as `<type> <base64>`, or null when it can't be read without a passphrase. */
94
+ export function publicKeyOf(keyFile) {
95
+ const parse = (text) => {
96
+ const [type, blob] = text.trim().split(/\s+/);
97
+ return type && blob && /^(ssh-|ecdsa-|sk-)/.test(type) ? `${type} ${blob}` : null;
98
+ };
99
+ try {
100
+ if (existsSync(keyFile)) {
101
+ const own = parse(readFileSync(keyFile, "utf-8"));
102
+ if (own)
103
+ return own;
104
+ }
105
+ if (existsSync(`${keyFile}.pub`)) {
106
+ const pub = parse(readFileSync(`${keyFile}.pub`, "utf-8"));
107
+ if (pub)
108
+ return pub;
109
+ }
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ const derived = spawnSync("ssh-keygen", ["-y", "-P", "", "-f", keyFile], { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] });
115
+ return derived.status === 0 ? parse(derived.stdout) : null;
116
+ }
117
+ /** The one principal `signers` lists for `publicKey`, or null for none or several. */
118
+ export function signerPrincipal(publicKey, signers) {
119
+ const principals = [...new Set(signers.filter((s) => s.key === publicKey).map((s) => s.principal))];
120
+ return principals.length === 1 ? principals[0] : null;
121
+ }
122
+ /**
123
+ * Who cut the release, and where the name came from: `--actor`, else the
124
+ * signer the signers file at base lists for the signing key, else the CI's
125
+ * actor (`GITHUB_ACTOR`, `GITLAB_USER_LOGIN`), else git's `user.email`, else
126
+ * `$USER`. Undefined when none is set.
127
+ */
128
+ export function resolveCutActor(req) {
129
+ const env = req.env ?? process.env;
130
+ if (req.explicit)
131
+ return { actor: req.explicit, source: "flag" };
132
+ if (req.publicKey && req.signers) {
133
+ const principal = signerPrincipal(req.publicKey, req.signers);
134
+ if (principal)
135
+ return { actor: principal, source: "signer" };
136
+ }
137
+ const ci = env.GITHUB_ACTOR || env.GITLAB_USER_LOGIN;
138
+ if (ci)
139
+ return { actor: ci, source: "ci" };
140
+ const email = tryGit(req.cwd, ["config", "--get", "user.email"]);
141
+ if (email)
142
+ return { actor: email, source: "git" };
143
+ if (env.USER)
144
+ return { actor: env.USER, source: "user" };
145
+ return undefined;
146
+ }
147
+ /** The tag a labelled release gets: `release/<label>`, or `release/<member>/<label>` for a workspace member. */
148
+ export function releaseTagName(member, label) {
149
+ return member ? `release/${member}/${label}` : `release/${label}`;
150
+ }
151
+ /**
152
+ * Whether `tag` can name `commit`: `absent` (the cut creates it), `present`
153
+ * (it already names the commit), or a {@link WorkstationCheckError} for a
154
+ * tag that names another commit or is not a valid tag name.
155
+ */
156
+ export function checkReleaseTag(cwd, tag, commit) {
157
+ if (spawnSync("git", ["check-ref-format", `refs/tags/${tag}`], { cwd, stdio: "ignore" }).status !== 0) {
158
+ throw new WorkstationCheckError("release-tag-invalid", `"${tag}" is not a valid git tag name, so the release can't be tagged`, "Pick a label git accepts in a ref name.");
159
+ }
160
+ const at = tryGit(cwd, ["rev-parse", "--verify", "--quiet", `refs/tags/${tag}^{commit}`]);
161
+ if (at === null)
162
+ return "absent";
163
+ if (at === commit)
164
+ return "present";
165
+ throw new WorkstationCheckError("release-tag-taken", `the tag ${tag} already names commit ${at.slice(0, 12)}, not ${commit.slice(0, 12)}`, "Pick another label, or delete the tag if it was made by mistake: git tag -d " + tag);
166
+ }
167
+ /**
168
+ * Create `tag` on `commit` as an annotated tag whose message names the
169
+ * release. Local only. A clone with no git identity tags as chant, as the ci
170
+ * tags are made.
171
+ */
172
+ export function createReleaseTag(cwd, tag, commit, release) {
173
+ const ident = [];
174
+ if (tryGit(cwd, ["config", "user.name"]) === null)
175
+ ident.push("-c", "user.name=chant");
176
+ if (tryGit(cwd, ["config", "user.email"]) === null)
177
+ ident.push("-c", "user.email=chant@localhost");
178
+ const message = [`release ${release.label}`, "", `Release-Digest: ${release.releaseDigest}`, ...(release.member ? [`Member: ${release.member}`] : [])].join("\n");
179
+ execFileSync("git", [...ident, "tag", "-a", "-m", message, tag, commit], { cwd, stdio: ["ignore", "ignore", "pipe"] });
180
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * How long chant keeps each kind of stored record (#4036): the retention
3
+ * policy `chant lifecycle gc` prunes by. It reads no git, so the workspace
4
+ * declaration's parser imports it for the defaults and the shape.
5
+ *
6
+ * Three kinds are pruned:
7
+ *
8
+ * changeSets `_change-sets/<digest>.json` on `chant/lifecycle` (#4022)
9
+ * releases `_releases/<digest>.json` on `chant/lifecycle` (#4026), with
10
+ * the template bytes under `_releases/templates/` that only
11
+ * pruned releases name
12
+ * runEvents `<git-common-dir>/chant/run-events/<run>.jsonl`, local only (#4042)
13
+ *
14
+ * The ledgers (`cuts.jsonl`, `<env>/releases.jsonl`, `_gates/<op>.jsonl` and
15
+ * the run ledgers) are append-only and never pruned. See ./retention.ts.
16
+ */
17
+ /** The retention of one kind: the age in days past which a record can go, and, where it applies, how many of the newest are kept whatever their age. */
18
+ export interface KindRetention {
19
+ days: number;
20
+ keep: number;
21
+ }
22
+ /** The retention of every kind, with the defaults filled in. */
23
+ export interface RetentionPolicy {
24
+ /** A stored change set is kept for `days` after it was stored or last named by a gate fact, whichever is later. `keep` does not apply and is 0. */
25
+ changeSets: KindRetention;
26
+ /** A release is promotable for `days` after its newest cut, and the newest `keep` releases of each member stay promotable at any age. */
27
+ releases: KindRetention;
28
+ /** A run's event file is kept for `days` after its last write, and the newest `keep` files are kept at any age. */
29
+ runEvents: KindRetention;
30
+ }
31
+ /** The record kinds a policy names, in the order a report lists them. */
32
+ export declare const RETENTION_KINDS: readonly ["changeSets", "releases", "runEvents"];
33
+ export type RetentionKind = (typeof RETENTION_KINDS)[number];
34
+ /**
35
+ * The defaults. At chant's own rate (about 25 pull-request gates, 28 main
36
+ * commits and 5 release cuts a day in September and October 2026) two weeks
37
+ * keeps every change set an open pull request or a promotion can still need,
38
+ * and the newest ten releases of a member cover a member that cuts rarely.
39
+ */
40
+ export declare const DEFAULT_RETENTION: RetentionPolicy;
41
+ /** The declaration's `retention` block as written: any kind or field may be left out. */
42
+ export type RetentionOverride = Partial<Record<RetentionKind, Partial<KindRetention>>>;
43
+ /** The policy an override gives: each field it sets replaces the default. */
44
+ export declare function resolveRetention(override?: RetentionOverride | null): RetentionPolicy;
45
+ //# sourceMappingURL=retention-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention-policy.d.ts","sourceRoot":"","sources":["../../src/lifecycle/retention-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,wJAAwJ;AACxJ,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B,mJAAmJ;IACnJ,UAAU,EAAE,aAAa,CAAC;IAC1B,yIAAyI;IACzI,QAAQ,EAAE,aAAa,CAAC;IACxB,mHAAmH;IACnH,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,yEAAyE;AACzE,eAAO,MAAM,eAAe,YAAI,YAAY,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;AAChF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAI/B,CAAC;AAEF,yFAAyF;AACzF,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAEvF,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAAG,eAAe,CASrF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * How long chant keeps each kind of stored record (#4036): the retention
3
+ * policy `chant lifecycle gc` prunes by. It reads no git, so the workspace
4
+ * declaration's parser imports it for the defaults and the shape.
5
+ *
6
+ * Three kinds are pruned:
7
+ *
8
+ * changeSets `_change-sets/<digest>.json` on `chant/lifecycle` (#4022)
9
+ * releases `_releases/<digest>.json` on `chant/lifecycle` (#4026), with
10
+ * the template bytes under `_releases/templates/` that only
11
+ * pruned releases name
12
+ * runEvents `<git-common-dir>/chant/run-events/<run>.jsonl`, local only (#4042)
13
+ *
14
+ * The ledgers (`cuts.jsonl`, `<env>/releases.jsonl`, `_gates/<op>.jsonl` and
15
+ * the run ledgers) are append-only and never pruned. See ./retention.ts.
16
+ */
17
+ /** The record kinds a policy names, in the order a report lists them. */
18
+ export const RETENTION_KINDS = ["changeSets", "releases", "runEvents"];
19
+ /**
20
+ * The defaults. At chant's own rate (about 25 pull-request gates, 28 main
21
+ * commits and 5 release cuts a day in September and October 2026) two weeks
22
+ * keeps every change set an open pull request or a promotion can still need,
23
+ * and the newest ten releases of a member cover a member that cuts rarely.
24
+ */
25
+ export const DEFAULT_RETENTION = {
26
+ changeSets: { days: 14, keep: 0 },
27
+ releases: { days: 14, keep: 10 },
28
+ runEvents: { days: 14, keep: 100 },
29
+ };
30
+ /** The policy an override gives: each field it sets replaces the default. */
31
+ export function resolveRetention(override) {
32
+ const out = structuredClone(DEFAULT_RETENTION);
33
+ for (const kind of RETENTION_KINDS) {
34
+ const o = override?.[kind];
35
+ if (!o)
36
+ continue;
37
+ if (typeof o.days === "number")
38
+ out[kind].days = o.days;
39
+ if (typeof o.keep === "number" && kind !== "changeSets")
40
+ out[kind].keep = o.keep;
41
+ }
42
+ return out;
43
+ }
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Garbage collection of stored change sets, releases and run events by the
3
+ * retention policy (#4036). `chant lifecycle gc` runs it.
4
+ *
5
+ * What it prunes on `chant/lifecycle`, in every member's ledger at once:
6
+ *
7
+ * _change-sets/<digest>.json a stored change set (#4022)
8
+ * _releases/<digest>.json a release (#4026)
9
+ * _releases/templates/<digest>.txt template bytes no kept release names
10
+ *
11
+ * A prune is one new commit on the local branch that removes those files. It
12
+ * never rewrites or force-pushes history: other clones and tools read the
13
+ * branch, and every pruned file stays reachable in the commits before the
14
+ * prune. So a prune bounds the tree a reader walks at the tip, and the
15
+ * repository's history keeps growing by what is written. `git log -- <path>`
16
+ * on the branch still finds a pruned file.
17
+ *
18
+ * What it never touches: the ledgers. `_releases/cuts.jsonl`,
19
+ * `<env>/releases.jsonl`, `_gates/<op>.jsonl`, the run ledgers and every other
20
+ * `.jsonl` on the branch are append-only and are not edited (#4034), and a
21
+ * whole ledger file is not removed either: the latest deploy record of an
22
+ * environment, a gate's standing fact and a release's label all live in them,
23
+ * and they are small next to what they index (one line per fact). Nor does it
24
+ * touch snapshots, `_plans/`, `_builds/` or checkpoints, which have no policy
25
+ * yet. A cut line whose release was pruned stays, so its label keeps naming
26
+ * that digest and can't be given to another release.
27
+ *
28
+ * What is never pruned, whatever its age:
29
+ *
30
+ * 1. A release an environment runs: the release the latest deploy record of
31
+ * each component in each environment names, by its `releaseDigest` or the
32
+ * release gate resolution its admission names (`releaseOfDeploy`, #4043),
33
+ * and that release's templates. A promotion picks up what the step before
34
+ * runs (#4030), so this also keeps every release a promotion can take by
35
+ * default.
36
+ * 2. What a pending gate binds: the change set (`planDigest`) and release
37
+ * (`releaseDigest`) of every pending fact that has not expired.
38
+ * 3. A release still promotable: one whose commit has no `ci/revoked` tag and
39
+ * that was cut within `releases.days`, or is among the newest
40
+ * `releases.keep` releases of its member.
41
+ * 4. A change set a gate fact (an approval, an `empty` resolution or a
42
+ * pending fact) names together with a release that is kept.
43
+ *
44
+ * Anything else is pruned once it is older than its kind's window: a change
45
+ * set `changeSets.days` after it was stored or last named by a gate fact,
46
+ * whichever is later. A file that can't be read as a release is kept.
47
+ *
48
+ * Run events are local files under `<git-common-dir>/chant/run-events/`
49
+ * (`../run-event-store.ts`) and are deleted outright.
50
+ */
51
+ import { type RunEventFile } from "../run-event-store.js";
52
+ import type { RetentionPolicy } from "./retention-policy.js";
53
+ /** What a pruned or kept file on the branch is. */
54
+ export type GcKind = "change-set" | "release" | "template";
55
+ /** Why a file is kept. Closed. */
56
+ export type GcKeepCode =
57
+ /** The latest deploy record of a component in an environment names the release. */
58
+ "deployed"
59
+ /** A pending fact that has not expired binds it. */
60
+ | "pending-gate"
61
+ /** The release is among the newest `releases.keep` of its member and not revoked. */
62
+ | "newest"
63
+ /** It is within its kind's window (and, for a release, not revoked). */
64
+ | "within-window"
65
+ /** A gate fact names the change set with a release that is kept, or a kept release names the template. */
66
+ | "kept-release"
67
+ /** The file can't be read as what its directory holds, so nothing can be said about it. */
68
+ | "unreadable";
69
+ export interface GcKeepReason {
70
+ code: GcKeepCode;
71
+ /** The environment, gate or release the reason names, when it names one. */
72
+ detail?: string;
73
+ }
74
+ export interface GcFile {
75
+ kind: GcKind;
76
+ /** The member, its path of names joined with `/`, or null for the flat layout. */
77
+ member: string | null;
78
+ /** The full path on the branch. */
79
+ path: string;
80
+ digest: string;
81
+ bytes: number;
82
+ /** The blob sha at the tip read. */
83
+ sha: string;
84
+ /** When it was last written to the branch (the newest commit that added it), or null when history does not say. */
85
+ storedAt: string | null;
86
+ }
87
+ export interface GcKept extends GcFile {
88
+ reasons: GcKeepReason[];
89
+ }
90
+ /** Files and bytes in the tip's tree. */
91
+ export interface TreeSize {
92
+ files: number;
93
+ bytes: number;
94
+ changeSets: {
95
+ files: number;
96
+ bytes: number;
97
+ };
98
+ releases: {
99
+ files: number;
100
+ bytes: number;
101
+ };
102
+ templates: {
103
+ files: number;
104
+ bytes: number;
105
+ };
106
+ /** Every `.jsonl` file: append-only, never pruned. */
107
+ ledgers: {
108
+ files: number;
109
+ bytes: number;
110
+ };
111
+ other: {
112
+ files: number;
113
+ bytes: number;
114
+ };
115
+ }
116
+ /** What a prune of `chant/lifecycle` would do. */
117
+ export interface LifecycleGcPlan {
118
+ /** The branch tip read, or null when the checkout has no `chant/lifecycle`. */
119
+ tip: string | null;
120
+ remove: GcFile[];
121
+ keep: GcKept[];
122
+ before: TreeSize;
123
+ after: TreeSize;
124
+ }
125
+ export interface GcInput {
126
+ /** Any directory in the repository. The whole branch is read, every member at once. */
127
+ cwd: string;
128
+ policy: RetentionPolicy;
129
+ now: Date;
130
+ /** Full shas of commits with a `ci/revoked` tag: their releases are not promotable. */
131
+ revokedCommits?: ReadonlySet<string>;
132
+ }
133
+ /** Split a branch path into the member prefix (`_members/<a>/_members/<b>/`) and the rest. */
134
+ export declare function splitLedgerPath(path: string): {
135
+ prefix: string;
136
+ member: string | null;
137
+ rest: string;
138
+ };
139
+ /**
140
+ * The key a digest is matched by: its hex. A plan digest written `sha256:<hex>`
141
+ * names the same plan as `jcs1-sha256:<hex>` (`samePlanDigest`), and a file
142
+ * name writes `:` as `_`, so both sides are reduced to the hex.
143
+ */
144
+ export declare function digestKey(digestOrStem: string): string;
145
+ /**
146
+ * Decide what a prune of `chant/lifecycle` removes and keeps, by the rules at
147
+ * the top of this file. Reads the branch at its local tip and writes nothing.
148
+ */
149
+ export declare function planLifecycleGc(input: GcInput): LifecycleGcPlan;
150
+ /** The commit message of a prune. */
151
+ export declare function pruneMessage(remove: readonly GcFile[]): string;
152
+ /** What {@link runLifecycleGc} did, or would do on a dry run. */
153
+ export interface GcReport {
154
+ now: string;
155
+ policy: RetentionPolicy;
156
+ dryRun: boolean;
157
+ lifecycle: LifecycleGcPlan & {
158
+ /** The prune commit, or null on a dry run or when nothing was removed. */
159
+ commit: string | null;
160
+ pushed: boolean;
161
+ pushWarning?: string;
162
+ };
163
+ runEvents: {
164
+ dir: string | null;
165
+ remove: RunEventFile[];
166
+ kept: {
167
+ files: number;
168
+ bytes: number;
169
+ };
170
+ /** How many files were deleted; 0 on a dry run. */
171
+ deleted: number;
172
+ };
173
+ }
174
+ /**
175
+ * Plan and, unless `dryRun`, carry out a prune: one commit on the local
176
+ * `chant/lifecycle` that removes what the plan lets go, and the run event
177
+ * files it lets go deleted. The commit is planned against the tip it is
178
+ * written on: if the branch moved in between, the plan is made again. It is
179
+ * pushed only when `push` is set.
180
+ */
181
+ export declare function runLifecycleGc(input: GcInput & {
182
+ dryRun: boolean;
183
+ push?: boolean;
184
+ }): Promise<GcReport>;
185
+ //# sourceMappingURL=retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/lifecycle/retention.ts"],"names":[],"mappings":"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"}