@intentius/chant 0.124.52 → 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 (584) 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 +15 -2
  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 +215 -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/declared-reads.d.ts +38 -0
  120. package/dist/components/declared-reads.d.ts.map +1 -0
  121. package/dist/components/declared-reads.js +131 -0
  122. package/dist/components/deploy-units.d.ts.map +1 -1
  123. package/dist/components/deploy-units.js +4 -0
  124. package/dist/components/driver.d.ts +34 -1
  125. package/dist/components/driver.d.ts.map +1 -1
  126. package/dist/components/driver.js +66 -3
  127. package/dist/components/fan-out-run.d.ts +23 -1
  128. package/dist/components/fan-out-run.d.ts.map +1 -1
  129. package/dist/components/fan-out-run.js +82 -14
  130. package/dist/components/fan-out-support.d.ts +6 -0
  131. package/dist/components/fan-out-support.d.ts.map +1 -1
  132. package/dist/components/fan-out-support.js +4 -1
  133. package/dist/components/fan-out.d.ts +28 -0
  134. package/dist/components/fan-out.d.ts.map +1 -1
  135. package/dist/components/groups.d.ts +229 -0
  136. package/dist/components/groups.d.ts.map +1 -0
  137. package/dist/components/groups.js +760 -0
  138. package/dist/components/index.d.ts +6 -2
  139. package/dist/components/index.d.ts.map +1 -1
  140. package/dist/components/index.js +4 -0
  141. package/dist/components/plan-shape-conformance.d.ts +48 -0
  142. package/dist/components/plan-shape-conformance.d.ts.map +1 -0
  143. package/dist/components/plan-shape-conformance.js +122 -0
  144. package/dist/components/pr-run.d.ts +41 -4
  145. package/dist/components/pr-run.d.ts.map +1 -1
  146. package/dist/components/pr-run.js +209 -39
  147. package/dist/components/promote-rounds.d.ts +9 -0
  148. package/dist/components/promote-rounds.d.ts.map +1 -1
  149. package/dist/components/promote-rounds.js +23 -2
  150. package/dist/components/promote.d.ts +17 -0
  151. package/dist/components/promote.d.ts.map +1 -1
  152. package/dist/components/promote.js +36 -6
  153. package/dist/components/release-gate.d.ts +23 -1
  154. package/dist/components/release-gate.d.ts.map +1 -1
  155. package/dist/components/release-gate.js +97 -33
  156. package/dist/components/run-groups.d.ts +58 -0
  157. package/dist/components/run-groups.d.ts.map +1 -0
  158. package/dist/components/run-groups.js +78 -0
  159. package/dist/components/starter-plugin.d.ts +1 -0
  160. package/dist/components/starter-plugin.d.ts.map +1 -1
  161. package/dist/components/starter-plugin.js +6 -1
  162. package/dist/components/verbs/index.d.ts +1 -0
  163. package/dist/components/verbs/index.d.ts.map +1 -1
  164. package/dist/components/verbs/index.js +1 -0
  165. package/dist/components/verbs/member-outputs.d.ts +187 -0
  166. package/dist/components/verbs/member-outputs.d.ts.map +1 -0
  167. package/dist/components/verbs/member-outputs.js +218 -0
  168. package/dist/config.d.ts +60 -0
  169. package/dist/config.d.ts.map +1 -1
  170. package/dist/config.js +27 -0
  171. package/dist/deep-observation.d.ts +1 -13
  172. package/dist/deep-observation.d.ts.map +1 -1
  173. package/dist/deep-observation.js +5 -22
  174. package/dist/drift-record.d.ts +542 -0
  175. package/dist/drift-record.d.ts.map +1 -0
  176. package/dist/drift-record.js +886 -0
  177. package/dist/engine-facts.d.ts +144 -0
  178. package/dist/engine-facts.d.ts.map +1 -0
  179. package/dist/engine-facts.js +14 -0
  180. package/dist/graph-ir.d.ts +153 -2
  181. package/dist/graph-ir.d.ts.map +1 -1
  182. package/dist/graph-ir.js +224 -6
  183. package/dist/graph-refs.d.ts +145 -0
  184. package/dist/graph-refs.d.ts.map +1 -1
  185. package/dist/graph-refs.js +305 -0
  186. package/dist/graph-schema/fixtures/adopt.json +15 -0
  187. package/dist/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  188. package/dist/graph-schema/fixtures/index.json +68 -0
  189. package/dist/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  190. package/dist/graph-schema/fixtures.d.ts +23 -0
  191. package/dist/graph-schema/fixtures.d.ts.map +1 -0
  192. package/dist/graph-schema/fixtures.js +246 -0
  193. package/dist/graph-schema/generate.d.ts +15 -0
  194. package/dist/graph-schema/generate.d.ts.map +1 -0
  195. package/dist/graph-schema/generate.js +267 -0
  196. package/dist/graph-schema/graph.schema.json +1387 -0
  197. package/dist/health.schema.json +2 -1
  198. package/dist/identity.d.ts.map +1 -1
  199. package/dist/identity.js +2 -0
  200. package/dist/index.d.ts +1 -0
  201. package/dist/index.d.ts.map +1 -1
  202. package/dist/index.js +2 -0
  203. package/dist/instance-nodes.d.ts +159 -0
  204. package/dist/instance-nodes.d.ts.map +1 -0
  205. package/dist/instance-nodes.js +231 -0
  206. package/dist/lexicon.d.ts +72 -0
  207. package/dist/lexicon.d.ts.map +1 -1
  208. package/dist/lifecycle/adoption-file.d.ts +56 -0
  209. package/dist/lifecycle/adoption-file.d.ts.map +1 -0
  210. package/dist/lifecycle/adoption-file.js +123 -0
  211. package/dist/lifecycle/cloud-index.d.ts +186 -0
  212. package/dist/lifecycle/cloud-index.d.ts.map +1 -0
  213. package/dist/lifecycle/cloud-index.js +618 -0
  214. package/dist/lifecycle/derive-edges.d.ts +59 -0
  215. package/dist/lifecycle/derive-edges.d.ts.map +1 -0
  216. package/dist/lifecycle/derive-edges.js +126 -0
  217. package/dist/lifecycle/git.d.ts +10 -9
  218. package/dist/lifecycle/git.d.ts.map +1 -1
  219. package/dist/lifecycle/git.js +7 -1
  220. package/dist/lifecycle/identity-match.d.ts +133 -0
  221. package/dist/lifecycle/identity-match.d.ts.map +1 -0
  222. package/dist/lifecycle/identity-match.js +147 -0
  223. package/dist/lifecycle/index-diff.d.ts +224 -0
  224. package/dist/lifecycle/index-diff.d.ts.map +1 -0
  225. package/dist/lifecycle/index-diff.js +327 -0
  226. package/dist/lifecycle/index-document.d.ts +130 -0
  227. package/dist/lifecycle/index-document.d.ts.map +1 -0
  228. package/dist/lifecycle/index-document.js +189 -0
  229. package/dist/lifecycle/index-drift.d.ts +121 -0
  230. package/dist/lifecycle/index-drift.d.ts.map +1 -0
  231. package/dist/lifecycle/index-drift.js +178 -0
  232. package/dist/lifecycle/index-import.d.ts +168 -0
  233. package/dist/lifecycle/index-import.d.ts.map +1 -0
  234. package/dist/lifecycle/index-import.js +515 -0
  235. package/dist/lifecycle/index-join.d.ts +129 -0
  236. package/dist/lifecycle/index-join.d.ts.map +1 -0
  237. package/dist/lifecycle/index-join.js +248 -0
  238. package/dist/lifecycle/index.d.ts +4 -0
  239. package/dist/lifecycle/index.d.ts.map +1 -1
  240. package/dist/lifecycle/index.js +4 -0
  241. package/dist/lifecycle/observation-baseline.d.ts +61 -21
  242. package/dist/lifecycle/observation-baseline.d.ts.map +1 -1
  243. package/dist/lifecycle/observation-baseline.js +144 -19
  244. package/dist/lifecycle/observe.d.ts.map +1 -1
  245. package/dist/lifecycle/observe.js +6 -1
  246. package/dist/lifecycle/query.d.ts +45 -4
  247. package/dist/lifecycle/query.d.ts.map +1 -1
  248. package/dist/lifecycle/query.js +89 -7
  249. package/dist/lifecycle/replay.d.ts +10 -3
  250. package/dist/lifecycle/replay.d.ts.map +1 -1
  251. package/dist/lifecycle/replay.js +10 -6
  252. package/dist/lifecycle/scenario.d.ts +4 -3
  253. package/dist/lifecycle/scenario.d.ts.map +1 -1
  254. package/dist/lifecycle/snapshot-store-fake.d.ts +9 -0
  255. package/dist/lifecycle/snapshot-store-fake.d.ts.map +1 -0
  256. package/dist/lifecycle/snapshot-store-fake.js +21 -0
  257. package/dist/lifecycle/snapshot-store-s3.d.ts +102 -0
  258. package/dist/lifecycle/snapshot-store-s3.d.ts.map +1 -0
  259. package/dist/lifecycle/snapshot-store-s3.js +254 -0
  260. package/dist/lifecycle/snapshot-store.d.ts +170 -0
  261. package/dist/lifecycle/snapshot-store.d.ts.map +1 -0
  262. package/dist/lifecycle/snapshot-store.js +832 -0
  263. package/dist/lifecycle/snapshot.d.ts +11 -0
  264. package/dist/lifecycle/snapshot.d.ts.map +1 -1
  265. package/dist/lifecycle/snapshot.js +18 -5
  266. package/dist/lifecycle/type-listing.d.ts +148 -0
  267. package/dist/lifecycle/type-listing.d.ts.map +1 -0
  268. package/dist/lifecycle/type-listing.js +166 -0
  269. package/dist/lint/component-checks.d.ts +15 -1
  270. package/dist/lint/component-checks.d.ts.map +1 -1
  271. package/dist/lint/component-checks.js +1 -0
  272. package/dist/lint/presets/relaxed.json +2 -1
  273. package/dist/lint/presets/strict.json +2 -1
  274. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts +4 -0
  275. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts.map +1 -0
  276. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.js +13 -0
  277. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts +4 -0
  278. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts.map +1 -0
  279. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.js +8 -0
  280. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts +33 -0
  281. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts.map +1 -0
  282. package/dist/lint/rules/comp/comp008-applies-signal-only-root.js +123 -0
  283. package/dist/lint/rules/comp/index.d.ts +2 -1
  284. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  285. package/dist/lint/rules/comp/index.js +4 -1
  286. package/dist/observation.d.ts +19 -2
  287. package/dist/observation.d.ts.map +1 -1
  288. package/dist/observation.js +18 -1
  289. package/dist/op/activities/activity-contracts.d.ts +1 -1
  290. package/dist/op/activities/activity-contracts.js +1 -1
  291. package/dist/op/activities/change-set.d.ts +6 -4
  292. package/dist/op/activities/change-set.d.ts.map +1 -1
  293. package/dist/op/activities/change-set.js +4 -2
  294. package/dist/op/activity-failure.d.ts +27 -0
  295. package/dist/op/activity-failure.d.ts.map +1 -1
  296. package/dist/op/activity-failure.js +31 -0
  297. package/dist/op/index.d.ts +2 -1
  298. package/dist/op/index.d.ts.map +1 -1
  299. package/dist/op/index.js +1 -1
  300. package/dist/op/local-executor.d.ts +5 -1
  301. package/dist/op/local-executor.d.ts.map +1 -1
  302. package/dist/op/local-executor.js +22 -8
  303. package/dist/pr-loop.d.ts +56 -1
  304. package/dist/pr-loop.d.ts.map +1 -1
  305. package/dist/pr-loop.js +51 -1
  306. package/dist/pulumi-urn.d.ts +101 -0
  307. package/dist/pulumi-urn.d.ts.map +1 -0
  308. package/dist/pulumi-urn.js +131 -0
  309. package/dist/release-floors.d.ts +23 -0
  310. package/dist/release-floors.d.ts.map +1 -0
  311. package/dist/release-floors.js +22 -0
  312. package/dist/sensitive-key.d.ts +23 -0
  313. package/dist/sensitive-key.d.ts.map +1 -0
  314. package/dist/sensitive-key.js +31 -0
  315. package/dist/wave-runtime.mjs +234 -234
  316. package/dist/workspace/adoption-report.d.ts +53 -0
  317. package/dist/workspace/adoption-report.d.ts.map +1 -0
  318. package/dist/workspace/adoption-report.js +76 -0
  319. package/dist/workspace/capabilities-contract.d.ts +7 -0
  320. package/dist/workspace/capabilities-contract.d.ts.map +1 -1
  321. package/dist/workspace/capabilities-contract.js +2 -1
  322. package/dist/workspace/capabilities.schema.json +98 -0
  323. package/dist/workspace/change-set.schema.json +42 -3
  324. package/dist/workspace/ci-cloud-identity.d.ts +13 -1
  325. package/dist/workspace/ci-cloud-identity.d.ts.map +1 -1
  326. package/dist/workspace/ci-cloud-identity.js +30 -1
  327. package/dist/workspace/compose-graph.d.ts +10 -1
  328. package/dist/workspace/compose-graph.d.ts.map +1 -1
  329. package/dist/workspace/compose-graph.js +6 -1
  330. package/dist/workspace/conformance/index.d.ts +1 -1
  331. package/dist/workspace/conformance/index.d.ts.map +1 -1
  332. package/dist/workspace/conformance/index.js +6 -1
  333. package/dist/workspace/drift-cli.d.ts +81 -0
  334. package/dist/workspace/drift-cli.d.ts.map +1 -0
  335. package/dist/workspace/drift-cli.js +317 -0
  336. package/dist/workspace/drift.schema.json +672 -0
  337. package/dist/workspace/graph-cli.d.ts +2 -0
  338. package/dist/workspace/graph-cli.d.ts.map +1 -1
  339. package/dist/workspace/graph-cli.js +3 -0
  340. package/dist/workspace/graph.schema.json +72 -0
  341. package/dist/workspace/init.d.ts +5 -1
  342. package/dist/workspace/init.d.ts.map +1 -1
  343. package/dist/workspace/init.js +55 -9
  344. package/dist/workspace/ledger.schema.json +1 -1
  345. package/dist/workspace/nested-graph.d.ts.map +1 -1
  346. package/dist/workspace/nested-graph.js +2 -0
  347. package/dist/workspace/pr-report.schema.json +51 -2
  348. package/dist/workspace/promote-waves.d.ts +112 -0
  349. package/dist/workspace/promote-waves.d.ts.map +1 -0
  350. package/dist/workspace/promote-waves.js +290 -0
  351. package/dist/workspace/promote.d.ts +84 -2
  352. package/dist/workspace/promote.d.ts.map +1 -1
  353. package/dist/workspace/promote.js +347 -61
  354. package/dist/workspace/reason-codes.d.ts +12 -0
  355. package/dist/workspace/reason-codes.d.ts.map +1 -1
  356. package/dist/workspace/reason-codes.js +14 -0
  357. package/dist/workspace/search-contract.d.ts +3 -3
  358. package/dist/workspace/search-contract.d.ts.map +1 -1
  359. package/dist/workspace/search-contract.js +2 -0
  360. package/dist/workspace/search.schema.json +103 -5
  361. package/package.json +14 -1
  362. package/src/__fixtures__/drift-record/README.md +58 -0
  363. package/src/__fixtures__/drift-record/choudoufu-cone.ndjson +4 -0
  364. package/src/__fixtures__/drift-record/choudoufu-resource.ndjson +3 -0
  365. package/src/__fixtures__/drift-record/component-status-ledger.json +65 -0
  366. package/src/__fixtures__/drift-record/component-status.json +91 -0
  367. package/src/__fixtures__/drift-record/deep-diff.json +259 -0
  368. package/src/__fixtures__/drift-record/lifecycle-diff-live.json +825 -0
  369. package/src/__fixtures__/drift-record/live-diff.json +125 -0
  370. package/src/audit/discover.e2e.test.ts +14 -0
  371. package/src/audit/discover.ts +3 -1
  372. package/src/behaviour.ts +1 -1
  373. package/src/capabilities/templates.json +145 -0
  374. package/src/capabilities/templates.test.ts +212 -0
  375. package/src/capabilities/templates.ts +204 -0
  376. package/src/change-set-bundle.test.ts +83 -0
  377. package/src/change-set-graph.ts +80 -9
  378. package/src/change-set.test.ts +24 -0
  379. package/src/change-set.ts +77 -14
  380. package/src/ci-identity-targets.test.ts +23 -0
  381. package/src/ci-identity.ts +10 -4
  382. package/src/cli/commands/import-index.test.ts +117 -0
  383. package/src/cli/commands/import-index.ts +265 -0
  384. package/src/cli/commands/lint.ts +4 -2
  385. package/src/cli/handlers/components.test.ts +9 -0
  386. package/src/cli/handlers/components.ts +12 -2
  387. package/src/cli/handlers/fan-out.ts +17 -3
  388. package/src/cli/handlers/graph.test.ts +42 -0
  389. package/src/cli/handlers/graph.ts +26 -4
  390. package/src/cli/handlers/index-cloud.ts +32 -0
  391. package/src/cli/handlers/index-diff.test.ts +68 -0
  392. package/src/cli/handlers/index-diff.ts +146 -0
  393. package/src/cli/handlers/ledger-root-member.test.ts +161 -0
  394. package/src/cli/handlers/lifecycle-drift.ts +68 -0
  395. package/src/cli/handlers/lifecycle.test.ts +33 -11
  396. package/src/cli/handlers/lifecycle.ts +205 -30
  397. package/src/cli/handlers/misc.ts +73 -0
  398. package/src/cli/handlers/pr-waves-blocked.test.ts +37 -2
  399. package/src/cli/handlers/pr.ts +14 -2
  400. package/src/cli/handlers/promote.test.ts +64 -0
  401. package/src/cli/handlers/promote.ts +81 -6
  402. package/src/cli/handlers/query.ts +27 -4
  403. package/src/cli/handlers/run-declared-reads-cli.test.ts +187 -0
  404. package/src/cli/handlers/run-groups-cli.test.ts +229 -0
  405. package/src/cli/handlers/scenario.test.ts +13 -0
  406. package/src/cli/handlers/scenario.ts +8 -7
  407. package/src/cli/handlers/search-index.test.ts +255 -0
  408. package/src/cli/handlers/search-json.test.ts +1 -1
  409. package/src/cli/handlers/search-ownership.test.ts +194 -0
  410. package/src/cli/handlers/search.ts +271 -38
  411. package/src/cli/main.test.ts +7 -0
  412. package/src/cli/main.ts +56 -1
  413. package/src/cli/mcp/lifecycle-tools.ts +3 -2
  414. package/src/cli/mcp/resource-handlers.ts +4 -3
  415. package/src/cli/mcp/workspace-tools.ts +1 -1
  416. package/src/cli/parse-args.ts +40 -2
  417. package/src/cli/registry.ts +19 -1
  418. package/src/cloud-lister/aws.test.ts +202 -0
  419. package/src/cloud-lister/aws.ts +226 -0
  420. package/src/cloud-lister/azure.test.ts +132 -0
  421. package/src/cloud-lister/azure.ts +142 -0
  422. package/src/cloud-lister/common.ts +115 -0
  423. package/src/cloud-lister/credentials.ts +110 -0
  424. package/src/cloud-lister/fakes.ts +66 -0
  425. package/src/cloud-lister/gcp.test.ts +121 -0
  426. package/src/cloud-lister/gcp.ts +159 -0
  427. package/src/cloud-lister/guard.test.ts +198 -0
  428. package/src/cloud-lister/guard.ts +111 -0
  429. package/src/cloud-lister/ids.ts +54 -0
  430. package/src/cloud-lister/index.ts +134 -0
  431. package/src/cloud-lister/kubernetes.test.ts +160 -0
  432. package/src/cloud-lister/kubernetes.ts +284 -0
  433. package/src/cloud-lister/markers.ts +74 -0
  434. package/src/cloud-lister/mask.ts +77 -0
  435. package/src/cloud-lister/shape.test.ts +81 -0
  436. package/src/cloud-lister/sigv4.ts +70 -0
  437. package/src/cloud-lister/transport.ts +118 -0
  438. package/src/cloud-lister/types.ts +135 -0
  439. package/src/components/capability-plugin-loader.ts +4 -0
  440. package/src/components/capability-plugin.ts +10 -0
  441. package/src/components/capability.ts +229 -0
  442. package/src/components/cli-support.ts +70 -14
  443. package/src/components/declared-reads.test.ts +103 -0
  444. package/src/components/declared-reads.ts +134 -0
  445. package/src/components/deploy-units.ts +4 -0
  446. package/src/components/driver.ts +89 -4
  447. package/src/components/fan-out-run.ts +95 -15
  448. package/src/components/fan-out-support.ts +10 -1
  449. package/src/components/fan-out.ts +30 -0
  450. package/src/components/groups.test.ts +320 -0
  451. package/src/components/groups.ts +880 -0
  452. package/src/components/index.ts +42 -0
  453. package/src/components/plan-shape-conformance.ts +130 -0
  454. package/src/components/pr-env-run-bundle.test.ts +2 -0
  455. package/src/components/pr-run.test.ts +516 -3
  456. package/src/components/pr-run.ts +231 -41
  457. package/src/components/promote-rounds.ts +25 -2
  458. package/src/components/promote.ts +55 -5
  459. package/src/components/registry.test.ts +1 -1
  460. package/src/components/release-gate.ts +115 -30
  461. package/src/components/release-groups.test.ts +362 -0
  462. package/src/components/run-groups.ts +113 -0
  463. package/src/components/starter-plugin.ts +6 -0
  464. package/src/components/verbs/index.ts +1 -0
  465. package/src/components/verbs/member-outputs.test.ts +205 -0
  466. package/src/components/verbs/member-outputs.ts +308 -0
  467. package/src/config.ts +44 -0
  468. package/src/deep-observation.ts +5 -23
  469. package/src/drift-record.test.ts +596 -0
  470. package/src/drift-record.ts +1206 -0
  471. package/src/engine-facts.guard.test.ts +111 -0
  472. package/src/engine-facts.test.ts +178 -0
  473. package/src/engine-facts.ts +154 -0
  474. package/src/gated-waves-bundle.test.ts +2 -0
  475. package/src/graph-ir-live.test.ts +92 -0
  476. package/src/graph-ir.ts +317 -7
  477. package/src/graph-refs.ts +416 -0
  478. package/src/graph-schema/fixtures/adopt.json +15 -0
  479. package/src/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  480. package/src/graph-schema/fixtures/index.json +68 -0
  481. package/src/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  482. package/src/graph-schema/fixtures.ts +267 -0
  483. package/src/graph-schema/generate.ts +263 -0
  484. package/src/graph-schema/graph-schema.test.ts +153 -0
  485. package/src/graph-schema/graph.schema.json +1387 -0
  486. package/src/health.schema.json +2 -1
  487. package/src/identity.ts +2 -0
  488. package/src/index.ts +2 -0
  489. package/src/instance-nodes.ts +288 -0
  490. package/src/lexicon.ts +76 -0
  491. package/src/lifecycle/__fixtures__/index-diff/20261026T120000Z-aaaaaaaaaaaa.json +149 -0
  492. package/src/lifecycle/__fixtures__/index-diff/20261026T130000Z-bbbbbbbbbbbb.json +127 -0
  493. package/src/lifecycle/adoption-file.test.ts +100 -0
  494. package/src/lifecycle/adoption-file.ts +154 -0
  495. package/src/lifecycle/cloud-index.test.ts +517 -0
  496. package/src/lifecycle/cloud-index.ts +736 -0
  497. package/src/lifecycle/derive-edges.test.ts +193 -0
  498. package/src/lifecycle/derive-edges.ts +182 -0
  499. package/src/lifecycle/git.ts +10 -4
  500. package/src/lifecycle/identity-match.test.ts +308 -0
  501. package/src/lifecycle/identity-match.ts +257 -0
  502. package/src/lifecycle/index-diff.test.ts +198 -0
  503. package/src/lifecycle/index-diff.ts +476 -0
  504. package/src/lifecycle/index-document.test.ts +64 -0
  505. package/src/lifecycle/index-document.ts +299 -0
  506. package/src/lifecycle/index-drift.test.ts +191 -0
  507. package/src/lifecycle/index-drift.ts +304 -0
  508. package/src/lifecycle/index-import.test.ts +255 -0
  509. package/src/lifecycle/index-import.ts +634 -0
  510. package/src/lifecycle/index-join.test.ts +250 -0
  511. package/src/lifecycle/index-join.ts +304 -0
  512. package/src/lifecycle/index-store-load-bearing.test.ts +187 -0
  513. package/src/lifecycle/index.ts +4 -0
  514. package/src/lifecycle/member-ledger.test.ts +25 -7
  515. package/src/lifecycle/observation-baseline.test.ts +72 -1
  516. package/src/lifecycle/observation-baseline.ts +190 -27
  517. package/src/lifecycle/observe.ts +6 -1
  518. package/src/lifecycle/query.test.ts +69 -1
  519. package/src/lifecycle/query.ts +103 -10
  520. package/src/lifecycle/replay.test.ts +9 -5
  521. package/src/lifecycle/replay.ts +9 -5
  522. package/src/lifecycle/scenario.ts +4 -3
  523. package/src/lifecycle/snapshot-store-fake.ts +29 -0
  524. package/src/lifecycle/snapshot-store-s3.ts +316 -0
  525. package/src/lifecycle/snapshot-store.test.ts +385 -0
  526. package/src/lifecycle/snapshot-store.ts +981 -0
  527. package/src/lifecycle/snapshot.test.ts +13 -0
  528. package/src/lifecycle/snapshot.ts +23 -6
  529. package/src/lifecycle/type-listing.test.ts +166 -0
  530. package/src/lifecycle/type-listing.ts +309 -0
  531. package/src/lint/component-checks.ts +17 -1
  532. package/src/lint/config.test.ts +3 -0
  533. package/src/lint/presets/relaxed.json +2 -1
  534. package/src/lint/presets/strict.json +2 -1
  535. package/src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts +15 -0
  536. package/src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts +10 -0
  537. package/src/lint/rules/comp/comp.test.ts +2 -1
  538. package/src/lint/rules/comp/comp008-applies-signal-only-root.ts +121 -0
  539. package/src/lint/rules/comp/comp008.test.ts +77 -0
  540. package/src/lint/rules/comp/index.ts +4 -1
  541. package/src/observation-edges.test.ts +33 -0
  542. package/src/observation.ts +36 -1
  543. package/src/op/activities/activity-contracts.ts +1 -1
  544. package/src/op/activities/change-set.ts +8 -5
  545. package/src/op/activity-failure.ts +36 -0
  546. package/src/op/index.ts +2 -1
  547. package/src/op/local-executor.test.ts +80 -0
  548. package/src/op/local-executor.ts +27 -9
  549. package/src/pr-loop-bundle.test.ts +5 -2
  550. package/src/pr-loop.test.ts +43 -0
  551. package/src/pr-loop.ts +111 -2
  552. package/src/pulumi-urn.ts +151 -0
  553. package/src/release-floors.ts +22 -0
  554. package/src/sensitive-key.ts +34 -0
  555. package/src/workspace/adoption-report.test.ts +61 -0
  556. package/src/workspace/adoption-report.ts +103 -0
  557. package/src/workspace/capabilities-contract.test.ts +4 -0
  558. package/src/workspace/capabilities-contract.ts +9 -1
  559. package/src/workspace/capabilities.schema.json +98 -0
  560. package/src/workspace/change-set.schema.json +42 -3
  561. package/src/workspace/ci-cloud-identity.ts +31 -1
  562. package/src/workspace/compose-graph.test.ts +12 -0
  563. package/src/workspace/compose-graph.ts +12 -1
  564. package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
  565. package/src/workspace/conformance/index.ts +6 -1
  566. package/src/workspace/drift-cli.test.ts +65 -0
  567. package/src/workspace/drift-cli.ts +365 -0
  568. package/src/workspace/drift.schema.json +672 -0
  569. package/src/workspace/graph-cli.ts +5 -0
  570. package/src/workspace/graph.schema.json +72 -0
  571. package/src/workspace/init.test.ts +38 -1
  572. package/src/workspace/init.ts +50 -8
  573. package/src/workspace/intent-gaps.test.ts +18 -2
  574. package/src/workspace/ledger.schema.json +1 -1
  575. package/src/workspace/nested-graph.ts +1 -0
  576. package/src/workspace/pr-report.schema.json +51 -2
  577. package/src/workspace/promote-waves.test.ts +296 -0
  578. package/src/workspace/promote-waves.ts +340 -0
  579. package/src/workspace/promote.test.ts +158 -4
  580. package/src/workspace/promote.ts +398 -57
  581. package/src/workspace/reason-codes.test.ts +4 -1
  582. package/src/workspace/reason-codes.ts +14 -0
  583. package/src/workspace/search-contract.ts +2 -0
  584. package/src/workspace/search.schema.json +103 -5
