terramend 0.2.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 (406) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +145 -0
  3. package/dist/agents/claude.d.ts +73 -0
  4. package/dist/agents/claudePretoolGate.d.ts +99 -0
  5. package/dist/agents/gateServer.d.ts +7 -0
  6. package/dist/agents/index.d.ts +6 -0
  7. package/dist/agents/nativeFsDenies.d.ts +28 -0
  8. package/dist/agents/opencode.d.ts +231 -0
  9. package/dist/agents/opencodePlugin.d.ts +85 -0
  10. package/dist/agents/opencodeShared.d.ts +40 -0
  11. package/dist/agents/postRun.d.ts +132 -0
  12. package/dist/agents/reviewer.d.ts +38 -0
  13. package/dist/agents/sessionLabeler.d.ts +97 -0
  14. package/dist/agents/shared.d.ts +189 -0
  15. package/dist/agents/subagentModels.d.ts +19 -0
  16. package/dist/agents/subagentToolGates.d.ts +55 -0
  17. package/dist/cli.mjs +197426 -0
  18. package/dist/external.d.ts +227 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/index.js +196783 -0
  21. package/dist/internal/index.d.ts +18 -0
  22. package/dist/internal.js +1714 -0
  23. package/dist/lifecycle.d.ts +2 -0
  24. package/dist/main.d.ts +8 -0
  25. package/dist/mcp/arkConfig.d.ts +1 -0
  26. package/dist/mcp/checkSuite.d.ts +25 -0
  27. package/dist/mcp/checkout.d.ts +77 -0
  28. package/dist/mcp/comment.d.ts +119 -0
  29. package/dist/mcp/commitInfo.d.ts +9 -0
  30. package/dist/mcp/crosswalk.d.ts +105 -0
  31. package/dist/mcp/dependencies.d.ts +8 -0
  32. package/dist/mcp/geminiSanitizer.d.ts +28 -0
  33. package/dist/mcp/git.d.ts +46 -0
  34. package/dist/mcp/guardrails.d.ts +104 -0
  35. package/dist/mcp/issue.d.ts +18 -0
  36. package/dist/mcp/issueComments.d.ts +9 -0
  37. package/dist/mcp/issueEvents.d.ts +9 -0
  38. package/dist/mcp/issueInfo.d.ts +9 -0
  39. package/dist/mcp/labels.d.ts +12 -0
  40. package/dist/mcp/localContext.d.ts +19 -0
  41. package/dist/mcp/moduleExtraction.d.ts +71 -0
  42. package/dist/mcp/moduleTests.d.ts +104 -0
  43. package/dist/mcp/modules.d.ts +179 -0
  44. package/dist/mcp/output.d.ts +12 -0
  45. package/dist/mcp/pathSafety.d.ts +14 -0
  46. package/dist/mcp/policy.d.ts +48 -0
  47. package/dist/mcp/pr.d.ts +49 -0
  48. package/dist/mcp/prInfo.d.ts +9 -0
  49. package/dist/mcp/providerSchema.d.ts +50 -0
  50. package/dist/mcp/review.d.ts +199 -0
  51. package/dist/mcp/reviewComments.d.ts +178 -0
  52. package/dist/mcp/roots.d.ts +58 -0
  53. package/dist/mcp/scope.d.ts +15 -0
  54. package/dist/mcp/selectMode.d.ts +18 -0
  55. package/dist/mcp/server.d.ts +48 -0
  56. package/dist/mcp/shared.d.ts +47 -0
  57. package/dist/mcp/shell.d.ts +37 -0
  58. package/dist/mcp/staleFix.d.ts +51 -0
  59. package/dist/mcp/terraform/cost.d.ts +55 -0
  60. package/dist/mcp/terraform/currency.d.ts +94 -0
  61. package/dist/mcp/terraform/decisions.d.ts +178 -0
  62. package/dist/mcp/terraform/findings.d.ts +75 -0
  63. package/dist/mcp/terraform/plan.d.ts +157 -0
  64. package/dist/mcp/terraform/scanners.d.ts +131 -0
  65. package/dist/mcp/terraform/tools.d.ts +63 -0
  66. package/dist/mcp/terraform/types.d.ts +172 -0
  67. package/dist/mcp/terraform.d.ts +22 -0
  68. package/dist/mcp/terratest.d.ts +83 -0
  69. package/dist/mcp/upload.d.ts +6 -0
  70. package/dist/models.d.ts +171 -0
  71. package/dist/modes.d.ts +26 -0
  72. package/dist/prep/index.d.ts +7 -0
  73. package/dist/prep/installNodeDependencies.d.ts +2 -0
  74. package/dist/prep/installPythonDependencies.d.ts +2 -0
  75. package/dist/prep/types.d.ts +31 -0
  76. package/dist/reviewQuality.d.ts +64 -0
  77. package/dist/skills/terraform-best-practices/SKILL.md +369 -0
  78. package/dist/toolState.d.ts +135 -0
  79. package/dist/utils/activity.d.ts +40 -0
  80. package/dist/utils/agent.d.ts +20 -0
  81. package/dist/utils/agentHangReport.d.ts +38 -0
  82. package/dist/utils/apiFetch.d.ts +19 -0
  83. package/dist/utils/apiKeys.d.ts +41 -0
  84. package/dist/utils/apiUrl.d.ts +20 -0
  85. package/dist/utils/assets.d.ts +8 -0
  86. package/dist/utils/billingErrors.d.ts +85 -0
  87. package/dist/utils/body.d.ts +34 -0
  88. package/dist/utils/buildTerramendFooter.d.ts +25 -0
  89. package/dist/utils/byokFallback.d.ts +85 -0
  90. package/dist/utils/claudeSubscription.d.ts +30 -0
  91. package/dist/utils/cli.d.ts +10 -0
  92. package/dist/utils/codexHome.d.ts +29 -0
  93. package/dist/utils/codexOAuth.d.ts +60 -0
  94. package/dist/utils/diffCoverage.d.ts +63 -0
  95. package/dist/utils/errorReport.d.ts +17 -0
  96. package/dist/utils/exitHandler.d.ts +8 -0
  97. package/dist/utils/fixDoubleEscapedString.d.ts +1 -0
  98. package/dist/utils/gitAuth.d.ts +84 -0
  99. package/dist/utils/gitAuthServer.d.ts +24 -0
  100. package/dist/utils/github.d.ts +78 -0
  101. package/dist/utils/globals.d.ts +3 -0
  102. package/dist/utils/install.d.ts +60 -0
  103. package/dist/utils/instructions.d.ts +48 -0
  104. package/dist/utils/leapingComment.d.ts +11 -0
  105. package/dist/utils/learnings.d.ts +62 -0
  106. package/dist/utils/learningsTruncate.d.ts +25 -0
  107. package/dist/utils/lifecycle.d.ts +57 -0
  108. package/dist/utils/log.d.ts +111 -0
  109. package/dist/utils/normalizeEnv.d.ts +30 -0
  110. package/dist/utils/openCodeModels.d.ts +11 -0
  111. package/dist/utils/overrides.d.ts +40 -0
  112. package/dist/utils/packageManager.d.ts +49 -0
  113. package/dist/utils/patchWorkflowRunFields.d.ts +29 -0
  114. package/dist/utils/payload.d.ts +105 -0
  115. package/dist/utils/prSummary.d.ts +61 -0
  116. package/dist/utils/progressComment.d.ts +146 -0
  117. package/dist/utils/providerErrors.d.ts +31 -0
  118. package/dist/utils/rangeDiff.d.ts +51 -0
  119. package/dist/utils/remediationCommand.d.ts +55 -0
  120. package/dist/utils/retry.d.ts +13 -0
  121. package/dist/utils/reviewCleanup.d.ts +14 -0
  122. package/dist/utils/run.d.ts +9 -0
  123. package/dist/utils/runContext.d.ts +60 -0
  124. package/dist/utils/runContextData.d.ts +23 -0
  125. package/dist/utils/runErrorRenderer.d.ts +64 -0
  126. package/dist/utils/runLifecycle.d.ts +86 -0
  127. package/dist/utils/runStartupLog.d.ts +15 -0
  128. package/dist/utils/secrets.d.ts +22 -0
  129. package/dist/utils/setup.d.ts +90 -0
  130. package/dist/utils/shell.d.ts +32 -0
  131. package/dist/utils/skills.d.ts +10 -0
  132. package/dist/utils/subprocess.d.ts +80 -0
  133. package/dist/utils/terraformMcp.d.ts +42 -0
  134. package/dist/utils/time.d.ts +15 -0
  135. package/dist/utils/timer.d.ts +23 -0
  136. package/dist/utils/todoTracking.d.ts +16 -0
  137. package/dist/utils/token.d.ts +39 -0
  138. package/dist/utils/version.d.ts +2 -0
  139. package/dist/utils/versioning.d.ts +7 -0
  140. package/dist/utils/vertex.d.ts +16 -0
  141. package/dist/utils/workflow.d.ts +13 -0
  142. package/package.json +119 -0
  143. package/src/agents/claude.test.ts +1016 -0
  144. package/src/agents/claude.ts +1246 -0
  145. package/src/agents/claudePretoolGate.test.ts +28 -0
  146. package/src/agents/claudePretoolGate.ts +173 -0
  147. package/src/agents/gateServer.test.ts +204 -0
  148. package/src/agents/gateServer.ts +124 -0
  149. package/src/agents/index.ts +10 -0
  150. package/src/agents/nativeFsDenies.ts +82 -0
  151. package/src/agents/opencode.test.ts +1440 -0
  152. package/src/agents/opencode.ts +1312 -0
  153. package/src/agents/opencodePlugin.ts +222 -0
  154. package/src/agents/opencodeShared.test.ts +34 -0
  155. package/src/agents/opencodeShared.ts +121 -0
  156. package/src/agents/postRun.test.ts +549 -0
  157. package/src/agents/postRun.ts +535 -0
  158. package/src/agents/reviewer.ts +104 -0
  159. package/src/agents/sessionLabeler.test.ts +247 -0
  160. package/src/agents/sessionLabeler.ts +178 -0
  161. package/src/agents/shared.test.ts +76 -0
  162. package/src/agents/shared.ts +292 -0
  163. package/src/agents/subagentModels.test.ts +113 -0
  164. package/src/agents/subagentModels.ts +40 -0
  165. package/src/agents/subagentRegistration.test.ts +41 -0
  166. package/src/agents/subagentToolGates.ts +114 -0
  167. package/src/cli.test.ts +129 -0
  168. package/src/cli.ts +105 -0
  169. package/src/commands/gha.test.ts +192 -0
  170. package/src/commands/gha.ts +188 -0
  171. package/src/commands/mcp.ts +122 -0
  172. package/src/config.ts +1 -0
  173. package/src/entry.ts +7 -0
  174. package/src/entryPost.stdlibOnly.test.ts +109 -0
  175. package/src/entryPost.ts +99 -0
  176. package/src/external.test.ts +16 -0
  177. package/src/external.ts +302 -0
  178. package/src/index.ts +11 -0
  179. package/src/internal/index.ts +71 -0
  180. package/src/lifecycle.ts +2 -0
  181. package/src/main.test.ts +873 -0
  182. package/src/main.ts +712 -0
  183. package/src/mcp/__fixtures__/terramend-scratch-pr-49-review-3485940013.json +110 -0
  184. package/src/mcp/__fixtures__/terramend-scratch-pr-64-review-3531000326.json +14 -0
  185. package/src/mcp/__fixtures__/terramend-test-repo-pr-1.diff.json +67 -0
  186. package/src/mcp/__snapshots__/checkout.test.ts.snap +109 -0
  187. package/src/mcp/__snapshots__/reviewComments.test.ts.snap +71 -0
  188. package/src/mcp/arkConfig.ts +7 -0
  189. package/src/mcp/checkSuite.test.ts +245 -0
  190. package/src/mcp/checkSuite.ts +255 -0
  191. package/src/mcp/checkout.test.ts +752 -0
  192. package/src/mcp/checkout.ts +886 -0
  193. package/src/mcp/comment.test.ts +772 -0
  194. package/src/mcp/comment.ts +582 -0
  195. package/src/mcp/commitInfo.test.ts +127 -0
  196. package/src/mcp/commitInfo.ts +61 -0
  197. package/src/mcp/crosswalk.test.ts +106 -0
  198. package/src/mcp/crosswalk.ts +339 -0
  199. package/src/mcp/dependencies.test.ts +309 -0
  200. package/src/mcp/dependencies.ts +189 -0
  201. package/src/mcp/geminiSanitizer.test.ts +287 -0
  202. package/src/mcp/geminiSanitizer.ts +207 -0
  203. package/src/mcp/git.test.ts +1083 -0
  204. package/src/mcp/git.ts +890 -0
  205. package/src/mcp/guardrails.test.ts +705 -0
  206. package/src/mcp/guardrails.ts +465 -0
  207. package/src/mcp/issue.test.ts +113 -0
  208. package/src/mcp/issue.ts +73 -0
  209. package/src/mcp/issueComments.test.ts +69 -0
  210. package/src/mcp/issueComments.ts +48 -0
  211. package/src/mcp/issueEvents.test.ts +134 -0
  212. package/src/mcp/issueEvents.ts +100 -0
  213. package/src/mcp/issueInfo.test.ts +104 -0
  214. package/src/mcp/issueInfo.ts +72 -0
  215. package/src/mcp/labels.test.ts +52 -0
  216. package/src/mcp/labels.ts +34 -0
  217. package/src/mcp/localContext.ts +28 -0
  218. package/src/mcp/localServer.test.ts +75 -0
  219. package/src/mcp/localServer.ts +131 -0
  220. package/src/mcp/moduleExtraction.test.ts +261 -0
  221. package/src/mcp/moduleExtraction.ts +313 -0
  222. package/src/mcp/moduleTests.test.ts +269 -0
  223. package/src/mcp/moduleTests.ts +421 -0
  224. package/src/mcp/modules.test.ts +640 -0
  225. package/src/mcp/modules.ts +696 -0
  226. package/src/mcp/output.test.ts +96 -0
  227. package/src/mcp/output.ts +70 -0
  228. package/src/mcp/pathSafety.test.ts +44 -0
  229. package/src/mcp/pathSafety.ts +28 -0
  230. package/src/mcp/policy.test.ts +282 -0
  231. package/src/mcp/policy.ts +199 -0
  232. package/src/mcp/pr.test.ts +387 -0
  233. package/src/mcp/pr.ts +194 -0
  234. package/src/mcp/prInfo.test.ts +96 -0
  235. package/src/mcp/prInfo.ts +91 -0
  236. package/src/mcp/providerSchema.test.ts +85 -0
  237. package/src/mcp/providerSchema.ts +175 -0
  238. package/src/mcp/review.test.ts +936 -0
  239. package/src/mcp/review.ts +923 -0
  240. package/src/mcp/reviewComments.test.ts +549 -0
  241. package/src/mcp/reviewComments.ts +896 -0
  242. package/src/mcp/roots.test.ts +175 -0
  243. package/src/mcp/roots.ts +217 -0
  244. package/src/mcp/scope.test.ts +59 -0
  245. package/src/mcp/scope.ts +65 -0
  246. package/src/mcp/security.test.ts +720 -0
  247. package/src/mcp/selectMode.test.ts +210 -0
  248. package/src/mcp/selectMode.ts +181 -0
  249. package/src/mcp/server.test.ts +292 -0
  250. package/src/mcp/server.ts +403 -0
  251. package/src/mcp/shared.ts +100 -0
  252. package/src/mcp/shell.test.ts +520 -0
  253. package/src/mcp/shell.ts +505 -0
  254. package/src/mcp/staleFix.test.ts +237 -0
  255. package/src/mcp/staleFix.ts +277 -0
  256. package/src/mcp/terraform/cost.ts +163 -0
  257. package/src/mcp/terraform/currency.test.ts +338 -0
  258. package/src/mcp/terraform/currency.ts +336 -0
  259. package/src/mcp/terraform/decisions.ts +527 -0
  260. package/src/mcp/terraform/findings.ts +333 -0
  261. package/src/mcp/terraform/plan.ts +348 -0
  262. package/src/mcp/terraform/scanners.ts +809 -0
  263. package/src/mcp/terraform/tools.test.ts +1071 -0
  264. package/src/mcp/terraform/tools.ts +908 -0
  265. package/src/mcp/terraform/types.ts +305 -0
  266. package/src/mcp/terraform.test.ts +1957 -0
  267. package/src/mcp/terraform.ts +23 -0
  268. package/src/mcp/terratest.test.ts +105 -0
  269. package/src/mcp/terratest.ts +196 -0
  270. package/src/mcp/toolFiltering.test.ts +85 -0
  271. package/src/mcp/upload.test.ts +180 -0
  272. package/src/mcp/upload.ts +112 -0
  273. package/src/models.test.ts +300 -0
  274. package/src/models.ts +708 -0
  275. package/src/modes.test.ts +107 -0
  276. package/src/modes.ts +880 -0
  277. package/src/prep/index.ts +43 -0
  278. package/src/prep/installNodeDependencies.test.ts +298 -0
  279. package/src/prep/installNodeDependencies.ts +196 -0
  280. package/src/prep/installPythonDependencies.test.ts +268 -0
  281. package/src/prep/installPythonDependencies.ts +199 -0
  282. package/src/prep/types.ts +38 -0
  283. package/src/reviewQuality.test.ts +63 -0
  284. package/src/reviewQuality.ts +134 -0
  285. package/src/runCli.test.ts +214 -0
  286. package/src/runCli.ts +282 -0
  287. package/src/skills/terraform-best-practices/SKILL.md +369 -0
  288. package/src/toolState.test.ts +45 -0
  289. package/src/toolState.ts +252 -0
  290. package/src/utils/activity.test.ts +188 -0
  291. package/src/utils/activity.ts +210 -0
  292. package/src/utils/agent.test.ts +251 -0
  293. package/src/utils/agent.ts +139 -0
  294. package/src/utils/agentHangReport.test.ts +203 -0
  295. package/src/utils/agentHangReport.ts +170 -0
  296. package/src/utils/apiFetch.test.ts +115 -0
  297. package/src/utils/apiFetch.ts +62 -0
  298. package/src/utils/apiKeys.test.ts +344 -0
  299. package/src/utils/apiKeys.ts +206 -0
  300. package/src/utils/apiUrl.test.ts +30 -0
  301. package/src/utils/apiUrl.ts +59 -0
  302. package/src/utils/assets.test.ts +153 -0
  303. package/src/utils/assets.ts +107 -0
  304. package/src/utils/billingErrors.test.ts +121 -0
  305. package/src/utils/billingErrors.ts +189 -0
  306. package/src/utils/body.test.ts +217 -0
  307. package/src/utils/body.ts +168 -0
  308. package/src/utils/buildTerramendFooter.test.ts +38 -0
  309. package/src/utils/buildTerramendFooter.ts +82 -0
  310. package/src/utils/byokFallback.test.ts +205 -0
  311. package/src/utils/byokFallback.ts +128 -0
  312. package/src/utils/claudeSubscription.test.ts +179 -0
  313. package/src/utils/claudeSubscription.ts +93 -0
  314. package/src/utils/cli.ts +31 -0
  315. package/src/utils/codexHome.test.ts +190 -0
  316. package/src/utils/codexHome.ts +191 -0
  317. package/src/utils/codexOAuth.ts +147 -0
  318. package/src/utils/codexRefreshDetect.test.ts +85 -0
  319. package/src/utils/codexRefreshDetect.ts +35 -0
  320. package/src/utils/diffCoverage.test.ts +468 -0
  321. package/src/utils/diffCoverage.ts +404 -0
  322. package/src/utils/errorReport.test.ts +135 -0
  323. package/src/utils/errorReport.ts +83 -0
  324. package/src/utils/exitHandler.ts +35 -0
  325. package/src/utils/fixDoubleEscapedString.ts +9 -0
  326. package/src/utils/ghaCore.ts +13 -0
  327. package/src/utils/gitAuth.test.ts +322 -0
  328. package/src/utils/gitAuth.ts +263 -0
  329. package/src/utils/gitAuthServer.test.ts +260 -0
  330. package/src/utils/gitAuthServer.ts +182 -0
  331. package/src/utils/github.test.ts +615 -0
  332. package/src/utils/github.ts +538 -0
  333. package/src/utils/globals.ts +9 -0
  334. package/src/utils/humanEditCapture.test.ts +100 -0
  335. package/src/utils/humanEditCapture.ts +193 -0
  336. package/src/utils/install.test.ts +768 -0
  337. package/src/utils/install.ts +492 -0
  338. package/src/utils/instructions.test.ts +240 -0
  339. package/src/utils/instructions.ts +543 -0
  340. package/src/utils/leapingComment.test.ts +51 -0
  341. package/src/utils/leapingComment.ts +18 -0
  342. package/src/utils/learnings.test.ts +87 -0
  343. package/src/utils/learnings.ts +138 -0
  344. package/src/utils/learningsTocRender.test.ts +116 -0
  345. package/src/utils/learningsTruncate.test.ts +39 -0
  346. package/src/utils/learningsTruncate.ts +42 -0
  347. package/src/utils/lifecycle.test.ts +195 -0
  348. package/src/utils/lifecycle.ts +198 -0
  349. package/src/utils/log.test.ts +402 -0
  350. package/src/utils/log.ts +432 -0
  351. package/src/utils/normalizeEnv.test.ts +91 -0
  352. package/src/utils/normalizeEnv.ts +106 -0
  353. package/src/utils/openCodeModels.ts +82 -0
  354. package/src/utils/overrides.test.ts +89 -0
  355. package/src/utils/overrides.ts +98 -0
  356. package/src/utils/packageManager.test.ts +321 -0
  357. package/src/utils/packageManager.ts +257 -0
  358. package/src/utils/patchWorkflowRunFields.test.ts +92 -0
  359. package/src/utils/patchWorkflowRunFields.ts +150 -0
  360. package/src/utils/payload.test.ts +497 -0
  361. package/src/utils/payload.ts +371 -0
  362. package/src/utils/postApiFetch.ts +51 -0
  363. package/src/utils/prSummary.test.ts +224 -0
  364. package/src/utils/prSummary.ts +147 -0
  365. package/src/utils/progressComment.ts +261 -0
  366. package/src/utils/providerErrors.test.ts +315 -0
  367. package/src/utils/providerErrors.ts +172 -0
  368. package/src/utils/rangeDiff.test.ts +236 -0
  369. package/src/utils/rangeDiff.ts +182 -0
  370. package/src/utils/remediationCommand.test.ts +163 -0
  371. package/src/utils/remediationCommand.ts +119 -0
  372. package/src/utils/retry.test.ts +153 -0
  373. package/src/utils/retry.ts +58 -0
  374. package/src/utils/reviewCleanup.ts +106 -0
  375. package/src/utils/run.ts +99 -0
  376. package/src/utils/runContext.ts +145 -0
  377. package/src/utils/runContextData.ts +58 -0
  378. package/src/utils/runErrorRenderer.test.ts +95 -0
  379. package/src/utils/runErrorRenderer.ts +259 -0
  380. package/src/utils/runFixture.ts +76 -0
  381. package/src/utils/runLifecycle.ts +237 -0
  382. package/src/utils/runStartupLog.ts +60 -0
  383. package/src/utils/secrets.test.ts +103 -0
  384. package/src/utils/secrets.ts +177 -0
  385. package/src/utils/setup.test.ts +509 -0
  386. package/src/utils/setup.ts +352 -0
  387. package/src/utils/shell.ts +103 -0
  388. package/src/utils/skills.test.ts +46 -0
  389. package/src/utils/skills.ts +67 -0
  390. package/src/utils/subprocess.test.ts +170 -0
  391. package/src/utils/subprocess.ts +438 -0
  392. package/src/utils/terraformMcp.test.ts +63 -0
  393. package/src/utils/terraformMcp.ts +83 -0
  394. package/src/utils/time.test.ts +105 -0
  395. package/src/utils/time.ts +59 -0
  396. package/src/utils/timer.test.ts +91 -0
  397. package/src/utils/timer.ts +72 -0
  398. package/src/utils/todoTracking.test.ts +223 -0
  399. package/src/utils/todoTracking.ts +167 -0
  400. package/src/utils/token.test.ts +239 -0
  401. package/src/utils/token.ts +186 -0
  402. package/src/utils/version.ts +10 -0
  403. package/src/utils/versioning.test.ts +34 -0
  404. package/src/utils/versioning.ts +44 -0
  405. package/src/utils/vertex.ts +85 -0
  406. package/src/utils/workflow.ts +25 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Modularization-as-remediation (M2, the hepcare pattern) — DETECTION.
