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
package/README.md ADDED
@@ -0,0 +1,244 @@
1
+ # Infraweaver
2
+
3
+ [![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)
4
+ [![CI](https://github.com/infraweaver-io/infraweaver-action/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/infraweaver-io/infraweaver-action/actions/workflows/test.yml)
5
+ [![Version](https://img.shields.io/badge/version-0.1.0-blue.svg)](package.json)
6
+
7
+ **Infraweaver brings your Terraform up to best practice — automatically, as reviewable pull requests.**
8
+
9
+ > 🌐 **Languages:** [🇩🇪 Deutsch](docs/i18n/README.de.md) · [🇪🇸 Español](docs/i18n/README.es.md) · [🇵🇱 Polski](docs/i18n/README.pl.md) · [🇷🇴 Română](docs/i18n/README.ro.md) — condensed summaries; this English README is canonical.
10
+
11
+ Infraweaver is an open-source ([AGPL-3.0](#licence)) GitHub Action and agent runtime. Point it at a
12
+ repository and it scans the Terraform with standard deterministic tools, then opens **one scoped,
13
+ reviewable pull request per concern** that fixes the issue and **proves it fixed** by re-scanning the
14
+ branch (✗ → ✓). It never auto-merges — a human always reviews.
15
+
16
+ - **It proves its own fixes.** The PR body records `✗ → ✓ <rule> resolved`, produced by re-running the
17
+ same deterministic scanners on the branch. Anyone can reproduce it — evidence, not a claim.
18
+ - **Tools decide, the LLM assists.** Findings come from `terraform fmt`/`validate`, tflint, Trivy and
19
+ Checkov — not the model's opinion. The agent only applies the minimal, constrained fix.
20
+ - **One scoped PR per concern.** Small, reviewable diffs on stable `remediate/<id>` branches. Re-runs
21
+ update the existing PR rather than opening duplicates.
22
+ - **Guardrails enforced in code, not prompts.** Terraform-only edits, no inlined secrets, no destroying
23
+ stateful data, never auto-merges — all fail-closed at push time.
24
+ - **Module-aware.** Fixes land at the module source, version upgrades arrive as scoped `chore(deps)`
25
+ PRs, and resource piles become module calls only when a pure-`moved` plan proves the refactor is a
26
+ no-op.
27
+ - **Bring your own key, no hosted backend.** Supply your own LLM key, pointed at an approved endpoint
28
+ where data residency matters. Nothing leaves your runner that you didn't configure.
29
+
30
+ ## Quickstart
31
+
32
+ ```yaml
33
+ name: Infraweaver — Terraform remediation
34
+ on:
35
+ workflow_dispatch:
36
+ schedule:
37
+ - cron: "0 6 * * 1" # weekly drift sweep
38
+
39
+ permissions:
40
+ contents: write # push the remediation branch
41
+ pull-requests: write # open the PR
42
+
43
+ jobs:
44
+ remediate:
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ # Pin third-party actions to a commit SHA — a tag can be force-repointed.
48
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
49
+
50
+ # install the Terraform best-practice toolchain (absent tools are skipped, never fatal)
51
+ - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3
52
+ - uses: terraform-linters/setup-tflint@90f302c255ef959cbfb4bd10581afecdb7ece3e6 # v4
53
+ - uses: aquasecurity/setup-trivy@81e514348e19b6112ce2a7e3ecbafe19c1e1f567 # v0.3.1
54
+ with:
55
+ # renovate: datasource=github-releases depName=aquasecurity/trivy
56
+ version: v0.72.0 # pin the TOOL too: a SHA-pinned action still installs floating-latest
57
+ - run: pipx install checkov
58
+
59
+ - name: Run Infraweaver
60
+ uses: infraweaver-io/infraweaver-action@main
61
+ with:
62
+ mode: remediate
63
+ severity_threshold: medium # only act on medium+ concerns
64
+ max_prs: 1 # one scoped PR per run
65
+ env:
66
+ # bring your own LLM key (BYOK)
67
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
68
+ GITHUB_TOKEN: ${{ github.token }}
69
+ ```
70
+
71
+ > **Ready-to-use workflows:** [`examples/`](examples/) has copy-pasteable workflows — scheduled
72
+ > [remediation](examples/remediate.yml), [behaviour-preserving refactors](examples/refactor.yml),
73
+ > [comment-triggered fixes](examples/comment-fix.yml), and the full
74
+ > [SARIF + plan-gate + policy setup](examples/remediate-advanced.yml).
75
+
76
+ ## How it works
77
+
78
+ ```mermaid
79
+ flowchart LR
80
+ A[Scan<br/>fmt · validate · tflint<br/>Trivy · Checkov] --> B[Concerns<br/>severity-ranked,<br/>grouped]
81
+ B --> C[Fix<br/>minimal change,<br/>Terraform-only]
82
+ C --> D[Validate<br/>fmt · validate · tflint]
83
+ D --> E[Plan gate<br/>optional, with creds]
84
+ E --> F[Open one<br/>scoped PR]
85
+ F --> G[Re-scan branch<br/>✗ → ✓ proof]
86
+ G -.->|regression / needs-human| H[Label for a human]
87
+ ```
88
+
89
+ **Scanners find the problem, the agent applies the minimal fix, and the scanners verify it** before a
90
+ single PR is opened. Coverage is inherited, not reinvented: findings come from the scanners Infraweaver
91
+ runs (Checkov's 1,000+ policies, Trivy's AVD checks, tflint's provider rulesets, `fmt`/`validate`), so
92
+ new upstream checks show up the day you update the scanner. The PR's **Validation (✗ → ✓)** section is
93
+ the part you can trust without trusting Infraweaver — re-run the same scanners on the branch and
94
+ reproduce it. Higher-risk fixes (a regression, a stateful destroy/replace, a large blast radius, a
95
+ non-deterministic plan) get a `> [!CAUTION]` banner and a `needs-human` label.
96
+
97
+ ## How Infraweaver compares
98
+
99
+ | | Reports findings | Fixes the code | Proves the fix | Opens a PR | Auto-merges |
100
+ | -------------------------------------------- | :--------------: | :----------------: | :----------------: | :------------------: | :---------: |
101
+ | **Scanners** (Checkov, Trivy, tfsec, tflint) | ✅ | ❌ | ❌ | ❌ | — |
102
+ | **Plan orchestrators** (Atlantis, Digger) | ❌ | ❌ | ❌ | comments on yours | ❌ |
103
+ | **Dependency bots** (Dependabot, Renovate) | ✅ (deps) | ✅ (version bumps) | ❌ | ✅ | optional |
104
+ | **Auto-fix AI bots** | partial | ✅ | rarely | ✅ | often |
105
+ | **Infraweaver** | ✅ | ✅ | ✅ (✗ → ✓ re-scan) | ✅ (one per concern) | **never** |
106
+
107
+ ## Modes
108
+
109
+ A run is one **mode** — the verb it performs. Pin it with the `mode:` input for a deterministic CI
110
+ run (the Terraform CI modes ship an engine-owned prompt that a workflow can't override), or omit it
111
+ to let Infraweaver pick from the trigger. Full reference: **<https://infraweaver.dev/docs/modes>**.
112
+
113
+ | Mode | Commits? | What it does |
114
+ | --- | :---: | --- |
115
+ | **Assess** | ❌ | Read-only security/best-practice posture scan — the PR gate. |
116
+ | **TerraformCodeReview** | ❌ | Read-only `*.tf`-only review of a human PR (security, state-safety, version pins, module hygiene). |
117
+ | **PolicyGate** | ❌ | Read-only OPA/conftest policy gate (PASS / FAIL / INCONCLUSIVE). |
118
+ | **DriftDetect** | ❌ | Read-only scheduled drift check — `terraform plan` vs live state. |
119
+ | **ComplianceAudit** | ❌ | Read-only controls audit mapped to `required_controls`, emits OSCAL. |
120
+ | **Remediate** | ✅ | Fixes the top finding group, one scoped PR, proven by a ✗→✓ re-scan. |
121
+ | **Refactor** | ✅ | Behaviour-preserving modularise/normalise, proven `equivalent: true`. |
122
+ | **RemediateAndRefactor** | ✅ | Fix + modularise in one PR with two distinct proofs. |
123
+ | **UpdateDependencies** | ✅ | Bumps stale provider/module pins, proven by equivalence or a reviewed plan. |
124
+ | **ModernizeDeprecated** | ✅ | Migrates deprecated patterns, one class per PR, proven by a reviewed plan. |
125
+ | **CostOptimization** | ✅ | infracost-quantified rightsizing PRs (needs `INFRACOST_API_KEY`). |
126
+
127
+ Plus general verbs auto-selected from the trigger — **Build**, **Review**, **IncrementalReview**,
128
+ **AddressReviews**, **Fix**, **Plan**, **SummarizePr**, **ResolveConflicts**, **Task**. Infraweaver
129
+ **never auto-merges** — every PR is left for human review.
130
+
131
+ ### Signed evidence
132
+
133
+ The compliance artefacts (`terraform_emit_evidence`, `terraform_emit_vex`) can be **signed** with a
134
+ detached Ed25519 signature so an auditor can verify them offline. Generate a keypair once, store the
135
+ private half as a repo/org secret, and pass it to the runs that emit evidence:
136
+
137
+ ```bash
138
+ # one-time: generate the keypair (private key never leaves your secret store)
139
+ openssl genpkey -algorithm ed25519 -out infraweaver-signing.pem
140
+ openssl pkey -in infraweaver-signing.pem -pubout -out infraweaver-signing.pub.pem # publish this half
141
+ base64 -w0 infraweaver-signing.pem # → the INFRAWEAVER_SIGNING_KEY secret value
142
+ ```
143
+
144
+ ```yaml
145
+ env:
146
+ INFRAWEAVER_SIGNING_KEY: ${{ secrets.INFRAWEAVER_SIGNING_KEY }}
147
+ ```
148
+
149
+ Each artefact then ships with a sibling `.sig` plus the public key + fingerprint embedded in its
150
+ `signature` metadata; verify with `infraweaver verify-evidence <bundle> <bundle>.sig <pubkey.pem>`.
151
+ Without the secret nothing breaks — artefacts honestly record `"signature": null`.
152
+
153
+ #### Keyless (Sigstore) attestation — no key to manage
154
+
155
+ For a second, key-free tier, set `INFRAWEAVER_KEYLESS_SIGNING: true` on a GitHub Actions run that emits
156
+ evidence. Infraweaver then also writes a `<artefact>.sigstore.json` — an in-toto attestation of the
157
+ artefact (by sha256 digest) signed with the **workflow's ephemeral OIDC identity**: [Fulcio][fulcio]
158
+ issues a short-lived certificate bound to *this repo + workflow + run*, and the signing event is
159
+ recorded in the public [Rekor][rekor] transparency log. There is nothing to distribute — a verifier
160
+ checks the certificate identity (the workflow + the GitHub OIDC issuer), auditable in a public log. It
161
+ reuses the `id-token: write` permission Infraweaver already requires, so **no extra workflow permission
162
+ is needed**, and it's best-effort (a Fulcio/Rekor hiccup never blocks emitting evidence). Verify it
163
+ with the Cloud MCP server's `infraweaver_verify_keyless` tool.
164
+
165
+ [fulcio]: https://github.com/sigstore/fulcio
166
+ [rekor]: https://github.com/sigstore/rekor
167
+
168
+ #### Verifying Infraweaver itself
169
+
170
+ Evidence over trust applies to us too: don't take the code on faith, check it. Infraweaver is consumed
171
+ from `main`, so there are no published release artefacts — you verify the tree you're running and the
172
+ inventory it builds.
173
+
174
+ ```bash
175
+ # 1. Build the CycloneDX SBOM from the same lockfile CI installs from, then
176
+ # Ed25519-sign it with your own key.
177
+ pnpm sbom && pnpm sign:sbom
178
+
179
+ # 2. Verify the signature offline — no network, no trust in npm or GitHub,
180
+ # using the public key shipped beside it.
181
+ node -e "const s=require('./infraweaver.cdx.json.sig.json');require('node:fs').writeFileSync('pub.pem',s.public_key)"
182
+ infraweaver verify-evidence infraweaver.cdx.json infraweaver.cdx.json.sig pub.pem
183
+ ```
184
+
185
+ `infraweaver.cdx.json` is a **CycloneDX 1.7 SBOM of the locked dependency tree** — generated from
186
+ `pnpm-lock.yaml` (what CI actually installed from), so it describes exactly what a run installs
187
+ rather than a re-resolution of it. If you need it for a CRA or procurement dossier, that file plus
188
+ the verification step above is the artefact set.
189
+
190
+ > **What this does and does not prove.** The signature binds the inventory to bytes. It does not
191
+ > assert the dependencies are free of vulnerabilities — that's what the SBOM is *for*: feed it to
192
+ > your own scanner.
193
+
194
+ ## Documentation
195
+
196
+ The full guides live on the docs site, **<https://infraweaver.dev/docs>**. The repo keeps the
197
+ machine-generated references next to the code.
198
+
199
+ | Doc | What's in it | Full guide |
200
+ | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
201
+ | [Action inputs & outputs](docs/action-inputs.md) | The complete `action.yml` reference (generated — never drifts) | — |
202
+ | Modes | Every run mode — what it does, whether it commits, and how it proves its change | <https://infraweaver.dev/docs/modes> |
203
+ | [Configuration](docs/configuration.md) | Modes, comment-scoped runs, scoping out findings, the plan gate & OIDC roles, BYOK, SARIF, repo config, scheduling, modules | <https://infraweaver.dev/docs/configuration> |
204
+ | [Security model](docs/security-model.md) | The code-level guardrails and the trust/data-privacy story (generated from `src/mcp/guardrails.ts`) | <https://infraweaver.dev/docs/security-model> |
205
+ | [Native rules](docs/native-rules.md) | The `source: infraweaver` findings no upstream scanner can produce, and the bands that decide each verdict | — |
206
+ | [Policy authoring](docs/policy-authoring.md) | Turning a written standard into reviewable Rego with `policy_author`, enforced by `policy_check` | — |
207
+ | [MCP server (local)](docs/mcp.md) | `infraweaver mcp` in your IDE + pairing with HashiCorp's terraform-mcp-server | <https://infraweaver.dev/docs/mcp> |
208
+ | MCP server (Cloud) | `@infraweaver/mcp-server` — read a connected repo's Cloud findings, health score & signed evidence from your IDE agent | <https://infraweaver.dev/docs/mcp-cloud> |
209
+ | [Tools](docs/tools.md) | Every MCP tool the agent uses, and the CLI binaries they shell out to | <https://infraweaver.dev/docs/tools> |
210
+ | [Supported models](docs/models.md) | The model catalog and how selection works (generated) | — |
211
+
212
+ ## Support
213
+
214
+ - **Getting started / usage** — this README, the [docs](https://infraweaver.dev/docs), and the [`examples/`](examples/) workflows.
215
+ - **Bug reports & feature requests** — open a [GitHub issue](https://github.com/infraweaver-io/infraweaver-action/issues).
216
+ - **Security vulnerabilities** — **don't** use a public issue; see [Security](#security) below.
217
+
218
+ ## Contributing
219
+
220
+ Contributions are welcome. Infraweaver standardises on **Node 24** and **pnpm 11**:
221
+
222
+ ```bash
223
+ corepack enable
224
+ pnpm install --frozen-lockfile
225
+ pnpm typecheck
226
+ pnpm test
227
+ ```
228
+
229
+ All contributions are accepted under the [Contributor License Agreement](CLA.md) (enforced by the CLA
230
+ Assistant on your first PR). There are no tagged releases — consumers reference the action at
231
+ `@main`, and [Conventional Commits](https://www.conventionalcommits.org) prefixes keep the history
232
+ readable. See
233
+ [`CONTRIBUTING.md`](CONTRIBUTING.md) for the full development, commit, and action-pinning conventions.
234
+
235
+ ## Security
236
+
237
+ Infraweaver runs AI coding agents with write access to repositories and CI secrets, and is positioned for
238
+ security- and compliance-sensitive use. **Please don't open public issues for vulnerabilities** — report
239
+ them privately via [GitHub Security Advisories](https://github.com/infraweaver-io/infraweaver-action/security/advisories/new).
240
+ See [`SECURITY.md`](SECURITY.md) for scope, supported versions, and response targets.
241
+
242
+ ## Licence
243
+
244
+ Infraweaver is licensed under the **GNU Affero General Public License v3.0 or later** (AGPL-3.0-or-later).
@@ -0,0 +1,113 @@
1
+ import type { DispatchRecorder } from "#app/agents/dispatchMetrics";
2
+ import { type AgentResult, type AgentRunContext } from "#app/agents/shared";
3
+ import { type RunTokenQuota } from "#app/agents/tokenQuota";
4
+ import type { TodoTracker } from "#app/utils/todoTracking";
5
+ export declare const CLAUDE_EXEC_TOOL_DENY_RULES: string[];
6
+ export declare function writeMcpConfig(ctx: AgentRunContext): string;
7
+ /**
8
+ * Build the `--agents` JSON definition for the `loupe` subagent.
9
+ *
10
+ * The Claude Code path always runs against an Anthropic model (see
11
+ * resolveAgent), so we hardcode the cheaper-sibling downshift: lenses run
12
+ * on Sonnet, the orchestrator stays on whatever model `--model` was passed.
13
+ *
14
+ * Per-call model override is also possible (Task tool's `model` arg accepts
15
+ * 'sonnet' | 'opus' | 'haiku') and takes precedence over what's set here —
16
+ * we don't pass it; the per-subagent `model` field is the right default.
17
+ *
18
+ * The `model` is route-aware: the bare Anthropic-API id `claude-sonnet-5`
19
+ * is only valid on the direct API. On Bedrock (`eu.anthropic.…`) and Vertex
20
+ * (`@`-versioned) routes that id is rejected, and claude-code does not
21
+ * translate per-agent model names — so on those routes we omit `model`
22
+ * entirely and the lens inherits the orchestrator's (already valid) model.
23
+ *
24
+ * Kept in lockstep with the `claude-sonnet` alias in models.ts (the opencode
25
+ * path derives the same target via deriveSubagentModels); bump both together.
26
+ *
27
+ * The non-mutative + non-recursive contract is enforced by the prose system
28
+ * prompt baked into the agent — see action/agents/reviewer.ts for why we
29
+ * no longer wire per-agent `disallowedTools` here.
30
+ */
31
+ export declare function buildAgentsJson(routeAware?: {
32
+ isBedrock: boolean;
33
+ isVertex: boolean;
34
+ }): string;
35
+ export declare function stripProviderPrefix(specifier: string): string;
36
+ type RunParams = {
37
+ label: string;
38
+ cmd: string;
39
+ args: string[];
40
+ cwd: string;
41
+ env: Record<string, string | undefined>;
42
+ todoTracker?: TodoTracker | undefined;
43
+ onActivityTimeout?: (() => void) | undefined;
44
+ onToolUse?: ((event: {
45
+ toolName: string;
46
+ input: unknown;
47
+ }) => void) | undefined;
48
+ /** per-run token ceiling (LLM10). `label` is the accumulator's source key, so
49
+ * a `--resume` retry is charged on top of the attempt it resumes rather than
50
+ * replacing it. Absent → nothing to enforce. */
51
+ tokenQuota?: RunTokenQuota | undefined;
52
+ /** specialist-routing watch (agents/dispatchMetrics.ts). Passed as the bare
53
+ * recorder rather than the whole `toolState` — this runner drives a
54
+ * subprocess and has no business reading run state it cannot act on.
55
+ * Optional for the same reason `tokenQuota` is: subagent and test call sites
56
+ * have nothing to record. */
57
+ dispatchMetrics?: DispatchRecorder | undefined;
58
+ };
59
+ type ClaudeRunResult = AgentResult & {
60
+ sessionId?: string | undefined;
61
+ /** set when the failure was a synthetic-stop with a retryable provider
62
+ * status — the session is intact and worth a `--resume` retry. */
63
+ retryableTransient?: boolean | undefined;
64
+ };
65
+ /**
66
+ * Provider statuses worth a resume-retry: rate limit (429) and upstream 5xx
67
+ * (500–599, which includes Anthropic's 529 "overloaded"). Deterministic
68
+ * failures (401 auth, 400 validation) are excluded — resuming would just
69
+ * replay the same error at full cost.
70
+ */
71
+ export declare function isRetryableApiStatus(status: number | null | undefined): boolean;
72
+ /**
73
+ * Continue prompt for a `--resume` retry after a transient provider failure.
74
+ * The interrupted turn's tail may or may not have been applied server-side,
75
+ * so the prompt asks the model to re-check before repeating its last action.
76
+ */
77
+ export declare const TRANSIENT_RESUME_PROMPT: string;
78
+ /**
79
+ * Return the tail of `text` capped at `maxCodeUnits` UTF-16 code units,
80
+ * dropping any partial first line. used in the exit-non-zero stdout fallback
81
+ * so we never surface a truncated NDJSON event to operators —
82
+ * `result.stdout.slice(-2048)` would otherwise cut mid-line and produce a
83
+ * syntactically broken JSON fragment. code units rather than bytes because
84
+ * `String.prototype.slice` operates on UTF-16 units; for multi-byte UTF-8
85
+ * content the effective byte budget can be up to 4× the nominal limit.
86
+ */
87
+ export declare function tailLines(text: string, maxCodeUnits: number): string;
88
+ export declare function runClaude(params: RunParams): Promise<ClaudeRunResult>;
89
+ /**
90
+ * managed Stop hook. swaps the old `--resume <sessionId>` follow-up
91
+ * subprocesses (reflection + every gate retry — cost audit on PR #792
92
+ * showed reflection alone burned ~$0.85 / 111K cache_write per Opus run,
93
+ * almost all of it wasted re-running `getAttachmentMessages` in the fresh
94
+ * process) for a `{decision: "block", reason: ...}` injection inside the
95
+ * live `queryLoop`. existing session context is already in the prompt
96
+ * cache so only the new reason text is fresh cache_write.
97
+ *
98
+ * the script is intentionally minimal — all decision logic lives in the
99
+ * sidecar gate server (`gateServer.ts`), which reads live `ctx.toolState`
100
+ * mutations from the same process the MCP server runs in. budget +
101
+ * one-shot tracking lives there too, so re-fires across multiple stops in
102
+ * one session are safe. claude-code's 8-consecutive-block override is the
103
+ * last-line backstop.
104
+ */
105
+ export declare function buildStopHookScript(): string;
106
+ export interface ManagedSettingsParams {
107
+ ctx: AgentRunContext;
108
+ stopHookPath: string | null;
109
+ pretoolGateScriptPath: string;
110
+ }
111
+ export declare function buildManagedSettings(params: ManagedSettingsParams): Record<string, unknown>;
112
+ export declare const claude: import("#app/agents/shared").Agent;
113
+ export {};
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Claude Code `PreToolUse` hook source — written into `ctx.tmpdir` at runtime
3
+ * and registered via a tmpdir-scoped `settings.json` referenced by
4
+ * `--settings <path>` (see action/agents/claude.ts).
5
+ *
6
+ * Closes the subagent → state-mutating MCP tool path that motivated the
7
+ * 2026-05-18 zed-industries/cloud incident (`terralens` lens called
8
+ * `checkout_pr` mid-review and the orchestrator's next push clobbered an
9
+ * unrelated branch). Pairs with the `tool.execute.before` hook in
10
+ * action/agents/opencodePlugin.ts; both runtimes embed the same per-run deny
11
+ * set, derived from each MCP tool's `mutates` flag (`subagentDeniedToolNames`
12
+ * in action/mcp/server.ts).
13
+ *
14
+ * PreToolUse hook contract (verified against yasasbanukaofficial/claude-code
15
+ * `src/utils/hooks/hooksConfigManager.ts` and `src/utils/hooks.ts`):
16
+ * - stdin: JSON with `hook_event_name: "PreToolUse"`, `tool_name`,
17
+ * `tool_input`, `tool_use_id`, `session_id`, `cwd`, `transcript_path`,
18
+ * and crucially `agent_id` / `agent_type` populated when the call
19
+ * originates from a subagent (set by the SDK when a Task/Agent
20
+ * dispatches a tool — see `createBaseHookInput` in claude-code source).
21
+ * - exit 0 → allow, no output shown
22
+ * - exit 2 → block tool call AND show stderr to model (this is the path
23
+ * we want for the deny case — the subagent gets a clear refusal it can
24
+ * reason about and pick a different action)
25
+ * - other → show stderr to user only, continue with tool call
26
+ *
27
+ * The hook itself is intentionally tiny: stdin → JSON → check `agent_id`
28
+ * presence + `tool_name` against the deny list → exit 0 or 2. No deps.
29
+ *
30
+ * Why the script source is a string template, not a separate `.ts` file
31
+ * shipped with the action: the action runs as a published npm package; at
32
+ * install time we don't have the source on disk in a stable place. Embedding
33
+ * the source into `dist/main.mjs` and writing it out per-run keeps the path
34
+ * inside `ctx.tmpdir` (where `--settings` can find it) and survives bundle
35
+ * minification.
36
+ */
37
+ /**
38
+ * The pinned `@anthropic-ai/claude-code` version against which the subagent
39
+ * gate's `agent_id` discriminator was last verified (see the contract notes in
40
+ * the gate source below). The gate fails OPEN for subagents if claude-code ever
41
+ * stops populating `agent_id` in the PreToolUse hook payload, so a version bump
42
+ * must be paired with a re-verification of `createBaseHookInput`.
43
+ *
44
+ * `claudePretoolGate.test.ts` asserts this equals the version pinned in
45
+ * `package.json` — that test fails on any bump, forcing the re-verification
46
+ * before the pin and this constant are updated together.
47
+ *
48
+ * 2.1.220 verified 2026-07-28 against the schema embedded in the shipped
49
+ * binary: the base hook input still declares `agent_id` as
50
+ * `string().optional().describe("Subagent identifier. Present only when the
51
+ * hook fires from within a subagent (e.g., a tool called by an AgentTool
52
+ * worker). Absent for the main thread, even in --agent sessions. Use this
53
+ * field (not agent_type) to distinguish subagent calls from main-thread
54
+ * calls.")` — exactly the discriminator the gate relies on, byte-for-byte
55
+ * unchanged from the 2.1.198 verification (2026-07-10), itself unchanged from
56
+ * 2.1.195 (2026-07-01) and 2.1.190 (2026-06-25), which was more explicit than
57
+ * the 2.1.177 schema it replaced. The 2.1.220 pass additionally confirmed the
58
+ * field is still POPULATED and not merely declared — the minified bundle
59
+ * assigns `agent_id` from real identifier sources (`e.agentId`,
60
+ * `e.parentAgentId`, `e.data.agentId`), not a hardcoded empty value.
61
+ *
62
+ * Scope of this verification, stated honestly: it is static inspection of the
63
+ * shipped binary. No CI job exercises the Claude subagent gate against a live
64
+ * agent — `security-tests.yml` is deliberately opencode-only (free keyless
65
+ * model; Claude Code cannot use an `opencode/*` gateway model). So this pin,
66
+ * plus the tripwire test, IS the contract check. Keep both.
67
+ */
68
+ export declare const CLAUDE_CODE_AGENT_ID_VERIFIED_VERSION: "2.1.220";
69
+ /**
70
+ * Source written to `<ctx.tmpdir>/infraweaver-pretool-gate.mjs`. Plain ESM,
71
+ * no TypeScript, no dependencies — node executes it directly via the
72
+ * `#!/usr/bin/env node` shebang and the executable bit set by the harness.
73
+ *
74
+ * `deniedTools` is the per-run deny set derived from each MCP tool's `mutates`
75
+ * flag (see `subagentDeniedToolNames`), embedded into the hook's `Set` literal so
76
+ * the gate fences exactly the mutating tools registered for this run — no
77
+ * hand-maintained list to drift.
78
+ */
79
+ export declare const CLAUDE_PRETOOL_GATE_FILENAME: "infraweaver-pretool-gate.mjs";
80
+ /**
81
+ * Claude Code's native file-writing tools. The gate intercepts these to enforce
82
+ * `allowed_paths` / `protected_paths` at WRITE time; without them the only
83
+ * enforcement is the push-time diff scan, which lets a disallowed file exist in
84
+ * the tree for the rest of the run (see action/agents/writePolicy.ts).
85
+ *
86
+ * `MultiEdit` is included even though recent claude-code folds it into `Edit` —
87
+ * an extra name in the matcher is inert, a missing one is a hole.
88
+ */
89
+ export declare const CLAUDE_WRITE_TOOL_NAMES: readonly ["Write", "Edit", "MultiEdit", "NotebookEdit"];
90
+ export declare function buildClaudePretoolGateSource(deniedTools: readonly string[], writePolicyAbsolutePath: string): string;
91
+ /**
92
+ * Settings JSON shape registered via `claude --settings <path>`. The
93
+ * matcher `^mcp__infraweaver__` is treated as a regex by claude-code's
94
+ * `matchesPattern` helper (anything outside `[a-zA-Z0-9_|]` triggers the
95
+ * regex branch — verified in src/utils/hooks.ts), so this anchors at the
96
+ * start of the tool name and fires for every Infraweaver MCP tool. We narrow
97
+ * inside the script itself rather than declaring per-tool matchers because
98
+ * the deny list is the source of truth.
99
+ *
100
+ * The hook process inherits the parent's PATH, so `node` resolves to the
101
+ * runner's node binary; the `--settings` flag accepts either a path or a
102
+ * literal JSON string per claude-code source `src/main.tsx` (`Path to a
103
+ * settings JSON file or a JSON string`), but we use a path so the script
104
+ * and its config sit side-by-side under `ctx.tmpdir`.
105
+ *
106
+ * `execToolDenyRules` are the native exec tools (Bash/Monitor/REPL/Workflow +
107
+ * their `Agent(...)` forms) to deny at a settings-source rule — the
108
+ * authoritative, bypass-immune layer. `--disallowedTools` alone (a `cliArg`
109
+ * deny) was observed to leak under `--dangerously-skip-permissions`, so the
110
+ * deny is carried here too. Both consumers use both returned fields: the flag
111
+ * `--settings` JSON (covers non-CI runs) writes the whole object, and
112
+ * `buildManagedSettings` (CI, /etc managed settings) spreads `hooks` and folds
113
+ * `permissions.deny` into its richer deny list.
114
+ */
115
+ export declare function buildClaudePretoolGateSettings(scriptAbsolutePath: string, execToolDenyRules: string[]): {
116
+ hooks: {
117
+ PreToolUse: Array<{
118
+ matcher: string;
119
+ hooks: Array<{
120
+ type: "command";
121
+ command: string;
122
+ timeout?: number;
123
+ }>;
124
+ }>;
125
+ /** layered in by writePretoolGateAssets so non-CI runs (no managed
126
+ * settings) still fire the gate-server Stop hook. */
127
+ Stop?: Array<{
128
+ hooks: Array<{
129
+ type: "command";
130
+ command: string;
131
+ }>;
132
+ }>;
133
+ };
134
+ permissions: {
135
+ deny: string[];
136
+ };
137
+ };
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Specialist-dispatch instrumentation.
3
+ *
4
+ * WHY THIS EXISTS. Review routing moved from a **count-parity** gate ("0 or 2+
5
+ * lenses, never exactly 1", gated on diff size) to **hypothesis coverage**
6
+ * (one specialist per falsifiable, load-bearing question, no size threshold).
7
+ * The evaluation that adopted it named its own risk plainly: the bar to
8
+ * dispatch *something* drops, each specialist re-reads the diff, so cost is
9
+ * "plausibly neutral-to-slightly-up" — and the recommendation was to ship it
10
+ * "behind a close watch on dispatch-rate/cost". See `docs/AGENT-HARDENING.md`.
11
+ *
12
+ * That watch never existed. Tokens were summed for the whole run with no split
13
+ * between the orchestrator and the subagents it dispatched, so the one number
14
+ * that would settle the question — what share of a run the specialists cost —
15
+ * was not observable at any point. "Plausibly neutral" was an assumption with
16
+ * no instrument behind it.
17
+ *
18
+ * WHAT IS MEASURED, AND HOW MUCH IT CAN BE TRUSTED. Two different qualities of
19
+ * signal, deliberately kept apart rather than blended into one number:
20
+ *
21
+ * - **Dispatch counts are exact.** They are recorded from the actual Task
22
+ * tool call, one per dispatch, not inferred from the event stream.
23
+ * - **The token split is robust but coarse.** Tokens are attributed to
24
+ * "orchestrator" vs "subagents", never per-lens. Per-session labels come
25
+ * from `SessionLabeler`, whose own contract says its FIFO dispatch↔session
26
+ * pairing is for log readability and is not depended on for correctness.
27
+ * A mis-paired label would corrupt a *per-lens* number — but both sides of
28
+ * a mis-pairing are still subagents, so the orchestrator/subagent split is
29
+ * unaffected by exactly the weakness the labeler warns about. That is why
30
+ * this file reports the split and not the breakdown.
31
+ *
32
+ * Deliberately NOT a database column. A new `WorkflowRun` field needs manual
33
+ * production DDL, and a metric nobody looks at is not a watch. This surfaces
34
+ * where the comparison actually gets made — the run's own log line and job
35
+ * summary — so "before/after the routing change" is two runs side by side.
36
+ */
37
+ export interface DispatchTally {
38
+ /** subagent dispatches this run — exact, counted at the Task call. */
39
+ dispatches: number;
40
+ /** dispatch count per resolved label, e.g. `lens:iam-blast-radius`. */
41
+ byLabel: ReadonlyMap<string, number>;
42
+ /** billable tokens (input incl. cache + output) attributed to the orchestrator. */
43
+ orchestratorTokens: number;
44
+ /** …and to every subagent session combined. */
45
+ subagentTokens: number;
46
+ }
47
+ /**
48
+ * Per-run accumulator. Lives on `ToolState` and is written by whichever harness
49
+ * is driving, so the counts survive across agent invocations (post-run resume,
50
+ * transient-provider retry) the same way `usageEntries` does.
51
+ */
52
+ export declare class DispatchRecorder {
53
+ #private;
54
+ /** Record one subagent dispatch. Call at the Task tool_use, not at completion:
55
+ * a dispatch that errors out still cost the decision and usually the tokens. */
56
+ recordDispatch(label: string): void;
57
+ /**
58
+ * Attribute billable tokens to a session label. Anything that is not the
59
+ * orchestrator counts as subagent — including a session the labeler could not
60
+ * name, because an unnamed session is by definition not the orchestrator's.
61
+ */
62
+ recordTokens(label: string, billableTokens: number): void;
63
+ tally(): DispatchTally;
64
+ }
65
+ /** subagent share of attributed tokens, 0–1. Null when nothing was attributed —
66
+ * distinct from 0, which means specialists genuinely cost nothing. */
67
+ export declare function subagentTokenShare(tally: DispatchTally): number | null;
68
+ /** One stdout line. Empty when the run dispatched nothing AND attributed nothing —
69
+ * a solo run has no routing to report and the line would be noise. */
70
+ export declare function describeDispatchTally(tally: DispatchTally): string;
71
+ /**
72
+ * Markdown block for the GitHub job summary, rendered beside the usage table.
73
+ * Collapsed like the usage table so it costs nothing to ignore, and carries its
74
+ * own accuracy caveat: a reader comparing two runs needs to know the split is
75
+ * coarse before they draw a conclusion from it.
76
+ */
77
+ export declare function formatDispatchSummary(tally: DispatchTally): string;
@@ -0,0 +1,7 @@
1
+ import { type AgentRunContext } from "#app/agents/shared";
2
+ export interface GateServerHandle {
3
+ url: string;
4
+ token: string;
5
+ [Symbol.asyncDispose]: () => Promise<void>;
6
+ }
7
+ export declare function startGateServer(ctx: AgentRunContext): Promise<GateServerHandle>;
@@ -0,0 +1,6 @@
1
+ import type { Agent } from "#app/agents/shared";
2
+ export type { Agent, AgentUsage } from "#app/agents/shared";
3
+ export declare const agents: {
4
+ claude: Agent;
5
+ opencode: Agent;
6
+ };
@@ -0,0 +1,46 @@
1
+ /** worktree-relative blanket WRITE deny for the entire `.git` tree, in
2
+ * OpenCode Wildcard dialect (`*` compiles to regex `.*`, matching `/`
3
+ * recursively — see packages/core/src/util/wildcard.ts). spread into the
4
+ * `edit` ruleset after a `"*": "allow"` baseline — `evaluate` is
5
+ * last-match-wins by key order, so the deny keys must follow the wildcard
6
+ * allow.
7
+ *
8
+ * four patterns, because the root-anchored descendants glob only matches
9
+ * paths under a root `.git` *directory* — it misses `.git` when it's a gitfile
10
+ * (worktree / submodule layouts: a regular file whose `gitdir:` line redirects
11
+ * git metadata) and misses nested gitfiles (a `.git` inside a subdirectory).
12
+ * rewriting either pointer is the same code-exec surface (`core.hooksPath`,
13
+ * clean/smudge filters, credential.helper) the blanket deny exists to seal, so
14
+ * we cover the gitfile itself and any nested `.git` too. */
15
+ export declare const GIT_NATIVE_WRITE_DENY_OPENCODE: Record<string, "deny">;
16
+ /** worktree-relative narrow READ deny (`.git/config` only), in OpenCode
17
+ * Wildcard dialect. spread into the `read` ruleset after the `"*": "allow"`
18
+ * baseline. */
19
+ export declare const GIT_NATIVE_READ_DENY_OPENCODE: Record<string, "deny">;
20
+ /** Claude `permissions.deny` entries for the blanket `.git` WRITE deny across
21
+ * BOTH write-capable native tools — mirrors {@link GIT_NATIVE_WRITE_DENY_OPENCODE}.
22
+ * Write is included so the agent can't PLANT a new hook/config file (e.g.
23
+ * `.git/hooks/pre-push`) that an Edit-only deny would miss. */
24
+ export declare const GIT_NATIVE_WRITE_DENY_CLAUDE: string[];
25
+ /** Claude `permissions.deny` entries for the narrow `.git/config` READ deny,
26
+ * one per read/enumerate tool — mirrors {@link GIT_NATIVE_READ_DENY_OPENCODE}. */
27
+ export declare const GIT_NATIVE_READ_DENY_CLAUDE: string[];
28
+ /** Claude `permissions.deny` entries protecting the harness-owned files in the
29
+ * per-run tmpdir (`infraweaver-*`: the PreToolUse gate script, the Stop hook
30
+ * script, the write-policy JSON, the flag settings). The tmpdir doubles as the
31
+ * agent's $HOME, so these paths are discoverable; the hook scripts are
32
+ * re-executed by claude-code with the full process env, which makes
33
+ * overwriting one arbitrary command execution outside every other deny. Both
34
+ * single- and double-slash forms are emitted, mirroring the secretDenyPaths
35
+ * pattern in buildManagedSettings. */
36
+ export declare function harnessTmpdirWriteDenyClaude(tmpdir: string | undefined): string[];
37
+ /** Claude `permissions.deny` (Edit+Write) keeping native file writes out of the
38
+ * out-of-workspace persistence/credential targets above. The agent runs with
39
+ * HOME pointed at a throwaway tmpdir, so the only way a poisoned native write
40
+ * reaches a file a later step trusts is an absolute path under the real runner
41
+ * $HOME — which these enumerate. Enumerated rather than deny-all on purpose:
42
+ * Claude's permission model has no allow carve-out under a broad deny (a
43
+ * `Edit(/**)` deny would also block the in-repo fix), and `sandbox.filesystem`
44
+ * governs only Bash — so "deny everything outside the repo" is not expressible
45
+ * for native tools. Returns [] when the runner $HOME is unknown. */
46
+ export declare function runnerHomeWriteDenyClaude(runnerHome: string | undefined): string[];