@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
@@ -5,11 +5,20 @@
5
5
  import type { ObservationLexicon } from "../lexicon.js";
6
6
  import type { BuildResult } from "../build.js";
7
7
  import type { LifecycleSnapshot } from "./types.js";
8
+ import { type SnapshotStore, type StorePublish } from "./snapshot-store.js";
8
9
  export interface TakeSnapshotResult {
9
10
  snapshots: LifecycleSnapshot[];
11
+ /** The version the last write made: a commit on a git store, an object version on s3. Empty when nothing was written. */
10
12
  commit: string;
11
13
  warnings: string[];
12
14
  errors: string[];
15
+ /** Where the snapshots went (`refs/chant/snapshots`, a directory, `s3://...`), and whether they were kept (#4519). */
16
+ store?: {
17
+ kind: SnapshotStore["kind"];
18
+ where: string;
19
+ written: boolean;
20
+ publish?: StorePublish;
21
+ };
13
22
  }
14
23
  /**
15
24
  * Take state snapshots for all plugins that implement describeResources.
@@ -23,5 +32,7 @@ export declare function takeSnapshot(environment: string, plugins: ObservationLe
23
32
  /** Kinds the PROJECT manages, not just this stack — a region whose stack
24
33
  * declares no security group still has a default one (#1278). */
25
34
  ambientKinds?: string[];
35
+ /** The index store to write to (#4519). Default: the project's, from `snapshots` in chant.config.ts. */
36
+ store?: SnapshotStore;
26
37
  }): Promise<TakeSnapshotResult>;
27
38
  //# sourceMappingURL=snapshot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/lifecycle/snapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAsC,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAiEnE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,kBAAkB,EAAE,EAC7B,WAAW,EAAE,WAAW,EACxB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;qEACiE;IACjE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAsN7B"}
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/lifecycle/snapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAsC,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAMnE,OAAO,EAAwB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4D/F,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,yHAAyH;IACzH,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sHAAsH;IACtH,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CAClG;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,kBAAkB,EAAE,EAC7B,WAAW,EAAE,WAAW,EACxB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;qEACiE;IACjE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,wGAAwG;IACxG,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,GACA,OAAO,CAAC,kBAAkB,CAAC,CAiO7B"}
@@ -1,7 +1,8 @@
1
1
  import { observeDeep } from "./deep-observe.js";
2
2
  import { computeBuildDigest } from "./digest.js";
3
3
  import { collectDependencies, collectAmbient } from "./observe.js";
4
- import { writeSnapshot, snapshotStorageKey, getHeadCommit, pushLifecycle } from "./git.js";
4
+ import { snapshotStorageKey, getHeadCommit } from "./git.js";
5
+ import { resolveSnapshotStore } from "./snapshot-store.js";
5
6
  import { sortedJsonReplacer } from "../utils.js";
6
7
  import { formatUnobserved, normalizeObservation, unobservedAll } from "../observation.js";
7
8
  // One list of secret-bearing property names for both observation depths
@@ -220,20 +221,32 @@ export async function takeSnapshot(environment, plugins, buildResult, opts) {
220
221
  }
221
222
  }
222
223
  }
223
- // Write all successful snapshots to git
224
+ // Write every successful snapshot through the index store (#4519). Masking
225
+ // already happened above, so the store never sees a secret.
226
+ const store = opts?.store ?? (await resolveSnapshotStore({ cwd: opts?.cwd }));
224
227
  let commitSha = "";
228
+ let written = false;
225
229
  for (const snapshot of snapshots) {
226
230
  const json = JSON.stringify(snapshot, sortedJsonReplacer, 2);
227
- commitSha = await writeSnapshot(snapshot.environment, snapshotStorageKey(snapshot.lexicon, snapshot.stack), json, opts);
231
+ const result = await store.write(snapshot.environment, snapshotStorageKey(snapshot.lexicon, snapshot.stack), json, opts?.cwd ? { cwd: opts.cwd } : undefined);
232
+ if (result.written) {
233
+ written = true;
234
+ commitSha = result.version ?? commitSha;
235
+ }
236
+ else if (result.reason) {
237
+ warnings.push(`${snapshot.lexicon}: snapshot not kept: ${result.reason}`);
238
+ }
228
239
  }
229
240
  // Push to remote
