@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
@@ -0,0 +1,118 @@
1
+ /**
2
+ * behold#1029: the lister's one way onto the network.
3
+ *
4
+ * {@link Transport.send} runs, in order: the read-only check
5
+ * (packages/core/src/cloud-lister/guard.ts), the origin pin, then the fetcher. The pin is
6
+ * the goal's never-public-cloud rule in code: when a run names its own
7
+ * endpoint (an emulator), every call must go to that endpoint's origin, so a
8
+ * URL built wrong can never reach a public cloud host. A test passes its own
9
+ * {@link Fetcher}; production uses {@link nodeFetcher}, which is node's own
10
+ * http/https so a cluster's CA and client certificate can be passed
11
+ * explicitly.
12
+ */
13
+
14
+ import { request as httpRequest } from "node:http";
15
+ import { request as httpsRequest } from "node:https";
16
+ import { assertReadCall, type WireCall } from "./guard";
17
+
18
+ export interface WireResponse {
19
+ status: number;
20
+ headers: Record<string, string>;
21
+ body: string;
22
+ }
23
+
24
+ /** TLS material for one target, passed explicitly; nothing is read from the environment. */
25
+ export interface TlsOptions {
26
+ ca?: string;
27
+ cert?: string;
28
+ key?: string;
29
+ /** Only for a local emulator whose certificate the caller chose not to pin. */
30
+ insecureSkipVerify?: boolean;
31
+ }
32
+
33
+ export type Fetcher = (call: WireCall, tls: TlsOptions | undefined) => Promise<WireResponse>;
34
+
35
+ export class OriginRefused extends Error {
36
+ constructor(readonly url: string, readonly allowed: string) {
37
+ super(`chant's cloud lister refused ${url}: this run is pinned to ${allowed}`);
38
+ this.name = "OriginRefused";
39
+ }
40
+ }
41
+
42
+ export interface TransportOptions {
43
+ fetcher?: Fetcher;
44
+ /** When set, every call must go to this origin (an explicit endpoint). */
45
+ pinnedOrigin?: string;
46
+ tls?: TlsOptions;
47
+ /** Called with each call that passed the guard, before it is sent (tests record with it). */
48
+ onSend?: (call: WireCall, operation: string) => void;
49
+ }
50
+
51
+ export class Transport {
52
+ readonly calls: Array<{ call: WireCall; operation: string }> = [];
53
+ private readonly fetcher: Fetcher;
54
+
55
+ constructor(private readonly options: TransportOptions = {}) {
56
+ this.fetcher = options.fetcher ?? nodeFetcher;
57
+ }
58
+
59
+ async send(call: WireCall): Promise<WireResponse> {
60
+ const operation = assertReadCall(call);
61
+ if (this.options.pinnedOrigin !== undefined) {
62
+ const origin = new URL(call.url).origin;
63
+ if (origin !== new URL(this.options.pinnedOrigin).origin) throw new OriginRefused(call.url, this.options.pinnedOrigin);
64
+ }
65
+ this.calls.push({ call, operation });
66
+ this.options.onSend?.(call, operation);
67
+ return this.fetcher(call, this.options.tls);
68
+ }
69
+ }
70
+
71
+ /** node's http/https, one request, the whole body read as text. */
72
+ export const nodeFetcher: Fetcher = (call, tls) =>
73
+ new Promise((resolve, reject) => {
74
+ const url = new URL(call.url);
75
+ const secure = url.protocol === "https:";
76
+ const send = secure ? httpsRequest : httpRequest;
77
+ const req = send(
78
+ url,
79
+ {
80
+ method: call.method,
81
+ headers: call.headers,
82
+ ...(secure && tls
83
+ ? {
84
+ ...(tls.ca !== undefined ? { ca: tls.ca } : {}),
85
+ ...(tls.cert !== undefined ? { cert: tls.cert } : {}),
86
+ ...(tls.key !== undefined ? { key: tls.key } : {}),
87
+ ...(tls.insecureSkipVerify ? { rejectUnauthorized: false } : {}),
88
+ }
89
+ : {}),
90
+ timeout: 60_000,
91
+ },
92
+ (res) => {
93
+ const chunks: Buffer[] = [];
94
+ res.on("data", (c: Buffer) => chunks.push(c));
95
+ res.on("end", () => {
96
+ const headers: Record<string, string> = {};
97
+ for (const [k, v] of Object.entries(res.headers)) {
98
+ if (v !== undefined) headers[k] = Array.isArray(v) ? v.join(", ") : v;
99
+ }
100
+ resolve({ status: res.statusCode ?? 0, headers, body: Buffer.concat(chunks).toString("utf8") });
101
+ });
102
+ res.on("error", reject);
103
+ },
104
+ );
105
+ req.on("timeout", () => req.destroy(new Error(`timed out: ${call.method} ${call.url}`)));
106
+ req.on("error", reject);
107
+ if (call.body !== undefined) req.write(call.body);
108
+ req.end();
109
+ });
110
+
111
+ /** The body parsed as JSON, or `undefined` when it is not JSON. */
112
+ export function jsonBody(res: WireResponse): unknown {
113
+ try {
114
+ return res.body === "" ? undefined : JSON.parse(res.body);
115
+ } catch {
116
+ return undefined;
117
+ }
118
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * behold#1029: the cloud lister's output, the "listing result" source shape
3
+ * of behold#1025's design (https://github.com/INTENTIUS/behold/issues/1025#issuecomment-6430966093,
4
+ * ruled in #issuecomment-6431259469).
5
+ *
6
+ * The ruling puts the index schema's TypeScript types in chant core (Q5), and
7
+ * chant's `typeListing` (../lifecycle/type-listing.ts, chant#4521) turns a
8
+ * `ListingResult` into an `IndexDocument`. type-listing.ts reads the shape
9
+ * loosely (an optional id and facts, any source name); this module is the
10
+ * lister's exact output, and ../lifecycle/cloud-index.ts hands one to the
11
+ * other, so the type checker holds them together.
12
+ *
13
+ * What the lister fills, per the design and chant#4520's ruled `EngineFacts`:
14
+ *
15
+ * - every resource gets the path-style id the ruling names (Q2),
16
+ * `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (packages/core/src/cloud-lister/ids.ts);
17
+ * - `facts` carries only what a cloud listing can read: `markers` (from tags
18
+ * and labels), `cloudIds` and `observedAt`. `ownership`, `ownedBy` and
19
+ * `recordVersions` stay absent, because they are relative to an estate or
20
+ * stack and a record the lister never reads;
21
+ * - properties, tags and every string under them are masked before the
22
+ * result exists (packages/core/src/cloud-lister/mask.ts).
23
+ */
24
+
25
+ import type { UnobservedReason } from "../observation";
26
+
27
+ /** The four substrates the lister reads, one per run (ruling Q6). */
28
+ export type Substrate = "aws" | "azure" | "gcp" | "kubernetes";
29
+
30
+ /** A tag or label filter: every pair must match. */
31
+ export type TagFilter = Readonly<Record<string, string>>;
32
+
33
+ /**
34
+ * One run's scope (ruling Q6): one substrate and one account, subscription,
35
+ * project or cluster, with every location and type the flags name. `"*"`
36
+ * means every location or every type the inventory API returns.
37
+ */
38
+ export interface CloudScope {
39
+ substrate: Substrate;
40
+ /** AWS account id, Azure subscription id, GCP project id, or a cluster name. */
41
+ scopeId: string;
42
+ /** Regions or locations (Kubernetes: namespaces), sorted and deduplicated, or `"*"`. */
43
+ locations: readonly string[] | "*";
44
+ /** Types as the inventory API names them, sorted and deduplicated, or `"*"`. */
45
+ types: readonly string[] | "*";
46
+ tagFilter?: TagFilter;
47
+ }
48
+
49
+ /**
50
+ * What was looked at, per type and location (#1025 "Coverage"). A
51
+ * (type, location) with no entry is not observed. `"*"` in `listedType` or
52
+ * `location` means "every": a reader that does not know the wildcard compares
53
+ * it as a literal, matches nothing, and so reads the entity as not observed,
54
+ * which is the safe direction.
55
+ */
56
+ export interface CoverageEntry {
57
+ listedType: string;
58
+ location: string;
59
+ verdict: "listed" | UnobservedReason;
60
+ detail?: string;
61
+ }
62
+
63
+ /** Why something was not listed, said once (#1029: "a type it cannot list goes in the notes"). */
64
+ export interface IndexNote {
65
+ code:
66
+ | "no-lister" // the inventory API cannot list this type
67
+ | "needs-parent" // the type lists only under a parent identifier
68
+ | "api-disabled" // GCP: Cloud Asset API is off on the project; nothing was enabled
69
+ | "read-failed" // a call failed after retries
70
+ | "no-credentials" // the call was refused for its credentials
71
+ | "default-types" // AWS with types "*": a fixed default set was listed
72
+ | "tag-filter"; // a tag filter narrows every entry to `filtered`
73
+ message: string;
74
+ listedType?: string;
75
+ location?: string;
76
+ /** A command the person can run themselves (never run by the lister). */
77
+ command?: string;
78
+ }
79
+
80
+ /**
81
+ * A cloud id, kinds as chant#4520 ruled them (`EngineFacts.cloudIds`):
82
+ * `arn` for an ARN, `import-id` for Cloud Control's identifier (what
83
+ * `declaredIdentifier` builds and an import takes), `provider-id` for an ARM
84
+ * id (as returned and once lowercased, since Resource Graph lowercases) or a
85
+ * GCP asset name, `self-link` for a GCP selfLink, `k8s-uid` for a
86
+ * Kubernetes UID.
87
+ */
88
+ export interface CloudId {
89
+ kind: "import-id" | "arn" | "provider-id" | "self-link" | "k8s-uid";
90
+ value: string;
91
+ }
92
+
93
+ /** chant#4520's `EngineFacts.markers`, as read off the live object's tags or labels. */
94
+ export interface MarkerFact {
95
+ owner?: string;
96
+ address?: string;
97
+ encoding: "plain" | "escaped" | "digest";
98
+ source: "live";
99
+ }
100
+
101
+ /** The facts a cloud listing can supply (ruling Q1: one nested object). */
102
+ export interface ListedFacts {
103
+ markers?: MarkerFact;
104
+ cloudIds: CloudId[];
105
+ observedAt: string;
106
+ }
107
+
108
+ /** One listed object (#1025 `ListedResource`, plus the ruled id and facts). */
109
+ export interface ListedResource {
110
+ /** `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (ruling Q2). */
111
+ id: string;
112
+ listedType: string;
113
+ location: string;
114
+ /** Cloud Control `Identifier`, the ARM id, the asset `name`, `namespace/name` or `name` for Kubernetes. */
115
+ nativeId: string;
116
+ cloudIds: CloudId[];
117
+ tags: Record<string, string>;
118
+ /** As returned, unnormalized, already masked. */
119
+ properties: Record<string, unknown>;
120
+ /** When the call that returned it answered. */
121
+ observedAt: string;
122
+ facts: ListedFacts;
123
+ }
124
+
125
+ /** The lister's whole output for one run (#1025 `ListingResult`). */
126
+ export interface ListingResult {
127
+ listing: "v1";
128
+ source: { name: "chant-lister"; version: string };
129
+ scope: CloudScope;
130
+ startedAt: string;
131
+ completedAt: string;
132
+ resources: ListedResource[];
133
+ coverage: CoverageEntry[];
134
+ notes: IndexNote[];
135
+ }
@@ -27,6 +27,7 @@ import type { CapabilityPlugin } from "./capability-plugin";
27
27
  import { isCapabilityPlugin } from "./capability-plugin";
