@intentius/chant 0.124.51 → 0.124.54

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 (593) hide show
  1. package/dist/audit/discover.d.ts.map +1 -1
  2. package/dist/audit/discover.js +3 -1
  3. package/dist/behaviour.d.ts +1 -1
  4. package/dist/behaviour.d.ts.map +1 -1
  5. package/dist/capabilities/templates.d.ts +65 -0
  6. package/dist/capabilities/templates.d.ts.map +1 -0
  7. package/dist/capabilities/templates.js +193 -0
  8. package/dist/capabilities/templates.json +145 -0
  9. package/dist/change-set-graph.d.ts +35 -3
  10. package/dist/change-set-graph.d.ts.map +1 -1
  11. package/dist/change-set-graph.js +60 -9
  12. package/dist/change-set.d.ts +65 -7
  13. package/dist/change-set.d.ts.map +1 -1
  14. package/dist/change-set.js +23 -12
  15. package/dist/ci-identity.d.ts +7 -2
  16. package/dist/ci-identity.d.ts.map +1 -1
  17. package/dist/ci-identity.js +4 -1
  18. package/dist/cli/commands/import-index.d.ts +52 -0
  19. package/dist/cli/commands/import-index.d.ts.map +1 -0
  20. package/dist/cli/commands/import-index.js +226 -0
  21. package/dist/cli/commands/lint.d.ts.map +1 -1
  22. package/dist/cli/commands/lint.js +4 -2
  23. package/dist/cli/handlers/components.d.ts.map +1 -1
  24. package/dist/cli/handlers/components.js +11 -2
  25. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  26. package/dist/cli/handlers/fan-out.js +16 -3
  27. package/dist/cli/handlers/graph.d.ts.map +1 -1
  28. package/dist/cli/handlers/graph.js +22 -4
  29. package/dist/cli/handlers/index-cloud.d.ts +14 -0
  30. package/dist/cli/handlers/index-cloud.d.ts.map +1 -0
  31. package/dist/cli/handlers/index-cloud.js +22 -0
  32. package/dist/cli/handlers/index-diff.d.ts +18 -0
  33. package/dist/cli/handlers/index-diff.d.ts.map +1 -0
  34. package/dist/cli/handlers/index-diff.js +142 -0
  35. package/dist/cli/handlers/lifecycle-drift.d.ts +25 -0
  36. package/dist/cli/handlers/lifecycle-drift.d.ts.map +1 -0
  37. package/dist/cli/handlers/lifecycle-drift.js +64 -0
  38. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  39. package/dist/cli/handlers/lifecycle.js +188 -28
  40. package/dist/cli/handlers/misc.d.ts +9 -0
  41. package/dist/cli/handlers/misc.d.ts.map +1 -1
  42. package/dist/cli/handlers/misc.js +77 -0
  43. package/dist/cli/handlers/pr.d.ts.map +1 -1
  44. package/dist/cli/handlers/pr.js +17 -3
  45. package/dist/cli/handlers/promote.d.ts.map +1 -1
  46. package/dist/cli/handlers/promote.js +89 -15
  47. package/dist/cli/handlers/query.d.ts.map +1 -1
  48. package/dist/cli/handlers/query.js +28 -4
  49. package/dist/cli/handlers/scenario.d.ts.map +1 -1
  50. package/dist/cli/handlers/scenario.js +8 -7
  51. package/dist/cli/handlers/search.d.ts +34 -4
  52. package/dist/cli/handlers/search.d.ts.map +1 -1
  53. package/dist/cli/handlers/search.js +216 -36
  54. package/dist/cli/main.d.ts.map +1 -1
  55. package/dist/cli/main.js +55 -1
  56. package/dist/cli/mcp/lifecycle-tools.d.ts.map +1 -1
  57. package/dist/cli/mcp/lifecycle-tools.js +3 -2
  58. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  59. package/dist/cli/mcp/resource-handlers.js +4 -3
  60. package/dist/cli/mcp/workspace-tools.js +1 -1
  61. package/dist/cli/parse-args.d.ts.map +1 -1
  62. package/dist/cli/parse-args.js +55 -2
  63. package/dist/cli/registry.d.ts +19 -1
  64. package/dist/cli/registry.d.ts.map +1 -1
  65. package/dist/cloud-lister/aws.d.ts +35 -0
  66. package/dist/cloud-lister/aws.d.ts.map +1 -0
  67. package/dist/cloud-lister/aws.js +203 -0
  68. package/dist/cloud-lister/azure.d.ts +34 -0
  69. package/dist/cloud-lister/azure.d.ts.map +1 -0
  70. package/dist/cloud-lister/azure.js +129 -0
  71. package/dist/cloud-lister/common.d.ts +40 -0
  72. package/dist/cloud-lister/common.d.ts.map +1 -0
  73. package/dist/cloud-lister/common.js +83 -0
  74. package/dist/cloud-lister/credentials.d.ts +50 -0
  75. package/dist/cloud-lister/credentials.d.ts.map +1 -0
  76. package/dist/cloud-lister/credentials.js +86 -0
  77. package/dist/cloud-lister/fakes.d.ts +27 -0
  78. package/dist/cloud-lister/fakes.d.ts.map +1 -0
  79. package/dist/cloud-lister/fakes.js +50 -0
  80. package/dist/cloud-lister/gcp.d.ts +42 -0
  81. package/dist/cloud-lister/gcp.d.ts.map +1 -0
  82. package/dist/cloud-lister/gcp.js +143 -0
  83. package/dist/cloud-lister/guard.d.ts +49 -0
  84. package/dist/cloud-lister/guard.d.ts.map +1 -0
  85. package/dist/cloud-lister/guard.js +103 -0
  86. package/dist/cloud-lister/ids.d.ts +23 -0
  87. package/dist/cloud-lister/ids.d.ts.map +1 -0
  88. package/dist/cloud-lister/ids.js +42 -0
  89. package/dist/cloud-lister/index.d.ts +67 -0
  90. package/dist/cloud-lister/index.d.ts.map +1 -0
  91. package/dist/cloud-lister/index.js +102 -0
  92. package/dist/cloud-lister/kubernetes.d.ts +64 -0
  93. package/dist/cloud-lister/kubernetes.d.ts.map +1 -0
  94. package/dist/cloud-lister/kubernetes.js +276 -0
  95. package/dist/cloud-lister/markers.d.ts +31 -0
  96. package/dist/cloud-lister/markers.d.ts.map +1 -0
  97. package/dist/cloud-lister/markers.js +73 -0
  98. package/dist/cloud-lister/mask.d.ts +31 -0
  99. package/dist/cloud-lister/mask.d.ts.map +1 -0
  100. package/dist/cloud-lister/mask.js +74 -0
  101. package/dist/cloud-lister/sigv4.d.ts +29 -0
  102. package/dist/cloud-lister/sigv4.d.ts.map +1 -0
  103. package/dist/cloud-lister/sigv4.js +54 -0
  104. package/dist/cloud-lister/transport.d.ts +55 -0
  105. package/dist/cloud-lister/transport.d.ts.map +1 -0
  106. package/dist/cloud-lister/transport.js +86 -0
  107. package/dist/cloud-lister/types.d.ts +121 -0
  108. package/dist/cloud-lister/types.d.ts.map +1 -0
  109. package/dist/cloud-lister/types.js +24 -0
  110. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  111. package/dist/components/capability-plugin-loader.js +6 -0
  112. package/dist/components/capability-plugin.d.ts +9 -0
  113. package/dist/components/capability-plugin.d.ts.map +1 -1
  114. package/dist/components/capability.d.ts +224 -0
  115. package/dist/components/capability.d.ts.map +1 -1
  116. package/dist/components/cli-support.d.ts +21 -0
  117. package/dist/components/cli-support.d.ts.map +1 -1
  118. package/dist/components/cli-support.js +58 -14
  119. package/dist/components/covered-round.d.ts +173 -0
  120. package/dist/components/covered-round.d.ts.map +1 -0
  121. package/dist/components/covered-round.js +200 -0
  122. package/dist/components/declared-reads.d.ts +38 -0
  123. package/dist/components/declared-reads.d.ts.map +1 -0
  124. package/dist/components/declared-reads.js +131 -0
  125. package/dist/components/deploy-units.d.ts.map +1 -1
  126. package/dist/components/deploy-units.js +4 -0
  127. package/dist/components/driver.d.ts +42 -1
  128. package/dist/components/driver.d.ts.map +1 -1
  129. package/dist/components/driver.js +74 -3
  130. package/dist/components/fan-out-run.d.ts +23 -1
  131. package/dist/components/fan-out-run.d.ts.map +1 -1
  132. package/dist/components/fan-out-run.js +82 -14
  133. package/dist/components/fan-out-support.d.ts +6 -0
  134. package/dist/components/fan-out-support.d.ts.map +1 -1
  135. package/dist/components/fan-out-support.js +4 -1
  136. package/dist/components/fan-out.d.ts +28 -0
  137. package/dist/components/fan-out.d.ts.map +1 -1
  138. package/dist/components/groups.d.ts +229 -0
  139. package/dist/components/groups.d.ts.map +1 -0
  140. package/dist/components/groups.js +760 -0
  141. package/dist/components/index.d.ts +7 -2
  142. package/dist/components/index.d.ts.map +1 -1
  143. package/dist/components/index.js +5 -0
  144. package/dist/components/plan-shape-conformance.d.ts +48 -0
  145. package/dist/components/plan-shape-conformance.d.ts.map +1 -0
  146. package/dist/components/plan-shape-conformance.js +122 -0
  147. package/dist/components/pr-run.d.ts +62 -7
  148. package/dist/components/pr-run.d.ts.map +1 -1
  149. package/dist/components/pr-run.js +354 -53
  150. package/dist/components/promote-rounds.d.ts +9 -0
  151. package/dist/components/promote-rounds.d.ts.map +1 -1
  152. package/dist/components/promote-rounds.js +23 -2
  153. package/dist/components/promote.d.ts +17 -0
  154. package/dist/components/promote.d.ts.map +1 -1
  155. package/dist/components/promote.js +36 -6
  156. package/dist/components/release-gate.d.ts +23 -1
  157. package/dist/components/release-gate.d.ts.map +1 -1
  158. package/dist/components/release-gate.js +97 -33
  159. package/dist/components/run-groups.d.ts +58 -0
  160. package/dist/components/run-groups.d.ts.map +1 -0
  161. package/dist/components/run-groups.js +78 -0
  162. package/dist/components/starter-plugin.d.ts +1 -0
  163. package/dist/components/starter-plugin.d.ts.map +1 -1
  164. package/dist/components/starter-plugin.js +6 -1
  165. package/dist/components/verbs/index.d.ts +1 -0
  166. package/dist/components/verbs/index.d.ts.map +1 -1
  167. package/dist/components/verbs/index.js +1 -0
  168. package/dist/components/verbs/member-outputs.d.ts +187 -0
  169. package/dist/components/verbs/member-outputs.d.ts.map +1 -0
  170. package/dist/components/verbs/member-outputs.js +218 -0
  171. package/dist/components/wave-plan.d.ts +2 -0
  172. package/dist/components/wave-plan.d.ts.map +1 -1
  173. package/dist/components/wave-plan.js +4 -1
  174. package/dist/config.d.ts +60 -0
  175. package/dist/config.d.ts.map +1 -1
  176. package/dist/config.js +27 -0
  177. package/dist/deep-observation.d.ts +1 -13
  178. package/dist/deep-observation.d.ts.map +1 -1
  179. package/dist/deep-observation.js +5 -22
  180. package/dist/drift-record.d.ts +542 -0
  181. package/dist/drift-record.d.ts.map +1 -0
  182. package/dist/drift-record.js +886 -0
  183. package/dist/engine-facts.d.ts +144 -0
  184. package/dist/engine-facts.d.ts.map +1 -0
  185. package/dist/engine-facts.js +14 -0
  186. package/dist/graph-ir.d.ts +153 -2
  187. package/dist/graph-ir.d.ts.map +1 -1
  188. package/dist/graph-ir.js +224 -6
  189. package/dist/graph-refs.d.ts +145 -0
  190. package/dist/graph-refs.d.ts.map +1 -1
  191. package/dist/graph-refs.js +305 -0
  192. package/dist/graph-schema/fixtures/adopt.json +15 -0
  193. package/dist/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  194. package/dist/graph-schema/fixtures/index.json +68 -0
  195. package/dist/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  196. package/dist/graph-schema/fixtures.d.ts +23 -0
  197. package/dist/graph-schema/fixtures.d.ts.map +1 -0
  198. package/dist/graph-schema/fixtures.js +246 -0
  199. package/dist/graph-schema/generate.d.ts +15 -0
  200. package/dist/graph-schema/generate.d.ts.map +1 -0
  201. package/dist/graph-schema/generate.js +267 -0
  202. package/dist/graph-schema/graph.schema.json +1387 -0
  203. package/dist/health.schema.json +2 -1
  204. package/dist/identity.d.ts.map +1 -1
  205. package/dist/identity.js +2 -0
  206. package/dist/index.d.ts +1 -0
  207. package/dist/index.d.ts.map +1 -1
  208. package/dist/index.js +2 -0
  209. package/dist/instance-nodes.d.ts +159 -0
  210. package/dist/instance-nodes.d.ts.map +1 -0
  211. package/dist/instance-nodes.js +231 -0
  212. package/dist/lexicon.d.ts +72 -0
  213. package/dist/lexicon.d.ts.map +1 -1
  214. package/dist/lifecycle/adoption-file.d.ts +56 -0
  215. package/dist/lifecycle/adoption-file.d.ts.map +1 -0
  216. package/dist/lifecycle/adoption-file.js +123 -0
  217. package/dist/lifecycle/cloud-index.d.ts +186 -0
  218. package/dist/lifecycle/cloud-index.d.ts.map +1 -0
  219. package/dist/lifecycle/cloud-index.js +618 -0
  220. package/dist/lifecycle/derive-edges.d.ts +59 -0
  221. package/dist/lifecycle/derive-edges.d.ts.map +1 -0
  222. package/dist/lifecycle/derive-edges.js +126 -0
  223. package/dist/lifecycle/git.d.ts +10 -9
  224. package/dist/lifecycle/git.d.ts.map +1 -1
  225. package/dist/lifecycle/git.js +7 -1
  226. package/dist/lifecycle/identity-match.d.ts +133 -0
  227. package/dist/lifecycle/identity-match.d.ts.map +1 -0
  228. package/dist/lifecycle/identity-match.js +147 -0
  229. package/dist/lifecycle/index-diff.d.ts +224 -0
  230. package/dist/lifecycle/index-diff.d.ts.map +1 -0
  231. package/dist/lifecycle/index-diff.js +327 -0
  232. package/dist/lifecycle/index-document.d.ts +130 -0
  233. package/dist/lifecycle/index-document.d.ts.map +1 -0
  234. package/dist/lifecycle/index-document.js +189 -0
  235. package/dist/lifecycle/index-drift.d.ts +121 -0
  236. package/dist/lifecycle/index-drift.d.ts.map +1 -0
  237. package/dist/lifecycle/index-drift.js +178 -0
  238. package/dist/lifecycle/index-import.d.ts +168 -0
  239. package/dist/lifecycle/index-import.d.ts.map +1 -0
  240. package/dist/lifecycle/index-import.js +515 -0
  241. package/dist/lifecycle/index-join.d.ts +129 -0
  242. package/dist/lifecycle/index-join.d.ts.map +1 -0
  243. package/dist/lifecycle/index-join.js +248 -0
  244. package/dist/lifecycle/index.d.ts +4 -0
  245. package/dist/lifecycle/index.d.ts.map +1 -1
  246. package/dist/lifecycle/index.js +4 -0
  247. package/dist/lifecycle/observation-baseline.d.ts +61 -21
  248. package/dist/lifecycle/observation-baseline.d.ts.map +1 -1
  249. package/dist/lifecycle/observation-baseline.js +144 -19
  250. package/dist/lifecycle/observe.d.ts.map +1 -1
  251. package/dist/lifecycle/observe.js +6 -1
  252. package/dist/lifecycle/query.d.ts +45 -4
  253. package/dist/lifecycle/query.d.ts.map +1 -1
  254. package/dist/lifecycle/query.js +89 -7
  255. package/dist/lifecycle/replay.d.ts +10 -3
  256. package/dist/lifecycle/replay.d.ts.map +1 -1
  257. package/dist/lifecycle/replay.js +10 -6
  258. package/dist/lifecycle/scenario.d.ts +4 -3
  259. package/dist/lifecycle/scenario.d.ts.map +1 -1
  260. package/dist/lifecycle/snapshot-store-fake.d.ts +9 -0
  261. package/dist/lifecycle/snapshot-store-fake.d.ts.map +1 -0
  262. package/dist/lifecycle/snapshot-store-fake.js +21 -0
  263. package/dist/lifecycle/snapshot-store-s3.d.ts +102 -0
  264. package/dist/lifecycle/snapshot-store-s3.d.ts.map +1 -0
  265. package/dist/lifecycle/snapshot-store-s3.js +254 -0
  266. package/dist/lifecycle/snapshot-store.d.ts +170 -0
  267. package/dist/lifecycle/snapshot-store.d.ts.map +1 -0
  268. package/dist/lifecycle/snapshot-store.js +832 -0
  269. package/dist/lifecycle/snapshot.d.ts +11 -0
  270. package/dist/lifecycle/snapshot.d.ts.map +1 -1
  271. package/dist/lifecycle/snapshot.js +18 -5
  272. package/dist/lifecycle/type-listing.d.ts +148 -0
  273. package/dist/lifecycle/type-listing.d.ts.map +1 -0
  274. package/dist/lifecycle/type-listing.js +166 -0
  275. package/dist/lint/component-checks.d.ts +15 -1
  276. package/dist/lint/component-checks.d.ts.map +1 -1
  277. package/dist/lint/component-checks.js +1 -0
  278. package/dist/lint/presets/relaxed.json +2 -1
  279. package/dist/lint/presets/strict.json +2 -1
  280. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts +4 -0
  281. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts.map +1 -0
  282. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.js +13 -0
  283. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts +4 -0
  284. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts.map +1 -0
  285. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.js +8 -0
  286. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts +33 -0
  287. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts.map +1 -0
  288. package/dist/lint/rules/comp/comp008-applies-signal-only-root.js +123 -0
  289. package/dist/lint/rules/comp/index.d.ts +2 -1
  290. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  291. package/dist/lint/rules/comp/index.js +4 -1
  292. package/dist/observation.d.ts +19 -2
  293. package/dist/observation.d.ts.map +1 -1
  294. package/dist/observation.js +18 -1
  295. package/dist/op/activities/activity-contracts.d.ts +1 -1
  296. package/dist/op/activities/activity-contracts.js +1 -1
  297. package/dist/op/activities/change-set.d.ts +6 -4
  298. package/dist/op/activities/change-set.d.ts.map +1 -1
  299. package/dist/op/activities/change-set.js +4 -2
  300. package/dist/op/activity-failure.d.ts +27 -0
  301. package/dist/op/activity-failure.d.ts.map +1 -1
  302. package/dist/op/activity-failure.js +31 -0
  303. package/dist/op/index.d.ts +2 -1
  304. package/dist/op/index.d.ts.map +1 -1
  305. package/dist/op/index.js +1 -1
  306. package/dist/op/local-executor.d.ts +5 -1
  307. package/dist/op/local-executor.d.ts.map +1 -1
  308. package/dist/op/local-executor.js +22 -8
  309. package/dist/pr-loop.d.ts +92 -3
  310. package/dist/pr-loop.d.ts.map +1 -1
  311. package/dist/pr-loop.js +62 -3
  312. package/dist/pulumi-urn.d.ts +101 -0
  313. package/dist/pulumi-urn.d.ts.map +1 -0
  314. package/dist/pulumi-urn.js +131 -0
  315. package/dist/release-floors.d.ts +23 -0
  316. package/dist/release-floors.d.ts.map +1 -0
  317. package/dist/release-floors.js +22 -0
  318. package/dist/sensitive-key.d.ts +23 -0
  319. package/dist/sensitive-key.d.ts.map +1 -0
  320. package/dist/sensitive-key.js +31 -0
  321. package/dist/wave-runtime.mjs +234 -234
  322. package/dist/workspace/adoption-report.d.ts +53 -0
  323. package/dist/workspace/adoption-report.d.ts.map +1 -0
  324. package/dist/workspace/adoption-report.js +76 -0
  325. package/dist/workspace/capabilities-contract.d.ts +7 -0
  326. package/dist/workspace/capabilities-contract.d.ts.map +1 -1
  327. package/dist/workspace/capabilities-contract.js +2 -1
  328. package/dist/workspace/capabilities.schema.json +98 -0
  329. package/dist/workspace/change-set.schema.json +42 -3
  330. package/dist/workspace/ci-cloud-identity.d.ts +13 -1
  331. package/dist/workspace/ci-cloud-identity.d.ts.map +1 -1
  332. package/dist/workspace/ci-cloud-identity.js +30 -1
  333. package/dist/workspace/compose-graph.d.ts +10 -1
  334. package/dist/workspace/compose-graph.d.ts.map +1 -1
  335. package/dist/workspace/compose-graph.js +6 -1
  336. package/dist/workspace/conformance/index.d.ts +1 -1
  337. package/dist/workspace/conformance/index.d.ts.map +1 -1
  338. package/dist/workspace/conformance/index.js +6 -1
  339. package/dist/workspace/drift-cli.d.ts +81 -0
  340. package/dist/workspace/drift-cli.d.ts.map +1 -0
  341. package/dist/workspace/drift-cli.js +317 -0
  342. package/dist/workspace/drift.schema.json +672 -0
  343. package/dist/workspace/graph-cli.d.ts +2 -0
  344. package/dist/workspace/graph-cli.d.ts.map +1 -1
  345. package/dist/workspace/graph-cli.js +3 -0
  346. package/dist/workspace/graph.schema.json +72 -0
  347. package/dist/workspace/init.d.ts +5 -1
  348. package/dist/workspace/init.d.ts.map +1 -1
  349. package/dist/workspace/init.js +55 -9
  350. package/dist/workspace/ledger.schema.json +1 -1
  351. package/dist/workspace/nested-graph.d.ts.map +1 -1
  352. package/dist/workspace/nested-graph.js +2 -0
  353. package/dist/workspace/pr-report.schema.json +76 -3
  354. package/dist/workspace/promote-waves.d.ts +112 -0
  355. package/dist/workspace/promote-waves.d.ts.map +1 -0
  356. package/dist/workspace/promote-waves.js +290 -0
  357. package/dist/workspace/promote.d.ts +84 -2
  358. package/dist/workspace/promote.d.ts.map +1 -1
  359. package/dist/workspace/promote.js +347 -61
  360. package/dist/workspace/reason-codes.d.ts +12 -0
  361. package/dist/workspace/reason-codes.d.ts.map +1 -1
  362. package/dist/workspace/reason-codes.js +14 -0
  363. package/dist/workspace/search-contract.d.ts +3 -3
  364. package/dist/workspace/search-contract.d.ts.map +1 -1
  365. package/dist/workspace/search-contract.js +2 -0
  366. package/dist/workspace/search.schema.json +103 -5
  367. package/package.json +14 -1
  368. package/src/__fixtures__/drift-record/README.md +58 -0
  369. package/src/__fixtures__/drift-record/choudoufu-cone.ndjson +4 -0
  370. package/src/__fixtures__/drift-record/choudoufu-resource.ndjson +3 -0
  371. package/src/__fixtures__/drift-record/component-status-ledger.json +65 -0
  372. package/src/__fixtures__/drift-record/component-status.json +91 -0
  373. package/src/__fixtures__/drift-record/deep-diff.json +259 -0
  374. package/src/__fixtures__/drift-record/lifecycle-diff-live.json +825 -0
  375. package/src/__fixtures__/drift-record/live-diff.json +125 -0
  376. package/src/audit/discover.e2e.test.ts +14 -0
  377. package/src/audit/discover.ts +3 -1
  378. package/src/behaviour.ts +1 -1
  379. package/src/capabilities/templates.json +145 -0
  380. package/src/capabilities/templates.test.ts +212 -0
  381. package/src/capabilities/templates.ts +204 -0
  382. package/src/change-set-bundle.test.ts +83 -0
  383. package/src/change-set-graph.ts +80 -9
  384. package/src/change-set.test.ts +24 -0
  385. package/src/change-set.ts +77 -14
  386. package/src/ci-identity-targets.test.ts +23 -0
  387. package/src/ci-identity.ts +10 -4
  388. package/src/cli/commands/import-index.test.ts +117 -0
  389. package/src/cli/commands/import-index.ts +265 -0
  390. package/src/cli/commands/lint.ts +4 -2
  391. package/src/cli/handlers/components.test.ts +9 -0
  392. package/src/cli/handlers/components.ts +12 -2
  393. package/src/cli/handlers/fan-out.ts +17 -3
  394. package/src/cli/handlers/graph.test.ts +42 -0
  395. package/src/cli/handlers/graph.ts +26 -4
  396. package/src/cli/handlers/index-cloud.ts +32 -0
  397. package/src/cli/handlers/index-diff.test.ts +68 -0
  398. package/src/cli/handlers/index-diff.ts +146 -0
  399. package/src/cli/handlers/ledger-root-member.test.ts +161 -0
  400. package/src/cli/handlers/lifecycle-drift.ts +68 -0
  401. package/src/cli/handlers/lifecycle.test.ts +33 -11
  402. package/src/cli/handlers/lifecycle.ts +205 -30
  403. package/src/cli/handlers/misc.ts +73 -0
  404. package/src/cli/handlers/pr-waves-blocked.test.ts +37 -2
  405. package/src/cli/handlers/pr.ts +16 -3
  406. package/src/cli/handlers/promote.test.ts +64 -0
  407. package/src/cli/handlers/promote.ts +81 -6
  408. package/src/cli/handlers/query.ts +27 -4
  409. package/src/cli/handlers/run-declared-reads-cli.test.ts +187 -0
  410. package/src/cli/handlers/run-groups-cli.test.ts +229 -0
  411. package/src/cli/handlers/scenario.test.ts +13 -0
  412. package/src/cli/handlers/scenario.ts +8 -7
  413. package/src/cli/handlers/search-index.test.ts +255 -0
  414. package/src/cli/handlers/search-json.test.ts +1 -1
  415. package/src/cli/handlers/search-ownership.test.ts +194 -0
  416. package/src/cli/handlers/search.ts +271 -38
  417. package/src/cli/main.test.ts +7 -0
  418. package/src/cli/main.ts +56 -1
  419. package/src/cli/mcp/lifecycle-tools.ts +3 -2
  420. package/src/cli/mcp/resource-handlers.ts +4 -3
  421. package/src/cli/mcp/workspace-tools.ts +1 -1
  422. package/src/cli/parse-args.ts +40 -2
  423. package/src/cli/registry.ts +19 -1
  424. package/src/cloud-lister/aws.test.ts +202 -0
  425. package/src/cloud-lister/aws.ts +226 -0
  426. package/src/cloud-lister/azure.test.ts +132 -0
  427. package/src/cloud-lister/azure.ts +142 -0
  428. package/src/cloud-lister/common.ts +115 -0
  429. package/src/cloud-lister/credentials.ts +110 -0
  430. package/src/cloud-lister/fakes.ts +66 -0
  431. package/src/cloud-lister/gcp.test.ts +121 -0
  432. package/src/cloud-lister/gcp.ts +159 -0
  433. package/src/cloud-lister/guard.test.ts +198 -0
  434. package/src/cloud-lister/guard.ts +111 -0
  435. package/src/cloud-lister/ids.ts +54 -0
  436. package/src/cloud-lister/index.ts +134 -0
  437. package/src/cloud-lister/kubernetes.test.ts +160 -0
  438. package/src/cloud-lister/kubernetes.ts +284 -0
  439. package/src/cloud-lister/markers.ts +74 -0
  440. package/src/cloud-lister/mask.ts +77 -0
  441. package/src/cloud-lister/shape.test.ts +81 -0
  442. package/src/cloud-lister/sigv4.ts +70 -0
  443. package/src/cloud-lister/transport.ts +118 -0
  444. package/src/cloud-lister/types.ts +135 -0
  445. package/src/components/capability-plugin-loader.ts +4 -0
  446. package/src/components/capability-plugin.ts +10 -0
  447. package/src/components/capability.ts +238 -0
  448. package/src/components/cli-support.ts +70 -14
  449. package/src/components/covered-round.test.ts +166 -0
  450. package/src/components/covered-round.ts +293 -0
  451. package/src/components/declared-reads.test.ts +103 -0
  452. package/src/components/declared-reads.ts +134 -0
  453. package/src/components/deploy-units.ts +4 -0
  454. package/src/components/driver.ts +101 -4
  455. package/src/components/fan-out-run.ts +95 -15
  456. package/src/components/fan-out-support.ts +10 -1
  457. package/src/components/fan-out.ts +30 -0
  458. package/src/components/groups.test.ts +320 -0
  459. package/src/components/groups.ts +880 -0
  460. package/src/components/index.ts +59 -0
  461. package/src/components/plan-shape-conformance.ts +130 -0
  462. package/src/components/pr-env-run-bundle.test.ts +2 -0
  463. package/src/components/pr-run.test.ts +728 -4
  464. package/src/components/pr-run.ts +395 -55
  465. package/src/components/promote-rounds.ts +25 -2
  466. package/src/components/promote.ts +55 -5
  467. package/src/components/registry.test.ts +1 -1
  468. package/src/components/release-gate.ts +115 -30
  469. package/src/components/release-groups.test.ts +362 -0
  470. package/src/components/run-groups.ts +113 -0
  471. package/src/components/starter-plugin.ts +6 -0
  472. package/src/components/verbs/index.ts +1 -0
  473. package/src/components/verbs/member-outputs.test.ts +205 -0
  474. package/src/components/verbs/member-outputs.ts +308 -0
  475. package/src/components/wave-plan.ts +5 -2
  476. package/src/config.ts +44 -0
  477. package/src/deep-observation.ts +5 -23
  478. package/src/drift-record.test.ts +596 -0
  479. package/src/drift-record.ts +1206 -0
  480. package/src/engine-facts.guard.test.ts +111 -0
  481. package/src/engine-facts.test.ts +178 -0
  482. package/src/engine-facts.ts +154 -0
  483. package/src/gated-waves-bundle.test.ts +2 -0
  484. package/src/graph-ir-live.test.ts +92 -0
  485. package/src/graph-ir.ts +317 -7
  486. package/src/graph-refs.ts +416 -0
  487. package/src/graph-schema/fixtures/adopt.json +15 -0
  488. package/src/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  489. package/src/graph-schema/fixtures/index.json +68 -0
  490. package/src/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  491. package/src/graph-schema/fixtures.ts +267 -0
  492. package/src/graph-schema/generate.ts +263 -0
  493. package/src/graph-schema/graph-schema.test.ts +153 -0
  494. package/src/graph-schema/graph.schema.json +1387 -0
  495. package/src/health.schema.json +2 -1
  496. package/src/identity.ts +2 -0
  497. package/src/index.ts +2 -0
  498. package/src/instance-nodes.ts +288 -0
  499. package/src/lexicon.ts +76 -0
  500. package/src/lifecycle/__fixtures__/index-diff/20261026T120000Z-aaaaaaaaaaaa.json +149 -0
  501. package/src/lifecycle/__fixtures__/index-diff/20261026T130000Z-bbbbbbbbbbbb.json +127 -0
  502. package/src/lifecycle/adoption-file.test.ts +100 -0
  503. package/src/lifecycle/adoption-file.ts +154 -0
  504. package/src/lifecycle/cloud-index.test.ts +517 -0
  505. package/src/lifecycle/cloud-index.ts +736 -0
  506. package/src/lifecycle/derive-edges.test.ts +193 -0
  507. package/src/lifecycle/derive-edges.ts +182 -0
  508. package/src/lifecycle/git.ts +10 -4
  509. package/src/lifecycle/identity-match.test.ts +308 -0
  510. package/src/lifecycle/identity-match.ts +257 -0
  511. package/src/lifecycle/index-diff.test.ts +198 -0
  512. package/src/lifecycle/index-diff.ts +476 -0
  513. package/src/lifecycle/index-document.test.ts +64 -0
  514. package/src/lifecycle/index-document.ts +299 -0
  515. package/src/lifecycle/index-drift.test.ts +191 -0
  516. package/src/lifecycle/index-drift.ts +304 -0
  517. package/src/lifecycle/index-import.test.ts +255 -0
  518. package/src/lifecycle/index-import.ts +634 -0
  519. package/src/lifecycle/index-join.test.ts +250 -0
  520. package/src/lifecycle/index-join.ts +304 -0
  521. package/src/lifecycle/index-store-load-bearing.test.ts +187 -0
  522. package/src/lifecycle/index.ts +4 -0
  523. package/src/lifecycle/member-ledger.test.ts +25 -7
  524. package/src/lifecycle/observation-baseline.test.ts +72 -1
  525. package/src/lifecycle/observation-baseline.ts +190 -27
  526. package/src/lifecycle/observe.ts +6 -1
  527. package/src/lifecycle/query.test.ts +69 -1
  528. package/src/lifecycle/query.ts +103 -10
  529. package/src/lifecycle/replay.test.ts +9 -5
  530. package/src/lifecycle/replay.ts +9 -5
  531. package/src/lifecycle/scenario.ts +4 -3
  532. package/src/lifecycle/snapshot-store-fake.ts +29 -0
  533. package/src/lifecycle/snapshot-store-s3.ts +316 -0
  534. package/src/lifecycle/snapshot-store.test.ts +385 -0
  535. package/src/lifecycle/snapshot-store.ts +981 -0
  536. package/src/lifecycle/snapshot.test.ts +13 -0
  537. package/src/lifecycle/snapshot.ts +23 -6
  538. package/src/lifecycle/type-listing.test.ts +166 -0
  539. package/src/lifecycle/type-listing.ts +309 -0
  540. package/src/lint/component-checks.ts +17 -1
  541. package/src/lint/config.test.ts +3 -0
  542. package/src/lint/presets/relaxed.json +2 -1
  543. package/src/lint/presets/strict.json +2 -1
  544. package/src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts +15 -0
  545. package/src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts +10 -0
  546. package/src/lint/rules/comp/comp.test.ts +2 -1
  547. package/src/lint/rules/comp/comp008-applies-signal-only-root.ts +121 -0
  548. package/src/lint/rules/comp/comp008.test.ts +77 -0
  549. package/src/lint/rules/comp/index.ts +4 -1
  550. package/src/observation-edges.test.ts +33 -0
  551. package/src/observation.ts +36 -1
  552. package/src/op/activities/activity-contracts.ts +1 -1
  553. package/src/op/activities/change-set.ts +8 -5
  554. package/src/op/activity-failure.ts +36 -0
  555. package/src/op/index.ts +2 -1
  556. package/src/op/local-executor.test.ts +80 -0
  557. package/src/op/local-executor.ts +27 -9
  558. package/src/pr-loop-bundle.test.ts +5 -2
  559. package/src/pr-loop.test.ts +57 -1
  560. package/src/pr-loop.ts +154 -6
  561. package/src/pulumi-urn.ts +151 -0
  562. package/src/release-floors.ts +22 -0
  563. package/src/sensitive-key.ts +34 -0
  564. package/src/workspace/adoption-report.test.ts +61 -0
  565. package/src/workspace/adoption-report.ts +103 -0
  566. package/src/workspace/capabilities-contract.test.ts +4 -0
  567. package/src/workspace/capabilities-contract.ts +9 -1
  568. package/src/workspace/capabilities.schema.json +98 -0
  569. package/src/workspace/change-set.schema.json +42 -3
  570. package/src/workspace/ci-cloud-identity.ts +31 -1
  571. package/src/workspace/compose-graph.test.ts +12 -0
  572. package/src/workspace/compose-graph.ts +12 -1
  573. package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
  574. package/src/workspace/conformance/index.ts +6 -1
  575. package/src/workspace/drift-cli.test.ts +65 -0
  576. package/src/workspace/drift-cli.ts +365 -0
  577. package/src/workspace/drift.schema.json +672 -0
  578. package/src/workspace/graph-cli.ts +5 -0
  579. package/src/workspace/graph.schema.json +72 -0
  580. package/src/workspace/init.test.ts +38 -1
  581. package/src/workspace/init.ts +50 -8
  582. package/src/workspace/intent-gaps.test.ts +18 -2
  583. package/src/workspace/ledger.schema.json +1 -1
  584. package/src/workspace/nested-graph.ts +1 -0
  585. package/src/workspace/pr-report.schema.json +76 -3
  586. package/src/workspace/promote-waves.test.ts +296 -0
  587. package/src/workspace/promote-waves.ts +340 -0
  588. package/src/workspace/promote.test.ts +158 -4
  589. package/src/workspace/promote.ts +398 -57
  590. package/src/workspace/reason-codes.test.ts +4 -1
  591. package/src/workspace/reason-codes.ts +14 -0
  592. package/src/workspace/search-contract.ts +2 -0
  593. package/src/workspace/search.schema.json +103 -5
