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,431 @@
1
+ import { closeSync, openSync, readdirSync, readSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ /**
5
+ * Multi-language IaC support for the READ-ONLY surfaces (Assess / SARIF /
6
+ * evidence). One honest principle throughout: **breadth never dilutes the moat**
7
+ * — trivy and checkov already parse these formats, so Assess widens to them, but
8
+ * Remediate stays Terraform-first (the `✗→✓` proof + equivalence machinery is
9
+ * Terraform-specific and is never faked for other formats; `terraform_scan` and
10
+ * the fix loop keep their Terraform-only filter).
11
+ *
12
+ * Everything here is verified against the scanners' actual support matrices
13
+ * (checkov 3.3.x `--framework` values; trivy 0.7x `--misconfig-scanners`), and
14
+ * the matrix below records per-language coverage HONESTLY — including what is
15
+ * NOT scannable (Pulumi programs have no credible static scanner: checkov never
16
+ * shipped one, trivy has none, and `pulumi preview` requires the engine + a
17
+ * backend). A detected-but-unscannable language is REPORTED as such, never
18
+ * silently dropped and never given fabricated findings.
19
+ */
20
+
21
+ export const IAC_LANGUAGES = [
22
+ "terraform",
23
+ "cloudformation",
24
+ "kubernetes",
25
+ "helm",
26
+ "kustomize",
27
+ "dockerfile",
28
+ "arm",
29
+ "bicep",
30
+ "serverless",
31
+ "ansible",
32
+ "pulumi",
33
+ ] as const;
34
+ export type IacLanguage = (typeof IAC_LANGUAGES)[number];
35
+
36
+ export const LANGUAGE_LABEL: Record<IacLanguage, string> = {
37
+ terraform: "Terraform / OpenTofu",
38
+ cloudformation: "CloudFormation",
39
+ kubernetes: "Kubernetes manifests",
40
+ helm: "Helm charts",
41
+ kustomize: "Kustomize",
42
+ dockerfile: "Dockerfile / Containerfile",
43
+ arm: "Azure ARM templates",
44
+ bicep: "Azure Bicep",
45
+ serverless: "Serverless Framework",
46
+ ansible: "Ansible",
47
+ pulumi: "Pulumi",
48
+ };
49
+
50
+ /**
51
+ * Which of the two multi-format scanners genuinely covers each language, with
52
+ * the caveat an operator must know. This is the single source of the honesty
53
+ * notes the scorecard prints — a language whose only covering scanner didn't
54
+ * run is a COVERAGE GAP, not a pass, and a language neither covers is reported
55
+ * `unsupported`, never scanned-and-silent.
56
+ */
57
+ export const LANGUAGE_COVERAGE: Record<
58
+ IacLanguage,
59
+ { trivy: boolean; checkov: boolean; note?: string }
60
+ > = {
61
+ terraform: {
62
+ trivy: true,
63
+ checkov: true,
64
+ note: "OpenTofu: `.tf` repos are fully covered; `.tofu` files are scanned by trivy only (checkov does not read them yet)",
65
+ },
66
+ cloudformation: { trivy: true, checkov: true },
67
+ kubernetes: { trivy: true, checkov: true },
68
+ helm: {
69
+ trivy: true,
70
+ checkov: true,
71
+ note: "trivy renders charts built-in; checkov's helm framework needs the `helm` binary on the runner (skipped without it)",
72
+ },
73
+ kustomize: {
74
+ trivy: false,
75
+ checkov: true,
76
+ note: "checkov only, and it needs the `kustomize` binary on the runner",
77
+ },
78
+ dockerfile: { trivy: true, checkov: true },
79
+ arm: { trivy: true, checkov: true },
80
+ bicep: {
81
+ trivy: false,
82
+ checkov: true,
83
+ note: "checkov scans .bicep natively; trivy needs `az bicep build` to ARM JSON first",
84
+ },
85
+ serverless: { trivy: false, checkov: true },
86
+ ansible: {
87
+ trivy: false,
88
+ checkov: true,
89
+ note: "checkov's ansible framework; trivy's ansible scanner is experimental (AWS S3 modules only) and not relied on",
90
+ },
91
+ pulumi: {
92
+ trivy: false,
93
+ checkov: false,
94
+ note: "no static scanner can parse Pulumi programs (TypeScript/Python/Go); `pulumi preview` needs the Pulumi engine + backend credentials",
95
+ },
96
+ };
97
+
98
+ /** The checkov `--framework` values a language enables. `terraform_json` rides
99
+ * with terraform so CDKTF synth output (`cdk.tf.json`) is covered. */
100
+ const CHECKOV_FRAMEWORKS: Record<IacLanguage, string[]> = {
101
+ terraform: ["terraform", "terraform_json"],
102
+ cloudformation: ["cloudformation"],
103
+ kubernetes: ["kubernetes"],
104
+ helm: ["helm"],
105
+ kustomize: ["kustomize"],
106
+ dockerfile: ["dockerfile"],
107
+ arm: ["arm"],
108
+ bicep: ["bicep"],
109
+ serverless: ["serverless"],
110
+ ansible: ["ansible"],
111
+ pulumi: [],
112
+ };
113
+
114
+ /** The checkov `--framework` list for a scanned-language set (sorted, deduped).
115
+ * Always includes terraform so the scanner invocation can never regress the
116
+ * core product even on an empty/odd scope. Pure. */
117
+ export function checkovFrameworksFor(scanned: readonly IacLanguage[]): string[] {
118
+ const out = new Set<string>(CHECKOV_FRAMEWORKS.terraform);
119
+ for (const lang of scanned) {
120
+ for (const fw of CHECKOV_FRAMEWORKS[lang] ?? []) out.add(fw);
121
+ }
122
+ return [...out].sort();
123
+ }
124
+
125
+ // trivy `Results[].Type` → language. Plan-JSON results count as terraform (they
126
+ // describe Terraform resources); yaml/json custom-check types are unmapped (off
127
+ // by default in trivy, and we don't enable them).
128
+ const TRIVY_TYPE_TO_LANGUAGE: Record<string, IacLanguage> = {
129
+ terraform: "terraform",
130
+ terraformplan: "terraform",
131
+ "terraformplan-json": "terraform",
132
+ "terraformplan-snapshot": "terraform",
133
+ cloudformation: "cloudformation",
134
+ kubernetes: "kubernetes",
135
+ helm: "helm",
136
+ dockerfile: "dockerfile",
137
+ "azure-arm": "arm",
138
+ ansible: "ansible",
139
+ };
140
+
141
+ /** Map a trivy result `Type` to a language; null for types we don't model. Pure. */
142
+ export function trivyTypeToLanguage(type: string | undefined): IacLanguage | null {
143
+ return type ? (TRIVY_TYPE_TO_LANGUAGE[type.toLowerCase()] ?? null) : null;
144
+ }
145
+
146
+ // checkov `check_type` → language (one JSON block per framework that ran).
147
+ const CHECKOV_TYPE_TO_LANGUAGE: Record<string, IacLanguage> = {
148
+ terraform: "terraform",
149
+ terraform_json: "terraform",
150
+ terraform_plan: "terraform",
151
+ cloudformation: "cloudformation",
152
+ kubernetes: "kubernetes",
153
+ helm: "helm",
154
+ kustomize: "kustomize",
155
+ dockerfile: "dockerfile",
156
+ arm: "arm",
157
+ bicep: "bicep",
158
+ serverless: "serverless",
159
+ ansible: "ansible",
160
+ };
161
+
162
+ /** Map a checkov block `check_type` to a language; null for types we don't model. Pure. */
163
+ export function checkovTypeToLanguage(checkType: string | undefined): IacLanguage | null {
164
+ return checkType ? (CHECKOV_TYPE_TO_LANGUAGE[checkType.toLowerCase()] ?? null) : null;
165
+ }
166
+
167
+ const YAML_EXT = /\.ya?ml$/i;
168
+
169
+ /**
170
+ * Classify a file by path alone (no content). Returns the language, or
171
+ * "needs-content" for yaml/json whose kind is only knowable by sniffing, or null
172
+ * for a file that is no IaC we model. Pure.
173
+ */
174
+ export function classifyByPath(path: string): IacLanguage | "needs-content" | null {
175
+ const norm = path.replace(/\\/g, "/");
176
+ const base = (norm.split("/").pop() ?? "").toLowerCase();
177
+
178
+ if (base.endsWith(".tf") || base.endsWith(".tfvars") || base.endsWith(".tf.json"))
179
+ return "terraform";
180
+ if (base.endsWith(".tofu") || base.endsWith(".tofu.json")) return "terraform";
181
+ if (base === "dockerfile" || base === "containerfile" || base.endsWith(".dockerfile"))
182
+ return "dockerfile";
183
+ if (base.startsWith("dockerfile.") || base.startsWith("containerfile.")) return "dockerfile";
184
+ if (base.endsWith(".bicep")) return "bicep";
185
+ if (base === "chart.yaml" || base === "chart.yml") return "helm";
186
+ if (base === "kustomization.yaml" || base === "kustomization.yml") return "kustomize";
187
+ if (base === "serverless.yml" || base === "serverless.yaml") return "serverless";
188
+ if (base === "pulumi.yaml" || base === "pulumi.yml" || /^pulumi\..+\.ya?ml$/.test(base))
189
+ return "pulumi";
190
+ // CDK synth output — CloudFormation JSON regardless of directory.
191
+ if (base.endsWith(".template.json")) return "cloudformation";
192
+ if (YAML_EXT.test(base) || base.endsWith(".json")) return "needs-content";
193
+ return null;
194
+ }
195
+
196
+ /**
197
+ * Classify a yaml/json file by its content (first few KB). Conservative: only
198
+ * unmistakable markers classify; anything ambiguous returns null (better to
199
+ * under-detect than to claim coverage of a file no scanner will read). Pure.
200
+ */
201
+ export function classifyByContent(path: string, content: string): IacLanguage | null {
202
+ const head = content.slice(0, 4096);
203
+ if (/\.json$/i.test(path)) {
204
+ // ARM: the $schema pins it; CloudFormation JSON: template-version or typed Resources.
205
+ if (/"\$schema"\s*:\s*"[^"]*deploymentTemplate\.json/i.test(head)) return "arm";
206
+ if (/"AWSTemplateFormatVersion"/.test(head)) return "cloudformation";
207
+ if (/"Resources"\s*:/.test(head) && /"Type"\s*:\s*"(AWS|Alexa|Custom)::/.test(head))
208
+ return "cloudformation";
209
+ return null;
210
+ }
211
+ // yaml
212
+ if (/^AWSTemplateFormatVersion/m.test(head)) return "cloudformation";
213
+ if (/^Resources:/m.test(head) && /^\s+Type:\s*['"]?(AWS|Alexa|Custom)::/m.test(head))
214
+ return "cloudformation";
215
+ // A Go-templated file (`{{ … }}`) is a Helm chart template, NOT a raw Kubernetes
216
+ // manifest — even though it carries apiVersion/kind. Classifying it as kubernetes
217
+ // would double-count a Helm chart AND point checkov's k8s parser at un-rendered
218
+ // templates. Helm charts are detected by their `Chart.yaml` (classifyByPath); the
219
+ // helm framework renders the templates itself, so skip template files here.
220
+ if (head.includes("{{")) return null;
221
+ if (/^apiVersion:/m.test(head) && /^kind:/m.test(head)) return "kubernetes";
222
+ // Ansible playbook: a top-level play list with hosts + tasks/roles.
223
+ if (/^-\s+(name|hosts):/m.test(head) && /^\s+(hosts|tasks|roles):/m.test(head)) return "ansible";
224
+ return null;
225
+ }
226
+
227
+ /**
228
+ * The language a concern belongs to, for scope filtering: the scanner-reported
229
+ * language when present, else a path-only classification (fmt/validate/tflint
230
+ * only ever fire on Terraform), else terraform (the historical default — a
231
+ * reviewer-loaded concern with an unknowable file stays in the core scope
232
+ * rather than vanishing). Pure.
233
+ */
234
+ export function languageOfConcern(c: {
235
+ language?: IacLanguage | undefined;
236
+ location: { file: string };
237
+ }): IacLanguage {
238
+ if (c.language) return c.language;
239
+ const byPath = classifyByPath(c.location.file);
240
+ return byPath === null || byPath === "needs-content" ? "terraform" : byPath;
241
+ }
242
+
243
+ // mirror walkTfFiles' bounds so a huge monorepo can't stall detection.
244
+ const SKIP_DIRS = new Set([
245
+ ".git",
246
+ ".terraform",
247
+ ".terragrunt-cache",
248
+ ".venv",
249
+ "venv",
250
+ "node_modules",
251
+ ".idea",
252
+ ".vscode",
253
+ ]);
254
+ const MAX_DEPTH = 8;
255
+ const FILE_CAP = 4000;
256
+ // only this much of a yaml/json file is read for classification.
257
+ const SNIFF_BYTES = 4096;
258
+
259
+ /** the first SNIFF_BYTES of a file, without reading the rest (a giant yaml/json
260
+ * must not stall detection); "" when unreadable. */
261
+ function sniffHead(absPath: string): string {
262
+ try {
263
+ const fd = openSync(absPath, "r");
264
+ try {
265
+ const buf = Buffer.alloc(SNIFF_BYTES);
266
+ const n = readSync(fd, buf, 0, SNIFF_BYTES, 0);
267
+ return buf.toString("utf8", 0, n);
268
+ } finally {
269
+ closeSync(fd);
270
+ }
271
+ } catch {
272
+ return "";
273
+ }
274
+ }
275
+
276
+ export interface DetectedLanguages {
277
+ /** every language present in the tree, most files first. */
278
+ detected: IacLanguage[];
279
+ /** file count per detected language (the scorecard's breadth line). */
280
+ fileCounts: Partial<Record<IacLanguage, number>>;
281
+ }
282
+
283
+ /**
284
+ * Walk the workspace and detect which IaC languages are present. Bounded (depth
285
+ * + file cap + skip dirs) and read-only; yaml/json files are sniffed from their
286
+ * first bytes only. Terraform is detected by extension; everything else by
287
+ * basename or unmistakable content markers. Pure-ish (read-only I/O).
288
+ */
289
+ export function detectIacLanguages(cwd: string): DetectedLanguages {
290
+ const counts = new Map<IacLanguage, number>();
291
+ let seen = 0;
292
+ const visit = (dir: string, rel: string, depth: number): void => {
293
+ if (depth > MAX_DEPTH || seen >= FILE_CAP) return;
294
+ let entries: import("node:fs").Dirent[];
295
+ try {
296
+ entries = readdirSync(dir, { withFileTypes: true });
297
+ } catch {
298
+ return;
299
+ }
300
+ for (const e of entries) {
301
+ if (seen >= FILE_CAP) return;
302
+ if (e.isDirectory()) {
303
+ if (SKIP_DIRS.has(e.name)) continue;
304
+ visit(join(dir, e.name), rel ? `${rel}/${e.name}` : e.name, depth + 1);
305
+ continue;
306
+ }
307
+ if (!e.isFile()) continue;
308
+ seen++;
309
+ const relPath = rel ? `${rel}/${e.name}` : e.name;
310
+ let lang = classifyByPath(relPath);
311
+ if (lang === "needs-content") {
312
+ lang = classifyByContent(relPath, sniffHead(join(dir, e.name)));
313
+ }
314
+ if (lang) counts.set(lang, (counts.get(lang) ?? 0) + 1);
315
+ }
316
+ };
317
+ visit(cwd, "", 0);
318
+ const detected = [...counts.entries()]
319
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
320
+ .map(([lang]) => lang);
321
+ const fileCounts: Partial<Record<IacLanguage, number>> = {};
322
+ for (const [lang, n] of counts) fileCounts[lang] = n;
323
+ return { detected, fileCounts };
324
+ }
325
+
326
+ export interface LanguageScope {
327
+ /** the languages this run's read-only surfaces report on (scope ∩ scannable). */
328
+ scanned: IacLanguage[];
329
+ /** every language detected in the tree (superset of scanned + unsupported). */
330
+ detected: IacLanguage[];
331
+ fileCounts: Partial<Record<IacLanguage, number>>;
332
+ /** detected languages NO installed scanner can statically assess — surfaced,
333
+ * never silently dropped (e.g. pulumi). */
334
+ unsupported: { language: IacLanguage; reason: string }[];
335
+ /** iac_languages tokens that matched no known language (operator typo). */
336
+ unknown_tokens: string[];
337
+ }
338
+
339
+ /** membership test for the scope filter (terraform is always in scope). */
340
+ export function inLanguageScope(scope: Pick<LanguageScope, "scanned">) {
341
+ const set = new Set<IacLanguage>(scope.scanned);
342
+ return (c: { language?: IacLanguage | undefined; location: { file: string } }): boolean =>
343
+ set.has(languageOfConcern(c));
344
+ }
345
+
346
+ /**
347
+ * Resolve the operator's `iac_languages` setting against what the tree actually
348
+ * contains. `auto` (the default) scans every detected language a scanner can
349
+ * read; `terraform` restores the historical Terraform-only behaviour; a comma
350
+ * list pins an explicit set (terraform is always included — the core product is
351
+ * never configured away). Detected-but-unscannable languages land in
352
+ * `unsupported` with the honest reason. Pure given the detection result.
353
+ */
354
+ export function resolveLanguageScope(
355
+ raw: string | undefined,
356
+ detection: DetectedLanguages,
357
+ ): LanguageScope {
358
+ const tokens = (raw ?? "auto")
359
+ .split(",")
360
+ .map((t) => t.trim().toLowerCase())
361
+ .filter(Boolean);
362
+ const auto = tokens.length === 0 || tokens.includes("auto");
363
+ const known = new Set<IacLanguage>(IAC_LANGUAGES);
364
+ const unknown_tokens = tokens.filter((t) => t !== "auto" && !known.has(t as IacLanguage));
365
+
366
+ const scannable = (lang: IacLanguage): boolean =>
367
+ LANGUAGE_COVERAGE[lang].trivy || LANGUAGE_COVERAGE[lang].checkov;
368
+
369
+ const wanted = new Set<IacLanguage>(["terraform"]);
370
+ if (auto) {
371
+ for (const lang of detection.detected) wanted.add(lang);
372
+ } else {
373
+ for (const t of tokens) {
374
+ if (known.has(t as IacLanguage)) wanted.add(t as IacLanguage);
375
+ }
376
+ }
377
+
378
+ const unsupported = [...wanted]
379
+ .filter((lang) => !scannable(lang))
380
+ .map((lang) => ({
381
+ language: lang,
382
+ reason: LANGUAGE_COVERAGE[lang].note ?? "no static scanner covers this language",
383
+ }));
384
+
385
+ const scanned = IAC_LANGUAGES.filter((lang) => wanted.has(lang) && scannable(lang));
386
+ return {
387
+ scanned,
388
+ detected: detection.detected,
389
+ fileCounts: detection.fileCounts,
390
+ unsupported,
391
+ unknown_tokens,
392
+ };
393
+ }
394
+
395
+ /**
396
+ * Enforce the matrix's own honesty rule AGAINST the run's actual scanner
397
+ * outcomes: a language whose every covering scanner was skipped/disabled this
398
+ * run (e.g. `tools_enabled: "-checkov"` on a Bicep repo — Bicep is checkov-only)
399
+ * moves from `scanned` to `unsupported` with the reason, instead of being
400
+ * reported as scanned-clean-with-zero-findings. Terraform always stays: the
401
+ * native toolchain (fmt/validate/tflint) covers it regardless of trivy/checkov.
402
+ */
403
+ export function applyScannerAvailability(
404
+ scope: LanguageScope,
405
+ ran: { trivy: boolean; checkov: boolean },
406
+ ): LanguageScope {
407
+ const uncovered = (lang: IacLanguage): boolean => {
408
+ if (lang === "terraform") return false;
409
+ const cov = LANGUAGE_COVERAGE[lang];
410
+ return !((cov.trivy && ran.trivy) || (cov.checkov && ran.checkov));
411
+ };
412
+ const dropped = scope.scanned.filter(uncovered);
413
+ if (dropped.length === 0) return scope;
414
+ return {
415
+ ...scope,
416
+ scanned: scope.scanned.filter((lang) => !uncovered(lang)),
417
+ unsupported: [
418
+ ...scope.unsupported,
419
+ ...dropped.map((lang) => {
420
+ const cov = LANGUAGE_COVERAGE[lang];
421
+ const covering = [cov.trivy ? "trivy" : null, cov.checkov ? "checkov" : null]
422
+ .filter(Boolean)
423
+ .join(" / ");
424
+ return {
425
+ language: lang,
426
+ reason: `its covering scanner${covering.includes("/") ? "s" : ""} (${covering}) did not run this time — coverage gap, not a pass`,
427
+ };
428
+ }),
429
+ ],
430
+ };
431
+ }