28
28
  import { starterCapabilityPlugin } from "./starter-plugin";
29
29
  import { isRegistryBackendConsumer, type RegistryLoginBackend } from "./verbs/publish-image";
30
+ import { isEngineOutputSourceConsumer, type EngineOutputSource } from "./verbs/member-outputs";
30
31
  import { isStorageBackendConsumer, type ArtifactStorageBackend } from "./verbs/publish-artifact";
31
32
 
32
33
  /** Thrown when a dynamically-imported capability package does not satisfy `CapabilityPlugin` — the "malformed capability package" case #559 asks doctor/validation to detect. */
@@ -171,6 +172,8 @@ export function registerCapabilityPlugins(
171
172
  for (const plugin of plugins) backends.push(...(plugin.registryBackends?.() ?? []));
172
173
  const storage: ArtifactStorageBackend[] = [];
173
174
  for (const plugin of plugins) storage.push(...(plugin.storageBackends?.() ?? []));
175
+ const engines: EngineOutputSource[] = [];
176
+ for (const plugin of plugins) engines.push(...(plugin.engineOutputSources?.() ?? []));
174
177
 
175
178
  for (const plugin of plugins) {
176
179
  for (const capability of plugin.capabilities()) {
@@ -179,6 +182,7 @@ export function registerCapabilityPlugins(
179
182
  let bound = capability;
180
183
  if (isRegistryBackendConsumer(bound)) bound = bound.withRegistryBackends(backends) as typeof bound;
181
184
  if (isStorageBackendConsumer(bound)) bound = bound.withStorageBackends(storage) as typeof bound;
185
+ if (isEngineOutputSourceConsumer(bound)) bound = bound.withEngineOutputSources(engines) as typeof bound;
182
186
  registry.register(bound);
183
187
  }
184
188
  }
@@ -34,6 +34,7 @@ import { fileURLToPath } from "node:url";
34
34
  import type { Capability } from "./capability";
35
35
  import type { RegistryLoginBackend } from "./verbs/publish-image";
36
36
  import type { ArtifactStorageBackend } from "./verbs/publish-artifact";
37
+ import type { EngineOutputSource } from "./verbs/member-outputs";
37
38
 
38
39
  /**
39
40
  * Manifest for a packaged capability plugin — the capability-side analogue
@@ -104,6 +105,15 @@ export interface CapabilityPlugin {
104
105
  */
105
106
  storageBackends?(): ArtifactStorageBackend[];
106
107
 
108
+ /**
109
+ * Engine output sources this plugin contributes to core's `member-outputs`
110
+ * verb (#4455): how another workspace member's outputs are read, applied
111
+ * and planned, for the member kinds the source names (terraform:
112
+ * `choudoufu`; pulumi: `pulumi`). Like `registryBackends`, not capabilities, so several
113
+ * engines may contribute.
114
+ */
115
+ engineOutputSources?(): EngineOutputSource[];
116
+
107
117
  /** Optional initialization hook, called once after load (mirrors `LexiconPlugin.init`). */
108
118
  init?(): void | Promise<void>;
109
119
  }
@@ -12,6 +12,7 @@
12
12
  * Cloud implementations are a later phase (see epic #551, issue #554).
13
13
  */
14
14
 
15
+ import type { PlanShape } from "./covered-round";
15
16
  import type { ReleaseIdentity } from "../telemetry-attribution";
16
17
  import type { ChangeSetPart } from "../change-set";
17
18
 
@@ -117,6 +118,14 @@ export interface CapabilityPlan {
117
118
  * targeted plan covers that plan and no other.
118
119
  */
119
120
  targets?: string[];
121
+ /**
122
+ * What the plan does, without values (#4419): the resources it touches,
123
+ * their actions and replacement, and the inputs it was made without. A
124
+ * pull request's apply compares the shape of a plan made after an upstream
125
+ * applied with this one (`coveredRound`) to decide whether the first
126
+ * approval covers it. Absent, core derives the shape from `changeSet`.
127
+ */
128
+ shape?: PlanShape;
120
129
  }
121
130
 
122
131
  /**
@@ -199,6 +208,235 @@ export interface Capability<In = unknown, Out = unknown> {
199
208
  * why. Unset refuses too, with a reason that names the verb.
200
209
  */
201
210
  readonly targets?: TargetSupport;
211
+ /**
212
+ * Optional (#4435, ws-107): why this capability will not plan and apply
213
+ * `members` as one group, or `undefined` when it will. Core asks before
214
+ * anything is planned, so the answer must come from the declaration and
215
+ * the files alone, never from a plan. A fallback with
216
+ * {@link GroupFallback.drop} leaves only those members out: core forms
217
+ * the group again from the rest and asks again (#4419 ruling 1). A
218
+ * capability with `planGroup` and no `groupFallback` takes every group
219
+ * core forms.
220
+ */
221
+ groupFallback?(ctx: GroupContext, members: readonly GroupMember<In>[]): Promise<GroupFallback | undefined>;
222
+ /**
223
+ * Optional (#4447): reads between this capability's components that core
224
+ * cannot see in their declarations, such as a Terraform root's
225
+ * `terraform_remote_state` block. Core asks once per capability, before
226
+ * groups form, with every component of the change whose step this
227
+ * capability takes (`ctx.components` in plan order, no `input`), and adds
228
+ * each read to the reads it joins, orders and splits groups by, and to
229
+ * the group reads the report names. The answer must come from the
230
+ * declaration and the files alone. A read naming a component outside
231
+ * `members` is ignored; a throw counts as no reads.
232
+ */
233
+ groupReads?(ctx: GroupContext, members: readonly GroupMember<In>[]): Promise<ReportedGroupRead[]>;
234
+ /**
235
+ * Optional (#4466): reads between this capability's steps that sit in the
236
+ * files a step names rather than in its wiring, such as a CloudFormation
237
+ * template's `Fn::ImportValue` of an export another stack's template
238
+ * declares. Core asks once, after discovery and before the order is
239
+ * derived, with every step of this kind in the project. Each read becomes
240
+ * a `stackOutput()` reference at {@link DeclaredRead.at} in the reader's
241
+ * step and a `dependsOn` on the upstream, so it orders the reader after
242
+ * the upstream, is listed under `unknownInputs` while the upstream's plan
243
+ * cannot say the value, and holds the reader for a round, like a read the
244
+ * declaration states. A place the declaration already fills is left as it
245
+ * is. The answer must come from the declaration and the files alone; a
246
+ * throw counts as no reads.
247
+ */
248
+ declaredReads?(ctx: DeclaredReadsContext, members: readonly DeclaredReadMember[]): Promise<DeclaredRead[]> | DeclaredRead[];
249
+ /**
250
+ * Optional (#4435, ws-107): plan `members` as one, in one call. Declared
251
+ * together with `runGroup`; a capability with only one of the two never
252
+ * gets a group. Throwing makes every member plan-failed.
253
+ */
254
+ planGroup?(ctx: GroupContext, members: readonly GroupMember<In>[]): Promise<CapabilityGroupPlan>;
255
+ /**
256
+ * Optional (#4435, ws-107): apply the group `planGroup` planned, in one
257
+ * call, and say how each member's part ended. It should not throw: a throw
258
+ * reads as every member `failed`, or every member `not-started` when the
259
+ * error is a moved plan ({@link isPlanMovedError}).
260
+ */
261
+ runGroup?(ctx: GroupContext, run: GroupRun, members: readonly GroupMember<In>[]): Promise<CapabilityGroupOutcome>;
262
+ }
263
+
264
+ /**
265
+ * What a group's calls share (ws-107): the run's environment and variables,
266
+ * and the group's components in apply order. Each member's own context is
267
+ * {@link GroupMember.ctx}.
268
+ */
269
+ export interface GroupContext {
270
+ env: string;
271
+ vars?: Record<string, unknown>;
272
+ /** The group's components, upstreams first. */
273
+ components: string[];
274
+ }
275
+
276
+ /**
277
+ * A read of one group member's output by another (ws-107). Core leaves the
278
+ * value out of the reader's `input` (it is `undefined` at `at`) and the
279
+ * capability wires it inside its own apply.
280
+ */
281
+ export interface GroupRead {
282
+ /** Where in the reader's step input the value goes, as a JSON Pointer. */
283
+ at: string;
284
+ /** `<component>.<output>`, as `PrMember.reads` and `unknownInputs` name it. */
285
+ ref: string;
286
+ /** The member whose output it is. */
287
+ component: string;
288
+ output: string;
289
+ }
290
+
291
+ /**
292
+ * A read of one component by another that a capability reports through
293
+ * `groupReads` (#4447), with no place in the reader's step input.
294
+ */
295
+ export interface ReportedGroupRead {
296
+ /** The component that reads. */
297
+ reader: string;
298
+ /** The component whose output it reads. */
299
+ upstream: string;
300
+ /** The read as the report names it, e.g. `data.terraform_remote_state.network`. */
301
+ ref: string;
302
+ /**
303
+ * The upstream output read, when the capability knows it. Without it the
304
+ * read counts as known at plan only when the upstream's plan knows every
305
+ * output it names.
306
+ */
307
+ output?: string;
308
+ }
309
+
310
+ /** What `declaredReads` is asked with (#4466). */
311
+ export interface DeclaredReadsContext {
312
+ /** The project root, which a step's relative file paths are read against. */
313
+ root: string;
314
+ }
315
+
316
+ /** One step a capability's `declaredReads` is asked about (#4466). */
317
+ export interface DeclaredReadMember {
318
+ component: string;
319
+ /** Which of the component's steps of this kind, counting from 0 in declaration order. */
320
+ index: number;
321
+ /** The step as declared, without `kind`, wiring unresolved. */
322
+ step: Record<string, unknown>;
323
+ }
324
+
325
+ /**
326
+ * A read `declaredReads` found (#4466): `reader`'s step `index` reads
327
+ * `upstream`'s output `output`. Core puts `{ stackOutput: { stack:
328
+ * upstream, name: output } }` at `at` in that step, so the read is named
329
+ * `<upstream>.<output>` wherever reads are.
330
+ */
331
+ export interface DeclaredRead {
332
+ reader: string;
333
+ /** The reader's step, as {@link DeclaredReadMember.index}. Default 0. */
334
+ index?: number;
335
+ upstream: string;
336
+ output: string;
337
+ /** Where in the reader's step the reference goes, as a JSON Pointer. */
338
+ at: string;
339
+ }
340
+
341
+ /** One component of a group, as core hands it to the capability (ws-107). */
342
+ export interface GroupMember<In = unknown> {
343
+ component: string;
344
+ /** The component's one step as declared, without `kind`, wiring unresolved. */
345
+ step: Record<string, unknown>;
346
+ /**
347
+ * The step's input resolved against the outputs from outside the group.
348
+ * Each {@link GroupRead} is `undefined` here. Absent in `groupFallback`,
349
+ * which is asked before any output is read.
350
+ */
351
+ input?: In;
352
+ /** The member's reads of other members, sorted by `ref`. */
353
+ reads: GroupRead[];
354
+ /**
355
+ * The component's `dependsOn` as declared (#4447): an order with no read,
356
+ * which a capability that applies the group in one call has to keep or
357
+ * refuse.
358
+ */
359
+ dependsOn?: string[];
360
+ /**
361
+ * The member's own context: `component`, `targets`, `carried` and `carry`
362
+ * as for a single step. `unresolvedInputs` names only components outside
363
+ * the group. In `runGroup`, `plans` holds this member's plan.
364
+ */
365
+ ctx: DeployContext;
366
+ }
367
+
368
+ /**
369
+ * Why a set of components does not run as one group (ws-107). `kind` is a
370
+ * short stable word the report keys on; `reason` is one line for a person.
371
+ * Core's own kinds are `steps`, `split` and `cycle`; a capability names its
372
+ * own. A capability's `off` is recorded and not printed in the note.
373
+ *
374
+ * Without `drop`, the fallback is every member's and the group dissolves.
375
+ * With `drop`, only the members it names leave, each with its own `kind`
376
+ * and `reason` or else the fallback's; core forms the group again from the
377
+ * rest by its own rules (`split`, `steps`, `cycle`, and a set of one is no
378
+ * group) and asks again for each set that changed (#4419 ruling 1). A
379
+ * `drop` that names no member of the group dissolves it.
380
+ */
381
+ export interface GroupFallback {
382
+ kind: string;
383
+ reason: string;
384
+ /** The members to leave out, when not the whole group. */
385
+ drop?: GroupDrop[];
386
+ }
387
+
388
+ /** A member a {@link GroupFallback} leaves out of its group (#4419 ruling 1). */
389
+ export interface GroupDrop {
390
+ component: string;
391
+ /** Default: the fallback's `kind`. */
392
+ kind?: string;
393
+ /** Default: the fallback's `reason`. */
394
+ reason?: string;
395
+ }
396
+
397
+ /** What `planGroup` returns (ws-107). */
398
+ export interface CapabilityGroupPlan {
399
+ /**
400
+ * One plan per member, by component: what `plan` would give for that
401
+ * member, with `planDigest` before the group is folded in. Core folds the
402
+ * group digest into each `planDigest` and its change-set part. `artifact`
403
+ * on these is ignored; the group's artifact is below.
404
+ */
405
+ members: Record<string, CapabilityPlan>;
406
+ /** The capability's digest of what the group adds to its members' plans. */
407
+ digest: string;
408
+ /** Handed back to `runGroup` in {@link GroupRun}. Core never reads it. */
409
+ artifact?: unknown;
410
+ }
411
+
412
+ /** What core hands `runGroup` (ws-107): the plan that was approved. */
413
+ export interface GroupRun {
414
+ artifact?: unknown;
415
+ /** The group digest core bound: the capability's digest with the members folded in. */
416
+ digest: string;
417
+ /** Each member's plan as bound into the change set, by component. */
418
+ plans: Record<string, CapabilityPlan>;
419
+ }
420
+
421
+ /**
422
+ * How one member's part of a group apply ended (ws-107). `partial`: some of
423
+ * its planned changes applied. `not-started`: the apply stopped before its
424
+ * part began. `no-changes`: it planned none.
425
+ */
426
+ export type GroupMemberStatus = "applied" | "partial" | "failed" | "not-started" | "no-changes";
427
+
428
+ export interface GroupMemberOutcome {
429
+ status: GroupMemberStatus;
430
+ /** What the member exposes now, as `run`'s outputs: set for `applied` and `no-changes`. */
431
+ outputs?: Record<string, unknown>;
432
+ error?: string;
433
+ }
434
+
435
+ /** What `runGroup` returns (ws-107): every member's outcome, by component. */
436
+ export interface CapabilityGroupOutcome {
437
+ members: Record<string, GroupMemberOutcome>;
438
+ /** An error no member's part names. */
439
+ error?: string;
202
440
  }
203
441
 
204
442
  /** A capability's relationship to rollback — see `Capability.rollbackPolicy`. */