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,379 @@
1
+ ---
2
+ name: terraform-best-practices
3
+ description: Fix Terraform to best practice from a scanner concern — the minimal, correct change for a trivy/checkov/tflint/fmt/validate finding, plus the security, structure, and naming conventions a good fix must follow. Use when remediating Terraform, applying a `terraform_scan` concern, or generating new HCL that must start compliant.
4
+ ---
5
+
6
+ # Terraform best-practice remediation
7
+
8
+ You are fixing Terraform against a **concern** emitted by `terraform_scan` (or
9
+ `terraform_validate`). Each concern names the producing `source`, a `rule_id`,
10
+ the `location` (file + line), an `evidence` string (what's wrong), and often a
11
+ `remediation_hint`. Your job is the **smallest correct change** that clears that
12
+ concern — nothing more.
13
+
14
+ ## The remediation loop
15
+
16
+ 1. **Read the concern.** The `rule_id` tells you the class of problem; the
17
+ `evidence` tells you the specifics; `location.file:line` tells you where.
18
+ 2. **Open the file and understand the surrounding resource** before editing.
19
+ Don't fix a line in isolation — know which `resource` / `module` / `variable`
20
+ block it belongs to.
21
+ 3. **Apply the minimal fix** (see the catalogue below). Touch only `*.tf` /
22
+ `*.tfvars`. Do not reformat, reorder, or "improve" unrelated code — that
23
+ buries the real fix and breaks the one-concern-per-PR contract.
24
+ 4. **Re-validate** with `terraform_validate`. If it doesn't pass, your fix is
25
+ incomplete or introduced a new problem — fix that before opening a PR.
26
+ 5. **Confirm the concern cleared** by re-running `terraform_scan` on the branch.
27
+ The concern's `id` must be gone. If it isn't, say so honestly.
28
+
29
+ ## What a good fix looks like, by source
30
+
31
+ - **`terraform-fmt:unformatted`** — run `terraform fmt` on the named file. This
32
+ is whitespace/alignment only; never combine it with a behavioural change in
33
+ the same PR.
34
+ - **`tflint:*`** — idiomatic-HCL and provider-rule issues. Common fixes: remove
35
+ unused `variable`/`local`/`data` declarations; pin deprecated syntax forward;
36
+ add missing required provider/version constraints. Follow the rule's link.
37
+ - **`trivy:*` / `checkov:*`** — security misconfiguration. These are the
38
+ high-value fixes. Apply the **secure default**, e.g.:
39
+ - **encryption at rest** — add the `server_side_encryption_configuration` /
40
+ `encryption` block (S3, RDS, EBS, etc.); prefer a CMK where the rule asks.
41
+ - **no public access** — set `block_public_acls`/`block_public_policy` etc. to
42
+ `true`; remove `acl = "public-read"`; tighten `0.0.0.0/0` ingress to the
43
+ real CIDR or a referenced security group.
44
+ - **least privilege** — replace `"*"` actions/resources in IAM policies with
45
+ the specific actions/ARNs actually needed.
46
+ - **logging / versioning** — add the access-logging, audit, or versioning
47
+ block the rule requires.
48
+ - **`terraform-validate:*`** — a correctness error (bad reference, type
49
+ mismatch, missing required argument). Fix the actual HCL so `terraform
50
+ validate` passes.
51
+
52
+ ## Secure-default catalogue (by problem class)
53
+
54
+ Copy-pasteable shapes for the highest-frequency security concerns. These target
55
+ the **AWS provider v5+** layout (encryption / versioning / ACL / public-access
56
+ are standalone resources, not inline `aws_s3_bucket` blocks). Adapt resource and
57
+ attribute names to the block the concern points at — don't paste blindly.
58
+
59
+ ### Encryption at rest
60
+
61
+ S3 — server-side encryption with a customer-managed key (preferred over `AES256`
62
+ when the rule asks for a CMK):
63
+
64
+ ```hcl
65
+ resource "aws_s3_bucket_server_side_encryption_configuration" "this" {
66
+ bucket = aws_s3_bucket.this.id
67
+ rule {
68
+ apply_server_side_encryption_by_default {
69
+ sse_algorithm = "aws:kms"
70
+ kms_master_key_id = aws_kms_key.this.arn
71
+ }
72
+ bucket_key_enabled = true
73
+ }
74
+ }
75
+ ```
76
+
77
+ EBS volume / root device: `encrypted = true` (add `kms_key_id` when a CMK is
78
+ required). RDS: `storage_encrypted = true` (+ `kms_key_id`). When `aws:kms` needs
79
+ a key and none exists, reference an existing `aws_kms_key`/`var.*`; only add a new
80
+ `aws_kms_key` resource if the stack genuinely has none — keep `AES256` if the rule
81
+ is satisfied by SSE-S3 alone.
82
+
83
+ ### Block public access
84
+
85
+ S3 — the four-flag public-access block is the canonical fix; wire it to the same
86
+ bucket:
87
+
88
+ ```hcl
89
+ resource "aws_s3_bucket_public_access_block" "this" {
90
+ bucket = aws_s3_bucket.this.id
91
+ block_public_acls = true
92
+ block_public_policy = true
93
+ ignore_public_acls = true
94
+ restrict_public_buckets = true
95
+ }
96
+ ```
97
+
98
+ Also remove any `acl = "public-read"` (move to a private `aws_s3_bucket_acl` if an
99
+ ACL is needed at all).
100
+
101
+ ### Network ingress
102
+
103
+ Replace world-open ingress with the real source. Never leave `0.0.0.0/0` on admin
104
+ ports (22/3389/database ports):
105
+
106
+ ```hcl
107
+ ingress {
108
+ from_port = 443
109
+ to_port = 443
110
+ protocol = "tcp"
111
+ cidr_blocks = [var.allowed_cidr] # or: security_groups = [aws_security_group.lb.id]
112
+ }
113
+ ```
114
+
115
+ ### IAM least privilege
116
+
117
+ Replace wildcard `Action`/`Resource` with the specific actions and ARNs the
118
+ workload actually uses. If you can't determine the exact set from the surrounding
119
+ code, this is a human decision — report it rather than guessing a narrow policy
120
+ that breaks the stack.
121
+
122
+ ### Versioning & logging
123
+
124
+ S3 versioning and access logging as standalone resources:
125
+
126
+ ```hcl
127
+ resource "aws_s3_bucket_versioning" "this" {
128
+ bucket = aws_s3_bucket.this.id
129
+ versioning_configuration { status = "Enabled" }
130
+ }
131
+ ```
132
+
133
+ ### EC2 instance metadata (IMDSv2)
134
+
135
+ Require token-backed metadata to close the SSRF→credential path:
136
+
137
+ ```hcl
138
+ metadata_options {
139
+ http_endpoint = "enabled"
140
+ http_tokens = "required"
141
+ }
142
+ ```
143
+
144
+ ### Deprecations & style
145
+
146
+ - **Provider v4→v5 S3 split** — inline `server_side_encryption_configuration` /
147
+ `versioning` / `acl` / `logging` blocks on `aws_s3_bucket` are deprecated; move
148
+ each to its standalone resource (above). Don't bump the provider major version
149
+ as a side effect of a remediation — if a fix genuinely requires a newer
150
+ provider, report that as a blocker.
151
+ - **`terraform-fmt:unformatted`** — run `terraform fmt` on the named file only;
152
+ never fold a formatting pass into a behavioural fix.
153
+
154
+ ## Don't over-reach
155
+
156
+ - **Smallest change that clears the concern.** Add the missing block; don't
157
+ refactor the resource, rename it, or restructure the file around it.
158
+ - **Don't add speculative hardening** the concern didn't ask for (extra KMS keys,
159
+ new modules, blanket tagging) — that's scope creep and buries the real fix.
160
+ - **Don't widen or bump version pins** to reach a resource or attribute.
161
+ - **One concern's blast radius only.** If the secure default would break the
162
+ stack or needs a human call (a real CIDR, an IAM action set, a CMK policy),
163
+ stop and report it instead of opening a broken or guessed PR.
164
+
165
+ ## Conventions every fix must honour
166
+
167
+ - **Variables over hardcoded values.** Don't bake an account id, region, CIDR,
168
+ or ARN into a fix — reference an existing `var.*`/`local.*`, or add a typed
169
+ `variable` with a sensible `default` and `description` when one is genuinely
170
+ needed.
171
+ - **Pin versions.** When adding a provider or module, include a version
172
+ constraint. Never widen an existing pin as a side effect.
173
+ - **Approved modules first.** Call `list_modules` — if a catalogue is configured,
174
+ prefer the catalogue module (a registry module or a local/house module) + its
175
+ exact variable names over inlining a raw resource, and pin its `version`. See
176
+ _Using Terraform modules_ below.
177
+ - **No secrets in HCL or state.** Never introduce a literal credential. If the
178
+ fix needs a secret, reference a variable or a secrets data source.
179
+ - **Idempotent, reviewable diffs.** The diff should read so a senior engineer
180
+ approves it without hesitation: one concern, one rationale, no churn.
181
+
182
+ ## Gold standards (the bar every fix is measured against)
183
+
184
+ These are the non-negotiable defaults a "good" Terraform change embodies. A fix
185
+ should never _move away_ from any of these, and should move _toward_ them when
186
+ the concern is adjacent:
187
+
188
+ - **Encrypt everything, at rest and in transit.** Storage encrypted (CMK where
189
+ the data is sensitive); TLS-only endpoints; no plaintext in state.
190
+ - **Private by default.** No `0.0.0.0/0` to admin/database ports; public access
191
+ blocked unless the resource's whole purpose is to be public (and then scoped).
192
+ - **Least privilege.** No `"*"` IAM actions/resources; scope to what the workload
193
+ uses. Prefer a referenced role/policy over an inline wildcard.
194
+ - **Pinned + reproducible.** `required_version` and every `required_providers` /
195
+ module `version` constrained (`~>`); no floating `latest`.
196
+ - **Parameterised, not hardcoded** (see below).
197
+ - **Tagged + named consistently.** Match the repo's existing tag keys and naming
198
+ scheme; don't invent a new convention.
199
+ - **Observable.** Logging / versioning / audit trails enabled where the provider
200
+ supports them and the concern is about data durability or traceability.
201
+ - **Idempotent + deterministic.** No `timestamp()`/`uuid()`/unkeyed `random_*`
202
+ driving a value that lands in state — it produces a perpetual diff.
203
+
204
+ When in doubt, the secure/idiomatic default from the catalogue above IS the gold
205
+ standard. Don't gold-plate beyond the concern, but never regress one of these.
206
+
207
+ ## Parameterize, don't hardcode
208
+
209
+ A value that varies by environment, account, or deployment must be a `variable`
210
+ or `local`, never a literal baked into a resource:
211
+
212
+ - **Reuse first.** If the repo already exposes `var.region` / `local.tags` /
213
+ `var.vpc_cidr`, reference it — don't introduce a parallel one.
214
+ - **Introduce a typed variable** when none fits: give it a `type`, a
215
+ `description`, and a safe `default` only when a default is genuinely sane
216
+ (secrets and account-specific ids get NO default). Match the repo's existing
217
+ file layout — add to `variables.tf` if the repo separates them, otherwise keep
218
+ it next to the resource as the repo does.
219
+ - **Derive with `locals`.** Computed/repeated values (a name prefix, a merged tag
220
+ map) belong in `locals`, referenced everywhere — not copy-pasted.
221
+ - **Never inline a secret, account id, ARN, or CIDR.** A "fix" that pastes a
222
+ literal credential is itself a finding (and the secret-scan guardrail will
223
+ block the push). Reference a variable or a secrets data source.
224
+
225
+ ## Using Terraform modules (registry, private git libraries, your own)
226
+
227
+ Prefer a well-formed module over a pile of raw resources when one cleanly fits —
228
+ it carries the secure defaults for you. **Always call `list_modules` first**; it
229
+ returns three things: the operator's `module_catalogue`, the
230
+ `discovered_house_modules` (local modules already used in THIS repo), and a note.
231
+
232
+ Four source kinds you'll encounter, each pinned differently:
233
+
234
+ - **Public registry module** — `terraform-aws-modules/vpc/aws`. Pin with a
235
+ `version = "~> 5.0"` argument. The big public collections
236
+ ([terraform-aws-modules](https://registry.terraform.io/namespaces/terraform-aws-modules):
237
+ `vpc`, `s3-bucket`, `rds`, `eks`, …) are the default when nothing is configured.
238
+ A registry submodule is `…/aws//modules/log-group`.
239
+ - **Private registry module** — a host-prefixed address like
240
+ `app.terraform.io/acme/networking/aws` (HCP Terraform / Terraform Enterprise / an
241
+ org registry). Pin with a `version` argument, exactly like a public registry
242
+ module. `terraform_module_lookup` reads its real interface when the run supplies a
243
+ `registry_token` (+ `registry_host`) — the token is only ever sent to the
244
+ allow-listed host. (There is no private `search`; look these up by exact address.)
245
+ - **Private git module library** — e.g.
246
+ `git::https://github.com/acme/tf-modules.git//aws/s3?ref=s3-v0.1.2`. The
247
+ `//aws/s3` selects the module within the repo and **`?ref=s3-v0.1.2` IS the
248
+ version pin** (git modules have no `version` argument). Keep the exact `ref`;
249
+ never float it. Many orgs (e.g. UKHSA's `data-integration-terraform-modules`)
250
+ ship a whole library this way, tagged per-module.
251
+ - **House module** — one of the repo's own `modules/<name>` dirs. `list_modules`
252
+ surfaces these under `discovered_house_modules` with their caller files — reuse
253
+ the existing one with its **real variable names** (read its `variables.tf`)
254
+ rather than re-implementing it.
255
+
256
+ Rules: use the module's **exact variable names**, set the secure-relevant inputs
257
+ the concern is about, and keep the version **pinned**. Don't introduce a module
258
+ mid-remediation just to "improve" things — using a module is right when
259
+ _generating_ new infra or when the fix is genuinely a module swap; for a one-line
260
+ security fix on an existing raw resource, fix the resource in place.
261
+
262
+ Prefer authoritative registry knowledge over recalling it from memory — it moves
263
+ faster than any training data, and a fix written against a remembered-but-renamed
264
+ argument breaks `plan`. Built in and always on: `terraform_module_lookup` reads a
265
+ published module's real inputs/outputs + resolved version, `terraform_module_search`
266
+ finds published modules to reuse (pass your org's namespace to surface your own),
267
+ `terraform_version_currency` reports versions, and `terraform_provider_schema` gives
268
+ the installed provider's arguments. When the **`terraform` MCP server** is registered
269
+ (the `terraform_mcp` input), it adds the deeper provider/resource documentation
270
+ surface on top — prefer it for provider argument shapes.
271
+
272
+ ### Authoring a reusable module (standard layout)
273
+
274
+ When you GENERATE a reusable module, follow the conventional layout real module
275
+ libraries use so it's drop-in familiar:
276
+
277
+ - `main.tf` (resources), `variables.tf` (every input typed, with a `description`
278
+ and a `validation` block where it helps), `outputs.tf`, `versions.tf` /
279
+ `providers.tf` (`required_version` + `required_providers` pinned), `README.md`
280
+ (usage + inputs/outputs), and a `CHANGELOG.md` if the repo versions modules.
281
+ - Do **not** generate `examples/` fixtures. Document usage in the module's
282
+ `README.md` instead; test coverage comes from the opt-in terratest scaffold
283
+ (see below), which plans the module directly.
284
+
285
+ ### Module-source-aware fixes
286
+
287
+ Before fixing a concern, call `terraform_module_graph` to see where the file
288
+ lives in the module call-graph:
289
+
290
+ - **Concern inside a LOCAL module dir** (listed in `local_module_dirs`): fix it
291
+ **once at the module source**. The fix propagates to every caller — do not
292
+ patch each call site. Note the callers in the PR body so a reviewer sees the
293
+ blast radius.
294
+ - **Concern that would require editing a REGISTRY / git / remote module**: that
295
+ source lives outside this repo — you **cannot** fix it here. Do **not** vendor
296
+ the module or fork it inline. Instead report it (open an issue / PR comment)
297
+ naming the upstream module + version and the concern, so a human routes it.
298
+
299
+ ### Modularization as remediation (M2)
300
+
301
+ `module_extraction_candidates` finds clusters of raw resources that should be a
302
+ module call, each matched against the repo's house modules (real resource-type
303
+ signature + `required_variables`) and the operator's `module_catalogue`. Turn a
304
+ candidate into a refactor PR under this contract:
305
+
306
+ - **One PR per cluster**, branch `remediate/modularize-<cluster file/prefix>` —
307
+ never mix two clusters or a behavioural fix into a modularization PR.
308
+ - Replace the cluster's raw resources with ONE `module` block calling the
309
+ candidate (pin the version for registry sources; wire the module's REAL
310
+ variable names from `required_variables` / `terraform_module_interface` for a
311
+ local module, or `terraform_module_lookup` for a registry-sourced one).
312
+ - **Preserve state with `moved {}` blocks** — one per resource, mapping the old
313
+ address to its new `module.<name>.` address:
314
+
315
+ ```hcl
316
+ moved {
317
+ from = aws_s3_bucket.logs
318
+ to = module.logging.aws_s3_bucket.this
319
+ }
320
+ ```
321
+
322
+ - **The gate:** the PR may proceed only when `terraform_validate` passes AND
323
+ `terraform_plan` reports `refactor_safe: true` (a pure-move plan — zero
324
+ add/change/destroy). Anything else means a moved block is wrong or the module
325
+ diverges from the raw resources — fix that or report it; never accept
326
+ resource churn as "the refactor".
327
+ - A required variable you can't derive from the existing attributes is a
328
+ **PR question for the reviewer**, never a guessed value.
329
+
330
+ ### Version currency (provider + module upgrades)
331
+
332
+ `terraform_version_currency` reports which pinned providers and registry modules
333
+ trail the registry's latest stable version, and which registry modules are
334
+ unpinned. Turn its rows into upgrade PRs under this contract:
335
+
336
+ - **One `chore(deps)` PR per upgrade group** — never mix a version bump with a
337
+ behavioural fix; a bump PR must read as "only the constraint changed".
338
+ - **Minor/patch bumps** (`outdated` with `majors_behind: 0`) may proceed
339
+ autonomously: update the `version` constraint to admit `newest_satisfying` →
340
+ `latest`, then prove it with `terraform_validate` (and `terraform_plan` when
341
+ credentials exist).
342
+ - **Major bumps** (`majors_behind > 0`) mean the provider/module interface may
343
+ have changed — apply only with the `needs-human` label, and consult
344
+ `terraform_module_interface` / `terraform_provider_schema` for what moved.
345
+ - **Unpinned registry modules**: pin to the reported `latest` (`version = "~> X.Y"`),
346
+ one PR for all unpinned modules in a file group — pinning is low-risk and sweeps well.
347
+ - An upgrade whose `terraform_plan` shows **destructive changes is never auto** —
348
+ escalate with the plan excerpt in the PR body.
349
+
350
+ ## Tests for modules
351
+
352
+ Infraweaver does **not** create or edit `examples/` fixtures — leave any the repo
353
+ already ships untouched. Module test coverage is **opt-in** via the `terratest`
354
+ input:
355
+
356
+ - **Terratest (opt-in).** When the `terratest` input is enabled, call
357
+ `scaffold_terratest` (module name + dir) to generate a plan-only Go
358
+ [Terratest](https://terratest.gruntwork.io/) smoke test (`test/<name>_test.go`)
359
+ **and** a Terraform-native `*.tftest.hcl` in the module's own `tests/` dir.
360
+ Both plan the **module directly** (no example fixture). Write the returned files
361
+ (the input also widens `allowed_paths` to permit them). If the repo already has
362
+ a Terratest suite, update its options/assertions to match the new interface
363
+ instead.
364
+
365
+ In all cases: Infraweaver **never runs** the tests — it holds no cloud credentials,
366
+ and Terratest needs Go + a real `apply`. It keeps the test source consistent with
367
+ the module and flags in the PR that the suite should be run in the user's
368
+ pipeline. **Never weaken an assertion or delete a test to go green.**
369
+
370
+ ## Hard rules
371
+
372
+ - Only modify `*.tf` / `*.tfvars` (and, when `allowed_paths` permits — i.e. the
373
+ `terratest` input is on — that module's test files). Never touch CI, application
374
+ code, or unrelated config in a remediation PR.
375
+ - One concern per PR. If you notice other issues, leave them for their own runs.
376
+ - Never auto-merge. The PR is for a human to review.
377
+ - If you cannot fix a concern cleanly (it needs a human decision, or the secure
378
+ default would break the stack), do **not** open a broken PR — report it
379
+ instead with what's blocking.
@@ -0,0 +1,241 @@
1
+ import { DispatchRecorder } from "#app/agents/dispatchMetrics";
2
+ import type { AgentUsage } from "#app/agents/shared";
3
+ import { type ScanSession, createScanSession } from "#app/mcp/terraform/scanSession";
4
+ import type { PrepResult } from "#app/prep/types";
5
+ import type { AgentDiagnostic } from "#app/utils/agentHangReport";
6
+ import { log } from "#app/utils/cli";
7
+ import type { DiffCoverageState } from "#app/utils/diffCoverage";
8
+ import {
9
+ type ProgressComment,
10
+ type ProgressCommentType,
11
+ parseProgressComment,
12
+ } from "#app/utils/progressComment";
13
+ import type { UserFacingLanguage } from "#app/utils/payload";
14
+ import type { TodoTracker } from "#app/utils/todoTracking";
15
+
16
+ export type BackgroundProcess = {
17
+ pid: number;
18
+ outputPath: string;
19
+ pidPath: string;
20
+ };
21
+
22
+ export type StoredPushDest = {
23
+ remoteName: string;
24
+ remoteBranch: string;
25
+ localBranch: string;
26
+ };
27
+
28
+ /**
29
+ * Valid inline-comment anchor lines per side at a particular checkout SHA.
30
+ * Lives here (not in `mcp/review.ts`) so `ToolState` — which caches
31
+ * `Map<path, CommentableLines>` per checkout — does not pull the MCP server
32
+ * graph into every consumer of run state (the action's main loop, agent
33
+ * harnesses, cf-worker indexing).
34
+ */
35
+ export type CommentableLines = { RIGHT: Set<number>; LEFT: Set<number> };
36
+
37
+ /**
38
+ * mutable per-run record of facts that occurred during execution. shared
39
+ * between the action process and the MCP server (one process — toolState is
40
+ * just a JS object passed by reference into both surfaces).
41
+ *
42
+ * design rule: ToolState is LITERAL. each field records a thing that
43
+ * happened — `review` is set when `create_pull_request_review` succeeded,
44
+ * `finalSummaryWritten` flips when `report_progress` wrote a non-plan body,
45
+ * `selectedMode` is set when `select_mode` was called. fields should never
46
+ * encode the absence of an event ("unsubmittedReview", "missingArtifact"),
47
+ * speculative state, or values derived from other fields.
48
+ *
49
+ * any predicate the rest of the code needs ("the agent picked review mode but
50
+ * never produced a review or progress write") is computed inline at the call
51
+ * site, not stored. derived state in this struct invariably drifts from the
52
+ * literal fields under refactors and is the wrong layer for the check.
53
+ *
54
+ * write narrowly: prefer adding state inside the tool that mutates it (e.g.
55
+ * `create_pull_request_review` populates `toolState.review`) and reading
56
+ * narrowly elsewhere. don't introduce flags from main.ts that mirror what an
57
+ * MCP tool already records.
58
+ */
59
+ export interface ToolState {
60
+ // where we're allowed to push - base repo initially, fork URL for fork PRs
61
+ // set by setupGit, updated by checkout_pr. always set before push validation.
62
+ pushUrl?: string;
63
+ // push destination set by checkout_pr - used as primary source in push_branch
64
+ // because git config reads can fail in certain environments
65
+ pushDest?: StoredPushDest;
66
+ // HEAD identity captured by setupGit at run start. load-bearing for the
67
+ // checkout_pr initial-branch invariant: the only sanctioned HEAD positions
68
+ // when calling checkout_pr are the run-entry HEAD or the target `pr-N`.
69
+ // blocks the zed-style cross-PR clobber where a subagent left HEAD on
70
+ // someone else's `pr-X` and the orchestrator's next checkout_pr inherited
71
+ // that position.
72
+ //
73
+ // discriminated by `kind` because `git rev-parse --abbrev-ref HEAD` returns
74
+ // the literal sentinel string `"HEAD"` on detached entry, which is the
75
+ // default state from `actions/checkout` on `pull_request` events (it
76
+ // checks out the merge commit as a detached SHA). without the kind tag,
77
+ // detached-entry runs would trivially accept any future detached state.
78
+ initialHead?: { kind: "branch"; name: string } | { kind: "detached"; sha: string };
79
+ // issue or PR number (same number space in GitHub)
80
+ issueNumber?: number;
81
+ // PR/issue numbers this run CREATED (create_pull_request / create_issue).
82
+ // read by the REST-write scope guard (mcp/scope.ts) so the agent may edit the
83
+ // body of / comment on a PR or issue it opened this run, even though that
84
+ // number differs from the run's triggering issue_number. a merely checked-out
85
+ // PR is intentionally NOT recorded here — checkout_pr is agent-controlled, so
86
+ // letting it widen write scope would defeat the guard.
87
+ createdTargets?: Set<number>;
88
+ // PR HEAD sha at checkout time — used to detect new commits pushed during a review
89
+ checkoutSha?: string;
90
+ // commentable lines per file at checkoutSha — captured during checkout_pr so
91
+ // review-time inline-comment validation matches the diff GitHub will anchor
92
+ // to (commit_id=checkoutSha). without this, a PR update between checkout and
93
+ // review would make listFiles (latest HEAD) disagree with the anchor,
94
+ // silently dropping valid comments or letting invalid ones through.
95
+ //
96
+ // commentableLinesPullNumber records WHICH PR this snapshot belongs to. if
97
+ // the agent checks out PR B and then reviews PR A in the same session, the
98
+ // cached snapshot for B would silently mis-validate A's comments — keying
99
+ // by PR number forces a re-fetch when the target changes.
100
+ //
101
+ // commentableLinesCheckoutSha pins the snapshot to the SHA it was built
102
+ // against. if a second checkout_pr for the SAME PR bumps checkoutSha but
103
+ // fails before repopulating the cache (e.g., listFiles rate-limits), the
104
+ // stale snapshot would silently mis-validate comments against the new SHA.
105
+ // comparing both fields forces a re-fetch when either moves.
106
+ commentableLinesByFile?: Map<string, CommentableLines>;
107
+ commentableLinesPullNumber?: number;
108
+ commentableLinesCheckoutSha?: string | undefined;
109
+ // SHA to diff incrementally against — set from event payload on first checkout,
110
+ // then from checkoutSha when review.ts detects new commits mid-review
111
+ beforeSha?: string;
112
+ selectedMode?: string;
113
+ // number of remediation PRs opened this run. set only in Remediate mode by
114
+ // create_pull_request; read by the max_prs guardrail (mcp/guardrails.ts).
115
+ remediationPrsOpened?: number;
116
+ // the terraform tool-to-tool session: the baseline/scan/plan/cost/refactor
117
+ // signals the terraform MCP tools hand to one another and to end-of-run
118
+ // reporting. Extracted from this god-bag into its own typed, documented
119
+ // channel (mcp/terraform/scanSession.ts) so the coupling and its load-bearing
120
+ // ordering are visible and testable instead of being loose fields here. Reach
121
+ // it through `scanSessionOf(toolState)`.
122
+ scanSession?: ScanSession;
123
+ // number of prepush hook failures this run. push_branch runs the hook
124
+ // while this is 0 and skips it once non-zero; never decremented within
125
+ // a run.
126
+ prepushFailureCount: number;
127
+ backgroundProcesses: Map<string, BackgroundProcess>;
128
+ review?: {
129
+ id: number;
130
+ nodeId: string;
131
+ reviewedSha: string | undefined;
132
+ };
133
+ // dedupe key: parent review comment_id → most-recent reply written this
134
+ // session by reply_to_review_comment. used by duplicateReplyDecision to
135
+ // skip identical-body re-emissions of the same call (PR #610 root cause).
136
+ // body-keyed (not just id-keyed) so legitimate follow-up replies with
137
+ // different content still go through.
138
+ reviewReplies?: Map<
139
+ number,
140
+ { commentId: number; url: string | undefined; bodyWithFooter: string }
141
+ >;
142
+ dependencyInstallation?: {
143
+ status: "not_started" | "in_progress" | "completed" | "failed";
144
+ promise: Promise<PrepResult[]> | undefined;
145
+ results: PrepResult[] | undefined;
146
+ };
147
+ // undefined = no comment yet, object = active comment, null = deliberately deleted
148
+ progressComment: ProgressComment | null | undefined;
149
+ // immutable snapshot: true if a progress comment was pre-created at init time.
150
+ // survives deleteProgressComment so handleAgentResult can still detect "expected but never reported".
151
+ hadProgressComment: boolean;
152
+ lastProgressBody?: string;
153
+ wasUpdated?: boolean;
154
+ // set after a non-plan report_progress successfully writes the final summary.
155
+ // decoupled from todoTracker.enabled so cleanup detection survives API failures.
156
+ finalSummaryWritten?: boolean;
157
+ // set when create_issue_comment posted a standalone comment on the run's OWN
158
+ // target issue/PR. signals the progress comment is now redundant chrome so
159
+ // run-end cleanup deletes it even though report_progress finalized.
160
+ answerCommentPosted?: boolean;
161
+ // set by select_mode when Plan + issue_number and plan-comment API returns existing plan (for report_progress target_plan_comment)
162
+ existingPlanCommentId?: number;
163
+ previousPlanBody?: string;
164
+ // absolute path to the PR summary markdown file the agent edits in place.
165
+ // seeded by main.ts before the agent starts when payload.generateSummary is set;
166
+ // read back at end-of-run to persist to DB.
167
+ summaryFilePath?: string;
168
+ // exact bytes of the seeded snapshot file at run start. compared against
169
+ // the file content at end-of-run to detect "agent never touched it" — in
170
+ // that case persistSummary skips the DB write (saving the seed verbatim
171
+ // would either re-write what the DB already has, on incremental runs, or
172
+ // serialize the placeholder scaffold, on first runs).
173
+ summarySeed?: string;
174
+ // set to true after persistSummary completes once. prevents the error-path
175
+ // call (which exists so a successful agent edit before a crash still gets
176
+ // persisted) from redundantly re-running the DB PATCH on the
177
+ // success-then-late-throw path.
178
+ summaryPersistAttempted?: boolean;
179
+ // absolute path to the rolling repo-level learnings markdown file the
180
+ // agent reads at startup and may edit at end-of-run. seeded by main.ts
181
+ // for every run from `Repo.learnings` (empty file when no learnings
182
+ // exist yet); read back at end-of-run to persist any edits.
183
+ learningsFilePath?: string;
184
+ // exact bytes of the seeded learnings file at run start. compared
185
+ // against the file content at end-of-run to detect "agent never touched
186
+ // it" — in that case persistLearnings skips the DB PATCH (saving the
187
+ // identical content would be a no-op write that wastes a LearningsRevision
188
+ // row and the API round-trip).
189
+ learningsSeed?: string;
190
+ // mirror of `summaryPersistAttempted` for the learnings tmpfile — guards
191
+ // the error-path / exit-signal callers from a redundant second PATCH
192
+ // after the success path already persisted.
193
+ learningsPersistAttempted?: boolean;
194
+ output?: string | undefined;
195
+ usageEntries: AgentUsage[];
196
+ // specialist-routing watch (see agents/dispatchMetrics.ts). accumulates
197
+ // across agent invocations for the same reason `usageEntries` does — a
198
+ // post-run resume or a transient-provider retry is the same run's cost.
199
+ dispatchMetrics: DispatchRecorder;
200
+ model?: string | undefined;
201
+ // set by main.ts when the BYOK fallback engaged (configured model needed
202
+ // a provider key the runner didn't have). carried into PR-comment footers
203
+ // so users can see "Using <free model> (credentials for <configured> not
204
+ // configured)" rather than just being silently downgraded. literal record
205
+ // of an event that happened — matches the ToolState design rule.
206
+ modelFallback?: { from: string } | undefined;
207
+ // user-facing language for fixed comment/footer chrome (mirrors payload.language,
208
+ // seeded in main.ts). "en"/undefined → the default English labels.
209
+ language?: UserFacingLanguage | undefined;
210
+ todoTracker?: TodoTracker | undefined;
211
+ diffCoverage?: DiffCoverageState | undefined;
212
+ // mutable handle the agent harness writes to as a run progresses (recent
213
+ // stderr ring buffer reference, last provider-error label, event count).
214
+ // read by main.ts's outer catch so a watchdog-fired activity timeout still
215
+ // surfaces the same agent-side context the harness's own catch path returns
216
+ // via `result.error`. see `utils/agentHangReport.ts`.
217
+ agentDiagnostic?: AgentDiagnostic | undefined;
218
+ }
219
+
220
+ interface InitToolStateParams {
221
+ progressComment: { id: string; type: ProgressCommentType } | undefined;
222
+ }
223
+
224
+ export function initToolState(params: InitToolStateParams): ToolState {
225
+ const resolved = parseProgressComment(params.progressComment);
226
+
227
+ if (resolved) {
228
+ log.info(`» using pre-created progress comment: ${resolved.id} (${resolved.type})`);
229
+ }
230
+
231
+ return {
232
+ progressComment: resolved,
233
+ hadProgressComment: !!resolved,
234
+ prepushFailureCount: 0,
235
+ backgroundProcesses: new Map(),
236
+ createdTargets: new Set(),
237
+ usageEntries: [],
238
+ dispatchMetrics: new DispatchRecorder(),
239
+ scanSession: createScanSession(),
240
+ };
241
+ }