3
+ *
4
+ * Finds clusters of raw resources that look like they should be a module call,
5
+ * and matches each cluster against the modules the repo already trusts: the
6
+ * operator's `module_catalogue` and the repo's own local ("house") modules.
7
+ * The agent turns a candidate into a refactor PR; `terraform_plan`'s
8
+ * `refactor_safe` gate (pure `moved {}` plan) is what makes that PR provably a
9
+ * no-op on live infrastructure.
10
+ *
11
+ * Everything here is pure parsing + set arithmetic over files already on disk —
12
+ * no subprocess, no network — mirroring the modules.ts design.
13
+ */
14
+ import type { LocalToolContext } from "#app/mcp/localContext";
15
+ import { type ModuleCatalogueEntry, type ModuleSourceKind } from "#app/mcp/modules";
16
+ export interface ParsedResource {
17
+ type: string;
18
+ name: string;
19
+ }
20
+ /** parse every `resource "<type>" "<name>" {` header in some HCL. Headers are
21
+ * enough here — clustering and signature matching only need type + name. */
22
+ export declare function parseResourceBlocks(hcl: string): ParsedResource[];
23
+ export interface ExtractionCluster {
24
+ /** the file the resources live in (clusters never span files — one file is
25
+ * the unit a reviewer can hold in their head, and the unit `moved {}` blocks
26
+ * keep reviewable). */
27
+ file: string;
28
+ /** the shared resource-NAME prefix that bound the cluster, or null for a
29
+ * whole-file cluster. */
30
+ name_prefix: string | null;
31
+ resources: ParsedResource[];
32
+ /** distinct resource types, sorted — the cluster's signature. */
33
+ resource_types: string[];
34
+ }
35
+ /**
36
+ * Cluster one file's resources into extraction candidates:
37
+ * - groups sharing a name prefix with ≥ MIN_CLUSTER_SIZE members, else
38
+ * - the whole file when it holds ≥ MIN_CLUSTER_SIZE+1 resources of ≥2 types
39
+ * (a single-type pile is usually `count`/`for_each` material, not a module).
40
+ * Prefix clusters that would equal the whole-file cluster collapse into one.
41
+ */
42
+ export declare function clusterResources(file: string, resources: ParsedResource[]): ExtractionCluster[];
43
+ export interface CandidateModule {
44
+ name: string;
45
+ source: string;
46
+ version: string | null;
47
+ kind: ModuleSourceKind;
48
+ /** how the match was made: a house module's actual resource types, or a
49
+ * catalogue module's name matching the cluster's service keywords. */
50
+ match: "resource_signature" | "name_keyword";
51
+ /** fraction of the cluster's resource types the candidate covers (signature
52
+ * matches) or whose service keyword hits the candidate's name (keyword). */
53
+ overlap: number;
54
+ /** house modules only — what the call site must wire up. */
55
+ required_variables?: string[];
56
+ }
57
+ /** service keywords of a resource type: `aws_s3_bucket` → ["s3", "bucket"]. */
58
+ export declare function serviceKeywords(resourceType: string): string[];
59
+ export interface HouseModuleSignature {
60
+ dir: string;
61
+ resourceTypes: string[];
62
+ requiredVariables: string[];
63
+ }
64
+ export declare function matchCluster(cluster: ExtractionCluster, houseModules: HouseModuleSignature[], catalogue: ModuleCatalogueEntry[]): CandidateModule[];
65
+ export interface ExtractionCandidate {
66
+ cluster: ExtractionCluster;
67
+ candidates: CandidateModule[];
68
+ }
69
+ export declare function findExtractionCandidates(cwd: string, rawCatalogue: string | undefined): ExtractionCandidate[];
70
+ export declare const ModuleExtractionCandidatesParams: import("arktype/internal/variants/object.ts").ObjectType<object, {}>;
71
+ export declare function ModuleExtractionCandidatesTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<object, object>>;
@@ -0,0 +1,104 @@
1
+ import type { LocalToolContext } from "#app/mcp/localContext";
2
+ /**
3
+ * §28 (remediation slice) — keep a reusable module's EXISTING tests/examples
4
+ * consistent with a fix. `scaffold_terratest` covers the GENERATION direction
5
+ * (new module → new plan-only tests). This is the inverse: when Remediate fixes
6
+ * an existing local/house module and the fix changes the module's public
7
+ * interface (adds a required `variable`, renames or removes one, tightens a
8
+ * type), the module's `examples/` fixtures and `terraform test` / Terratest
9
+ * files that CALL it can silently go stale — a missing required variable breaks
10
+ * `terraform test`/`plan`, and a reference to a removed variable is an error.
11
+ *
12
+ * This module finds those test/example assets for a module dir and computes the
13
+ * DRIFT between what each asset passes and the module's CURRENT interface, so the
14
+ * agent updates exactly the assets that need it (and only those) after a fix —
15
+ * never weakening an assertion to go green. The parsing is pure + unit-tested;
16
+ * the collector just reads the conventional locations (no full-repo walk).
17
+ */
18
+ export type ModuleTestAssetKind = "example" | "native-test" | "go-test";
19
+ export interface ModuleTestAsset {
20
+ /** repo-relative path: a dir for examples, a file for native/go tests. */
21
+ path: string;
22
+ kind: ModuleTestAssetKind;
23
+ /** variable names the asset passes to the module (best-effort for go tests). */
24
+ set_variables: string[];
25
+ }
26
+ export interface ModuleTestDrift {
27
+ path: string;
28
+ kind: ModuleTestAssetKind;
29
+ /** required module variables the asset does NOT set (would break plan/test). */
30
+ missing_required: string[];
31
+ /** variables the asset sets that are NOT in the module interface — the fix
32
+ * renamed or removed them, so the reference is now stale/an error. */
33
+ unknown_set: string[];
34
+ }
35
+ export interface ModuleTestReport {
36
+ module_dir: string;
37
+ /** the module's CURRENT interface, the truth the assets must match. */
38
+ required_variables: string[];
39
+ variable_names: string[];
40
+ assets: ModuleTestAsset[];
41
+ drift: ModuleTestDrift[];
42
+ }
43
+ /**
44
+ * The TOP-LEVEL attribute names assigned (`name = …`) directly in an HCL block
45
+ * body — nested-block / object-field keys are excluded by collapsing `{…}` spans
46
+ * first. Pure. Used for both a `module` block's arguments and a `variables {}`
47
+ * block's entries. `==`/`>=`/`!=` etc. are excluded via the `=(?!=)` guard and
48
+ * by requiring the name to start a line.
49
+ */
50
+ export declare function topLevelAttributeNames(body: string): string[];
51
+ /**
52
+ * Variables an example sets on the module(s) whose `source` satisfies
53
+ * `sourceMatches` — the union of the matching `module` blocks' top-level
54
+ * arguments (minus meta-args like `source`/`version`/`count`). Pure. Returns []
55
+ * when no module block in the HCL targets the module.
56
+ */
57
+ export declare function parseExampleModuleVariables(hcl: string, sourceMatches: (source: string) => boolean): string[];
58
+ /**
59
+ * Variables a Terraform-native test (`*.tftest.hcl`) sets — the union of every
60
+ * `variables { … }` block's top-level entries (the top-level block plus any
61
+ * inside `run "…" { … }`). When the test lives in the module's own dir it tests
62
+ * the module in place, so these are the module's variables. Pure.
63
+ */
64
+ export declare function parseNativeTestVariables(hcl: string): string[];
65
+ /**
66
+ * Variable keys a Go Terratest sets — the `"<key>":` entries inside a
67
+ * `Vars: map[string]interface{}{ … }` (or `map[string]any{ … }`) literal.
68
+ * Best-effort (Go isn't parsed structurally); advisory only. Pure.
69
+ */
70
+ export declare function parseGoTestVariables(go: string): string[];
71
+ /**
72
+ * Drift between what an asset passes and the module's CURRENT interface:
73
+ * `missing_required` (required vars the asset never sets) and `unknown_set`
74
+ * (vars the asset sets that the module no longer declares). Pure.
75
+ */
76
+ export declare function computeInterfaceDrift(input: {
77
+ setVariables: string[];
78
+ requiredVariables: string[];
79
+ variableNames: string[];
80
+ }): {
81
+ missing_required: string[];
82
+ unknown_set: string[];
83
+ };
84
+ /**
85
+ * Find a module's existing test/example assets in the conventional locations and
86
+ * record which of the module's variables each one passes. Reads only the module's
87
+ * own `examples/`/`tests/`/`test/` dirs and the repo-root `examples/` (no
88
+ * full-tree walk). `moduleDir` is repo-relative POSIX. Side-effecting (reads fs).
89
+ */
90
+ export declare function discoverModuleTestAssets(cwd: string, moduleDir: string): ModuleTestAsset[];
91
+ /**
92
+ * Build the module's test/example consistency report: its current interface, the
93
+ * discovered assets, and the per-asset drift against that interface. Side-effecting
94
+ * (reads fs). The agent reads `drift` to know which assets to update after a fix.
95
+ */
96
+ export declare function analyzeModuleTests(cwd: string, moduleDir: string): ModuleTestReport;
97
+ export declare const TerraformModuleTestsParams: import("arktype/internal/variants/object.ts").ObjectType<{
98
+ module_dir: string;
99
+ }, {}>;
100
+ export declare function TerraformModuleTestsTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
101
+ module_dir: string;
102
+ }, {
103
+ module_dir: string;
104
+ }>>;
@@ -0,0 +1,179 @@
1
+ import type { LocalToolContext } from "#app/mcp/localContext";
2
+ /**
3
+ * Terraform module support (§4.14 + module catalogue). Two related capabilities:
4
+ *
5
+ * - **Module catalogue** — an operator-curated list of approved modules (a
6
+ * registry module like `terraform-aws-modules/vpc/aws`, or one of the org's
7
+ * own/house modules at a local path) that a fix/generation should PREFER over
8
+ * hand-rolling raw resources. Surfaced by `list_modules`.
9
+ * - **Module-source-aware fixes** — parse the repo's `module "x" { source = … }`
10
+ * blocks into a call-graph so a concern inside a *local* module is fixed at
11
+ * its SOURCE once (not patched at every call site), while a concern that would
12
+ * require editing a *registry/remote* module is flagged as out-of-repo.
13
+ * Surfaced by `terraform_module_graph`.
14
+ *
15
+ * The parsing is pure (no subprocess) and unit-tested; the tools just read files.
16
+ */
17
+ export interface ModuleCatalogueEntry {
18
+ /** the local name to use in a `module "<name>"` block. */
19
+ name: string;
20
+ /** the `source` value, e.g. `terraform-aws-modules/vpc/aws` or `./modules/vpc`. */
21
+ source: string;
22
+ /** optional version constraint for a registry module. */
23
+ version: string | null;
24
+ /** classification of the source (registry / local / git / remote). */
25
+ kind: ModuleSourceKind;
26
+ }
27
+ export type ModuleSourceKind = "local" | "registry" | "git" | "remote" | "unknown";
28
+ export interface ParsedModuleSource {
29
+ /** the full original source string. */
30
+ raw: string;
31
+ /** the source with the `//subdir` selector and `?query` stripped. */
32
+ base: string;
33
+ /** the `//subdir` path within the module repo/package, or null. */
34
+ subdir: string | null;
35
+ /** the `?ref=` revision (git tag/branch/commit), or null. This is how git
36
+ * modules PIN a version — Terraform has no `version` attribute for them. */
37
+ ref: string | null;
38
+ kind: ModuleSourceKind;
39
+ }
40
+ /**
41
+ * Split a Terraform module `source` into its base, `//subdir` selector, and
42
+ * `?ref=` revision — the three parts Terraform's go-getter syntax composes
43
+ * (`git::https://host/repo.git//subdir?ref=v1`,
44
+ * `terraform-aws-modules/cloudwatch/aws//modules/log-group`). The `//` separator
45
+ * is the one NOT part of a `://` scheme. Pure; underpins classification + the
46
+ * version a git module is pinned at.
47
+ */
48
+ export declare function splitModuleSource(raw: string): ParsedModuleSource;
49
+ /**
50
+ * Classify a Terraform module `source` string (the full value, including any
51
+ * `//subdir` / `?ref=`). Mirrors Terraform's own source resolution: a
52
+ * `./`/`../`/absolute path is LOCAL; a `git::`/`github.com`/`.git`/`bitbucket.org`
53
+ * source is GIT; an `s3::`/`gcs::`/`http(s)` archive is REMOTE; a bare
54
+ * `namespace/name/provider` (optionally host-prefixed, optionally with a
55
+ * `//submodule` path) is a REGISTRY ref.
56
+ */
57
+ export declare function classifyModuleSource(source: string): ModuleSourceKind;
58
+ /**
59
+ * Parse the operator's `module_catalogue` input into structured entries. Accepts
60
+ * newline- and/or comma-separated entries, each:
61
+ * `[name=]<source>[ <version>]`
62
+ * e.g. `vpc=terraform-aws-modules/vpc/aws ~> 5.0`, `terraform-aws-modules/s3-bucket/aws`,
63
+ * `./modules/networking`. Name is optional (derived from the source when absent);
64
+ * version applies to registry sources.
65
+ */
66
+ export declare function parseModuleCatalogue(raw: string | undefined): ModuleCatalogueEntry[];
67
+ export interface ModuleBlock {
68
+ /** the local name in `module "<name>" { … }`. */
69
+ name: string;
70
+ source: string;
71
+ /** the pinned version — the `version` attribute (registry) or the git `?ref=`
72
+ * (git), whichever is present; null when unpinned. */
73
+ version: string | null;
74
+ /** the `//subdir` selector within the module package, or null. */
75
+ subdir: string | null;
76
+ kind: ModuleSourceKind;
77
+ /** the file the `module` block was declared in (repo-relative). */
78
+ declaredIn: string;
79
+ }
80
+ /**
81
+ * Parse every `module "<name>" { … }` block in some HCL into its name, source,
82
+ * pinned version, and subdir. Brace-matched so nested blocks (e.g. a
83
+ * `providers = { … }` map inside the module block) don't confuse it. The version
84
+ * comes from the `version` attribute (registry modules) OR the source's `?ref=`
85
+ * (git modules), so a git-pinned module isn't reported as unpinned. `declaredIn`
86
+ * is filled by the caller; here it's "".
87
+ */
88
+ export declare function parseModuleBlocks(hcl: string): ModuleBlock[];
89
+ export interface ModuleGraph {
90
+ /** every `module` block found, with its classified source. */
91
+ modules: ModuleBlock[];
92
+ /** local module source dirs (repo-relative), each with the caller files that
93
+ * reference it — fix a concern in one of these dirs ONCE at the source. */
94
+ localModuleDirs: {
95
+ dir: string;
96
+ callers: string[];
97
+ }[];
98
+ /** count of registry/git/remote module references — concerns that live inside
99
+ * one of these are NOT editable in this repo (open an issue instead). */
100
+ externalCount: number;
101
+ }
102
+ /**
103
+ * Recursively list `*.tf` files under `cwd`, repo-relative (POSIX), skipping
104
+ * cache/VCS/dep dirs. Bounded by depth and a file cap so a huge monorepo can't
105
+ * stall the walk. Real Terraform repos (e.g. hepcare) keep their root config in
106
+ * a subdir (`terraform/`) with house modules in `terraform/modules/` and even a
107
+ * second root (`terraform/core/`) — a single-level read misses all of that, so
108
+ * we walk the tree.
109
+ */
110
+ export declare function walkTfFiles(cwd: string, maxDepth?: number, cap?: number): string[];
111
+ /**
112
+ * Walk `cwd` recursively and build the module call-graph across every Terraform
113
+ * file (root + subdir roots + nested modules). A local module's dir is resolved
114
+ * RELATIVE TO THE DECLARING FILE (`./modules/x` in `core/main.tf` → `core/modules/x`),
115
+ * not to `cwd`, so the graph is correct for multi-root repos.
116
+ */
117
+ export declare function collectModuleGraph(cwd: string): ModuleGraph;
118
+ /**
119
+ * §24 dependency-aware fix ordering. Order the repo's LOCAL module dirs so a
120
+ * module that others depend on is fixed BEFORE its dependents — sequencing
121
+ * remediation PRs so they don't conflict (a fix at a shared module source
122
+ * propagates to callers; fixing the caller first would be redundant or clash).
123
+ *
124
+ * Builds edges among local module dirs: a `module` block declared inside local
125
+ * dir A whose source resolves to local dir B means "A depends on B", so B must
126
+ * come first. Returns a stable topological order (Kahn's algorithm, ties broken
127
+ * by path) of the local module dirs; cycle-safe (any leftover nodes are appended
128
+ * in sorted order). Pure. The remaining non-module (root) files are fixed after
129
+ * every local module they call — the caller dirs are in each entry's `callers`.
130
+ */
131
+ export declare function dependencyOrderedModuleDirs(graph: ModuleGraph): string[];
132
+ /** true when `file` sits under one of the graph's local module dirs — i.e. a
133
+ * concern there should be fixed at the module SOURCE (it propagates to callers). */
134
+ export declare function isInLocalModule(file: string, graph: ModuleGraph): {
135
+ dir: string;
136
+ callers: string[];
137
+ } | null;
138
+ export interface ModuleVariable {
139
+ name: string;
140
+ /** the `type` expression as written (`string`, `list(string)`, …), or null. */
141
+ type: string | null;
142
+ description: string | null;
143
+ /** true when the variable has NO `default` (the caller must set it). */
144
+ required: boolean;
145
+ }
146
+ export interface ModuleOutput {
147
+ name: string;
148
+ description: string | null;
149
+ }
150
+ export interface ModuleInterface {
151
+ variables: ModuleVariable[];
152
+ outputs: ModuleOutput[];
153
+ }
154
+ /**
155
+ * Parse a module's `variable`/`output` blocks into its public interface — the
156
+ * real names, types, descriptions, and which variables are REQUIRED (no
157
+ * `default`). Used so a generated `module` block (or a Terratest/example
158
+ * fixture) sets the module's ACTUAL variables instead of guessed ones. Pure;
159
+ * brace-matched so a nested `type = object({…})` or `validation {…}` doesn't
160
+ * confuse it.
161
+ */
162
+ export declare function parseModuleInterface(hcl: string): ModuleInterface;
163
+ /** read a module DIR's `*.tf` (non-recursive — a module is a single dir) and
164
+ * parse its interface. */
165
+ export declare function collectModuleInterface(cwd: string, moduleDir: string): ModuleInterface;
166
+ export declare const ListModulesParams: import("arktype/internal/variants/object.ts").ObjectType<object, {}>;
167
+ export declare function ListModulesTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<object, object>>;
168
+ export declare const TerraformModuleGraphParams: import("arktype/internal/variants/object.ts").ObjectType<object, {}>;
169
+ export declare function TerraformModuleGraphTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<object, object>>;
170
+ export declare const TerraformModuleInterfaceParams: import("arktype/internal/variants/object.ts").ObjectType<{
171
+ module_dir: string;
172
+ }, {}>;
173
+ export declare function TerraformModuleInterfaceTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
174
+ module_dir: string;
175
+ }, {
176
+ module_dir: string;
177
+ }>>;
178
+ /** best-effort existence check used by tests/tools — exported for reuse. */
179
+ export declare function moduleDirExists(cwd: string, dir: string): boolean;
@@ -0,0 +1,12 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ import type { ToolContext } from "#app/mcp/server";
3
+ export declare const SetOutputParams: import("arktype/internal/variants/object.ts").ObjectType<{
4
+ value: string;
5
+ }, {}>;
6
+ type JsonSchema = Record<string, unknown>;
7
+ export declare function SetOutputTool(ctx: ToolContext, outputSchema?: JsonSchema): import("fastmcp").Tool<any, StandardSchemaV1<any, any>> | import("fastmcp").Tool<any, StandardSchemaV1<{
8
+ value: string;
9
+ }, {
10
+ value: string;
11
+ }>>;
12
+ export {};
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Resolve an agent-supplied path against `cwd` and confine it to that workspace.
3
+ *
4
+ * Returns the absolute path when it stays inside `cwd`; throws otherwise. Blocks
5
+ * both `..` traversal and absolute paths that point outside `cwd` (including a
6
+ * different drive on Windows, where `relative` returns an absolute path).
7
+ *
8
+ * Terramend treats the agent as semi-trusted (attacker-controlled PR content can
9
+ * prompt-inject it), so any tool that reads or writes a file path the agent
10
+ * controls — read_findings, terraform_emit_sarif, terraform_module_interface —
11
+ * must confine that path to the workspace. Without it the agent has an arbitrary
12
+ * file read (findings) or write (SARIF) primitive on the runner.
13
+ */
14
+ export declare function resolveWithinCwd(cwd: string, userPath: string): string;
@@ -0,0 +1,48 @@
1
+ import type { ToolContext } from "#app/mcp/server";
2
+ /**
3
+ * Policy-as-code gate (§3.5 OPA/Conftest). An optional, opt-in tool that runs
4
+ * the operator's own Rego policies against the Terraform plan JSON (or the HCL),
5
+ * so an org's policy-as-code can gate a remediation/generation the same way the
6
+ * deterministic scanners do — pairs with §21 (prevent recurrence). Terramend is
7
+ * an ORCHESTRATOR here, never a redistributor: it invokes the external
8
+ * `conftest` (OPA) binary as a separate process and consumes its normalized
9
+ * output. Degrades green — when conftest isn't installed or no policy dir
10
+ * exists, it returns `ok: false` with a `code` and never fails the run.
11
+ *
12
+ * The parsing is pure + unit-tested; the tool just shells out and parses.
13
+ */
14
+ export interface PolicyFailure {
15
+ /** the policy rule message (the human-readable violation). */
16
+ msg: string;
17
+ /** the file conftest evaluated (repo-relative when conftest reported it). */
18
+ file: string;
19
+ /** "failure" (a deny) or "warning" (a warn). */
20
+ level: "failure" | "warning";
21
+ }
22
+ export interface PolicyResult {
23
+ /** true when there were zero failures (warnings don't fail the gate). */
24
+ passed: boolean;
25
+ failures: PolicyFailure[];
26
+ warnings: PolicyFailure[];
27
+ /** total tests conftest ran (across files), for a confidence signal. */
28
+ tested: number;
29
+ }
30
+ /**
31
+ * Parse `conftest test --output json` output into a normalized PolicyResult.
32
+ * Conftest emits an array of per-file result objects, each with `failures` /
33
+ * `warnings` / `successes`. Pure; tolerant of malformed/empty input (returns a
34
+ * clean pass). A non-empty `failures` anywhere means the gate did NOT pass;
35
+ * warnings are surfaced but don't fail it.
36
+ */
37
+ export declare function parseConftestOutput(stdout: string): PolicyResult;
38
+ export declare const PolicyCheckParams: import("arktype/internal/variants/object.ts").ObjectType<{
39
+ target?: string;
40
+ policy_dir?: string;
41
+ }, {}>;
42
+ export declare function PolicyCheckTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
43
+ target?: string;
44
+ policy_dir?: string;
45
+ }, {
46
+ target?: string;
47
+ policy_dir?: string;
48
+ }>>;
@@ -0,0 +1,49 @@
1
+ import type { ToolContext } from "#app/mcp/server";
2
+ export declare const PullRequest: import("arktype/internal/variants/object.ts").ObjectType<{
3
+ title: string;
4
+ body: string;
5
+ base?: string;
6
+ draft?: boolean;
7
+ }, {}>;
8
+ /**
9
+ * Pure base-branch picker. Precedence: an explicit `base_branch` declaration
10
+ * always wins; otherwise the repository's default branch (GitHub reports it —
11
+ * normally `main`, sometimes `master`); otherwise prefer `main`, then `master`;
12
+ * final fallback `main`. Split out from git/ctx so it's exhaustively testable.
13
+ */
14
+ export declare function pickBaseBranch(opts: {
15
+ declared?: string | undefined;
16
+ defaultBranch?: string | undefined;
17
+ mainExists: boolean;
18
+ masterExists: boolean;
19
+ }): string;
20
+ /**
21
+ * Deterministically resolve the branch a PR targets, so the base is never left
22
+ * to the agent's guess. Resolves to the repository's default branch (`main`, or
23
+ * `master`), overridable by the `base_branch` input. Git is only probed for
24
+ * main/master in the last-resort case where neither an explicit declaration nor
25
+ * a GitHub default branch is available (essentially never).
26
+ */
27
+ export declare function resolveBaseBranch(ctx: ToolContext): string;
28
+ export declare const UpdatePullRequestBody: import("arktype/internal/variants/object.ts").ObjectType<{
29
+ pull_number: number;
30
+ body: string;
31
+ }, {}>;
32
+ export declare function UpdatePullRequestBodyTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
33
+ pull_number: number;
34
+ body: string;
35
+ }, {
36
+ pull_number: number;
37
+ body: string;
38
+ }>>;
39
+ export declare function CreatePullRequestTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
40
+ title: string;
41
+ body: string;
42
+ base?: string;
43
+ draft?: boolean;
44
+ }, {
45
+ title: string;
46
+ body: string;
47
+ base?: string;
48
+ draft?: boolean;
49
+ }>>;
@@ -0,0 +1,9 @@
1
+ import type { ToolContext } from "#app/mcp/server";
2
+ export declare const PullRequestInfo: import("arktype/internal/variants/object.ts").ObjectType<{
3
+ pull_number: number;
4
+ }, {}>;
5
+ export declare function PullRequestInfoTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
6
+ pull_number: number;
7
+ }, {
8
+ pull_number: number;
9
+ }>>;
@@ -0,0 +1,50 @@
1
+ import type { LocalToolContext } from "#app/mcp/localContext";
2
+ /**
3
+ * Provider-schema awareness (§4.15 next). A "correct" fix for the wrong provider
4
+ * major just breaks `plan` — argument names and nested blocks differ across
5
+ * majors. After `terraform init`, the installed provider's exact schema is
6
+ * available via `terraform providers schema -json`; this parses it so a fix can
7
+ * be checked against the REAL attributes/blocks for the version in use, not the
8
+ * model's memory of the provider.
9
+ *
10
+ * The schema fetch is cached per `cwd` for the process (schemas don't change
11
+ * within a run) and degrades green (returns `ok: false`) when terraform isn't
12
+ * installed or the dir isn't initialised.
13
+ */
14
+ export interface ResourceSchema {
15
+ attributes: Set<string>;
16
+ blocks: Set<string>;
17
+ }
18
+ /** resourceType → its attribute + nested-block names, across all providers. */
19
+ export type ProvidersSchema = Map<string, ResourceSchema>;
20
+ /**
21
+ * Parse `terraform providers schema -json` into a resource-type → {attributes,
22
+ * blocks} map. Merges every provider's `resource_schemas`. Pure; tolerant of a
23
+ * missing/empty schema.
24
+ */
25
+ export declare function parseProvidersSchema(json: string): ProvidersSchema;
26
+ /**
27
+ * Given a resource type and the argument names a fix introduces, return the ones
28
+ * that are NOT valid attributes or nested blocks for that resource in the
29
+ * installed provider — i.e. names that would break `plan`. Returns `null` for
30
+ * `unknownResourceType` when the schema has no entry for the type (can't judge).
31
+ */
32
+ export declare function unknownArgsForResource(schema: ProvidersSchema, resourceType: string, args: string[]): {
33
+ unknownResourceType: boolean;
34
+ unknown: string[];
35
+ };
36
+ /** fetch + cache the providers schema for `cwd`. null when unavailable. */
37
+ export declare function loadProvidersSchema(cwd: string): ProvidersSchema | null;
38
+ /** test-only: clear the per-process schema cache. */
39
+ export declare function _clearProviderSchemaCache(): void;
40
+ export declare const TerraformProviderSchemaParams: import("arktype/internal/variants/object.ts").ObjectType<{
41
+ resource_type: string;
42
+ args?: string[];
43
+ }, {}>;
44
+ export declare function TerraformProviderSchemaTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
45
+ resource_type: string;
46
+ args?: string[];
47
+ }, {
48
+ resource_type: string;
49
+ args?: string[];
50
+ }>>;