230
- if (snapshots.length > 0) {
231
- await pushLifecycle(opts);
241
+ const publish = written ? await store.publish() : undefined;
242
+ if (publish && (publish.status === "stale" || publish.status === "failed")) {
243
+ warnings.push(`snapshot kept locally in ${store.where}, not pushed: ${publish.detail ?? publish.status}`);
232
244
  }
233
245
  return {
234
246
  snapshots,
235
247
  commit: commitSha,
236
248
  warnings,
237
249
  errors,
250
+ store: { kind: store.kind, where: store.where, written, ...(publish ? { publish } : {}) },
238
251
  };
239
252
  }
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Typed nodes for indexed resources (#4521, tier 1 of INTENTIUS/behold#1025).
3
+ *
4
+ * behold#1029's cloud lister reads one account, subscription, project or
5
+ * cluster through that cloud's inventory API and returns a
6
+ * {@link ListingResult}. {@link typeListing} turns it into an
7
+ * {@link IndexDocument}: each listed object becomes an `IRNode` whose `kind`
8
+ * is the lexicon kind that describes it, with its properties normalized by
9
+ * that lexicon's own deep-observe hooks, so an indexed tree has the shape an
10
+ * observed one has and the capability catalog (#4375) applies to it.
11
+ *
12
+ * Pure: no I/O and no clock. The lexicons come in as data (each plugin's
13
+ * `listedTypes` and `deepNormalizationHooks`), so behold passes the plugins
14
+ * it already loads and a test passes a table.
15
+ *
16
+ * Rules:
17
+ * - a listed type no lexicon maps stays a node of unknown kind: `kind` is
18
+ * the listed type, `lexicon` the substrate, `unmappedKind: true`. It is
19
+ * never dropped, and a note names each such type once;
20
+ * - secret-bearing values are masked with the one list the snapshot path
21
+ * uses (`isSensitiveKey`, ../sensitive-key.ts). The lister masked already;
22
+ * masking again here means no listing reaches the index unmasked;
23
+ * - a node id is the path-style id ruled on behold#1025 (Q2):
24
+ * `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>`.
25
+ *
26
+ * Edges are #4522's (./derive-edges.ts); this module leaves `edges` empty.
27
+ */
28
+ import type { DeepNormalizationHooks } from "../deep-observation.js";
29
+ import type { EngineFacts } from "../engine-facts.js";
30
+ import type { GraphIR, IRNode } from "../graph-ir.js";
31
+ import { type CloudIndexScope, type CoverageEntry, type IndexDocument, type IndexNote } from "./index-document.js";
32
+ /** The four substrates the lister reads, one per run (behold#1025 Q6). */
33
+ export type ListingSubstrate = CloudIndexScope["substrate"];
34
+ /** One run's scope, as the lister names it. `"*"` means every location or type. */
35
+ export interface CloudScope {
36
+ substrate: ListingSubstrate;
37
+ scopeId: string;
38
+ locations: readonly string[] | "*";
39
+ types: readonly string[] | "*";
40
+ tagFilter?: Readonly<Record<string, string>>;
41
+ }
42
+ /** A cloud id, kinds as #4520 ruled them (`EngineFacts.cloudIds`). */
43
+ export interface ListedCloudId {
44
+ kind: "import-id" | "arn" | "provider-id" | "self-link" | "k8s-uid";
45
+ value: string;
46
+ }
47
+ /** The facts a cloud listing can supply: markers read off tags, cloud ids, when it was read. */
48
+ export interface ListedFacts {
49
+ markers?: EngineFacts["markers"];
50
+ cloudIds: ListedCloudId[];
51
+ observedAt: string;
52
+ }
53
+ /** One listed object (behold#1025 `ListedResource`). */
54
+ export interface ListedResource {
55
+ /** The path-style id; recomputed by {@link listedNodeId}, so a listing may leave it out. */
56
+ id?: string;
57
+ listedType: string;
58
+ location: string;
59
+ nativeId: string;
60
+ cloudIds: ListedCloudId[];
61
+ tags: Record<string, string>;
62
+ /** As returned, unnormalized, already masked by the lister. */
63
+ properties: Record<string, unknown>;
64
+ observedAt: string;
65
+ facts?: ListedFacts;
66
+ }
67
+ /** A lister note: a type with no lister, a disabled API, a tag filter. */
68
+ export interface ListingNote {
69
+ code: string;
70
+ message: string;
71
+ listedType?: string;
72
+ location?: string;
73
+ command?: string;
74
+ }
75
+ /** The lister's whole output for one run (behold#1025 `ListingResult`, behold#1029). */
76
+ export interface ListingResult {
77
+ listing: "v1";
78
+ source?: {
79
+ name: string;
80
+ version?: string;
81
+ };
82
+ scope: CloudScope;
83
+ startedAt: string;
84
+ completedAt: string;
85
+ resources: ListedResource[];
86
+ coverage: CoverageEntry[];
87
+ notes: ListingNote[];
88
+ }
89
+ /**
90
+ * How a lexicon reads one substrate's listed types (a plugin's
91
+ * `listedTypes`). Data plus two pure functions.
92
+ */
93
+ export interface ListedTypeMapping {
94
+ substrate: ListingSubstrate;
95
+ /** The lexicon kind for a listed type, or undefined when the lexicon has none. */
96
+ kindFor(listedType: string): string | undefined;
97
+ /**
98
+ * The listed properties reshaped into the tree this lexicon's deep reader
99
+ * returns, before the hooks run: Azure flattens `properties.*` beside
100
+ * `location` and `sku`, Kubernetes drops `apiVersion` and `kind`. Absent
101
+ * means the listing's shape already is that tree (Cloud Control's
102
+ * CloudFormation model).
103
+ */
104
+ observedTree?(properties: Record<string, unknown>, context: {
105
+ listedType: string;
106
+ kind: string;
107
+ }): Record<string, unknown>;
108
+ }
109
+ /** What {@link typeListing} needs from a lexicon. A `LexiconPlugin` is one. */
110
+ export interface ListingLexicon {
111
+ name: string;
112
+ listedTypes?: ListedTypeMapping;
113
+ deepNormalizationHooks?: DeepNormalizationHooks;
114
+ }
115
+ /**
116
+ * `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (behold#1025
117
+ * Q2), exactly as behold's lister writes it (src/cloud-lister/ids.ts): `%`
118
+ * and `/` are escaped in the first four parts, and the native id is last and
119
+ * unescaped, so everything after the fourth `/` is it.
120
+ */
121
+ export declare function listedNodeId(parts: {
122
+ substrate: string;
123
+ scopeId: string;
124
+ location: string;
125
+ listedType: string;
126
+ nativeId: string;
127
+ }): string;
128
+ /** The lexicon (and kind) for one listed type: the first mapping, by lexicon name, that answers. */
129
+ export declare function resolveListedKind(substrate: ListingSubstrate, listedType: string, lexicons: readonly ListingLexicon[]): {
130
+ lexicon: ListingLexicon;
131
+ kind: string;
132
+ } | undefined;
133
+ /** One listed object as a typed (or unknown-kind) node. */
134
+ export declare function typeListedResource(scope: CloudScope, resource: ListedResource, lexicons: readonly ListingLexicon[]): IRNode;
135
+ /** The listing's scope as the index stamp's cloud scope. */
136
+ export declare function listingIndexScope(scope: CloudScope): CloudIndexScope;
137
+ /** Every listed object as a node, sorted by id. */
138
+ export declare function typeListingNodes(listing: ListingResult, lexicons: readonly ListingLexicon[]): IRNode[];
139
+ /**
140
+ * The listing as one index version (behold#1025 schema). `graph.edges` is
141
+ * empty; chant#4522's `deriveEdges` fills it. Coverage passes through as the
142
+ * lister wrote it, wildcards included. The lister's notes keep their code as
143
+ * `kind`, and each unmapped listed type gets one `unmapped-type` note.
144
+ */
145
+ export declare function typeListing(listing: ListingResult, lexicons: readonly ListingLexicon[]): IndexDocument;
146
+ /** Stamp a graph, coverage and notes read from `listing` as one index version. */
147
+ export declare function assembleIndexDocument(listing: ListingResult, graph: GraphIR, coverage: CoverageEntry[], notes: IndexNote[]): IndexDocument;
148
+ //# sourceMappingURL=type-listing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-listing.d.ts","sourceRoot":"","sources":["../../src/lifecycle/type-listing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import { MASKED, isSensitiveKey, normalizeDeepProperties } from "../deep-observation.js";
2
+ import { canonicalScope, indexDocumentDigest, indexScopeKey, } from "./index-document.js";
3
+ function escapeSegment(s) {
4
+ return s.replace(/%/g, "%25").replace(/\//g, "%2F");
5
+ }
6
+ /**
7
+ * `<substrate>/<scopeId>/<location>/<listedType>/<nativeId>` (behold#1025
8
+ * Q2), exactly as behold's lister writes it (src/cloud-lister/ids.ts): `%`
9
+ * and `/` are escaped in the first four parts, and the native id is last and
10
+ * unescaped, so everything after the fourth `/` is it.
11
+ */
12
+ export function listedNodeId(parts) {
13
+ return [
14
+ escapeSegment(parts.substrate),
15
+ escapeSegment(parts.scopeId),
16
+ escapeSegment(parts.location),
17
+ escapeSegment(parts.listedType),
18
+ parts.nativeId,
19
+ ].join("/");
20
+ }
21
+ /** The lexicon (and kind) for one listed type: the first mapping, by lexicon name, that answers. */
22
+ export function resolveListedKind(substrate, listedType, lexicons) {
23
+ for (const lexicon of lexicons) {
24
+ const mapping = lexicon.listedTypes;
25
+ if (!mapping || mapping.substrate !== substrate)
26
+ continue;
27
+ const kind = mapping.kindFor(listedType);
28
+ if (kind !== undefined)
29
+ return { lexicon, kind };
30
+ }
31
+ return undefined;
32
+ }
33
+ function maskTags(tags) {
34
+ const out = {};
35
+ for (const k of Object.keys(tags).sort())
36
+ out[k] = isSensitiveKey(k) ? MASKED : tags[k];
37
+ return out;
38
+ }
39
+ const byName = (a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
40
+ /** One listed object as a typed (or unknown-kind) node. */
41
+ export function typeListedResource(scope, resource, lexicons) {
42
+ const sorted = [...lexicons].sort(byName);
43
+ const resolved = resolveListedKind(scope.substrate, resource.listedType, sorted);
44
+ const id = listedNodeId({
45
+ substrate: scope.substrate,
46
+ scopeId: scope.scopeId,
47
+ location: resource.location,
48
+ listedType: resource.listedType,
49
+ nativeId: resource.nativeId,
50
+ });
51
+ let kind;
52
+ let lexicon;
53
+ let attrs;
54
+ if (resolved) {
55
+ kind = resolved.kind;
56
+ lexicon = resolved.lexicon.name;
57
+ const reshape = resolved.lexicon.listedTypes?.observedTree;
58
+ const tree = reshape ? reshape(resource.properties, { listedType: resource.listedType, kind }) : resource.properties;
59
+ attrs = normalizeDeepProperties(tree, { entityType: kind, side: "live", hooks: resolved.lexicon.deepNormalizationHooks });
60
+ }
61
+ else {
62
+ kind = resource.listedType;
63
+ lexicon = scope.substrate;
64
+ // No lexicon, so no hooks: the listing's properties as returned, key-sorted and masked.
65
+ attrs = normalizeDeepProperties(resource.properties, { entityType: resource.listedType, side: "live" });
66
+ }
67
+ const cloudIds = resource.cloudIds.length > 0 ? resource.cloudIds : resource.facts?.cloudIds ?? [];
68
+ const facts = {
69
+ ...(resource.facts?.markers ? { markers: resource.facts.markers } : {}),
70
+ ...(cloudIds.length > 0 ? { cloudIds: cloudIds.map((c) => ({ kind: c.kind, value: c.value })) } : {}),
71
+ observedAt: resource.facts?.observedAt ?? resource.observedAt,
72
+ };
73
+ return {
74
+ id,
75
+ kind,
76
+ lexicon,
77
+ attrs,
78
+ physicalId: resource.nativeId,
79
+ facts,
80
+ listedType: resource.listedType,
81
+ location: resource.location,
82
+ nativeId: resource.nativeId,
83
+ tags: maskTags(resource.tags ?? {}),
84
+ ...(resolved ? {} : { unmappedKind: true }),
85
+ };
86
+ }
87
+ /** The listing's scope as the index stamp's cloud scope. */
88
+ export function listingIndexScope(scope) {
89
+ return canonicalScope({
90
+ kind: "cloud",
91
+ substrate: scope.substrate,
92
+ scopeId: scope.scopeId,
93
+ locations: scope.locations,
94
+ types: scope.types,
95
+ ...(scope.tagFilter ? { tagFilter: scope.tagFilter } : {}),
96
+ });
97
+ }
98
+ /** Every listed object as a node, sorted by id. */
99
+ export function typeListingNodes(listing, lexicons) {
100
+ const nodes = listing.resources.map((r) => typeListedResource(listing.scope, r, lexicons));
101
+ nodes.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
102
+ return nodes;
103
+ }
104
+ const compareNotes = (a, b) => {
105
+ const ka = `${a.kind}\u0000${a.listedType ?? ""}\u0000${a.location ?? ""}\u0000${a.message}`;
106
+ const kb = `${b.kind}\u0000${b.listedType ?? ""}\u0000${b.location ?? ""}\u0000${b.message}`;
107
+ return ka < kb ? -1 : ka > kb ? 1 : 0;
108
+ };
109
+ /**
110
+ * The listing as one index version (behold#1025 schema). `graph.edges` is
111
+ * empty; chant#4522's `deriveEdges` fills it. Coverage passes through as the
112
+ * lister wrote it, wildcards included. The lister's notes keep their code as
113
+ * `kind`, and each unmapped listed type gets one `unmapped-type` note.
114
+ */
115
+ export function typeListing(listing, lexicons) {
116
+ const nodes = typeListingNodes(listing, lexicons);
117
+ const graph = {
118
+ version: 1,
119
+ nodes,
120
+ edges: [],
121
+ groups: { byLexicon: groupByLexicon(nodes) },
122
+ };
123
+ const coverage = [...listing.coverage].map((c) => ({ ...c }));
124
+ const notes = listing.notes.map((n) => ({
125
+ kind: n.code,
126
+ message: n.message,
127
+ ...(n.listedType !== undefined ? { listedType: n.listedType } : {}),
128
+ ...(n.location !== undefined ? { location: n.location } : {}),
129
+ ...(n.command !== undefined ? { command: n.command } : {}),
130
+ }));
131
+ const unmapped = [...new Set(nodes.filter((n) => n.unmappedKind).map((n) => n.listedType))].sort();
132
+ for (const t of unmapped) {
133
+ notes.push({
134
+ kind: "unmapped-type",
135
+ listedType: t,
136
+ message: `no lexicon kind maps the listed type ${t}; its objects are kept as nodes of unknown kind, with the listing's properties masked`,
137
+ });
138
+ }
139
+ notes.sort(compareNotes);
140
+ return assembleIndexDocument(listing, graph, coverage, notes);
141
+ }
142
+ /** Stamp a graph, coverage and notes read from `listing` as one index version. */
143
+ export function assembleIndexDocument(listing, graph, coverage, notes) {
144
+ const scope = listingIndexScope(listing.scope);
145
+ return {
146
+ index: "v1",
147
+ stamp: {
148
+ source: { kind: "cloud", name: listing.source?.name ?? "behold-lister", ...(listing.source?.version ? { version: listing.source.version } : {}) },
149
+ scope,
150
+ scopeKey: indexScopeKey(scope),
151
+ observedAt: listing.startedAt,
152
+ completedAt: listing.completedAt,
153
+ digest: indexDocumentDigest({ graph, coverage }),
154
+ },
155
+ coverage,
156
+ graph,
157
+ ...(notes.length > 0 ? { notes } : {}),
158
+ };
159
+ }
160
+ function groupByLexicon(nodes) {
161
+ var _a;
162
+ const out = {};
163
+ for (const n of nodes)
164
+ (out[_a = n.lexicon] ?? (out[_a] = [])).push(n.id);
165
+ return Object.fromEntries(Object.keys(out).sort().map((k) => [k, out[k].sort()]));
166
+ }
@@ -53,6 +53,20 @@ export interface ComponentCheckContext {
53
53
  * `none-by-design`, i.e. flags nothing).
54
54
  */
55
55
  rollbackPolicies?: ReadonlyMap<string, RollbackPolicy>;
56
+ /**
57
+ * The project's `terraform.roots` entries marked `signalOnly` (#4484),
58
+ * keyed by root name. Supplied by `chant lint` from the project's config
59
+ * (`signalOnlyRootsOf` in ./rules/comp/comp008-applies-signal-only-root.ts);
60
+ * undefined when none was resolved, in which case COMP008 flags nothing.
61
+ */
62
+ signalOnlyRoots?: ReadonlyMap<string, SignalOnlyRoot>;
63
+ }
64
+ /** One `terraform.roots` entry marked `signalOnly` (#4490). */
65
+ export interface SignalOnlyRoot {
66
+ /** The root's `dir` as the config writes it. */
67
+ dir: string;
68
+ /** The workspace member whose directory holds the root, when the workspace reads. */
69
+ owner?: string;
56
70
  }
57
71
  /** A diagnostic from a component composition check. Shaped like `PostSynthDiagnostic`, plus a `file` so it can be merged into `LintDiagnostic`s and reported per-file like every other lint diagnostic. */
58
72
  export interface ComponentCheckDiagnostic {
@@ -94,7 +108,7 @@ export interface ComponentCheck {
94
108
  * COMP* checks exist precisely because they need the discovered `Component`
95
109
  * graph, which does mean importing `*.component.ts` files.
96
110
  */
97
- export declare function runComponentChecks(path: string, checks: ComponentCheck[], registryContext?: Pick<ComponentCheckContext, "knownKinds" | "rollbackPolicies">, sandbox?: boolean, buildParams?: BuildParamProvenance[]): Promise<ComponentCheckDiagnostic[]>;
111
+ export declare function runComponentChecks(path: string, checks: ComponentCheck[], registryContext?: Pick<ComponentCheckContext, "knownKinds" | "rollbackPolicies" | "signalOnlyRoots">, sandbox?: boolean, buildParams?: BuildParamProvenance[]): Promise<ComponentCheckDiagnostic[]>;
98
112
  /** Structural type guard, mirroring `isPostSynthCheck` — used by rule discovery/registry code. */
99
113
  export declare function isComponentCheck(value: unknown): value is ComponentCheck;
100
114
  /** Re-exported for rule modules that need the discovered shape without importing `../components/discover` directly. */
@@ -1 +1 @@
1
- {"version":3,"file":"component-checks.d.ts","sourceRoot":"","sources":["../../src/lint/component-checks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,wFAAwF;AACxF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mGAAmG;AACnG,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxD;AAED,2MAA2M;AAC3M,MAAM,WAAW,wBAAwB;IACvC,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;IAC/D,gDAAgD;IAChD,KAAK,CAAC,GAAG,EAAE,qBAAqB,GAAG,wBAAwB,EAAE,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,cAAc,EAAE,EACxB,eAAe,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,kBAAkB,CAAC,EAChF,OAAO,CAAC,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,oBAAoB,EAAE,GACnC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAoCrC;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAUxE;AAED,uHAAuH;AACvH,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"component-checks.d.ts","sourceRoot":"","sources":["../../src/lint/component-checks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,wFAAwF;AACxF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,mGAAmG;AACnG,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvD;;;;;OAKG;IACH,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACvD;AAED,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2MAA2M;AAC3M,MAAM,WAAW,wBAAwB;IACvC,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;IAC/D,gDAAgD;IAChD,KAAK,CAAC,GAAG,EAAE,qBAAqB,GAAG,wBAAwB,EAAE,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,cAAc,EAAE,EACxB,eAAe,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,CAAC,EACpG,OAAO,CAAC,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,oBAAoB,EAAE,GACnC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAqCrC;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAUxE;AAED,uHAAuH;AACvH,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
@@ -68,6 +68,7 @@ export async function runComponentChecks(path, checks, registryContext, sandbox,
68
68
  components,
69
69
  knownKinds: registryContext?.knownKinds,
70
70
  rollbackPolicies: registryContext?.rollbackPolicies,
71
+ signalOnlyRoots: registryContext?.signalOnlyRoots,
71
72
  };
72
73
  for (const check of checks) {
73
74
  diagnostics.push(...check.check(ctx));
@@ -21,6 +21,7 @@
21
21
  "COMP004": "warning",
22
22
  "COMP005": "off",
23
23
  "COMP006": "off",
24
- "COMP007": "off"
24
+ "COMP007": "off",
25
+ "COMP008": "warning"
25
26
  }
26
27
  }
@@ -21,6 +21,7 @@
21
21
  "COMP004": "error",
22
22
  "COMP005": "error",
23
23
  "COMP006": "error",
24
- "COMP007": "warning"
24
+ "COMP007": "warning",
25
+ "COMP008": "warning"
25
26
  }
26
27
  }
@@ -0,0 +1,4 @@
1
+ import type { Component } from "../../../../../../components/component.js";
2
+ /** COMP008 fail case: a terraform-apply step deploys "azure", which the test marks signalOnly. */
3
+ export declare const dns: Component;
4
+ //# sourceMappingURL=dns.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns.component.d.ts","sourceRoot":"","sources":["../../../../../../../src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAGxE,kGAAkG;AAClG,eAAO,MAAM,GAAG,EAAE,SAUjB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { phase } from "../../../../../../components/component.js";
2
+ /** COMP008 fail case: a terraform-apply step deploys "azure", which the test marks signalOnly. */
3
+ export const dns = {
4
+ name: "dns",
5
+ archetype: "infra",
6
+ dependsOn: [],
7
+ deploy: [
8
+ phase("Apply", [
9
+ { kind: "terraform-apply", root: "dns" },
10
+ { kind: "terraform-apply", root: "azure" },
11
+ ]),
12
+ ],
13
+ };
@@ -0,0 +1,4 @@
1
+ import type { Component } from "../../../../../../components/component.js";
2
+ /** COMP008 pass case: the component deploys only its own root, "dns". */
3
+ export declare const dns: Component;
4
+ //# sourceMappingURL=dns.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns.component.d.ts","sourceRoot":"","sources":["../../../../../../../src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAGxE,yEAAyE;AACzE,eAAO,MAAM,GAAG,EAAE,SAKjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { phase } from "../../../../../../components/component.js";
2
+ /** COMP008 pass case: the component deploys only its own root, "dns". */
3
+ export const dns = {
4
+ name: "dns",
5
+ archetype: "infra",
6
+ dependsOn: [],
7
+ deploy: [phase("Apply", [{ kind: "terraform-apply", root: "dns" }])],
8
+ };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * COMP008: applies-signal-only-root (#4490)
3
+ *
4
+ * Flags a component whose `terraform-apply` step deploys a root the project
5
+ * marks `signalOnly: true` in `terraform.roots` (#4484). Such a root belongs
6
+ * to another workspace member and is declared here only so a change to it
7
+ * brings this project into the change: the build skips it, so this
8
+ * project's graph does not draw it, and the live reads skip it too. A
9
+ * component that applies it would apply a root chant otherwise treats as
10
+ * the other member's, so the warning names the root and the member that
11
+ * owns it (the workspace member whose directory holds the root's `dir`).
12
+ *
13
+ * The roots come from the project's chant config, resolved by `chant lint`
14
+ * ({@link signalOnlyRootsOf}) and handed to the check on
15
+ * `ComponentCheckContext.signalOnlyRoots`. A check run without them (a
16
+ * direct unit test, a project with no terraform roots) flags nothing.
17
+ *
18
+ * Triggers on: `{ kind: "terraform-apply", root: "azure" }` where
19
+ * `terraform.roots.azure.signalOnly` is `true`.
20
+ * OK: the same step on a root without the marker, or no `terraform-apply`
21
+ * step naming the marked root.
22
+ */
23
+ import type { ComponentCheck, SignalOnlyRoot } from "../../component-checks.js";
24
+ export declare const comp008AppliesSignalOnlyRootRule: ComponentCheck;
25
+ /**
26
+ * The roots a project's `terraform.roots` marks `signalOnly`, keyed by root
27
+ * name, each with its `dir` as written and the workspace member whose
28
+ * directory holds it. `projectDir` is the directory holding the chant
29
+ * config. Tolerant: a config that does not load, or no marked root, gives an
30
+ * empty map; a workspace declaration that does not read leaves `owner` off.
31
+ */
32
+ export declare function signalOnlyRootsOf(projectDir: string): Promise<Map<string, SignalOnlyRoot>>;
33
+ //# sourceMappingURL=comp008-applies-signal-only-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comp008-applies-signal-only-root.d.ts","sourceRoot":"","sources":["../../../../src/lint/rules/comp/comp008-applies-signal-only-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAmD,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG9H,eAAO,MAAM,gCAAgC,EAAE,cAuC9C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAyBhG"}