@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,519 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/workspace/delivery-metrics/v1/delivery-metrics.schema.json",
4
+ "title": "chant workspace metrics output",
5
+ "description": "What `chant workspace metrics --json` prints (#4039): the four DORA metrics (deployment frequency, lead time, change failure rate and time to restore) per member and environment, computed from the deploy records in <env>/releases.jsonl, the releases in _releases/, the release gate's resolutions and the counted ci/revoked/<sha> tags. It reads the local chant/lifecycle branch and local tags and never fetches. behold and a Grafana panel read the same numbers from it, and #3990's metrics contract can adopt it. Version 1 of the read contract. Readers ignore fields they do not know; a field is only ever added within a version. The codes are a closed list, each in the one closed list of `reason-codes.ts`. Contract version 1 of this document is written by chant 0.124.29 and newer; the read contract as a whole by chant 0.81.0 and newer.",
6
+ "oneOf": [
7
+ {
8
+ "$ref": "#/$defs/result"
9
+ },
10
+ {
11
+ "$ref": "#/$defs/failure"
12
+ }
13
+ ],
14
+ "$defs": {
15
+ "result": {
16
+ "type": "object",
17
+ "description": "Exit code 0, with or without deploys.",
18
+ "required": [
19
+ "$schema",
20
+ "contract",
21
+ "chant",
22
+ "workspace",
23
+ "lifecycle",
24
+ "window",
25
+ "failureWindowDays",
26
+ "members"
27
+ ],
28
+ "properties": {
29
+ "$schema": {
30
+ "const": "https://intentius.io/chant/schemas/workspace/delivery-metrics/v1/delivery-metrics.schema.json"
31
+ },
32
+ "contract": {
33
+ "const": 1
34
+ },
35
+ "chant": {
36
+ "type": "string"
37
+ },
38
+ "error": false,
39
+ "workspace": {
40
+ "description": "The workspace read, or null for a project outside a workspace, whose own ledger is read as one member with member null.",
41
+ "oneOf": [
42
+ {
43
+ "type": "null"
44
+ },
45
+ {
46
+ "type": "object",
47
+ "required": [
48
+ "name"
49
+ ],
50
+ "properties": {
51
+ "name": {
52
+ "type": "string"
53
+ }
54
+ }
55
+ }
56
+ ]
57
+ },
58
+ "lifecycle": {
59
+ "type": "object",
60
+ "description": "The branch read and its tip, null when the checkout has no chant/lifecycle branch.",
61
+ "required": [
62
+ "ref",
63
+ "commit"
64
+ ],
65
+ "properties": {
66
+ "ref": {
67
+ "const": "chant/lifecycle"
68
+ },
69
+ "commit": {
70
+ "type": [
71
+ "string",
72
+ "null"
73
+ ]
74
+ }
75
+ }
76
+ },
77
+ "window": {
78
+ "type": "object",
79
+ "description": "The span deploys are counted in, both ends inclusive. --since sets since; the default is 56 days (eight weeks) before until, which is now.",
80
+ "required": [
81
+ "since",
82
+ "until",
83
+ "days"
84
+ ],
85
+ "properties": {
86
+ "since": {
87
+ "type": "string",
88
+ "description": "ISO 8601."
89
+ },
90
+ "until": {
91
+ "type": "string",
92
+ "description": "ISO 8601."
93
+ },
94
+ "days": {
95
+ "type": "number",
96
+ "description": "The window's length in days, to two decimals."
97
+ }
98
+ }
99
+ },
100
+ "failureWindowDays": {
101
+ "type": "integer",
102
+ "minimum": 1,
103
+ "description": "The declaration's metrics.failureWindowDays, or 7. A deploy fails when, within this many days after it, the commit it deployed is revoked or the environment is rolled back from it."
104
+ },
105
+ "members": {
106
+ "type": "array",
107
+ "description": "Each member read, in declaration order. --member keeps only the members it names.",
108
+ "items": {
109
+ "$ref": "#/$defs/member"
110
+ }
111
+ }
112
+ }
113
+ },
114
+ "member": {
115
+ "type": "object",
116
+ "description": "One member's metrics.",
117
+ "required": [
118
+ "member",
119
+ "environments",
120
+ "reason"
121
+ ],
122
+ "properties": {
123
+ "member": {
124
+ "type": [
125
+ "string",
126
+ "null"
127
+ ],
128
+ "description": "The member's name, or null for a project outside a workspace."
129
+ },
130
+ "environments": {
131
+ "type": "array",
132
+ "description": "Each environment the member has a deploy ledger for, sorted by name. --env keeps only that one.",
133
+ "items": {
134
+ "$ref": "#/$defs/environment"
135
+ }
136
+ },
137
+ "reason": {
138
+ "description": "Null when everything was read. ledger-malformed when some deploy record lines or release files could not be read; the rest are counted. ledger-unreadable when the ledger could not be read, and environments is empty.",
139
+ "oneOf": [
140
+ {
141
+ "type": "null"
142
+ },
143
+ {
144
+ "type": "object",
145
+ "required": [
146
+ "code",
147
+ "message"
148
+ ],
149
+ "properties": {
150
+ "code": {
151
+ "enum": [
152
+ "ledger-unreadable",
153
+ "ledger-malformed"
154
+ ]
155
+ },
156
+ "message": {
157
+ "type": "string"
158
+ }
159
+ }
160
+ }
161
+ ]
162
+ }
163
+ }
164
+ },
165
+ "environment": {
166
+ "type": "object",
167
+ "description": "The four metrics of one member in one environment. A deploy is one deploy record: one component deployed once, by a promote, a run or a rollback. A redeploy is counted apart.",
168
+ "required": [
169
+ "env",
170
+ "deployments",
171
+ "leadTime",
172
+ "changeFailure",
173
+ "restore",
174
+ "failures"
175
+ ],
176
+ "properties": {
177
+ "env": {
178
+ "type": "string"
179
+ },
180
+ "deployments": {
181
+ "type": "object",
182
+ "description": "Deployment frequency.",
183
+ "required": [
184
+ "count",
185
+ "redeploys",
186
+ "runs",
187
+ "fromRelease",
188
+ "perWeek"
189
+ ],
190
+ "properties": {
191
+ "count": {
192
+ "type": "integer",
193
+ "minimum": 0,
194
+ "description": "Deploy records whose timestamp is in the window, leaving out redeploys. Rollbacks count."
195
+ },
196
+ "redeploys": {
197
+ "type": "integer",
198
+ "minimum": 0,
199
+ "description": "Redeploys in the window (records with redeploys set): they put the running release back, so they are counted here and in no other metric."
200
+ },
201
+ "runs": {
202
+ "type": "integer",
203
+ "minimum": 0,
204
+ "description": "Distinct runId values among them: a run that deploys several components counts once."
205
+ },
206
+ "fromRelease": {
207
+ "type": "integer",
208
+ "minimum": 0,
209
+ "description": "Of count, the deploys made from a release: the record names one in releaseDigest, or its release gate admission does."
210
+ },
211
+ "perWeek": {
212
+ "type": "number",
213
+ "minimum": 0,
214
+ "description": "count over the window's length in weeks, to two decimals."
215
+ }
216
+ }
217
+ },
218
+ "leadTime": {
219
+ "type": "object",
220
+ "description": "Lead time from commit to running release. A change is a release, timed at the first deploy record in this environment that names it, or a commit deployed from no release, timed at the first deploy record with that gitSha. Its lead time runs from the commit's committer time to that deploy. Only changes whose first deploy here is in the window count.",
221
+ "required": [
222
+ "changes",
223
+ "fromRelease",
224
+ "fromCommit",
225
+ "unknown",
226
+ "medianSeconds"
227
+ ],
228
+ "properties": {
229
+ "changes": {
230
+ "type": "integer",
231
+ "minimum": 0
232
+ },
233
+ "fromRelease": {
234
+ "type": "integer",
235
+ "minimum": 0,
236
+ "description": "Of changes, releases."
237
+ },
238
+ "fromCommit": {
239
+ "type": "integer",
240
+ "minimum": 0,
241
+ "description": "Of changes, commits deployed from no release."
242
+ },
243
+ "unknown": {
244
+ "type": "integer",
245
+ "minimum": 0,
246
+ "description": "Changes left out because their commit is not in this repository."
247
+ },
248
+ "medianSeconds": {
249
+ "type": [
250
+ "integer",
251
+ "null"
252
+ ],
253
+ "minimum": 0,
254
+ "description": "The median lead time, or null when changes is 0."
255
+ }
256
+ }
257
+ },
258
+ "changeFailure": {
259
+ "type": "object",
260
+ "description": "Change failure rate.",
261
+ "required": [
262
+ "deployments",
263
+ "failed",
264
+ "revoked",
265
+ "rolledBack",
266
+ "rate"
267
+ ],
268
+ "properties": {
269
+ "deployments": {
270
+ "type": "integer",
271
+ "minimum": 0,
272
+ "description": "The same as deployments.count."
273
+ },
274
+ "failed": {
275
+ "type": "integer",
276
+ "minimum": 0,
277
+ "description": "Deploys in the window that failed: the commit they deployed (a release's commit, or the record's gitSha for a deploy made from no release) carries a counted ci/revoked tag made no later than failureWindowDays after the deploy, or the environment was rolled back from them within failureWindowDays. A revoked tag with no time counts whenever it was made."
278
+ },
279
+ "revoked": {
280
+ "type": "integer",
281
+ "minimum": 0,
282
+ "description": "Of failed, those whose commit was revoked."
283
+ },
284
+ "rolledBack": {
285
+ "type": "integer",
286
+ "minimum": 0,
287
+ "description": "Of failed, those rolled back from: the next deploy record of the same component in the environment, leaving out redeploys, is a rollback."
288
+ },
289
+ "rate": {
290
+ "type": [
291
+ "number",
292
+ "null"
293
+ ],
294
+ "minimum": 0,
295
+ "maximum": 1,
296
+ "description": "failed over deployments, to four decimals, or null with no deployments."
297
+ }
298
+ }
299
+ },
300
+ "restore": {
301
+ "type": "object",
302
+ "description": "Time to restore. A failed deploy is restored by the next deploy record of the same component in the environment, leaving out redeploys, whose commit is not revoked.",
303
+ "required": [
304
+ "restored",
305
+ "open",
306
+ "medianSeconds"
307
+ ],
308
+ "properties": {
309
+ "restored": {
310
+ "type": "integer",
311
+ "minimum": 0
312
+ },
313
+ "open": {
314
+ "type": "integer",
315
+ "minimum": 0,
316
+ "description": "Failed deploys with no restore yet."
317
+ },
318
+ "medianSeconds": {
319
+ "type": [
320
+ "integer",
321
+ "null"
322
+ ],
323
+ "minimum": 0,
324
+ "description": "The median time from a failed deploy to its restore, or null when none is restored."
325
+ }
326
+ }
327
+ },
328
+ "failures": {
329
+ "type": "array",
330
+ "description": "Each failed deploy in the window, oldest first.",
331
+ "items": {
332
+ "$ref": "#/$defs/failure-entry"
333
+ }
334
+ }
335
+ }
336
+ },
337
+ "failure-entry": {
338
+ "type": "object",
339
+ "description": "One failed deploy.",
340
+ "required": [
341
+ "component",
342
+ "timestamp",
343
+ "runId",
344
+ "releaseDigest",
345
+ "label",
346
+ "commit",
347
+ "causes",
348
+ "revoked",
349
+ "rolledBackBy",
350
+ "restoredBy",
351
+ "restoreSeconds"
352
+ ],
353
+ "properties": {
354
+ "component": {
355
+ "type": "string"
356
+ },
357
+ "timestamp": {
358
+ "type": "string"
359
+ },
360
+ "runId": {
361
+ "type": "string"
362
+ },
363
+ "releaseDigest": {
364
+ "type": [
365
+ "string",
366
+ "null"
367
+ ],
368
+ "description": "The release it deployed, or null for a deploy made from no release."
369
+ },
370
+ "label": {
371
+ "type": [
372
+ "string",
373
+ "null"
374
+ ],
375
+ "description": "That release's label, or null."
376
+ },
377
+ "commit": {
378
+ "type": "string",
379
+ "description": "The commit it deployed."
380
+ },
381
+ "causes": {
382
+ "type": "array",
383
+ "minItems": 1,
384
+ "items": {
385
+ "enum": [
386
+ "revoked",
387
+ "rolled-back"
388
+ ]
389
+ }
390
+ },
391
+ "revoked": {
392
+ "description": "The counted revoked tag on the commit, when revoked is a cause, else null.",
393
+ "oneOf": [
394
+ {
395
+ "type": "null"
396
+ },
397
+ {
398
+ "type": "object",
399
+ "required": [
400
+ "tag",
401
+ "tagged"
402
+ ],
403
+ "properties": {
404
+ "tag": {
405
+ "type": "string"
406
+ },
407
+ "tagged": {
408
+ "type": [
409
+ "string",
410
+ "null"
411
+ ],
412
+ "description": "When the tag was made, or null for a lightweight tag."
413
+ }
414
+ }
415
+ }
416
+ ]
417
+ },
418
+ "rolledBackBy": {
419
+ "oneOf": [
420
+ {
421
+ "type": "null"
422
+ },
423
+ {
424
+ "type": "object",
425
+ "required": [
426
+ "runId",
427
+ "timestamp"
428
+ ],
429
+ "properties": {
430
+ "runId": {
431
+ "type": "string"
432
+ },
433
+ "timestamp": {
434
+ "type": "string"
435
+ }
436
+ }
437
+ }
438
+ ],
439
+ "description": "The rollback record, named by runId and timestamp, when rolled-back is a cause, else null."
440
+ },
441
+ "restoredBy": {
442
+ "oneOf": [
443
+ {
444
+ "type": "null"
445
+ },
446
+ {
447
+ "type": "object",
448
+ "required": [
449
+ "runId",
450
+ "timestamp"
451
+ ],
452
+ "properties": {
453
+ "runId": {
454
+ "type": "string"
455
+ },
456
+ "timestamp": {
457
+ "type": "string"
458
+ }
459
+ }
460
+ }
461
+ ],
462
+ "description": "The deploy record that restored it, or null while it is not restored."
463
+ },
464
+ "restoreSeconds": {
465
+ "type": [
466
+ "integer",
467
+ "null"
468
+ ],
469
+ "minimum": 0
470
+ }
471
+ }
472
+ },
473
+ "failure": {
474
+ "type": "object",
475
+ "description": "Nothing was read. Exit code 1.",
476
+ "required": [
477
+ "$schema",
478
+ "contract",
479
+ "chant",
480
+ "error"
481
+ ],
482
+ "properties": {
483
+ "$schema": {
484
+ "const": "https://intentius.io/chant/schemas/workspace/delivery-metrics/v1/delivery-metrics.schema.json"
485
+ },
486
+ "contract": {
487
+ "const": 1
488
+ },
489
+ "chant": {
490
+ "type": "string"
491
+ },
492
+ "error": {
493
+ "type": "object",
494
+ "required": [
495
+ "code",
496
+ "message"
497
+ ],
498
+ "properties": {
499
+ "code": {
500
+ "enum": [
501
+ "declaration-ambiguous",
502
+ "declaration-unparseable",
503
+ "declaration-invalid",
504
+ "placement-invalid",
505
+ "reader-too-old",
506
+ "root-chant-required",
507
+ "not-a-git-repository",
508
+ "environment-invalid"
509
+ ]
510
+ },
511
+ "message": {
512
+ "type": "string"
513
+ }
514
+ }
515
+ }
516
+ }
517
+ }
518
+ }
519
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Reading a workspace's feature flags (#4024): every flag of the declared
3
+ * flag kinds, and the flags of one member by parameter. Kept apart from
4
+ * `./flags.ts`, which `records.ts` loads, since reading goes through
5
+ * `records-cli.ts`.
6
+ */
7
+ import type { FlagValue, WorkspaceFlags } from "./flags.js";
8
+ /**
9
+ * Every flag of every flag kind the declaration at `root` names, read in the
10
+ * working tree. A kind without a flag block is skipped without reading its
11
+ * records. Throws a `RecordReadError` when a flag kind or its records can't
12
+ * be read, and a `WorkspaceReadError` when the declaration can't.
13
+ */
14
+ export declare function readWorkspaceFlags(root: string): Promise<WorkspaceFlags>;
15
+ /** One flag-backed parameter, as a build in one environment reads it. */
16
+ export interface FlagBinding {
17
+ /** The flag's name. */
18
+ flag: string;
19
+ /** The flag's value in the environment, or undefined when the record gives it none. */
20
+ value: FlagValue | undefined;
21
+ }
22
+ /** The flags that back the parameters of the member holding a directory. */
23
+ export interface MemberFlagBindings {
24
+ /** The member's name in the declaration. */
25
+ member: string;
26
+ /** Each flag-backed parameter by name. */
27
+ byParam: Record<string, FlagBinding>;
28
+ /** Why a flag of this member can't be trusted: an invalid record that names it, or two flags for one parameter. */
29
+ errors: string[];
30
+ }
31
+ /**
32
+ * The flags that back parameters of the member holding `projectDir`, in the
33
+ * workspace whose declaration is in `root`, with each flag's value for `env`.
34
+ * Null when no member holds the directory, since only a member has flags.
35
+ */
36
+ export declare function memberFlagBindings(root: string, projectDir: string, env: string): Promise<MemberFlagBindings | null>;
37
+ //# sourceMappingURL=flags-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags-read.d.ts","sourceRoot":"","sources":["../../src/workspace/flags-read.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AASzD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA4C9E;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAED,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,mHAAmH;IACnH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA2B1H"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Reading a workspace's feature flags (#4024): every flag of the declared
3
+ * flag kinds, and the flags of one member by parameter. Kept apart from
4
+ * `./flags.ts`, which `records.ts` loads, since reading goes through
5
+ * `records-cli.ts`.
6
+ */
7
+ import { join, relative, resolve, sep } from "node:path";
8
+ import { loadRecordKind } from "./records.js";
9
+ const str = (v) => (typeof v === "string" && v !== "" ? v : null);
10
+ /** A flag value as the record writes it, or undefined for one a build-time parameter can't hold. */
11
+ function flagValue(v) {
12
+ return typeof v === "string" || typeof v === "number" || typeof v === "boolean" ? v : undefined;
13
+ }
14
+ /**
15
+ * Every flag of every flag kind the declaration at `root` names, read in the
16
+ * working tree. A kind without a flag block is skipped without reading its
17
+ * records. Throws a `RecordReadError` when a flag kind or its records can't
18
+ * be read, and a `WorkspaceReadError` when the declaration can't.
19
+ */
20
+ export async function readWorkspaceFlags(root) {
21
+ const { readDeclaration, declaredRecordKinds } = await import("./declaration.js");
22
+ const { workingTree } = await import("./tree.js");
23
+ const declaration = readDeclaration(workingTree(root));
24
+ const out = { flags: [], invalid: [] };
25
+ const declared = declaredRecordKinds(declaration);
26
+ if (declared.length === 0)
27
+ return out;
28
+ const { readRecordsFor } = await import("./records-cli.js");
29
+ for (const d of declared) {
30
+ const file = join(root, ...d.path.split("/"));
31
+ const loaded = await loadRecordKind(file, root);
32
+ const flag = loaded.kind.flag;
33
+ if (!flag)
34
+ continue;
35
+ const { result, root: repo } = await readRecordsFor({ kind: file, cwd: root, current: true });
36
+ for (const r of result.records) {
37
+ const path = relative(root, join(repo, ...r.path.split("/"))).split(sep).join("/");
38
+ const member = r.data ? str(r.data[flag.member]) : null;
39
+ if (!r.valid || r.id === null || r.data === null) {
40
+ out.invalid.push({ kind: d.path, path, member, message: r.reasons.map((x) => `${x.code}: ${x.message}`).join("; ") || "the record can't be read" });
41
+ continue;
42
+ }
43
+ const values = {};
44
+ const raw = r.data[flag.values];
45
+ if (raw !== null && typeof raw === "object" && !Array.isArray(raw)) {
46
+ for (const [env, v] of Object.entries(raw)) {
47
+ const value = flagValue(v);
48
+ if (value !== undefined)
49
+ values[env] = value;
50
+ }
51
+ }
52
+ out.flags.push({
53
+ id: r.id,
54
+ kind: d.path,
55
+ path,
56
+ member: member ?? "",
57
+ param: str(r.data[flag.param]) ?? "",
58
+ owner: str(r.data[flag.owner]) ?? "",
59
+ values,
60
+ work: r.flag?.work ?? null,
61
+ implements: r.flag?.implements ?? [],
62
+ stale: r.flag?.stale ?? false,
63
+ });
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+ /**
69
+ * The flags that back parameters of the member holding `projectDir`, in the
70
+ * workspace whose declaration is in `root`, with each flag's value for `env`.
71
+ * Null when no member holds the directory, since only a member has flags.
72
+ */
73
+ export async function memberFlagBindings(root, projectDir, env) {
74
+ const { readDeclaration, resolveGroups, ownerOf } = await import("./declaration.js");
75
+ const { workingTree } = await import("./tree.js");
76
+ const tree = workingTree(root);
77
+ const declaration = readDeclaration(tree);
78
+ const rel = relative(root, resolve(projectDir)).split(sep).join("/");
79
+ const owner = ownerOf(declaration, resolveGroups(declaration, tree), rel === "" ? "" : rel);
80
+ if (!owner || !("member" in owner))
81
+ return null;
82
+ const member = owner.member.name;
83
+ const read = await readWorkspaceFlags(root);
84
+ const errors = [];
85
+ for (const bad of read.invalid) {
86
+ if (bad.member === member || bad.member === null)
87
+ errors.push(`flag record ${bad.path} is not valid, so no build reads it: ${bad.message}`);
88
+ }
89
+ const byParam = {};
90
+ const seen = new Map();
91
+ for (const f of read.flags) {
92
+ if (f.member !== member)
93
+ continue;
94
+ const other = seen.get(f.param);
95
+ if (other !== undefined) {
96
+ errors.push(`flags ${other} and ${f.id} both set build parameter "${f.param}" of member ${member}; one flag backs one parameter`);
97
+ continue;
98
+ }
99
+ seen.set(f.param, f.id);
100
+ byParam[f.param] = { flag: f.id, value: f.values[env] };
101
+ }
102
+ return { member, byParam, errors };
103
+ }