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,8 @@
1
+ /** Region these list prices were captured for. */
2
+ export declare const AZURE_PRICE_REGION = "westeurope";
3
+ /** Currency of every price below. */
4
+ export declare const AZURE_PRICE_CURRENCY = "EUR";
5
+ /** ISO date the snapshot was captured — surfaced in cost.md so staleness is visible. */
6
+ export declare const AZURE_PRICE_FETCHED_AT = "2026-07-25";
7
+ /** meter key → list price per HOUR. */
8
+ export declare const AZURE_HOURLY_PRICES: Record<string, number>;
@@ -0,0 +1,57 @@
1
+ import { type Concern, type Severity } from "#app/mcp/terraform/types";
2
+ export declare const BASELINE_FILENAME = ".infraweaver.baseline.json";
3
+ /** Findings at/above this severity fail the gate. High = high + critical. */
4
+ export declare const DEFAULT_GATE_SEVERITY: Severity;
5
+ export interface BaselineFile {
6
+ version: 1;
7
+ /** ISO date the baseline was taken (informational). */
8
+ created?: string;
9
+ /** line-independent concern keys (see `concernKeyOf`) present at baseline time. */
10
+ keys: string[];
11
+ }
12
+ /** The serialized baseline for the current concern set (what a `--write-baseline` emits). */
13
+ export declare function serializeBaseline(concerns: Concern[], created: string): BaselineFile;
14
+ /** Parse baseline JSON into a key set; tolerant of a malformed/old file (→ null). */
15
+ export declare function parseBaseline(raw: string): Set<string> | null;
16
+ /** Load `.infraweaver.baseline.json` under `cwd`; null when absent/unreadable/malformed. */
17
+ export declare function loadBaseline(cwd: string | undefined): Set<string> | null;
18
+ export interface LoadedBaseline {
19
+ keys: Set<string>;
20
+ /** ISO date the baseline was taken — the report's "since baseline (…)" label. */
21
+ created: string | null;
22
+ }
23
+ /** Load the baseline WITH its `created` date (the report's delta needs both the
24
+ * keys to diff against and the date to label the comparison). Null when
25
+ * absent/unreadable/malformed. `loadBaseline` stays the keys-only path the gate uses. */
26
+ export declare function loadBaselineWithMeta(cwd: string | undefined): LoadedBaseline | null;
27
+ export interface BaselineDelta {
28
+ /** active keys NOT in the baseline — new since the checkpoint. */
29
+ added: number;
30
+ /** baseline keys no longer present — cleared since the checkpoint. */
31
+ fixed: number;
32
+ /** keys in both — carried, unchanged. */
33
+ unchanged: number;
34
+ }
35
+ /**
36
+ * The new / fixed / unchanged split of the current ACTIVE concern set against a
37
+ * baseline checkpoint, keyed line-independently (`concernKeyOf`) so a line shift
38
+ * never reads as a fix or a regression. Pure — the report's "what changed" line.
39
+ */
40
+ export declare function baselineDelta(concerns: Concern[], baselineKeys: Set<string>): BaselineDelta;
41
+ export interface GateResult {
42
+ /** active concerns whose key is NOT in the baseline (or all, when no baseline). */
43
+ newConcerns: Concern[];
44
+ /** the new concerns at/above the gate severity — these fail the check. */
45
+ gating: Concern[];
46
+ /** true = the gate passes (no new finding at/above the gate severity). */
47
+ pass: boolean;
48
+ /** whether a baseline was supplied (false ⇒ every active concern is "new"). */
49
+ hasBaseline: boolean;
50
+ }
51
+ /**
52
+ * Evaluate the gate. `concerns` should already be the ACTIVE set (suppressed
53
+ * concerns excluded — a suppression keeps a finding out of the gate by design).
54
+ * With no baseline (`baselineKeys` null) every active concern counts as new, so
55
+ * the gate behaves as a plain High/Critical gate.
56
+ */
57
+ export declare function evaluateGate(concerns: Concern[], baselineKeys: Set<string> | null, threshold?: Severity): GateResult;
@@ -0,0 +1,38 @@
1
+ import type { LocalToolContext } from "#app/mcp/localContext";
2
+ import { annotateGroups, planBatches } from "#app/mcp/terraform/decisions";
3
+ import { type Concern, type Severity } from "#app/mcp/terraform/types";
4
+ export interface ConcernResult {
5
+ /** non-suppressed concerns ≥ threshold, sorted */
6
+ active: Concern[];
7
+ /** concerns that matched a suppression rule */
8
+ suppressed: Concern[];
9
+ /** active ∪ suppressed (post-suppression annotation) — scan stores this as lastScanConcerns */
10
+ annotated: Concern[];
11
+ groups: ReturnType<typeof annotateGroups>;
12
+ batchPlan: ReturnType<typeof planBatches>;
13
+ bySeverity: Record<string, number>;
14
+ }
15
+ /**
16
+ * The shared concerns→result pipeline behind `terraform_scan` and `read_findings`:
17
+ * capture the line-pinned + line-independent baseline (so verify's regression diff
18
+ * is apples-to-apples), filter to in-scope Terraform concerns ≥ threshold, apply
19
+ * suppressions, group + annotate autonomy, plan batches, and tally by severity.
20
+ * Both tools then wrap their own envelope around this. The diff-scope predicate is
21
+ * `scan`-only (defaults to "everything in scope"); `lastScanConcerns` is written by
22
+ * `scan` from `annotated`, not here, since `read_findings` does not set it.
23
+ */
24
+ export declare function buildConcernResult(ctx: LocalToolContext, rawConcerns: Concern[], opts: {
25
+ cwd: string;
26
+ minRank: number;
27
+ grouping: "file" | "rule";
28
+ autonomyThreshold: Severity;
29
+ inScope?: (c: Concern) => boolean;
30
+ /** How this call affects the session's verify baseline. `replace` (default)
31
+ * is for the full-workspace sources (`scan`, `read_findings`). The narrow
32
+ * concern sources (`detect_plan_drift`, `ingest_external_findings`) pass
33
+ * `merge`: their small set must JOIN an existing scan baseline, not clobber
34
+ * it — otherwise a later `terraform_verify_remediation` diffs the full
35
+ * re-scan against the narrow set and reports every pre-existing scanner
36
+ * concern as a false regression. */
37
+ baselineMode?: "replace" | "merge";
38
+ }): ConcernResult;
@@ -0,0 +1,55 @@
1
+ import { type RunResult } from "#app/mcp/terraform/subprocess";
2
+ export interface CostBreakdown {
3
+ /** total estimated monthly cost, or null when no resources are priced. */
4
+ totalMonthlyCost: number | null;
5
+ currency: string;
6
+ }
7
+ /**
8
+ * Parse `infracost breakdown --format json`. The top-level `totalMonthlyCost`
9
+ * is a decimal string (absent / null when a project has no priced resources);
10
+ * `currency` defaults to USD. A missing/unparseable cost becomes null so the
11
+ * caller reports "unpriced" rather than a misleading $0.00.
12
+ */
13
+ export declare function parseInfracostBreakdown(stdout: string): CostBreakdown;
14
+ export interface ResourceCost {
15
+ name: string;
16
+ monthlyCost: number;
17
+ }
18
+ /**
19
+ * Parse the per-resource monthly costs from `infracost breakdown --format json`
20
+ * (`projects[].breakdown.resources[]`), so a cost increase can be attributed to
21
+ * the specific resources that drove it instead of just a total. Skips unpriced
22
+ * (null/zero) resources; returns them sorted most-expensive first. Pure.
23
+ */
24
+ export declare function parseInfracostResources(stdout: string): ResourceCost[];
25
+ export interface CostDelta {
26
+ currency: string;
27
+ baselineMonthly: number | null;
28
+ currentMonthly: number | null;
29
+ /** current − baseline, rounded to cents; null when either side is unknown. */
30
+ deltaMonthly: number | null;
31
+ direction: "increase" | "decrease" | "no-change" | "unknown";
32
+ }
33
+ /** Pure cost-delta computation: current (post-fix) vs the base-branch baseline. */
34
+ export declare function computeCostDelta(baseline: CostBreakdown | null, current: CostBreakdown): CostDelta;
35
+ export interface CostEscalation {
36
+ /** true when the monthly increase meets/exceeds the operator's threshold. */
37
+ escalate: boolean;
38
+ reason?: string;
39
+ }
40
+ /**
41
+ * decide whether a cost increase is large enough to escalate the PR
42
+ * to human review (`needs-human`). Compares the monthly delta against the
43
+ * operator's `cost_increase_block_usd` threshold. No threshold set, an unknown
44
+ * delta, or a decrease/no-change ⇒ no escalation. Pure + deterministic so the
45
+ * decision is auditable, not a model judgement.
46
+ */
47
+ export declare function classifyCostEscalation(deltaMonthly: number | null, thresholdUsd: number | undefined): CostEscalation;
48
+ export declare function runInfracostBreakdown(scanCwd: string, key: string): RunResult;
49
+ /**
50
+ * Cost of the base-branch version of the same Terraform, computed in a detached
51
+ * git worktree so the current (fixed) checkout is never disturbed. Best-effort:
52
+ * any failure (no base ref, worktree add fails, infracost errors) returns null
53
+ * and the caller falls back to reporting current cost only.
54
+ */
55
+ export declare function infracostBaseline(cwd: string, key: string, tmpdir: string): CostBreakdown | null;
@@ -0,0 +1,80 @@
1
+ import { type Concern, type Severity } from "#app/mcp/terraform/types";
2
+ declare const ExternalFinding: import("arktype/internal/variants/object.ts").ObjectType<{
3
+ rule_id: string;
4
+ provider?: string;
5
+ severity?: string;
6
+ title?: string;
7
+ message?: string;
8
+ remediation?: string;
9
+ resource?: {
10
+ address?: string;
11
+ type?: string;
12
+ name?: string;
13
+ id?: string;
14
+ arn?: string;
15
+ tags?: string[];
16
+ };
17
+ }, {}>;
18
+ export declare const ExternalFindingsFile: import("arktype/internal/variants/object.ts").ObjectType<{
19
+ schema?: string;
20
+ findings: {
21
+ rule_id: string;
22
+ provider?: string;
23
+ severity?: string;
24
+ title?: string;
25
+ message?: string;
26
+ remediation?: string;
27
+ resource?: {
28
+ address?: string;
29
+ type?: string;
30
+ name?: string;
31
+ id?: string;
32
+ arn?: string;
33
+ tags?: string[];
34
+ };
35
+ }[];
36
+ }, {}>;
37
+ export type ExternalFinding = typeof ExternalFinding.infer;
38
+ /** True for a parsed object that looks like an external-findings feed (vs a SARIF or
39
+ * reviewer findings.json), so a dispatcher can route it. */
40
+ export declare function isExternalFindings(parsed: unknown): boolean;
41
+ export interface TfResourceEntry {
42
+ /** `type.name` — the Terraform address of the block. */
43
+ address: string;
44
+ type: string;
45
+ name: string;
46
+ file: string;
47
+ /** 1-based line of the `resource "type" "name" {` header. */
48
+ line: number;
49
+ /** String-literal values inside the block body (bucket names, tags, ids) — the
50
+ * values a CSPM alert's cloud id / ARN is correlated against. Lower-cased. */
51
+ identifiers: string[];
52
+ }
53
+ /** Build a line-aware index of every `resource` block across the given `.tf` files. */
54
+ export declare function indexTfResources(files: ReadonlyArray<{
55
+ file: string;
56
+ hcl: string;
57
+ }>): TfResourceEntry[];
58
+ /** Correlate one external finding to a resource block, best key first. Returns the
59
+ * matched entry, or null when the alert can't be tied to code. */
60
+ export declare function matchResource(finding: ExternalFinding, index: TfResourceEntry[]): TfResourceEntry | null;
61
+ /** Why an alert couldn't be mapped to a resource in code (for honest reporting). */
62
+ export interface UnmappedFinding {
63
+ rule_id: string;
64
+ provider: string | null;
65
+ resource: ExternalFinding["resource"] | null;
66
+ reason: string;
67
+ }
68
+ export interface MappedExternalFindings {
69
+ concerns: Concern[];
70
+ unmapped: UnmappedFinding[];
71
+ }
72
+ /** Normalise an external severity string (word or numeric CVSS) to our scale. */
73
+ export declare function normalizeExternalSeverity(raw: string | undefined): Severity;
74
+ /**
75
+ * Turn a batch of external findings into `reviewer`-source concerns by mapping each
76
+ * to its Terraform resource. Unmappable alerts are returned separately so the caller
77
+ * can report them honestly rather than drop them.
78
+ */
79
+ export declare function mapExternalFindings(findings: ReadonlyArray<ExternalFinding>, index: TfResourceEntry[]): MappedExternalFindings;
80
+ export {};
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Version currency (provider currency / module upgrades).
3
+ *
4
+ * Answers one question the scanners can't: "is a NEWER version available?"
5
+ * tflint checks that versions are *pinned*; nothing we run checks that they're
6
+ * *current*. This module compares the workspace's pinned provider requirements
7
+ * and registry-module pins against the Terraform Registry's published versions.
8
+ *
9
+ * Deliberately NOT a scanner source: results are advisory intelligence the
10
+ * Remediate mode turns into `chore(deps)` upgrade PRs, not `Concern`s — the
11
+ * finding baseline stays scanner-owned (see docs/workplan/04-implementation-plan.md).
12
+ *
13
+ * Degrades green everywhere: a per-source lookup failure is reported on that
14
+ * row (`lookup: "error" | "not_found" | "unsupported_source"`), and only a
15
+ * fully-unreachable registry (every lookup failed) becomes a tool-level skip.
16
+ */
17
+ export declare const DEFAULT_REGISTRY_BASE_URL = "https://registry.terraform.io";
18
+ /**
19
+ * Convert ONE Terraform version constraint string (comma-separated comparators,
20
+ * AND semantics) into an npm semver range, or null when any comparator is
21
+ * unparseable. `~>` is Terraform's pessimistic operator: the RIGHTMOST given
22
+ * component may float (`~> 5.0` → `>=5.0.0 <6.0.0`, `~> 5.1.2` → `>=5.1.2 <5.2.0`,
23
+ * `~> 5` → `>=5.0.0 <6.0.0`). `!=` comparators have no single-range npm
24
+ * equivalent and are skipped — acceptable here because the result only ranks
25
+ * candidate versions, it never selects what gets installed.
26
+ */
27
+ export declare function terraformConstraintToRange(constraint: string): string | null;
28
+ export interface CurrencyVerdict {
29
+ /** newest stable version the registry publishes (null: nothing published). */
30
+ latest: string | null;
31
+ /** newest published version the written constraint admits (null: no
32
+ * constraint, unparseable constraint, or nothing satisfies). */
33
+ newestSatisfying: string | null;
34
+ /** true when the registry has a stable version the constraint does NOT admit
35
+ * — i.e. an upgrade PR is available. Always false without a constraint. */
36
+ outdated: boolean;
37
+ /** how many MAJORs the constraint's best version trails the latest by —
38
+ * >0 signals an interface-risk upgrade that must be `needs-human`. */
39
+ majorsBehind: number;
40
+ }
41
+ export declare function classifyCurrency(params: {
42
+ constraint: string | null;
43
+ available: string[];
44
+ }): CurrencyVerdict;
45
+ export type LookupStatus = "ok" | "not_found" | "error" | "unsupported_source";
46
+ /** strip a leading default-registry host; reject other hosts (private/TFE
47
+ * registries use different auth + paths — out of scope for the public check). */
48
+ export declare function normalizeRegistryPath(base: string, expectedSegments: number): string | null;
49
+ /**
50
+ * One registry GET that returns parsed JSON or a per-lookup status. Shared by
51
+ * the version-currency lookups here and the registry module-detail/search
52
+ * lookups in `./registry.ts` so every registry call degrades green identically:
53
+ * 404 → `not_found`, network/non-2xx/parse failure → `error`. `headers` carries
54
+ * the `Authorization: Bearer …` token for a private-registry call (public default
55
+ * registry calls pass none).
56
+ */
57
+ export declare function fetchRegistryJson(url: string, headers?: Record<string, string>): Promise<{
58
+ status: LookupStatus;
59
+ body: unknown;
60
+ }>;
61
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
62
+ /** GET /v1/providers/{namespace}/{type}/versions — provider release list. */
63
+ export declare function fetchProviderVersions(source: string, opts?: {
64
+ baseUrl?: string;
65
+ }): Promise<{
66
+ status: LookupStatus;
67
+ versions: string[];
68
+ }>;
69
+ /** GET /v1/modules/{namespace}/{name}/{provider}/versions — registry-module
70
+ * release list (the response nests per-module records; the first is the
71
+ * requested module, the rest are dependency records we don't want). */
72
+ export declare function fetchModuleVersions(sourceBase: string, opts?: {
73
+ baseUrl?: string;
74
+ }): Promise<{
75
+ status: LookupStatus;
76
+ versions: string[];
77
+ }>;
78
+ export interface ProviderCurrencyRow {
79
+ name: string;
80
+ source: string;
81
+ constraint: string | null;
82
+ latest: string | null;
83
+ newest_satisfying: string | null;
84
+ outdated: boolean;
85
+ majors_behind: number;
86
+ lookup: LookupStatus;
87
+ }
88
+ export interface ModuleCurrencyRow {
89
+ name: string;
90
+ source: string;
91
+ version: string | null;
92
+ latest: string | null;
93
+ newest_satisfying: string | null;
94
+ outdated: boolean;
95
+ /** registry module with no `version` attribute — pin it (to `latest`). */
96
+ unpinned: boolean;
97
+ lookup: LookupStatus;
98
+ declared_in: string;
99
+ }
100
+ export interface CurrencyReport {
101
+ providers: ProviderCurrencyRow[];
102
+ modules: ModuleCurrencyRow[];
103
+ outdated_count: number;
104
+ unpinned_count: number;
105
+ lookups_attempted: number;
106
+ lookups_failed: number;
107
+ }
108
+ export declare function checkVersionCurrency(cwd: string, opts?: {
109
+ baseUrl?: string;
110
+ }): Promise<CurrencyReport>;
@@ -0,0 +1,178 @@
1
+ import type { CostDelta } from "#app/mcp/terraform/cost";
2
+ import { type Autonomy, type BlastTier, type Concern, type ConcernGroup, type Severity } from "#app/mcp/terraform/types";
3
+ /** group concerns by file into scoped units, sorted by max severity. */
4
+ export declare function groupConcerns(concerns: Concern[]): ConcernGroup[];
5
+ /**
6
+ * group concerns by RULE across files instead of by file. When a single
7
+ * rule fires in many files ("add `tags` to every resource", "enable encryption
8
+ * on every bucket"), fixing it as ONE coherent change is far better than N
9
+ * near-identical per-file PRs. Each group covers one `rule_id` and lists every
10
+ * `file` it spans; the branch key (`remediate/<id>`) is rule-derived and stable.
11
+ * Opt-in (scan `group_by: "rule"`) — by-file stays the default because it keeps
12
+ * each PR's blast radius smaller; by-rule suits sweeping, low-risk rules.
13
+ */
14
+ export declare function groupConcernsByRule(concerns: Concern[]): ConcernGroup[];
15
+ /**
16
+ * annotate each group with an autonomy decision. Works for BOTH grouping
17
+ * modes: it resolves a group's concerns by `concern_ids` membership (not by
18
+ * `file`, which is just a label for by-rule groups), so the severity/category
19
+ * policy applies identically. Blast radius isn't known until terraform_plan
20
+ * runs, so it can only escalate a group later (the plan tool + prompt apply the
21
+ * `high`-blast override); at scan time autonomy is severity/category-driven.
22
+ */
23
+ export declare function annotateGroups(groups: ConcernGroup[], all: Concern[], threshold: Severity): ConcernGroup[];
24
+ export interface BatchPlan {
25
+ /** group ids safe to combine into ONE low-risk PR (`remediate/batch-<hash>`). */
26
+ batchable: string[];
27
+ /** group ids that must each get their own PR (security / higher severity /
28
+ * needs-human / large blast). */
29
+ isolated: string[];
30
+ /** deterministic branch name for the batch (stable for the same member set). */
31
+ batch_branch: string | null;
32
+ }
33
+ /**
34
+ * split annotated groups into a single low-risk BATCH (merged into one
35
+ * easy-to-review PR) and the riskier groups that each stay ISOLATED in their own
36
+ * PR (so they can be reviewed/reverted independently). The batch branch name
37
+ * hashes the sorted member ids, so re-runs over the same set reuse the branch
38
+ * (idempotent). Returns `batch_branch: null` when fewer than two groups are
39
+ * batchable (one group is just a normal single-group PR, not a batch).
40
+ */
41
+ export declare function planBatches(groups: ConcernGroup[]): BatchPlan;
42
+ /**
43
+ * Resolve the canonical documentation URL for a concern's rule, for the PR's
44
+ * per-finding explanation. Prefers the scanner's own `remediation_hint` when it
45
+ * is already a URL (checkov guideline, tflint rule link, trivy reference).
46
+ * Otherwise derives the well-known page deterministically: a trivy `AVD-*` rule
47
+ * maps to its Aqua Vulnerability Database page. Returns null when no canonical
48
+ * URL is known (the agent then explains from `evidence` alone).
49
+ */
50
+ export declare function ruleDocUrl(concern: Pick<Concern, "rule_id" | "remediation_hint">): string | null;
51
+ /** distinct rule→doc-url map for a group, for the PR body's per-finding links. */
52
+ export declare function docUrlsForGroup(g: ConcernGroup, all: Concern[]): Record<string, string>;
53
+ export interface AutonomyDecision {
54
+ autonomy: Autonomy;
55
+ /** human-readable reasons a group was escalated (empty for `auto`). */
56
+ reasons: string[];
57
+ }
58
+ /**
59
+ * Decide whether a group of concerns can be auto-fixed and opened as a normal
60
+ * PR (`auto`), or must be flagged for human review (`needs-human`). Trivial
61
+ * findings (style/correctness, deprecated args, missing tags, formatting) open
62
+ * as normal; high-severity SECURITY findings escalate by default, as does a
63
+ * `high` blast radius regardless of finding severity (overrides upward).
64
+ *
65
+ * `threshold` is the minimum severity at which a *security* concern escalates
66
+ * (default `high`, so critical/high security → human; medium/low → auto). The
67
+ * decision is deterministic and computed from the `Concern` model's existing
68
+ * `severity` + `category` — no model self-assessment.
69
+ */
70
+ export declare function classifyAutonomy(concerns: Pick<Concern, "severity" | "category">[], threshold?: Severity, blastTier?: BlastTier): AutonomyDecision;
71
+ export interface SuggestionDecision {
72
+ /** true ⇒ post a GitHub one-click `suggestion` instead of opening a full PR. */
73
+ suggest: boolean;
74
+ reason: string;
75
+ }
76
+ /**
77
+ * decide whether a fix is small/low-risk enough to post as a GitHub
78
+ * one-click **suggested change** (a ` ```suggestion ` block on the existing PR)
79
+ * rather than opening a whole `remediate/*` branch + PR. Much lower friction for
80
+ * trivial fixes. Only when ALL hold: there IS an existing PR context (a comment
81
+ * trigger on a PR); the group is `low`/`info` severity; the fix is a single hunk
82
+ * in a single file; and the blast radius (when known) is `low`. Anything bigger
83
+ * keeps full-PR mode.
84
+ */
85
+ export declare function shouldSuggestInline(opts: {
86
+ hasPrContext: boolean;
87
+ severity: Severity;
88
+ fileCount: number;
89
+ hunkCount: number;
90
+ blastTier?: BlastTier | undefined;
91
+ }): SuggestionDecision;
92
+ export type Confidence = "high" | "medium" | "low";
93
+ export interface ConfidenceSignals {
94
+ /** every targeted concern id was cleared by the re-scan. */
95
+ verified: boolean;
96
+ /** count of NEW concern ids the fix introduced (0 is good). */
97
+ regressionCount: number;
98
+ /** second plan matched the first. undefined when plan didn't run. */
99
+ idempotent?: boolean | undefined;
100
+ /** blast tier. undefined when plan didn't run. */
101
+ blastTier?: BlastTier | undefined;
102
+ /** cost direction. undefined when infracost didn't run. */
103
+ costDirection?: CostDelta["direction"] | undefined;
104
+ }
105
+ export interface ConfidenceResult {
106
+ level: Confidence;
107
+ reasons: string[];
108
+ }
109
+ /**
110
+ * Derive a fix's confidence DETERMINISTICALLY from the verification evidence
111
+ * already gathered — never a model self-assessment, which keeps it honest.
112
+ *
113
+ * - A fix that didn't verify or introduced a regression is `low`:
114
+ * the proof failed, full stop.
115
+ * - Otherwise it starts `high` and is capped to `medium` by any weaker signal:
116
+ * a non-deterministic plan (`idempotent: false`), a `high` blast radius,
117
+ * a cost increase, or a signal that was *skipped* (plan /
118
+ * infracost didn't run, so we have less proof — `high` requires the full
119
+ * stack). A skipped signal lowers confidence but does not, by itself, make a
120
+ * verified, regression-free fix `low`.
121
+ */
122
+ export declare function computeConfidence(signals: ConfidenceSignals): ConfidenceResult;
123
+ export interface RefusalDecision {
124
+ /** true ⇒ this concern needs a human decision; prefer a structured non-fix
125
+ * (an issue) over guessing a fix that could break the stack. */
126
+ refuse: boolean;
127
+ reason?: string;
128
+ }
129
+ /**
130
+ * advisory check: would auto-fixing this concern require a judgement only
131
+ * a human can make? If so, the Remediate flow should post a STRUCTURED refusal
132
+ * (an issue describing the concern, why it won't auto-fix, and what a human
133
+ * should do) rather than guess a fix that could break the stack. Deterministic
134
+ * and conservative — it only flags the well-known human-decision classes.
135
+ */
136
+ export declare function classifyRefusal(concern: Pick<Concern, "rule_id" | "evidence">): RefusalDecision;
137
+ /**
138
+ * format a structured non-fix for a concern Infraweaver won't auto-fix. The
139
+ * output is a Markdown issue body: what's wrong, why it isn't auto-fixed, and
140
+ * the concrete next step for a human. Pure (string in → string out).
141
+ */
142
+ export declare function buildRefusalReport(input: {
143
+ concern: Pick<Concern, "rule_id" | "evidence" | "location">;
144
+ whyNoAutoFix: string;
145
+ humanAction: string;
146
+ }): string;
147
+ export interface PreventiveControl {
148
+ /** the mechanism that stops this class of concern recurring. */
149
+ mechanism: string;
150
+ /** a copy-pasteable config/CI snippet. */
151
+ snippet: string;
152
+ note: string;
153
+ }
154
+ /**
155
+ * alongside the patch, suggest the guardrail that stops the concern
156
+ * RECURRING: a CI gate keyed on the producing scanner. Deterministic by source
157
+ * (the scanner is the right enforcement point), parameterised by the rule id.
158
+ * Returns null for sources with no natural preventive gate.
159
+ */
160
+ export declare function preventiveControlFor(concern: Pick<Concern, "source" | "rule_id">): PreventiveControl | null;
161
+ export interface LocationCluster {
162
+ file: string;
163
+ line: number | null;
164
+ /** the concern ids at this exact location (likely the same underlying defect). */
165
+ concern_ids: string[];
166
+ /** the distinct scanners that flagged this location. */
167
+ sources: string[];
168
+ }
169
+ /**
170
+ * surface concerns that DIFFERENT scanners flagged at the same `file:line`
171
+ * — almost always the same underlying defect (trivy ∩ checkov overlap heavily on
172
+ * e.g. S3 encryption). Reported so the agent writes ONE canonical fix + ONE
173
+ * explanation for the cluster rather than treating each as separate work. This
174
+ * is purely advisory: it NEVER removes a concern from the verification set (a
175
+ * missing id must still provably clear), so it can't drop a real finding. Only
176
+ * clusters spanning more than one scanner are returned.
177
+ */
178
+ export declare function clusterByLocation(concerns: Concern[]): LocationCluster[];
@@ -0,0 +1,100 @@
1
+ /**
2
+ * §5.16 (first half) — the eIDAS assurance-level declaration.
3
+ *
4
+ * WHAT PROBLEM THIS SOLVES TODAY. The evidence bundle carries
5
+ * `signature: { algorithm: "ed25519", … }`, and a reader in a procurement or
6
+ * audit context can very reasonably over-read that as a legal seal. Under
7
+ * eIDAS (Reg. (EU) 910/2014 as amended by 2024/1183) an *electronic seal* is a
8
+ * defined legal instrument with three tiers, and ours is at the bottom one:
9
+ *
10
+ * - **simple** — data attached to other data to ensure origin and integrity.
11
+ * A raw Ed25519 signature over the bytes is exactly this, and no more.
12
+ * - **advanced** (Art. 36) — additionally uniquely linked to, and capable of
13
+ * identifying, the creating legal person, using seal-creation data that
14
+ * person controls. That requires a certificate binding the key to an
15
+ * identity; a bare public key in a JSON file binds it to nobody.
16
+ * - **qualified** (Art. 35) — an advanced seal created by a qualified
17
+ * seal-creation device with a **qualified certificate** from a QTSP on the
18
+ * EU Trusted List. Only this tier gets the Art. 35(2) presumption of
19
+ * integrity and correctness of origin.
20
+ *
21
+ * Art. 41's qualified electronic **time stamp** is a separate qualified service
22
+ * again, and is what gives a presumption about the *date and time*.
23
+ *
24
+ * SO THE BUNDLE SAYS SO, IN MACHINE-READABLE FORM. This block is not a
25
+ * disclaimer in prose that a parser skips — it is a field with a closed
26
+ * vocabulary, inside the signed bytes, that a buyer's tooling can assert on.
27
+ * Declaring a limit precisely is worth more than implying a capability we do
28
+ * not have, and this is the same correction the `suppressions` block made: the
29
+ * human-readable report and the signed artifact must not disagree about what a
30
+ * claim covers.
31
+ *
32
+ * ⚠️ WHAT IS DELIBERATELY NOT HERE. No ASiC-E container, no CAdES-LTA, no
33
+ * RFC 3161 timestamping, no QTSP integration. Those are the rest of §5.16 and
34
+ * they are blocked on a commercial and legal step — onboarding with a qualified
35
+ * trust service provider — that has not started. Building seal machinery we
36
+ * cannot exercise against a real QTSP would produce artifacts nobody can
37
+ * verify, and in an attestation product an unverifiable seal is worse than no
38
+ * seal. What this module does instead is make the CURRENT claim exact, and give
39
+ * the future qualified seal a schema slot to land in without a breaking change:
40
+ * `level` gains `"advanced"` / `"qualified"` and the optional fields fill in.
41
+ *
42
+ * Pure — no I/O, no ambient reads.
43
+ */
44
+ import type { SignatureMetadata } from "#app/mcp/terraform/signing";
45
+ /**
46
+ * The eIDAS electronic-seal tier this bundle's signature actually reaches.
47
+ * A closed vocabulary so a consumer can branch on it rather than parse prose.
48
+ *
49
+ * `"none"` is distinct from `"simple"` and is not a synonym for it: an unsigned
50
+ * bundle has no integrity protection at all, whereas a `"simple"` seal really
51
+ * does prove the bytes have not changed. Collapsing the two would understate a
52
+ * signed bundle and overstate an unsigned one.
53
+ */
54
+ export type EidasSealLevel = "none" | "simple" | "advanced" | "qualified";
55
+ export interface EidasSeal {
56
+ level: EidasSealLevel;
57
+ /** the precise claim this level supports. */
58
+ asserts: string;
59
+ /** the claim a reader might infer that this level does NOT support. Always
60
+ * present — the whole point of the block is the second half. */
61
+ does_not_assert: string;
62
+ /**
63
+ * True only for `"qualified"`: whether Art. 35(2)'s presumption of integrity
64
+ * and of correctness of origin applies. Stated explicitly rather than left to
65
+ * be inferred from `level`, because that presumption is the entire commercial
66
+ * difference between the tiers.
67
+ */
68
+ eu_presumption: boolean;
69
+ /**
70
+ * The qualified trust service provider that issued the seal certificate, and
71
+ * its EU Trusted List entry. Absent until §5.16's QTSP onboarding completes —
72
+ * and its absence is itself the honest signal that no QTSP is involved.
73
+ */
74
+ qtsp?: {
75
+ name: string;
76
+ trusted_list_url: string;
77
+ };
78
+ /** Art. 41 qualified electronic time stamp, when one has been obtained.
79
+ * Absent today: we apply no timestamp of any kind, qualified or not. */
80
+ timestamp?: {
81
+ authority: string;
82
+ obtained_at: string;
83
+ token_path: string;
84
+ };
85
+ }
86
+ /**
87
+ * Declare the eIDAS assurance level for a bundle, from its signature metadata.
88
+ *
89
+ * Derived from what is actually present rather than configured, so the
90
+ * declaration cannot drift from reality: there is no input that makes an
91
+ * unsigned bundle claim a seal, and no way to assert `qualified` without the
92
+ * QTSP fields that do not yet exist.
93
+ */
94
+ export declare function eidasSealFor(signature: SignatureMetadata | null): EidasSeal;
95
+ /**
96
+ * Whether a level may claim the Art. 35(2) presumption. Only `"qualified"` may,
97
+ * and today nothing produces that level — this exists so the invariant is
98
+ * asserted in one place rather than re-derived when the QTSP work lands.
99
+ */
100
+ export declare function grantsEuPresumption(level: EidasSealLevel): boolean;