@intentius/chant-lexicon-terraform 0.57.0 → 0.58.0

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 (381) hide show
  1. package/dist/composites/terraform-adopt-op.d.ts +126 -0
  2. package/dist/composites/terraform-adopt-op.d.ts.map +1 -0
  3. package/dist/composites/terraform-apply-op.d.ts +63 -16
  4. package/dist/composites/terraform-apply-op.d.ts.map +1 -1
  5. package/dist/composites/terraform-watch-op.d.ts +80 -36
  6. package/dist/composites/terraform-watch-op.d.ts.map +1 -1
  7. package/dist/config.d.ts +49 -2
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/describe-resources.d.ts +256 -16
  10. package/dist/describe-resources.d.ts.map +1 -1
  11. package/dist/hcl/descend.d.ts +98 -0
  12. package/dist/hcl/descend.d.ts.map +1 -0
  13. package/dist/hcl/marker.d.ts +130 -0
  14. package/dist/hcl/marker.d.ts.map +1 -0
  15. package/dist/hcl/parse.d.ts +142 -9
  16. package/dist/hcl/parse.d.ts.map +1 -1
  17. package/dist/hcl/references.d.ts +76 -0
  18. package/dist/hcl/references.d.ts.map +1 -0
  19. package/dist/hcl/roots.d.ts +22 -3
  20. package/dist/hcl/roots.d.ts.map +1 -1
  21. package/dist/hcl/suppressions.d.ts +54 -0
  22. package/dist/hcl/suppressions.d.ts.map +1 -0
  23. package/dist/hcl/value.d.ts +77 -0
  24. package/dist/hcl/value.d.ts.map +1 -0
  25. package/dist/index.d.ts +5 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/integrity.json +32 -5
  28. package/dist/lint/audit-catalog.d.ts +3 -2
  29. package/dist/lint/audit-catalog.d.ts.map +1 -1
  30. package/dist/lint/audit-lineage.d.ts +68 -0
  31. package/dist/lint/audit-lineage.d.ts.map +1 -1
  32. package/dist/lint/post-synth/blocks.d.ts +53 -0
  33. package/dist/lint/post-synth/blocks.d.ts.map +1 -0
  34. package/dist/lint/post-synth/fixtures/load.d.ts +37 -0
  35. package/dist/lint/post-synth/fixtures/load.d.ts.map +1 -0
  36. package/dist/lint/post-synth/index.d.ts.map +1 -1
  37. package/dist/lint/post-synth/module-source.d.ts +38 -0
  38. package/dist/lint/post-synth/module-source.d.ts.map +1 -0
  39. package/dist/lint/post-synth/scope.d.ts +65 -0
  40. package/dist/lint/post-synth/scope.d.ts.map +1 -0
  41. package/dist/lint/post-synth/tf001.d.ts +18 -0
  42. package/dist/lint/post-synth/tf001.d.ts.map +1 -1
  43. package/dist/lint/post-synth/tf002.d.ts +32 -0
  44. package/dist/lint/post-synth/tf002.d.ts.map +1 -0
  45. package/dist/lint/post-synth/tf003.d.ts +22 -0
  46. package/dist/lint/post-synth/tf003.d.ts.map +1 -0
  47. package/dist/lint/post-synth/tf004.d.ts +22 -0
  48. package/dist/lint/post-synth/tf004.d.ts.map +1 -0
  49. package/dist/lint/post-synth/tf005.d.ts +28 -0
  50. package/dist/lint/post-synth/tf005.d.ts.map +1 -0
  51. package/dist/lint/post-synth/tf006.d.ts +21 -0
  52. package/dist/lint/post-synth/tf006.d.ts.map +1 -0
  53. package/dist/lint/post-synth/tf007.d.ts +21 -0
  54. package/dist/lint/post-synth/tf007.d.ts.map +1 -0
  55. package/dist/lint/post-synth/tf008.d.ts +22 -0
  56. package/dist/lint/post-synth/tf008.d.ts.map +1 -0
  57. package/dist/lint/post-synth/tf009.d.ts +24 -0
  58. package/dist/lint/post-synth/tf009.d.ts.map +1 -0
  59. package/dist/lint/post-synth/tf010.d.ts +19 -0
  60. package/dist/lint/post-synth/tf010.d.ts.map +1 -0
  61. package/dist/lint/post-synth/tf011.d.ts +18 -0
  62. package/dist/lint/post-synth/tf011.d.ts.map +1 -0
  63. package/dist/lint/post-synth/tf012.d.ts +17 -0
  64. package/dist/lint/post-synth/tf012.d.ts.map +1 -0
  65. package/dist/lint/post-synth/tf013.d.ts +21 -0
  66. package/dist/lint/post-synth/tf013.d.ts.map +1 -0
  67. package/dist/lint/post-synth/tf014.d.ts +25 -0
  68. package/dist/lint/post-synth/tf014.d.ts.map +1 -0
  69. package/dist/lint/post-synth/tf015.d.ts +21 -0
  70. package/dist/lint/post-synth/tf015.d.ts.map +1 -0
  71. package/dist/lint/post-synth/tf016.d.ts +30 -0
  72. package/dist/lint/post-synth/tf016.d.ts.map +1 -0
  73. package/dist/lint/post-synth/tf017.d.ts +19 -0
  74. package/dist/lint/post-synth/tf017.d.ts.map +1 -0
  75. package/dist/lint/post-synth/tf018.d.ts +20 -0
  76. package/dist/lint/post-synth/tf018.d.ts.map +1 -0
  77. package/dist/lint/post-synth/tf019.d.ts +25 -0
  78. package/dist/lint/post-synth/tf019.d.ts.map +1 -0
  79. package/dist/lint/post-synth/tf020.d.ts +38 -0
  80. package/dist/lint/post-synth/tf020.d.ts.map +1 -0
  81. package/dist/lint/post-synth/tf021.d.ts +41 -0
  82. package/dist/lint/post-synth/tf021.d.ts.map +1 -0
  83. package/dist/lint/post-synth/tf022.d.ts +24 -0
  84. package/dist/lint/post-synth/tf022.d.ts.map +1 -0
  85. package/dist/lint/post-synth/tf024.d.ts +24 -0
  86. package/dist/lint/post-synth/tf024.d.ts.map +1 -0
  87. package/dist/lint/post-synth/tf025.d.ts +29 -0
  88. package/dist/lint/post-synth/tf025.d.ts.map +1 -0
  89. package/dist/lint/post-synth/tf026.d.ts +21 -0
  90. package/dist/lint/post-synth/tf026.d.ts.map +1 -0
  91. package/dist/lint/rules/fixtures/load.d.ts +13 -0
  92. package/dist/lint/rules/fixtures/load.d.ts.map +1 -0
  93. package/dist/lint/rules/plan-before-apply.d.ts +11 -0
  94. package/dist/lint/rules/plan-before-apply.d.ts.map +1 -1
  95. package/dist/lint/secret-shape.d.ts +68 -0
  96. package/dist/lint/secret-shape.d.ts.map +1 -0
  97. package/dist/live-ownership.d.ts +55 -0
  98. package/dist/live-ownership.d.ts.map +1 -0
  99. package/dist/lsp/option-keys.d.ts.map +1 -1
  100. package/dist/manifest.json +1 -1
  101. package/dist/okf/index.md +24 -0
  102. package/dist/okf/rules/TF002.md +11 -0
  103. package/dist/okf/rules/TF003.md +11 -0
  104. package/dist/okf/rules/TF004.md +11 -0
  105. package/dist/okf/rules/TF005.md +11 -0
  106. package/dist/okf/rules/TF006.md +11 -0
  107. package/dist/okf/rules/TF007.md +11 -0
  108. package/dist/okf/rules/TF008.md +11 -0
  109. package/dist/okf/rules/TF009.md +11 -0
  110. package/dist/okf/rules/TF010.md +11 -0
  111. package/dist/okf/rules/TF011.md +11 -0
  112. package/dist/okf/rules/TF012.md +11 -0
  113. package/dist/okf/rules/TF013.md +11 -0
  114. package/dist/okf/rules/TF014.md +11 -0
  115. package/dist/okf/rules/TF015.md +11 -0
  116. package/dist/okf/rules/TF016.md +11 -0
  117. package/dist/okf/rules/TF017.md +11 -0
  118. package/dist/okf/rules/TF018.md +11 -0
  119. package/dist/okf/rules/TF019.md +11 -0
  120. package/dist/okf/rules/TF020.md +11 -0
  121. package/dist/okf/rules/TF021.md +11 -0
  122. package/dist/okf/rules/TF022.md +11 -0
  123. package/dist/okf/rules/TF024.md +11 -0
  124. package/dist/okf/rules/TF025.md +11 -0
  125. package/dist/okf/rules/TF026.md +11 -0
  126. package/dist/op/activities/index.d.ts +13 -6
  127. package/dist/op/activities/index.d.ts.map +1 -1
  128. package/dist/op/activities/live-detect.d.ts +51 -0
  129. package/dist/op/activities/live-detect.d.ts.map +1 -0
  130. package/dist/op/activities/terraform.d.ts +445 -17
  131. package/dist/op/activities/terraform.d.ts.map +1 -1
  132. package/dist/op/activity-contracts.d.ts +148 -0
  133. package/dist/op/activity-contracts.d.ts.map +1 -0
  134. package/dist/op/adoption.d.ts +118 -0
  135. package/dist/op/adoption.d.ts.map +1 -0
  136. package/dist/op/builders.d.ts +46 -6
  137. package/dist/op/builders.d.ts.map +1 -1
  138. package/dist/op/resolve-root-mode.d.ts +45 -0
  139. package/dist/op/resolve-root-mode.d.ts.map +1 -0
  140. package/dist/plugin.d.ts.map +1 -1
  141. package/dist/rules/blocks.ts +109 -0
  142. package/dist/rules/module-source.ts +121 -0
  143. package/dist/rules/plan-before-apply.ts +11 -0
  144. package/dist/rules/scope.ts +107 -0
  145. package/dist/rules/tf001.ts +32 -8
  146. package/dist/rules/tf002.ts +151 -0
  147. package/dist/rules/tf003.ts +71 -0
  148. package/dist/rules/tf004.ts +63 -0
  149. package/dist/rules/tf005.ts +76 -0
  150. package/dist/rules/tf006.ts +53 -0
  151. package/dist/rules/tf007.ts +78 -0
  152. package/dist/rules/tf008.ts +75 -0
  153. package/dist/rules/tf009.ts +59 -0
  154. package/dist/rules/tf010.ts +51 -0
  155. package/dist/rules/tf011.ts +49 -0
  156. package/dist/rules/tf012.ts +47 -0
  157. package/dist/rules/tf013.ts +63 -0
  158. package/dist/rules/tf014.ts +72 -0
  159. package/dist/rules/tf015.ts +63 -0
  160. package/dist/rules/tf016.ts +75 -0
  161. package/dist/rules/tf017.ts +50 -0
  162. package/dist/rules/tf018.ts +72 -0
  163. package/dist/rules/tf019.ts +72 -0
  164. package/dist/rules/tf020.ts +123 -0
  165. package/dist/rules/tf021.ts +126 -0
  166. package/dist/rules/tf022.ts +61 -0
  167. package/dist/rules/tf024.ts +70 -0
  168. package/dist/rules/tf025.ts +101 -0
  169. package/dist/rules/tf026.ts +80 -0
  170. package/dist/skills/chant-terraform.md +1 -1
  171. package/package.json +7 -2
  172. package/src/__fixtures__/live/main.tf +28 -0
  173. package/src/__fixtures__/live-adopt/estate.chdf.hcl +6 -0
  174. package/src/__fixtures__/live-adopt/main.tf +21 -0
  175. package/src/__fixtures__/live-estate/README.md +58 -0
  176. package/src/__fixtures__/live-estate/compute.tf +10 -0
  177. package/src/__fixtures__/live-estate/estate.chdf.hcl +1 -0
  178. package/src/__fixtures__/live-estate/logs.tf +8 -0
  179. package/src/__fixtures__/live-estate/network.tf +24 -0
  180. package/src/__fixtures__/live-estate/rule.tf +11 -0
  181. package/src/__fixtures__/live-estate/unowned.tf +21 -0
  182. package/src/__fixtures__/live-estate/versions.tf +31 -0
  183. package/src/__fixtures__/live-ls.json +98 -0
  184. package/src/__fixtures__/live-plan.json +285 -0
  185. package/src/__fixtures__/live-sidecar/estate.chdf.hcl +3 -0
  186. package/src/__fixtures__/live-sidecar/main.tf +24 -0
  187. package/src/__fixtures__/module-tree/README.md +16 -0
  188. package/src/__fixtures__/module-tree/cycle/main.tf +3 -0
  189. package/src/__fixtures__/module-tree/cycle/modules/a/main.tf +9 -0
  190. package/src/__fixtures__/module-tree/cycle/modules/b/main.tf +9 -0
  191. package/src/__fixtures__/module-tree/missing/main.tf +9 -0
  192. package/src/__fixtures__/module-tree/outside/root/main.tf +9 -0
  193. package/src/__fixtures__/module-tree/root/main.tf +28 -0
  194. package/src/__fixtures__/module-tree/root/modules/cdn/main.tf +15 -0
  195. package/src/__fixtures__/module-tree/root/modules/cdn/modules/bucket/main.tf +11 -0
  196. package/src/__fixtures__/module-tree/shared/main.tf +5 -0
  197. package/src/__fixtures__/references/main.tf +56 -0
  198. package/src/codegen/lint-rules-page.test.ts +28 -0
  199. package/src/composites/terraform-adopt-op.acceptance.test.ts +166 -0
  200. package/src/composites/terraform-adopt-op.test.ts +170 -0
  201. package/src/composites/terraform-adopt-op.ts +197 -0
  202. package/src/composites/terraform-apply-op.acceptance.test.ts +183 -5
  203. package/src/composites/terraform-apply-op.test.ts +167 -15
  204. package/src/composites/terraform-apply-op.ts +105 -28
  205. package/src/composites/terraform-watch-op.test.ts +85 -26
  206. package/src/composites/terraform-watch-op.ts +130 -73
  207. package/src/config.ts +32 -3
  208. package/src/describe-resources.live.test.ts +598 -0
  209. package/src/describe-resources.test.ts +53 -0
  210. package/src/describe-resources.ts +811 -28
  211. package/src/hcl/descend.test.ts +162 -0
  212. package/src/hcl/descend.ts +273 -0
  213. package/src/hcl/marker.test.ts +147 -0
  214. package/src/hcl/marker.ts +235 -0
  215. package/src/hcl/parse.test.ts +69 -0
  216. package/src/hcl/parse.ts +249 -27
  217. package/src/hcl/references.test.ts +116 -0
  218. package/src/hcl/references.ts +172 -0
  219. package/src/hcl/roots.ts +59 -5
  220. package/src/hcl/suppressions.test.ts +147 -0
  221. package/src/hcl/suppressions.ts +204 -0
  222. package/src/hcl/value.test.ts +73 -0
  223. package/src/hcl/value.ts +106 -0
  224. package/src/index.ts +31 -1
  225. package/src/lint/audit-catalog.ts +264 -3
  226. package/src/lint/audit-lineage.ts +319 -1
  227. package/src/lint/audit.test.ts +40 -1
  228. package/src/lint/post-synth/blocks.ts +109 -0
  229. package/src/lint/post-synth/fixtures/TF001/negative.tf +28 -0
  230. package/src/lint/post-synth/fixtures/TF001/positive.tf +24 -0
  231. package/src/lint/post-synth/fixtures/TF002/negative.tf +17 -0
  232. package/src/lint/post-synth/fixtures/TF002/positive-legacy.tf +10 -0
  233. package/src/lint/post-synth/fixtures/TF002/positive-no-version.tf +12 -0
  234. package/src/lint/post-synth/fixtures/TF002/positive.tf +7 -0
  235. package/src/lint/post-synth/fixtures/TF003/negative.tf +10 -0
  236. package/src/lint/post-synth/fixtures/TF003/positive.tf +8 -0
  237. package/src/lint/post-synth/fixtures/TF004/negative-git.tf +3 -0
  238. package/src/lint/post-synth/fixtures/TF004/negative-local.tf +3 -0
  239. package/src/lint/post-synth/fixtures/TF004/negative.tf +4 -0
  240. package/src/lint/post-synth/fixtures/TF004/positive.tf +3 -0
  241. package/src/lint/post-synth/fixtures/TF005/negative-local.tf +3 -0
  242. package/src/lint/post-synth/fixtures/TF005/negative-registry.tf +3 -0
  243. package/src/lint/post-synth/fixtures/TF005/negative-sha.tf +3 -0
  244. package/src/lint/post-synth/fixtures/TF005/negative.tf +3 -0
  245. package/src/lint/post-synth/fixtures/TF005/positive-branch.tf +3 -0
  246. package/src/lint/post-synth/fixtures/TF005/positive-non-semver.tf +3 -0
  247. package/src/lint/post-synth/fixtures/TF005/positive.tf +3 -0
  248. package/src/lint/post-synth/fixtures/TF006/negative.tf +5 -0
  249. package/src/lint/post-synth/fixtures/TF006/positive-empty-default.tf +11 -0
  250. package/src/lint/post-synth/fixtures/TF006/positive.tf +6 -0
  251. package/src/lint/post-synth/fixtures/TF007/negative.tf +10 -0
  252. package/src/lint/post-synth/fixtures/TF007/positive.tf +9 -0
  253. package/src/lint/post-synth/fixtures/TF008/negative-variable.tf +10 -0
  254. package/src/lint/post-synth/fixtures/TF008/negative.tf +8 -0
  255. package/src/lint/post-synth/fixtures/TF008/positive-other-provider.tf +10 -0
  256. package/src/lint/post-synth/fixtures/TF008/positive.tf +5 -0
  257. package/src/lint/post-synth/fixtures/TF009/negative.tf +10 -0
  258. package/src/lint/post-synth/fixtures/TF009/positive.tf +4 -0
  259. package/src/lint/post-synth/fixtures/TF010/negative.tf +5 -0
  260. package/src/lint/post-synth/fixtures/TF010/positive.tf +4 -0
  261. package/src/lint/post-synth/fixtures/TF011/negative.tf +5 -0
  262. package/src/lint/post-synth/fixtures/TF011/positive-blank.tf +5 -0
  263. package/src/lint/post-synth/fixtures/TF011/positive.tf +4 -0
  264. package/src/lint/post-synth/fixtures/TF012/negative.tf +4 -0
  265. package/src/lint/post-synth/fixtures/TF012/positive.tf +3 -0
  266. package/src/lint/post-synth/fixtures/TF013/negative.tf +8 -0
  267. package/src/lint/post-synth/fixtures/TF013/positive-data.tf +8 -0
  268. package/src/lint/post-synth/fixtures/TF013/positive.tf +8 -0
  269. package/src/lint/post-synth/fixtures/TF014/negative/main.tf +26 -0
  270. package/src/lint/post-synth/fixtures/TF014/negative/modules/cdn/main.tf +19 -0
  271. package/src/lint/post-synth/fixtures/TF014/positive/main.tf +16 -0
  272. package/src/lint/post-synth/fixtures/TF014/positive/modules/cdn/main.tf +15 -0
  273. package/src/lint/post-synth/fixtures/TF015/negative/main.tf +13 -0
  274. package/src/lint/post-synth/fixtures/TF015/negative/modules/cdn/main.tf +16 -0
  275. package/src/lint/post-synth/fixtures/TF015/positive/main.tf +13 -0
  276. package/src/lint/post-synth/fixtures/TF015/positive/modules/cdn/main.tf +14 -0
  277. package/src/lint/post-synth/fixtures/TF016/negative-template.tf +7 -0
  278. package/src/lint/post-synth/fixtures/TF016/negative.tf +16 -0
  279. package/src/lint/post-synth/fixtures/TF016/positive-shared-file.tf +12 -0
  280. package/src/lint/post-synth/fixtures/TF016/positive.tf +13 -0
  281. package/src/lint/post-synth/fixtures/TF017/negative.tf +4 -0
  282. package/src/lint/post-synth/fixtures/TF017/positive.tf +5 -0
  283. package/src/lint/post-synth/fixtures/TF018/negative.tf +9 -0
  284. package/src/lint/post-synth/fixtures/TF018/positive-data.tf +9 -0
  285. package/src/lint/post-synth/fixtures/TF018/positive.tf +4 -0
  286. package/src/lint/post-synth/fixtures/TF019/negative.tf +14 -0
  287. package/src/lint/post-synth/fixtures/TF019/positive-output.tf +5 -0
  288. package/src/lint/post-synth/fixtures/TF019/positive.tf +16 -0
  289. package/src/lint/post-synth/fixtures/TF020/negative.tf +43 -0
  290. package/src/lint/post-synth/fixtures/TF020/positive.tf +32 -0
  291. package/src/lint/post-synth/fixtures/TF020/scoped/main.tf +21 -0
  292. package/src/lint/post-synth/fixtures/TF020/scoped/modules/cdn/main.tf +13 -0
  293. package/src/lint/post-synth/fixtures/TF021/negative.tf +31 -0
  294. package/src/lint/post-synth/fixtures/TF021/positive-length.tf +8 -0
  295. package/src/lint/post-synth/fixtures/TF021/positive.tf +8 -0
  296. package/src/lint/post-synth/fixtures/TF022/negative-locator.tf +7 -0
  297. package/src/lint/post-synth/fixtures/TF022/negative.tf +10 -0
  298. package/src/lint/post-synth/fixtures/TF022/positive-nested.tf +10 -0
  299. package/src/lint/post-synth/fixtures/TF022/positive.tf +6 -0
  300. package/src/lint/post-synth/fixtures/TF023/negative/main.tf +15 -0
  301. package/src/lint/post-synth/fixtures/TF023/positive/main.tf +9 -0
  302. package/src/lint/post-synth/fixtures/TF023/positive/state.json +24 -0
  303. package/src/lint/post-synth/fixtures/TF024/live-clean/main.tf +9 -0
  304. package/src/lint/post-synth/fixtures/TF024/live-with-backend/main.tf +14 -0
  305. package/src/lint/post-synth/fixtures/TF024/live-with-cloud/main.tf +16 -0
  306. package/src/lint/post-synth/fixtures/TF025/live-clean/main.tf +13 -0
  307. package/src/lint/post-synth/fixtures/TF025/live-with-workspace-ref/main.tf +13 -0
  308. package/src/lint/post-synth/fixtures/TF026/live-default/main.tf +9 -0
  309. package/src/lint/post-synth/fixtures/TF026/live-explicit-delete/main.tf +13 -0
  310. package/src/lint/post-synth/fixtures/TF026/live-keep/main.tf +13 -0
  311. package/src/lint/post-synth/fixtures/load.ts +108 -0
  312. package/src/lint/post-synth/index.ts +48 -0
  313. package/src/lint/post-synth/module-rules.test.ts +153 -0
  314. package/src/lint/post-synth/module-source.test.ts +75 -0
  315. package/src/lint/post-synth/module-source.ts +121 -0
  316. package/src/lint/post-synth/post-synth.test.ts +14 -15
  317. package/src/lint/post-synth/scope.ts +107 -0
  318. package/src/lint/post-synth/single-block.test.ts +263 -0
  319. package/src/lint/post-synth/suppression.test.ts +110 -0
  320. package/src/lint/post-synth/tf001.ts +32 -8
  321. package/src/lint/post-synth/tf002.test.ts +93 -0
  322. package/src/lint/post-synth/tf002.ts +151 -0
  323. package/src/lint/post-synth/tf003.test.ts +75 -0
  324. package/src/lint/post-synth/tf003.ts +71 -0
  325. package/src/lint/post-synth/tf004.test.ts +47 -0
  326. package/src/lint/post-synth/tf004.ts +63 -0
  327. package/src/lint/post-synth/tf005.test.ts +57 -0
  328. package/src/lint/post-synth/tf005.ts +76 -0
  329. package/src/lint/post-synth/tf006.ts +53 -0
  330. package/src/lint/post-synth/tf007.ts +78 -0
  331. package/src/lint/post-synth/tf008.ts +75 -0
  332. package/src/lint/post-synth/tf009.ts +59 -0
  333. package/src/lint/post-synth/tf010.ts +51 -0
  334. package/src/lint/post-synth/tf011.ts +49 -0
  335. package/src/lint/post-synth/tf012.ts +47 -0
  336. package/src/lint/post-synth/tf013.ts +63 -0
  337. package/src/lint/post-synth/tf014.ts +72 -0
  338. package/src/lint/post-synth/tf015.ts +63 -0
  339. package/src/lint/post-synth/tf016.ts +75 -0
  340. package/src/lint/post-synth/tf017.ts +50 -0
  341. package/src/lint/post-synth/tf018.ts +72 -0
  342. package/src/lint/post-synth/tf019.ts +72 -0
  343. package/src/lint/post-synth/tf020.ts +123 -0
  344. package/src/lint/post-synth/tf021.ts +126 -0
  345. package/src/lint/post-synth/tf022.ts +61 -0
  346. package/src/lint/post-synth/tf024.test.ts +42 -0
  347. package/src/lint/post-synth/tf024.ts +70 -0
  348. package/src/lint/post-synth/tf025.test.ts +46 -0
  349. package/src/lint/post-synth/tf025.ts +101 -0
  350. package/src/lint/post-synth/tf026.test.ts +56 -0
  351. package/src/lint/post-synth/tf026.ts +80 -0
  352. package/src/lint/presets.test.ts +72 -0
  353. package/src/lint/rules/fixtures/TF101/negative-op.ts +2 -0
  354. package/src/lint/rules/fixtures/TF101/positive-op.ts +2 -0
  355. package/src/lint/rules/fixtures/load.ts +53 -0
  356. package/src/lint/rules/plan-before-apply.test.ts +112 -7
  357. package/src/lint/rules/plan-before-apply.ts +11 -0
  358. package/src/lint/secret-shape.test.ts +150 -0
  359. package/src/lint/secret-shape.ts +159 -0
  360. package/src/live-ownership.ts +60 -0
  361. package/src/lsp/completions.test.ts +3 -2
  362. package/src/lsp/option-keys.ts +10 -5
  363. package/src/op/activities/choudoufu.acceptance.test.ts +143 -0
  364. package/src/op/activities/choudoufu.test.ts +693 -0
  365. package/src/op/activities/index.ts +40 -4
  366. package/src/op/activities/live-detect.test.ts +143 -0
  367. package/src/op/activities/live-detect.ts +162 -0
  368. package/src/op/activities/registry.test.ts +11 -3
  369. package/src/op/activities/terraform.test.ts +7 -3
  370. package/src/op/activities/terraform.ts +823 -69
  371. package/src/op/activity-contracts.test.ts +147 -0
  372. package/src/op/activity-contracts.ts +178 -0
  373. package/src/op/adoption.test.ts +170 -0
  374. package/src/op/adoption.ts +241 -0
  375. package/src/op/builders.test.ts +60 -5
  376. package/src/op/builders.ts +93 -5
  377. package/src/op/resolve-root-mode.test.ts +85 -0
  378. package/src/op/resolve-root-mode.ts +72 -0
  379. package/src/plugin.test.ts +68 -0
  380. package/src/plugin.ts +75 -9
  381. package/src/skills/chant-terraform.md +1 -1
