infraweaver 0.1.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 (524) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +244 -0
  3. package/dist/agents/claude.d.ts +113 -0
  4. package/dist/agents/claudePretoolGate.d.ts +137 -0
  5. package/dist/agents/dispatchMetrics.d.ts +77 -0
  6. package/dist/agents/gateServer.d.ts +7 -0
  7. package/dist/agents/index.d.ts +6 -0
  8. package/dist/agents/nativeFsDenies.d.ts +46 -0
  9. package/dist/agents/opencode.d.ts +284 -0
  10. package/dist/agents/opencodePlugin.d.ts +96 -0
  11. package/dist/agents/opencodeShared.d.ts +40 -0
  12. package/dist/agents/postRun.d.ts +126 -0
  13. package/dist/agents/reviewer.d.ts +41 -0
  14. package/dist/agents/sessionLabeler.d.ts +97 -0
  15. package/dist/agents/shared.d.ts +246 -0
  16. package/dist/agents/subagentModels.d.ts +19 -0
  17. package/dist/agents/tokenQuota.d.ts +118 -0
  18. package/dist/agents/writeGateSource.d.ts +22 -0
  19. package/dist/agents/writePolicy.d.ts +79 -0
  20. package/dist/brand.d.ts +67 -0
  21. package/dist/cli.mjs +247846 -0
  22. package/dist/external.d.ts +227 -0
  23. package/dist/i18n/scaffolding.d.ts +59 -0
  24. package/dist/index.d.ts +6 -0
  25. package/dist/index.js +247061 -0
  26. package/dist/internal/index.d.ts +18 -0
  27. package/dist/internal.js +2398 -0
  28. package/dist/lifecycle.d.ts +2 -0
  29. package/dist/main.d.ts +8 -0
  30. package/dist/mcp/arkConfig.d.ts +1 -0
  31. package/dist/mcp/assess.d.ts +157 -0
  32. package/dist/mcp/capabilityContext.d.ts +71 -0
  33. package/dist/mcp/changeSummary.d.ts +52 -0
  34. package/dist/mcp/checkSuite.d.ts +27 -0
  35. package/dist/mcp/checkout.d.ts +92 -0
  36. package/dist/mcp/comment.d.ts +127 -0
  37. package/dist/mcp/commitInfo.d.ts +11 -0
  38. package/dist/mcp/crosswalk.d.ts +178 -0
  39. package/dist/mcp/crosswalkDigest.d.ts +1 -0
  40. package/dist/mcp/cyberEssentials.d.ts +24 -0
  41. package/dist/mcp/dashboard.d.ts +125 -0
  42. package/dist/mcp/dependencies.d.ts +12 -0
  43. package/dist/mcp/frameworks.d.ts +74 -0
  44. package/dist/mcp/geminiSanitizer.d.ts +28 -0
  45. package/dist/mcp/git.d.ts +60 -0
  46. package/dist/mcp/guardrails.d.ts +222 -0
  47. package/dist/mcp/issue.d.ts +20 -0
  48. package/dist/mcp/issueComments.d.ts +11 -0
  49. package/dist/mcp/issueEvents.d.ts +11 -0
  50. package/dist/mcp/issueInfo.d.ts +11 -0
  51. package/dist/mcp/labels.d.ts +14 -0
  52. package/dist/mcp/localContext.d.ts +26 -0
  53. package/dist/mcp/moduleExtraction.d.ts +79 -0
  54. package/dist/mcp/moduleTests.d.ts +106 -0
  55. package/dist/mcp/modules.d.ts +198 -0
  56. package/dist/mcp/output.d.ts +16 -0
  57. package/dist/mcp/pathSafety.d.ts +14 -0
  58. package/dist/mcp/policy.d.ts +50 -0
  59. package/dist/mcp/pr.d.ts +64 -0
  60. package/dist/mcp/prInfo.d.ts +11 -0
  61. package/dist/mcp/providerSchema.d.ts +52 -0
  62. package/dist/mcp/review.d.ts +212 -0
  63. package/dist/mcp/reviewComments.d.ts +245 -0
  64. package/dist/mcp/roots.d.ts +60 -0
  65. package/dist/mcp/scope.d.ts +26 -0
  66. package/dist/mcp/selectMode.d.ts +20 -0
  67. package/dist/mcp/server.d.ts +61 -0
  68. package/dist/mcp/shared.d.ts +62 -0
  69. package/dist/mcp/shell.d.ts +58 -0
  70. package/dist/mcp/staleFix.d.ts +138 -0
  71. package/dist/mcp/terraform/azurePrices.d.ts +8 -0
  72. package/dist/mcp/terraform/baseline.d.ts +57 -0
  73. package/dist/mcp/terraform/concernResult.d.ts +38 -0
  74. package/dist/mcp/terraform/cost.d.ts +55 -0
  75. package/dist/mcp/terraform/cspm.d.ts +80 -0
  76. package/dist/mcp/terraform/currency.d.ts +110 -0
  77. package/dist/mcp/terraform/decisions.d.ts +178 -0
  78. package/dist/mcp/terraform/eidas.d.ts +100 -0
  79. package/dist/mcp/terraform/evidence.d.ts +343 -0
  80. package/dist/mcp/terraform/findings.d.ts +76 -0
  81. package/dist/mcp/terraform/fixMemory.d.ts +81 -0
  82. package/dist/mcp/terraform/governance.d.ts +56 -0
  83. package/dist/mcp/terraform/hcl.d.ts +115 -0
  84. package/dist/mcp/terraform/iacLanguages.d.ts +120 -0
  85. package/dist/mcp/terraform/idleFloor.d.ts +78 -0
  86. package/dist/mcp/terraform/keyless.d.ts +68 -0
  87. package/dist/mcp/terraform/moduleDocs.d.ts +56 -0
  88. package/dist/mcp/terraform/nativeRules.d.ts +38 -0
  89. package/dist/mcp/terraform/nativeScan.d.ts +11 -0
  90. package/dist/mcp/terraform/noiseProfile.d.ts +100 -0
  91. package/dist/mcp/terraform/normalization.d.ts +52 -0
  92. package/dist/mcp/terraform/oscal.d.ts +103 -0
  93. package/dist/mcp/terraform/packs/azurerm-3-4.d.ts +2 -0
  94. package/dist/mcp/terraform/packs/cloudflare-4-5.d.ts +2 -0
  95. package/dist/mcp/terraform/paths.d.ts +28 -0
  96. package/dist/mcp/terraform/plan.d.ts +157 -0
  97. package/dist/mcp/terraform/planDrift.d.ts +199 -0
  98. package/dist/mcp/terraform/policyAuthor.d.ts +191 -0
  99. package/dist/mcp/terraform/prowlerOcsf.d.ts +136 -0
  100. package/dist/mcp/terraform/refactor.d.ts +183 -0
  101. package/dist/mcp/terraform/registry.d.ts +108 -0
  102. package/dist/mcp/terraform/risk.d.ts +41 -0
  103. package/dist/mcp/terraform/scanSession.d.ts +116 -0
  104. package/dist/mcp/terraform/scannerCache.d.ts +15 -0
  105. package/dist/mcp/terraform/scannerEgress.d.ts +72 -0
  106. package/dist/mcp/terraform/scannerJson.d.ts +13 -0
  107. package/dist/mcp/terraform/scanners.d.ts +205 -0
  108. package/dist/mcp/terraform/signing.d.ts +61 -0
  109. package/dist/mcp/terraform/stateLocking.d.ts +18 -0
  110. package/dist/mcp/terraform/subprocess.d.ts +43 -0
  111. package/dist/mcp/terraform/suppressions.d.ts +90 -0
  112. package/dist/mcp/terraform/taxonomy.d.ts +39 -0
  113. package/dist/mcp/terraform/tfquery.d.ts +47 -0
  114. package/dist/mcp/terraform/toolchainIntegrity.d.ts +82 -0
  115. package/dist/mcp/terraform/tools/authorPolicy.d.ts +59 -0
  116. package/dist/mcp/terraform/tools/detectPlanDrift.d.ts +20 -0
  117. package/dist/mcp/terraform/tools/emitCost.d.ts +11 -0
  118. package/dist/mcp/terraform/tools/emitSarif.d.ts +14 -0
  119. package/dist/mcp/terraform/tools/fixMemory.d.ts +19 -0
  120. package/dist/mcp/terraform/tools/infracostDiff.d.ts +22 -0
  121. package/dist/mcp/terraform/tools/ingestExternalFindings.d.ts +21 -0
  122. package/dist/mcp/terraform/tools/moduleLookup.d.ts +14 -0
  123. package/dist/mcp/terraform/tools/moduleSearch.d.ts +23 -0
  124. package/dist/mcp/terraform/tools/plan.d.ts +59 -0
  125. package/dist/mcp/terraform/tools/providerUpgrade.d.ts +55 -0
  126. package/dist/mcp/terraform/tools/readFindings.d.ts +17 -0
  127. package/dist/mcp/terraform/tools/scan.d.ts +114 -0
  128. package/dist/mcp/terraform/tools/validate.d.ts +31 -0
  129. package/dist/mcp/terraform/tools/verifyRemediation.d.ts +31 -0
  130. package/dist/mcp/terraform/tools/versionCurrency.d.ts +5 -0
  131. package/dist/mcp/terraform/tools.d.ts +16 -0
  132. package/dist/mcp/terraform/transformPacks.d.ts +267 -0
  133. package/dist/mcp/terraform/types.d.ts +226 -0
  134. package/dist/mcp/terraform/verification.d.ts +81 -0
  135. package/dist/mcp/terraform/vex.d.ts +115 -0
  136. package/dist/mcp/terraform/writeOnly.d.ts +67 -0
  137. package/dist/mcp/terraform.d.ts +51 -0
  138. package/dist/mcp/terratest.d.ts +85 -0
  139. package/dist/mcp/untrustedContent.d.ts +76 -0
  140. package/dist/mcp/upload.d.ts +8 -0
  141. package/dist/models.d.ts +181 -0
  142. package/dist/modes/address-reviews.d.ts +2 -0
  143. package/dist/modes/assess.d.ts +2 -0
  144. package/dist/modes/build.d.ts +2 -0
  145. package/dist/modes/compliance-audit.d.ts +2 -0
  146. package/dist/modes/cost-optimization.d.ts +2 -0
  147. package/dist/modes/drift-detect.d.ts +2 -0
  148. package/dist/modes/fix.d.ts +2 -0
  149. package/dist/modes/incremental-review.d.ts +2 -0
  150. package/dist/modes/index.d.ts +24 -0
  151. package/dist/modes/modernize-deprecated.d.ts +2 -0
  152. package/dist/modes/plan.d.ts +2 -0
  153. package/dist/modes/policy-gate.d.ts +2 -0
  154. package/dist/modes/prFormats.d.ts +3 -0
  155. package/dist/modes/refactor.d.ts +2 -0
  156. package/dist/modes/refresh-remediation.d.ts +2 -0
  157. package/dist/modes/remediate-and-refactor.d.ts +2 -0
  158. package/dist/modes/remediate.d.ts +2 -0
  159. package/dist/modes/resolve-conflicts.d.ts +2 -0
  160. package/dist/modes/review.d.ts +2 -0
  161. package/dist/modes/summarize-pr.d.ts +2 -0
  162. package/dist/modes/task.d.ts +2 -0
  163. package/dist/modes/terraform-code-review.d.ts +2 -0
  164. package/dist/modes/types.d.ts +9 -0
  165. package/dist/modes/update-dependencies.d.ts +2 -0
  166. package/dist/prep/index.d.ts +7 -0
  167. package/dist/prep/installNodeDependencies.d.ts +2 -0
  168. package/dist/prep/installPythonDependencies.d.ts +2 -0
  169. package/dist/prep/types.d.ts +31 -0
  170. package/dist/reviewQuality.d.ts +107 -0
  171. package/dist/skills/terraform-best-practices/SKILL.md +379 -0
  172. package/dist/toolState.d.ts +123 -0
  173. package/dist/utils/activity.d.ts +40 -0
  174. package/dist/utils/agent.d.ts +47 -0
  175. package/dist/utils/agentHangReport.d.ts +38 -0
  176. package/dist/utils/annotations.d.ts +17 -0
  177. package/dist/utils/apiFetch.d.ts +11 -0
  178. package/dist/utils/apiKeys.d.ts +48 -0
  179. package/dist/utils/apiUrl.d.ts +28 -0
  180. package/dist/utils/assets.d.ts +8 -0
  181. package/dist/utils/baseRefConfig.d.ts +121 -0
  182. package/dist/utils/billingErrors.d.ts +85 -0
  183. package/dist/utils/body.d.ts +34 -0
  184. package/dist/utils/buildInfraweaverFooter.d.ts +29 -0
  185. package/dist/utils/byokFallback.d.ts +85 -0
  186. package/dist/utils/changeImpact.d.ts +101 -0
  187. package/dist/utils/claudeSubscription.d.ts +30 -0
  188. package/dist/utils/cli.d.ts +10 -0
  189. package/dist/utils/cloudClient.d.ts +33 -0
  190. package/dist/utils/cloudFetchCore.d.ts +42 -0
  191. package/dist/utils/cloudReport.d.ts +114 -0
  192. package/dist/utils/codexHome.d.ts +29 -0
  193. package/dist/utils/codexOAuth.d.ts +60 -0
  194. package/dist/utils/diffCoverage.d.ts +63 -0
  195. package/dist/utils/env.d.ts +46 -0
  196. package/dist/utils/errorReport.d.ts +17 -0
  197. package/dist/utils/exitHandler.d.ts +8 -0
  198. package/dist/utils/fixDoubleEscapedString.d.ts +1 -0
  199. package/dist/utils/gitAuth.d.ts +84 -0
  200. package/dist/utils/gitAuthServer.d.ts +24 -0
  201. package/dist/utils/github.d.ts +104 -0
  202. package/dist/utils/globals.d.ts +3 -0
  203. package/dist/utils/infraweaverConfig.d.ts +56 -0
  204. package/dist/utils/install.d.ts +37 -0
  205. package/dist/utils/instructions.d.ts +48 -0
  206. package/dist/utils/keylessOidc.d.ts +28 -0
  207. package/dist/utils/leapingComment.d.ts +11 -0
  208. package/dist/utils/learnings.d.ts +62 -0
  209. package/dist/utils/learningsTruncate.d.ts +25 -0
  210. package/dist/utils/lifecycle.d.ts +57 -0
  211. package/dist/utils/log.d.ts +111 -0
  212. package/dist/utils/modelResolver.d.ts +63 -0
  213. package/dist/utils/moduleFetch.d.ts +39 -0
  214. package/dist/utils/normalizeEnv.d.ts +30 -0
  215. package/dist/utils/openCodeModels.d.ts +11 -0
  216. package/dist/utils/openaiCompatible.d.ts +26 -0
  217. package/dist/utils/opentofuMcp.d.ts +50 -0
  218. package/dist/utils/overrides.d.ts +40 -0
  219. package/dist/utils/packageManager.d.ts +49 -0
  220. package/dist/utils/patchWorkflowRunFields.d.ts +29 -0
  221. package/dist/utils/payload.d.ts +249 -0
  222. package/dist/utils/prSummary.d.ts +61 -0
  223. package/dist/utils/presets.d.ts +36 -0
  224. package/dist/utils/progressComment.d.ts +146 -0
  225. package/dist/utils/providerErrors.d.ts +31 -0
  226. package/dist/utils/proxyModel.d.ts +76 -0
  227. package/dist/utils/rangeDiff.d.ts +51 -0
  228. package/dist/utils/redact.d.ts +33 -0
  229. package/dist/utils/registryAuth.d.ts +52 -0
  230. package/dist/utils/remediationCommand.d.ts +58 -0
  231. package/dist/utils/retry.d.ts +38 -0
  232. package/dist/utils/reviewCleanup.d.ts +14 -0
  233. package/dist/utils/run.d.ts +9 -0
  234. package/dist/utils/runContext.d.ts +112 -0
  235. package/dist/utils/runContextData.d.ts +42 -0
  236. package/dist/utils/runErrorRenderer.d.ts +64 -0
  237. package/dist/utils/runLifecycle.d.ts +89 -0
  238. package/dist/utils/runStartupLog.d.ts +15 -0
  239. package/dist/utils/secrets.d.ts +34 -0
  240. package/dist/utils/setup.d.ts +90 -0
  241. package/dist/utils/shell.d.ts +44 -0
  242. package/dist/utils/skills.d.ts +10 -0
  243. package/dist/utils/subprocess.d.ts +81 -0
  244. package/dist/utils/terraformMcp.d.ts +46 -0
  245. package/dist/utils/time.d.ts +15 -0
  246. package/dist/utils/timer.d.ts +23 -0
  247. package/dist/utils/todoTracking.d.ts +16 -0
  248. package/dist/utils/token.d.ts +52 -0
  249. package/dist/utils/toolLicensing.d.ts +56 -0
  250. package/dist/utils/toolSelection.d.ts +73 -0
  251. package/dist/utils/toon.d.ts +16 -0
  252. package/dist/utils/version.d.ts +2 -0
  253. package/dist/utils/versioning.d.ts +7 -0
  254. package/dist/utils/vertex.d.ts +16 -0
  255. package/dist/utils/workflow.d.ts +13 -0
  256. package/package.json +132 -0
  257. package/src/agents/claude.ts +1588 -0
  258. package/src/agents/claudePretoolGate.ts +286 -0
  259. package/src/agents/dispatchMetrics.ts +162 -0
  260. package/src/agents/gateServer.ts +178 -0
  261. package/src/agents/index.ts +10 -0
  262. package/src/agents/nativeFsDenies.ts +164 -0
  263. package/src/agents/opencode.ts +1600 -0
  264. package/src/agents/opencodePlugin.ts +304 -0
  265. package/src/agents/opencodeShared.ts +134 -0
  266. package/src/agents/postRun.ts +615 -0
  267. package/src/agents/reviewer.ts +134 -0
  268. package/src/agents/sessionLabeler.ts +185 -0
  269. package/src/agents/shared.ts +377 -0
  270. package/src/agents/subagentModels.ts +40 -0
  271. package/src/agents/tokenQuota.ts +203 -0
  272. package/src/agents/writeGateSource.ts +148 -0
  273. package/src/agents/writePolicy.ts +132 -0
  274. package/src/brand.ts +84 -0
  275. package/src/cli.ts +117 -0
  276. package/src/commands/gha.ts +188 -0
  277. package/src/commands/mcp.ts +126 -0
  278. package/src/commands/verifyEvidence.ts +100 -0
  279. package/src/entry.ts +7 -0
  280. package/src/entryPost.ts +109 -0
  281. package/src/external.ts +308 -0
  282. package/src/i18n/scaffolding.ts +191 -0
  283. package/src/index.ts +7 -0
  284. package/src/internal/index.ts +74 -0
  285. package/src/lifecycle.ts +2 -0
  286. package/src/main.ts +815 -0
  287. package/src/mcp/__fixtures__/infraweaver-scratch-pr-49-review-3485940013.json +110 -0
  288. package/src/mcp/__fixtures__/infraweaver-scratch-pr-64-review-3531000326.json +14 -0
  289. package/src/mcp/__fixtures__/infraweaver-test-repo-pr-1.diff.json +67 -0
  290. package/src/mcp/__snapshots__/checkout.test.ts.snap +109 -0
  291. package/src/mcp/__snapshots__/reviewComments.test.ts.snap +71 -0
  292. package/src/mcp/arkConfig.ts +7 -0
  293. package/src/mcp/assess.ts +723 -0
  294. package/src/mcp/capabilityContext.ts +80 -0
  295. package/src/mcp/changeSummary.ts +145 -0
  296. package/src/mcp/checkSuite.ts +261 -0
  297. package/src/mcp/checkout.ts +1015 -0
  298. package/src/mcp/comment.ts +683 -0
  299. package/src/mcp/commitInfo.ts +57 -0
  300. package/src/mcp/crosswalk.ts +1253 -0
  301. package/src/mcp/crosswalkDigest.ts +5 -0
  302. package/src/mcp/cyberEssentials.ts +60 -0
  303. package/src/mcp/dashboard.ts +232 -0
  304. package/src/mcp/dependencies.ts +190 -0
  305. package/src/mcp/frameworks.ts +236 -0
  306. package/src/mcp/geminiSanitizer.ts +212 -0
  307. package/src/mcp/git.ts +1116 -0
  308. package/src/mcp/guardrails.ts +771 -0
  309. package/src/mcp/issue.ts +74 -0
  310. package/src/mcp/issueComments.ts +48 -0
  311. package/src/mcp/issueEvents.ts +100 -0
  312. package/src/mcp/issueInfo.ts +72 -0
  313. package/src/mcp/labels.ts +35 -0
  314. package/src/mcp/localContext.ts +65 -0
  315. package/src/mcp/localServer.ts +217 -0
  316. package/src/mcp/moduleExtraction.ts +368 -0
  317. package/src/mcp/moduleTests.ts +421 -0
  318. package/src/mcp/modules.ts +752 -0
  319. package/src/mcp/output.ts +71 -0
  320. package/src/mcp/pathSafety.ts +28 -0
  321. package/src/mcp/policy.ts +226 -0
  322. package/src/mcp/pr.ts +238 -0
  323. package/src/mcp/prInfo.ts +91 -0
  324. package/src/mcp/providerSchema.ts +175 -0
  325. package/src/mcp/review.ts +1081 -0
  326. package/src/mcp/reviewComments.ts +1137 -0
  327. package/src/mcp/roots.ts +217 -0
  328. package/src/mcp/scope.ts +82 -0
  329. package/src/mcp/selectMode.ts +207 -0
  330. package/src/mcp/server.ts +498 -0
  331. package/src/mcp/shared.ts +120 -0
  332. package/src/mcp/shell.ts +631 -0
  333. package/src/mcp/staleFix.ts +557 -0
  334. package/src/mcp/terraform/__snapshots__/moduleDocs.test.ts.snap +40 -0
  335. package/src/mcp/terraform/azurePrices.ts +38 -0
  336. package/src/mcp/terraform/baseline.ts +172 -0
  337. package/src/mcp/terraform/concernResult.ts +111 -0
  338. package/src/mcp/terraform/cost.ts +175 -0
  339. package/src/mcp/terraform/cspm.ts +326 -0
  340. package/src/mcp/terraform/currency.ts +354 -0
  341. package/src/mcp/terraform/decisions.ts +590 -0
  342. package/src/mcp/terraform/eidas.ts +134 -0
  343. package/src/mcp/terraform/evidence.ts +771 -0
  344. package/src/mcp/terraform/findings.ts +383 -0
  345. package/src/mcp/terraform/fixMemory.ts +253 -0
  346. package/src/mcp/terraform/governance.ts +231 -0
  347. package/src/mcp/terraform/hcl.ts +273 -0
  348. package/src/mcp/terraform/iacLanguages.ts +431 -0
  349. package/src/mcp/terraform/idleFloor.ts +304 -0
  350. package/src/mcp/terraform/keyless.ts +123 -0
  351. package/src/mcp/terraform/moduleDocs.ts +303 -0
  352. package/src/mcp/terraform/nativeRules.ts +152 -0
  353. package/src/mcp/terraform/nativeScan.ts +67 -0
  354. package/src/mcp/terraform/noiseProfile.ts +183 -0
  355. package/src/mcp/terraform/normalization.ts +265 -0
  356. package/src/mcp/terraform/oscal.ts +283 -0
  357. package/src/mcp/terraform/packs/azurerm-3-4.ts +382 -0
  358. package/src/mcp/terraform/packs/cloudflare-4-5.ts +114 -0
  359. package/src/mcp/terraform/paths.ts +59 -0
  360. package/src/mcp/terraform/plan.ts +377 -0
  361. package/src/mcp/terraform/planDrift.ts +520 -0
  362. package/src/mcp/terraform/policyAuthor.ts +886 -0
  363. package/src/mcp/terraform/prowlerOcsf.ts +380 -0
  364. package/src/mcp/terraform/refactor.ts +879 -0
  365. package/src/mcp/terraform/registry.ts +317 -0
  366. package/src/mcp/terraform/risk.ts +99 -0
  367. package/src/mcp/terraform/scanSession.ts +242 -0
  368. package/src/mcp/terraform/scannerCache.ts +86 -0
  369. package/src/mcp/terraform/scannerEgress.ts +141 -0
  370. package/src/mcp/terraform/scannerJson.ts +22 -0
  371. package/src/mcp/terraform/scanners.ts +1134 -0
  372. package/src/mcp/terraform/signing.ts +151 -0
  373. package/src/mcp/terraform/stateLocking.ts +106 -0
  374. package/src/mcp/terraform/subprocess.ts +102 -0
  375. package/src/mcp/terraform/suppressions.ts +551 -0
  376. package/src/mcp/terraform/taxonomy.ts +0 -0
  377. package/src/mcp/terraform/tfquery.ts +159 -0
  378. package/src/mcp/terraform/toolchainIntegrity.ts +151 -0
  379. package/src/mcp/terraform/tools/authorPolicy.ts +185 -0
  380. package/src/mcp/terraform/tools/detectPlanDrift.ts +279 -0
  381. package/src/mcp/terraform/tools/emitCost.ts +130 -0
  382. package/src/mcp/terraform/tools/emitSarif.ts +108 -0
  383. package/src/mcp/terraform/tools/fixMemory.ts +82 -0
  384. package/src/mcp/terraform/tools/infracostDiff.ts +110 -0
  385. package/src/mcp/terraform/tools/ingestExternalFindings.ts +259 -0
  386. package/src/mcp/terraform/tools/moduleLookup.ts +86 -0
  387. package/src/mcp/terraform/tools/moduleSearch.ts +46 -0
  388. package/src/mcp/terraform/tools/plan.ts +384 -0
  389. package/src/mcp/terraform/tools/providerUpgrade.ts +217 -0
  390. package/src/mcp/terraform/tools/readFindings.ts +138 -0
  391. package/src/mcp/terraform/tools/scan.ts +303 -0
  392. package/src/mcp/terraform/tools/validate.ts +160 -0
  393. package/src/mcp/terraform/tools/verifyRemediation.ts +190 -0
  394. package/src/mcp/terraform/tools/versionCurrency.ts +64 -0
  395. package/src/mcp/terraform/tools.ts +62 -0
  396. package/src/mcp/terraform/transformPacks.ts +594 -0
  397. package/src/mcp/terraform/types.ts +382 -0
  398. package/src/mcp/terraform/verification.ts +150 -0
  399. package/src/mcp/terraform/vex.ts +367 -0
  400. package/src/mcp/terraform/writeOnly.ts +252 -0
  401. package/src/mcp/terraform.ts +52 -0
  402. package/src/mcp/terratest.ts +215 -0
  403. package/src/mcp/untrustedContent.ts +126 -0
  404. package/src/mcp/upload.ts +123 -0
  405. package/src/models.ts +753 -0
  406. package/src/modes/address-reviews.ts +35 -0
  407. package/src/modes/assess.ts +27 -0
  408. package/src/modes/build.ts +86 -0
  409. package/src/modes/compliance-audit.ts +25 -0
  410. package/src/modes/cost-optimization.ts +36 -0
  411. package/src/modes/drift-detect.ts +31 -0
  412. package/src/modes/fix.ts +29 -0
  413. package/src/modes/incremental-review.ts +103 -0
  414. package/src/modes/index.ts +94 -0
  415. package/src/modes/modernize-deprecated.ts +36 -0
  416. package/src/modes/plan.ts +21 -0
  417. package/src/modes/policy-gate.ts +27 -0
  418. package/src/modes/prFormats.ts +325 -0
  419. package/src/modes/refactor.ts +74 -0
  420. package/src/modes/refresh-remediation.ts +40 -0
  421. package/src/modes/remediate-and-refactor.ts +42 -0
  422. package/src/modes/remediate.ts +78 -0
  423. package/src/modes/resolve-conflicts.ts +32 -0
  424. package/src/modes/review.ts +135 -0
  425. package/src/modes/summarize-pr.ts +42 -0
  426. package/src/modes/task.ts +26 -0
  427. package/src/modes/terraform-code-review.ts +68 -0
  428. package/src/modes/types.ts +17 -0
  429. package/src/modes/update-dependencies.ts +44 -0
  430. package/src/prep/index.ts +96 -0
  431. package/src/prep/installNodeDependencies.ts +251 -0
  432. package/src/prep/installPythonDependencies.ts +235 -0
  433. package/src/prep/types.ts +38 -0
  434. package/src/reviewQuality.ts +237 -0
  435. package/src/runCli.ts +335 -0
  436. package/src/skills/terraform-best-practices/SKILL.md +379 -0
  437. package/src/toolState.ts +241 -0
  438. package/src/utils/activity.ts +210 -0
  439. package/src/utils/agent.ts +245 -0
  440. package/src/utils/agentHangReport.ts +180 -0
  441. package/src/utils/annotations.ts +56 -0
  442. package/src/utils/apiFetch.ts +19 -0
  443. package/src/utils/apiKeys.ts +305 -0
  444. package/src/utils/apiUrl.ts +42 -0
  445. package/src/utils/assets.ts +123 -0
  446. package/src/utils/baseRefConfig.ts +254 -0
  447. package/src/utils/billingErrors.ts +210 -0
  448. package/src/utils/body.ts +168 -0
  449. package/src/utils/buildInfraweaverFooter.ts +104 -0
  450. package/src/utils/byokFallback.ts +137 -0
  451. package/src/utils/changeImpact.ts +330 -0
  452. package/src/utils/claudeSubscription.ts +93 -0
  453. package/src/utils/cli.ts +36 -0
  454. package/src/utils/cloudClient.ts +57 -0
  455. package/src/utils/cloudFetchCore.ts +139 -0
  456. package/src/utils/cloudReport.ts +316 -0
  457. package/src/utils/codexHome.ts +204 -0
  458. package/src/utils/codexOAuth.ts +154 -0
  459. package/src/utils/codexRefreshDetect.ts +36 -0
  460. package/src/utils/diffCoverage.ts +404 -0
  461. package/src/utils/env.ts +84 -0
  462. package/src/utils/errorReport.ts +94 -0
  463. package/src/utils/exitHandler.ts +35 -0
  464. package/src/utils/fixDoubleEscapedString.ts +9 -0
  465. package/src/utils/ghaCore.ts +13 -0
  466. package/src/utils/gitAuth.ts +268 -0
  467. package/src/utils/gitAuthServer.ts +186 -0
  468. package/src/utils/github.ts +676 -0
  469. package/src/utils/globals.ts +9 -0
  470. package/src/utils/humanEditCapture.ts +198 -0
  471. package/src/utils/infraweaverConfig.ts +202 -0
  472. package/src/utils/install.ts +279 -0
  473. package/src/utils/instructions.ts +640 -0
  474. package/src/utils/keylessOidc.ts +47 -0
  475. package/src/utils/leapingComment.ts +20 -0
  476. package/src/utils/learnings.ts +145 -0
  477. package/src/utils/learningsTruncate.ts +42 -0
  478. package/src/utils/lifecycle.ts +198 -0
  479. package/src/utils/log.ts +452 -0
  480. package/src/utils/modelResolver.ts +105 -0
  481. package/src/utils/moduleFetch.ts +138 -0
  482. package/src/utils/normalizeEnv.ts +106 -0
  483. package/src/utils/openCodeModels.ts +86 -0
  484. package/src/utils/openaiCompatible.ts +52 -0
  485. package/src/utils/opentofuMcp.ts +61 -0
  486. package/src/utils/overrides.ts +100 -0
  487. package/src/utils/packageManager.ts +257 -0
  488. package/src/utils/patchWorkflowRunFields.ts +173 -0
  489. package/src/utils/payload.ts +1206 -0
  490. package/src/utils/prSummary.ts +148 -0
  491. package/src/utils/presets.ts +105 -0
  492. package/src/utils/progressComment.ts +266 -0
  493. package/src/utils/providerErrors.ts +189 -0
  494. package/src/utils/proxyModel.ts +239 -0
  495. package/src/utils/rangeDiff.ts +182 -0
  496. package/src/utils/redact.ts +86 -0
  497. package/src/utils/registryAuth.ts +115 -0
  498. package/src/utils/remediationCommand.ts +144 -0
  499. package/src/utils/retry.ts +180 -0
  500. package/src/utils/reviewCleanup.ts +116 -0
  501. package/src/utils/run.ts +100 -0
  502. package/src/utils/runContext.ts +276 -0
  503. package/src/utils/runContextData.ts +121 -0
  504. package/src/utils/runErrorRenderer.ts +282 -0
  505. package/src/utils/runFixture.ts +91 -0
  506. package/src/utils/runLifecycle.ts +360 -0
  507. package/src/utils/runStartupLog.ts +67 -0
  508. package/src/utils/secrets.ts +208 -0
  509. package/src/utils/setup.ts +368 -0
  510. package/src/utils/shell.ts +132 -0
  511. package/src/utils/skills.ts +67 -0
  512. package/src/utils/subprocess.ts +474 -0
  513. package/src/utils/terraformMcp.ts +99 -0
  514. package/src/utils/time.ts +59 -0
  515. package/src/utils/timer.ts +72 -0
  516. package/src/utils/todoTracking.ts +168 -0
  517. package/src/utils/token.ts +294 -0
  518. package/src/utils/toolLicensing.ts +152 -0
  519. package/src/utils/toolSelection.ts +239 -0
  520. package/src/utils/toon.ts +76 -0
  521. package/src/utils/version.ts +10 -0
  522. package/src/utils/versioning.ts +44 -0
  523. package/src/utils/vertex.ts +94 -0
  524. package/src/utils/workflow.ts +25 -0
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Strict OSCAL Assessment Results emitter (the buyer-gated follow-up to the
3
+ * Infraweaver-native evidence bundle in [[evidence]]).
4
+ *
5
+ * The native bundle is Infraweaver's own schema; this renders the SAME assessment as
6
+ * NIST **OSCAL 1.1.2 Assessment Results** JSON, so a buyer whose GRC tooling
7
+ * imports OSCAL (compliance-trestle / C2P / Auditree) can ingest it directly. It
8
+ * is INDICATIVE (crosswalk-derived, no formal assessment plan) and honest: every
9
+ * open concern becomes a `not-satisfied` finding against the control objective it
10
+ * touches — we never synthesise a `satisfied` we can't code-verify.
11
+ *
12
+ * Determinism: UUIDs are name-based (a sha256 of stable seeds, formatted as a v5
13
+ * UUID), so the same inputs + `generatedAt` always produce byte-identical output —
14
+ * matching the pure stance of the evidence builder, and keeping diffs meaningful.
15
+ */
16
+ import { createHash } from "node:crypto";
17
+ import { mkdirSync, writeFileSync } from "node:fs";
18
+ import { dirname } from "node:path";
19
+ import { type } from "arktype";
20
+ import { OSCAL_FILE, PRODUCT_NAME } from "#app/brand";
21
+ import {
22
+ type AssessmentScorecard,
23
+ runAssessmentPipeline,
24
+ } from "#app/mcp/assess";
25
+ import type { CrosswalkReport } from "#app/mcp/crosswalk";
26
+ import type { LocalToolContext } from "#app/mcp/localContext";
27
+ import { resolveWithinCwd } from "#app/mcp/pathSafety";
28
+ import { execute, tool, toolOk } from "#app/mcp/shared";
29
+ import type { EvidenceSubject } from "#app/mcp/terraform/evidence";
30
+ import type { Severity } from "#app/mcp/terraform/types";
31
+ import { log } from "#app/utils/cli";
32
+ import { githubContext } from "#app/utils/env";
33
+ import packageJson from "#package.json" with { type: "json" };
34
+
35
+ export const OSCAL_VERSION = "1.1.2" as const;
36
+
37
+ const INDICATIVE_REMARK =
38
+ "Indicative, crosswalk-derived assessment from a deterministic starter rule-pack — " +
39
+ "NOT a formal OSCAL assessment against an authored assessment plan. Statuses are " +
40
+ "code-verified only; absence of a finding is not proof of compliance.";
41
+
42
+ interface OscalProp {
43
+ name: string;
44
+ value: string;
45
+ ns?: string;
46
+ }
47
+
48
+ interface OscalObservation {
49
+ uuid: string;
50
+ title: string;
51
+ description: string;
52
+ methods: string[];
53
+ collected: string;
54
+ "relevant-evidence"?: { description: string }[];
55
+ }
56
+
57
+ interface OscalFinding {
58
+ uuid: string;
59
+ title: string;
60
+ description: string;
61
+ target: {
62
+ type: "objective-id";
63
+ "target-id": string;
64
+ status: { state: "satisfied" | "not-satisfied"; reason?: string };
65
+ };
66
+ "related-observations"?: { "observation-uuid": string }[];
67
+ props?: OscalProp[];
68
+ }
69
+
70
+ export interface OscalAssessmentResults {
71
+ "assessment-results": {
72
+ uuid: string;
73
+ metadata: {
74
+ title: string;
75
+ "last-modified": string;
76
+ version: string;
77
+ "oscal-version": typeof OSCAL_VERSION;
78
+ props: OscalProp[];
79
+ remarks: string;
80
+ };
81
+ "import-ap": { href: string; remarks: string };
82
+ results: Array<{
83
+ uuid: string;
84
+ title: string;
85
+ description: string;
86
+ start: string;
87
+ "reviewed-controls": {
88
+ "control-selections": Array<{
89
+ "include-controls"?: { "control-id": string }[];
90
+ "include-all"?: Record<string, never>;
91
+ }>;
92
+ };
93
+ observations: OscalObservation[];
94
+ findings: OscalFinding[];
95
+ }>;
96
+ };
97
+ }
98
+
99
+ const NS = "https://infraweaver.dev/ns/oscal";
100
+
101
+ /** name-based (v5-shaped) UUID from a seed, so output is reproducible.
102
+ * Shared with the CycloneDX VEX emitter ([[vex]]) — both artefacts keep the
103
+ * pure/deterministic stance of the evidence builder. */
104
+ export function deterministicUuid(seed: string): string {
105
+ const hex = createHash("sha256")
106
+ .update(seed)
107
+ .digest("hex")
108
+ .slice(0, 32)
109
+ .split("");
110
+ hex[12] = "5"; // version 5 (name-based)
111
+ hex[16] = ((Number.parseInt(hex[16] ?? "0", 16) & 0x3) | 0x8).toString(16); // RFC 4122 variant
112
+ const u = hex.join("");
113
+ return `${u.slice(0, 8)}-${u.slice(8, 12)}-${u.slice(12, 16)}-${u.slice(16, 20)}-${u.slice(20, 32)}`;
114
+ }
115
+
116
+ function subjectLabel(s: EvidenceSubject): string {
117
+ return s.repo ? `${s.repo}${s.ref ? `@${s.ref}` : ""}` : s.scanned_dir;
118
+ }
119
+
120
+ /**
121
+ * Build a strict OSCAL 1.1.2 Assessment Results document from an assessment's
122
+ * scorecard + crosswalk. Pure (clock/identity passed in). Each crosswalk entry
123
+ * (an open concern) yields one observation and one `not-satisfied` finding per
124
+ * control objective it maps to; the finding's verification status + severity ride
125
+ * as props so an OSCAL consumer keeps the five-status nuance.
126
+ */
127
+ export function buildOscalAssessmentResults(args: {
128
+ scorecard: AssessmentScorecard;
129
+ crosswalk: CrosswalkReport;
130
+ subject: EvidenceSubject;
131
+ generatedAt: string;
132
+ version?: string;
133
+ }): OscalAssessmentResults {
134
+ const { scorecard, crosswalk, subject, generatedAt } = args;
135
+ const label = subjectLabel(subject);
136
+ const seed = `${subject.commit ?? subject.scanned_dir}|${generatedAt}`;
137
+
138
+ const observations: OscalObservation[] = [];
139
+ const findings: OscalFinding[] = [];
140
+ const controlIds = new Set<string>();
141
+
142
+ for (const e of crosswalk.entries) {
143
+ const obsUuid = deterministicUuid(`obs|${seed}|${e.concern_id}`);
144
+ observations.push({
145
+ uuid: obsUuid,
146
+ title: `${e.rule_id} (${e.concern_id})`,
147
+ description: `Scanner finding ${e.rule_id} mapped via the indicative crosswalk.`,
148
+ methods: ["TEST"], // automated scanner evidence
149
+ collected: generatedAt,
150
+ });
151
+ for (const c of e.controls) {
152
+ controlIds.add(c.control);
153
+ findings.push({
154
+ uuid: deterministicUuid(
155
+ `finding|${seed}|${e.concern_id}|${c.framework}|${c.control}`,
156
+ ),
157
+ title: `${c.control} — ${c.title}`,
158
+ description: `${e.rule_id} indicates control "${c.title}" (${c.framework}) is not satisfied.`,
159
+ target: {
160
+ type: "objective-id",
161
+ "target-id": c.control,
162
+ status: { state: "not-satisfied", reason: e.status },
163
+ },
164
+ "related-observations": [{ "observation-uuid": obsUuid }],
165
+ props: [
166
+ { name: "verification-status", value: e.status, ns: NS },
167
+ { name: "framework", value: c.framework, ns: NS },
168
+ ],
169
+ });
170
+ }
171
+ }
172
+
173
+ const includeControls = [...controlIds]
174
+ .sort()
175
+ .map((id) => ({ "control-id": id }));
176
+
177
+ return {
178
+ "assessment-results": {
179
+ uuid: deterministicUuid(`ar|${seed}`),
180
+ metadata: {
181
+ title: `${PRODUCT_NAME} indicative compliance assessment — ${label}`,
182
+ "last-modified": generatedAt,
183
+ version: args.version ?? packageJson.version,
184
+ "oscal-version": OSCAL_VERSION,
185
+ props: [
186
+ { name: "marking", value: "indicative", ns: NS },
187
+ { name: "posture", value: scorecard.posture, ns: NS },
188
+ ],
189
+ remarks: INDICATIVE_REMARK,
190
+ },
191
+ "import-ap": {
192
+ // No formal assessment plan exists; OSCAL requires import-ap, so we point
193
+ // at a self-describing URN and explain the indicative basis in remarks.
194
+ href: "urn:infraweaver:indicative-assessment-plan",
195
+ remarks: INDICATIVE_REMARK,
196
+ },
197
+ results: [
198
+ {
199
+ uuid: deterministicUuid(`result|${seed}`),
200
+ title: "Indicative assessment result",
201
+ description: INDICATIVE_REMARK,
202
+ start: generatedAt,
203
+ "reviewed-controls": {
204
+ "control-selections": [
205
+ includeControls.length > 0
206
+ ? { "include-controls": includeControls }
207
+ : { "include-all": {} },
208
+ ],
209
+ },
210
+ observations,
211
+ findings,
212
+ },
213
+ ],
214
+ },
215
+ };
216
+ }
217
+
218
+ export const DEFAULT_OSCAL_PATH = `compliance/${OSCAL_FILE}`;
219
+
220
+ export const TerraformEmitOscalParams = type({
221
+ "output_path?": type.string.describe(
222
+ `where to write the OSCAL Assessment Results (default: ./${DEFAULT_OSCAL_PATH}). Commit it so the compliance/ path is the auditable, GRC-importable trail.`,
223
+ ),
224
+ "severity_threshold?": type(
225
+ "'critical' | 'high' | 'medium' | 'low' | 'info'",
226
+ ).describe(
227
+ "minimum severity to include (default: the run's configured threshold, else low).",
228
+ ),
229
+ });
230
+
231
+ export function TerraformEmitOscalTool(ctx: LocalToolContext) {
232
+ return tool({
233
+ name: "terraform_emit_oscal",
234
+ description:
235
+ "Emit the read-only assessment as strict NIST OSCAL 1.1.2 ASSESSMENT RESULTS JSON (default " +
236
+ `\`${DEFAULT_OSCAL_PATH}\`) — the same indicative crosswalk assessment as ` +
237
+ "`terraform_emit_evidence`, but in the format a GRC tool that imports OSCAL (compliance-trestle / C2P / " +
238
+ "Auditree) ingests directly. Every open concern becomes a `not-satisfied` finding against the control " +
239
+ "objective it touches, with its five-status verdict carried as a prop; UUIDs are deterministic so " +
240
+ "re-runs diff cleanly. It NEVER modifies Terraform or opens a PR, and is INDICATIVE (crosswalk-derived, " +
241
+ "no formal assessment plan) — never an audit verdict and never a satisfied it can't code-verify. Use " +
242
+ "this only when a buyer's GRC tooling actually consumes OSCAL; otherwise `terraform_emit_evidence` is lighter.",
243
+ parameters: TerraformEmitOscalParams,
244
+ execute: execute(async ({ output_path, severity_threshold }) => {
245
+ const configured = ctx.payload.severityThreshold as Severity | undefined;
246
+ const threshold: Severity = severity_threshold ?? configured ?? "low";
247
+ const { cwd, scorecard, crosswalk } = runAssessmentPipeline(
248
+ ctx,
249
+ threshold,
250
+ );
251
+
252
+ // SECURITY: confine the agent-supplied path to the workspace (same guard as
253
+ // terraform_emit_evidence / terraform_emit_sarif).
254
+ const target = resolveWithinCwd(cwd, output_path ?? DEFAULT_OSCAL_PATH);
255
+ const gh = githubContext();
256
+ const doc = buildOscalAssessmentResults({
257
+ scorecard,
258
+ crosswalk,
259
+ subject: {
260
+ scanned_dir: cwd,
261
+ repo: gh.repository,
262
+ ref: gh.refName,
263
+ commit: gh.sha,
264
+ },
265
+ generatedAt: new Date().toISOString(),
266
+ });
267
+ // the default compliance/ dir may not exist yet on a first run.
268
+ mkdirSync(dirname(target), { recursive: true });
269
+ writeFileSync(target, `${JSON.stringify(doc, null, 2)}\n`);
270
+ const result = doc["assessment-results"].results[0];
271
+ const findings = result?.findings.length ?? 0;
272
+ log.info(
273
+ `» terraform_emit_oscal: ${scorecard.posture} — ${findings} OSCAL finding(s) → ${target}`,
274
+ );
275
+ return toolOk({
276
+ output_path: target,
277
+ posture: scorecard.posture,
278
+ findings,
279
+ oscal_version: OSCAL_VERSION,
280
+ });
281
+ }),
282
+ });
283
+ }
@@ -0,0 +1,382 @@
1
+ import type { TransformEntry, TransformPack } from "#app/mcp/terraform/transformPacks";
2
+
3
+ /**
4
+ * azurerm 3.x → 4.0.
5
+ *
6
+ * Transcribed from HashiCorp's own v4.0 upgrade guide (cited below). Everything
7
+ * here is a documented upstream breaking change — nothing is inferred from the
8
+ * schema or guessed from a naming pattern, even where v4's renames are visibly
9
+ * systematic (`enable_x` → `x_enabled`). Guessing the rest of that family would
10
+ * be indistinguishable, to a reader, from the entries that were actually
11
+ * verified, and an entry nobody checked is exactly the kind of confident-wrong
12
+ * claim this product exists to refuse.
13
+ *
14
+ * ⚠️ NOT EXHAUSTIVE. v4 removed ~70 resources and changed arguments on well over
15
+ * a hundred. This pack carries the ones most likely to appear in real Terraform
16
+ * and, above all, the ones whose migration MOVES STATE — because those are the
17
+ * ones where getting it wrong destroys data rather than failing a build. For
18
+ * completeness, `terraform_validate`'s `unknown_arguments` reads the installed
19
+ * v4 schema and will name every argument this table missed.
20
+ */
21
+
22
+ const SOURCE =
23
+ "https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/4.0-upgrade-guide";
24
+
25
+ /** `azurerm_<old>` → `azurerm_<new>` where the whole resource TYPE changed.
26
+ *
27
+ * Every one of these is `manual_import`. A `moved {}` block cannot carry state
28
+ * between two different resource types — it moves an address, not a schema — so
29
+ * the only correct path is `terraform state rm` + `terraform import` against the
30
+ * new type. Ship this as a config edit alone and the apply destroys the live
31
+ * database and creates an empty one. */
32
+ const REMOVED_RESOURCES: [from: string, to: string | null][] = [
33
+ ["azurerm_sql_server", "azurerm_mssql_server"],
34
+ ["azurerm_sql_database", "azurerm_mssql_database"],
35
+ ["azurerm_sql_firewall_rule", "azurerm_mssql_firewall_rule"],
36
+ ["azurerm_sql_failover_group", "azurerm_mssql_failover_group"],
37
+ ["azurerm_sql_virtual_network_rule", "azurerm_mssql_virtual_network_rule"],
38
+ ["azurerm_sql_managed_instance", "azurerm_mssql_managed_instance"],
39
+ ["azurerm_sql_managed_database", "azurerm_mssql_managed_database"],
40
+ ["azurerm_mysql_server", "azurerm_mysql_flexible_server"],
41
+ ["azurerm_mysql_database", "azurerm_mysql_flexible_database"],
42
+ ["azurerm_mysql_configuration", "azurerm_mysql_flexible_server_configuration"],
43
+ ["azurerm_mysql_firewall_rule", "azurerm_mysql_flexible_server_firewall_rule"],
44
+ ["azurerm_mariadb_server", "azurerm_mysql_flexible_server"],
45
+ ["azurerm_mariadb_database", "azurerm_mysql_flexible_database"],
46
+ ["azurerm_mariadb_configuration", "azurerm_mysql_flexible_server_configuration"],
47
+ ["azurerm_mariadb_firewall_rule", "azurerm_mysql_flexible_server_firewall_rule"],
48
+ ["azurerm_template_deployment", "azurerm_resource_group_template_deployment"],
49
+ [
50
+ "azurerm_monitor_action_rule_action_group",
51
+ "azurerm_monitor_alert_processing_rule_action_group",
52
+ ],
53
+ ["azurerm_monitor_action_rule_suppression", "azurerm_monitor_alert_processing_rule_suppression"],
54
+ // Removed outright — the guide names no replacement resource, so neither do we.
55
+ ["azurerm_monitor_log_profile", null],
56
+ ];
57
+
58
+ /** Straight top-level argument renames: same meaning, same value, new name. */
59
+ const ARGUMENT_RENAMES: [resource: string, from: string, to: string][] = [
60
+ ["azurerm_storage_account", "enable_https_traffic_only", "https_traffic_only_enabled"],
61
+ ["azurerm_network_interface", "enable_accelerated_networking", "accelerated_networking_enabled"],
62
+ ["azurerm_network_interface", "enable_ip_forwarding", "ip_forwarding_enabled"],
63
+ ["azurerm_redis_cache", "enable_non_ssl_port", "non_ssl_port_enabled"],
64
+ ["azurerm_kubernetes_cluster", "automatic_channel_upgrade", "automatic_upgrade_channel"],
65
+ ["azurerm_kubernetes_cluster", "node_os_channel_upgrade", "node_os_upgrade_channel"],
66
+ ["azurerm_kubernetes_cluster_node_pool", "enable_auto_scaling", "auto_scaling_enabled"],
67
+ ["azurerm_kubernetes_cluster_node_pool", "enable_node_public_ip", "node_public_ip_enabled"],
68
+ ["azurerm_kubernetes_cluster_node_pool", "enable_host_encryption", "host_encryption_enabled"],
69
+ [
70
+ "azurerm_cosmosdb_account",
71
+ "enable_multiple_write_locations",
72
+ "multiple_write_locations_enabled",
73
+ ],
74
+ ["azurerm_cosmosdb_account", "enable_free_tier", "free_tier_enabled"],
75
+ ["azurerm_cosmosdb_account", "enable_automatic_failover", "automatic_failover_enabled"],
76
+ ["azurerm_servicebus_queue", "enable_batched_operations", "batched_operations_enabled"],
77
+ ["azurerm_servicebus_queue", "enable_express", "express_enabled"],
78
+ ["azurerm_servicebus_queue", "enable_partitioning", "partitioning_enabled"],
79
+ ["azurerm_servicebus_topic", "enable_batched_operations", "batched_operations_enabled"],
80
+ ["azurerm_servicebus_topic", "enable_express", "express_enabled"],
81
+ ["azurerm_servicebus_topic", "enable_partitioning", "partitioning_enabled"],
82
+ ["azurerm_servicebus_subscription", "enable_batched_operations", "batched_operations_enabled"],
83
+ ["azurerm_managed_application", "parameters", "parameter_values"],
84
+ ["azurerm_sentinel_automation_rule", "condition", "condition_json"],
85
+ [
86
+ "azurerm_machine_learning_workspace",
87
+ "public_access_behind_virtual_network_enabled",
88
+ "public_network_access_enabled",
89
+ ],
90
+ ];
91
+
92
+ /** Renames inside a nested block. The parser sees top-level argument names only,
93
+ * so these can never be `confirmed` — they are reported as leads to check by
94
+ * hand, which is why they are kept separate rather than mixed in above.
95
+ *
96
+ * ⚠️ Filing a nested argument as top-level makes the entry DEAD, not merely
97
+ * imprecise: the matcher tests membership of the depth-0 name list, which a
98
+ * nested argument never appears in. `network_interface.is_primary` was written
99
+ * as bare `is_primary` in the first cut and could never have fired. */
100
+ const NESTED_RENAMES: [resource: string, from: string, to: string][] = [
101
+ [
102
+ "azurerm_kubernetes_cluster",
103
+ "default_node_pool.enable_auto_scaling",
104
+ "default_node_pool.auto_scaling_enabled",
105
+ ],
106
+ [
107
+ "azurerm_kubernetes_cluster",
108
+ "default_node_pool.enable_node_public_ip",
109
+ "default_node_pool.node_public_ip_enabled",
110
+ ],
111
+ [
112
+ "azurerm_kubernetes_cluster",
113
+ "default_node_pool.enable_host_encryption",
114
+ "default_node_pool.host_encryption_enabled",
115
+ ],
116
+ [
117
+ "azurerm_redis_cache",
118
+ "redis_configuration.enable_authentication",
119
+ "redis_configuration.authentication_enabled",
120
+ ],
121
+ ];
122
+
123
+ /** Arguments removed from inside a nested block. Same depth-0 caveat as above. */
124
+ const NESTED_REMOVED: [resource: string, arg: string][] = [
125
+ ["azurerm_site_recovery_replicated_vm", "network_interface.is_primary"],
126
+ ];
127
+
128
+ /**
129
+ * Arguments deleted with no replacement — the fix is to remove the line.
130
+ *
131
+ * ⚠️ Everything here must be a genuine deletion. An argument that was removed
132
+ * *in favour of* another one belongs above as a rename with a `value_change`:
133
+ * telling someone to delete `soap_pass_through` rather than write
134
+ * `api_type = "soap"` silently converts their SOAP API to HTTP. Two entries in
135
+ * the first cut of this pack were misfiled that way.
136
+ *
137
+ * ⚠️ Nothing COMPUTED belongs here either. `azurerm_cosmosdb_account.connection_strings`
138
+ * was removed in v4, but it is a read-only attribute — it never appears as an
139
+ * argument in a `resource` block, so an entry for it can never match. It would
140
+ * have looked like coverage of a real breakage (`…account.x.connection_strings[0]`
141
+ * in an expression elsewhere) while detecting nothing.
142
+ */
143
+ const REMOVED_ARGUMENTS: [resource: string, arg: string][] = [
144
+ ["azurerm_kubernetes_cluster", "enable_pod_security_policy"],
145
+ ["azurerm_kubernetes_cluster", "custom_ca_trust_enabled"],
146
+ ["azurerm_kubernetes_cluster", "message_of_the_day"],
147
+ ["azurerm_kubernetes_cluster_node_pool", "custom_ca_trust_enabled"],
148
+ ["azurerm_kubernetes_cluster_node_pool", "message_of_the_day"],
149
+ ["azurerm_storage_share_directory", "storage_account_name"],
150
+ ["azurerm_storage_table_entity", "storage_account_name"],
151
+ ["azurerm_dev_test_lab", "storage_type"],
152
+ ["azurerm_machine_learning_compute_instance", "location"],
153
+ ];
154
+
155
+ /** Arguments that became REQUIRED in v4 — absent, `plan` fails. */
156
+ const NEWLY_REQUIRED: [resource: string, arg: string][] = [
157
+ ["azurerm_virtual_network_gateway_connection", "shared_key"],
158
+ ["azurerm_dashboard_grafana", "grafana_major_version"],
159
+ ["azurerm_monitor_activity_log_alert", "location"],
160
+ ];
161
+
162
+ function entry(e: TransformEntry): TransformEntry {
163
+ return e;
164
+ }
165
+
166
+ const ENTRIES: TransformEntry[] = [
167
+ // ── provider block ──────────────────────────────────────────────────────
168
+ entry({
169
+ id: "azurerm.3-4.provider-subscription-id",
170
+ kind: "provider_setting",
171
+ resource_type: null,
172
+ from: "(implicit subscription)",
173
+ to: "subscription_id",
174
+ state_move: "auto",
175
+ forces_replacement: false,
176
+ note: "v4 requires `subscription_id` in the provider block (or ARM_SUBSCRIPTION_ID in the environment). Prefer the environment variable in CI so a subscription id is not committed.",
177
+ }),
178
+ entry({
179
+ id: "azurerm.3-4.provider-registrations",
180
+ kind: "provider_setting",
181
+ resource_type: null,
182
+ from: "skip_provider_registration",
183
+ to: "resource_provider_registrations",
184
+ state_move: "auto",
185
+ forces_replacement: false,
186
+ value_change:
187
+ 'not a boolean any more — it takes a MODE: `core`, `extended`, `all`, `none` or `legacy`. `skip_provider_registration = true` becomes `resource_provider_registrations = "none"`.',
188
+ note: "Replace the boolean with the equivalent registration mode; `resource_providers_to_register` can name extra RPs alongside it.",
189
+ }),
190
+
191
+ // ── whole-resource replacements (state must be moved by hand) ───────────
192
+ ...REMOVED_RESOURCES.map(([from, to]) =>
193
+ entry({
194
+ id: `azurerm.3-4.resource.${from}`,
195
+ kind: to ? "resource_renamed" : "resource_removed",
196
+ resource_type: from,
197
+ from,
198
+ to,
199
+ state_move: "manual_import",
200
+ forces_replacement: true,
201
+ note: to
202
+ ? `\`${from}\` was removed in v4. Migrate to \`${to}\`: the schemas differ, so this is \`terraform state rm\` + \`terraform import\`, NOT a rename and NOT a \`moved {}\` block.`
203
+ : `\`${from}\` was removed in v4 with no replacement resource. The configuration has to be deleted and the capability re-provisioned another way.`,
204
+ }),
205
+ ),
206
+
207
+ // ── argument renames ────────────────────────────────────────────────────
208
+ ...ARGUMENT_RENAMES.map(([resource, from, to]) =>
209
+ entry({
210
+ id: `azurerm.3-4.arg.${resource}.${from}`,
211
+ kind: "argument_renamed",
212
+ resource_type: resource,
213
+ from,
214
+ to,
215
+ state_move: "auto",
216
+ forces_replacement: false,
217
+ note: `Renamed in v4: \`${from}\` → \`${to}\`. Same meaning and same value — a plan after the edit should show no change.`,
218
+ }),
219
+ ),
220
+ ...NESTED_RENAMES.map(([resource, from, to]) =>
221
+ entry({
222
+ id: `azurerm.3-4.arg.${resource}.${from}`,
223
+ kind: "argument_renamed",
224
+ resource_type: resource,
225
+ from,
226
+ to,
227
+ state_move: "auto",
228
+ forces_replacement: false,
229
+ note: `Renamed in v4, INSIDE a nested block: \`${from}\` → \`${to}\`. Open the block and check — the scanner only sees top-level argument names, so it cannot confirm this one for you.`,
230
+ }),
231
+ ),
232
+
233
+ // ── the ones that are NOT pure renames ──────────────────────────────────
234
+ entry({
235
+ id: "azurerm.3-4.arg.azurerm_route_table.disable_bgp_route_propagation",
236
+ kind: "argument_renamed",
237
+ resource_type: "azurerm_route_table",
238
+ from: "disable_bgp_route_propagation",
239
+ to: "bgp_route_propagation_enabled",
240
+ state_move: "auto",
241
+ forces_replacement: false,
242
+ value_change:
243
+ "⚠️ THE BOOLEAN IS INVERTED. `disable_bgp_route_propagation = true` becomes `bgp_route_propagation_enabled = false`. Copying the value across silently reverses route propagation on a live network, and nothing — validate, plan shape, or any scanner — will flag it.",
244
+ note: "Rename AND negate. Treat every occurrence as a value change, not a rename.",
245
+ }),
246
+ // ⚠️ THE SUBNET FAMILY. Both of these read as boring boolean renames and are
247
+ // neither. v3's `enforce_*` pair used INVERTED polarity (`true` = *disable*
248
+ // the policy); v4's replacements are positive, and one of them is a string.
249
+ // Carrying the value across breaks Private Link on a live subnet with a green
250
+ // validate, a green plan shape and no scanner finding — the same trap as the
251
+ // route-table entry below, which the first cut of this pack caught while
252
+ // missing these two.
253
+ entry({
254
+ id: "azurerm.3-4.arg.azurerm_subnet.enforce_private_link_service_network_policies",
255
+ kind: "argument_renamed",
256
+ resource_type: "azurerm_subnet",
257
+ from: "enforce_private_link_service_network_policies",
258
+ to: "private_link_service_network_policies_enabled",
259
+ state_move: "auto",
260
+ forces_replacement: false,
261
+ value_change:
262
+ "⚠️ THE BOOLEAN IS INVERTED. In v3, `enforce_… = true` DISABLED the policy; in v4, `private_link_service_network_policies_enabled = true` ENABLES it. `true` must become `false` and vice versa. A subnet hosting a Private Link Service needs the policy disabled — copy the value across unchanged and you enable it, and the service stops working.",
263
+ note: "Rename AND negate. Note the defaults also flipped (v3 `false`, v4 `true`), so an omitted argument does not mean the same thing either.",
264
+ }),
265
+ entry({
266
+ id: "azurerm.3-4.arg.azurerm_subnet.enforce_private_link_endpoint_network_policies",
267
+ kind: "argument_renamed",
268
+ resource_type: "azurerm_subnet",
269
+ from: "enforce_private_link_endpoint_network_policies",
270
+ to: "private_endpoint_network_policies",
271
+ state_move: "auto",
272
+ forces_replacement: false,
273
+ value_change:
274
+ '⚠️ NOT A DELETION AND NOT A BOOLEAN. It becomes a STRING: `"Enabled"` / `"Disabled"`. v3\'s inverted polarity applies, so `enforce_… = false` (policies enforced) becomes `private_endpoint_network_policies = "Enabled"`, and `= true` becomes `"Disabled"`. ⚠️ v4 DEFAULTS this to `"Disabled"` — simply dropping the line silently stops NSGs and route tables applying to every private endpoint in that subnet.',
275
+ note: "Removed in favour of `private_endpoint_network_policies`. Always write the replacement explicitly; never delete the line and rely on the default.",
276
+ }),
277
+ entry({
278
+ id: "azurerm.3-4.arg.azurerm_api_management_api.soap_pass_through",
279
+ kind: "argument_renamed",
280
+ resource_type: "azurerm_api_management_api",
281
+ from: "soap_pass_through",
282
+ to: "api_type",
283
+ state_move: "auto",
284
+ forces_replacement: false,
285
+ value_change:
286
+ '`soap_pass_through = true` becomes `api_type = "soap"`; `false` becomes `api_type = "http"` (also v4\'s default). Deleting the line instead converts a SOAP-fronted API to HTTP.',
287
+ note: "Removed in favour of the `api_type` property — a replacement, not a deletion.",
288
+ }),
289
+ entry({
290
+ id: "azurerm.3-4.arg.azurerm_cosmosdb_sql_container.partition_key_path",
291
+ kind: "argument_renamed",
292
+ resource_type: "azurerm_cosmosdb_sql_container",
293
+ from: "partition_key_path",
294
+ to: "partition_key_paths",
295
+ state_move: "auto",
296
+ forces_replacement: true,
297
+ value_change: 'the type changed from a string to a list — wrap the existing value: `["/id"]`.',
298
+ note: "Changing a container's partition key forces replacement of the container, which loses its data. Confirm the plan before shipping.",
299
+ }),
300
+ entry({
301
+ id: "azurerm.3-4.arg.azurerm_container_group.network_profile_id",
302
+ kind: "argument_renamed",
303
+ resource_type: "azurerm_container_group",
304
+ from: "network_profile_id",
305
+ to: "subnet_ids",
306
+ state_move: "auto",
307
+ forces_replacement: true,
308
+ value_change:
309
+ "a network-profile id is not a subnet id — supply the subnet id(s) the profile referenced.",
310
+ note: "Network profiles were retired; the container group now takes subnet ids directly.",
311
+ }),
312
+ entry({
313
+ id: "azurerm.3-4.arg.azurerm_storage_share_directory.share_name",
314
+ kind: "argument_renamed",
315
+ resource_type: "azurerm_storage_share_directory",
316
+ from: "share_name",
317
+ to: "storage_share_id",
318
+ state_move: "auto",
319
+ forces_replacement: true,
320
+ value_change: "a name is not an id — reference the share resource's `id` attribute.",
321
+ note: "Also drop `storage_account_name`; the share id carries it.",
322
+ }),
323
+ entry({
324
+ id: "azurerm.3-4.arg.azurerm_storage_table_entity.table_name",
325
+ kind: "argument_renamed",
326
+ resource_type: "azurerm_storage_table_entity",
327
+ from: "table_name",
328
+ to: "storage_table_id",
329
+ state_move: "auto",
330
+ forces_replacement: true,
331
+ value_change: "a name is not an id — reference the table resource's `id` attribute.",
332
+ note: "Also drop `storage_account_name`; the table id carries it.",
333
+ }),
334
+
335
+ // ── deletions and new requirements ──────────────────────────────────────
336
+ ...REMOVED_ARGUMENTS.map(([resource, arg]) =>
337
+ entry({
338
+ id: `azurerm.3-4.removed.${resource}.${arg}`,
339
+ kind: "argument_removed",
340
+ resource_type: resource,
341
+ from: arg,
342
+ to: null,
343
+ state_move: "auto",
344
+ forces_replacement: false,
345
+ note: `\`${arg}\` was removed from \`${resource}\` in v4 — delete the line.`,
346
+ }),
347
+ ),
348
+ ...NESTED_REMOVED.map(([resource, arg]) =>
349
+ entry({
350
+ id: `azurerm.3-4.removed.${resource}.${arg}`,
351
+ kind: "argument_removed",
352
+ resource_type: resource,
353
+ from: arg,
354
+ to: null,
355
+ state_move: "auto",
356
+ forces_replacement: false,
357
+ note: `\`${arg}\` was removed from \`${resource}\` in v4 — delete the line. It lives INSIDE a nested block, so the scanner cannot confirm it for you; open the block and check.`,
358
+ }),
359
+ ),
360
+ ...NEWLY_REQUIRED.map(([resource, arg]) =>
361
+ entry({
362
+ id: `azurerm.3-4.required.${resource}.${arg}`,
363
+ kind: "argument_required",
364
+ resource_type: resource,
365
+ from: arg,
366
+ to: arg,
367
+ state_move: "auto",
368
+ forces_replacement: false,
369
+ note: `\`${arg}\` is REQUIRED on \`${resource}\` in v4. Add it before planning, or the plan fails.`,
370
+ }),
371
+ ),
372
+ ];
373
+
374
+ export const AZURERM_3_TO_4: TransformPack = {
375
+ provider: "azurerm",
376
+ from_major: 3,
377
+ to_major: 4,
378
+ version: "2026.07",
379
+ source: SOURCE,
380
+ exhaustive: false,
381
+ entries: ENTRIES,
382
+ };