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,80 @@
1
+ import type { AgentId } from "#app/external";
2
+ import type { ToolState } from "#app/toolState";
3
+ import type { OctokitWithPlugins } from "#app/utils/github";
4
+ import type { ResolvedPayload } from "#app/utils/payload";
5
+ import type { RunContextData } from "#app/utils/runContextData";
6
+
7
+ /**
8
+ * Capability contexts: the narrow, per-family subsets of the 28-field
9
+ * `ToolContext` (see `mcp/server.ts`). Each interface is a structural subset, so
10
+ * the full `ToolContext` is assignable to it — the server wires every tool with
11
+ * one `ToolContext` and each factory sees only the capability it declares.
12
+ *
13
+ * The point is the TEST SURFACE. A git tool typed `GitToolContext` is unit-tested
14
+ * by constructing seven real fields with real types — not a 28-field object cast
15
+ * `as unknown as ToolContext`, whose cast hides whichever field the tool actually
16
+ * reaches for. `LocalToolContext` (see `mcp/localContext.ts`) is the cwd-scoped
17
+ * member of this same family; these three add the GitHub / git / cloud surfaces.
18
+ *
19
+ * `payload` and `toolState` stay their full shared types — they are legitimately
20
+ * broad state carriers every family reads, and narrowing them buys nothing for
21
+ * the test surface (a fixture builds them either way). What each interface drops
22
+ * is the top-level capability fields a family never touches: a cloud tool needn't
23
+ * fabricate an `octokit`, a git tool needn't fabricate an `apiToken`.
24
+ */
25
+
26
+ /**
27
+ * GitHub REST/GraphQL capability: the authenticated `octokit` client, the repo
28
+ * coordinates it addresses, the installation token (raw-asset fetch), and the
29
+ * review-surface fields (`agentId` for tool-ref rendering, `prApproveEnabled`).
30
+ * The home of the ~15 issue/PR/review/comment/label tools.
31
+ */
32
+ export interface GitHubToolContext {
33
+ octokit: OctokitWithPlugins;
34
+ githubInstallationToken: string;
35
+ repo: RunContextData["repo"];
36
+ payload: ResolvedPayload;
37
+ toolState: ToolState;
38
+ tmpdir: string;
39
+ agentId: AgentId;
40
+ prApproveEnabled: boolean;
41
+ }
42
+
43
+ /**
44
+ * Git capability: the token pushes authenticate with, the single-flight re-minter
45
+ * (`refreshGitToken`), the prepush lifecycle hook, and the repo/payload/state the
46
+ * push guardrails read. No `octokit` — the git tools shell out, they don't call
47
+ * the API.
48
+ */
49
+ export interface GitToolContext {
50
+ gitToken: string;
51
+ // single-flight git-token re-minter, or undefined when re-minting isn't
52
+ // possible (off-CI / external GH_TOKEN). Mirrors `ToolContext.refreshGitToken`.
53
+ refreshGitToken?: ((stale: string) => Promise<string>) | undefined;
54
+ prepushScript: string | null;
55
+ repo: RunContextData["repo"];
56
+ payload: ResolvedPayload;
57
+ toolState: ToolState;
58
+ // needed only so the git tools can hand this context to the push guardrails,
59
+ // which spill a gitleaks report under tmpdir (see `mcp/guardrails.ts`).
60
+ tmpdir: string;
61
+ }
62
+
63
+ /**
64
+ * Cloud capability: the identity a tool presents to Infraweaver Cloud — the run's
65
+ * `api_token` (a `tmnd_`/`tmpx_` bearer) and its `runId`. Consumed by the upload
66
+ * tool and by `patchWorkflowRunFields`. See `utils/cloudClient.ts` (E3).
67
+ */
68
+ export interface CloudToolContext {
69
+ apiToken: string;
70
+ runId: number | undefined;
71
+ }
72
+
73
+ /**
74
+ * The write tools that create a GitHub artifact AND report its node-id back to
75
+ * Cloud via `patchWorkflowRunFields` (create_pull_request, create_issue,
76
+ * create_review, the plan-comment writers) genuinely span two capabilities: the
77
+ * GitHub surface plus the cloud identity. Naming the intersection keeps their
78
+ * signatures honest about both.
79
+ */
80
+ export type GitHubWriteToolContext = GitHubToolContext & CloudToolContext;
@@ -0,0 +1,145 @@
1
+ import { type } from "arktype";
2
+ import type { BaseBranchContext } from "#app/mcp/pr";
3
+ import { resolveBaseBranch } from "#app/mcp/pr";
4
+ import { execute, tool, toolOk } from "#app/mcp/shared";
5
+ import { skipResult } from "#app/mcp/terraform/types";
6
+ import { log } from "#app/utils/cli";
7
+ import { $ } from "#app/utils/shell";
8
+
9
+ /**
10
+ * AI PR summaries — the deterministic Terraform-change anchor. A PR summary
11
+ * written purely by the model drifts (miscounts resources, invents changes). This
12
+ * parses the PR's unified diff for Terraform BLOCK changes (which resource /
13
+ * module / data / variable / output addresses were added or removed, which files
14
+ * were touched) so the human-readable summary is anchored to facts, not prose.
15
+ *
16
+ * Pure parser (`summarizeTerraformResourceDiff`) + a tool that runs the
17
+ * merge-base diff and feeds it in. Block ADDED/REMOVED is precise (a block header
18
+ * on a +/- line); in-place edits to an existing block surface as a touched FILE
19
+ * (attributing a sub-block edit to a specific address needs full-file parsing —
20
+ * we stay honest and report the file rather than guess).
21
+ */
22
+
23
+ export interface TerraformChangeSummary {
24
+ /** addresses of blocks added in this diff (e.g. `aws_s3_bucket.logs`, `module.vpc`). */
25
+ added: string[];
26
+ /** addresses of blocks removed in this diff. */
27
+ removed: string[];
28
+ /** Terraform files touched (a superset signal — includes in-place edits). */
29
+ files: string[];
30
+ counts: { added: number; removed: number; files: number };
31
+ }
32
+
33
+ const isTfFile = (file: string): boolean => /\.tf$|\.tfvars$/.test(file);
34
+
35
+ /**
36
+ * Parse a Terraform block header into its address, or null when the line is not a
37
+ * top-level block header. Handles two-label blocks (`resource`/`data`) and
38
+ * single-label blocks (`module`/`variable`/`output`/`provider`). The line is the
39
+ * raw HCL (diff +/- prefix already stripped). Pure.
40
+ */
41
+ export function parseBlockAddress(line: string): string | null {
42
+ const s = line.trim();
43
+ const two = s.match(/^(resource|data)\s+"([^"]+)"\s+"([^"]+)"\s*\{/);
44
+ if (two) {
45
+ const [, kind, t, name] = two;
46
+ return kind === "data" ? `data.${t}.${name}` : `${t}.${name}`;
47
+ }
48
+ const one = s.match(/^(module|variable|output|provider)\s+"([^"]+)"\s*\{/);
49
+ if (one) {
50
+ const [, kind, name] = one;
51
+ const prefix = kind === "variable" ? "var" : kind;
52
+ return `${prefix}.${name}`;
53
+ }
54
+ return null;
55
+ }
56
+
57
+ /**
58
+ * Summarise a unified `git diff` into added/removed Terraform block addresses +
59
+ * the touched Terraform files. Tracks the current file from `+++ b/<path>`
60
+ * headers and only considers `.tf`/`.tfvars` files. Pure; deterministic ordering
61
+ * (sorted, de-duplicated). A block counted as both added and removed (moved) is
62
+ * left in both lists — the prose can describe the move.
63
+ */
64
+ export function summarizeTerraformResourceDiff(diff: string): TerraformChangeSummary {
65
+ const added = new Set<string>();
66
+ const removed = new Set<string>();
67
+ const files = new Set<string>();
68
+ let file = "";
69
+ let inTf = false;
70
+ for (const raw of diff.split("\n")) {
71
+ if (raw.startsWith("+++ ")) {
72
+ const path = raw.slice(4).trim().replace(/^b\//, "");
73
+ file = path === "/dev/null" ? "" : path;
74
+ inTf = !!file && isTfFile(file);
75
+ continue;
76
+ }
77
+ if (raw.startsWith("--- ") || raw.startsWith("diff --git") || raw.startsWith("@@")) continue;
78
+ if (!inTf) continue;
79
+ if (raw.startsWith("+") || raw.startsWith("-")) {
80
+ files.add(file);
81
+ const addr = parseBlockAddress(raw.slice(1));
82
+ if (addr) (raw.startsWith("+") ? added : removed).add(addr);
83
+ }
84
+ }
85
+ const sort = (s: Set<string>): string[] => [...s].sort();
86
+ return {
87
+ added: sort(added),
88
+ removed: sort(removed),
89
+ files: sort(files),
90
+ counts: { added: added.size, removed: removed.size, files: files.size },
91
+ };
92
+ }
93
+
94
+ export const TerraformChangeSummaryParams = type({
95
+ "base?": type.string.describe(
96
+ "base branch to diff against (default: the run's resolved base branch — main/master or the base_branch input).",
97
+ ),
98
+ });
99
+
100
+ export function TerraformChangeSummaryTool(ctx: BaseBranchContext) {
101
+ return tool({
102
+ name: "terraform_change_summary",
103
+ description:
104
+ "A DETERMINISTIC anchor for a PR summary: the Terraform `resource`/`module`/`data`/`variable`/" +
105
+ "`output` addresses ADDED and REMOVED on this branch vs its base, plus the Terraform files touched. " +
106
+ "Runs a merge-base `git diff` of `*.tf`/`*.tfvars` and parses the block headers, so the human-readable " +
107
+ "summary you write is grounded in real counts instead of guessed ones. Degrades green (returns " +
108
+ "`ok: false`) when git can't resolve the base (fetch it first) or nothing Terraform changed — then " +
109
+ "summarise from the diff yourself. In-place edits to an existing block surface as a touched `file` " +
110
+ "(not an added/removed address). Use it in SummarizePr (or any PR summary) before writing the prose.",
111
+ parameters: TerraformChangeSummaryParams,
112
+ execute: execute(async ({ base }) => {
113
+ const baseBranch = base ?? resolveBaseBranch(ctx);
114
+ const pathspec = ["--", "*.tf", "*.tfvars"];
115
+ let diff: string | null = null;
116
+ // prefer the remote-tracking base (origin/<base>), fall back to a local ref.
117
+ for (const ref of [`origin/${baseBranch}`, baseBranch]) {
118
+ try {
119
+ diff = $("git", ["diff", "--merge-base", ref, ...pathspec], { log: false });
120
+ break;
121
+ } catch {
122
+ diff = null;
123
+ }
124
+ }
125
+ if (diff === null) {
126
+ return skipResult(
127
+ "base_unresolved",
128
+ `could not diff against '${baseBranch}' (fetch the base first, e.g. git_fetch({ ref: "${baseBranch}" })) — summarise from the diff yourself`,
129
+ );
130
+ }
131
+ const summary = summarizeTerraformResourceDiff(diff);
132
+ if (summary.counts.files === 0) {
133
+ return skipResult(
134
+ "no_terraform_changes",
135
+ "no Terraform files changed vs the base — this PR's summary is not Terraform-specific; summarise from the diff yourself",
136
+ );
137
+ }
138
+ log.info(
139
+ `» terraform_change_summary: +${summary.counts.added} -${summary.counts.removed} block(s) ` +
140
+ `across ${summary.counts.files} file(s) vs ${baseBranch}`,
141
+ );
142
+ return toolOk({ base: baseBranch, ...summary });
143
+ }),
144
+ });
145
+ }
@@ -0,0 +1,261 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { type } from "arktype";
4
+ import type { GitHubToolContext } from "#app/mcp/capabilityContext";
5
+ import { execute, tool } from "#app/mcp/shared";
6
+ import { fenceUntrusted } from "#app/mcp/untrustedContent";
7
+ import { getTempDir } from "#app/utils/env";
8
+ import { log } from "#app/utils/log";
9
+
10
+ export const GetCheckSuiteLogs = type({
11
+ check_suite_id: type.number.describe("the id from check_suite.id"),
12
+ });
13
+
14
+ type LogLine = {
15
+ line: number;
16
+ content: string;
17
+ type: "error" | "warning" | "failure" | "trace";
18
+ };
19
+
20
+ type LogAnalysis = {
21
+ totalLines: number;
22
+ index: LogLine[];
23
+ excerpt: {
24
+ content: string;
25
+ startLine: number;
26
+ endLine: number;
27
+ };
28
+ };
29
+
30
+ export function analyzeLog(logs: string, excerptLines = 80): LogAnalysis {
31
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape codes use control chars
32
+ const clean = logs.replace(/\x1b\[[0-9;]*m/g, "");
33
+ const lines = clean.split("\n");
34
+ const totalLines = lines.length;
35
+
36
+ const index: LogLine[] = [];
37
+
38
+ const patterns: Array<{ type: LogLine["type"]; pattern: RegExp; skip?: RegExp }> = [
39
+ { type: "error", pattern: /##\[error\]/i },
40
+ { type: "error", pattern: /\bError:/i },
41
+ { type: "error", pattern: /\bERR_/i },
42
+ { type: "error", pattern: /exit code [1-9]/i },
43
+ { type: "warning", pattern: /##\[warning\]/i },
44
+ { type: "warning", pattern: /\bWARN\b/i, skip: /apt|dpkg|Reading package/i },
45
+ { type: "failure", pattern: /\d+ failed/i },
46
+ { type: "failure", pattern: /FAIL\b/i },
47
+ { type: "failure", pattern: /✕|✗|×/ },
48
+ { type: "trace", pattern: /^\s+at\s+/i },
49
+ ];
50
+
51
+ for (const [i, line] of lines.entries()) {
52
+ for (const p of patterns) {
53
+ if (p.pattern.test(line)) {
54
+ if (p.skip?.test(line)) continue;
55
+
56
+ // dedupe consecutive traces
57
+ if (p.type === "trace" && index.length > 0 && index[index.length - 1]!.type === "trace") {
58
+ continue;
59
+ }
60
+
61
+ // truncate long lines
62
+ const truncated = line.length > 120 ? `${line.slice(0, 117)}...` : line;
63
+
64
+ index.push({
65
+ line: i + 1,
66
+ content: truncated.trim(),
67
+ type: p.type,
68
+ });
69
+ break;
70
+ }
71
+ }
72
+ }
73
+
74
+ // find excerpt range: focus on LAST ##[error] line
75
+ let errorLine = -1;
76
+ for (let i = lines.length - 1; i >= 0; i--) {
77
+ if (/##\[error\]/i.test(lines[i]!)) {
78
+ errorLine = i;
79
+ break;
80
+ }
81
+ }
82
+
83
+ let start: number;
84
+ let end: number;
85
+
86
+ if (errorLine === -1) {
87
+ start = Math.max(0, totalLines - excerptLines);
88
+ end = totalLines;
89
+ } else {
90
+ const contextAfter = 5;
91
+ const contextBefore = excerptLines - contextAfter;
92
+ start = Math.max(0, errorLine - contextBefore);
93
+ end = Math.min(totalLines, errorLine + contextAfter);
94
+ }
95
+
96
+ return {
97
+ totalLines,
98
+ index,
99
+ excerpt: {
100
+ content: lines.slice(start, end).join("\n"),
101
+ startLine: start + 1,
102
+ endLine: end,
103
+ },
104
+ };
105
+ }
106
+
107
+ type JobLogResult = {
108
+ job_id: number;
109
+ job_name: string;
110
+ job_url: string;
111
+ failed_steps: string[];
112
+ log_index: LogLine[];
113
+ excerpt: {
114
+ start_line: number;
115
+ end_line: number;
116
+ total_lines: number;
117
+ content: string;
118
+ };
119
+ full_log_path: string;
120
+ };
121
+
122
+ export function GetCheckSuiteLogsTool(ctx: GitHubToolContext) {
123
+ return tool({
124
+ name: "get_check_suite_logs",
125
+ description:
126
+ "get workflow run logs for a failed check suite. returns a log_index of interesting lines, " +
127
+ "a curated excerpt, and full_log_path for deeper investigation. " +
128
+ "pass check_suite.id from the webhook payload.",
129
+ parameters: GetCheckSuiteLogs,
130
+ execute: execute(async (params) => {
131
+ const check_suite_id = params.check_suite_id;
132
+
133
+ // get workflow runs for this specific check suite
134
+ const workflowRuns = await ctx.octokit.paginate(
135
+ ctx.octokit.rest.actions.listWorkflowRunsForRepo,
136
+ {
137
+ owner: ctx.repo.owner,
138
+ repo: ctx.repo.name,
139
+ check_suite_id,
140
+ per_page: 100,
141
+ request: { signal: AbortSignal.timeout(10_000) },
142
+ },
143
+ );
144
+
145
+ const failedRuns = workflowRuns.filter((run) => run.conclusion === "failure");
146
+
147
+ if (failedRuns.length === 0) {
148
+ return {
149
+ check_suite_id,
150
+ message: "no failed workflow runs found for this check suite",
151
+ failed_jobs: [],
152
+ };
153
+ }
154
+
155
+ // setup logs directory
156
+ const tempDir = getTempDir();
157
+ const logsDir = join(tempDir, "ci-logs");
158
+ mkdirSync(logsDir, { recursive: true });
159
+
160
+ const jobResults: JobLogResult[] = [];
161
+
162
+ // get logs for each failed run
163
+ for (const run of failedRuns) {
164
+ const jobs = await ctx.octokit.paginate(ctx.octokit.rest.actions.listJobsForWorkflowRun, {
165
+ owner: ctx.repo.owner,
166
+ repo: ctx.repo.name,
167
+ run_id: run.id,
168
+ request: { signal: AbortSignal.timeout(10_000) },
169
+ });
170
+
171
+ // only process failed jobs
172
+ const failedJobs = jobs.filter((job) => job.conclusion === "failure");
173
+
174
+ for (const job of failedJobs) {
175
+ try {
176
+ const logsResponse = await ctx.octokit.rest.actions.downloadJobLogsForWorkflowRun({
177
+ owner: ctx.repo.owner,
178
+ repo: ctx.repo.name,
179
+ job_id: job.id,
180
+ request: { signal: AbortSignal.timeout(10_000) },
181
+ });
182
+
183
+ const logsUrl = logsResponse.url;
184
+ const logsResult = await fetch(logsUrl, { signal: AbortSignal.timeout(10_000) });
185
+ if (!logsResult.ok) {
186
+ throw new Error(
187
+ `failed to fetch logs: ${logsResult.status} ${logsResult.statusText}`,
188
+ );
189
+ }
190
+ const logsText = await logsResult.text();
191
+
192
+ // write full log to disk
193
+ const logPath = join(logsDir, `job-${job.id}.log`);
194
+ writeFileSync(logPath, logsText);
195
+
196
+ // analyze log
197
+ const analysis = analyzeLog(logsText, 80);
198
+
199
+ // get failed steps
200
+ const failedSteps =
201
+ job.steps
202
+ ?.filter((s) => s.conclusion === "failure")
203
+ .map((s) => `Step ${s.number}: ${s.name}`) ?? [];
204
+
205
+ jobResults.push({
206
+ job_id: job.id,
207
+ job_name: job.name,
208
+ job_url: job.html_url ?? "",
209
+ failed_steps: failedSteps,
210
+ log_index: analysis.index,
211
+ excerpt: {
212
+ start_line: analysis.excerpt.startLine,
213
+ end_line: analysis.excerpt.endLine,
214
+ total_lines: analysis.totalLines,
215
+ // LLM01. This is stdout from a workflow defined in the branch
216
+ // under review — on a fork PR, ~80 lines an outside contributor
217
+ // chose, arriving as free prose in the middle of a tool result.
218
+ // Fenced rather than neutralised: the excerpt is diagnostic and
219
+ // must stay byte-faithful to be useful, and the fence bounds it
220
+ // without editing it. `fenceUntrusted` defangs its own marker
221
+ // phrase, so the log cannot close the quarantine it sits in.
222
+ content: fenceUntrusted(`CI job log — ${job.name}`, analysis.excerpt.content),
223
+ },
224
+ full_log_path: logPath,
225
+ });
226
+
227
+ log.debug(`analyzed logs for job ${job.name}: ${analysis.index.length} indexed lines`);
228
+ } catch (error) {
229
+ log.info(`failed to fetch logs for job ${job.id}: ${error}`);
230
+ }
231
+ }
232
+ }
233
+
234
+ return {
235
+ _instructions: {
236
+ overview:
237
+ "this result contains CI failure information. use log_index to find interesting lines, then read full_log_path for details.",
238
+ fields: {
239
+ log_index:
240
+ "array of interesting lines (errors, warnings, failures) with line numbers. use these to navigate the full log.",
241
+ excerpt:
242
+ "a curated ~80 line window around the last error. may not show all failures if they occur in different places.",
243
+ full_log_path:
244
+ "path to the complete log file. read specific line ranges using the line numbers from log_index.",
245
+ failed_steps:
246
+ "which CI steps failed. read the workflow yml to understand what commands these steps run.",
247
+ },
248
+ workflow: [
249
+ "1. scan log_index to see where errors/warnings/failures are located",
250
+ "2. read excerpt for immediate context",
251
+ "3. if excerpt doesn't show what you need, read specific line ranges from full_log_path",
252
+ "4. check failed_steps to understand what command failed",
253
+ ],
254
+ },
255
+ check_suite_id,
256
+ repo: `${ctx.repo.owner}/${ctx.repo.name}`,
257
+ failed_jobs: jobResults,
258
+ };
259
+ }),
260
+ });
261
+ }