@@ -0,0 +1,285 @@
1
+ {
2
+ "estate": "stateless-e2e-block",
3
+ "choudoufu_version": "",
4
+ "upstream_version": "1.13.0-dev",
5
+ "bound": [
6
+ {
7
+ "addr": "aws_cloudwatch_log_group.app",
8
+ "type": "aws_cloudwatch_log_group",
9
+ "identity": "/stateless-e2e-block/app",
10
+ "identity_values": {
11
+ "name": "/stateless-e2e-block/app"
12
+ },
13
+ "source": "derived"
14
+ },
15
+ {
16
+ "addr": "aws_eip.pool[0]",
17
+ "type": "aws_eip",
18
+ "identity": "eipalloc-956f58ee85678c4a2",
19
+ "source": "marker"
20
+ },
21
+ {
22
+ "addr": "aws_eip.pool[1]",
23
+ "type": "aws_eip",
24
+ "identity": "eipalloc-eb84912f9550b202b",
25
+ "source": "marker"
26
+ },
27
+ {
28
+ "addr": "aws_security_group.main",
29
+ "type": "aws_security_group",
30
+ "identity": "sg-5fbb2850b62304cee",
31
+ "source": "marker"
32
+ },
33
+ {
34
+ "addr": "aws_subnet.app",
35
+ "type": "aws_subnet",
36
+ "identity": "subnet-4d624e84",
37
+ "source": "marker"
38
+ },
39
+ {
40
+ "addr": "aws_vpc.main",
41
+ "type": "aws_vpc",
42
+ "identity": "vpc-c1733cf7",
43
+ "source": "marker"
44
+ }
45
+ ],
46
+ "omissions": [
47
+ {
48
+ "addr": "aws_cloudwatch_log_group.adoptable",
49
+ "reason": "UNOWNED",
50
+ "detail": "A live aws_cloudwatch_log_group already exists with identity \"/stateless-e2e-block/adoptable\" and carries no tofu-estate marker, so this estate does not own it and the plan proposes creating the resource this configuration declares - which, for a type whose name must be unique, the cloud will refuse while the unowned one holds it. Adopt it by writing tofu-estate=\"stateless-e2e-block\" and tofu-address=\"aws_cloudwatch_log_group.adoptable\" onto it, then re-run; or set policy { declared_untagged = \"adopt\" } in the live block to have this run adopt it for you; or point this resource at a name nobody is using."
51
+ },
52
+ {
53
+ "addr": "aws_cloudwatch_log_group.held_elsewhere",
54
+ "reason": "UNOWNED",
55
+ "detail": "A live aws_cloudwatch_log_group already exists with identity \"/stateless-e2e-block/held-elsewhere\" and carries tofu-estate=\"other-estate\", so it belongs to another estate and nothing in this plan reads, changes or destroys it. See live/MARKERS.md, \"Ownership semantics\"."
56
+ },
57
+ {
58
+ "addr": "aws_cloudwatch_log_group.never_applied",
59
+ "reason": "ABSENT",
60
+ "detail": "The provider reports no aws_cloudwatch_log_group exists with identity \"/stateless-e2e-block/never-applied\", so this resource has not been created yet. The plan will propose creating it."
61
+ },
62
+ {
63
+ "addr": "aws_security_group_rule.https",
64
+ "reason": "ABSENT",
65
+ "detail": "The provider reports no aws_security_group_rule exists with identity \"sg-5fbb2850b62304cee_ingress_tcp_443_443_10.99.0.0/16\", so this resource has not been created yet. The plan will propose creating it."
66
+ }
67
+ ],
68
+ "unowned": [
69
+ {
70
+ "addr": "aws_cloudwatch_log_group.adoptable",
71
+ "type": "aws_cloudwatch_log_group",
72
+ "identity": "/stateless-e2e-block/adoptable",
73
+ "adopt_tofu_estate": "stateless-e2e-block",
74
+ "adopt_tofu_address": "aws_cloudwatch_log_group.adoptable"
75
+ },
76
+ {
77
+ "addr": "aws_cloudwatch_log_group.held_elsewhere",
78
+ "type": "aws_cloudwatch_log_group",
79
+ "identity": "/stateless-e2e-block/held-elsewhere",
80
+ "tofu_estate": "other-estate"
81
+ }
82
+ ],
83
+ "diagnostics": [
84
+ {
85
+ "severity": "warning",
86
+ "summary": "Provider version does not match the admission evidence version",
87
+ "detail": "This run resolved hashicorp/aws 6.58.0. Live resource markers' admission table - which resource types are accepted, what their import IDs look like, and how their identity is resolved - was verified against hashicorp/aws 6.59.0 (live/survey.json). Import grammar and identity schemas are the parts of that table a provider version change can invalidate: an import ID format or an identity attribute that changed between 6.58.0 and 6.59.0 would misbehave here with no further warning. Taggability judgments are not version-sensitive in the same way and rarely change between provider releases. This is a caution, not a failure: the plan continues."
88
+ },
89
+ {
90
+ "severity": "warning",
91
+ "summary": "Resource type has no orphan recovery",
92
+ "detail": "aws_cloudwatch_log_group is admitted by the provider's own identity schema rather than by this fork's admission table, so it plans and applies normally - but the estate-wide sweep draws its type universe from that table and will not list it. Deleting the last aws_cloudwatch_log_group block from this configuration leaves the live resource in the account with no run proposing to remove it, and no warning at that point either. Remove it by hand when you remove the block. See live/LIMITATIONS.md, \"Resource type has no orphan recovery\"."
93
+ },
94
+ {
95
+ "severity": "warning",
96
+ "summary": "Incomplete sweep for undeclared resources",
97
+ "detail": "The estate-wide sweep listed a aws_appautoscaling_target that the provider could not fully read (Error Listing Remote Resources: listing Application Auto Scaling Scalable Targets: operation error Application Auto Scaling: DescribeScalableTargets, 1 validation error(s) found.\n- missing required field, DescribeScalableTargetsInput.ServiceNamespace.\n), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
98
+ },
99
+ {
100
+ "severity": "warning",
101
+ "summary": "Incomplete sweep for undeclared resources",
102
+ "detail": "The estate-wide sweep listed a aws_appflow_flow that the provider could not fully read (Error Listing Remote Resources: listing AppFlow Flow resources: operation error Appflow: ListFlows, https response error StatusCode: 404, RequestID: 3106667e-9751-461c-b81f-ed042144eda3, api error UnknownOperationException: Unknown operation: POST /list-flows), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
103
+ },
104
+ {
105
+ "severity": "warning",
106
+ "summary": "Incomplete sweep for undeclared resources",
107
+ "detail": "The estate-wide sweep listed a aws_bedrockagentcore_browser_profile that the provider could not fully read (Error Listing Remote Resources: listing Bedrock AgentCore Browser Profiles: operation error Bedrock AgentCore Control: ListBrowserProfiles, https response error StatusCode: 404, RequestID: cfea5f10-3bbf-4011-8946-d1fb97a8a9a3, api error UnknownOperationException: Unknown operation: POST /browser-profiles), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
108
+ },
109
+ {
110
+ "severity": "warning",
111
+ "summary": "Incomplete sweep for undeclared resources",
112
+ "detail": "The estate-wide sweep listed a aws_bedrockagentcore_evaluator that the provider could not fully read (Error Listing Remote Resources: listing Bedrock AgentCore Evaluators: operation error Bedrock AgentCore Control: ListEvaluators, https response error StatusCode: 404, RequestID: dd8dd4bf-6a92-4477-a7bd-dfe8fbd8b8df, api error UnknownOperationException: Unknown operation: POST /evaluators), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
113
+ },
114
+ {
115
+ "severity": "warning",
116
+ "summary": "Incomplete sweep for undeclared resources",
117
+ "detail": "The estate-wide sweep listed a aws_bedrockagentcore_harness that the provider could not fully read (Error Listing Remote Resources: listing Bedrock AgentCore Harnesses: operation error Bedrock AgentCore Control: ListHarnesses, https response error StatusCode: 404, RequestID: b1d60f1d-72e1-4faf-8eb6-589dca095f58, api error UnknownOperationException: Unknown operation: GET /harnesses), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
118
+ },
119
+ {
120
+ "severity": "warning",
121
+ "summary": "Incomplete sweep for undeclared resources",
122
+ "detail": "The estate-wide sweep listed a aws_bedrockagentcore_online_evaluation_config that the provider could not fully read (Error Listing Remote Resources: listing Bedrock AgentCore Online Evaluation Config resources: operation error Bedrock AgentCore Control: ListOnlineEvaluationConfigs, https response error StatusCode: 404, RequestID: c15091aa-6c86-4252-915f-b150ec837003, api error UnknownOperationException: Unknown operation: POST /online-evaluation-configs), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
123
+ },
124
+ {
125
+ "severity": "warning",
126
+ "summary": "Incomplete sweep for undeclared resources",
127
+ "detail": "The estate-wide sweep listed a aws_bedrockagentcore_policy_engine that the provider could not fully read (Error Listing Remote Resources: listing Bedrock AgentCore Policy Engines: operation error Bedrock AgentCore Control: ListPolicyEngines, https response error StatusCode: 404, RequestID: 13c62cba-5f73-4c52-83d2-5700bdb06361, api error UnknownOperationException: Unknown operation: GET /policy-engines), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
128
+ },
129
+ {
130
+ "severity": "warning",
131
+ "summary": "Incomplete sweep for undeclared resources",
132
+ "detail": "The estate-wide sweep listed a aws_cleanrooms_collaboration that the provider could not fully read (Error Listing Remote Resources: listing Clean Rooms Collaboration resources: operation error CleanRooms: ListCollaborations, https response error StatusCode: 404, RequestID: 2bcd493d-528d-48f5-9c11-4e0e1130c964, api error UnknownOperationException: Unknown operation: GET /collaborations), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
133
+ },
134
+ {
135
+ "severity": "warning",
136
+ "summary": "Incomplete sweep for undeclared resources",
137
+ "detail": "The estate-wide sweep listed a aws_cleanrooms_configured_table that the provider could not fully read (Error Listing Remote Resources: listing Clean Rooms Configured Table resources: operation error CleanRooms: ListConfiguredTables, https response error StatusCode: 404, RequestID: 8be20ff4-17a7-4539-ae36-0cd20ecd8732, api error UnknownOperationException: Unknown operation: GET /configuredTables), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
138
+ },
139
+ {
140
+ "severity": "warning",
141
+ "summary": "Incomplete sweep for undeclared resources",
142
+ "detail": "The estate-wide sweep listed a aws_cleanrooms_membership that the provider could not fully read (Error Listing Remote Resources: listing Clean Rooms Membership resources: operation error CleanRooms: ListMemberships, https response error StatusCode: 404, RequestID: 1a7acf79-c2b7-4194-bf51-481c5714306c, api error UnknownOperationException: Unknown operation: GET /memberships), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
143
+ },
144
+ {
145
+ "severity": "warning",
146
+ "summary": "Incomplete sweep for undeclared resources",
147
+ "detail": "The estate-wide sweep listed a aws_cloudfront_key_value_store that the provider could not fully read (Error Listing Remote Resources: listing CloudFront Key Value Store resources: operation error CloudFront: ListKeyValueStores, https response error StatusCode: 404, RequestID: , api error UnknownError: UnknownError), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
148
+ },
149
+ {
150
+ "severity": "warning",
151
+ "summary": "Incomplete sweep for undeclared resources",
152
+ "detail": "The estate-wide sweep listed a aws_cloudwatch_alarm_mute_rule that the provider could not fully read (Error Listing Remote Resources: listing CloudWatch Alarm Mute Rules: operation error CloudWatch: ListAlarmMuteRules, https response error StatusCode: 400, RequestID: 0b189b44-684b-489e-b469-f603146f3666, api error UnsupportedOperation: Operation ListAlarmMuteRules is not supported by CloudWatch JSON.), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
153
+ },
154
+ {
155
+ "severity": "warning",
156
+ "summary": "Incomplete sweep for undeclared resources",
157
+ "detail": "The estate-wide sweep listed a aws_ec2_network_insights_access_scope that the provider could not fully read (Error Listing Remote Resources: listing EC2 Network Insights Access Scopes: operation error EC2: DescribeNetworkInsightsAccessScopes, https response error StatusCode: 400, RequestID: 94e15dd0-e454-4546-8bb8-9b9f517ff061, api error UnsupportedOperation: Operation DescribeNetworkInsightsAccessScopes is not supported.), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
158
+ },
159
+ {
160
+ "severity": "warning",
161
+ "summary": "Incomplete sweep for undeclared resources",
162
+ "detail": "The estate-wide sweep listed a aws_ec2_transit_gateway_metering_policy that the provider could not fully read (Error Listing Remote Resources: listing EC2 Transit Gateway Metering Policies: operation error EC2: DescribeTransitGatewayMeteringPolicies, https response error StatusCode: 400, RequestID: a355d836-d169-4f03-97e7-fee2c8571529, api error UnsupportedOperation: Operation DescribeTransitGatewayMeteringPolicies is not supported.), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
163
+ },
164
+ {
165
+ "severity": "warning",
166
+ "summary": "Incomplete sweep for undeclared resources",
167
+ "detail": "The estate-wide sweep listed a aws_ecs_daemon_task_definition that the provider could not fully read (Error Listing Remote Resources: listing ECS Daemon Task Definitions: operation error ECS: ListDaemonTaskDefinitions, https response error StatusCode: 400, RequestID: a586e7de-99b0-4d5a-ad2c-17bebdb16ab4, api error UnsupportedOperation: Operation ListDaemonTaskDefinitions is not supported.), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
168
+ },
169
+ {
170
+ "severity": "warning",
171
+ "summary": "Incomplete sweep for undeclared resources",
172
+ "detail": "The estate-wide sweep listed a aws_eks_access_entry that the provider could not fully read (Error Listing Remote Resources: listing EKS Access Entries: operation error EKS: ListAccessEntries, serialization failed: serialization failed: input member clusterName must not be empty), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
173
+ },
174
+ {
175
+ "severity": "warning",
176
+ "summary": "Incomplete sweep for undeclared resources",
177
+ "detail": "The estate-wide sweep listed a aws_eks_addon that the provider could not fully read (Error Listing Remote Resources: listing EKS Add-Ons: operation error EKS: ListAddons, serialization failed: serialization failed: input member clusterName must not be empty), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
178
+ },
179
+ {
180
+ "severity": "warning",
181
+ "summary": "Incomplete sweep for undeclared resources",
182
+ "detail": "The estate-wide sweep listed a aws_eks_node_group that the provider could not fully read (Error Listing Remote Resources: listing EKS Node Groups: operation error EKS: ListNodegroups, serialization failed: serialization failed: input member clusterName must not be empty), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
183
+ },
184
+ {
185
+ "severity": "warning",
186
+ "summary": "Incomplete sweep for undeclared resources",
187
+ "detail": "The estate-wide sweep listed a aws_glue_catalog that the provider could not fully read (Error Listing Remote Resources: listing Glue Catalogs: operation error Glue: GetCatalogs, https response error StatusCode: 400, RequestID: 5f5d7e21-81b7-4e5b-ba9a-68c4f7e8ee3f, api error InvalidAction: Action GetCatalogs is not supported), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
188
+ },
189
+ {
190
+ "severity": "warning",
191
+ "summary": "Incomplete sweep for undeclared resources",
192
+ "detail": "The estate-wide sweep listed a aws_mailmanager_rule_set that the provider could not fully read (Error Listing Remote Resources: listing SES Mail Manager Rule Set resources: operation error MailManager: ListRuleSets, https response error StatusCode: 404, RequestID: 7d27df75-c06e-45c3-8a94-27f0c99b5f6d, deserialization failed, unexpected smithy-protocol response header '' (HTTP status: 404 Not Found)), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
193
+ },
194
+ {
195
+ "severity": "warning",
196
+ "summary": "Incomplete sweep for undeclared resources",
197
+ "detail": "The estate-wide sweep listed a aws_mailmanager_traffic_policy that the provider could not fully read (Error Listing Remote Resources: operation error MailManager: ListTrafficPolicies, https response error StatusCode: 404, RequestID: c8f5f01e-e2fb-41d3-8511-662b1bfcb413, deserialization failed, unexpected smithy-protocol response header '' (HTTP status: 404 Not Found)), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
198
+ },
199
+ {
200
+ "severity": "warning",
201
+ "summary": "Incomplete sweep for undeclared resources",
202
+ "detail": "The estate-wide sweep listed a aws_opensearchserverless_collection that the provider could not fully read (Error Listing Remote Resources: listing OpenSearch Serverless Collections: operation error OpenSearchServerless: ListCollections, https response error StatusCode: 404, RequestID: 830db378-80ce-4278-9268-e03c12d34353, api error UnknownOperationException: Unknown operation: OpenSearchServerless.ListCollections), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
203
+ },
204
+ {
205
+ "severity": "warning",
206
+ "summary": "Incomplete sweep for undeclared resources",
207
+ "detail": "The estate-wide sweep listed a aws_opensearchserverless_collection_group that the provider could not fully read (Error Listing Remote Resources: listing OpenSearch Serverless Collection Groups: operation error OpenSearchServerless: ListCollectionGroups, https response error StatusCode: 404, RequestID: 09a0eb30-7652-4d4b-aa12-c6babf4754f9, api error UnknownOperationException: Unknown operation: OpenSearchServerless.ListCollectionGroups), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
208
+ },
209
+ {
210
+ "severity": "warning",
211
+ "summary": "Incomplete sweep for undeclared resources",
212
+ "detail": "The estate-wide sweep listed a aws_osis_pipeline that the provider could not fully read (Error Listing Remote Resources: listing OpenSearch Ingestion Pipeline resources: operation error OSIS: ListPipelines, https response error StatusCode: 404, RequestID: da0b67b6-417b-4df9-a2f5-c2c849dd9604, api error UnknownOperationException: Unknown operation: GET /2022-01-01/osis/listPipelines), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
213
+ },
214
+ {
215
+ "severity": "warning",
216
+ "summary": "Incomplete sweep for undeclared resources",
217
+ "detail": "The estate-wide sweep listed a aws_pinpointsmsvoicev2_pool that the provider could not fully read (Error Listing Remote Resources: operation error Pinpoint SMS Voice V2: DescribePools, https response error StatusCode: 404, RequestID: 21665f5d-0a75-4515-bb62-5bb03603da15, api error UnknownOperationException: Unknown operation: PinpointSMSVoiceV2.DescribePools), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
218
+ },
219
+ {
220
+ "severity": "warning",
221
+ "summary": "Incomplete sweep for undeclared resources",
222
+ "detail": "The estate-wide sweep listed a aws_prometheus_anomaly_detector that the provider could not fully read (Error Listing Remote Resources: listing AMP (Managed Prometheus) Anomaly Detector resources: operation error amp: ListAnomalyDetectors, serialization failed: serialization failed: input member workspaceId must not be empty), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
223
+ },
224
+ {
225
+ "severity": "warning",
226
+ "summary": "Incomplete sweep for undeclared resources",
227
+ "detail": "The estate-wide sweep listed a aws_rekognition_collection that the provider could not fully read (Error Listing Remote Resources: listing Rekognition Collections: operation error Rekognition: ListCollections, https response error StatusCode: 404, RequestID: 559c075d-b91d-4956-b9e2-0d9f01b3239e, api error UnknownOperationException: Unknown operation: RekognitionService.ListCollections), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
228
+ },
229
+ {
230
+ "severity": "warning",
231
+ "summary": "Incomplete sweep for undeclared resources",
232
+ "detail": "The estate-wide sweep listed a aws_resiliencehubv2_policy that the provider could not fully read (Error Listing Remote Resources: listing Resilience Hub V2 Policies: operation error resiliencehubv2: ListPolicies, https response error StatusCode: 404, RequestID: b2aee268-3876-4163-b1dd-31399bb1da32, api error UnknownOperationException: Unknown operation: GET /v2/list-policies), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
233
+ },
234
+ {
235
+ "severity": "warning",
236
+ "summary": "Incomplete sweep for undeclared resources",
237
+ "detail": "The estate-wide sweep listed a aws_route53_resolver_rule that the provider could not fully read (Error Listing Remote Resources: listing Route53 Resolver Rules: operation error Route53Resolver: ListResolverRules, https response error StatusCode: 404, RequestID: fc867ad8-77d3-4084-8cf7-36abe714f121, api error UnknownOperationException: Unknown operation: Route53Resolver.ListResolverRules), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
238
+ },
239
+ {
240
+ "severity": "warning",
241
+ "summary": "Incomplete sweep for undeclared resources",
242
+ "detail": "The estate-wide sweep listed a aws_s3_directory_bucket that the provider could not fully read (Error Listing Remote Resources: listing S3 Directory Bucket resources: operation error S3: ListDirectoryBuckets, get identity: bucket name is missing), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
243
+ },
244
+ {
245
+ "severity": "warning",
246
+ "summary": "Incomplete sweep for undeclared resources",
247
+ "detail": "The estate-wide sweep listed a aws_s3files_access_point that the provider could not fully read (Error Listing Remote Resources: operation error S3Files: ListAccessPoints, 1 validation error(s) found.\n- missing required field, ListAccessPointsInput.FileSystemId.\n), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
248
+ },
249
+ {
250
+ "severity": "warning",
251
+ "summary": "Incomplete sweep for undeclared resources",
252
+ "detail": "The estate-wide sweep listed a aws_s3files_file_system that the provider could not fully read (Error Listing Remote Resources: operation error S3Files: ListFileSystems, https response error StatusCode: 404, RequestID: c6761512-a695-4051-b61f-5786821d6041, api error UnknownOperationException: Unknown operation: GET /file-systems), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
253
+ },
254
+ {
255
+ "severity": "warning",
256
+ "summary": "Incomplete sweep for undeclared resources",
257
+ "detail": "The estate-wide sweep listed a aws_sagemaker_hub_content_reference that the provider could not fully read (Error Listing Remote Resources: listing SageMaker Hub Content Reference resources: operation error SageMaker: ListHubs, https response error StatusCode: 400, RequestID: 2a883b3d-177a-4dcc-85e3-9f114f730510, api error UnknownOperationException: Operation ListHubs is not supported by floci), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
258
+ },
259
+ {
260
+ "severity": "warning",
261
+ "summary": "Incomplete sweep for undeclared resources",
262
+ "detail": "The estate-wide sweep listed a aws_securityhub_automation_rule_v2 that the provider could not fully read (Error Listing Remote Resources: listing Security Hub V2 Automation Rules: operation error SecurityHub: ListAutomationRulesV2, https response error StatusCode: 404, RequestID: 568ce3df-35ff-4d65-bc8b-1708eaa17fc9, api error UnknownOperationException: Unknown operation: GET /automationrulesv2/list), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
263
+ },
264
+ {
265
+ "severity": "warning",
266
+ "summary": "Incomplete sweep for undeclared resources",
267
+ "detail": "The estate-wide sweep listed a aws_securityhub_connector_v2 that the provider could not fully read (Error Listing Remote Resources: listing Security Hub V2 Connectors: operation error SecurityHub: ListConnectorsV2, https response error StatusCode: 404, RequestID: a975e3a9-1cbd-4729-9de7-22cce42a6bde, api error UnknownOperationException: Unknown operation: GET /connectorsv2), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
268
+ },
269
+ {
270
+ "severity": "warning",
271
+ "summary": "Incomplete sweep for undeclared resources",
272
+ "detail": "The estate-wide sweep listed a aws_workspaces_pool that the provider could not fully read (Error Listing Remote Resources: listing WorkSpaces Pools: operation error WorkSpaces: DescribeWorkspacesPools, https response error StatusCode: 404, RequestID: 296ecdfc-186f-437b-a9cc-e9775b298f7f, api error UnknownOperationException: Unknown operation: WorkspacesService.DescribeWorkspacesPools), so its ownership markers cannot be read and it cannot be matched to this estate. This is expected for a resource this estate does not own, such as an AWS-managed default; the sweep continues over the rest of this type's objects and every other type."
273
+ },
274
+ {
275
+ "severity": "warning",
276
+ "summary": "Live resource outside this estate",
277
+ "detail": "A live aws_cloudwatch_log_group already exists with identity \"/stateless-e2e-block/adoptable\" and carries no tofu-estate marker, so this estate does not own it and the plan proposes creating the resource this configuration declares - which, for a type whose name must be unique, the cloud will refuse while the unowned one holds it. Adopt it by writing tofu-estate=\"stateless-e2e-block\" and tofu-address=\"aws_cloudwatch_log_group.adoptable\" onto it, then re-run; or set policy { declared_untagged = \"adopt\" } in the live block to have this run adopt it for you; or point this resource at a name nobody is using."
278
+ },
279
+ {
280
+ "severity": "warning",
281
+ "summary": "Live resource outside this estate",
282
+ "detail": "A live aws_cloudwatch_log_group already exists with identity \"/stateless-e2e-block/held-elsewhere\" and carries tofu-estate=\"other-estate\", so it belongs to another estate and nothing in this plan reads, changes or destroys it. See live/MARKERS.md, \"Ownership semantics\"."
283
+ }
284
+ ]
285
+ }
@@ -0,0 +1,3 @@
1
+ # The body of this file is the live block's content, with no wrapper block
2
+ # (choudoufu's live/MARKERS.md and site/content/docs/use/setup.md).
3
+ estate = "fixture-estate"
@@ -0,0 +1,24 @@
1
+ terraform {
2
+ required_version = ">= 1.5.0"
3
+
4
+ required_providers {
5
+ null = {
6
+ source = "hashicorp/null"
7
+ version = "~> 3.2"
8
+ }
9
+ }
10
+ }
11
+
12
+ provider "null" {}
13
+
14
+ resource "null_resource" "first" {
15
+ triggers = {
16
+ name = "first"
17
+ }
18
+ }
19
+
20
+ resource "null_resource" "second" {
21
+ triggers = {
22
+ name = "second"
23
+ }
24
+ }
@@ -0,0 +1,16 @@
1
+ # module-tree
2
+
3
+ Four roots for the module-descent tests (`src/hcl/descend.test.ts`, chant
4
+ #2112). Nothing here is applied, and no provider is real; the shapes are what
5
+ the descent has to get right.
6
+
7
+ - `root/` calls `./modules/cdn` (which itself calls `./modules/bucket`, two
8
+ levels) and a registry module. The registry call is where "not followed"
9
+ is asserted; the local ones are where the `<root>/module.<name>/<address>`
10
+ keys and the `callers` chains are.
11
+ - `cycle/` is `a` calling `b` calling `a`, the case the visited set on
12
+ resolved paths has to stop.
13
+ - `outside/root` sources `../../shared`, which resolves outside `outside/`,
14
+ the project root the test hands the render. `shared/` is the directory it
15
+ points at, deliberately reachable on disk so the refusal is about the
16
+ boundary and not about a missing directory.
@@ -0,0 +1,3 @@
1
+ module "a" {
2
+ source = "./modules/a"
3
+ }
@@ -0,0 +1,9 @@
1
+ module "b" {
2
+ source = "../b"
3
+ }
4
+
5
+ resource "null_resource" "a" {
6
+ triggers = {
7
+ name = "a"
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ module "a" {
2
+ source = "../a"
3
+ }
4
+
5
+ resource "null_resource" "b" {
6
+ triggers = {
7
+ name = "b"
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ module "gone" {
2
+ source = "./modules/gone"
3
+ }
4
+
5
+ resource "null_resource" "here" {
6
+ triggers = {
7
+ name = "here"
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ module "shared" {
2
+ source = "../../shared"
3
+ }
4
+
5
+ resource "null_resource" "here" {
6
+ triggers = {
7
+ name = "here"
8
+ }
9
+ }
@@ -0,0 +1,28 @@
1
+ terraform {
2
+ required_version = ">= 1.5.0"
3
+
4
+ backend "s3" {
5
+ bucket = "tfstate"
6
+ key = "app/terraform.tfstate"
7
+ region = "us-east-1"
8
+ }
9
+ }
10
+
11
+ variable "region" {
12
+ type = string
13
+ default = "us-east-1"
14
+ }
15
+
16
+ module "cdn" {
17
+ source = "./modules/cdn"
18
+ region = var.region
19
+ }
20
+
21
+ module "vpc" {
22
+ source = "terraform-aws-modules/vpc/aws"
23
+ version = "5.1.2"
24
+ }
25
+
26
+ resource "aws_s3_bucket" "root_bucket" {
27
+ bucket = "root-bucket"
28
+ }
@@ -0,0 +1,15 @@
1
+ variable "region" {
2
+ type = string
3
+ }
4
+
5
+ provider "aws" {
6
+ region = var.region
7
+ }
8
+
9
+ module "bucket" {
10
+ source = "./modules/bucket"
11
+ }
12
+
13
+ resource "aws_cloudfront_distribution" "cdn" {
14
+ comment = "cdn in ${var.region}"
15
+ }
@@ -0,0 +1,11 @@
1
+ terraform {
2
+ required_version = ">= 1.5.0"
3
+
4
+ backend "local" {
5
+ path = "bucket.tfstate"
6
+ }
7
+ }
8
+
9
+ resource "aws_s3_bucket" "assets" {
10
+ bucket = "assets"
11
+ }
@@ -0,0 +1,5 @@
1
+ resource "null_resource" "shared" {
2
+ triggers = {
3
+ name = "shared"
4
+ }
5
+ }
@@ -0,0 +1,56 @@
1
+ # Every reference form the index collects, once each, so a test can assert the
2
+ # whole vocabulary against one parse (chant #2112).
3
+ #
4
+ # var.<name> region, subnets
5
+ # local.<name> bucket_name, tags
6
+ # data.<type>.<name> data.aws_ami.ubuntu
7
+ # module.<name> module.cdn
8
+ # provider = <type>.<alias> provider.aws.replica, through both the
9
+ # `provider` meta-argument and a module's
10
+ # `providers` map
11
+
12
+ variable "region" {
13
+ type = string
14
+ }
15
+
16
+ variable "subnets" {
17
+ type = list(string)
18
+ }
19
+
20
+ locals {
21
+ bucket_name = "assets-${var.region}"
22
+ tags = { Team = "platform" }
23
+ }
24
+
25
+ data "aws_ami" "ubuntu" {
26
+ most_recent = true
27
+ }
28
+
29
+ provider "aws" {
30
+ alias = "replica"
31
+ region = "eu-west-1"
32
+ }
33
+
34
+ resource "aws_instance" "web" {
35
+ count = length(var.subnets)
36
+ ami = data.aws_ami.ubuntu.id
37
+ subnet_id = var.subnets[count.index]
38
+ tags = local.tags
39
+ }
40
+
41
+ resource "aws_s3_bucket" "replica" {
42
+ provider = aws.replica
43
+ bucket = "${local.bucket_name}-replica"
44
+ }
45
+
46
+ module "cdn" {
47
+ source = "./modules/cdn"
48
+
49
+ providers = {
50
+ aws = aws.replica
51
+ }
52
+ }
53
+
54
+ output "cdn_url" {
55
+ value = module.cdn.url
56
+ }
@@ -0,0 +1,28 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { describe, expect, test } from "vitest";
5
+ import { scanRules } from "@intentius/chant/codegen/docs-rule-scanning";
6
+
7
+ /**
8
+ * `docs/pages/lint-rules.mdx` is authored by hand, one `##` section per rule
9
+ * (#2108). Nothing regenerates those sections, so nothing stops the page
10
+ * lagging the catalog the moment a new rule ships without one. This test
11
+ * reads the same rule scan the generated `rules` table (`All Rules`) is built
12
+ * from and fails the moment a scanned id has no matching heading on the
13
+ * authored page, so the page cannot silently fall behind.
14
+ */
15
+ const pkgDir = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
16
+
17
+ describe("lint-rules.mdx stays in sync with the rule catalog", () => {
18
+ test("every rule id scanned from source has a ## section on the authored page", () => {
19
+ const ids = scanRules(join(pkgDir, "src")).map((r) => r.id).sort();
20
+ expect(ids.length).toBeGreaterThan(0);
21
+
22
+ const page = readFileSync(join(pkgDir, "docs", "pages", "lint-rules.mdx"), "utf-8");
23
+ const headingIds = new Set([...page.matchAll(/^## (TF\d+)\b/gm)].map((m) => m[1]));
24
+
25
+ const missing = ids.filter((id) => !headingIds.has(id));
26
+ expect(missing, `lint-rules.mdx has no section for: ${missing.join(", ")}`).toEqual([]);
27
+ });
28
+ });