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,343 @@
1
+ import { TOOL_NAME } from "#app/brand";
2
+ import { type AssessmentScorecard, type AssessWaiver } from "#app/mcp/assess";
3
+ import { type CrosswalkReport } from "#app/mcp/crosswalk";
4
+ import type { LocalToolContext } from "#app/mcp/localContext";
5
+ import { type EidasSeal } from "#app/mcp/terraform/eidas";
6
+ import { type IdleFloorReport } from "#app/mcp/terraform/idleFloor";
7
+ import type { DriftEvidenceStatement } from "#app/mcp/terraform/planDrift";
8
+ import { type ModuleProvenance } from "#app/mcp/terraform/refactor";
9
+ import { type SignatureMetadata } from "#app/mcp/terraform/signing";
10
+ import type { UpgradeEvidenceStatement } from "#app/mcp/terraform/transformPacks";
11
+ import { type Concern } from "#app/mcp/terraform/types";
12
+ import { type VerificationStatus, type VerificationSummary } from "#app/mcp/terraform/verification";
13
+ /**
14
+ * Backend-free compliance evidence bundle (the WS4a wedge — an auditor-facing
15
+ * artifact the OSS action can emit with **zero cloud and no backend**, committed
16
+ * to a `compliance/` path). It packages the read-only assessment — posture,
17
+ * per-control statements with their five-status verdict ([[verification]]), the
18
+ * crosswalk index, and the scanner coverage — into one deterministic JSON file.
19
+ *
20
+ * SCHEMA / HONESTY: this is Infraweaver's OWN structured schema, NOT OSCAL. A
21
+ * strict OSCAL (or compliance-trestle / C2P) emitter is a deliberate follow-up,
22
+ * gated on a buyer who actually needs OSCAL — emitting OSCAL nobody consumes is
23
+ * cost without value. The bundle is INDICATIVE alignment guidance, never an audit
24
+ * verdict, and it never claims `pass` for an unfired control (absence of a
25
+ * finding is not proof). Pure builder + a thin file-writing tool.
26
+ */
27
+ export declare const EVIDENCE_SCHEMA: "infraweaver-evidence/v0.8";
28
+ export declare const DEFAULT_EVIDENCE_PATH = "compliance/infraweaver-evidence.json";
29
+ export interface EvidenceControlStatement {
30
+ concern_id: string;
31
+ /** line-independent anchor (sha1(source|rule|file), see `concernKeyOf`) — the
32
+ * stable deep-link key into this bundle: a dashboard finding carries the same
33
+ * key, so its entry here is locatable even after a fix shifts line numbers.
34
+ * Absent when the backing concern wasn't supplied to the builder. */
35
+ concern_key?: string | undefined;
36
+ rule_id: string;
37
+ /** the five-status verdict for this statement (fail / not-code-verifiable). */
38
+ status: VerificationStatus;
39
+ severity?: string | undefined;
40
+ file?: string | undefined;
41
+ line?: number | null | undefined;
42
+ controls: {
43
+ framework: string;
44
+ control: string;
45
+ title: string;
46
+ }[];
47
+ }
48
+ /**
49
+ * A refactor's evidence statement — emitted only for a refactor run. Carries the
50
+ * verdict, the equivalence sub-results that BACK it (when a keys-free proof ran),
51
+ * the adopted-module provenance, and — per §8 — BOTH what it asserts and what it
52
+ * explicitly does NOT. A `proposed-unproven` verdict (a b.4 third-party adoption
53
+ * shipped without a plan) asserts nothing about runtime behaviour.
54
+ */
55
+ export interface EvidenceRefactorStatement {
56
+ verdict: "equivalence-proven" | "equivalence-failed" | "proposed-unproven";
57
+ equivalence?: {
58
+ resource_set_preserved: boolean;
59
+ arguments_preserved: boolean;
60
+ moves_exhaustive: boolean;
61
+ moves_detected: number;
62
+ uncovered_moves: number;
63
+ validate_passed: boolean;
64
+ fmt_clean: boolean;
65
+ } | undefined;
66
+ /** every external module the config adopts, with its pinned version (provenance
67
+ * discipline — the analog to a SHA-pinned action). */
68
+ module_provenance: ModuleProvenance[];
69
+ /** true when the change is proposed but unproven — the unmissable b.4 marker. */
70
+ proposed_unproven: boolean;
71
+ asserts: string;
72
+ does_not_assert: string;
73
+ }
74
+ /**
75
+ * The §5.19 cost statement: the credential-free IDLE FLOOR — what this
76
+ * configuration bills at zero traffic — with the same asserts/does_not_assert
77
+ * honesty pair the refactor statement carries. Deliberately NOT a monthly total:
78
+ * usage-dependent lines are not derivable from Terraform, so the floor is the
79
+ * only cost figure this bundle is willing to sign.
80
+ */
81
+ export interface EvidenceCostStatement {
82
+ /** Currency of every figure below (from the bundled price snapshot). */
83
+ currency: string;
84
+ /** Cloud region the list prices were captured for. */
85
+ region: string;
86
+ /** ISO date the bundled price snapshot was captured — makes staleness visible. */
87
+ priced_at: string;
88
+ /** Monthly cost that accrues at zero traffic. */
89
+ monthly_floor: number;
90
+ /** One entry per resource contributing to the floor. */
91
+ resources: {
92
+ address: string;
93
+ resource_type: string;
94
+ file: string;
95
+ line: number;
96
+ monthly_cost: number;
97
+ }[];
98
+ /** Catalogued resources left unpriced because their tier was not identifiable
99
+ * — the signed floor is a lower bound by exactly these. */
100
+ unpriced: {
101
+ address: string;
102
+ resource_type: string;
103
+ file: string;
104
+ line: number;
105
+ reason: string;
106
+ }[];
107
+ asserts: string;
108
+ does_not_assert: string;
109
+ }
110
+ /**
111
+ * Build the suppression summary (pure). Unlike `cost` and `drift`, this block is
112
+ * **always present** — including with `count: 0`. An omitted section would be
113
+ * ambiguous ("nothing silenced" vs "this version didn't record it"), and the
114
+ * whole point is that a reader can tell a clean repo from a quiet one without
115
+ * having to trust that we'd have mentioned it.
116
+ */
117
+ export declare function buildSuppressionSummary(waivers: ReadonlyArray<AssessWaiver>): EvidenceSuppressionSummary;
118
+ /**
119
+ * Build the cost evidence statement (pure). Returns undefined when no cost
120
+ * analysis ran or nothing priced, so the bundle omits the section entirely
121
+ * rather than signing a zero that could be read as "this costs nothing".
122
+ */
123
+ export declare function buildCostStatement(report: IdleFloorReport | undefined): EvidenceCostStatement | undefined;
124
+ /** the equivalence sub-results buildRefactorStatement reads (the shape recorded
125
+ * in `scanSession.refactorEquivalence`). */
126
+ export interface RefactorEquivalenceInput {
127
+ equivalent: boolean;
128
+ resource_set_equivalent: boolean;
129
+ arg_names_equivalent: boolean;
130
+ moves_exhaustive: boolean;
131
+ moves_detected: number;
132
+ validate_passed: boolean;
133
+ fmt_clean: boolean;
134
+ uncovered_moves: {
135
+ from: string;
136
+ to: string;
137
+ }[];
138
+ }
139
+ /**
140
+ * Build the refactor evidence statement (pure). Returns undefined when nothing
141
+ * refactor-related happened (no equivalence proof, not a proposed-unproven b.4,
142
+ * no external module) so the bundle omits the section entirely. Infraweaver asserts
143
+ * only what the inputs prove — a failed or absent proof asserts nothing.
144
+ */
145
+ export declare function buildRefactorStatement(args: {
146
+ equivalence?: RefactorEquivalenceInput | undefined;
147
+ provenance: ModuleProvenance[];
148
+ proposedUnproven: boolean;
149
+ }): EvidenceRefactorStatement | undefined;
150
+ /**
151
+ * What this run did NOT judge, because a human had already accepted it.
152
+ *
153
+ * WHY THIS IS IN THE SIGNED BYTES. `posture` and `control_statements` describe
154
+ * the OPEN findings only — suppressed ones are excluded by design, because a
155
+ * waived finding genuinely is an accepted risk. But that means a repo with
156
+ * thirty active waivers produced a bundle byte-indistinguishable from a
157
+ * genuinely clean one, and the difference is exactly what an assessor is there
158
+ * to examine. The human-readable report has always listed waivers; the SIGNED
159
+ * artifact did not, which made the signature cover the flattering half of the
160
+ * story.
161
+ *
162
+ * Each entry is what was silenced, where it is, why (a reason is mandatory
163
+ * everywhere), by which mechanism, and until when.
164
+ *
165
+ * A note on `source`. It records the two things the suppression pipeline
166
+ * actually models: `inline` (a directive in the source file) and `policy` (the
167
+ * `.infraweaver.yml` block). A skip written for ANOTHER scanner
168
+ * (`# checkov:skip=…`) is honoured and lands under `inline`, with the pipeline's
169
+ * own `[via <tool> skip]` marker appended to its reason — so the distinction is
170
+ * visible in the entry without this block claiming a structured tally the
171
+ * concern model does not carry.
172
+ */
173
+ export interface EvidenceSuppressionRecord {
174
+ rule_id: string;
175
+ severity: string;
176
+ file: string;
177
+ line?: number | null | undefined;
178
+ /** mandatory everywhere; carries the `[via <tool> skip]` marker when the
179
+ * directive was another scanner's rather than ours. */
180
+ reason: string;
181
+ /** `inline` = a directive in the source file; `policy` = the `.infraweaver.yml` block. */
182
+ source: string;
183
+ /** ISO date the waiver lapses, or null for an open-ended one. */
184
+ expires: string | null;
185
+ }
186
+ export interface EvidenceSuppressionSummary {
187
+ /** how many findings this bundle's posture excludes. 0 ⇒ nothing silenced. */
188
+ count: number;
189
+ /** count by mechanism (`inline` / `policy`) — how the silencing was applied. */
190
+ by_source: Record<string, number>;
191
+ /** open-ended waivers — the ones with no review date. */
192
+ never_expire: number;
193
+ entries: EvidenceSuppressionRecord[];
194
+ asserts: string;
195
+ does_not_assert: string;
196
+ }
197
+ /**
198
+ * WHO produced this evidence (A.3). The bundle always named the engine; after
199
+ * the Trivy compromise that is not enough — a poisoned scanner produces
200
+ * poisoned findings under a clean engine version. This block records the whole
201
+ * acting chain: the model that drove the agent, the runtime, and the exact
202
+ * scanner builds the integrity gate observed (`toolchainIntegrity`) before
203
+ * executing them. Nothing here is fabricated: a tool that never ran this
204
+ * session is simply absent from `scanners`, and an unresolved model is null.
205
+ */
206
+ export interface EvidenceProvenance {
207
+ /** resolved model specifier that drove the agent, or null (auto/unknown —
208
+ * e.g. a local `infraweaver mcp` session has no agent of its own). */
209
+ model: string | null;
210
+ /** the Node.js runtime the engine executed on (`process.version`). */
211
+ node: string;
212
+ /** exact scanner versions probed by the integrity gate before execution —
213
+ * only tools that actually ran this session appear. */
214
+ scanners: {
215
+ tool: string;
216
+ version: string | null;
217
+ }[];
218
+ }
219
+ export interface EvidenceBundle {
220
+ /** Infraweaver's own schema id — explicitly NOT OSCAL (see module note). */
221
+ schema: typeof EVIDENCE_SCHEMA;
222
+ /** caller-supplied ISO timestamp (kept out of the builder so it stays pure). */
223
+ generated_at: string;
224
+ tool: {
225
+ name: typeof TOOL_NAME;
226
+ version: string;
227
+ };
228
+ /** who produced this evidence — model + runtime + observed scanner builds. */
229
+ provenance: EvidenceProvenance;
230
+ subject: {
231
+ scanned_dir: string;
232
+ repo?: string | undefined;
233
+ ref?: string | undefined;
234
+ commit?: string | undefined;
235
+ };
236
+ posture: AssessmentScorecard["posture"];
237
+ summary: {
238
+ total: number;
239
+ by_severity: AssessmentScorecard["by_severity"];
240
+ verification: VerificationSummary["counts"];
241
+ };
242
+ /** one statement per mapped concern, each carrying its status + controls. */
243
+ control_statements: EvidenceControlStatement[];
244
+ /** which scanners code-verified vs which were inconclusive (coverage gaps). */
245
+ coverage: VerificationSummary["coverage"];
246
+ /** what the posture above EXCLUDES because a human accepted it. Always
247
+ * present (0 when nothing was silenced) so a clean repo and a quiet one are
248
+ * distinguishable from the signed bytes alone. */
249
+ suppressions: EvidenceSuppressionSummary;
250
+ crosswalk: {
251
+ version: string;
252
+ reviewed: string;
253
+ /** sha256 of the reviewed crosswalk tables that produced these verdicts —
254
+ * binds the exact (integrity-gated) control mapping into the signed bundle. */
255
+ digest: string;
256
+ by_framework: CrosswalkReport["by_framework"];
257
+ };
258
+ /** the five-status legend, so the bundle is self-describing for an assessor. */
259
+ legend: Record<VerificationStatus, string>;
260
+ /** present only on a refactor run — the equivalence/proposed-unproven statement
261
+ * with the proof that backs it (omitted entirely otherwise). */
262
+ refactor?: EvidenceRefactorStatement | undefined;
263
+ /** present only when the credential-free cost analysis ran — the §5.19 idle
264
+ * floor (what this bills at zero traffic), never a monthly total. */
265
+ cost?: EvidenceCostStatement | undefined;
266
+ /** present only when detect_plan_drift ran — the TC-2.1 drift statement:
267
+ * signed, bounded proof of whether live infrastructure matched the committed
268
+ * configuration when the plan artifact was produced, with the `forgotten`
269
+ * blind-spot list and every coverage gap carried in the claim itself. */
270
+ drift?: DriftEvidenceStatement | undefined;
271
+ /** present only when a provider-major upgrade was detected (TC-2.2) — which
272
+ * boundary was crossed, the codified transforms found in this configuration,
273
+ * and the plan that proves (or fails to prove) the result. A `no-plan` verdict
274
+ * is recorded rather than omitted: an upgrade shipped without a plan is
275
+ * exactly the thing a reader must be able to see. */
276
+ upgrade?: UpgradeEvidenceStatement | undefined;
277
+ /** Ed25519 signing metadata (public key + fingerprint + the sibling `.sig`
278
+ * carrying the detached signature over this file's exact bytes), or an
279
+ * explicit null when no INFRAWEAVER_SIGNING_KEY is configured — never fake. */
280
+ signature: SignatureMetadata | null;
281
+ /** §5.16 always-present eIDAS assurance declaration: which electronic-seal
282
+ * tier the `signature` above actually reaches, and — the load-bearing half —
283
+ * which it does not. `signature` says HOW the bytes were signed; this says
284
+ * WHAT THAT IS WORTH legally, so a reader cannot over-read an Ed25519
285
+ * signature as a qualified seal. Present even when unsigned (`level: "none"`),
286
+ * because an omitted section is ambiguous. See [[eidas]]. */
287
+ seal: EidasSeal;
288
+ disclaimer: string;
289
+ }
290
+ export interface EvidenceSubject {
291
+ scanned_dir: string;
292
+ repo?: string | undefined;
293
+ ref?: string | undefined;
294
+ commit?: string | undefined;
295
+ }
296
+ /**
297
+ * Build the evidence bundle from an assessment's scorecard + crosswalk. Pure —
298
+ * `generatedAt` and the subject identifiers are passed in so the same inputs
299
+ * always produce the same bytes (and tests don't need a clock). Control
300
+ * statements come from the crosswalk entries (which already carry the
301
+ * verification status), enriched with the concern's severity/location when the
302
+ * scanned concerns are supplied (the crosswalk entry itself carries neither).
303
+ */
304
+ export declare function buildEvidenceBundle(args: {
305
+ scorecard: AssessmentScorecard;
306
+ crosswalk: CrosswalkReport;
307
+ subject: EvidenceSubject;
308
+ generatedAt: string;
309
+ version?: string;
310
+ /** the scanned concerns backing the crosswalk entries — the source of each
311
+ * statement's severity/file/line enrichment. */
312
+ concerns?: Concern[];
313
+ refactor?: EvidenceRefactorStatement | undefined;
314
+ /** the §5.19 idle-floor statement; omitted when no cost analysis ran. */
315
+ cost?: EvidenceCostStatement | undefined;
316
+ /** the TC-2.1 drift statement; omitted when detect_plan_drift didn't run. */
317
+ drift?: DriftEvidenceStatement | undefined;
318
+ /** the TC-2.2 upgrade statement; omitted when no provider-major pack applied. */
319
+ upgrade?: UpgradeEvidenceStatement | undefined;
320
+ /** who produced this evidence (A.3). REQUIRED — an evidence bundle that
321
+ * doesn't name its actor is the gap this block exists to close. Callers pass
322
+ * real values (the builder stays pure; no ambient reads here). */
323
+ provenance: EvidenceProvenance;
324
+ /** signing metadata when a key is configured; omitted/null ⇒ explicit
325
+ * `"signature": null` (the honest-unsigned marker). */
326
+ signature?: SignatureMetadata | null;
327
+ }): EvidenceBundle;
328
+ export declare const TerraformEmitEvidenceParams: import("arktype/internal/variants/object.ts").ObjectType<{
329
+ output_path?: string;
330
+ severity_threshold?: "critical" | "high" | "info" | "low" | "medium";
331
+ proposed_unproven?: boolean;
332
+ }, {}>;
333
+ export declare function TerraformEmitEvidenceTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
334
+ output_path?: string;
335
+ severity_threshold?: "critical" | "high" | "info" | "low" | "medium";
336
+ proposed_unproven?: boolean;
337
+ }, {
338
+ output_path?: string;
339
+ severity_threshold?: "critical" | "high" | "info" | "low" | "medium";
340
+ proposed_unproven?: boolean;
341
+ }>> & {
342
+ mutates?: boolean;
343
+ };
@@ -0,0 +1,76 @@
1
+ import { type Concern } from "#app/mcp/terraform/types";
2
+ /**
3
+ * Map a reviewer `findings.json` body into Concern[]. Drops `human_only`
4
+ * findings (out of scope — not auto-remediable). Paths are normalized to
5
+ * repo-relative POSIX (same as the scanners) so ids and grouping stay portable.
6
+ */
7
+ export declare function parseReviewerFindings(json: string, cwd?: string): Concern[];
8
+ declare const SarifReport: import("arktype/internal/variants/object.ts").ObjectType<{
9
+ version?: string;
10
+ $schema?: string;
11
+ runs?: {
12
+ tool?: {
13
+ driver?: {
14
+ name?: string;
15
+ rules?: {
16
+ id?: string;
17
+ helpUri?: string;
18
+ shortDescription?: {
19
+ text?: string;
20
+ };
21
+ }[];
22
+ };
23
+ };
24
+ results?: {
25
+ ruleId?: string;
26
+ level?: string;
27
+ message?: {
28
+ text?: string;
29
+ };
30
+ locations?: {
31
+ physicalLocation?: {
32
+ artifactLocation?: {
33
+ uri?: string;
34
+ };
35
+ region?: {
36
+ startLine?: number;
37
+ };
38
+ };
39
+ }[];
40
+ properties?: {
41
+ "security-severity"?: string;
42
+ };
43
+ suppressions?: {
44
+ kind: "external" | "inSource";
45
+ justification?: string;
46
+ }[];
47
+ }[];
48
+ }[];
49
+ }, {}>;
50
+ type SarifReport = typeof SarifReport.infer;
51
+ /** true when a parsed JSON object looks like a SARIF report (the standard
52
+ * scanner-output format) rather than a terraform-reviewer findings.json. */
53
+ export declare function isSarif(parsed: unknown): boolean;
54
+ /**
55
+ * Parse a SARIF 2.1.0 report (the standard scanner-output format Trivy /
56
+ * Checkov / tflint all emit) into Concern[]. The driver name picks the source so
57
+ * a finding from a scanner Infraweaver re-runs reproduces the SAME content id
58
+ * (✗→✓ verifiable); other tools collapse to `reviewer`. Rule docs come from the
59
+ * matching `tool.driver.rules[].helpUri`. Non-Terraform files are dropped.
60
+ */
61
+ export declare function parseSarifFindings(json: string, cwd?: string): Concern[];
62
+ /** dispatch a findings file to the right parser: SARIF (standard scanner
63
+ * output) or a terraform-reviewer findings.json. */
64
+ export declare function parseFindingsFile(json: string, cwd?: string): Concern[];
65
+ /**
66
+ * Emit a set of concerns as a SARIF 2.1.0 report for GitHub code-scanning (the
67
+ * inverse of `parseSarifFindings` — close the loop so a Infraweaver scan can
68
+ * populate the repo's Security tab via `github/codeql-action/upload-sarif`). One
69
+ * `run` with the `infraweaver` driver, a deduped `rules` array (each rule's
70
+ * `helpUri` from `ruleDocUrl`), and one `result` per concern carrying its
71
+ * `level`, `security-severity`, message, and `file:line`. Pure + deterministic
72
+ * (rules sorted, stable partialFingerprints from the content id) so re-emitting
73
+ * an unchanged scan yields a byte-identical report.
74
+ */
75
+ export declare function buildSarifReport(concerns: Concern[]): SarifReport;
76
+ export {};
@@ -0,0 +1,81 @@
1
+ import { type Concern } from "#app/mcp/terraform/types";
2
+ export declare const FIX_MEMORY_FILENAME = ".infraweaver.fix-memory.json";
3
+ /**
4
+ * A proven-fix pattern. Freshly CAPTURED patterns carry only the identity +
5
+ * guidance (no stats); LIBRARY entries (loaded from Cloud / a local file) also
6
+ * carry the reuse stats and the operator `disabled` flag. The finding-TYPE key
7
+ * (`finding_type`) is file-independent on purpose — the whole point is to reuse
8
+ * across files and repos.
9
+ */
10
+ export interface ProvenFixPattern {
11
+ /** the finding-TYPE shape: `source|bareRule` (file-independent). The match key. */
12
+ finding_type: string;
13
+ /** producing scanner, when known (null for reviewer-loaded concerns). */
14
+ source: string | null;
15
+ /** cross-scanner canonical class (e.g. "aws-s3-encryption"), when recognised. */
16
+ canonical_class: string | null;
17
+ category: string;
18
+ /** human label — the namespaced rule id (e.g. "trivy:AVD-AWS-0088"). */
19
+ title: string;
20
+ /** the scanner's "what is wrong" message, trimmed + capped. */
21
+ description: string | null;
22
+ /** the remediation guidance that proved out (trivy Resolution / fmt hint / …). */
23
+ remediation_hint: string | null;
24
+ /** a representative BEFORE snippet from the repo the pattern was proven on —
25
+ * a concrete example for the fixer to adapt, never a patch to apply verbatim. */
26
+ before_example: string | null;
27
+ /** how many times this type went `✗→✓` (across the fleet, from Cloud). */
28
+ times_proven?: number;
29
+ /** distinct repos it's been proven on. */
30
+ repos_count?: number;
31
+ /** ISO timestamp of the most recent proof. */
32
+ last_proven?: string;
33
+ /** operator retired this pattern in the dashboard — never offered to the fixer. */
34
+ disabled?: boolean;
35
+ }
36
+ /** The finding-TYPE identity: `source|bareRule`, file-independent (unlike
37
+ * `concernKeyOf`, which folds in the file). Two instances of the same rule in
38
+ * different files/repos share this key — the reuse unit. */
39
+ export declare function findingTypeOf(c: Pick<Concern, "source" | "rule_id">): string;
40
+ /** Build a fresh pattern from a concern that just proved out `✗→✓`. Pure. */
41
+ export declare function captureProvenFix(c: Concern): ProvenFixPattern;
42
+ /**
43
+ * De-duplicate a run's captures to one pattern per finding-type. When the same
44
+ * type is proven on several concerns this run, keep the FIRST that carries a
45
+ * before-example (a concrete example beats none), else the first seen — the
46
+ * order is otherwise stable so the wire is deterministic.
47
+ */
48
+ export declare function dedupeCaptures(captures: ProvenFixPattern[]): ProvenFixPattern[];
49
+ /**
50
+ * Match a loaded library against the CURRENT scan's concerns: return the patterns
51
+ * whose finding-type is present in this scan (deduped, `disabled` excluded),
52
+ * newest-proven first, capped. This is what the fixer is offered — a proven prior
53
+ * for the exact finding-types it's about to fix. Pure.
54
+ */
55
+ export declare function matchPatternsForConcerns(library: ProvenFixPattern[], concerns: Pick<Concern, "source" | "rule_id">[], max?: number): ProvenFixPattern[];
56
+ export interface FixMemoryFile {
57
+ version: 1;
58
+ /** ISO timestamp of the last write (informational). */
59
+ updated?: string;
60
+ patterns: ProvenFixPattern[];
61
+ }
62
+ /**
63
+ * Merge freshly-captured patterns into a local library, keyed by finding-type:
64
+ * bump `times_proven`, advance `last_proven`, and prefer a non-empty
65
+ * before-example/hint over an empty one. The local file is single-repo memory
66
+ * (the fleet count lives in Cloud), so `repos_count` stays 1 here. Pure.
67
+ */
68
+ export declare function mergeFixMemory(existing: ProvenFixPattern[], captured: ProvenFixPattern[], provenAt: string): ProvenFixPattern[];
69
+ export declare function serializeFixMemory(patterns: ProvenFixPattern[], updated: string): FixMemoryFile;
70
+ /** Parse fix-memory JSON into a pattern list; tolerant of a malformed/old file (→ null). */
71
+ export declare function parseFixMemory(raw: string): ProvenFixPattern[] | null;
72
+ /** Structural guard for one untrusted pattern (from a file or the Cloud library). */
73
+ export declare function isProvenFixPattern(value: unknown): value is ProvenFixPattern;
74
+ /** Load `.infraweaver.fix-memory.json` under `cwd`; [] when absent/unreadable/malformed. */
75
+ export declare function loadFixMemory(cwd: string | undefined): ProvenFixPattern[];
76
+ /**
77
+ * Coerce an untrusted library payload (the Cloud run-context `provenFixes` blob)
78
+ * into typed patterns, keeping only structurally-valid, non-disabled entries.
79
+ * Pure — the wire boundary can't be typechecked across repos.
80
+ */
81
+ export declare function coerceLibrary(raw: unknown): ProvenFixPattern[];
@@ -0,0 +1,56 @@
1
+ import { type Concern } from "#app/mcp/terraform/types";
2
+ export interface ActionTriggerSite {
3
+ /** the resource the trigger hangs off, `<type>.<name>`. */
4
+ resourceAddress: string;
5
+ /** 1-based line of the `action_trigger` block. */
6
+ line: number;
7
+ /** lifecycle events the trigger fires on, as written (`after_create`, …). */
8
+ events: string[];
9
+ /** the action references invoked, as written (`action.aws_lambda_invoke.x`). */
10
+ actions: string[];
11
+ /** true when the trigger is conditional — the side-effect may or may not run,
12
+ * which is strictly harder to reason about, not easier. */
13
+ conditional: boolean;
14
+ }
15
+ /**
16
+ * Every `lifecycle { action_trigger { … } }` in `hcl`, with the resource it
17
+ * belongs to. Walks resource → lifecycle → action_trigger explicitly rather than
18
+ * matching `action_trigger` anywhere, so a same-named argument elsewhere can't
19
+ * fabricate a governance finding.
20
+ */
21
+ export declare function findActionTriggers(hcl: string): ActionTriggerSite[];
22
+ /** Declared `action "<type>" "<name>" {}` blocks — the definitions the triggers
23
+ * reference. Reported as inventory, never as a finding: declaring an action is
24
+ * inert; only invoking one from a lifecycle event has an effect. */
25
+ export declare function findActionDeclarations(hcl: string): {
26
+ address: string;
27
+ line: number;
28
+ }[];
29
+ export declare function actionTriggersToConcerns(sites: ActionTriggerSite[], file: string): Concern[];
30
+ export declare function isStatefulResourceType(resourceType: string): boolean;
31
+ export interface DynamicDestroyProtectionSite {
32
+ resourceAddress: string;
33
+ resourceType: string;
34
+ /** 1-based line of the `prevent_destroy` assignment. */
35
+ line: number;
36
+ /** the expression as written, e.g. `var.protect`. */
37
+ expression: string;
38
+ }
39
+ /**
40
+ * Every `prevent_destroy` on a STATEFUL resource whose value is an expression
41
+ * rather than a literal. A literal `true` or `false` is decidable from the code
42
+ * and reported by nobody here; a non-stateful resource is out of scope by design.
43
+ */
44
+ export declare function findDynamicDestroyProtection(hcl: string): DynamicDestroyProtectionSite[];
45
+ export declare function dynamicDestroyProtectionToConcerns(sites: DynamicDestroyProtectionSite[], file: string): Concern[];
46
+ export interface GovernanceScan {
47
+ concerns: Concern[];
48
+ /** action declarations found — inventory for the run summary, not findings. */
49
+ actionDeclarations: {
50
+ address: string;
51
+ line: number;
52
+ file: string;
53
+ }[];
54
+ }
55
+ /** Both governance rules over one file's HCL. Pure. */
56
+ export declare function scanGovernanceFile(hcl: string, file: string): GovernanceScan;
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Shared, tolerant HCL block scanning.
3
+ *
4
+ * Every native rule in this engine ([[writeOnly]], [[governance]], [[tfquery]],
5
+ * and the provider-schema cross-check in [[scanners]]) needs the same primitive:
6
+ * walk a file's `<keyword> "label" "label" { … }` blocks and read their top-level
7
+ * arguments, without being fooled by a `}` inside a string, a commented-out brace,
8
+ * or a heredoc body. Getting that wrong doesn't produce a parse error — it
9
+ * produces a WRONG FINDING at a wrong line, which is the failure mode this
10
+ * product can least afford. So there is exactly one implementation of it.
11
+ *
12
+ * Deliberately NOT a real HCL parser. We never evaluate expressions, resolve
13
+ * variables, or validate syntax — `terraform validate` (the customer's own
14
+ * binary) owns that. This reads structure only, and every consumer is written to
15
+ * degrade to "no finding" rather than guess when the structure is unclear.
16
+ *
17
+ * Pure: string in, structure out. No filesystem, no subprocess.
18
+ */
19
+ /**
20
+ * A non-code span in HCL — a `"…"` string, a `#`/`//` line comment, or a
21
+ * `<<EOF` heredoc — that the brace/argument scanners must skip wholesale (an
22
+ * interpolation's `${…}`, a commented `}`, or a heredoc's `key = value` lines
23
+ * would otherwise corrupt brace depth or fabricate an argument). Returned for a
24
+ * span starting at `i`: `end` is the index of its LAST char (caller resumes at
25
+ * `end + 1`), and `endsLine` is true when the span finished at a line boundary
26
+ * (comment / heredoc — the next token begins a fresh statement). null when `i`
27
+ * isn't the start of a non-code span.
28
+ */
29
+ export declare function skipNonCode(s: string, i: number): {
30
+ end: number;
31
+ endsLine: boolean;
32
+ } | null;
33
+ /**
34
+ * Brace-match from an opening `{` at `open`; returns the inner text + end index
35
+ * (the matching `}`), string/comment/heredoc-aware so interpolation braces, a
36
+ * commented `}`, or a heredoc body don't fool it. null when the block never
37
+ * closes (a truncated or malformed file) — callers stop rather than guess.
38
+ */
39
+ export declare function matchBraceBody(hcl: string, open: number): {
40
+ text: string;
41
+ end: number;
42
+ } | null;
43
+ /** 1-based line number of `index` in `hcl`. */
44
+ export declare function lineOf(hcl: string, index: number): number;
45
+ /** A top-level block (`resource "aws_s3_bucket" "b" { … }`) with its source span. */
46
+ export interface HclBlock {
47
+ /** the block keyword — `resource`, `action`, `list`, … */
48
+ keyword: string;
49
+ /** the quoted labels after the keyword, in order. */
50
+ labels: string[];
51
+ /** the block's inner text (between the braces). */
52
+ body: string;
53
+ /** 1-based line of the block header. */
54
+ line: number;
55
+ /** 1-based line of the body's opening `{`. Body-relative lines add to this
56
+ * (`absolute = bodyLine + bodyRelativeLine - 1`), so a caller never needs a
57
+ * second `lineOf` scan to place an assignment. */
58
+ bodyLine: number;
59
+ /** 1-based line of the matching `}` — the block's last line. */
60
+ endLine: number;
61
+ /** index in `hcl` of the header's first char. */
62
+ start: number;
63
+ /** index in `hcl` of the body's opening `{`. */
64
+ bodyStart: number;
65
+ /** index in `hcl` of the matching `}`. */
66
+ end: number;
67
+ }
68
+ /**
69
+ * Every TOP-LEVEL block in `hcl` whose keyword is in `keywords`.
70
+ *
71
+ * Anchored to a line start so a `resource` mentioned inside a string or a nested
72
+ * body can't be mistaken for a declaration, and each match resumes past the
73
+ * block's closing brace so nested blocks of the same keyword are never
74
+ * double-reported. A block that doesn't close terminates the scan (see
75
+ * `matchBraceBody`) — an unparseable tail yields fewer findings, never wrong ones.
76
+ *
77
+ * Line numbers are counted forward as the scan advances rather than by rescanning
78
+ * from the start of the file for each one. Matches arrive in increasing index
79
+ * order, so this is exact — and it keeps a file with many blocks linear instead of
80
+ * quadratic, which matters on the monorepos this walks 2000 files of.
81
+ */
82
+ export declare function parseBlocks(hcl: string, keywords: readonly string[]): HclBlock[];
83
+ /** One `name = <value>` assignment found at the top level of a block body. */
84
+ export interface HclAssignment {
85
+ name: string;
86
+ /** the raw right-hand side, trimmed — an expression, not an evaluated value. */
87
+ value: string;
88
+ /** 1-based line of the assignment, RELATIVE TO THE BODY text. */
89
+ bodyLine: number;
90
+ }
91
+ /**
92
+ * Top-level `name = value` assignments in a block body, string/comment/heredoc-
93
+ * aware and depth-0 only (a `password` inside a nested block belongs to that
94
+ * block, not this one). Nested BLOCKS are ignored here — use `parseBlocks` on the
95
+ * body for those.
96
+ *
97
+ * The value is captured raw to the end of its line, which is right for the
98
+ * single-line assignments every rule here inspects (`password = var.x`,
99
+ * `prevent_destroy = true`). A multi-line value (a list or object literal
100
+ * spanning lines) is captured only as far as its first line; no rule asserts on
101
+ * such a value, and each is written to skip what it cannot read.
102
+ */
103
+ export declare function topLevelAssignments(body: string): HclAssignment[];
104
+ /**
105
+ * Strip a trailing `# …` / `// …` comment from a captured right-hand side.
106
+ *
107
+ * Deliberately handles ONLY strings and comments, not the full `skipNonCode` set:
108
+ * a heredoc opener (`<<EOF`) is part of the value, and treating it as a span to
109
+ * stop at would silently truncate the value to the empty string — which then
110
+ * flows into a proposed edit as `password_wo = ` and produces a broken rewrite.
111
+ */
112
+ export declare function stripTrailingComment(value: string): string;
113
+ /** True when a right-hand side is a bare quoted string LITERAL with no
114
+ * interpolation — i.e. the value is written into the config, not referenced. */
115
+ export declare function isStringLiteral(value: string): boolean;