@@ -3,6 +3,7 @@ import { describeCommand, printDescribeResult } from "../commands/describe.js";
3
3
  import { importCommand, importFromContent, importFromLive, importFromLiveStacks, printImportResult } from "../commands/import.js";
4
4
  import { loadChantConfig } from "../../config.js";
5
5
  import { resolve } from "path";
6
+ import { existsSync, readFileSync } from "fs";
6
7
  import { auditCommand, printAuditResult } from "../commands/audit.js";
7
8
  import { AGENT_RUNTIMES, AGENT_SCOPES } from "../../agents/types.js";
8
9
  import { registeredProjectRoots } from "../../agents/discover.js";
@@ -239,6 +240,60 @@ export async function runDescribe(ctx) {
239
240
  printDescribeResult(result);
240
241
  return result.success ? 0 : 1;
241
242
  }
243
+ /**
244
+ * The selection for `chant import --index` (#4524). `--type` and `--name`
245
+ * take comma-separated lists, `--tag key=value` repeats, `--select` is a JSON
246
+ * file of node ids (a list of ids, of `{ id }` or `{ node }` objects, or an
247
+ * object holding `nodes` or `results`) or a comma-separated list of ids, and
248
+ * `--all` takes every node.
249
+ */
250
+ export function indexSelectionFromArgs(args) {
251
+ const list = (v) => (v ? v.split(",").map((s) => s.trim()).filter(Boolean) : undefined);
252
+ const selection = {};
253
+ if (args.all)
254
+ selection.all = true;
255
+ const types = list(args.selectType);
256
+ if (types)
257
+ selection.types = types;
258
+ const names = list(args.selectName);
259
+ if (names)
260
+ selection.names = names;
261
+ if (args.selectTags && args.selectTags.length > 0) {
262
+ const tags = {};
263
+ for (const t of args.selectTags) {
264
+ const eq = t.indexOf("=");
265
+ tags[t.slice(0, eq)] = t.slice(eq + 1);
266
+ }
267
+ selection.tags = tags;
268
+ }
269
+ if (args.selectAddress) {
270
+ const path = resolve(args.selectAddress);
271
+ if (existsSync(path)) {
272
+ let parsed;
273
+ try {
274
+ parsed = JSON.parse(readFileSync(path, "utf-8"));
275
+ }
276
+ catch (err) {
277
+ return new Error(`--select ${args.selectAddress} is not JSON: ${err instanceof Error ? err.message : String(err)}`);
278
+ }
279
+ const rows = Array.isArray(parsed)
280
+ ? parsed
281
+ : parsed && typeof parsed === "object"
282
+ ? (parsed.nodes ?? parsed.results ?? [])
283
+ : [];
284
+ const ids = rows
285
+ .map((r) => (typeof r === "string" ? r : r && typeof r === "object" ? (r.id ?? r.node) : undefined))
286
+ .filter((x) => typeof x === "string");
287
+ if (ids.length === 0)
288
+ return new Error(`--select ${args.selectAddress} names no node ids`);
289
+ selection.nodes = ids;
290
+ }
291
+ else {
292
+ selection.nodes = list(args.selectAddress);
293
+ }
294
+ }
295
+ return selection;
296
+ }
242
297
  export async function runImport(ctx) {
243
298
  const { args } = ctx;
244
299
  // `--agents` (#chant audit --agents' other half): the source is this
@@ -318,6 +373,28 @@ export async function runImport(ctx) {
318
373
  printImportResult(result);
319
374
  return result.success ? 0 : 1;
320
375
  }
376
+ // `--index <ref>` (#4524): typed source for indexed resources; nothing is applied.
377
+ if (args.index) {
378
+ const { importFromIndex, summarizeIndexImport } = await import("../commands/import-index.js");
379
+ const selection = indexSelectionFromArgs(args);
380
+ if (selection instanceof Error) {
381
+ console.error(formatError({ message: selection.message }));
382
+ return 1;
383
+ }
384
+ const result = await importFromIndex({
385
+ index: args.index,
386
+ selection,
387
+ output: args.output,
388
+ force: args.force,
389
+ report: args.reportFile,
390
+ adoptOut: args.adoptOut,
391
+ src: args.src,
392
+ });
393
+ printImportResult(result);
394
+ if (result.report)
395
+ console.error(summarizeIndexImport(result.report));
396
+ return result.success ? 0 : 1;
397
+ }
321
398
  // `--from <env>` switches import from a template file to a live source.
322
399
  if (args.migrateFrom) {
323
400
  const selector = args.selectType || args.selectName
@@ -1 +1 @@
1
- {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/pr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAKH,OAAO,EAA+C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG7F,OAAO,EAYL,KAAK,SAAS,EACf,MAAM,yBAAyB,CAAC;AASjC,OAAO,EAA0C,KAAK,YAAY,EAAuB,MAAM,wBAAwB,CAAC;AAIxH,OAAO,EAWL,KAAK,aAAa,EAElB,KAAK,cAAc,EAKpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAA+D,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAU3G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAiD,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9H,OAAO,EAA8G,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC3K,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnD,qDAAqD;AACrD,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,4GAA4G;IAC5G,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAC;IAC1D,uDAAuD;IACvD,KAAK,EAAE,WAAW,CAAC;IACnB,iEAAiE;IACjE,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,MAAM,EAAE,YAAY,CAAC;IACrB,sEAAsE;IACtE,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,8FAA8F;IAC9F,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B;AAOD,uJAAuJ;AACvJ,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,CAwHjH;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAE1G;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,CAAC,EAAE,QAAQ,EACX,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,OAAO,CAAC,EAAE,SAAS,EACnB,IAAI,SAAwB,EAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B;AAyBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO3J;AA+ED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAElF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CASnF;AA0ND,mKAAmK;AACnK,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxE;AA8GD,yLAAyL;AACzL,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAYzE;AAkYD,uKAAuK;AACvK,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1E;AAy3BD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B9E"}
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/pr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAKH,OAAO,EAA+C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAI7F,OAAO,EAYL,KAAK,SAAS,EACf,MAAM,yBAAyB,CAAC;AASjC,OAAO,EAA0C,KAAK,YAAY,EAAuB,MAAM,wBAAwB,CAAC;AAIxH,OAAO,EAWL,KAAK,aAAa,EAElB,KAAK,cAAc,EAKpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAA+D,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAU3G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAiD,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9H,OAAO,EAA8G,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC3K,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAKnD,qDAAqD;AACrD,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,4GAA4G;IAC5G,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAC;IAC1D,uDAAuD;IACvD,KAAK,EAAE,WAAW,CAAC;IACnB,iEAAiE;IACjE,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,MAAM,EAAE,YAAY,CAAC;IACrB,sEAAsE;IACtE,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B,8FAA8F;IAC9F,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B;AAOD,uJAAuJ;AACvJ,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,CAkIjH;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAE1G;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,CAAC,EAAE,QAAQ,EACX,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,OAAO,CAAC,EAAE,SAAS,EACnB,IAAI,SAAwB,EAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B;AAyBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO3J;AA+ED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAElF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CASnF;AA0ND,mKAAmK;AACnK,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxE;AA8GD,yLAAyL;AACzL,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAYzE;AAmYD,uKAAuK;AACvK,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1E;AA03BD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B9E"}
@@ -69,6 +69,7 @@ import { join, relative, resolve, sep } from "node:path";
69
69
  import { loadChantConfig, resolveAutoReleaseDisabled } from "../../config.js";
70
70
  import { resolveCommit, resolveMergeBase } from "../../components/changed-files.js";
71
71
  import { deriveFanOut, fanOutRegistry } from "../../components/fan-out-support.js";
72
+ import { findComponentGroups, groupFanOut } from "../../components/groups.js";
72
73
  import { applyPrSet, approvalOf, approversWhoAuthored, approversWithoutReview, decidePrGate, planPrSet, prReport, readOnlyLedger, prWavePlan, resumePrSet, waveNotCovered, } from "../../components/pr-run.js";
73
74
  import { composeChangeSet, verifyChangeSetDigest } from "../../change-set.js";
74
75
  import { waveGateName } from "../../gated-waves.js";
@@ -153,6 +154,7 @@ export async function prepare(ctx, stage) {
153
154
  const signal = await resolveChangedUnits(ctx, config, { base, stacksOnly: true });
154
155
  if ("error" in signal)
155
156
  return fail(signal.error, signal.hint);
157
+ const registry = await fanOutRegistry(projectPath, config);
156
158
  let derived;
157
159
  try {
158
160
  derived = await deriveFanOut({
@@ -161,6 +163,7 @@ export async function prepare(ctx, stage) {
161
163
  sandbox: args.sandbox,
162
164
  buildParams: paramsResolution.provenance,
163
165
  config,
166
+ registry,
164
167
  });
165
168
  }
166
169
  catch (err) {
@@ -204,10 +207,19 @@ export async function prepare(ctx, stage) {
204
207
  if (policy.note)
205
208
  console.error(formatInfo(policy.note));
206
209
  const env = args.env ?? "local";
207
- const registry = await fanOutRegistry(projectPath, config);
208
210
  const routedAway = member ? await routing(ctx, stage, projectPath, member, base, forge) : undefined;
209
211
  if (routedAway)
210
212
  console.error(formatInfo(routedAway));
213
+ // ws-107: the groups a capability plans and applies as one, placed in the waves every stage and wave job reads.
214
+ let plan = derived.plan;
215
+ if (!routedAway && plan.order.length > 0) {
216
+ try {
217
+ plan = groupFanOut(plan, derived.components, await findComponentGroups({ components: derived.components, plan, registry, env }));
218
+ }
219
+ catch (err) {
220
+ return fail(err instanceof Error ? err.message : String(err));
221
+ }
222
+ }
211
223
  return {
212
224
  config,
213
225
  env,
@@ -217,7 +229,7 @@ export async function prepare(ctx, stage) {
217
229
  gate: args.gate ?? PR_APPLY_GATE,
218
230
  ...(forge ? { forge } : {}),
219
231
  components: derived.components,
220
- plan: routedAway ? { ...derived.plan, order: [], waves: [], seeds: [], indeterminate: [] } : derived.plan,
232
+ plan: routedAway ? { ...derived.plan, order: [], waves: [], seeds: [], indeterminate: [] } : plan,
221
233
  signal: derived.signal,
222
234
  ...(derived.sites ? { sites: derived.sites } : {}),
223
235
  registry,
@@ -956,6 +968,7 @@ async function prApply(ctx, stage, beforeMerge) {
956
968
  env: p.env,
957
969
  set,
958
970
  gate: p.gate,
971
+ approval,
959
972
  decideRound,
960
973
  ...(resumed ? { resumed: prior } : {}),
961
974
  // The apply is this run's waves, so the fan-out's own run framing is
@@ -1554,6 +1567,7 @@ async function tryResume(p, attempt, file, op, inputsNow) {
1554
1567
  seededOutputs: p.seededOutputs,
1555
1568
  record,
1556
1569
  completed,
1570
+ applied: outputs,
1557
1571
  });
1558
1572
  if (!resumed.ok)
1559
1573
  return skip(`what is left is not what was approved. ${resumed.reasons.join("; ")}`);
@@ -1870,7 +1884,7 @@ async function prApplyWaves(ctx, p, at) {
1870
1884
  planFailedIn ?? (planFailedIn = k);
1871
1885
  continue;
1872
1886
  }
1873
- const moved = waveNotCovered(approvedSet.doc, fresh.doc, approvedSet.members);
1887
+ const moved = waveNotCovered(approvedSet.doc, fresh.doc, approvedSet.members, { approved: approvedSet.shapes, fresh: fresh.shapes });
1874
1888
  set = fresh;
1875
1889
  if (moved.length === 0) {
1876
1890
  console.error(formatInfo(`wave ${k}: the approved plan covers what it plans now, so it applies under the pull request's approval`));
@@ -1 +1 @@
1
- {"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAiDH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuzBlD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAmF/E;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsChF;AAsCD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BhF"}
1
+ {"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkDH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAi4BlD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAmF/E;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAsChF;AAsCD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BhF"}
@@ -31,6 +31,7 @@ import { fetchLifecycle, getHeadCommit, pushLifecycle } from "../../lifecycle/gi
31
31
  import { appendReleaseRecord, latestPerComponent, readReleaseLedger, resolveRunId, } from "../../lifecycle/release-ledger.js";
32
32
  import { isComponentList, resolveComponentTargets } from "../../components/cli-support.js";
33
33
  import { applyConfigDefaults } from "../../components/config-defaults.js";
34
+ import { withDeclaredReads } from "../../components/declared-reads.js";
34
35
  import { fanOutRegistry } from "../../components/fan-out-support.js";
35
36
  import { renderDriverHuman } from "../../components/driver-output.js";
36
37
  import { ndjsonProgressSink } from "../../components/run-progress.js";
@@ -161,17 +162,26 @@ async function bindReleaseGate(input) {
161
162
  unsettled.set(component, `the ${u.outcome.verb} run ${u.outcome.runId} left ${component} ${u.state} in "${env}" and nothing has been recorded for it since, so what it runs is not known`);
162
163
  }
163
164
  const digests = new Map(plan.items.map((i) => [i.component, i.digest]));
164
- const planSet = (only, outputs) => gate.planReleaseSet({
165
- release: under.release,
166
- env,
167
- components: input.prepared,
168
- digests,
169
- registry: input.registry,
170
- current,
171
- unsettled,
172
- seededOutputs: outputs,
173
- ...(only ? { only } : {}),
174
- });
165
+ const planSet = async (only, outputs) => {
166
+ const planned = await gate.planReleaseSet({
167
+ release: under.release,
168
+ env,
169
+ components: input.prepared,
170
+ digests,
171
+ registry: input.registry,
172
+ current,
173
+ unsettled,
174
+ seededOutputs: outputs,
175
+ ...(only ? { only } : {}),
176
+ ...(input.grouped ? { grouped: input.grouped } : {}),
177
+ });
178
+ // #4465: the run applies the plan the gate bound, the newest one for a group planned again.
179
+ for (const g of planned.groups ?? [])
180
+ if (g.run)
181
+ input.groupRuns.unshift(g.run);
182
+ return planned;
183
+ };
184
+ const groupsOf = (p) => ({ ...(p.groups ? { groups: p.groups } : {}), ...(p.fallbacks ? { fallbacks: p.fallbacks } : {}) });
175
185
  const { storeGateChangeSet } = await import("../../lifecycle/gate-change-set.js");
176
186
  const { readStoredChangeSet } = await import("../../lifecycle/change-set-store.js");
177
187
  const { isEmptyChangeSet } = await import("../../change-set.js");
@@ -248,6 +258,7 @@ async function bindReleaseGate(input) {
248
258
  binding: { op: gate.RELEASE_GATE_OP, planDigest: stored.document.digest, releaseDigest, verifyEmpty },
249
259
  reads: fresh.reads,
250
260
  resumedFrom: stored.document.digest,
261
+ ...groupsOf(fresh),
251
262
  ...(fresh.plannedOutputs ? { plannedOutputs: fresh.plannedOutputs } : {}),
252
263
  ...(fresh.unknownInputs ? { unknownInputs: fresh.unknownInputs } : {}),
253
264
  ...later,
@@ -259,7 +270,7 @@ async function bindReleaseGate(input) {
259
270
  const bound = await bindDoc(fresh.doc, gates, "change set");
260
271
  if (typeof bound === "number")
261
272
  return bound;
262
- return { doc: fresh.doc, ...bound, reads: fresh.reads, ...(fresh.plannedOutputs ? { plannedOutputs: fresh.plannedOutputs } : {}), ...(fresh.unknownInputs ? { unknownInputs: fresh.unknownInputs } : {}), ...later };
273
+ return { doc: fresh.doc, ...bound, reads: fresh.reads, ...groupsOf(fresh), ...(fresh.plannedOutputs ? { plannedOutputs: fresh.plannedOutputs } : {}), ...(fresh.unknownInputs ? { unknownInputs: fresh.unknownInputs } : {}), ...later };
263
274
  }
264
275
  const first = await planSet(undefined, input.seededOutputs);
265
276
  const bound = await bindDoc(first.doc, gates, "change set");
@@ -268,7 +279,7 @@ async function bindReleaseGate(input) {
268
279
  for (const [component, refs] of Object.entries(first.unknownInputs ?? {})) {
269
280
  console.error(formatInfo(`${component} reads ${refs.join(", ")}, known only once its upstream applies; it is planned again then, and needs its own approval if its plan moves`));
270
281
  }
271
- return { doc: first.doc, ...bound, reads: first.reads, ...(first.plannedOutputs ? { plannedOutputs: first.plannedOutputs } : {}), ...(first.unknownInputs ? { unknownInputs: first.unknownInputs } : {}), ...later };
282
+ return { doc: first.doc, ...bound, reads: first.reads, ...groupsOf(first), ...(first.plannedOutputs ? { plannedOutputs: first.plannedOutputs } : {}), ...(first.unknownInputs ? { unknownInputs: first.unknownInputs } : {}), ...later };
272
283
  }
273
284
  /** A later round's or wave's plan was refused (provisional or failed members); the refusal is already printed. */
274
285
  class PromoteStageRefused extends Error {
@@ -426,6 +437,12 @@ async function deployPlanIn(ctx, verb, plan, project, actor, record, under) {
426
437
  }
427
438
  }
428
439
  const registry = await fanOutRegistry(project.projectPath, project.config);
440
+ // #4516: the reads a capability finds in its steps' files (a template's
441
+ // Fn::ImportValue) order the promote as `deriveFanOut` orders a fan-out, so
442
+ // an importer deploys after the exporter it reads. Read once the release's
443
+ // templates are written, so they are the files read; a read of a component
444
+ // this promote does not deploy is left out.
445
+ prepared.splice(0, prepared.length, ...(await withDeclaredReads(prepared, registry, project.projectPath)));
429
446
  const port = gitGateLedgerPort();
430
447
  // #4045: under a release, every gate binds the release's change set for this environment.
431
448
  let releaseGate;
@@ -447,10 +464,52 @@ async function deployPlanIn(ctx, verb, plan, project, actor, record, under) {
447
464
  console.error(formatWarning({ message: `could not read the resume record ${resumePath}: ${err instanceof Error ? err.message : String(err)}` }));
448
465
  }
449
466
  }
467
+ // ws-107 (#4465): under a release, the components a capability takes as one
468
+ // plan and apply as one group; under --wave-gate none forms (ruling 1).
469
+ // A resume groups again what is left of each group.
470
+ let grouped;
471
+ const groupRuns = [];
472
+ if (under) {
473
+ const groups = await import("../../components/groups.js");
474
+ const whole = await groups.formRunGroups({
475
+ components: prepared,
476
+ plan: groups.componentSetFanOut(prepared),
477
+ registry,
478
+ env: plan.to,
479
+ ...(args.waveGate !== undefined ? { waveGate: true } : {}),
480
+ });
481
+ if (resume && whole.groups?.length) {
482
+ const { remainingFanOut } = await import("../../components/fan-out.js");
483
+ grouped = await groups.regroupRemaining({
484
+ components: prepared,
485
+ plan: remainingFanOut(whole, prepared, { completed: resume.completed }),
486
+ registry,
487
+ env: plan.to,
488
+ groups: whole.groups,
489
+ ...(whole.fallbacks ? { fallbacks: whole.fallbacks } : {}),
490
+ });
491
+ }
492
+ else {
493
+ grouped = whole;
494
+ }
495
+ }
450
496
  let pullRequests = [];
451
497
  if (under) {
452
498
  try {
453
- const result = await bindReleaseGate({ plan, prepared, under, registry, port, seededOutputs, actor: actor, projectPath: project.projectPath, head, ...(resume ? { resume } : {}) });
499
+ const result = await bindReleaseGate({
500
+ plan,
501
+ prepared,
502
+ under,
503
+ registry,
504
+ port,
505
+ seededOutputs,
506
+ actor: actor,
507
+ projectPath: project.projectPath,
508
+ head,
509
+ ...(resume ? { resume } : {}),
510
+ ...(grouped ? { grouped } : {}),
511
+ groupRuns,
512
+ });
454
513
  if (typeof result === "number") {
455
514
  tidy();
456
515
  return result;
@@ -507,6 +566,7 @@ async function deployPlanIn(ctx, verb, plan, project, actor, record, under) {
507
566
  ...(args.waveGate ? { waveGate: args.waveGate } : {}),
508
567
  replan: bound.replan,
509
568
  bind: bound.bind,
569
+ ...(grouped?.groups?.length ? { grouped } : {}),
510
570
  run: (components, outputs, binding) => runPromotion({
511
571
  plan: { ...plan, items: plan.items.filter((i) => components.some((c) => c.name === i.component)) },
512
572
  components,
@@ -514,6 +574,7 @@ async function deployPlanIn(ctx, verb, plan, project, actor, record, under) {
514
574
  componentOutputs: outputs,
515
575
  gates: port,
516
576
  releaseGate: binding,
577
+ ...(grouped?.groups?.length ? { grouped, groupRuns } : {}),
517
578
  ...(args.progressJson ? { onProgress: ndjsonProgressSink() } : {}),
518
579
  ...(events ? { onRunEvent: events.emit } : {}),
519
580
  }),
@@ -528,6 +589,8 @@ async function deployPlanIn(ctx, verb, plan, project, actor, record, under) {
528
589
  componentOutputs: seededOutputs,
529
590
  gates: port,
530
591
  ...(releaseGate ? { releaseGate } : {}),
592
+ // #4465: with no release gate to bind, nothing planned the groups beforehand, so each plans in its wave.
593
+ ...(grouped?.groups?.length ? { grouped, groupRuns, planGroupsAtWave: bound === undefined } : {}),
531
594
  ...(args.progressJson ? { onProgress: ndjsonProgressSink() } : {}),
532
595
  ...(events ? { onRunEvent: events.emit } : {}),
533
596
  });
@@ -571,6 +634,17 @@ async function deployPlanIn(ctx, verb, plan, project, actor, record, under) {
571
634
  console.error(formatInfo(`resume record: ${resumePath}; the same promote carries on from here`));
572
635
  }
573
636
  }
637
+ // #4465: the groups applied as one, and how each member ended, as pr-report says it.
638
+ const { runGroupsReport, renderRunGroups } = await import("../../components/run-groups.js");
639
+ const groupsReport = runGroupsReport({
640
+ grouped,
641
+ ...(bound?.groups ? { planned: bound.groups } : {}),
642
+ ...(bound ? { doc: bound.doc } : {}),
643
+ ...(run.groupOutcomes ? { outcomes: run.groupOutcomes } : {}),
644
+ });
645
+ if (!args.json)
646
+ for (const line of renderRunGroups(groupsReport, `the same ${verb}`))
647
+ console.error(formatInfo(line));
574
648
  // The driver settles the stream; this only ends one it left open.
575
649
  events?.settle(run.status === "fail" ? "failed" : run.status);
576
650
  if (!args.json)
@@ -609,7 +683,7 @@ async function deployPlanIn(ctx, verb, plan, project, actor, record, under) {
609
683
  const withChangeSet = under && changeSetJson ? { release: { ...releaseJson.release, ...changeSetJson } } : releaseJson;
610
684
  const stagedJson = staged ? { stages: staged.stages, ...(bound?.plannedOutputs ? { plannedOutputs: bound.plannedOutputs } : {}), ...(bound?.unknownInputs ? { unknownInputs: bound.unknownInputs } : {}) } : {};
611
685
  const prJson = pullRequests.length > 0 ? { pullRequests: pullRequests.map((r) => ({ commit: r.commit, source: r.source, plan: r.plan, digest: r.digest, approvedBy: r.approvedBy, ...(r.authorApproved ? { authorApproved: r.authorApproved } : {}) })) } : {};
612
- console.log(JSON.stringify({ ...planJson(plan, removed), ...withChangeSet, ...stagedJson, ...prJson, run, recorded, ...(outcome ? { outcome } : {}) }, null, 2));
686
+ console.log(JSON.stringify({ ...planJson(plan, removed), ...withChangeSet, ...stagedJson, ...prJson, ...groupsReport, run, recorded, ...(outcome ? { outcome } : {}) }, null, 2));
613
687
  }
614
688
  else {
615
689
  for (const r of recorded) {
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/query.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8BhH;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B1E"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/query.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAoDhH;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B1E"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * `chant query "<sql>" [dir] [--member <name>] [--json]` (#4297): one
3
- * read-only SQL statement over the snapshots, Op runs, gates, deploys and
4
- * releases on the local `chant/lifecycle` branch. The tables and the engine
3
+ * read-only SQL statement over the snapshots in the index store (#4519) and
4
+ * the Op runs, gates, deploys and releases on the local `chant/lifecycle`
5
+ * branch. The tables and the engine
5
6
  * live in `../../lifecycle/query.ts`; this reads the ledgers and prints.
6
7
  *
7
8
  * Inside a workspace every member's ledger is read, each row naming its
@@ -30,8 +31,12 @@ export async function queryLedgers(cwd, members, at) {
30
31
  const commit = resolveLedgerRevision(repo, at);
31
32
  return (member) => revisionLedgerReadPort(repo, commit, member === null ? "" : memberLedgerPrefix([member]));
32
33
  })();
34
+ // Snapshots come from the index store (#4519). `--at` names a commit of
35
+ // chant/lifecycle, so it reads that commit's snapshots as before.
36
+ const { resolveSnapshotStore, snapshotReadPort } = await import("../../lifecycle/snapshot-store.js");
37
+ const store = at === undefined ? await resolveSnapshotStore({ cwd: found?.dir ?? cwd }) : undefined;
33
38
  if (!found)
34
- return [{ member: null, port: atPort ? atPort(null) : gitLedgerReadPort({ cwd }) }];
39
+ return [{ member: null, port: atPort ? atPort(null) : gitLedgerReadPort({ cwd }), ...(store ? { snapshots: snapshotReadPort(store, { cwd }) } : {}) }];
35
40
  // Workspace code loads only when there is a workspace, so a level-0 project never pays for it.
36
41
  const { readDeclaration, WorkspaceReadError } = await import("../../workspace/declaration.js");
37
42
  const { workingTree } = await import("../../workspace/tree.js");
@@ -51,9 +56,28 @@ export async function queryLedgers(cwd, members, at) {
51
56
  if (unknown.length > 0)
52
57
  throw new QueryError(`--member ${unknown.join(", ")} names no member of the workspace`);
53
58
  }
59
+ // #4482: a TerraformApplyOp run names its root's directory; the member that holds it is `root_member`.
60
+ const { ownerOf, resolveGroups } = await import("../../workspace/declaration.js");
61
+ const groups = (() => {
62
+ try {
63
+ return resolveGroups(declaration, workingTree(found.dir));
64
+ }
65
+ catch {
66
+ return [];
67
+ }
68
+ })();
69
+ const ownerOfPath = (path) => {
70
+ const owner = ownerOf(declaration, groups, path);
71
+ return owner && "member" in owner ? owner.member.name : null;
72
+ };
54
73
  return declaration.members
55
74
  .filter((m) => !wanted || wanted.has(m.name))
56
- .map((m) => ({ member: m.name, port: atPort ? atPort(m.dir === "." ? null : m.name) : gitLedgerReadPort({ cwd: found.dir, member: m.dir === "." ? "." : m.name }) }));
75
+ .map((m) => ({
76
+ member: m.name,
77
+ port: atPort ? atPort(m.dir === "." ? null : m.name) : gitLedgerReadPort({ cwd: found.dir, member: m.dir === "." ? "." : m.name }),
78
+ ...(store ? { snapshots: snapshotReadPort(store, { cwd: found.dir, member: m.dir === "." ? "." : m.name }) } : {}),
79
+ ownerOfPath,
80
+ }));
57
81
  }
58
82
  export async function runQueryCommand(ctx) {
59
83
  const { args } = ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/scenario.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE3E;AA2OD,0FAA0F;AAC1F,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E"}
1
+ {"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/scenario.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE3E;AA4OD,0FAA0F;AAC1F,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E"}
@@ -2,7 +2,7 @@ import { resolve } from "node:path";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { commandBuildParams } from "../build-params-cli.js";
4
4
  import { build } from "../../build.js";
5
- import { readEnvironmentSnapshots, fetchLifecycle } from "../../lifecycle/git.js";
5
+ import { readEnvironmentSnapshotsFrom, resolveSnapshotStore } from "../../lifecycle/snapshot-store.js";
6
6
  import { buildChangeSet } from "../../lifecycle/change-set.js";
7
7
  import { planReceipts, mergeReceiptEntries, observedValueResolver, readReceiptValue, } from "../../lifecycle/receipt-plan.js";
8
8
  import { collectEffectReceipts, isEffectReceipt } from "../../effect-receipt.js";
@@ -73,11 +73,11 @@ export async function runScenarioCheck(ctx) {
73
73
  // ahead of the per-scenario loop, since it's a property of the build, not
74
74
  // of any one scenario's fixture.
75
75
  const receipts = collectEffectReceipts(buildResult.entities);
76
- // `snapshot(env)` reads the chant/lifecycle orphan branch — fetch once,
77
- // up front, the same pre-read `runLifecyclePlan` does, rather than once per
78
- // scenario that needs it.
76
+ // `snapshot(env)` reads the index store (#4519) — fetch once, up front,
77
+ // the same pre-read `runLifecyclePlan` does, rather than once per scenario
78
+ // that needs it.
79
79
  if ([...scenarios.values()].some((s) => s.given.kind === "env")) {
80
- await fetchLifecycle();
80
+ await (await resolveSnapshotStore()).fetch();
81
81
  }
82
82
  const results = [];
83
83
  for (const [entityName, scenario] of scenarios) {
@@ -194,9 +194,10 @@ async function resolveGiven(given) {
194
194
  behaviour: behaviourFrom([snap], given.path),
195
195
  };
196
196
  }
197
- const stored = await readEnvironmentSnapshots(given.env);
197
+ const store = await resolveSnapshotStore();
198
+ const stored = await readEnvironmentSnapshotsFrom(store, given.env);
198
199
  if (stored.size === 0) {
199
- const error = `no recorded snapshot for environment "${given.env}" on chant/lifecycle — record one with \`chant lifecycle snapshot ${given.env}\``;
200
+ const error = `no recorded snapshot for environment "${given.env}" in ${store.where} — record one with \`chant lifecycle snapshot ${given.env}\`, or name a checked-in fixture`;
200
201
  return { env: given.env, perLexicon: new Map(), error, behaviour: { missing: error } };
201
202
  }
202
203
  const perLexicon = new Map();
@@ -7,6 +7,7 @@ import type { ObservationDepth } from "../../lifecycle/types.js";
7
7
  import { type CountBy } from "./search-count.js";
8
8
  import type { CommandContext } from "../registry.js";
9
9
  import { type SearchErrorCode, type SearchFailure } from "../../workspace/search-contract.js";
10
+ import { type IndexJoin } from "../../lifecycle/index-join.js";
10
11
  /**
11
12
  * `chant search <query> [--live --env <name>]` — answer an estate question with
12
13
  * a COMPACT result instead of the whole graph. The point (measured on aws-bench,
@@ -19,11 +20,17 @@ import { type SearchErrorCode, type SearchFailure } from "../../workspace/search
19
20
  * on a terraform resource, its type (kind:aws_instance, kind:aws_iam_)
20
21
  * tag:<key>=<val> a Tags entry with Key=key and Value containing val
21
22
  * attr:<name>=<val> attribute <name> equals/contains <val>
23
+ * id:<cloud id> physicalId or an engine cloudIds value is exactly <cloud id> (#4534)
22
24
  * ->kind:X / ->attr:.. this node has an edge TO a node matching the right side
23
25
  * <-kind:X / <-attr:.. this node has an edge FROM a node matching the right side
24
26
  * ->*X, ->{n}X, ->{m,n}X the far end is any depth / n / m..n hops away (#4359)
25
27
  * ->[via=a]X, ->[to=a]X only edges through consumer attr a / reading producer attr a
26
28
  *
29
+ * `--index <ref>` (#4525) answers from an index version in the store instead
30
+ * of a live read: the declared rows joined to it through each lexicon's index
31
+ * match, each row with its verdict, or, with no project, the index alone.
32
+ * See ../../lifecycle/index-join.ts.
33
+ *
27
34
  * The edge operators are the point of "edge-aware" search (#1139): a small
28
35
  * model shouldn't hand-join instance→subnet→public across many results — one
29
36
  * query does the traversal. `kind:Instance ->attr:MapPublicIpOnLaunch=true`
@@ -60,6 +67,8 @@ export declare function checkSearchArgs(args: {
60
67
  failOnDrift?: boolean;
61
68
  live?: boolean;
62
69
  env?: string;
70
+ index?: string;
71
+ ambient?: boolean;
63
72
  }, query: string, snapshot: {
64
73
  ref?: string;
65
74
  flag: string;
@@ -77,6 +86,7 @@ export declare function printCapabilities(args: {
77
86
  env?: string;
78
87
  snapshot?: string;
79
88
  at?: string;
89
+ index?: string;
80
90
  countBy?: string;
81
91
  explain?: boolean;
82
92
  show?: string;
@@ -126,6 +136,23 @@ export type AnswerSource = {
126
136
  snapshot?: string;
127
137
  commit: string;
128
138
  timestamp: string;
139
+ }
140
+ /**
141
+ * `--index <ref>` (#4525): the index version answered from and its stamp.
142
+ * `index` is the ref resolved (`<scope key>@<version>`); `by` the source
143
+ * that wrote it; `project` false when there was no project, so every row
144
+ * is an indexed node.
145
+ */
146
+ | {
147
+ kind: "index";
148
+ index: string;
149
+ scopeKey: string;
150
+ version: string;
151
+ observedAt: string;
152
+ completedAt?: string;
153
+ digest: string;
154
+ by: string;
155
+ project: boolean;
129
156
  };
130
157
  /**
131
158
  * Name the `--show` columns nothing carries (#1279).
@@ -185,9 +212,9 @@ declare function ambientHint(matches: IRNode[], ambientKinds: string[], asked: b
185
212
  * already done. That is a fact about the query, printed for every query, and it
186
213
  * encodes no expected answer.
187
214
  */
188
- declare function provenanceLine(matches: IRNode[], source: AnswerSource, recorded?: string, liveFailures?: string[], derived?: string[]): string;
215
+ declare function provenanceLine(matches: IRNode[], source: AnswerSource, recorded?: string, liveFailures?: string[], derived?: string[], joins?: Record<string, IndexJoin>): string;
189
216
  /** Print {@link provenanceLine}: the text footer. */
190
- declare function provenance(matches: IRNode[], source: AnswerSource, recorded?: string, liveFailures?: string[], derived?: string[]): void;
217
+ declare function provenance(matches: IRNode[], source: AnswerSource, recorded?: string, liveFailures?: string[], derived?: string[], joins?: Record<string, IndexJoin>): void;
191
218
  /** Union `LiveObservation.resources` across lexicons into one name-keyed map. */
192
219
  declare function mergeResources(observations: LiveObservation[]): Record<string, ResourceMetadata>;
193
220
  /** Restrict a name-keyed map to the matched ids — the whole of "query-scoped". */
@@ -360,6 +387,8 @@ export interface SearchJson {
360
387
  hops: PathHop[];
361
388
  }[];
362
389
  }[];
390
+ /** `--index` with a project (#4525): how the declared row joined to the index version. */
391
+ join?: IndexJoin;
363
392
  }[];
364
393
  provenance?: string;
365
394
  /** Present when every match is a planned create (#4372): how many. See the schema. */
@@ -411,11 +440,12 @@ declare function searchJson(query: string, source: AnswerSource, matches: IRNode
411
440
  capabilities?: SearchJson["capabilities"];
412
441
  explain?: ReturnType<typeof explainData>;
413
442
  drift?: SearchDriftJson;
443
+ joins?: Record<string, IndexJoin>;
414
444
  }): SearchJson;
415
445
  /** A term as the query grammar spells it, `!` and ASCII arrows included (#4367). */
416
446
  declare function termText(t: Term): string;
417
447
  export interface Term {
418
- kind: "word" | "kind" | "tag" | "attr" | "edge" | "cap";
448
+ kind: "word" | "kind" | "tag" | "attr" | "edge" | "cap" | "id";
419
449
  /** `!term` — the node must NOT satisfy this (#1280). */
420
450
  negated?: boolean;
421
451
  a: string;
@@ -528,7 +558,7 @@ declare function findPath(n: IRNode, t: Term, ir: GraphIR, byId: Map<string, IRN
528
558
  * `producer.attr <- consumer.via`. Hops are joined with `; `.
529
559
  */
530
560
  declare function formatPath(hops: PathHop[], dir: "out" | "in"): string;
531
- declare function formatRow(n: IRNode, show: string[]): string;
561
+ declare function formatRow(n: IRNode, show: string[], join?: IndexJoin): string;
532
562
  /** Internals exposed for unit tests. */
533
563
  export declare const __searchInternals: {
534
564
  parseQuery: typeof parseQuery;