@@ -0,0 +1,290 @@
1
+ /**
2
+ * `chant workspace promote --all` (#4461): adopt a workspace of plain
3
+ * Terraform roots into choudoufu in waves, a canary first.
4
+ *
5
+ * Each root goes through {@link promoteCommand} on its own, so each root has
6
+ * its own gate, `workspace-promote/<member>`, whose digest binds that root's
7
+ * own `live-import` report. A root that fails leaves every other root as it
8
+ * was: its staging ran in a worktree, and nothing of it reached the tree.
9
+ *
10
+ * The order:
11
+ *
12
+ * - The canary (`--canary <member>`, else the first candidate in declaration
13
+ * order) is wave 1. Unless every canary lands, no other wave runs.
14
+ * - The rest follow in declaration order, `--wave-size` roots a wave. Every
15
+ * root of a wave is tried even when one of them fails, and the next wave
16
+ * runs only when the whole wave landed.
17
+ *
18
+ * A root lands when it was applied, was already promoted, or (under
19
+ * `--dry-run`) staged cleanly. A gated root has not landed: approve its gate
20
+ * and run the same command again. Roots already of kind `choudoufu` report
21
+ * `already-promoted` and are not staged again, so a re-run over a workspace
22
+ * that has landed is a no-op. A root whose kind was written but whose
23
+ * `live-import -approve` failed is kind `choudoufu` with a pending stamp
24
+ * (#4485): a re-run retries the stamp, and the root lands once it passes or
25
+ * stays `stamp-failed` with the command to run.
26
+ *
27
+ * Before a root is staged its state is checked: `live-import` reads a local
28
+ * tfstate of format version 4, so a missing state under a remote backend, or
29
+ * a state of another version, refuses that root by name.
30
+ */
31
+ import { existsSync, readdirSync, readFileSync, realpathSync } from "node:fs";
32
+ import { join, resolve } from "node:path";
33
+ import { formatError, formatInfo, formatSuccess, formatWarning } from "../cli/format.js";
34
+ import { readDeclaration } from "./declaration.js";
35
+ import { PROMOTE_GATED_EXIT, PromoteError, promoteCommand, readPendingStamp, retryPendingStamp, stampCommand } from "./promote.js";
36
+ import { workingTree } from "./tree.js";
37
+ export const DEFAULT_WAVE_SIZE = 5;
38
+ const LANDED = new Set(["applied", "already-promoted", "dry-run"]);
39
+ /** Parse `--state <member>=<path>` values. */
40
+ export function parseStateMappings(values) {
41
+ const out = {};
42
+ for (const v of values) {
43
+ const at = v.indexOf("=");
44
+ if (at <= 0 || at === v.length - 1)
45
+ throw new PromoteError(`--state with --all takes <member>=<terraform.tfstate>: got "${v}"`);
46
+ const member = v.slice(0, at);
47
+ if (out[member] !== undefined)
48
+ throw new PromoteError(`--state names ${member} twice`);
49
+ out[member] = v.slice(at + 1);
50
+ }
51
+ return out;
52
+ }
53
+ /** The waves: the canaries first, then the rest in declaration order, `size` at a time. */
54
+ export function planWaves(candidates, canary, size) {
55
+ if (!Number.isInteger(size) || size < 1)
56
+ throw new PromoteError(`--wave-size needs a whole number from 1: got ${size}`);
57
+ for (const c of canary) {
58
+ if (!candidates.includes(c))
59
+ throw new PromoteError(`--canary ${c} is not one of the roots being promoted (${candidates.join(", ") || "none"})`);
60
+ }
61
+ const first = canary.length > 0 ? [...new Set(canary)] : candidates.slice(0, 1);
62
+ const rest = candidates.filter((m) => !first.includes(m));
63
+ const waves = first.length > 0 ? [first] : [];
64
+ for (let i = 0; i < rest.length; i += size)
65
+ waves.push(rest.slice(i, i + size));
66
+ return waves;
67
+ }
68
+ /** The backend a root's .tf files declare, or undefined for none or `local`. */
69
+ export function remoteBackend(dir) {
70
+ let files;
71
+ try {
72
+ files = readdirSync(dir).filter((f) => f.endsWith(".tf"));
73
+ }
74
+ catch {
75
+ return undefined;
76
+ }
77
+ for (const f of files) {
78
+ const text = readFileSync(join(dir, f), "utf-8").replace(/^\s*(#|\/\/).*$/gm, "");
79
+ const backend = /\bbackend\s+"([^"]+)"/.exec(text);
80
+ if (backend && backend[1] !== "local")
81
+ return backend[1];
82
+ if (/^\s*cloud\s*\{/m.test(text))
83
+ return "cloud";
84
+ }
85
+ return undefined;
86
+ }
87
+ /**
88
+ * Why `state` cannot feed `live-import` for `member`, or undefined when it
89
+ * can: it must be a local tfstate of format version 4.
90
+ */
91
+ export function stateRefusal(member, memberDir, state) {
92
+ const backend = remoteBackend(memberDir);
93
+ if (!existsSync(state)) {
94
+ if (backend) {
95
+ return `${member} uses the ${backend} backend and has no local state at ${state}: live-import reads a local tfstate, so run \`terraform state pull > ${state}\` in ${memberDir} first (or pass --state ${member}=<pulled file>)`;
96
+ }
97
+ return `${member} has no state at ${state}: pass --state ${member}=<terraform.tfstate> or --state-dir <dir>`;
98
+ }
99
+ let parsed;
100
+ try {
101
+ parsed = JSON.parse(readFileSync(state, "utf-8"));
102
+ }
103
+ catch {
104
+ return `${member}: ${state} is not a JSON tfstate`;
105
+ }
106
+ const version = parsed?.version;
107
+ if (version !== 4) {
108
+ const hint = parsed?.backend !== undefined
109
+ ? " It looks like .terraform/terraform.tfstate, the backend's settings: run `terraform state pull` for the state itself."
110
+ : "";
111
+ return `${member}: ${state} is a version ${String(version)} state; live-import reads version 4 only (Terraform 0.12 and later).${hint}`;
112
+ }
113
+ return undefined;
114
+ }
115
+ function reportCounts(r) {
116
+ if (!r.adoption)
117
+ return {};
118
+ return {
119
+ eligible: { stampable: r.adoption.claimed, total: r.adoption.total },
120
+ unadmitted: r.adoption.entries.filter((e) => e.status === "UNADMITTED_TYPE").length,
121
+ };
122
+ }
123
+ function stampCounts(text) {
124
+ const m = text ? /(\d+) resource\(s\) newly stamped, (\d+) already stamped, .*?(\d+) failed/.exec(text) : null;
125
+ return m ? { newly: Number(m[1]), already: Number(m[2]), failed: Number(m[3]) } : undefined;
126
+ }
127
+ function rootOutcome(r) {
128
+ if (r.outcome === "applied")
129
+ return r.exitCode === 0 ? "applied" : "stamp-failed";
130
+ if (r.outcome === "top-of-ladder")
131
+ return "already-promoted";
132
+ return r.outcome;
133
+ }
134
+ export async function promoteWavesCommand(opts) {
135
+ const root = resolve(opts.root);
136
+ const decl = readDeclaration(workingTree(root));
137
+ const states = opts.states ?? {};
138
+ const say = (m) => {
139
+ if (!opts.json)
140
+ console.error(m);
141
+ };
142
+ for (const name of Object.keys(states)) {
143
+ if (!decl.members.some((m) => m.name === name))
144
+ throw new PromoteError(`--state names ${name}, which the declaration has no member of`);
145
+ }
146
+ const selected = decl.members.filter((m) => (opts.all ? m.kind === "terraform" || m.kind === "choudoufu" : states[m.name] !== undefined));
147
+ if (selected.length === 0) {
148
+ throw new PromoteError(opts.all ? "the declaration has no member of kind terraform to promote" : "name the roots with --state <member>=<path>, or pass --all");
149
+ }
150
+ for (const m of selected) {
151
+ if (m.kind !== "terraform" && m.kind !== "choudoufu")
152
+ throw new PromoteError(`${m.name} is kind ${m.kind}; promote --all adopts terraform roots into choudoufu`);
153
+ }
154
+ // The waves are planned over every selected root, promoted or not, so a
155
+ // re-run keeps the same waves and the same canary: an already promoted
156
+ // root lands in its wave without being staged.
157
+ const waves = planWaves(selected.map((m) => m.name), opts.canary ?? [], opts.waveSize ?? DEFAULT_WAVE_SIZE);
158
+ const byName = new Map(selected.map((m) => [m.name, m]));
159
+ const roots = [];
160
+ const stateFor = (name) => {
161
+ const dir = byName.get(name).dir;
162
+ if (states[name] !== undefined)
163
+ return resolve(states[name]);
164
+ if (opts.stateDir)
165
+ return resolve(opts.stateDir, `${name}.tfstate`);
166
+ return join(root, dir, "terraform.tfstate");
167
+ };
168
+ let stopped;
169
+ for (const [i, wave] of waves.entries()) {
170
+ const n = i + 1;
171
+ const canary = i === 0;
172
+ if (stopped) {
173
+ for (const name of wave)
174
+ roots.push({ member: name, wave: n, canary, outcome: "not-run", kind: byName.get(name).kind, reason: stopped });
175
+ continue;
176
+ }
177
+ say(formatInfo(`wave ${n}${canary ? " (canary)" : ""}: ${wave.join(", ")}`));
178
+ const results = [];
179
+ for (const name of wave) {
180
+ const member = byName.get(name);
181
+ const state = stateFor(name);
182
+ if (member.kind !== "terraform") {
183
+ const pending = member.kind === "choudoufu" ? readPendingStamp(realpathSync(root), name) : undefined;
184
+ if (!pending || opts.dryRun) {
185
+ const why = pending ? `already kind ${member.kind}; its stamp is pending and --dry-run does not retry it` : `already kind ${member.kind}; nothing staged`;
186
+ results.push({ member: name, wave: n, canary, outcome: pending ? "stamp-failed" : "already-promoted", kind: member.kind, reason: why });
187
+ continue;
188
+ }
189
+ // #4485: the kind was written and the stamp failed; retry the stamp, against the state this run names if it names one.
190
+ const explicit = states[name] !== undefined || opts.stateDir !== undefined ? stateFor(name) : undefined;
191
+ const row = { member: name, wave: n, canary, outcome: "stamp-failed", kind: member.kind, state: explicit ?? pending.state };
192
+ try {
193
+ const r = (await retryPendingStamp({ root, member: name, ...(explicit ? { state: explicit } : {}), ...(opts.json !== undefined ? { json: opts.json } : {}), ...(opts.runner ? { runner: opts.runner } : {}) }));
194
+ row.outcome = rootOutcome(r);
195
+ const stamped = stampCounts(r.followUpOutput);
196
+ if (stamped)
197
+ row.stamped = stamped;
198
+ row.reason = row.outcome === "applied"
199
+ ? `kind written by an earlier run; its failed stamp was retried and passed`
200
+ : `kind written, but ${r.followUpFailed} failed again; live-import is safe to re-run: ${stampCommand({ name, dir: member.dir }, row.state)}`;
201
+ }
202
+ catch (err) {
203
+ if (!(err instanceof PromoteError))
204
+ throw err;
205
+ row.reason = err.message;
206
+ say(formatError({ message: `${name}: ${err.message}` }));
207
+ }
208
+ results.push(row);
209
+ continue;
210
+ }
211
+ const row = { member: name, wave: n, canary, outcome: "failed", kind: member.kind, state };
212
+ const refusal = stateRefusal(name, join(root, member.dir), state);
213
+ if (refusal) {
214
+ row.outcome = "refused";
215
+ row.reason = refusal;
216
+ say(formatError({ message: refusal }));
217
+ results.push(row);
218
+ continue;
219
+ }
220
+ try {
221
+ const r = await promoteCommand({
222
+ root,
223
+ member: name,
224
+ state,
225
+ dryRun: opts.dryRun,
226
+ json: opts.json,
227
+ nested: true,
228
+ ...(opts.runner ? { runner: opts.runner } : {}),
229
+ ...(opts.ledger ? { ledger: opts.ledger } : {}),
230
+ ...(opts.now ? { now: opts.now } : {}),
231
+ });
232
+ row.outcome = rootOutcome(r);
233
+ if (r.digest)
234
+ row.digest = r.digest;
235
+ if (r.reportDigest)
236
+ row.reportDigest = r.reportDigest;
237
+ Object.assign(row, reportCounts(r));
238
+ const stamped = stampCounts(r.followUpOutput);
239
+ if (stamped)
240
+ row.stamped = stamped;
241
+ if (row.outcome === "checks-failed")
242
+ row.reason = r.failureOutput?.split("\n").at(-1) || "a staging check failed";
243
+ if (row.outcome === "stamp-failed") {
244
+ row.reason = `kind written, but ${r.followUpFailed} failed; run this again to retry the stamp, or run it by hand (live-import is safe to re-run): ${stampCommand({ name, dir: member.dir }, state)}`;
245
+ }
246
+ if (row.outcome === "gated")
247
+ row.reason = `approve with \`chant approve workspace-promote ${name}\`, then run this again`;
248
+ }
249
+ catch (err) {
250
+ if (!(err instanceof PromoteError))
251
+ throw err;
252
+ row.outcome = "failed";
253
+ row.reason = err.message;
254
+ say(formatError({ message: `${name}: ${err.message}` }));
255
+ }
256
+ results.push(row);
257
+ }
258
+ roots.push(...results);
259
+ const short = results.filter((r) => !LANDED.has(r.outcome));
260
+ if (short.length > 0) {
261
+ stopped = `${canary ? "the canary wave" : `wave ${n}`} did not land (${short.map((r) => `${r.member} ${r.outcome}`).join(", ")})`;
262
+ }
263
+ }
264
+ const failed = roots.some((r) => r.outcome === "refused" || r.outcome === "checks-failed" || r.outcome === "failed" || r.outcome === "stamp-failed");
265
+ const gated = roots.some((r) => r.outcome === "gated");
266
+ const outcome = failed ? "failed" : gated ? "gated" : opts.dryRun ? "dry-run" : "landed";
267
+ const exitCode = failed ? 1 : gated ? PROMOTE_GATED_EXIT : 0;
268
+ const summary = { outcome, exitCode, waves, roots };
269
+ if (opts.json) {
270
+ console.log(JSON.stringify(summary, null, 2));
271
+ }
272
+ else {
273
+ say("");
274
+ for (const r of roots) {
275
+ const counts = [
276
+ r.eligible ? `${r.eligible.stampable} of ${r.eligible.total} stampable` : "",
277
+ r.unadmitted ? `${r.unadmitted} unadmitted, not stamped` : "",
278
+ r.stamped ? `${r.stamped.newly} newly stamped, ${r.stamped.already} already stamped, ${r.stamped.failed} failed` : "",
279
+ ].filter(Boolean).join("; ");
280
+ const where = `wave ${r.wave}${r.canary ? " canary" : ""}`;
281
+ const line = `${r.member} ${where} ${r.outcome}${counts ? ` (${counts})` : ""}${r.reason ? `: ${r.reason}` : ""}`;
282
+ say(LANDED.has(r.outcome) ? formatInfo(line) : r.outcome === "gated" || r.outcome === "not-run" ? formatWarning({ message: line }) : formatError({ message: line }));
283
+ }
284
+ if (outcome === "landed")
285
+ say(formatSuccess(`every root landed. Review and commit the declaration.`));
286
+ else if (outcome === "gated")
287
+ say(formatInfo("approve the pending gates and run the same command again; landed roots are not staged twice"));
288
+ }
289
+ return summary;
290
+ }
@@ -13,17 +13,45 @@
13
13
  *
14
14
  * Rungs:
15
15
  *
16
- * - `terraform` to `choudoufu`: `choudoufu live-check` in the member's
16
+ * - `terraform` to `choudoufu`: `choudoufu init -backend=false` installs the
17
+ * providers in the staging worktree, which has no `.terraform/` of its own
18
+ * (#4461: `live-import` reads each resource through its provider), then
19
+ * `choudoufu live-check` in the member's
17
20
  * directory must pass, then `choudoufu live-import -state=<--state>
18
21
  * -estate=<member>` prints its ratification report (read-only: it stamps
19
- * nothing without `-approve`). The patch changes the member's kind.
22
+ * nothing without `-approve`). The patch changes the member's kind. The
23
+ * report, one entry per resource with its status, rides on `--json` as
24
+ * `adoption` (INTENTIUS/behold#999, ./adoption-report.ts), so
25
+ * `--dry-run --json` is the read-only way to ask what adopting would claim.
20
26
  * - `choudoufu` or `other` to `chant`: `chant import` writes TypeScript into
21
27
  * the member's directory. The patch holds those files and the kind change.
22
28
  *
29
+ * The digest covers the member, the rung, what the staging changed outside
30
+ * the declaration, and (for `choudoufu`) the digest of the `live-import`
31
+ * report, so an approval is for the report the approver read. The kind change
32
+ * itself is written into the tree's declaration on apply rather than carried
33
+ * as a hunk, so promoting one member never conflicts with another member's
34
+ * uncommitted promotion (#4461: `--all` promotes a workspace in waves, see
35
+ * `./promote-waves.ts`).
36
+ *
37
+ * The stamp (`live-import -approve`) runs in the staging worktree's member
38
+ * directory, where `choudoufu init -backend=false` already installed the
39
+ * providers, so the member's own directory needs none (chant#4492).
40
+ *
41
+ * When `live-import -approve` fails after the kind change is written, the
42
+ * promote leaves a stamp record under `.chant/workspace-promote/` (#4485). A
43
+ * re-run finds the member already of kind `choudoufu` and the record, and
44
+ * retries the stamp ({@link retryPendingStamp}) rather than reporting it
45
+ * promoted or starting the next rung. The retry has no staging of its own to
46
+ * reuse, so it stages one first: a worktree at HEAD with the tree's changes to
47
+ * the member, and `choudoufu init -backend=false` in it. The record goes once
48
+ * a stamp passes.
49
+ *
23
50
  * Commands run through an injectable runner, so a test never starts a binary.
24
51
  */
25
52
  import type { CommandContext } from "../cli/registry.js";
26
53
  import { type GateLedgerPort } from "../op/gate.js";
54
+ import { type AdoptionReport } from "./adoption-report.js";
27
55
  export declare const PROMOTE_PLAN_KIND = "workspace-promote";
28
56
  export declare const PROMOTE_GATED_EXIT = 3;
29
57
  export declare class PromoteError extends Error {
@@ -41,6 +69,8 @@ export interface CommandRun {
41
69
  argv: string[];
42
70
  /** Directory relative to the project root. */
43
71
  cwd: string;
72
+ /** The `live-import` ratification report: its output is digested into the gate. */
73
+ report?: boolean;
44
74
  }
45
75
  export type PromoteRunner = (argv: string[], cwd: string) => Promise<{
46
76
  exitCode: number;
@@ -62,6 +92,44 @@ export declare function followUpRuns(rung: Rung, member: {
62
92
  }, opts: {
63
93
  state?: string;
64
94
  }): CommandRun[];
95
+ /** Where a promote keeps what a re-run needs, relative to the project root. */
96
+ export declare const PROMOTE_RECORD_DIR = ".chant/workspace-promote";
97
+ export declare const PENDING_STAMP_SCHEMA = "chant-workspace-promote-stamp/v1";
98
+ /** A stamp the kind change was written for and that did not pass (#4485). */
99
+ export interface PendingStamp {
100
+ schema: typeof PENDING_STAMP_SCHEMA;
101
+ member: string;
102
+ /** The member's directory, relative to the project root. */
103
+ dir: string;
104
+ /** The state `live-import -approve` read, absolute. */
105
+ state: string;
106
+ /** The follow-up that failed. */
107
+ failed: string;
108
+ /** ISO 8601. */
109
+ at: string;
110
+ }
111
+ /** The stamp a promote of `member` left failed, or undefined when none is pending. */
112
+ export declare function readPendingStamp(root: string, member: string): PendingStamp | undefined;
113
+ /** The `live-import -approve` line to run by hand for a pending stamp. */
114
+ export declare function stampCommand(member: {
115
+ name: string;
116
+ dir: string;
117
+ }, state: string): string;
118
+ /**
119
+ * Retry the stamp an earlier promote of `member` left failed (#4485), or
120
+ * undefined when none is pending. The member is already of kind
121
+ * `choudoufu`: its kind change was written, so only the stamp runs, against
122
+ * `state` when given, else the state the record names. The result is
123
+ * `applied`: exit 0 once the stamp passed, exit 1 with the failed follow-up
124
+ * when it failed again.
125
+ */
126
+ export declare function retryPendingStamp(opts: {
127
+ root: string;
128
+ member: string;
129
+ state?: string;
130
+ json?: boolean;
131
+ runner?: PromoteRunner;
132
+ }): Promise<PromoteResult | undefined>;
65
133
  export interface PromoteOptions {
66
134
  root: string;
67
135
  member: string;
@@ -70,6 +138,8 @@ export interface PromoteOptions {
70
138
  dryRun?: boolean;
71
139
  output?: string;
72
140
  json?: boolean;
141
+ /** Run by `promote --all` (#4461): print no JSON of its own, the wave summary does. */
142
+ nested?: boolean;
73
143
  /** For tests. */
74
144
  runner?: PromoteRunner;
75
145
  ledger?: GateLedgerPort;
@@ -84,10 +154,22 @@ export interface PromoteResult {
84
154
  to?: string;
85
155
  digest?: string;
86
156
  patch?: string;
157
+ /** Digest of the `live-import` report the gate binds (terraform to choudoufu). */
158
+ reportDigest?: string;
87
159
  ran?: {
88
160
  label: string;
89
161
  exitCode: number;
90
162
  }[];
163
+ /** The `terraform` to `choudoufu` rung's adoption report, from `live-import` without `-approve`. */
164
+ adoption?: AdoptionReport;
165
+ /** The label of the follow-up that failed after the patch was applied. */
166
+ followUpFailed?: string;
167
+ /** The last output of the failed check or follow-up. */
168
+ failureOutput?: string;
169
+ /** The follow-up's output when it ran (the stamp report). */
170
+ followUpOutput?: string;
171
+ /** Set when this run only retried the stamp an earlier one left failed (#4485). */
172
+ retriedStamp?: true;
91
173
  }
92
174
  /** Rewrite the member's `kind` in the declaration text. */
93
175
  export declare function setMemberKind(text: string, file: string, member: string, kind: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/workspace/promote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/workspace/promote.ts"],"names":[],"mappings":"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"}