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,13 @@
1
+ import { type Type } from "arktype";
2
+ /**
3
+ * Parse + shape-validate JSON from an external subprocess (terraform, tflint,
4
+ * trivy, checkov, infracost, reviewer findings). MCP tool inputs are already
5
+ * arktype-validated at the tool boundary; this applies the same rigor to the
6
+ * other untrusted boundary — scanner stdout — so a version bump that changes a
7
+ * tool's output shape fails that scanner loudly (callers degrade to `skipped`
8
+ * / empty) instead of feeding silently-wrong fields into concerns.
9
+ *
10
+ * Throws on invalid JSON (exactly like the bare `JSON.parse` it replaces) and
11
+ * on a shape mismatch, with the offending paths in the message.
12
+ */
13
+ export declare function parseScannerJson<t>(schema: Type<t>, stdout: string, tool: string): t;
@@ -0,0 +1,205 @@
1
+ import { type ToolsNetworkDirective } from "#app/mcp/terraform/scannerEgress";
2
+ import { type Concern, type ScannerOutcome } from "#app/mcp/terraform/types";
3
+ import { type ResolvedToolSelection } from "#app/utils/toolSelection";
4
+ export declare function scanFmt(cwd: string): ScannerOutcome;
5
+ /** `terraform fmt -check -list=true` prints one unformatted file path per line. */
6
+ export declare function parseFmtOutput(stdout: string, cwd?: string): Concern[];
7
+ /**
8
+ * Run `terraform validate` across EVERY root and aggregate. `validate` is the
9
+ * one scanner that's per-root (fmt/tflint/trivy/checkov are recursive over the
10
+ * whole tree), so a multi-root repo only catches subdir-root validate errors
11
+ * when we visit each root.
12
+ */
13
+ export declare function scanValidate(cwd: string, extraEnv?: Record<string, string>): ScannerOutcome;
14
+ /** parse `terraform validate -json`; keeps real errors, drops uninitialized-dir noise. */
15
+ export declare function parseValidateOutput(stdout: string, cwd?: string): Concern[];
16
+ export interface ProviderRequirement {
17
+ /** local name, e.g. `aws`. */
18
+ name: string;
19
+ /** registry source, e.g. `hashicorp/aws`, or null (legacy string form). */
20
+ source: string | null;
21
+ /** raw version constraint, e.g. `~> 5.0`, or null when unconstrained. */
22
+ version: string | null;
23
+ /** the pinned MAJOR (the lower-bound major of the constraint) — the number a
24
+ * fix must target, since argument schemas differ across provider majors. */
25
+ major: number | null;
26
+ }
27
+ /**
28
+ * Parse every `required_providers { … }` block in some HCL text into the pinned
29
+ * provider requirements. Handles the modern object form
30
+ * (`aws = { source = "hashicorp/aws", version = "~> 5.0" }`) and the legacy
31
+ * string form (`aws = "~> 5.0"`). A repo's "correct" fix depends on the provider
32
+ * MAJOR — argument names and valid blocks differ across AWS/Azure majors — so
33
+ * surfacing the pinned major lets a fix target the right schema instead of
34
+ * breaking `plan`. Brace-matched (not a fragile single regex) so nested objects
35
+ * don't confuse it. First declaration of a name wins (dedup across files).
36
+ */
37
+ export declare function parseRequiredProviders(hcl: string): ProviderRequirement[];
38
+ /** read the repo's `*.tf` files (recursively — root + subdir roots + nested
39
+ * modules) and parse their pinned provider requirements (best-effort; an
40
+ * unreadable tree yields none). First declaration of a provider wins. */
41
+ export declare function collectProviderRequirements(cwd: string): ProviderRequirement[];
42
+ /** the top-level arguments of a single `resource` block. */
43
+ export interface ResourceArguments {
44
+ resourceType: string;
45
+ /** the resource's local name (`resource "aws_s3_bucket" "<name>"`). */
46
+ name: string;
47
+ /** top-level attribute + nested-block names (meta-arguments excluded). */
48
+ args: string[];
49
+ }
50
+ /**
51
+ * Parse every `resource "<type>" "<name>" { … }` block's TOP-LEVEL argument
52
+ * names (attributes assigned with `=` and nested block labels) from some HCL.
53
+ * Conservative by design — it skips `"…"` strings and `#`/`//` line comments so
54
+ * an interpolation's braces or a commented line can't corrupt the brace depth or
55
+ * fabricate an argument, and only reports depth-0 names. A `dynamic "x"` block
56
+ * contributes `x` (the generated block type). Used to cross-check written
57
+ * arguments against the installed provider schema; pure.
58
+ */
59
+ export declare function parseResourceArguments(hcl: string): ResourceArguments[];
60
+ export interface UnknownArgument {
61
+ resource_type: string;
62
+ /** the resource's local name. */
63
+ name: string;
64
+ /** repo-relative file the resource is declared in. */
65
+ file: string;
66
+ /** the argument names not present in the installed provider's schema. */
67
+ unknown: string[];
68
+ }
69
+ /**
70
+ * Cross-check every resource's written arguments against the
71
+ * INSTALLED provider's schema, so an argument that's invalid for the pinned
72
+ * provider major (a "correct" fix for the wrong version) is caught at validate
73
+ * time, not as a later `plan` failure. Degrades green: returns
74
+ * `{ checked: false }` when the schema is unavailable (terraform not installed /
75
+ * dir not init-ed). A resource type absent from the schema is skipped (can't
76
+ * judge), never flagged.
77
+ */
78
+ export declare function checkArgumentsAgainstSchema(cwd: string): {
79
+ checked: boolean;
80
+ unknown_arguments: UnknownArgument[];
81
+ };
82
+ /** A parsed resource block plus the file it came from. `parseResourceArguments`
83
+ * works on one file's text and so cannot carry a location; the transform-pack
84
+ * matcher (TC-2.2) needs one to tell the agent WHERE to edit. */
85
+ export interface LocatedResource extends ResourceArguments {
86
+ /** repo-relative file the resource is declared in. */
87
+ file: string;
88
+ }
89
+ /** Every `resource` block under `cwd`, with its file. Best-effort in the same
90
+ * way as `collectProviderRequirements` — an unreadable file is skipped rather
91
+ * than failing the walk. */
92
+ export declare function collectResourceArguments(cwd: string): LocatedResource[];
93
+ export declare function scanTflint(cwd: string, network?: ToolsNetworkDirective): ScannerOutcome;
94
+ /** parse `tflint --format json` output into concerns. */
95
+ export declare function parseTflintOutput(stdout: string, cwd?: string): Concern[];
96
+ /**
97
+ * Parse `trivy config --format json` output into concerns. Trivy nests
98
+ * misconfigurations under `Results[].Misconfigurations[]`, keyed to the result's
99
+ * `Target` file. `trivy config` reports only failures by default, but we
100
+ * defensively drop any `Status: "PASS"` entry so an `--include-non-failures`
101
+ * run can't leak passing checks into the concern set. Each concern carries the
102
+ * IaC language from the result's `Type` (terraform / cloudformation / kubernetes
103
+ * / helm / dockerfile / azure-arm), which is what the read-only surfaces scope on
104
+ * — trivy scans every format it finds, and the language tag keeps that honest.
105
+ */
106
+ export declare function parseTrivyOutput(stdout: string, cwd?: string): Concern[];
107
+ /**
108
+ * Best-effort fallback so EVERY located finding shows its code, not only the
109
+ * trivy/checkov ones whose scanner emits a source window. For any concern that
110
+ * has a line but no scanner-attached snippet (terraform-validate, tflint, …),
111
+ * read the flagged line from disk. Files are read once and cached; a missing or
112
+ * unreadable file just leaves the snippet null. Pure-ish (read-only I/O).
113
+ */
114
+ export declare function attachSourceSnippets(concerns: Concern[], cwd: string): Concern[];
115
+ /** parse `checkov -o json` output (object for one framework, array for several).
116
+ * Each block's `check_type` names the framework that produced it (terraform /
117
+ * cloudformation / kubernetes / …) — carried onto every concern as its language. */
118
+ export declare function parseCheckovOutput(stdout: string, cwd?: string): Concern[];
119
+ /**
120
+ * Terraform files changed on the current branch vs the base. Returns null when
121
+ * the base can't be determined (caller then falls back to a full scan).
122
+ */
123
+ export declare function changedTerraformFiles(cwd: string): Set<string> | null;
124
+ export interface RunScannersOptions {
125
+ /** the resolved tool selection. A scanner whose tool is gated/disabled
126
+ * is reported as a `skipped` outcome (with the licence/disable reason) instead
127
+ * of running, so `terraform_scan` and the ✗→✓ verifier see the SAME toolchain. */
128
+ selection?: ResolvedToolSelection | undefined;
129
+ /** module-fetch credential env, threaded into `terraform validate`'s
130
+ * init so a private cross-repo `git::` module resolves during a scan. */
131
+ terraformEnv?: Record<string, string> | undefined;
132
+ /** when true, checkov resolves and scans INSIDE registry/git modules
133
+ * (`--download-external-modules true`). Required by the refactor b.4 path so
134
+ * adopting a third-party module can't launder its internal findings; off by
135
+ * default to keep the normal scan fast and offline. */
136
+ downloadExternalModules?: boolean | undefined;
137
+ /** checkov `--framework` values (see checkovFrameworksFor). Defaults to the
138
+ * Terraform-only pair — the fix loop never widens; the read-only Assess path
139
+ * passes the language-scope-derived set for multi-language breadth. */
140
+ checkovFrameworks?: string[] | undefined;
141
+ /** per-scanner egress policy (supply-chain 0.2, the `tools_network` input).
142
+ * A denied tool runs under the blackhole-proxy env overlay and its outcome
143
+ * records `egress_isolation: "partial"`. Absent ⇒ open egress (today's
144
+ * behaviour) — deny is opt-in. */
145
+ toolsNetwork?: ToolsNetworkDirective | undefined;
146
+ }
147
+ /** run every scanner once over `cwd`. shared by `terraform_scan` and the
148
+ * deterministic remediation verifier so both see the identical toolchain. A
149
+ * scanner the selection has turned off is emitted as `skipped` (never run), so
150
+ * the gate applies identically to the scan and its verification re-scan. */
151
+ export declare function runScanners(cwd: string, opts?: RunScannersOptions): ScannerOutcome[];
152
+ export interface RemediationVerdict {
153
+ /** true only when every original concern id is absent from the re-scan. */
154
+ verified: boolean;
155
+ /** original ids no longer present (the fix cleared them). */
156
+ resolved: string[];
157
+ /** original ids still present (the fix did NOT clear them). */
158
+ remaining: string[];
159
+ }
160
+ /**
161
+ * Deterministic ✗→✓ check: partition the group's original `concern_ids` into
162
+ * those gone from a fresh scan (`resolved`) and those still present
163
+ * (`remaining`). Concern ids are content hashes (`sha1(source|rule|file|line)`),
164
+ * so a missing id means that exact concern is gone — the correct primitive for
165
+ * "did the fix clear it", independent of severity/scope filtering. This is the
166
+ * code-level replacement for the agent eyeballing a re-scan and self-reporting.
167
+ */
168
+ export declare function computeRemediationVerdict(originalConcernIds: string[], currentConcernIds: Set<string>): RemediationVerdict;
169
+ /**
170
+ * Regression guard. The full re-scan (`terraform_verify_remediation`)
171
+ * already sees the whole workspace, so a concern the fix *introduced* shows up
172
+ * in the current scan. Regressions are exactly the content ids present after the
173
+ * fix that were not in the pre-fix baseline — `current − baseline`. A non-empty
174
+ * result means the fix traded one defect for another (e.g. an encryption block
175
+ * that trips a different tflint rule) and must downgrade the PR to needs-human.
176
+ *
177
+ * Both id sets are computed the same way (the deduped union of every scanner's
178
+ * concern ids, unfiltered by severity) so the diff is apples-to-apples — a
179
+ * regression at ANY severity is caught, not just ones above the run threshold.
180
+ * Returns sorted ids for a stable PR body.
181
+ */
182
+ export declare function computeRegressions(baselineConcernIds: Iterable<string>, currentConcernIds: Iterable<string>): string[];
183
+ /**
184
+ * Line-INDEPENDENT ✗→✓ partition (the integrity-preserving replacement for the
185
+ * raw-id `computeRemediationVerdict` when scan context is available). Each
186
+ * requested entry carries its display `id` and its `key` (see `concernKeyOf`);
187
+ * a concern is `remaining` iff its KEY still appears in the re-scan, else
188
+ * `resolved`. Because a fix that shifts lines keeps the same (source|rule|file)
189
+ * key, an unfixed concern can no longer be mis-reported as resolved. Pure.
190
+ */
191
+ export declare function partitionByKey(requested: {
192
+ id: string;
193
+ key: string;
194
+ }[], currentKeys: Set<string>): RemediationVerdict;
195
+ /**
196
+ * Line-INDEPENDENT regression set: one representative current concern id per KEY
197
+ * present in the re-scan but absent from the pre-fix baseline keys. A pre-existing
198
+ * concern that merely shifted to a new line (same key) is NOT a regression — only
199
+ * a genuinely new (rule, file) defect is. Replaces the raw-id `computeRegressions`
200
+ * for the integrity path. Pure; returns sorted ids for a stable PR body.
201
+ */
202
+ export declare function regressionIdsByKey(current: {
203
+ id: string;
204
+ key: string;
205
+ }[], baselineKeys: Set<string>): string[];
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Detached Ed25519 signing for the compliance artefacts (the evidence bundle in
3
+ * [[evidence]] and the CycloneDX VEX in [[vex]]) — the "signed evidence" story.
4
+ *
5
+ * Design constraints, in order:
6
+ * - **Sign the exact bytes written to disk.** The builders are already
7
+ * deterministic (same inputs ⇒ same bytes), so no JSON canonicaliser is
8
+ * needed — the detached `.sig` covers the file verbatim.
9
+ * - **`node:crypto` only** (`sign`/`verify` with a `null` digest — Ed25519 is
10
+ * a pure signature scheme); no new dependency.
11
+ * - **Honest when unsigned.** The private key arrives via env only
12
+ * (`INFRAWEAVER_SIGNING_KEY`, a base64-encoded PKCS#8 PEM). Unset ⇒ the
13
+ * artefact records an explicit `"signature": null` — never a fake or
14
+ * self-referential signature. A key that is SET but malformed throws (a
15
+ * mis-configured signer must fail loudly, not silently emit unsigned).
16
+ * - The key name matches the `_KEY` suffix in `utils/secrets.ts`
17
+ * SENSITIVE_PATTERNS, so it is redacted from logs and stripped from every
18
+ * subprocess env by the default-deny filter.
19
+ *
20
+ * Verify side: `infraweaver verify-evidence <bundle> <sig> <pubkey>` (src/cli.ts →
21
+ * commands/verifyEvidence.ts) re-checks a bundle offline with only the public key.
22
+ */
23
+ import { type KeyObject } from "node:crypto";
24
+ export declare const SIGNING_KEY_ENV = "INFRAWEAVER_SIGNING_KEY";
25
+ export declare const SIGNATURE_ALGORITHM: "Ed25519";
26
+ export interface SigningKey {
27
+ privateKey: KeyObject;
28
+ /** the public half, SPKI PEM — embedded in artefact metadata so a consumer
29
+ * can verify without any other channel. */
30
+ publicKeyPem: string;
31
+ /** sha256 of the SPKI DER, hex — the short handle a PR body / log names. */
32
+ fingerprint: string;
33
+ }
34
+ /** metadata embedded in a signed artefact (never the signature itself — the
35
+ * signature covers these bytes, so it must live in the detached `.sig`). */
36
+ export interface SignatureMetadata {
37
+ algorithm: typeof SIGNATURE_ALGORITHM;
38
+ public_key: string;
39
+ fingerprint_sha256: string;
40
+ /** sibling file carrying the base64 detached signature. */
41
+ detached_signature: string;
42
+ }
43
+ /**
44
+ * Load the signing key from the env (base64-encoded PKCS#8 PEM, Ed25519).
45
+ * Returns null when unset/empty (the honest-unsigned path); throws when a key
46
+ * is present but not a valid Ed25519 PKCS#8 PEM — a configured signer that
47
+ * can't sign is an operator error, never a silent downgrade.
48
+ */
49
+ export declare function loadSigningKey(raw?: string | undefined): SigningKey | null;
50
+ /** detached Ed25519 signature over the exact bytes, base64. */
51
+ export declare function signBytes(bytes: string | Buffer, key: SigningKey): string;
52
+ /** verify a detached base64 signature against the exact bytes + an SPKI PEM
53
+ * public key. Returns false (never throws) on a malformed signature/key, so a
54
+ * verifier can report FAILED rather than crash on garbage input. */
55
+ export declare function verifyBytes(bytes: string | Buffer, signatureB64: string, publicKeyPem: string): boolean;
56
+ /** sha256 fingerprint (hex) of an SPKI PEM public key — the same handle
57
+ * {@link loadSigningKey} derives, computable by a verifier from the PEM alone. */
58
+ export declare function publicKeyFingerprint(publicKeyPem: string): string;
59
+ /** the metadata block an artefact embeds when this key signs it. `sigFile` is
60
+ * the sibling `.sig` filename (relative — beside the artefact). */
61
+ export declare function signatureMetadata(key: SigningKey, sigFile: string): SignatureMetadata;
@@ -0,0 +1,18 @@
1
+ import { type Concern } from "#app/mcp/terraform/types";
2
+ export interface DeprecatedLockingSite {
3
+ /** 1-based line of the `backend "s3"` block. */
4
+ line: number;
5
+ /** the `dynamodb_table` value as written (a literal, or an expression). */
6
+ table: string;
7
+ }
8
+ /**
9
+ * Every `terraform { backend "s3" { … } }` that locks via `dynamodb_table`
10
+ * without `use_lockfile = true`.
11
+ *
12
+ * Walks `terraform` → `backend` explicitly rather than matching `dynamodb_table`
13
+ * anywhere: `aws_dynamodb_table` resources and module inputs of the same name
14
+ * are common, and a currency finding fabricated from one of those would be
15
+ * indistinguishable from a real one to whoever reads the report.
16
+ */
17
+ export declare function findDeprecatedStateLocking(hcl: string): DeprecatedLockingSite[];
18
+ export declare function deprecatedStateLockingToConcerns(sites: DeprecatedLockingSite[], file: string): Concern[];
@@ -0,0 +1,43 @@
1
+ export type RunResult = {
2
+ status: number;
3
+ stdout: string;
4
+ stderr: string;
5
+ missing: boolean;
6
+ };
7
+ /**
8
+ * Hard wall-clock cap on any single scanner/terraform invocation. Bounds a hung
9
+ * subprocess (e.g. `terraform init`/`plan` stalling on a private registry, a
10
+ * tflint plugin fetch that never returns) so it can't block the run forever.
11
+ * Generous (5 min) so it only ever fires on a genuine hang, never a slow-but-
12
+ * progressing plan. A timeout surfaces as a non-zero/`-1` status the caller
13
+ * already treats as "this scanner did not produce results".
14
+ */
15
+ export declare const SUBPROCESS_TIMEOUT_MS = 300000;
16
+ /**
17
+ * Run a scanner without throwing. Terraform tools exit non-zero when they FIND
18
+ * issues, so a non-zero status is normal, not an error. `missing` is set when
19
+ * the binary isn't on PATH (ENOENT) — the scanner then degrades to "skipped"
20
+ * rather than failing the run (a tool being absent must not block).
21
+ *
22
+ * `extraEnv` opts a specific command back into a needed credential: the scanners
23
+ * run with a restricted env that strips every `*_KEY`/secret, but infracost
24
+ * legitimately needs its `INFRACOST_API_KEY`. resolveEnv(object) merges the
25
+ * restricted base with the explicit vars, so only the named keys get through.
26
+ */
27
+ export declare function run(cmd: string, args: string[], cwd: string, extraEnv?: Record<string, string>): RunResult;
28
+ /** test seam — forget the resolved CLI so a test can exercise both branches. */
29
+ export declare function resetTerraformCliCache(): void;
30
+ /**
31
+ * Run a Terraform CLI command, preferring `terraform` and transparently falling
32
+ * back to OpenTofu (`tofu`) when `terraform` is ABSENT from PATH (ENOENT). The two
33
+ * share the exact surface the engine uses (fmt / validate / init / plan / show),
34
+ * and the licence posture already prefers OpenTofu (Terraform is BUSL) — so an
35
+ * OpenTofu-only runner keeps full fmt/validate/plan coverage instead of reporting
36
+ * everything skipped. The fallback is probed via the FIRST real command (no
37
+ * separate `version` call, so a mocked runner that answers `fmt`/`init`/`plan`
38
+ * needs no extra stubbing) and the chosen binary is memoised for the rest of the
39
+ * process — the one-time resolution to `tofu` is logged so the operator sees which
40
+ * CLI ran. When BOTH are absent the terraform result (missing) is returned so the
41
+ * caller degrades to "skipped" exactly as before. `runner` is injectable for tests.
42
+ */
43
+ export declare function runTf(args: string[], cwd: string, extraEnv?: Record<string, string>, runner?: typeof run): RunResult;
@@ -0,0 +1,90 @@
1
+ import type { Concern, ConcernSuppression } from "#app/mcp/terraform/types";
2
+ export type SuppressionSource = ConcernSuppression["source"];
3
+ export interface Suppression {
4
+ source: SuppressionSource;
5
+ rule: string;
6
+ reason: string;
7
+ expires: string | null;
8
+ paths: string[];
9
+ file: string | null;
10
+ /** Set when this came from a NATIVE scanner skip directive (checkov/tfsec/trivy)
11
+ * rather than a `#infraweaver:ignore`. The owning scanner already honours it; we
12
+ * carry the provenance so the unified audit trail shows where it came from. */
13
+ tool?: string;
14
+ }
15
+ export interface ParsedSuppressions {
16
+ suppressions: Suppression[];
17
+ warnings: string[];
18
+ }
19
+ export declare function parseInlineSuppressions(content: string, file: string): ParsedSuppressions;
20
+ /** A native scanner-skip directive with its source location — the line-aware shape
21
+ * behind both the suppression pipeline and the orphan-skip audit. */
22
+ export interface NativeSkip {
23
+ tool: string;
24
+ /** namespaced rule, e.g. "checkov:CKV_AWS_20" — matches a concern's `rule_id`. */
25
+ rule: string;
26
+ reason: string;
27
+ expires: string | null;
28
+ file: string;
29
+ /** 1-based line of the directive. */
30
+ line: number;
31
+ }
32
+ /** Collect every native scanner-skip directive in a file, WITH line numbers. The
33
+ * single source of truth for native-skip parsing (used by the suppression pipeline
34
+ * and the orphan-skip audit). At most one directive per line. */
35
+ export declare function collectNativeSkips(content: string, file: string): NativeSkip[];
36
+ /**
37
+ * Parse native scanner skip directives (`#checkov:skip=…`, `#tfsec:ignore:…`,
38
+ * `#trivy:ignore:…`) into the unified `Suppression` shape so they can be honoured
39
+ * and audited alongside `#infraweaver:ignore`. Native skips don't mandate a reason
40
+ * (their tools don't), so a synthetic one records the provenance. The rule is
41
+ * namespaced (`checkov:CKV_AWS_20`) so it matches a surviving concern's `rule_id`.
42
+ */
43
+ export declare function parseNativeSuppressions(content: string, file: string): ParsedSuppressions;
44
+ /**
45
+ * Native skips that NO concern corresponds to — the owning scanner already dropped
46
+ * the finding (or the rule never fired), so the skip is invisible to Infraweaver's
47
+ * gate and posture. Surfacing these keeps scanner-native suppressions auditable
48
+ * (a `#checkov:skip` can silently hide a real issue forever). A skip "matches" a
49
+ * concern when its rule matches (exact / bare / `:suffix`) AND the file is the same.
50
+ * Canonical cross-rule matching (a trivy skip vs a checkov concern for the *same*
51
+ * issue) is a future taxonomy refinement — see `taxonomy.ts`.
52
+ */
53
+ export declare function findOrphanNativeSkips(skips: NativeSkip[], concerns: Concern[]): NativeSkip[];
54
+ export interface NativeSkipAudit {
55
+ /** every native skip found in the scanned tree. */
56
+ skips: NativeSkip[];
57
+ /** the subset with no corresponding concern (the audit signal). */
58
+ orphans: NativeSkip[];
59
+ }
60
+ /**
61
+ * Walk a file list, collect native skips, and partition them against the scan's
62
+ * concern set. `read` returns a file's content or null (missing). Pure given its
63
+ * inputs, so it's unit-testable without a real tree.
64
+ */
65
+ export declare function auditNativeSkips(files: string[], concerns: Concern[], read: (relPath: string) => string | null): NativeSkipAudit;
66
+ export declare function parseSuppressionPolicy(raw: string, format: "yaml" | "json"): ParsedSuppressions;
67
+ export declare function loadSuppressionPolicy(cwd: string | undefined): ParsedSuppressions;
68
+ /**
69
+ * The suppression policy that APPLIES to this run.
70
+ *
71
+ * On a pull-request run the `suppressions:` block is read from the **base ref**,
72
+ * not the PR's head: a waiver is an accepted risk, and accepting it is exactly
73
+ * what the review is for. Letting a PR silence the finding that would otherwise
74
+ * block it is the self-approval hole the two-person SoD on waivers (§5.3) exists
75
+ * to close — this closes the file-shaped version of it. A PR that adds a waiver
76
+ * still sees the finding; the waiver applies from the next run on the merged base.
77
+ *
78
+ * Everything degrades to the head value with a warning when the base ref can't
79
+ * be read (shallow clone) or the run isn't a PR — stated, never silent.
80
+ */
81
+ export declare function loadSuppressionPolicyForRun(cwd: string | undefined): ParsedSuppressions;
82
+ export interface ApplySuppressionsOptions {
83
+ policy: Suppression[];
84
+ cwd: string;
85
+ now?: Date;
86
+ readFile?: (relPath: string) => string | null;
87
+ onWarn?: (warning: string) => void;
88
+ }
89
+ export declare function applySuppressions(concerns: Concern[], opts: ApplySuppressionsOptions): Concern[];
90
+ export declare function suppressConcerns(concerns: Concern[], cwd: string, now?: Date): Concern[];
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Cross-scanner canonical taxonomy (2c, v1).
3
+ *
4
+ * Different scanners flag the SAME real misconfiguration under different rule IDs
5
+ * — trivy `AVD-AWS-0088`, checkov `CKV_AWS_19` and tfsec
6
+ * `aws-s3-enable-bucket-encryption` are all "S3 bucket not encrypted". Without a
7
+ * mapping, that one issue surfaces as up-to-three findings. This module maps known
8
+ * rule IDs onto a canonical resource+misconfig class so the same issue at the same
9
+ * resource collapses into ONE finding tagged with every tool that caught it.
10
+ *
11
+ * v1 scope: a curated table of high-value AWS misconfigs (the long tail + non-AWS
12
+ * providers expand the table over time). The merge is conservative — it only
13
+ * collapses concerns that share a canonical class AND a file AND were reported by
14
+ * DIFFERENT tools, so two distinct same-tool resources in one file are never
15
+ * silently merged.
16
+ */
17
+ import { type Concern } from "#app/mcp/terraform/types";
18
+ export interface CanonicalClass {
19
+ /** stable id, e.g. "aws-s3-encryption". */
20
+ id: string;
21
+ /** short human title for the merged finding. */
22
+ title: string;
23
+ /** member rule IDs (bare, lowercased — no scanner namespace). */
24
+ rules: string[];
25
+ }
26
+ /** The curated taxonomy. Each entry's `rules` are the equivalent rule IDs across
27
+ * scanners. Keep `rules` lowercased + namespace-free; lookup normalises both. */
28
+ export declare const CANONICAL_CLASSES: readonly CanonicalClass[];
29
+ /** The canonical class id this concern maps to, or null when it isn't in the table. */
30
+ export declare function canonicalClassOf(concern: Concern): string | null;
31
+ /**
32
+ * Collapse cross-scanner duplicates. Concerns sharing a canonical class + file,
33
+ * reported by ≥2 DIFFERENT tools, merge into one (highest severity wins, the
34
+ * canonical title is used, `flagged_by` lists every contributing tool). Concerns
35
+ * with a class but only one tool are tagged (class + `flagged_by`) but kept
36
+ * separate; concerns with no canonical class pass through untouched. Input order
37
+ * is otherwise preserved.
38
+ */
39
+ export declare function dedupeCrossScanner(concerns: Concern[]): Concern[];
@@ -0,0 +1,47 @@
1
+ import type { LocalToolContext } from "#app/mcp/localContext";
2
+ /** The extension Terraform reserves for query configuration. */
3
+ export declare const TFQUERY_SUFFIX = ".tfquery.hcl";
4
+ /** True for a path Terraform would execute as a query configuration. */
5
+ export declare function isQueryFile(path: string): boolean;
6
+ /** One `list "<type>" "<name>" { … }` block — a declared intent to discover
7
+ * unmanaged resources of that type. */
8
+ export interface QueryListBlock {
9
+ /** the resource type being searched for, e.g. `google_compute_instance`. */
10
+ resourceType: string;
11
+ /** the query's local name, unique within the directory. */
12
+ name: string;
13
+ /** the `provider` argument as written — which provider configuration is
14
+ * queried. Null when absent (Terraform requires it; we report, not validate). */
15
+ provider: string | null;
16
+ /** the `limit` as written, or null when defaulted (Terraform's default is 100). */
17
+ limit: string | null;
18
+ /** whether the block asks for full resource bodies (`include_resource`). */
19
+ includeResource: boolean;
20
+ /** 1-based line of the block header. */
21
+ line: number;
22
+ }
23
+ export interface QueryFileInventory {
24
+ file: string;
25
+ lists: QueryListBlock[];
26
+ }
27
+ /** Parse one query file's `list` blocks. Pure. */
28
+ export declare function parseQueryFile(hcl: string): QueryListBlock[];
29
+ export interface QueryInventory {
30
+ files: QueryFileInventory[];
31
+ /** total `list` blocks across the tree. */
32
+ total: number;
33
+ /** distinct resource types being searched for, sorted. */
34
+ resourceTypes: string[];
35
+ }
36
+ /**
37
+ * Every query file under `cwd` and the `list` blocks it declares.
38
+ *
39
+ * Returns an inventory, never findings — see the module note. An unreadable file
40
+ * is skipped rather than reported: a query file we cannot read is a gap in the
41
+ * inventory, and inventing an entry for it would be worse than a shorter list.
42
+ */
43
+ export declare function collectQueryInventory(cwd: string): QueryInventory;
44
+ export declare const TerraformQueryInventoryParams: import("arktype/internal/variants/object.ts").ObjectType<object, {}>;
45
+ export declare function TerraformQueryInventoryTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<object, object>> & {
46
+ mutates?: boolean;
47
+ };
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Compromised-scanner gate (supply-chain phase 0.1).
3
+ *
4
+ * THE THREAT, CONCRETELY. In March 2026 the Trivy project was compromised
5
+ * (TeamPCP): a malicious **v0.69.4** was published across GHCR, ECR Public,
6
+ * Docker Hub, deb/rpm and `get.trivy.dev` on 19 Mar; 76 of 77 `trivy-action`
7
+ * tags and all 7 `setup-trivy` tags were repointed at infostealer commits;
8
+ * malicious 0.69.5 / 0.69.6 images followed on 22 Mar. The payload dumped
9
+ * runner memory and called home. Advisory: GHSA-69fq-xp46-6x23. Last clean
10
+ * release before the incident: 0.69.3.
11
+ *
12
+ * WHY THIS LIVES HERE. Infraweaver does not download the toolchain — it executes
13
+ * whatever `trivy`/`checkov`/`tflint` the customer's CI put on PATH, inside the
14
+ * customer's runner, alongside their credentials. So the registry-side controls
15
+ * that failed in this incident are not ours to fix; what we CAN do is refuse to
16
+ * execute a build we know is malicious. A scanner is the one subprocess whose
17
+ * output we trust, so running a known-backdoored one is the worst case for an
18
+ * attestation product: we would be both the execution vector and the notary.
19
+ *
20
+ * FAIL-CLOSED, NOT SKIP. Every other scanner problem here degrades to
21
+ * "skipped" (absent binary, unparseable output) because a missing tool must not
22
+ * block a run. A KNOWN-COMPROMISED tool is the opposite: continuing would mean
23
+ * knowingly executing malware, so this throws and the run stops.
24
+ */
25
+ /** A published release known to be malicious. */
26
+ interface CompromisedRelease {
27
+ /** Binary name as invoked (matches the `run()` command). */
28
+ tool: string;
29
+ /** Exact affected versions — never a range, so a fix release can't be caught. */
30
+ versions: readonly string[];
31
+ /** Advisory id to name in the failure message. */
32
+ advisory: string;
33
+ /** Shortest safe instruction for the operator. */
34
+ guidance: string;
35
+ }
36
+ /**
37
+ * The denylist. Deliberately EXACT versions: a range would sweep up the fixed
38
+ * release and turn a security control into an outage. Add an entry per advisory.
39
+ */
40
+ export declare const COMPROMISED_RELEASES: readonly CompromisedRelease[];
41
+ /**
42
+ * Extract a semantic version from a tool's `--version` output. Tools disagree
43
+ * wildly on format (`Version: 0.55.0`, `TFLint version 0.52.0`, a bare
44
+ * `3.2.0`), so take the first `x.y.z` that appears. Returns null when the output
45
+ * carries no recognisable version. Pure.
46
+ */
47
+ export declare function parseToolVersion(output: string): string | null;
48
+ /**
49
+ * The advisory matching a tool+version, or null when the pair is not known to be
50
+ * compromised. Pure — the whole decision is table-driven and testable without a
51
+ * subprocess.
52
+ */
53
+ export declare function compromisedRelease(tool: string, version: string | null): CompromisedRelease | null;
54
+ /** The operator-facing failure text for a compromised tool. Pure. */
55
+ export declare function compromisedToolMessage(rel: CompromisedRelease, version: string): string;
56
+ /** Reset the probe cache — tests only. */
57
+ export declare function resetToolVersionCache(): void;
58
+ /**
59
+ * Every tool version probed this process, sorted by tool name — the scanner
60
+ * half of the evidence bundle's PROVENANCE block (A.3). These are the versions
61
+ * the integrity gate actually observed before executing each scanner, so the
62
+ * signed bundle records the toolchain that genuinely ran — nothing is probed
63
+ * retroactively and nothing is fabricated for a tool that never ran. `null`
64
+ * means the tool ran a probe but printed no recognisable version.
65
+ */
66
+ export declare function probedToolVersions(): {
67
+ tool: string;
68
+ version: string | null;
69
+ }[];
70
+ /**
71
+ * Detect a tool's version by running `<tool> --version`. Returns null when the
72
+ * binary is absent or prints nothing recognisable (both are non-events — the
73
+ * caller's normal "skipped" path handles an absent tool).
74
+ */
75
+ export declare function detectToolVersion(tool: string, cwd: string): string | null;
76
+ /**
77
+ * Fail-closed gate: throws when `tool` on PATH is a known-compromised release.
78
+ * A no-op for an absent tool, an unknown version, or any tool with no advisory —
79
+ * this must never become a reason a clean run fails.
80
+ */
81
+ export declare function assertToolchainIntegrity(tool: string, cwd: string): void;
82
+ export {};