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,123 @@
1
+ import { DispatchRecorder } from "#app/agents/dispatchMetrics";
2
+ import type { AgentUsage } from "#app/agents/shared";
3
+ import { type ScanSession } from "#app/mcp/terraform/scanSession";
4
+ import type { PrepResult } from "#app/prep/types";
5
+ import type { AgentDiagnostic } from "#app/utils/agentHangReport";
6
+ import type { DiffCoverageState } from "#app/utils/diffCoverage";
7
+ import { type ProgressComment, type ProgressCommentType } from "#app/utils/progressComment";
8
+ import type { UserFacingLanguage } from "#app/utils/payload";
9
+ import type { TodoTracker } from "#app/utils/todoTracking";
10
+ export type BackgroundProcess = {
11
+ pid: number;
12
+ outputPath: string;
13
+ pidPath: string;
14
+ };
15
+ export type StoredPushDest = {
16
+ remoteName: string;
17
+ remoteBranch: string;
18
+ localBranch: string;
19
+ };
20
+ /**
21
+ * Valid inline-comment anchor lines per side at a particular checkout SHA.
22
+ * Lives here (not in `mcp/review.ts`) so `ToolState` — which caches
23
+ * `Map<path, CommentableLines>` per checkout — does not pull the MCP server
24
+ * graph into every consumer of run state (the action's main loop, agent
25
+ * harnesses, cf-worker indexing).
26
+ */
27
+ export type CommentableLines = {
28
+ RIGHT: Set<number>;
29
+ LEFT: Set<number>;
30
+ };
31
+ /**
32
+ * mutable per-run record of facts that occurred during execution. shared
33
+ * between the action process and the MCP server (one process — toolState is
34
+ * just a JS object passed by reference into both surfaces).
35
+ *
36
+ * design rule: ToolState is LITERAL. each field records a thing that
37
+ * happened — `review` is set when `create_pull_request_review` succeeded,
38
+ * `finalSummaryWritten` flips when `report_progress` wrote a non-plan body,
39
+ * `selectedMode` is set when `select_mode` was called. fields should never
40
+ * encode the absence of an event ("unsubmittedReview", "missingArtifact"),
41
+ * speculative state, or values derived from other fields.
42
+ *
43
+ * any predicate the rest of the code needs ("the agent picked review mode but
44
+ * never produced a review or progress write") is computed inline at the call
45
+ * site, not stored. derived state in this struct invariably drifts from the
46
+ * literal fields under refactors and is the wrong layer for the check.
47
+ *
48
+ * write narrowly: prefer adding state inside the tool that mutates it (e.g.
49
+ * `create_pull_request_review` populates `toolState.review`) and reading
50
+ * narrowly elsewhere. don't introduce flags from main.ts that mirror what an
51
+ * MCP tool already records.
52
+ */
53
+ export interface ToolState {
54
+ pushUrl?: string;
55
+ pushDest?: StoredPushDest;
56
+ initialHead?: {
57
+ kind: "branch";
58
+ name: string;
59
+ } | {
60
+ kind: "detached";
61
+ sha: string;
62
+ };
63
+ issueNumber?: number;
64
+ createdTargets?: Set<number>;
65
+ checkoutSha?: string;
66
+ commentableLinesByFile?: Map<string, CommentableLines>;
67
+ commentableLinesPullNumber?: number;
68
+ commentableLinesCheckoutSha?: string | undefined;
69
+ beforeSha?: string;
70
+ selectedMode?: string;
71
+ remediationPrsOpened?: number;
72
+ scanSession?: ScanSession;
73
+ prepushFailureCount: number;
74
+ backgroundProcesses: Map<string, BackgroundProcess>;
75
+ review?: {
76
+ id: number;
77
+ nodeId: string;
78
+ reviewedSha: string | undefined;
79
+ };
80
+ reviewReplies?: Map<number, {
81
+ commentId: number;
82
+ url: string | undefined;
83
+ bodyWithFooter: string;
84
+ }>;
85
+ dependencyInstallation?: {
86
+ status: "not_started" | "in_progress" | "completed" | "failed";
87
+ promise: Promise<PrepResult[]> | undefined;
88
+ results: PrepResult[] | undefined;
89
+ };
90
+ progressComment: ProgressComment | null | undefined;
91
+ hadProgressComment: boolean;
92
+ lastProgressBody?: string;
93
+ wasUpdated?: boolean;
94
+ finalSummaryWritten?: boolean;
95
+ answerCommentPosted?: boolean;
96
+ existingPlanCommentId?: number;
97
+ previousPlanBody?: string;
98
+ summaryFilePath?: string;
99
+ summarySeed?: string;
100
+ summaryPersistAttempted?: boolean;
101
+ learningsFilePath?: string;
102
+ learningsSeed?: string;
103
+ learningsPersistAttempted?: boolean;
104
+ output?: string | undefined;
105
+ usageEntries: AgentUsage[];
106
+ dispatchMetrics: DispatchRecorder;
107
+ model?: string | undefined;
108
+ modelFallback?: {
109
+ from: string;
110
+ } | undefined;
111
+ language?: UserFacingLanguage | undefined;
112
+ todoTracker?: TodoTracker | undefined;
113
+ diffCoverage?: DiffCoverageState | undefined;
114
+ agentDiagnostic?: AgentDiagnostic | undefined;
115
+ }
116
+ interface InitToolStateParams {
117
+ progressComment: {
118
+ id: string;
119
+ type: ProgressCommentType;
120
+ } | undefined;
121
+ }
122
+ export declare function initToolState(params: InitToolStateParams): ToolState;
123
+ export {};
@@ -0,0 +1,40 @@
1
+ /**
2
+ * generic `spawn()` idle default for ordinary short-lived subprocesses (prep
3
+ * probes, package-manager invocations, dependency installs). these should be
4
+ * producing output steadily, so a comparatively tight budget catches a wedged
5
+ * command promptly. the long-silent-tool tolerance the agent harnesses need
6
+ * lives in AGENT_ACTIVITY_TIMEOUT_MS, applied explicitly at those sites.
7
+ */
8
+ export declare const DEFAULT_ACTIVITY_TIMEOUT_MS = 300000;
9
+ /**
10
+ * flat idle budget for the agent activity watchdog (the outer process-output
11
+ * monitor, the v1 harness spawns, and the v2 inner event-silence watchdog).
12
+ * sized to exceed the worst-case legitimate silent tool window (issue #760:
13
+ * `checkout_pr` git fetch+deepen on a large monorepo, ~4-5min) with generous
14
+ * headroom, so no single in-flight tool call can be mistaken for a stall. a
15
+ * timeout this generous needs no suspend/resume bracketing — the cost of a
16
+ * genuinely hung run is only GitHub Actions minutes, not tokens.
17
+ */
18
+ export declare const AGENT_ACTIVITY_TIMEOUT_MS = 900000;
19
+ export declare const DEFAULT_ACTIVITY_CHECK_INTERVAL_MS = 5000;
20
+ export declare const ACTIVITY_NOISE_PATTERNS: readonly RegExp[];
21
+ export declare function isActivityNoise(chunk: string | Uint8Array): boolean;
22
+ type ActivityTimeoutContext = {
23
+ timeoutMs: number;
24
+ checkIntervalMs: number;
25
+ };
26
+ export type ActivityTimeout = {
27
+ promise: Promise<never>;
28
+ stop: () => void;
29
+ /** force the timeout to reject immediately with a custom reason */
30
+ forceReject: (reason: string) => void;
31
+ };
32
+ /**
33
+ * mark activity to reset the no-output timeout.
34
+ * call this whenever the agent emits any event, even if it isn't logged to stdout.
35
+ */
36
+ export declare function markActivity(): void;
37
+ /** get the time since last activity in milliseconds. */
38
+ export declare function getIdleMs(): number;
39
+ export declare function createProcessOutputActivityTimeout(ctx: ActivityTimeoutContext): ActivityTimeout;
40
+ export {};
@@ -0,0 +1,47 @@
1
+ import type { Agent } from "#app/agents/index";
2
+ /**
3
+ * resolve the effective model for this run.
4
+ *
5
+ * priority:
6
+ * 1. INFRAWEAVER_MODEL env var — resolved through the alias registry first,
7
+ * so values like "anthropic/claude-opus" become "anthropic/claude-opus-4-7".
8
+ * raw specifiers (e.g. "anthropic/claude-opus-4-6") pass through unchanged.
9
+ * always wins — bypasses Bedrock routing entirely. to test a different
10
+ * Bedrock model, change `BEDROCK_MODEL_ID`, not `INFRAWEAVER_MODEL`.
11
+ * 2. slug from repo config / payload → alias registry. routing slugs
12
+ * (e.g. `bedrock/byok`) defer to a separate env var (`BEDROCK_MODEL_ID`).
13
+ * 3. undefined — agent will auto-select.
14
+ */
15
+ export declare function resolveModel(ctx: {
16
+ slug?: string | undefined;
17
+ }): string | undefined;
18
+ export declare function resolveAgent(ctx: {
19
+ model?: string | undefined;
20
+ }): Agent;
21
+ /**
22
+ * The single BYOK model gate: resolve the slug, pick the harness, and run the
23
+ * fallback decision in one place. Throws the actionable authorized-model list
24
+ * on the `unavailable` decision (key present but model unroutable — fail loudly,
25
+ * never silently downgrade).
26
+ */
27
+ export interface ModelGateResult {
28
+ /** the effective model that will run (post-fallback); undefined → auto-select */
29
+ model: string | undefined;
30
+ /** the slug to surface in footers/logs */
31
+ effectiveSlug: string | undefined;
32
+ /** the harness resolved for the effective model */
33
+ agent: Agent;
34
+ /** set only when the free safety-net fallback engaged */
35
+ fallback?: {
36
+ from: string;
37
+ to: string;
38
+ };
39
+ /** operator warnings to log at the orchestration layer */
40
+ warnings: string[];
41
+ /** whether the caller should still run `validateAgentApiKey` */
42
+ validate: boolean;
43
+ }
44
+ export declare function resolveModelWithGating(input: {
45
+ slug?: string | undefined;
46
+ authorized: Set<string>;
47
+ }): ModelGateResult;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * mutable per-run handle the agent harness writes to as a run progresses.
3
+ * the action's outer try/catch in `main.ts` reads this off `toolState` when
4
+ * the activity-timeout watchdog wins the race against the harness's own
5
+ * catch — the bare timer reject reason ("activity timeout: no output for
6
+ * 302s") tells the user nothing actionable, but `recentStderr` +
7
+ * `lastProviderError` together usually point straight at the upstream cause.
8
+ *
9
+ * `recentStderr` is shared by reference with the harness's bounded ring
10
+ * buffer, so the diagnostic always reflects the latest captured tail.
11
+ */
12
+ export type AgentDiagnostic = {
13
+ /** display label for the agent, e.g. "Infraweaver". used in the headline. */
14
+ label: string;
15
+ /** shared reference to the harness's bounded stderr ring buffer. */
16
+ recentStderr: string[];
17
+ /** most-recent provider-error label from `detectProviderError`, if any. */
18
+ lastProviderError: string | undefined;
19
+ /** count of stdout events successfully parsed before the failure. */
20
+ eventCount: number;
21
+ };
22
+ /**
23
+ * Build a user-facing markdown body for an agent hang or failure.
24
+ *
25
+ * Rendered into both the PR progress comment and the GitHub Actions job
26
+ * summary. Returns `null` when no diagnostic is available, which signals to
27
+ * the caller to fall back to its bare-error rendering.
28
+ *
29
+ * `errorMessage` is the underlying timer / spawn reject string (e.g.
30
+ * `activity timeout: no output for 301s`). The idle seconds are parsed out
31
+ * of it for the hang explanation — total runtime would overstate the stall
32
+ * for runs that streamed for a long time before going quiet.
33
+ */
34
+ export declare function formatAgentHangBody(input: {
35
+ diagnostic: AgentDiagnostic | undefined;
36
+ isHang: boolean;
37
+ errorMessage: string;
38
+ }): string | null;
@@ -0,0 +1,17 @@
1
+ import type { Concern } from "#app/mcp/terraform/types";
2
+ /** Max annotations emitted per run (GitHub throttles display well below this). */
3
+ export declare const MAX_ANNOTATIONS = 50;
4
+ export interface FindingAnnotation {
5
+ level: "error" | "warning";
6
+ message: string;
7
+ title: string;
8
+ file: string;
9
+ startLine: number;
10
+ }
11
+ /**
12
+ * Build annotation descriptors for the active concerns. `gatingIds` is the set of
13
+ * concern ids that fail the gate (new high/critical) — those become `error`s,
14
+ * sorted first so they survive the cap. Concerns with no file location are skipped
15
+ * (an annotation needs a file to anchor to).
16
+ */
17
+ export declare function buildFindingAnnotations(active: Concern[], gatingIds: ReadonlySet<string>, max?: number): FindingAnnotation[];
@@ -0,0 +1,11 @@
1
+ import { type CloudFetchOptions } from "#app/utils/cloudFetchCore";
2
+ export type ApiFetchOptions = CloudFetchOptions;
3
+ /**
4
+ * fetch wrapper for hitting the Infraweaver API. the transport concerns —
5
+ * default host, host allowlist, Vercel bypass secret, default timeout —
6
+ * live in cloudFetchCore.ts, shared with the stdlib-only post hook.
7
+ *
8
+ * requests without an explicit `signal` get the core's default timeout, so a
9
+ * stalled backend can't hang the action.
10
+ */
11
+ export declare function apiFetch(options: ApiFetchOptions): Promise<Response>;