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,5 @@
1
+ // Generated by `pnpm run gen:crosswalk-digest` — do not edit by hand.
2
+ // Pinned sha256 of the reviewed compliance crosswalk (LLM04 integrity gate). It is
3
+ // verified fail-closed before any compliance verdict is produced; see crosswalk.ts.
4
+ // Regenerate this file whenever the crosswalk tables in crosswalk.ts change intentionally.
5
+ export const EXPECTED_CROSSWALK_DIGEST = "a42bd438bbc32ba302c3bc7a74238adb97560e534f5c94d908f4e81ffe7c6a05";
@@ -0,0 +1,60 @@
1
+ import { mapConcernToControls } from "#app/mcp/crosswalk";
2
+ import type { Concern, Severity } from "#app/mcp/terraform/types";
3
+
4
+ /**
5
+ * Cyber Essentials posture, derived from the indicative crosswalk. Pure and
6
+ * dependency-light (crosswalk + types only) so BOTH the read-only Assess report
7
+ * and the Cloud report compute the identical number from the identical inputs —
8
+ * the score is never the model's word.
9
+ */
10
+
11
+ export const CE_FRAMEWORK = "Cyber Essentials";
12
+
13
+ // Points deducted from a perfect 100 per OPEN Cyber-Essentials concern, by
14
+ // severity. Tuned so a handful of mediums stays in the 80s while a single
15
+ // critical reads unambiguously as "action required" (the dashboard's red band).
16
+ const CE_SEVERITY_PENALTY: Record<Severity, number> = {
17
+ critical: 25,
18
+ high: 12,
19
+ medium: 5,
20
+ low: 2,
21
+ info: 0,
22
+ };
23
+
24
+ /** The Cyber Essentials control labels a concern touches (via the indicative
25
+ * crosswalk), or `[]` when it maps to none — what the finding-detail "Maps to
26
+ * Cyber Essentials" panel renders. */
27
+ export function cyberEssentialsControls(concern: Concern): string[] {
28
+ return mapConcernToControls(concern)
29
+ .controls.filter((c) => c.framework === CE_FRAMEWORK)
30
+ .map((c) => c.control);
31
+ }
32
+
33
+ /**
34
+ * The repo's Cyber Essentials posture as a deterministic 0–100 score — what the
35
+ * dashboard's "CE SCORE" shows. Honest by construction: only OPEN (non-suppressed)
36
+ * concerns that map to a Cyber Essentials control deduct from a perfect 100, so a
37
+ * suppressed/accepted finding or one that doesn't touch a CE control never moves
38
+ * the score, and a clean repo scores 100. Pure.
39
+ */
40
+ export function cyberEssentialsScore(concerns: Concern[]): number {
41
+ let penalty = 0;
42
+ for (const c of concerns) {
43
+ if (c.suppression) continue;
44
+ if (cyberEssentialsControls(c).length === 0) continue;
45
+ penalty += CE_SEVERITY_PENALTY[c.severity];
46
+ }
47
+ return Math.max(0, Math.round(100 - penalty));
48
+ }
49
+
50
+ /** The distinct Cyber Essentials controls left at risk by the OPEN concern set —
51
+ * the "N control(s) at risk" the assessment headline names. Sorted for a stable
52
+ * report; empty when nothing open maps to a CE control. */
53
+ export function cyberEssentialsControlsAtRisk(concerns: Concern[]): string[] {
54
+ const atRisk = new Set<string>();
55
+ for (const c of concerns) {
56
+ if (c.suppression) continue;
57
+ for (const control of cyberEssentialsControls(c)) atRisk.add(control);
58
+ }
59
+ return [...atRisk].sort();
60
+ }
@@ -0,0 +1,232 @@
1
+ import { type } from "arktype";
2
+ import { COMMENT_COMMAND, PRODUCT_NAME } from "#app/brand";
3
+ import { dashboardStrings } from "#app/i18n/scaffolding";
4
+ import type { GitHubToolContext } from "#app/mcp/capabilityContext";
5
+ import { recordCreatedTarget } from "#app/mcp/scope";
6
+ import { execute, tool } from "#app/mcp/shared";
7
+ import { log } from "#app/utils/cli";
8
+ import { fixDoubleEscapedString } from "#app/utils/fixDoubleEscapedString";
9
+ import type { UserFacingLanguage } from "#app/utils/payload";
10
+
11
+ /**
12
+ * The per-repo "Remediation Dashboard" issue (Renovate's single pinned
13
+ * Dependency Dashboard, mapped to Infraweaver). ONE issue per repo gives the
14
+ * maintainer a stable, at-a-glance view of the Terraform remediation state:
15
+ * which remediation PRs are open, which concern-groups are waiting (held back by
16
+ * the per-run/concurrency caps), and which findings are suppressed. A waiting
17
+ * group is opened on demand from the dashboard's Remediate button or a
18
+ * `@infraweaver fix …` comment — the surfaces that actually dispatch a run.
19
+ *
20
+ * This file is the engine seam: a pure body renderer (`buildDashboardBody`) and
21
+ * an upsert tool that finds-or-creates the single issue. Each waiting row carries
22
+ * a hidden `<!-- group:ID -->` anchor reserved for a future tick-to-request
23
+ * consumer (a Renovate-style checkbox read back on the next run); that consumer
24
+ * is not yet wired, so the body renders a plain list rather than a checkbox that
25
+ * would silently do nothing. In keeping with the product's hard rule, the
26
+ * dashboard never merges or deploys anything.
27
+ */
28
+
29
+ /** trailing marker that identifies the dashboard issue when we search for it. */
30
+ export const DASHBOARD_MARKER = "<!-- infraweaver:remediation-dashboard -->";
31
+ /** label applied to the dashboard issue (the primary find key + a pin target). */
32
+ export const DASHBOARD_LABEL = "infraweaver-dashboard";
33
+ export const DASHBOARD_TITLE = `${PRODUCT_NAME} — Remediation Dashboard`;
34
+
35
+ export interface DashboardOpenPr {
36
+ number: number;
37
+ title: string;
38
+ url: string;
39
+ group_id?: string;
40
+ zombie?: boolean;
41
+ }
42
+ export interface DashboardPending {
43
+ title: string;
44
+ severity?: string;
45
+ files?: string;
46
+ group_id?: string;
47
+ reason?: string;
48
+ }
49
+ export interface DashboardSuppressed {
50
+ title: string;
51
+ reason?: string;
52
+ }
53
+ export interface DashboardData {
54
+ open_prs: DashboardOpenPr[];
55
+ pending: DashboardPending[];
56
+ suppressed?: DashboardSuppressed[];
57
+ note?: string;
58
+ }
59
+
60
+ /**
61
+ * Render the dashboard issue body (pure — no I/O). The trailing {@link
62
+ * DASHBOARD_MARKER} lets the upsert recognise the issue on the next run. The
63
+ * fixed section headers/notes are localized by the run's `language` (default
64
+ * English); the data rows (PR titles, counts, group markers) are unchanged.
65
+ */
66
+ export function buildDashboardBody(
67
+ data: DashboardData,
68
+ language: UserFacingLanguage = "en",
69
+ ): string {
70
+ const t = dashboardStrings(language);
71
+ const lines: string[] = [];
72
+ lines.push(t.maintainedBy);
73
+ lines.push("");
74
+
75
+ lines.push(`## ${t.openPrs} (${data.open_prs.length})`);
76
+ if (data.open_prs.length === 0) {
77
+ lines.push(t.noneOpen);
78
+ } else {
79
+ for (const pr of data.open_prs) {
80
+ lines.push(
81
+ `- [#${pr.number}](${pr.url}) — ${pr.title}${pr.zombie ? " · ⚠️ stale" : ""}`,
82
+ );
83
+ }
84
+ }
85
+ lines.push("");
86
+
87
+ lines.push(`## ${t.waiting} (${data.pending.length})`);
88
+ if (data.pending.length === 0) {
89
+ lines.push(t.nothingWaiting);
90
+ } else {
91
+ lines.push(t.openOnDemand);
92
+ for (const p of data.pending) {
93
+ const sev = p.severity ? ` \`${p.severity}\`` : "";
94
+ const files = p.files ? ` — ${p.files}` : "";
95
+ const reason = p.reason ? ` _(${p.reason})_` : "";
96
+ const marker = p.group_id ? ` <!-- group:${p.group_id} -->` : "";
97
+ lines.push(`- **${p.title}**${sev}${files}${reason}${marker}`);
98
+ }
99
+ }
100
+ lines.push("");
101
+
102
+ const suppressed = data.suppressed ?? [];
103
+ if (suppressed.length > 0) {
104
+ lines.push(`## ${t.suppressed} (${suppressed.length})`);
105
+ for (const s of suppressed) {
106
+ lines.push(`- ${s.title}${s.reason ? ` — _${s.reason}_` : ""}`);
107
+ }
108
+ lines.push("");
109
+ }
110
+
111
+ if (data.note) {
112
+ lines.push(data.note);
113
+ lines.push("");
114
+ }
115
+
116
+ lines.push(DASHBOARD_MARKER);
117
+ return lines.join("\n");
118
+ }
119
+
120
+ export const RemediationDashboardParams = type({
121
+ open_prs: type({
122
+ number: type.number,
123
+ title: type.string,
124
+ url: type.string,
125
+ "group_id?": type.string,
126
+ "zombie?": type.boolean,
127
+ })
128
+ .array()
129
+ .describe(
130
+ "the currently-open remediation PRs (pass `pull_requests` from list_remediation_prs).",
131
+ ),
132
+ pending: type({
133
+ title: type.string,
134
+ "severity?": type.string,
135
+ "files?": type.string,
136
+ "group_id?": type.string,
137
+ "reason?": type.string,
138
+ })
139
+ .array()
140
+ .describe(
141
+ "concern groups not yet opened as PRs — e.g. held back by max_prs/pr_concurrent_limit, or awaiting an on-demand request. Pass the scan groups you did NOT open this run.",
142
+ ),
143
+ suppressed: type({ title: type.string, "reason?": type.string })
144
+ .array()
145
+ .describe("findings suppressed via inline skips / ignore rules (optional).")
146
+ .optional(),
147
+ "note?": type.string.describe(
148
+ "an optional free-text note appended to the dashboard.",
149
+ ),
150
+ });
151
+
152
+ /**
153
+ * Create or update the single per-repo Remediation Dashboard issue. Idempotent:
154
+ * finds the existing issue by the {@link DASHBOARD_LABEL} + marker and updates
155
+ * its body, else creates it. Bound by the same `push: disabled` read-only gate as
156
+ * the other issue/PR writes.
157
+ */
158
+ export function UpsertRemediationDashboardTool(ctx: GitHubToolContext) {
159
+ return tool({
160
+ name: "upsert_remediation_dashboard",
161
+ description:
162
+ `Create or update the repo's single ${PRODUCT_NAME} Remediation Dashboard issue: a stable, pinned ` +
163
+ "summary of open remediation PRs, the concern groups waiting to be opened (each requestable on demand " +
164
+ `via the Remediate button or a \`${COMMENT_COMMAND} fix\` comment), and suppressed findings. Idempotent — it ` +
165
+ "reuses the existing dashboard issue (found by " +
166
+ `the \`${DASHBOARD_LABEL}\` label) instead of filing a new one each run. Call it at the END of a ` +
167
+ "Remediate/RefreshRemediation run with the current state. Blocked under `push: disabled`. Never merges.",
168
+ parameters: RemediationDashboardParams,
169
+ execute: execute(async (data) => {
170
+ if (ctx.payload.push === "disabled") {
171
+ throw new Error(
172
+ "Updating the remediation dashboard is disabled. This repository is configured for read-only access (push: disabled).",
173
+ );
174
+ }
175
+ const owner = ctx.repo.owner;
176
+ const repo = ctx.repo.name;
177
+ const body = fixDoubleEscapedString(
178
+ buildDashboardBody(data as DashboardData, ctx.payload.language),
179
+ );
180
+
181
+ // Find the existing dashboard: a single OPEN issue carrying our label. The
182
+ // listForRepo result includes PRs too (a PR is an issue), so exclude those
183
+ // and require the marker — belt and braces against a label collision.
184
+ const candidates = await ctx.octokit.paginate(
185
+ ctx.octokit.rest.issues.listForRepo,
186
+ {
187
+ owner,
188
+ repo,
189
+ state: "open",
190
+ labels: DASHBOARD_LABEL,
191
+ per_page: 100,
192
+ },
193
+ );
194
+ const existing = candidates.find(
195
+ (i) => !i.pull_request && (i.body ?? "").includes(DASHBOARD_MARKER),
196
+ );
197
+
198
+ if (existing) {
199
+ const updated = await ctx.octokit.rest.issues.update({
200
+ owner,
201
+ repo,
202
+ issue_number: existing.number,
203
+ body,
204
+ });
205
+ recordCreatedTarget(ctx, existing.number);
206
+ log.info(`» updated remediation dashboard issue #${existing.number}`);
207
+ return {
208
+ success: true,
209
+ action: "updated" as const,
210
+ number: existing.number,
211
+ url: updated.data.html_url,
212
+ };
213
+ }
214
+
215
+ const created = await ctx.octokit.rest.issues.create({
216
+ owner,
217
+ repo,
218
+ title: DASHBOARD_TITLE,
219
+ body,
220
+ labels: [DASHBOARD_LABEL],
221
+ });
222
+ recordCreatedTarget(ctx, created.data.number);
223
+ log.info(`» created remediation dashboard issue #${created.data.number}`);
224
+ return {
225
+ success: true,
226
+ action: "created" as const,
227
+ number: created.data.number,
228
+ url: created.data.html_url,
229
+ };
230
+ }),
231
+ });
232
+ }
@@ -0,0 +1,190 @@
1
+ import { type } from "arktype";
2
+ import type { ToolContext } from "#app/mcp/server";
3
+ import { execute, tool } from "#app/mcp/shared";
4
+ import type { PrepOptions, PrepResult } from "#app/prep/index";
5
+ import { runPrepPhase } from "#app/prep/index";
6
+ import { packageManagerBinDir } from "#app/utils/packageManager";
7
+
8
+ // empty schema for tools with no parameters
9
+ const EmptyParams = type({});
10
+
11
+ /**
12
+ * format prep results into agent-friendly message
13
+ */
14
+ function formatPrepResults(results: PrepResult[]): string {
15
+ if (results.length === 0) {
16
+ return `No supported language detected in this repository (checked for package.json, requirements.txt, pyproject.toml, etc.).
17
+
18
+ Inspect the repository structure to determine how dependencies should be installed, then use shell to install them.`;
19
+ }
20
+
21
+ const lines: string[] = [];
22
+
23
+ for (const result of results) {
24
+ if (result.language === "unknown") {
25
+ continue;
26
+ }
27
+
28
+ const langDisplay = result.language === "node" ? "Node.js" : "Python";
29
+
30
+ if (result.dependenciesInstalled) {
31
+ if (result.language === "node") {
32
+ lines.push(
33
+ `${langDisplay} dependencies installed successfully via ${result.packageManager}.`,
34
+ );
35
+ } else if (result.language === "python") {
36
+ lines.push(
37
+ `${langDisplay} dependencies installed successfully via ${result.packageManager} (from ${result.configFile}).`,
38
+ );
39
+ }
40
+ } else {
41
+ const errorMsg = result.issues.length > 0 ? result.issues.join("\n") : "unknown error";
42
+
43
+ if (result.language === "node") {
44
+ lines.push(`${langDisplay} dependency installation failed via ${result.packageManager}.
45
+
46
+ Error:
47
+ ${errorMsg}
48
+
49
+ Use shell or other tools at your disposal to diagnose and resolve the issue, then install dependencies manually.`);
50
+ } else if (result.language === "python") {
51
+ lines.push(`${langDisplay} dependency installation failed via ${result.packageManager} (from ${result.configFile}).
52
+
53
+ Error:
54
+ ${errorMsg}
55
+
56
+ Use shell or other tools at your disposal to diagnose and resolve the issue, then install dependencies manually.`);
57
+ }
58
+ }
59
+ }
60
+
61
+ if (lines.length === 0) {
62
+ return `No supported language detected in this repository (checked for package.json, requirements.txt, pyproject.toml, etc.).
63
+
64
+ Inspect the repository structure to determine how dependencies should be installed, then use shell to install them.`;
65
+ }
66
+
67
+ return lines.join("\n\n");
68
+ }
69
+
70
+ /**
71
+ * start dependency installation in the background (non-blocking, idempotent).
72
+ * called eagerly from main.ts at startup and also available via MCP tools.
73
+ */
74
+ export function startInstallation(ctx: ToolContext): void {
75
+ // already started or completed - do nothing
76
+ if (ctx.toolState.dependencyInstallation) {
77
+ return;
78
+ }
79
+
80
+ // SECURITY: when shell is disabled, suppress lifecycle scripts to prevent
81
+ // agents from using package.json scripts as a backdoor for code execution
82
+ const prepOptions: PrepOptions = {
83
+ ignoreScripts: ctx.payload.shell === "disabled",
84
+ binDir: packageManagerBinDir(ctx.tmpdir),
85
+ };
86
+
87
+ // initialize state and start installation
88
+ const promise = runPrepPhase(prepOptions);
89
+ ctx.toolState.dependencyInstallation = {
90
+ status: "in_progress",
91
+ promise,
92
+ results: undefined,
93
+ };
94
+
95
+ // when promise completes, update state
96
+ promise.then(
97
+ (results) => {
98
+ if (ctx.toolState.dependencyInstallation) {
99
+ const hasFailure = results.some((r) => !r.dependenciesInstalled && r.issues.length > 0);
100
+ ctx.toolState.dependencyInstallation.status = hasFailure ? "failed" : "completed";
101
+ ctx.toolState.dependencyInstallation.results = results;
102
+ }
103
+ },
104
+ () => {
105
+ if (ctx.toolState.dependencyInstallation) {
106
+ ctx.toolState.dependencyInstallation.status = "failed";
107
+ }
108
+ },
109
+ );
110
+ }
111
+
112
+ export function StartDependencyInstallationTool(ctx: ToolContext) {
113
+ return tool({
114
+ mutates: true,
115
+ name: "start_dependency_installation",
116
+ description:
117
+ "Start installing project dependencies in the background. This is non-blocking and returns immediately. Call this early (right after branch checkout) if you anticipate needing to run tests, builds, or other commands that require dependencies. Idempotent - safe to call multiple times.",
118
+ parameters: EmptyParams,
119
+ execute: execute(async () => {
120
+ const state = ctx.toolState.dependencyInstallation;
121
+
122
+ // already completed
123
+ if (state?.status === "completed" || state?.status === "failed") {
124
+ return {
125
+ status: state.status,
126
+ message: `Dependency installation already completed.`,
127
+ summary: formatPrepResults(state.results || []),
128
+ };
129
+ }
130
+
131
+ // already in progress
132
+ if (state?.status === "in_progress") {
133
+ return {
134
+ status: "in_progress",
135
+ message:
136
+ "Dependency installation is already in progress. Call await_dependency_installation when you need to use them.",
137
+ };
138
+ }
139
+
140
+ // start installation
141
+ startInstallation(ctx);
142
+
143
+ return {
144
+ status: "started",
145
+ message:
146
+ "Dependency installation started in background. Continue with other tasks and call await_dependency_installation when you need to run tests, builds, or other commands that require dependencies.",
147
+ };
148
+ }),
149
+ });
150
+ }
151
+
152
+ export function AwaitDependencyInstallationTool(ctx: ToolContext) {
153
+ return tool({
154
+ name: "await_dependency_installation",
155
+ description:
156
+ "Wait for dependency installation to complete and get the results. If installation hasn't been started yet, this will start it automatically. Call this before running tests, builds, or other commands that require dependencies.",
157
+ parameters: EmptyParams,
158
+ execute: execute(async () => {
159
+ // auto-start if not started
160
+ if (!ctx.toolState.dependencyInstallation) {
161
+ startInstallation(ctx);
162
+ }
163
+
164
+ const state = ctx.toolState.dependencyInstallation;
165
+ if (!state) {
166
+ throw new Error("failed to initialize dependency installation state");
167
+ }
168
+
169
+ // if already completed, return cached results
170
+ if (state.status === "completed" || state.status === "failed") {
171
+ return {
172
+ status: state.status,
173
+ message: formatPrepResults(state.results || []),
174
+ };
175
+ }
176
+
177
+ // await the promise
178
+ if (!state.promise) {
179
+ throw new Error("dependency installation state is corrupted - no promise found");
180
+ }
181
+
182
+ const results = await state.promise;
183
+
184
+ return {
185
+ status: state.status,
186
+ message: formatPrepResults(results),
187
+ };
188
+ }),
189
+ });
190
+ }