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,28 @@
1
+ /**
2
+ * Normalize a scanner-reported path to a repo-relative POSIX path. Each scanner
3
+ * reports the file differently — tflint gives `main.tf` (relative), trivy a
4
+ * scan-dir-relative `Target`, terraform an absolute path (`/repo/main.tf` or
5
+ * `D:\repo\main.tf`), checkov a leading-slash path (`/main.tf`). Left
6
+ * unnormalized, these leak into `location.file` AND the
7
+ * content-derived `concernId`, making the id (and the `remediate/<id>` branch)
8
+ * machine-dependent and breaking the ✗→✓ re-scan id match across environments.
9
+ * So normalize BEFORE building any Concern.
10
+ */
11
+ export declare function toRepoRelative(raw: string | undefined, cwd: string): string;
12
+ export interface ResolvedRoot {
13
+ /** absolute dir the per-root command (init/plan/validate) runs in. */
14
+ absDir: string;
15
+ /** that root's path relative to the scan `cwd` ("" when the root IS cwd) —
16
+ * prepended to per-root concern files so they stay cwd-relative. */
17
+ relDir: string;
18
+ }
19
+ /**
20
+ * The Terraform root modules to operate on under `cwd`. A repo can hold several
21
+ * roots (hepcare: `terraform/` + `terraform/core/`); `terraform validate` /
22
+ * `plan` are per-root, so they must run in EACH. Falls back to `cwd` itself as a
23
+ * single root when none is detected — so a normal single-root repo behaves
24
+ * exactly as before (no rebasing, one iteration).
25
+ */
26
+ export declare function resolveRoots(cwd: string): ResolvedRoot[];
27
+ /** the repo's base ref for diff-scope, or null when one can't be determined. */
28
+ export declare function resolveBaseRef(cwd: string): string | null;
@@ -0,0 +1,157 @@
1
+ import type { BlastTier } from "#app/mcp/terraform/types";
2
+ export interface PlanSummary {
3
+ /** resources to add / change / destroy, from the plan's change_summary. */
4
+ add: number;
5
+ change: number;
6
+ destroy: number;
7
+ /** every resource with a real action (create/update/delete/replace) — the set
8
+ * that powers blast-radius and plan-stability. */
9
+ changed: {
10
+ address: string;
11
+ action: string;
12
+ }[];
13
+ /** resources that would be deleted or replaced — the destructive set. */
14
+ destructive: {
15
+ address: string;
16
+ action: string;
17
+ }[];
18
+ hasDestroyOrReplace: boolean;
19
+ /** state-only moves (`moved {}` blocks / refactors): the new address and the
20
+ * address it came from. Moves don't mutate live infrastructure, so they are
21
+ * NOT in `changed` — they power the modularization gate (`isPureMovePlan`). */
22
+ moved: {
23
+ address: string;
24
+ previousAddress: string | null;
25
+ }[];
26
+ }
27
+ export declare function parseTerraformPlanJson(stdout: string): PlanSummary;
28
+ /**
29
+ * modularization gate — true when the plan is PURELY state moves: at least
30
+ * one `moved` entry and zero create/update/delete/replace. That proves a
31
+ * resources→module refactor preserved every resource address (via `moved {}`
32
+ * blocks) and is a no-op on live infrastructure — the condition under which a
33
+ * modularization PR may proceed without human escalation.
34
+ */
35
+ export declare function isPureMovePlan(plan: {
36
+ add: number;
37
+ change: number;
38
+ destroy: number;
39
+ changed: {
40
+ address: string;
41
+ }[];
42
+ moved: {
43
+ address: string;
44
+ }[];
45
+ }): boolean;
46
+ /**
47
+ * Resource types that hold data/state — destroying or replacing one of these
48
+ * means data loss, not just recreation. A remediation that would delete or
49
+ * replace one is hard-blocked at push time unless the operator opts in via the
50
+ * `allow_replace` input. Not exhaustive: it covers the common managed
51
+ * datastores across AWS / Azure / GCP; extend as new ones come up.
52
+ */
53
+ export declare const STATEFUL_RESOURCE_TYPES: ReadonlySet<string>;
54
+ /**
55
+ * Extract the Terraform resource TYPE from a plan address, stripping any
56
+ * `module.<name>.` prefixes and an instance index/key suffix:
57
+ * `module.db.aws_db_instance.main` -> `aws_db_instance`
58
+ * `aws_s3_bucket.data["prod"]` -> `aws_s3_bucket`
59
+ * `module.a.module.b.google_storage_bucket.x[0]` -> `google_storage_bucket`
60
+ * Returns "" when the address has no parseable `type.name` pair.
61
+ */
62
+ export declare function resourceTypeOf(address: string): string;
63
+ export interface DestroyClassification {
64
+ /** destroy/replace of a data-bearing type — high-risk, blocked by default. */
65
+ stateful: {
66
+ address: string;
67
+ action: string;
68
+ type: string;
69
+ }[];
70
+ /** destroy/replace of a recreatable type — recorded, not blocked. */
71
+ ephemeral: {
72
+ address: string;
73
+ action: string;
74
+ type: string;
75
+ }[];
76
+ }
77
+ /** partition a plan's destructive set into stateful (blocked) vs ephemeral. */
78
+ export declare function classifyDestructive(destructive: {
79
+ address: string;
80
+ action: string;
81
+ }[]): DestroyClassification;
82
+ export interface BlastRadius {
83
+ tier: BlastTier;
84
+ /** count of resources the plan would create/update/delete/replace. */
85
+ resourceCount: number;
86
+ /** distinct module addresses touched (root resources count as `root`). */
87
+ modules: string[];
88
+ }
89
+ /**
90
+ * Extract the module address from a resource address: the `module.X[.module.Y]`
91
+ * call path, or `root` for a top-level resource. Strips instance index/key from
92
+ * EVERY segment — a `count`/`for_each` MODULE carries its key on the module
93
+ * segment (`module.net[0]`), so all instances of one module collapse to one
94
+ * address (else a single-module fix would look cross-module). Removing keys
95
+ * first also tolerates a `.` inside a `for_each` string key.
96
+ * `aws_s3_bucket.b` -> `root`
97
+ * `module.db.aws_db_instance.main` -> `module.db`
98
+ * `module.net[0].aws_vpc.main` -> `module.net`
99
+ * `module.a.module.b.google_x.y[0]` -> `module.a.module.b`
100
+ */
101
+ export declare function moduleAddressOf(address: string): string;
102
+ /**
103
+ * Score how much a fix touches, to route large changes through stricter review:
104
+ * 1–2 resources = `low`, 3–10 = `medium`, more than 10 OR spanning more than one
105
+ * module = `high`. A `high` blast radius should force human-in-the-loop
106
+ * regardless of finding severity. 0 changes is `low` (nothing to do).
107
+ */
108
+ export declare function computeBlastRadius(changed: {
109
+ address: string;
110
+ }[]): BlastRadius;
111
+ export interface StabilityResult {
112
+ /** true when a second plan produced the identical change set. */
113
+ stable: boolean;
114
+ reason?: string;
115
+ }
116
+ /**
117
+ * Compare two consecutive plans for stability. Infraweaver never `apply`s (it only
118
+ * opens PRs), so a true "no perpetual diff after apply" cannot be proven here —
119
+ * but a fix whose plan is non-deterministic (e.g. `timestamp()`, `uuid()`, an
120
+ * unkeyed `random_*`, or a data source that varies run-to-run) yields a DIFFERENT
121
+ * plan on the second run, and that is a real perpetual-diff smell we can catch
122
+ * without applying. Stable ⇒ the two plans matched; unstable ⇒ report it.
123
+ */
124
+ export declare function comparePlanStability(first: PlanSummary, second: PlanSummary): StabilityResult;
125
+ export interface RootPlan {
126
+ /** display label for the root ("." for the top-level root). */
127
+ dir: string;
128
+ summary: PlanSummary;
129
+ stable: boolean;
130
+ }
131
+ export interface AggregatedPlan {
132
+ add: number;
133
+ change: number;
134
+ destroy: number;
135
+ changed: {
136
+ address: string;
137
+ action: string;
138
+ }[];
139
+ destructive: {
140
+ address: string;
141
+ action: string;
142
+ }[];
143
+ hasDestroyOrReplace: boolean;
144
+ idempotent: boolean;
145
+ moved: {
146
+ address: string;
147
+ previousAddress: string | null;
148
+ }[];
149
+ }
150
+ /**
151
+ * Aggregate per-root plan results into one view: SUM the add/change/destroy
152
+ * counts, UNION the changed + destructive sets (so blast-radius and the
153
+ * destroy-block see every root's effect), and treat the whole run as
154
+ * non-idempotent if ANY root's plan was unstable. Pure. Single-root input passes
155
+ * straight through (identical to the pre-multi-root behaviour).
156
+ */
157
+ export declare function aggregatePlans(roots: RootPlan[]): AggregatedPlan;
@@ -0,0 +1,199 @@
1
+ import { type Concern } from "#app/mcp/terraform/types";
2
+ export declare const PlanDocument: import("arktype/internal/variants/object.ts").ObjectType<{
3
+ format_version?: string;
4
+ resource_changes?: {
5
+ address: string;
6
+ type?: string;
7
+ name?: string;
8
+ mode?: string;
9
+ change: {
10
+ actions: string[];
11
+ before?: unknown;
12
+ after?: unknown;
13
+ };
14
+ }[];
15
+ action_invocations?: {
16
+ address: string;
17
+ type?: string;
18
+ name?: string;
19
+ provider_name?: string;
20
+ lifecycle_action_trigger?: {
21
+ triggering_resource_address?: string;
22
+ action_trigger_event?: string;
23
+ };
24
+ }[];
25
+ }, {}>;
26
+ export type DriftKind = "modified" | "deleted" | "recreated" | "replaced";
27
+ export interface DriftItem {
28
+ address: string;
29
+ type: string | null;
30
+ name: string | null;
31
+ /** the raw plan actions, e.g. ["update"] or ["delete","create"]. */
32
+ actions: string[];
33
+ kind: DriftKind;
34
+ /** top-level attributes whose value differs between `change.before` and
35
+ * `change.after` — the input the provider-noise filter judges. `null` when
36
+ * the plan carries no diffable before/after pair (the filter then makes no
37
+ * claim about this item and always keeps it). */
38
+ changed_fields: string[] | null;
39
+ }
40
+ /**
41
+ * The plan-JSON document schema versions this parser understands. Terraform has
42
+ * only ever shipped 1.x for the `show -json` document form and adds keys within
43
+ * it additively, so any 1.x parses; a 2.x would be a redesign we have not read.
44
+ *
45
+ * Forward-compatibility is the DEFAULT here: an unknown 1.x minor (or an absent
46
+ * version on an old artifact) parses normally, because arktype ignores keys we
47
+ * do not declare. Only a MAJOR bump is called out — and even then as an honest
48
+ * coverage gap for the caller to surface, never a silent mis-parse.
49
+ */
50
+ export declare const SUPPORTED_PLAN_FORMAT_MAJOR = 1;
51
+ /** True when a plan document's `format_version` is one this parser understands.
52
+ * An absent version is accepted (pre-versioning artifacts). Pure. */
53
+ export declare function isSupportedPlanFormat(formatVersion: string | undefined): boolean;
54
+ export interface ForgottenResource {
55
+ address: string;
56
+ type: string | null;
57
+ /** true when the type is data-bearing ([[governance]] `isStatefulResourceType`)
58
+ * — forgetting a database is the case that must route through needs-human:
59
+ * after it, the data-bearing object exists with NO destroy protection and no
60
+ * drift visibility, and nothing in code says so. */
61
+ stateful: boolean;
62
+ }
63
+ /**
64
+ * Resources the plan would FORGET — dropped from state while the real cloud
65
+ * object keeps existing (Terraform `removed` blocks, OpenTofu `destroy = false`).
66
+ *
67
+ * A forget is deliberately NOT drift and NOT a destroy: nothing in the cloud
68
+ * changes, so reporting it as either would be a false positive. But it is not a
69
+ * non-event either — after a forget the resource is unmanaged, and every later
70
+ * drift scan is silently blind to it. Surfaced separately so the run can state
71
+ * the coverage gap instead of quietly shrinking what 'no drift' covers. Pure.
72
+ */
73
+ export declare function classifyForgotten(doc: typeof PlanDocument.infer): ForgottenResource[];
74
+ /** The forgotten addresses only — the compact form of {@link classifyForgotten}. */
75
+ export declare function detectForgotten(doc: typeof PlanDocument.infer): string[];
76
+ /** Every drifted resource in a plan document. A clean plan yields `[]`. */
77
+ export declare function detectDrift(doc: typeof PlanDocument.infer): DriftItem[];
78
+ /**
79
+ * Computed fields whose churn is PROVIDER bookkeeping, not an operator touching
80
+ * infrastructure — the documented, always-computed merge targets that generate
81
+ * perpetual "drift" whenever provider-level defaults shift:
82
+ *
83
+ * - aws `tags_all`: the computed merge of `default_tags` into every resource's
84
+ * tags (the canonical drift-noise field of the AWS provider).
85
+ * - google `effective_labels` / `terraform_labels`: computed label merges
86
+ * introduced by provider v5's default-labels model.
87
+ *
88
+ * The list is deliberately SHORT and only ever names fields a provider computes
89
+ * — a field an operator can hand-edit in the console never belongs here, because
90
+ * filtering it would be exactly the false no-drift the roadmap forbids.
91
+ */
92
+ export declare const PROVIDER_NOISE_FIELDS: Readonly<Record<string, readonly string[]>>;
93
+ /** A drift item excluded by the noise filter — retained for auditability, so the
94
+ * run can show WHAT was filtered and by which fields rather than silently
95
+ * shrinking the drift set. */
96
+ export interface NoiseFilteredDrift {
97
+ address: string;
98
+ kind: DriftKind;
99
+ /** the noisy fields that were the entire diff. */
100
+ fields: string[];
101
+ }
102
+ /**
103
+ * Split drift into signal and provider noise. An item is noise ONLY when every
104
+ * condition holds: it is a pure in-place update (`modified`), the plan carried a
105
+ * diffable before/after pair, at least one field changed, and EVERY changed
106
+ * field is on the noise list (the per-provider defaults plus any operator-
107
+ * supplied extras). Anything else — a delete, a replace, an undiffable change,
108
+ * a mixed diff where one field is real — is kept. The bias is deliberate:
109
+ * "never a false no-drift" means the filter must prove noise, not assume it.
110
+ */
111
+ export declare function filterProviderNoise(items: ReadonlyArray<DriftItem>, extraNoiseFields?: readonly string[]): {
112
+ kept: DriftItem[];
113
+ filtered: NoiseFilteredDrift[];
114
+ };
115
+ export interface ActionInvocationItem {
116
+ /** absolute action address, `action.<type>.<name>`. */
117
+ address: string;
118
+ action_type: string | null;
119
+ /** the resource whose lifecycle event fires this action, when the plan says. */
120
+ triggered_by: string | null;
121
+ /** the lifecycle event (`after_create`, …), when the plan says. */
122
+ event: string | null;
123
+ }
124
+ /**
125
+ * The provider actions this plan will invoke (TF 1.15's `action_invocations`).
126
+ * This is the RUNTIME counterpart of the static `imperative-action-trigger`
127
+ * finding ([[governance]]): the static rule says "an apply here can do work
128
+ * outside the resource graph"; this array is the plan saying "THIS apply will".
129
+ * Pure summarization — correlation to code happens in the tool, where the
130
+ * repo's HCL is available.
131
+ */
132
+ export declare function summarizeActionInvocations(doc: typeof PlanDocument.infer): ActionInvocationItem[];
133
+ /**
134
+ * The drift statement the evidence bundle carries — the 2.1 differentiator:
135
+ * *signed, verifiable proof that live cloud matched the committed IaC at the
136
+ * time the plan artifact was produced*, with every bound on that claim stated
137
+ * in the artifact itself rather than left to the reader's optimism.
138
+ */
139
+ export interface DriftEvidenceStatement {
140
+ /** the plan artifact the claim is derived from. */
141
+ source_file: string;
142
+ /** drifted resources AFTER noise filtering — the signal set. */
143
+ detected: number;
144
+ by_kind: Record<DriftKind, number>;
145
+ items: {
146
+ address: string;
147
+ kind: DriftKind;
148
+ }[];
149
+ /** drift excluded as provider bookkeeping — listed field-by-field so the
150
+ * filtering is auditable (the unfiltered diff stays in the plan artifact). */
151
+ noise_filtered: NoiseFilteredDrift[];
152
+ /** resources this plan drops from management — the standing blind spot every
153
+ * later drift claim inherits, so it must ride the signed statement. */
154
+ forgotten: ForgottenResource[];
155
+ /** drifted addresses with no matching resource block in code. */
156
+ unlocated: number;
157
+ /** honest bounds: unsupported format major, etc. Empty = fully readable. */
158
+ coverage_gaps: string[];
159
+ asserts: string;
160
+ does_not_assert: string;
161
+ }
162
+ /**
163
+ * Build the drift evidence statement (pure). The asserts line is graded by what
164
+ * the inputs actually prove: a clean, fully-readable plan asserts the live-
165
+ * matches-code claim; drift asserts the detection; a coverage gap asserts
166
+ * nothing confident. INCONCLUSIVE-over-silence, in the signed artifact itself.
167
+ */
168
+ export declare function buildDriftStatement(args: {
169
+ sourceFile: string;
170
+ kept: ReadonlyArray<DriftItem>;
171
+ filtered: ReadonlyArray<NoiseFilteredDrift>;
172
+ forgotten: ReadonlyArray<ForgottenResource>;
173
+ unlocated: number;
174
+ coverageGaps?: readonly string[];
175
+ }): DriftEvidenceStatement;
176
+ /** Resolve a Terraform address to its source location, or null when the address
177
+ * isn't found in the repo's code (e.g. a resource removed from code but still in
178
+ * state). Supplied by the tool from a `.tf` resource index. */
179
+ export type LocationResolver = (address: string) => {
180
+ file: string;
181
+ line: number;
182
+ } | null;
183
+ /** A drift item that couldn't be tied to a resource block in code (reported, not dropped). */
184
+ export interface UnlocatedDrift {
185
+ address: string;
186
+ kind: DriftKind;
187
+ reason: string;
188
+ }
189
+ export interface DriftConcerns {
190
+ concerns: Concern[];
191
+ unlocated: UnlocatedDrift[];
192
+ }
193
+ /**
194
+ * Turn drift items into `reviewer`-source concerns at each resource's file:line.
195
+ * Drift is honestly `not-code-verifiable` by the ✗→✓ re-scan (proving it fixed needs
196
+ * live cloud access, which Infraweaver refuses) — the `reviewer` source carries exactly
197
+ * that meaning. Items whose address isn't in code are returned under `unlocated`.
198
+ */
199
+ export declare function driftToConcerns(items: ReadonlyArray<DriftItem>, resolve: LocationResolver): DriftConcerns;
@@ -0,0 +1,191 @@
1
+ import { type Severity } from "#app/mcp/terraform/types";
2
+ /**
3
+ * The namespace an authored rule's id carries. Deliberately NOT the `infraweaver:`
4
+ * native-source prefix: these findings are produced by the customer's conftest
5
+ * running the customer's committed policy. We helped write it; we did not find
6
+ * it, and the label should not imply otherwise.
7
+ */
8
+ export declare const AUTHORED_RULE_PREFIX = "policy";
9
+ /** The fully-qualified rule id for an authored spec. */
10
+ export declare function authoredRuleId(id: string): string;
11
+ /** The closed predicate set. Anything not expressible here is not authorable —
12
+ * which is the point: an operator we cannot evaluate in process is an operator
13
+ * whose generated policy we cannot self-test. */
14
+ export declare const POLICY_OPERATORS: readonly ["equals", "not_equals", "in", "not_in", "present", "absent", "is_true", "is_false", "matches", "gte", "lte", "non_empty"];
15
+ export type PolicyOperator = (typeof POLICY_OPERATORS)[number];
16
+ export type PolicyScalar = string | number | boolean;
17
+ /**
18
+ * What the rule concludes when the attribute path resolves to nothing.
19
+ * Required, and deliberately not defaulted — see the module note.
20
+ */
21
+ export type WhenAbsent = "violation" | "compliant";
22
+ /**
23
+ * The reviewed intermediate representation. This — not Rego — is what the model
24
+ * produces from prose, and what a human reviews.
25
+ */
26
+ export interface PolicyRuleSpec {
27
+ /** kebab-case, unique within the authored pack. Becomes the rule id in every emitted artifact. */
28
+ id: string;
29
+ /** one-line human title. */
30
+ title: string;
31
+ /** the sentence of the SOURCE STANDARD this rule was derived from, quoted. The
32
+ * audit trail from prose to policy; carried into every emitted artifact. */
33
+ source_requirement: string;
34
+ /** the Terraform resource type the rule applies to, e.g. `aws_s3_bucket`. */
35
+ resource_type: string;
36
+ /** dotted path into the resource's planned values, e.g.
37
+ * `server_side_encryption_configuration.rule.apply_server_side_encryption_by_default.sse_algorithm`.
38
+ * A segment that resolves to an array is flattened — every element contributes
39
+ * a candidate value, and the rule must hold for ALL of them. */
40
+ attribute: string;
41
+ operator: PolicyOperator;
42
+ /** the operand. Scalar for equals/not_equals/matches/gte/lte, a list for
43
+ * in/not_in, omitted for the rest. */
44
+ value?: PolicyScalar | PolicyScalar[];
45
+ when_absent: WhenAbsent;
46
+ severity: Severity;
47
+ /** one of the reviewed crosswalk themes — this is what earns the control citation. */
48
+ theme: string;
49
+ /** the violation message a reviewer and an engineer both read. */
50
+ message: string;
51
+ /** a compliant value for the generated fixtures. REQUIRED for `matches`, where
52
+ * no value can be synthesised from the pattern; optional elsewhere. */
53
+ example_compliant?: PolicyScalar;
54
+ /** a violating value for the generated fixtures. REQUIRED for `matches`. */
55
+ example_violating?: PolicyScalar;
56
+ }
57
+ /**
58
+ * Structural validation of a spec. Returns the list of problems — empty means
59
+ * valid. Kept separate from the self-test: this catches "the spec is malformed",
60
+ * the self-test catches "the spec is well-formed but says nothing".
61
+ */
62
+ export declare function validateSpec(spec: PolicyRuleSpec): string[];
63
+ /**
64
+ * Resolve a dotted path against a planned-values object, flattening arrays: at
65
+ * each segment, an array contributes each of its elements as a candidate parent.
66
+ * Returns every leaf value the path reaches. An empty array means the path
67
+ * resolved to nothing — which is what `when_absent` decides on.
68
+ *
69
+ * `null` leaves are dropped: Terraform writes an unset optional argument as
70
+ * `null`, and "present but null" is the same fact as "absent" to a reader.
71
+ */
72
+ export declare function resolvePath(root: unknown, path: string): unknown[];
73
+ /** Does one resolved value satisfy the rule? Pure; mirrored by the emitted Rego. */
74
+ export declare function valueSatisfies(spec: PolicyRuleSpec, value: unknown): boolean;
75
+ export interface SpecVerdict {
76
+ violates: boolean;
77
+ /** why — the sentence a test failure prints. */
78
+ reason: string;
79
+ }
80
+ /**
81
+ * Evaluate a spec against ONE resource's planned values. Universal over the
82
+ * resolved values: every matched value must satisfy the rule, so a list where
83
+ * one element is wrong is a violation.
84
+ */
85
+ export declare function evaluateSpec(spec: PolicyRuleSpec, values: unknown): SpecVerdict;
86
+ /** Build the nested object a dotted path implies, with `leaf` at the end. */
87
+ export declare function nestValue(path: string, leaf: unknown): Record<string, unknown>;
88
+ export interface PolicyFixture {
89
+ /** `compliant` | `violating` | `absent` — the mock's role in the self-test. */
90
+ kind: "compliant" | "violating" | "absent";
91
+ /** the resource's planned values. */
92
+ values: Record<string, unknown>;
93
+ /** what the rule MUST conclude about it. */
94
+ expect_violation: boolean;
95
+ }
96
+ /**
97
+ * The three fixtures every authored rule is tested against. The `absent` case is
98
+ * the one that matters most: it is both the commonest real shape (an optional
99
+ * block simply not written) and the case a hand-written policy most often gets
100
+ * wrong.
101
+ */
102
+ export declare function buildFixtures(spec: PolicyRuleSpec): PolicyFixture[];
103
+ export interface SelfTestCase {
104
+ kind: PolicyFixture["kind"];
105
+ expected: boolean;
106
+ actual: boolean;
107
+ passed: boolean;
108
+ reason: string;
109
+ }
110
+ export interface SelfTestReport {
111
+ /** every case behaved as its fixture demanded AND the rule denies something.
112
+ * Both, deliberately: a rule that agrees with all three fixtures by never
113
+ * firing has passed nothing. */
114
+ passed: boolean;
115
+ cases: SelfTestCase[];
116
+ /** true when the rule denied at least one fixture — the vacuity check. A rule
117
+ * that denies nothing is not a rule. */
118
+ denies_something: boolean;
119
+ }
120
+ /**
121
+ * Run the spec against its own fixtures. A spec that fails here is never
122
+ * emitted: the caller refuses it rather than hand a human a policy that does
123
+ * not do what its own description says.
124
+ */
125
+ export declare function selfTestSpec(spec: PolicyRuleSpec): SelfTestReport;
126
+ /**
127
+ * The shared helper every emitted policy imports by inclusion. Kept as ONE
128
+ * reviewed block rather than inlined per rule, because the array-flattening
129
+ * semantics are the part a reader must check — and they should only have to
130
+ * check it once.
131
+ *
132
+ * Rego forbids recursion, so per-rule path traversal is unrolled at generation
133
+ * time (see `pathComprehension`); `_members` is the non-recursive primitive that
134
+ * makes each step uniform.
135
+ */
136
+ export declare const REGO_PRELUDE = "# Shared helpers for Infraweaver-authored policies. Reviewed once, used by every rule.\n# _members normalises a node to a list so an array-valued block and a single\n# block traverse identically \u2014 the same rule Infraweaver's own evaluator applies.\n_members(x) := x if is_array(x)\n_members(x) := [x] if not is_array(x)\n\n# Only plan actions that produce or change configuration are judged. A delete\n# leaves no \"after\" to assert on, and a no-op has already been judged.\n_relevant(rc) if {\n\tsome action in rc.change.actions\n\taction in {\"create\", \"update\"}\n}\n";
137
+ /**
138
+ * Emit conftest-ready Rego for one spec. Pure and byte-stable — the same spec
139
+ * always yields the same file, so a re-run produces no diff and a diff means the
140
+ * spec changed.
141
+ *
142
+ * Targets `terraform show -json` output (`input.resource_changes`), which is what
143
+ * `policy_check` already feeds conftest.
144
+ */
145
+ export declare function emitRego(spec: PolicyRuleSpec, opts?: {
146
+ packageName?: string;
147
+ }): string;
148
+ /**
149
+ * How faithful the `.policy.hcl` translation is to the spec.
150
+ *
151
+ * `exact` — a single-segment attribute path, where `attrs.<name>` means exactly
152
+ * what our resolver means.
153
+ * `approximate` — a nested path. tfpolicy's `attrs` traversal does not flatten
154
+ * arrays the way our resolver does, so a nested block that Terraform represents
155
+ * as a list needs `[0]` indexing and the translation asserts on the FIRST
156
+ * element rather than all of them. We emit it, we say so in the file, and the
157
+ * generated `.policytest.hcl` is how the customer confirms it before relying
158
+ * on it.
159
+ *
160
+ * This axis is about PATH SHAPE only. A second, unavoidable difference applies
161
+ * to every rule and is stated in the emitted header instead: HCL converts
162
+ * between types where it can, so a comparison there can succeed on an operand
163
+ * the Rego — which is explicitly type-guarded — rejects.
164
+ */
165
+ export type PolicyHclFidelity = "exact" | "approximate";
166
+ export declare function policyHclFidelity(spec: PolicyRuleSpec): PolicyHclFidelity;
167
+ /**
168
+ * Emit a HashiCorp tfpolicy `.policy.hcl` for one spec.
169
+ *
170
+ * We AUTHOR this dialect; we do not enforce it. `tfpolicy` has no
171
+ * credential-free local plan evaluation and its binary is source-closed, so it
172
+ * cannot replace the OPA gate — the value is that an HCP customer gets a native
173
+ * artifact they can validate and run in their own pipeline.
174
+ */
175
+ export declare function emitPolicyHcl(spec: PolicyRuleSpec): string;
176
+ /**
177
+ * Emit the `.policytest.hcl` companion — the same three fixtures the in-process
178
+ * self-test used, expressed as tfpolicy mocks. This is what turns "we authored
179
+ * it" into something the customer can verify in one command.
180
+ */
181
+ export declare function emitPolicyTestHcl(spec: PolicyRuleSpec): string;
182
+ /**
183
+ * The generated fixtures as a `terraform show -json`-shaped document, so the
184
+ * emitted Rego can be executed against them by conftest without a real plan.
185
+ * One resource per fixture, named for its role.
186
+ */
187
+ export declare function emitPlanFixture(spec: PolicyRuleSpec): string;
188
+ export declare function regoFileName(spec: PolicyRuleSpec): string;
189
+ export declare function policyFileName(spec: PolicyRuleSpec): string;
190
+ export declare function policyTestFileName(spec: PolicyRuleSpec): string;
191
+ export declare function planFixtureFileName(spec: PolicyRuleSpec): string;