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.
- package/LICENSE +661 -0
- package/README.md +244 -0
- package/dist/agents/claude.d.ts +113 -0
- package/dist/agents/claudePretoolGate.d.ts +137 -0
- package/dist/agents/dispatchMetrics.d.ts +77 -0
- package/dist/agents/gateServer.d.ts +7 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/nativeFsDenies.d.ts +46 -0
- package/dist/agents/opencode.d.ts +284 -0
- package/dist/agents/opencodePlugin.d.ts +96 -0
- package/dist/agents/opencodeShared.d.ts +40 -0
- package/dist/agents/postRun.d.ts +126 -0
- package/dist/agents/reviewer.d.ts +41 -0
- package/dist/agents/sessionLabeler.d.ts +97 -0
- package/dist/agents/shared.d.ts +246 -0
- package/dist/agents/subagentModels.d.ts +19 -0
- package/dist/agents/tokenQuota.d.ts +118 -0
- package/dist/agents/writeGateSource.d.ts +22 -0
- package/dist/agents/writePolicy.d.ts +79 -0
- package/dist/brand.d.ts +67 -0
- package/dist/cli.mjs +247846 -0
- package/dist/external.d.ts +227 -0
- package/dist/i18n/scaffolding.d.ts +59 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +247061 -0
- package/dist/internal/index.d.ts +18 -0
- package/dist/internal.js +2398 -0
- package/dist/lifecycle.d.ts +2 -0
- package/dist/main.d.ts +8 -0
- package/dist/mcp/arkConfig.d.ts +1 -0
- package/dist/mcp/assess.d.ts +157 -0
- package/dist/mcp/capabilityContext.d.ts +71 -0
- package/dist/mcp/changeSummary.d.ts +52 -0
- package/dist/mcp/checkSuite.d.ts +27 -0
- package/dist/mcp/checkout.d.ts +92 -0
- package/dist/mcp/comment.d.ts +127 -0
- package/dist/mcp/commitInfo.d.ts +11 -0
- package/dist/mcp/crosswalk.d.ts +178 -0
- package/dist/mcp/crosswalkDigest.d.ts +1 -0
- package/dist/mcp/cyberEssentials.d.ts +24 -0
- package/dist/mcp/dashboard.d.ts +125 -0
- package/dist/mcp/dependencies.d.ts +12 -0
- package/dist/mcp/frameworks.d.ts +74 -0
- package/dist/mcp/geminiSanitizer.d.ts +28 -0
- package/dist/mcp/git.d.ts +60 -0
- package/dist/mcp/guardrails.d.ts +222 -0
- package/dist/mcp/issue.d.ts +20 -0
- package/dist/mcp/issueComments.d.ts +11 -0
- package/dist/mcp/issueEvents.d.ts +11 -0
- package/dist/mcp/issueInfo.d.ts +11 -0
- package/dist/mcp/labels.d.ts +14 -0
- package/dist/mcp/localContext.d.ts +26 -0
- package/dist/mcp/moduleExtraction.d.ts +79 -0
- package/dist/mcp/moduleTests.d.ts +106 -0
- package/dist/mcp/modules.d.ts +198 -0
- package/dist/mcp/output.d.ts +16 -0
- package/dist/mcp/pathSafety.d.ts +14 -0
- package/dist/mcp/policy.d.ts +50 -0
- package/dist/mcp/pr.d.ts +64 -0
- package/dist/mcp/prInfo.d.ts +11 -0
- package/dist/mcp/providerSchema.d.ts +52 -0
- package/dist/mcp/review.d.ts +212 -0
- package/dist/mcp/reviewComments.d.ts +245 -0
- package/dist/mcp/roots.d.ts +60 -0
- package/dist/mcp/scope.d.ts +26 -0
- package/dist/mcp/selectMode.d.ts +20 -0
- package/dist/mcp/server.d.ts +61 -0
- package/dist/mcp/shared.d.ts +62 -0
- package/dist/mcp/shell.d.ts +58 -0
- package/dist/mcp/staleFix.d.ts +138 -0
- package/dist/mcp/terraform/azurePrices.d.ts +8 -0
- package/dist/mcp/terraform/baseline.d.ts +57 -0
- package/dist/mcp/terraform/concernResult.d.ts +38 -0
- package/dist/mcp/terraform/cost.d.ts +55 -0
- package/dist/mcp/terraform/cspm.d.ts +80 -0
- package/dist/mcp/terraform/currency.d.ts +110 -0
- package/dist/mcp/terraform/decisions.d.ts +178 -0
- package/dist/mcp/terraform/eidas.d.ts +100 -0
- package/dist/mcp/terraform/evidence.d.ts +343 -0
- package/dist/mcp/terraform/findings.d.ts +76 -0
- package/dist/mcp/terraform/fixMemory.d.ts +81 -0
- package/dist/mcp/terraform/governance.d.ts +56 -0
- package/dist/mcp/terraform/hcl.d.ts +115 -0
- package/dist/mcp/terraform/iacLanguages.d.ts +120 -0
- package/dist/mcp/terraform/idleFloor.d.ts +78 -0
- package/dist/mcp/terraform/keyless.d.ts +68 -0
- package/dist/mcp/terraform/moduleDocs.d.ts +56 -0
- package/dist/mcp/terraform/nativeRules.d.ts +38 -0
- package/dist/mcp/terraform/nativeScan.d.ts +11 -0
- package/dist/mcp/terraform/noiseProfile.d.ts +100 -0
- package/dist/mcp/terraform/normalization.d.ts +52 -0
- package/dist/mcp/terraform/oscal.d.ts +103 -0
- package/dist/mcp/terraform/packs/azurerm-3-4.d.ts +2 -0
- package/dist/mcp/terraform/packs/cloudflare-4-5.d.ts +2 -0
- package/dist/mcp/terraform/paths.d.ts +28 -0
- package/dist/mcp/terraform/plan.d.ts +157 -0
- package/dist/mcp/terraform/planDrift.d.ts +199 -0
- package/dist/mcp/terraform/policyAuthor.d.ts +191 -0
- package/dist/mcp/terraform/prowlerOcsf.d.ts +136 -0
- package/dist/mcp/terraform/refactor.d.ts +183 -0
- package/dist/mcp/terraform/registry.d.ts +108 -0
- package/dist/mcp/terraform/risk.d.ts +41 -0
- package/dist/mcp/terraform/scanSession.d.ts +116 -0
- package/dist/mcp/terraform/scannerCache.d.ts +15 -0
- package/dist/mcp/terraform/scannerEgress.d.ts +72 -0
- package/dist/mcp/terraform/scannerJson.d.ts +13 -0
- package/dist/mcp/terraform/scanners.d.ts +205 -0
- package/dist/mcp/terraform/signing.d.ts +61 -0
- package/dist/mcp/terraform/stateLocking.d.ts +18 -0
- package/dist/mcp/terraform/subprocess.d.ts +43 -0
- package/dist/mcp/terraform/suppressions.d.ts +90 -0
- package/dist/mcp/terraform/taxonomy.d.ts +39 -0
- package/dist/mcp/terraform/tfquery.d.ts +47 -0
- package/dist/mcp/terraform/toolchainIntegrity.d.ts +82 -0
- package/dist/mcp/terraform/tools/authorPolicy.d.ts +59 -0
- package/dist/mcp/terraform/tools/detectPlanDrift.d.ts +20 -0
- package/dist/mcp/terraform/tools/emitCost.d.ts +11 -0
- package/dist/mcp/terraform/tools/emitSarif.d.ts +14 -0
- package/dist/mcp/terraform/tools/fixMemory.d.ts +19 -0
- package/dist/mcp/terraform/tools/infracostDiff.d.ts +22 -0
- package/dist/mcp/terraform/tools/ingestExternalFindings.d.ts +21 -0
- package/dist/mcp/terraform/tools/moduleLookup.d.ts +14 -0
- package/dist/mcp/terraform/tools/moduleSearch.d.ts +23 -0
- package/dist/mcp/terraform/tools/plan.d.ts +59 -0
- package/dist/mcp/terraform/tools/providerUpgrade.d.ts +55 -0
- package/dist/mcp/terraform/tools/readFindings.d.ts +17 -0
- package/dist/mcp/terraform/tools/scan.d.ts +114 -0
- package/dist/mcp/terraform/tools/validate.d.ts +31 -0
- package/dist/mcp/terraform/tools/verifyRemediation.d.ts +31 -0
- package/dist/mcp/terraform/tools/versionCurrency.d.ts +5 -0
- package/dist/mcp/terraform/tools.d.ts +16 -0
- package/dist/mcp/terraform/transformPacks.d.ts +267 -0
- package/dist/mcp/terraform/types.d.ts +226 -0
- package/dist/mcp/terraform/verification.d.ts +81 -0
- package/dist/mcp/terraform/vex.d.ts +115 -0
- package/dist/mcp/terraform/writeOnly.d.ts +67 -0
- package/dist/mcp/terraform.d.ts +51 -0
- package/dist/mcp/terratest.d.ts +85 -0
- package/dist/mcp/untrustedContent.d.ts +76 -0
- package/dist/mcp/upload.d.ts +8 -0
- package/dist/models.d.ts +181 -0
- package/dist/modes/address-reviews.d.ts +2 -0
- package/dist/modes/assess.d.ts +2 -0
- package/dist/modes/build.d.ts +2 -0
- package/dist/modes/compliance-audit.d.ts +2 -0
- package/dist/modes/cost-optimization.d.ts +2 -0
- package/dist/modes/drift-detect.d.ts +2 -0
- package/dist/modes/fix.d.ts +2 -0
- package/dist/modes/incremental-review.d.ts +2 -0
- package/dist/modes/index.d.ts +24 -0
- package/dist/modes/modernize-deprecated.d.ts +2 -0
- package/dist/modes/plan.d.ts +2 -0
- package/dist/modes/policy-gate.d.ts +2 -0
- package/dist/modes/prFormats.d.ts +3 -0
- package/dist/modes/refactor.d.ts +2 -0
- package/dist/modes/refresh-remediation.d.ts +2 -0
- package/dist/modes/remediate-and-refactor.d.ts +2 -0
- package/dist/modes/remediate.d.ts +2 -0
- package/dist/modes/resolve-conflicts.d.ts +2 -0
- package/dist/modes/review.d.ts +2 -0
- package/dist/modes/summarize-pr.d.ts +2 -0
- package/dist/modes/task.d.ts +2 -0
- package/dist/modes/terraform-code-review.d.ts +2 -0
- package/dist/modes/types.d.ts +9 -0
- package/dist/modes/update-dependencies.d.ts +2 -0
- package/dist/prep/index.d.ts +7 -0
- package/dist/prep/installNodeDependencies.d.ts +2 -0
- package/dist/prep/installPythonDependencies.d.ts +2 -0
- package/dist/prep/types.d.ts +31 -0
- package/dist/reviewQuality.d.ts +107 -0
- package/dist/skills/terraform-best-practices/SKILL.md +379 -0
- package/dist/toolState.d.ts +123 -0
- package/dist/utils/activity.d.ts +40 -0
- package/dist/utils/agent.d.ts +47 -0
- package/dist/utils/agentHangReport.d.ts +38 -0
- package/dist/utils/annotations.d.ts +17 -0
- package/dist/utils/apiFetch.d.ts +11 -0
- package/dist/utils/apiKeys.d.ts +48 -0
- package/dist/utils/apiUrl.d.ts +28 -0
- package/dist/utils/assets.d.ts +8 -0
- package/dist/utils/baseRefConfig.d.ts +121 -0
- package/dist/utils/billingErrors.d.ts +85 -0
- package/dist/utils/body.d.ts +34 -0
- package/dist/utils/buildInfraweaverFooter.d.ts +29 -0
- package/dist/utils/byokFallback.d.ts +85 -0
- package/dist/utils/changeImpact.d.ts +101 -0
- package/dist/utils/claudeSubscription.d.ts +30 -0
- package/dist/utils/cli.d.ts +10 -0
- package/dist/utils/cloudClient.d.ts +33 -0
- package/dist/utils/cloudFetchCore.d.ts +42 -0
- package/dist/utils/cloudReport.d.ts +114 -0
- package/dist/utils/codexHome.d.ts +29 -0
- package/dist/utils/codexOAuth.d.ts +60 -0
- package/dist/utils/diffCoverage.d.ts +63 -0
- package/dist/utils/env.d.ts +46 -0
- package/dist/utils/errorReport.d.ts +17 -0
- package/dist/utils/exitHandler.d.ts +8 -0
- package/dist/utils/fixDoubleEscapedString.d.ts +1 -0
- package/dist/utils/gitAuth.d.ts +84 -0
- package/dist/utils/gitAuthServer.d.ts +24 -0
- package/dist/utils/github.d.ts +104 -0
- package/dist/utils/globals.d.ts +3 -0
- package/dist/utils/infraweaverConfig.d.ts +56 -0
- package/dist/utils/install.d.ts +37 -0
- package/dist/utils/instructions.d.ts +48 -0
- package/dist/utils/keylessOidc.d.ts +28 -0
- package/dist/utils/leapingComment.d.ts +11 -0
- package/dist/utils/learnings.d.ts +62 -0
- package/dist/utils/learningsTruncate.d.ts +25 -0
- package/dist/utils/lifecycle.d.ts +57 -0
- package/dist/utils/log.d.ts +111 -0
- package/dist/utils/modelResolver.d.ts +63 -0
- package/dist/utils/moduleFetch.d.ts +39 -0
- package/dist/utils/normalizeEnv.d.ts +30 -0
- package/dist/utils/openCodeModels.d.ts +11 -0
- package/dist/utils/openaiCompatible.d.ts +26 -0
- package/dist/utils/opentofuMcp.d.ts +50 -0
- package/dist/utils/overrides.d.ts +40 -0
- package/dist/utils/packageManager.d.ts +49 -0
- package/dist/utils/patchWorkflowRunFields.d.ts +29 -0
- package/dist/utils/payload.d.ts +249 -0
- package/dist/utils/prSummary.d.ts +61 -0
- package/dist/utils/presets.d.ts +36 -0
- package/dist/utils/progressComment.d.ts +146 -0
- package/dist/utils/providerErrors.d.ts +31 -0
- package/dist/utils/proxyModel.d.ts +76 -0
- package/dist/utils/rangeDiff.d.ts +51 -0
- package/dist/utils/redact.d.ts +33 -0
- package/dist/utils/registryAuth.d.ts +52 -0
- package/dist/utils/remediationCommand.d.ts +58 -0
- package/dist/utils/retry.d.ts +38 -0
- package/dist/utils/reviewCleanup.d.ts +14 -0
- package/dist/utils/run.d.ts +9 -0
- package/dist/utils/runContext.d.ts +112 -0
- package/dist/utils/runContextData.d.ts +42 -0
- package/dist/utils/runErrorRenderer.d.ts +64 -0
- package/dist/utils/runLifecycle.d.ts +89 -0
- package/dist/utils/runStartupLog.d.ts +15 -0
- package/dist/utils/secrets.d.ts +34 -0
- package/dist/utils/setup.d.ts +90 -0
- package/dist/utils/shell.d.ts +44 -0
- package/dist/utils/skills.d.ts +10 -0
- package/dist/utils/subprocess.d.ts +81 -0
- package/dist/utils/terraformMcp.d.ts +46 -0
- package/dist/utils/time.d.ts +15 -0
- package/dist/utils/timer.d.ts +23 -0
- package/dist/utils/todoTracking.d.ts +16 -0
- package/dist/utils/token.d.ts +52 -0
- package/dist/utils/toolLicensing.d.ts +56 -0
- package/dist/utils/toolSelection.d.ts +73 -0
- package/dist/utils/toon.d.ts +16 -0
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/versioning.d.ts +7 -0
- package/dist/utils/vertex.d.ts +16 -0
- package/dist/utils/workflow.d.ts +13 -0
- package/package.json +132 -0
- package/src/agents/claude.ts +1588 -0
- package/src/agents/claudePretoolGate.ts +286 -0
- package/src/agents/dispatchMetrics.ts +162 -0
- package/src/agents/gateServer.ts +178 -0
- package/src/agents/index.ts +10 -0
- package/src/agents/nativeFsDenies.ts +164 -0
- package/src/agents/opencode.ts +1600 -0
- package/src/agents/opencodePlugin.ts +304 -0
- package/src/agents/opencodeShared.ts +134 -0
- package/src/agents/postRun.ts +615 -0
- package/src/agents/reviewer.ts +134 -0
- package/src/agents/sessionLabeler.ts +185 -0
- package/src/agents/shared.ts +377 -0
- package/src/agents/subagentModels.ts +40 -0
- package/src/agents/tokenQuota.ts +203 -0
- package/src/agents/writeGateSource.ts +148 -0
- package/src/agents/writePolicy.ts +132 -0
- package/src/brand.ts +84 -0
- package/src/cli.ts +117 -0
- package/src/commands/gha.ts +188 -0
- package/src/commands/mcp.ts +126 -0
- package/src/commands/verifyEvidence.ts +100 -0
- package/src/entry.ts +7 -0
- package/src/entryPost.ts +109 -0
- package/src/external.ts +308 -0
- package/src/i18n/scaffolding.ts +191 -0
- package/src/index.ts +7 -0
- package/src/internal/index.ts +74 -0
- package/src/lifecycle.ts +2 -0
- package/src/main.ts +815 -0
- package/src/mcp/__fixtures__/infraweaver-scratch-pr-49-review-3485940013.json +110 -0
- package/src/mcp/__fixtures__/infraweaver-scratch-pr-64-review-3531000326.json +14 -0
- package/src/mcp/__fixtures__/infraweaver-test-repo-pr-1.diff.json +67 -0
- package/src/mcp/__snapshots__/checkout.test.ts.snap +109 -0
- package/src/mcp/__snapshots__/reviewComments.test.ts.snap +71 -0
- package/src/mcp/arkConfig.ts +7 -0
- package/src/mcp/assess.ts +723 -0
- package/src/mcp/capabilityContext.ts +80 -0
- package/src/mcp/changeSummary.ts +145 -0
- package/src/mcp/checkSuite.ts +261 -0
- package/src/mcp/checkout.ts +1015 -0
- package/src/mcp/comment.ts +683 -0
- package/src/mcp/commitInfo.ts +57 -0
- package/src/mcp/crosswalk.ts +1253 -0
- package/src/mcp/crosswalkDigest.ts +5 -0
- package/src/mcp/cyberEssentials.ts +60 -0
- package/src/mcp/dashboard.ts +232 -0
- package/src/mcp/dependencies.ts +190 -0
- package/src/mcp/frameworks.ts +236 -0
- package/src/mcp/geminiSanitizer.ts +212 -0
- package/src/mcp/git.ts +1116 -0
- package/src/mcp/guardrails.ts +771 -0
- package/src/mcp/issue.ts +74 -0
- package/src/mcp/issueComments.ts +48 -0
- package/src/mcp/issueEvents.ts +100 -0
- package/src/mcp/issueInfo.ts +72 -0
- package/src/mcp/labels.ts +35 -0
- package/src/mcp/localContext.ts +65 -0
- package/src/mcp/localServer.ts +217 -0
- package/src/mcp/moduleExtraction.ts +368 -0
- package/src/mcp/moduleTests.ts +421 -0
- package/src/mcp/modules.ts +752 -0
- package/src/mcp/output.ts +71 -0
- package/src/mcp/pathSafety.ts +28 -0
- package/src/mcp/policy.ts +226 -0
- package/src/mcp/pr.ts +238 -0
- package/src/mcp/prInfo.ts +91 -0
- package/src/mcp/providerSchema.ts +175 -0
- package/src/mcp/review.ts +1081 -0
- package/src/mcp/reviewComments.ts +1137 -0
- package/src/mcp/roots.ts +217 -0
- package/src/mcp/scope.ts +82 -0
- package/src/mcp/selectMode.ts +207 -0
- package/src/mcp/server.ts +498 -0
- package/src/mcp/shared.ts +120 -0
- package/src/mcp/shell.ts +631 -0
- package/src/mcp/staleFix.ts +557 -0
- package/src/mcp/terraform/__snapshots__/moduleDocs.test.ts.snap +40 -0
- package/src/mcp/terraform/azurePrices.ts +38 -0
- package/src/mcp/terraform/baseline.ts +172 -0
- package/src/mcp/terraform/concernResult.ts +111 -0
- package/src/mcp/terraform/cost.ts +175 -0
- package/src/mcp/terraform/cspm.ts +326 -0
- package/src/mcp/terraform/currency.ts +354 -0
- package/src/mcp/terraform/decisions.ts +590 -0
- package/src/mcp/terraform/eidas.ts +134 -0
- package/src/mcp/terraform/evidence.ts +771 -0
- package/src/mcp/terraform/findings.ts +383 -0
- package/src/mcp/terraform/fixMemory.ts +253 -0
- package/src/mcp/terraform/governance.ts +231 -0
- package/src/mcp/terraform/hcl.ts +273 -0
- package/src/mcp/terraform/iacLanguages.ts +431 -0
- package/src/mcp/terraform/idleFloor.ts +304 -0
- package/src/mcp/terraform/keyless.ts +123 -0
- package/src/mcp/terraform/moduleDocs.ts +303 -0
- package/src/mcp/terraform/nativeRules.ts +152 -0
- package/src/mcp/terraform/nativeScan.ts +67 -0
- package/src/mcp/terraform/noiseProfile.ts +183 -0
- package/src/mcp/terraform/normalization.ts +265 -0
- package/src/mcp/terraform/oscal.ts +283 -0
- package/src/mcp/terraform/packs/azurerm-3-4.ts +382 -0
- package/src/mcp/terraform/packs/cloudflare-4-5.ts +114 -0
- package/src/mcp/terraform/paths.ts +59 -0
- package/src/mcp/terraform/plan.ts +377 -0
- package/src/mcp/terraform/planDrift.ts +520 -0
- package/src/mcp/terraform/policyAuthor.ts +886 -0
- package/src/mcp/terraform/prowlerOcsf.ts +380 -0
- package/src/mcp/terraform/refactor.ts +879 -0
- package/src/mcp/terraform/registry.ts +317 -0
- package/src/mcp/terraform/risk.ts +99 -0
- package/src/mcp/terraform/scanSession.ts +242 -0
- package/src/mcp/terraform/scannerCache.ts +86 -0
- package/src/mcp/terraform/scannerEgress.ts +141 -0
- package/src/mcp/terraform/scannerJson.ts +22 -0
- package/src/mcp/terraform/scanners.ts +1134 -0
- package/src/mcp/terraform/signing.ts +151 -0
- package/src/mcp/terraform/stateLocking.ts +106 -0
- package/src/mcp/terraform/subprocess.ts +102 -0
- package/src/mcp/terraform/suppressions.ts +551 -0
- package/src/mcp/terraform/taxonomy.ts +0 -0
- package/src/mcp/terraform/tfquery.ts +159 -0
- package/src/mcp/terraform/toolchainIntegrity.ts +151 -0
- package/src/mcp/terraform/tools/authorPolicy.ts +185 -0
- package/src/mcp/terraform/tools/detectPlanDrift.ts +279 -0
- package/src/mcp/terraform/tools/emitCost.ts +130 -0
- package/src/mcp/terraform/tools/emitSarif.ts +108 -0
- package/src/mcp/terraform/tools/fixMemory.ts +82 -0
- package/src/mcp/terraform/tools/infracostDiff.ts +110 -0
- package/src/mcp/terraform/tools/ingestExternalFindings.ts +259 -0
- package/src/mcp/terraform/tools/moduleLookup.ts +86 -0
- package/src/mcp/terraform/tools/moduleSearch.ts +46 -0
- package/src/mcp/terraform/tools/plan.ts +384 -0
- package/src/mcp/terraform/tools/providerUpgrade.ts +217 -0
- package/src/mcp/terraform/tools/readFindings.ts +138 -0
- package/src/mcp/terraform/tools/scan.ts +303 -0
- package/src/mcp/terraform/tools/validate.ts +160 -0
- package/src/mcp/terraform/tools/verifyRemediation.ts +190 -0
- package/src/mcp/terraform/tools/versionCurrency.ts +64 -0
- package/src/mcp/terraform/tools.ts +62 -0
- package/src/mcp/terraform/transformPacks.ts +594 -0
- package/src/mcp/terraform/types.ts +382 -0
- package/src/mcp/terraform/verification.ts +150 -0
- package/src/mcp/terraform/vex.ts +367 -0
- package/src/mcp/terraform/writeOnly.ts +252 -0
- package/src/mcp/terraform.ts +52 -0
- package/src/mcp/terratest.ts +215 -0
- package/src/mcp/untrustedContent.ts +126 -0
- package/src/mcp/upload.ts +123 -0
- package/src/models.ts +753 -0
- package/src/modes/address-reviews.ts +35 -0
- package/src/modes/assess.ts +27 -0
- package/src/modes/build.ts +86 -0
- package/src/modes/compliance-audit.ts +25 -0
- package/src/modes/cost-optimization.ts +36 -0
- package/src/modes/drift-detect.ts +31 -0
- package/src/modes/fix.ts +29 -0
- package/src/modes/incremental-review.ts +103 -0
- package/src/modes/index.ts +94 -0
- package/src/modes/modernize-deprecated.ts +36 -0
- package/src/modes/plan.ts +21 -0
- package/src/modes/policy-gate.ts +27 -0
- package/src/modes/prFormats.ts +325 -0
- package/src/modes/refactor.ts +74 -0
- package/src/modes/refresh-remediation.ts +40 -0
- package/src/modes/remediate-and-refactor.ts +42 -0
- package/src/modes/remediate.ts +78 -0
- package/src/modes/resolve-conflicts.ts +32 -0
- package/src/modes/review.ts +135 -0
- package/src/modes/summarize-pr.ts +42 -0
- package/src/modes/task.ts +26 -0
- package/src/modes/terraform-code-review.ts +68 -0
- package/src/modes/types.ts +17 -0
- package/src/modes/update-dependencies.ts +44 -0
- package/src/prep/index.ts +96 -0
- package/src/prep/installNodeDependencies.ts +251 -0
- package/src/prep/installPythonDependencies.ts +235 -0
- package/src/prep/types.ts +38 -0
- package/src/reviewQuality.ts +237 -0
- package/src/runCli.ts +335 -0
- package/src/skills/terraform-best-practices/SKILL.md +379 -0
- package/src/toolState.ts +241 -0
- package/src/utils/activity.ts +210 -0
- package/src/utils/agent.ts +245 -0
- package/src/utils/agentHangReport.ts +180 -0
- package/src/utils/annotations.ts +56 -0
- package/src/utils/apiFetch.ts +19 -0
- package/src/utils/apiKeys.ts +305 -0
- package/src/utils/apiUrl.ts +42 -0
- package/src/utils/assets.ts +123 -0
- package/src/utils/baseRefConfig.ts +254 -0
- package/src/utils/billingErrors.ts +210 -0
- package/src/utils/body.ts +168 -0
- package/src/utils/buildInfraweaverFooter.ts +104 -0
- package/src/utils/byokFallback.ts +137 -0
- package/src/utils/changeImpact.ts +330 -0
- package/src/utils/claudeSubscription.ts +93 -0
- package/src/utils/cli.ts +36 -0
- package/src/utils/cloudClient.ts +57 -0
- package/src/utils/cloudFetchCore.ts +139 -0
- package/src/utils/cloudReport.ts +316 -0
- package/src/utils/codexHome.ts +204 -0
- package/src/utils/codexOAuth.ts +154 -0
- package/src/utils/codexRefreshDetect.ts +36 -0
- package/src/utils/diffCoverage.ts +404 -0
- package/src/utils/env.ts +84 -0
- package/src/utils/errorReport.ts +94 -0
- package/src/utils/exitHandler.ts +35 -0
- package/src/utils/fixDoubleEscapedString.ts +9 -0
- package/src/utils/ghaCore.ts +13 -0
- package/src/utils/gitAuth.ts +268 -0
- package/src/utils/gitAuthServer.ts +186 -0
- package/src/utils/github.ts +676 -0
- package/src/utils/globals.ts +9 -0
- package/src/utils/humanEditCapture.ts +198 -0
- package/src/utils/infraweaverConfig.ts +202 -0
- package/src/utils/install.ts +279 -0
- package/src/utils/instructions.ts +640 -0
- package/src/utils/keylessOidc.ts +47 -0
- package/src/utils/leapingComment.ts +20 -0
- package/src/utils/learnings.ts +145 -0
- package/src/utils/learningsTruncate.ts +42 -0
- package/src/utils/lifecycle.ts +198 -0
- package/src/utils/log.ts +452 -0
- package/src/utils/modelResolver.ts +105 -0
- package/src/utils/moduleFetch.ts +138 -0
- package/src/utils/normalizeEnv.ts +106 -0
- package/src/utils/openCodeModels.ts +86 -0
- package/src/utils/openaiCompatible.ts +52 -0
- package/src/utils/opentofuMcp.ts +61 -0
- package/src/utils/overrides.ts +100 -0
- package/src/utils/packageManager.ts +257 -0
- package/src/utils/patchWorkflowRunFields.ts +173 -0
- package/src/utils/payload.ts +1206 -0
- package/src/utils/prSummary.ts +148 -0
- package/src/utils/presets.ts +105 -0
- package/src/utils/progressComment.ts +266 -0
- package/src/utils/providerErrors.ts +189 -0
- package/src/utils/proxyModel.ts +239 -0
- package/src/utils/rangeDiff.ts +182 -0
- package/src/utils/redact.ts +86 -0
- package/src/utils/registryAuth.ts +115 -0
- package/src/utils/remediationCommand.ts +144 -0
- package/src/utils/retry.ts +180 -0
- package/src/utils/reviewCleanup.ts +116 -0
- package/src/utils/run.ts +100 -0
- package/src/utils/runContext.ts +276 -0
- package/src/utils/runContextData.ts +121 -0
- package/src/utils/runErrorRenderer.ts +282 -0
- package/src/utils/runFixture.ts +91 -0
- package/src/utils/runLifecycle.ts +360 -0
- package/src/utils/runStartupLog.ts +67 -0
- package/src/utils/secrets.ts +208 -0
- package/src/utils/setup.ts +368 -0
- package/src/utils/shell.ts +132 -0
- package/src/utils/skills.ts +67 -0
- package/src/utils/subprocess.ts +474 -0
- package/src/utils/terraformMcp.ts +99 -0
- package/src/utils/time.ts +59 -0
- package/src/utils/timer.ts +72 -0
- package/src/utils/todoTracking.ts +168 -0
- package/src/utils/token.ts +294 -0
- package/src/utils/toolLicensing.ts +152 -0
- package/src/utils/toolSelection.ts +239 -0
- package/src/utils/toon.ts +76 -0
- package/src/utils/version.ts +10 -0
- package/src/utils/versioning.ts +44 -0
- package/src/utils/vertex.ts +94 -0
- package/src/utils/workflow.ts +25 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import type { Octokit } from "@octokit/rest";
|
|
2
|
+
import type { GitHubToolContext } from "#app/mcp/capabilityContext";
|
|
3
|
+
/**
|
|
4
|
+
* A GraphQL review-thread fetch worth retrying: an HTTP 5xx / network blip
|
|
5
|
+
* ({@link isTransientServerError}), OR GitHub's transient "Something went wrong
|
|
6
|
+
* while executing your query" — which surfaces both as an HTTP-200
|
|
7
|
+
* `GraphqlResponseError` (message only) and as an HTTP-502 `RequestError`. A
|
|
8
|
+
* blip here would otherwise drop a whole review delivery. Deterministic GraphQL
|
|
9
|
+
* validation errors (bad query, unknown field) don't match and fail fast. #997.
|
|
10
|
+
*/
|
|
11
|
+
export declare function isTransientGraphqlError(error: unknown): boolean;
|
|
12
|
+
export declare const REVIEW_THREADS_QUERY = "\nquery ($owner: String!, $name: String!, $prNumber: Int!) {\n repository(owner: $owner, name: $name) {\n pullRequest(number: $prNumber) {\n reviewThreads(first: 100) {\n nodes {\n id\n path\n line\n startLine\n diffSide\n isResolved\n isOutdated\n comments(first: 50) {\n nodes {\n fullDatabaseId\n body\n bodyHTML\n createdAt\n diffHunk\n line\n startLine\n originalLine\n originalStartLine\n author { login }\n pullRequestReview {\n databaseId\n author { login }\n }\n reactionGroups {\n content\n reactors(first: 10) {\n totalCount\n nodes {\n ... on Actor { login }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}\n";
|
|
13
|
+
/**
|
|
14
|
+
* Lightweight PAGINATED query for the approval gate. It fetches only each
|
|
15
|
+
* thread's resolved state and its ROOT author (oldest comment, hence
|
|
16
|
+
* `comments(first: 1)`) — everything {@link countOutstandingInfraweaverThreads}
|
|
17
|
+
* needs and nothing more. Distinct from {@link REVIEW_THREADS_QUERY} (a single
|
|
18
|
+
* `first: 100` page with full comment bodies) precisely because the invariant
|
|
19
|
+
* must hold on PRs with more than 100 threads: a silent first-page cap would let
|
|
20
|
+
* a finding beyond thread #100 slip an approval through.
|
|
21
|
+
*/
|
|
22
|
+
export declare const OUTSTANDING_THREADS_QUERY = "\nquery ($owner: String!, $name: String!, $prNumber: Int!, $cursor: String) {\n repository(owner: $owner, name: $name) {\n pullRequest(number: $prNumber) {\n reviewThreads(first: 100, after: $cursor) {\n pageInfo { hasNextPage endCursor }\n nodes {\n isResolved\n comments(first: 1) { nodes { author { login } } }\n }\n }\n }\n }\n}\n";
|
|
23
|
+
export type OutstandingThreadsResponse = {
|
|
24
|
+
repository: {
|
|
25
|
+
pullRequest: {
|
|
26
|
+
reviewThreads: {
|
|
27
|
+
pageInfo: {
|
|
28
|
+
hasNextPage: boolean;
|
|
29
|
+
endCursor: string | null;
|
|
30
|
+
};
|
|
31
|
+
nodes: ({
|
|
32
|
+
isResolved: boolean;
|
|
33
|
+
comments: {
|
|
34
|
+
nodes: ({
|
|
35
|
+
author: {
|
|
36
|
+
login: string;
|
|
37
|
+
} | null;
|
|
38
|
+
} | null)[] | null;
|
|
39
|
+
} | null;
|
|
40
|
+
} | null)[] | null;
|
|
41
|
+
} | null;
|
|
42
|
+
} | null;
|
|
43
|
+
} | null;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Count unresolved review threads on a PR whose ROOT comment was authored by
|
|
47
|
+
* Infraweaver's bot — the full set of open Infraweaver findings on the PR. Basis
|
|
48
|
+
* for the never-approve-with-outstanding-findings invariant (see the approval
|
|
49
|
+
* gate in `create_pull_request_review`).
|
|
50
|
+
*
|
|
51
|
+
* It's a function of ALL open findings, not just the latest commit's delta, so
|
|
52
|
+
* an incremental review can't approve past a prior unresolved thread. Outdated-
|
|
53
|
+
* but-unresolved threads still count: GitHub marks a thread `[OUTDATED]` when the
|
|
54
|
+
* anchor line moved (reformat, rename, force-push), which is not the concern
|
|
55
|
+
* being addressed. Human-reviewer threads are excluded — they belong to those
|
|
56
|
+
* reviewers to resolve. Walks every page (bounded) so a long-lived PR with >100
|
|
57
|
+
* threads can't hide an outstanding finding. #990.
|
|
58
|
+
*/
|
|
59
|
+
export declare function countOutstandingInfraweaverThreads(input: {
|
|
60
|
+
octokit: Octokit;
|
|
61
|
+
owner: string;
|
|
62
|
+
name: string;
|
|
63
|
+
pullNumber: number;
|
|
64
|
+
}): Promise<number>;
|
|
65
|
+
export type ReviewThreadComment = {
|
|
66
|
+
fullDatabaseId: string | null;
|
|
67
|
+
body: string;
|
|
68
|
+
bodyHTML: string;
|
|
69
|
+
createdAt: string;
|
|
70
|
+
diffHunk: string;
|
|
71
|
+
line: number | null;
|
|
72
|
+
startLine: number | null;
|
|
73
|
+
originalLine: number | null;
|
|
74
|
+
originalStartLine: number | null;
|
|
75
|
+
author: {
|
|
76
|
+
login: string;
|
|
77
|
+
} | null;
|
|
78
|
+
pullRequestReview: {
|
|
79
|
+
databaseId: number | null;
|
|
80
|
+
author: {
|
|
81
|
+
login: string;
|
|
82
|
+
} | null;
|
|
83
|
+
} | null;
|
|
84
|
+
reactionGroups: Array<{
|
|
85
|
+
content: string;
|
|
86
|
+
reactors: {
|
|
87
|
+
totalCount?: number;
|
|
88
|
+
nodes: Array<{
|
|
89
|
+
login: string;
|
|
90
|
+
} | null> | null;
|
|
91
|
+
} | null;
|
|
92
|
+
}> | null;
|
|
93
|
+
};
|
|
94
|
+
export type ReviewThread = {
|
|
95
|
+
id: string;
|
|
96
|
+
path: string;
|
|
97
|
+
line: number | null;
|
|
98
|
+
startLine: number | null;
|
|
99
|
+
diffSide: "LEFT" | "RIGHT";
|
|
100
|
+
isResolved: boolean;
|
|
101
|
+
isOutdated: boolean;
|
|
102
|
+
comments: {
|
|
103
|
+
nodes: (ReviewThreadComment | null)[] | null;
|
|
104
|
+
} | null;
|
|
105
|
+
};
|
|
106
|
+
export type ReviewThreadsQueryResponse = {
|
|
107
|
+
repository: {
|
|
108
|
+
pullRequest: {
|
|
109
|
+
reviewThreads: {
|
|
110
|
+
nodes: (ReviewThread | null)[] | null;
|
|
111
|
+
} | null;
|
|
112
|
+
} | null;
|
|
113
|
+
} | null;
|
|
114
|
+
};
|
|
115
|
+
export declare function countLines(str: string): number;
|
|
116
|
+
export type ParsedHunk = {
|
|
117
|
+
header: string;
|
|
118
|
+
oldStart: number;
|
|
119
|
+
oldCount: number;
|
|
120
|
+
newStart: number;
|
|
121
|
+
newCount: number;
|
|
122
|
+
content: string[];
|
|
123
|
+
};
|
|
124
|
+
export declare function parseFilePatches(patch: string): ParsedHunk[];
|
|
125
|
+
export declare const GetReviewComments: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
126
|
+
pull_number: number;
|
|
127
|
+
review_id: number;
|
|
128
|
+
}, {}>;
|
|
129
|
+
/**
|
|
130
|
+
* render 👍/👎 totals as a `reactions=` tag attribute so the agent sees
|
|
131
|
+
* human feedback on its findings inline with the thread (a 👎 on a infraweaver
|
|
132
|
+
* root comment is false-positive signal; see the IncrementalReview prompt).
|
|
133
|
+
* Only the thumbs contents — the other six reaction types carry no
|
|
134
|
+
* accept/reject semantics — and only when at least one is nonzero, so the
|
|
135
|
+
* common no-reaction case adds zero tokens.
|
|
136
|
+
*/
|
|
137
|
+
export declare function formatReactionCounts(comment: ReviewThreadComment): string;
|
|
138
|
+
/**
|
|
139
|
+
* formats thread blocks into markdown with TOC and line numbers.
|
|
140
|
+
* extracted for testability.
|
|
141
|
+
*/
|
|
142
|
+
export declare function formatReviewThreads(threadBlocks: Array<{
|
|
143
|
+
path: string;
|
|
144
|
+
lineRange: string;
|
|
145
|
+
content: string[];
|
|
146
|
+
}>, header: {
|
|
147
|
+
pullNumber: number;
|
|
148
|
+
reviewId: number;
|
|
149
|
+
reviewer: string;
|
|
150
|
+
reviewBody?: string;
|
|
151
|
+
}): {
|
|
152
|
+
toc: string;
|
|
153
|
+
content: string;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* builds thread blocks from review threads and file patches.
|
|
157
|
+
* extracted for testability.
|
|
158
|
+
*/
|
|
159
|
+
export declare function buildThreadBlocks(threads: ReviewThread[], filePatchMap: Map<string, ParsedHunk[]>, reviewId: number): {
|
|
160
|
+
path: string;
|
|
161
|
+
lineRange: string;
|
|
162
|
+
content: string[];
|
|
163
|
+
}[];
|
|
164
|
+
interface GetReviewDataInput {
|
|
165
|
+
octokit: Octokit;
|
|
166
|
+
owner: string;
|
|
167
|
+
name: string;
|
|
168
|
+
pullNumber: number;
|
|
169
|
+
reviewId: number;
|
|
170
|
+
approvedBy?: string | undefined;
|
|
171
|
+
tmpdir: string;
|
|
172
|
+
githubToken: string;
|
|
173
|
+
}
|
|
174
|
+
export interface FormatReviewDataInput {
|
|
175
|
+
review: ReviewResponse;
|
|
176
|
+
threads: ReviewThread[];
|
|
177
|
+
prFiles: ReviewPrFile[];
|
|
178
|
+
pullNumber: number;
|
|
179
|
+
reviewId: number;
|
|
180
|
+
}
|
|
181
|
+
export type ReviewResponse = {
|
|
182
|
+
body: string | null | undefined;
|
|
183
|
+
user: {
|
|
184
|
+
login: string;
|
|
185
|
+
} | null | undefined;
|
|
186
|
+
};
|
|
187
|
+
export type ReviewPrFile = {
|
|
188
|
+
filename: string;
|
|
189
|
+
patch?: string | undefined;
|
|
190
|
+
};
|
|
191
|
+
export declare function formatReviewData(input: FormatReviewDataInput): {
|
|
192
|
+
threadBlocks: Array<{
|
|
193
|
+
path: string;
|
|
194
|
+
lineRange: string;
|
|
195
|
+
content: string[];
|
|
196
|
+
}>;
|
|
197
|
+
reviewer: string;
|
|
198
|
+
formatted: {
|
|
199
|
+
toc: string;
|
|
200
|
+
content: string;
|
|
201
|
+
};
|
|
202
|
+
} | undefined;
|
|
203
|
+
export declare function getReviewData(input: GetReviewDataInput): Promise<{
|
|
204
|
+
threadBlocks: Array<{
|
|
205
|
+
path: string;
|
|
206
|
+
lineRange: string;
|
|
207
|
+
content: string[];
|
|
208
|
+
}>;
|
|
209
|
+
reviewer: string;
|
|
210
|
+
formatted: {
|
|
211
|
+
toc: string;
|
|
212
|
+
content: string;
|
|
213
|
+
};
|
|
214
|
+
truncated: boolean;
|
|
215
|
+
} | undefined>;
|
|
216
|
+
export declare function GetReviewCommentsTool(ctx: GitHubToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
217
|
+
pull_number: number;
|
|
218
|
+
review_id: number;
|
|
219
|
+
}, {
|
|
220
|
+
pull_number: number;
|
|
221
|
+
review_id: number;
|
|
222
|
+
}>> & {
|
|
223
|
+
mutates?: boolean;
|
|
224
|
+
};
|
|
225
|
+
export declare const ListPullRequestReviews: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
226
|
+
pull_number: number;
|
|
227
|
+
}, {}>;
|
|
228
|
+
export declare function ListPullRequestReviewsTool(ctx: GitHubToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
229
|
+
pull_number: number;
|
|
230
|
+
}, {
|
|
231
|
+
pull_number: number;
|
|
232
|
+
}>> & {
|
|
233
|
+
mutates?: boolean;
|
|
234
|
+
};
|
|
235
|
+
export declare const ResolveReviewThread: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
236
|
+
thread_id: string;
|
|
237
|
+
}, {}>;
|
|
238
|
+
export declare function ResolveReviewThreadTool(ctx: GitHubToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
239
|
+
thread_id: string;
|
|
240
|
+
}, {
|
|
241
|
+
thread_id: string;
|
|
242
|
+
}>> & {
|
|
243
|
+
mutates?: boolean;
|
|
244
|
+
};
|
|
245
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { LocalToolContext } from "#app/mcp/localContext";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-root awareness. A repo can hold SEVERAL Terraform root modules — the
|
|
4
|
+
* dirs you'd run `terraform init/plan/apply` in — not one. hepcare, for example,
|
|
5
|
+
* has `terraform/` AND `terraform/core/`, plus a child module under
|
|
6
|
+
* `terraform/modules/`. The scanners run recursively, but plan/validate assume a
|
|
7
|
+
* single `cwd`; this surfaces the roots so a run can act per-root.
|
|
8
|
+
*
|
|
9
|
+
* Heuristic (validated against real repos): a ROOT is a dir whose `*.tf`
|
|
10
|
+
* declares a PROVIDER CONFIGURATION (`provider "<name>" { … }`) or a BACKEND
|
|
11
|
+
* (`backend "<type>" { … }`). A CHILD MODULE never configures a provider or a
|
|
12
|
+
* backend (it only declares `required_providers`), so this cleanly separates the
|
|
13
|
+
* two. Pure parsing + a single fs walk; no subprocess.
|
|
14
|
+
*/
|
|
15
|
+
export interface TerraformRoot {
|
|
16
|
+
/** repo-relative dir (POSIX); "" for the top-level. */
|
|
17
|
+
dir: string;
|
|
18
|
+
hasBackend: boolean;
|
|
19
|
+
hasProviderConfig: boolean;
|
|
20
|
+
tfFileCount: number;
|
|
21
|
+
}
|
|
22
|
+
/** detect whether some concatenated HCL marks a root module. */
|
|
23
|
+
export declare function isRootModuleHcl(hcl: string): {
|
|
24
|
+
hasBackend: boolean;
|
|
25
|
+
hasProviderConfig: boolean;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Discover the Terraform root modules under `cwd`. Walks `*.tf` recursively
|
|
29
|
+
* (skipping cache/VCS dirs via walkTfFiles), groups by directory, and keeps the
|
|
30
|
+
* dirs that configure a provider or a backend. Sorted by dir. An empty result
|
|
31
|
+
* means no obvious root was found — the caller falls back to scanning `cwd`
|
|
32
|
+
* itself as a single root.
|
|
33
|
+
*/
|
|
34
|
+
export declare function discoverTerraformRoots(cwd: string): TerraformRoot[];
|
|
35
|
+
export interface EnvironmentTwinGroup {
|
|
36
|
+
/** the shared path shape with the env/region segment replaced by `{env}`. */
|
|
37
|
+
pattern: string;
|
|
38
|
+
/** the matched twins: each a dir + the environment/region token it carries. */
|
|
39
|
+
members: {
|
|
40
|
+
dir: string;
|
|
41
|
+
environment: string;
|
|
42
|
+
}[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Detect environment/region TWINS among a set of repo-relative paths (root dirs
|
|
46
|
+
* and/or `*.tfvars` files): parallel stacks that differ only by an environment
|
|
47
|
+
* (`dev`/`staging`/`prod`/…) or region (`eu-west-2`) segment. A fix applied to
|
|
48
|
+
* one should usually be offered for its twins too (backport / fan-out).
|
|
49
|
+
*
|
|
50
|
+
* For each path, finds the LAST segment that is an env token or a region (a
|
|
51
|
+
* `<env>.tfvars` file counts via its basename), replaces it with `{env}` to form
|
|
52
|
+
* a pattern, and groups by that pattern. Only groups with ≥2 DISTINCT
|
|
53
|
+
* environments are returned (a single match isn't a twin set). Pure +
|
|
54
|
+
* deterministic (sorted).
|
|
55
|
+
*/
|
|
56
|
+
export declare function detectEnvironmentTwins(paths: string[]): EnvironmentTwinGroup[];
|
|
57
|
+
export declare const TerraformRootsParams: import("arktype/internal/variants/object.ts").ObjectType<object, {}>;
|
|
58
|
+
export declare function TerraformRootsTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<object, object>> & {
|
|
59
|
+
mutates?: boolean;
|
|
60
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ToolState } from "#app/toolState";
|
|
2
|
+
import type { ResolvedPayload } from "#app/utils/payload";
|
|
3
|
+
/**
|
|
4
|
+
* The slice of the run these scope guards read: the triggering event (for the
|
|
5
|
+
* scoped issue/PR) and the created-target set. Both `GitHubToolContext` and the
|
|
6
|
+
* combined GitHub write context satisfy it — the guards need no octokit of their
|
|
7
|
+
* own.
|
|
8
|
+
*/
|
|
9
|
+
export interface ScopeContext {
|
|
10
|
+
payload: ResolvedPayload;
|
|
11
|
+
toolState: ToolState;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Record a PR/issue this run created so later body edits / comments / reviews on
|
|
15
|
+
* it pass {@link assertTargetInScope}. Call after a successful
|
|
16
|
+
* `create_pull_request` / `create_issue`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function recordCreatedTarget(ctx: ScopeContext, target: number): void;
|
|
19
|
+
/** true when `target` is the run's triggering issue/PR or one it created. */
|
|
20
|
+
export declare function isTargetInScope(ctx: ScopeContext, target: number): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Throw if `target` is neither the run's triggering issue/PR nor one it created.
|
|
23
|
+
* `action` is a short verb phrase used in the error (e.g. "comment on",
|
|
24
|
+
* "submit a review on", "add labels to").
|
|
25
|
+
*/
|
|
26
|
+
export declare function assertTargetInScope(ctx: ScopeContext, target: number, action: string): void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ToolContext } from "#app/mcp/server";
|
|
2
|
+
export declare const SelectModeParams: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
3
|
+
mode: string;
|
|
4
|
+
issue_number?: number;
|
|
5
|
+
}, {}>;
|
|
6
|
+
export type PlanCommentResponsePayload = {
|
|
7
|
+
error: string;
|
|
8
|
+
} | {
|
|
9
|
+
commentId: number;
|
|
10
|
+
body: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function SelectModeTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
13
|
+
mode: string;
|
|
14
|
+
issue_number?: number;
|
|
15
|
+
}, {
|
|
16
|
+
mode: string;
|
|
17
|
+
issue_number?: number;
|
|
18
|
+
}>> & {
|
|
19
|
+
mutates?: boolean;
|
|
20
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import "#app/mcp/arkConfig";
|
|
2
|
+
import { type AgentId } from "#app/external";
|
|
3
|
+
import type { Mode } from "#app/modes";
|
|
4
|
+
import type { ToolState } from "#app/toolState";
|
|
5
|
+
import type { OctokitWithPlugins } from "#app/utils/github";
|
|
6
|
+
import type { ResolvedPayload } from "#app/utils/payload";
|
|
7
|
+
import type { AccountPlan } from "#app/utils/runContext";
|
|
8
|
+
import type { RunContextData } from "#app/utils/runContextData";
|
|
9
|
+
export interface ToolContext {
|
|
10
|
+
agentId: AgentId;
|
|
11
|
+
repo: RunContextData["repo"];
|
|
12
|
+
payload: ResolvedPayload;
|
|
13
|
+
octokit: OctokitWithPlugins;
|
|
14
|
+
githubInstallationToken: string;
|
|
15
|
+
gitToken: string;
|
|
16
|
+
refreshGitToken?: ((stale: string) => Promise<string>) | undefined;
|
|
17
|
+
apiToken: string;
|
|
18
|
+
modes: Mode[];
|
|
19
|
+
postCheckoutScript: string | null;
|
|
20
|
+
prepushScript: string | null;
|
|
21
|
+
prApproveEnabled: boolean;
|
|
22
|
+
modeInstructions: Record<string, string>;
|
|
23
|
+
toolState: ToolState;
|
|
24
|
+
runId: number | undefined;
|
|
25
|
+
mcpServerUrl: string;
|
|
26
|
+
mcpServerToken: string;
|
|
27
|
+
tmpdir: string;
|
|
28
|
+
oss: boolean;
|
|
29
|
+
plan: AccountPlan;
|
|
30
|
+
resolvedModel: string | undefined;
|
|
31
|
+
}
|
|
32
|
+
type JsonSchema = Record<string, unknown>;
|
|
33
|
+
/**
|
|
34
|
+
* The per-run subagent deny set: the canonical bare names of every registered
|
|
35
|
+
* orchestrator tool marked `mutates: true`. Derived here (not from a static list)
|
|
36
|
+
* so a newly-added mutating tool is fenced the moment it's tagged — there is no
|
|
37
|
+
* separate list to drift. Embedded into the claude/opencode subagent gates
|
|
38
|
+
* (`buildClaudePretoolGateSource` / `buildOpencodeSubagentGateSource`).
|
|
39
|
+
*
|
|
40
|
+
* Throws when the derived set is empty: that means the `mutates` tagging
|
|
41
|
+
* regressed, and we refuse to start with the gate silently disabled rather than
|
|
42
|
+
* let subagents reach state-changing tools.
|
|
43
|
+
*/
|
|
44
|
+
export declare function subagentDeniedToolNames(ctx: ToolContext, outputSchema?: JsonSchema): string[];
|
|
45
|
+
type McpHttpServerOptions = {
|
|
46
|
+
outputSchema?: JsonSchema | undefined;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Start the MCP HTTP server.
|
|
50
|
+
*
|
|
51
|
+
* The returned disposer is idempotent — safe to call multiple times.
|
|
52
|
+
* Callers (e.g. the inner activity-timeout handler in main.ts) may need to
|
|
53
|
+
* stop the server before the `await using` block exits; a subsequent
|
|
54
|
+
* automatic dispose is then a no-op.
|
|
55
|
+
*/
|
|
56
|
+
export declare function startMcpHttpServer(ctx: ToolContext, options?: McpHttpServerOptions): Promise<{
|
|
57
|
+
url: string;
|
|
58
|
+
token: string;
|
|
59
|
+
[Symbol.asyncDispose]: () => Promise<void>;
|
|
60
|
+
}>;
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
import type { FastMCP, Tool } from "fastmcp";
|
|
3
|
+
import type { ToolContext } from "#app/mcp/server";
|
|
4
|
+
/**
|
|
5
|
+
* A FastMCP tool augmented with infraweaver's `mutates` flag: `true` marks a
|
|
6
|
+
* state-changing tool (working tree, remote, GitHub state, run state, fs/process)
|
|
7
|
+
* that subagents must not call. The subagent deny list is derived from this flag
|
|
8
|
+
* at runtime (see `subagentDeniedToolNames`) rather than a hand-maintained list,
|
|
9
|
+
* so a new mutating tool is gated the moment it's tagged — no separate list to
|
|
10
|
+
* drift out of sync.
|
|
11
|
+
*/
|
|
12
|
+
export type InfraweaverTool = Tool<any, any> & {
|
|
13
|
+
mutates?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare const tool: <const params>(toolDef: Tool<any, StandardSchemaV1<params>> & {
|
|
16
|
+
mutates?: boolean;
|
|
17
|
+
}) => Tool<any, StandardSchemaV1<params>> & {
|
|
18
|
+
mutates?: boolean;
|
|
19
|
+
};
|
|
20
|
+
export interface ToolResult {
|
|
21
|
+
content: {
|
|
22
|
+
type: "text";
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
isError?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Structured tool-outcome envelope ("Structured tool errors"). Every tool
|
|
29
|
+
* that can be unavailable, skipped, or degrade green returns the SAME shape so a
|
|
30
|
+
* caller (the agent, or a downstream parser) can branch deterministically:
|
|
31
|
+
* - success: `{ ok: true, … }`
|
|
32
|
+
* - skip / unavailable / soft failure: `{ ok: false, code, detail }`
|
|
33
|
+
* where `code` is a stable machine token (snake_case) and `detail` a human
|
|
34
|
+
* sentence. The newer tools (terraform_roots / terraform_module_interface /
|
|
35
|
+
* terraform_provider_schema / policy_check) emit this natively; the older
|
|
36
|
+
* degrade-green tools historically returned `{ ran|found: false,
|
|
37
|
+
* skipped_reason|reason }`. Those keep their legacy aliases ALONGSIDE the new
|
|
38
|
+
* fields (the call site spreads `toolSkip(...)` into its existing object) so
|
|
39
|
+
* prompt + test contracts keep working while the surface converges — additive,
|
|
40
|
+
* never breaking.
|
|
41
|
+
*/
|
|
42
|
+
export type ToolOk<T extends Record<string, any>> = T & {
|
|
43
|
+
ok: true;
|
|
44
|
+
};
|
|
45
|
+
/** wrap a success payload with `ok: true`. */
|
|
46
|
+
export declare const toolOk: <T extends Record<string, any>>(data: T) => ToolOk<T>;
|
|
47
|
+
/** the structured skip/unavailable envelope: `{ ok: false, code, detail }`. */
|
|
48
|
+
export declare const toolSkip: (code: string, detail: string) => {
|
|
49
|
+
ok: false;
|
|
50
|
+
code: string;
|
|
51
|
+
detail: string;
|
|
52
|
+
};
|
|
53
|
+
export declare const handleToolSuccess: (data: Record<string, any> | string) => ToolResult;
|
|
54
|
+
export declare const handleToolError: (error: unknown) => ToolResult;
|
|
55
|
+
/**
|
|
56
|
+
* Helper to wrap a tool execute function with error handling.
|
|
57
|
+
* Captures ctx in closure so tools don't need to handle try/catch.
|
|
58
|
+
* @param fn - the function to execute
|
|
59
|
+
* @param toolName - optional tool name for error logging
|
|
60
|
+
*/
|
|
61
|
+
export declare const execute: <T, R extends Record<string, any> | string>(fn: (params: T) => Promise<R>, toolName?: string) => (params: T) => Promise<ToolResult>;
|
|
62
|
+
export declare const addTools: (ctx: ToolContext, server: FastMCP<any>, tools: InfraweaverTool[]) => FastMCP<any>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ToolContext } from "#app/mcp/server";
|
|
2
|
+
export declare const ShellParams: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
3
|
+
command: string;
|
|
4
|
+
description: string;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
working_directory?: string;
|
|
7
|
+
background?: boolean;
|
|
8
|
+
}, {}>;
|
|
9
|
+
export type SandboxMethod = "unshare" | "sudo-unshare" | "none";
|
|
10
|
+
/** get the current sandbox method (for testing/diagnostics) */
|
|
11
|
+
export declare function getSandboxMethod(): SandboxMethod;
|
|
12
|
+
export declare function resolveRepoRoot(): string;
|
|
13
|
+
/** chars of shell output kept inline in the agent reply. anything past this
|
|
14
|
+
* blows the agent's context budget on commands that dump big logs (test
|
|
15
|
+
* runners, build tools, grep on large trees), so the overflow is spilled
|
|
16
|
+
* to a tempfile the agent can re-read selectively (cat/tail/grep). */
|
|
17
|
+
export declare const MAX_OUTPUT_CHARS = 5000;
|
|
18
|
+
/** hard ceiling on the stdout/stderr we hold in memory WHILE a command runs.
|
|
19
|
+
* `capOutput` only spills to a tempfile AFTER exit, so without this the live
|
|
20
|
+
* accumulator grows by string-concat on every `data` event — a child that streams
|
|
21
|
+
* hundreds of MB before exiting (runaway build/test, `cat` of a huge file) can OOM the
|
|
22
|
+
* runner first. Tail-preferring: the newest output, where errors surface, wins —
|
|
23
|
+
* which also matches `capOutput` keeping the tail. Set far above MAX_OUTPUT_CHARS so it
|
|
24
|
+
* never interferes with normal output, only bounds the pathological case. */
|
|
25
|
+
export declare const MAX_CAPTURE_CHARS = 5000000;
|
|
26
|
+
/** A string accumulator bounded to ~`limit` chars, keeping the TAIL. The trim is
|
|
27
|
+
* amortized (the buffer is allowed to reach 2× before slicing back) so steady-state
|
|
28
|
+
* appends stay O(1). `droppedChars()` reports how much of the head was discarded. */
|
|
29
|
+
export declare function createCappedBuffer(limit: number): {
|
|
30
|
+
push(chunk: string): void;
|
|
31
|
+
value(): string;
|
|
32
|
+
droppedChars(): number;
|
|
33
|
+
};
|
|
34
|
+
export declare function ShellTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
35
|
+
command: string;
|
|
36
|
+
description: string;
|
|
37
|
+
timeout?: number;
|
|
38
|
+
working_directory?: string;
|
|
39
|
+
background?: boolean;
|
|
40
|
+
}, {
|
|
41
|
+
command: string;
|
|
42
|
+
description: string;
|
|
43
|
+
timeout?: number;
|
|
44
|
+
working_directory?: string;
|
|
45
|
+
background?: boolean;
|
|
46
|
+
}>> & {
|
|
47
|
+
mutates?: boolean;
|
|
48
|
+
};
|
|
49
|
+
export declare const KillBackgroundParams: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
50
|
+
handle: string;
|
|
51
|
+
}, {}>;
|
|
52
|
+
export declare function KillBackgroundTool(ctx: ToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
53
|
+
handle: string;
|
|
54
|
+
}, {
|
|
55
|
+
handle: string;
|
|
56
|
+
}>> & {
|
|
57
|
+
mutates?: boolean;
|
|
58
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { GitHubToolContext } from "#app/mcp/capabilityContext";
|
|
2
|
+
/** true when `branch` is a Infraweaver remediation/generation branch. */
|
|
3
|
+
export declare function isRemediationBranch(branch: string): boolean;
|
|
4
|
+
/** the `<group-id>` of a `remediate/<group-id>` branch (the scan group id that
|
|
5
|
+
* keys the fix), or null for a generation branch / non-remediation branch. */
|
|
6
|
+
export declare function groupIdFromBranch(branch: string): string | null;
|
|
7
|
+
/** true when a commit-author LOGIN is Infraweaver's bot (so a commit by it is NOT
|
|
8
|
+
* a human edit). A null/absent login is treated as non-human here for backward
|
|
9
|
+
* compatibility of this login-only helper — but prefer {@link isBotCommit}, which
|
|
10
|
+
* resolves an absent login via the commit's git identity rather than assuming
|
|
11
|
+
* bot (the assumption that caused a human commit with an unlinked email to be
|
|
12
|
+
* force-overwritten). */
|
|
13
|
+
export declare function isBotActor(login: string | null | undefined): boolean;
|
|
14
|
+
/** the authorship slice of a compareCommits entry that {@link isBotCommit} reads. */
|
|
15
|
+
export interface CommitAuthorship {
|
|
16
|
+
/** the GitHub user GitHub resolved from the commit's author email, or null when
|
|
17
|
+
* the email isn't linked to any account — true for Infraweaver's own `[bot]`
|
|
18
|
+
* noreply email AND for a human committing under an unverified email. */
|
|
19
|
+
author?: {
|
|
20
|
+
login?: string | null;
|
|
21
|
+
} | null;
|
|
22
|
+
/** the raw git author identity from the commit object, present even when the
|
|
23
|
+
* GitHub `author` account above is null. */
|
|
24
|
+
commit?: {
|
|
25
|
+
author?: {
|
|
26
|
+
name?: string | null;
|
|
27
|
+
email?: string | null;
|
|
28
|
+
} | null;
|
|
29
|
+
} | null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Decide whether a remediation-branch commit is Infraweaver's own (a bot commit,
|
|
33
|
+
* safe to force-overwrite on refresh) or a human/third-party edit (must be
|
|
34
|
+
* preserved — escalate instead of refresh).
|
|
35
|
+
*
|
|
36
|
+
* A resolved GitHub `author.login` is authoritative: a positive bot match is a
|
|
37
|
+
* bot, a real login is a human. When the login is ABSENT — which happens both for
|
|
38
|
+
* Infraweaver's own commits (its `infraweaver[bot]` noreply email doesn't map to a
|
|
39
|
+
* GitHub account) and for a human committing under an unverified email — fall
|
|
40
|
+
* back to the commit's git identity: only a recognised bot name/email
|
|
41
|
+
* (`infraweaver[bot]`, any `[bot]`) counts as a bot; ANY other identity is treated
|
|
42
|
+
* as a human edit. This is the conservative direction on purpose — a missed bot
|
|
43
|
+
* commit costs one skipped auto-refresh, whereas a missed human commit is a
|
|
44
|
+
* force-push that destroys their work.
|
|
45
|
+
*/
|
|
46
|
+
export declare function isBotCommit(commit: CommitAuthorship): boolean;
|
|
47
|
+
export type StaleFixStatus = "current" | "stale" | "human_touched" | "checks_failing";
|
|
48
|
+
export type StaleFixAction = "skip" | "refresh" | "escalate";
|
|
49
|
+
/** the latest CI conclusion on a remediation PR's head, used to self-heal a PR
|
|
50
|
+
* whose own checks are red (a failed `terraform plan`, a failing module test, a
|
|
51
|
+
* policy gate) even when its base hasn't moved. `unknown` = no checks reported or
|
|
52
|
+
* the read failed (treated as "no signal" — never manufactures a refresh). */
|
|
53
|
+
export type ChecksState = "passing" | "failing" | "pending" | "unknown";
|
|
54
|
+
export interface StaleFixAssessment {
|
|
55
|
+
status: StaleFixStatus;
|
|
56
|
+
action: StaleFixAction;
|
|
57
|
+
reason: string;
|
|
58
|
+
/** a likely zombie: stale (base advanced), untouched by humans, and open past
|
|
59
|
+
* the staleness age threshold — surface it so the sweep prioritizes closing it
|
|
60
|
+
* once the concern is confirmed resolved. Advisory; the action stays `refresh`. */
|
|
61
|
+
zombie: boolean;
|
|
62
|
+
}
|
|
63
|
+
/** age (in days, PR open duration) past which a stale, untouched remediation PR
|
|
64
|
+
* is flagged as a likely zombie for prioritized cleanup. */
|
|
65
|
+
export declare const DEFAULT_STALE_AFTER_DAYS = 30;
|
|
66
|
+
/**
|
|
67
|
+
* How many times the sweep will auto re-derive a remediation PR to clear a FAILING
|
|
68
|
+
* CI check before it gives up and escalates to a human. Self-heal is on by default,
|
|
69
|
+
* but a fix the engine proves green locally yet that keeps failing the consumer's
|
|
70
|
+
* CI (a cloud-credentialled `terraform plan`, a flaky integration test) must not
|
|
71
|
+
* loop forever — past the cap the PR is labelled needs-human and left alone. Only
|
|
72
|
+
* the checks-failing path is capped; a genuine base move is always a fresh refresh.
|
|
73
|
+
*/
|
|
74
|
+
export declare const DEFAULT_SELF_HEAL_MAX_ATTEMPTS = 3;
|
|
75
|
+
/** count of self-heal attempts already recorded on a PR, from its accumulated
|
|
76
|
+
* `infraweaver-self-heal-attempt-N` labels. */
|
|
77
|
+
export declare function selfHealAttempts(labels: string[]): number;
|
|
78
|
+
/** the label to stamp when recording the next self-heal attempt (1-based). */
|
|
79
|
+
export declare function nextSelfHealLabel(attempts: number): string;
|
|
80
|
+
/**
|
|
81
|
+
* Decide what a refresh sweep should do with one open remediation PR, from git +
|
|
82
|
+
* CI facts alone. Pure.
|
|
83
|
+
* - a branch carrying NON-bot commits is `human_touched` → `escalate` (never
|
|
84
|
+
* force-overwrite a human's work; leave it for review).
|
|
85
|
+
* - a branch whose base has NOT advanced AND whose checks are not failing is
|
|
86
|
+
* `current` → `skip` (the fix is still derived against the live base).
|
|
87
|
+
* - a branch whose own CI is red (and base unchanged) is `checks_failing` →
|
|
88
|
+
* `refresh`: re-derive the fix on the current base and re-prove it (the
|
|
89
|
+
* self-heal case — a failed plan/test/policy on Infraweaver's own PR). Two guards
|
|
90
|
+
* stop this looping forever: (1) if it is ALREADY labelled needs-human and the
|
|
91
|
+
* base hasn't moved, re-deriving would only reproduce the same failing fix, so
|
|
92
|
+
* `skip`; (2) once `selfHealAttempts` reaches `maxSelfHealAttempts` (default 3)
|
|
93
|
+
* the sweep gives up and `escalate`s instead of re-deriving again.
|
|
94
|
+
* - otherwise the base moved → `stale` → `refresh`: re-derive the fix on the
|
|
95
|
+
* current base, then close it if the concern is already resolved or update it.
|
|
96
|
+
*
|
|
97
|
+
* `ageDays` (PR open duration) is advisory: a stale, untouched PR open past
|
|
98
|
+
* `staleAfterDays` is additionally flagged `zombie` so the sweep can prioritize
|
|
99
|
+
* clearing the long-rotting ones. It never changes the action — a fix is only
|
|
100
|
+
* ever closed once a re-scan confirms its concern is actually resolved.
|
|
101
|
+
*/
|
|
102
|
+
export declare function assessStaleFix(input: {
|
|
103
|
+
baseBehindBy: number;
|
|
104
|
+
hasNonBotCommits: boolean;
|
|
105
|
+
/** the PR's CI is red (a failed plan/test/policy) — triggers a self-heal. */
|
|
106
|
+
checksFailing?: boolean;
|
|
107
|
+
/** the PR already carries `needs-human` — used as the self-heal loop guard. */
|
|
108
|
+
alreadyEscalated?: boolean;
|
|
109
|
+
/** self-heal attempts already recorded on this PR (from its attempt labels). */
|
|
110
|
+
selfHealAttempts?: number;
|
|
111
|
+
/** the retry ceiling for self-heal (default {@link DEFAULT_SELF_HEAL_MAX_ATTEMPTS}). */
|
|
112
|
+
maxSelfHealAttempts?: number;
|
|
113
|
+
ageDays?: number;
|
|
114
|
+
staleAfterDays?: number;
|
|
115
|
+
}): StaleFixAssessment;
|
|
116
|
+
export declare const ListRemediationPrsParams: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
117
|
+
limit?: number;
|
|
118
|
+
}, {}>;
|
|
119
|
+
export declare function ListRemediationPrsTool(ctx: GitHubToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
120
|
+
limit?: number;
|
|
121
|
+
}, {
|
|
122
|
+
limit?: number;
|
|
123
|
+
}>> & {
|
|
124
|
+
mutates?: boolean;
|
|
125
|
+
};
|
|
126
|
+
export declare const ClosePullRequest: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
127
|
+
pull_number: number;
|
|
128
|
+
comment?: string;
|
|
129
|
+
}, {}>;
|
|
130
|
+
export declare function ClosePullRequestTool(ctx: GitHubToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
131
|
+
pull_number: number;
|
|
132
|
+
comment?: string;
|
|
133
|
+
}, {
|
|
134
|
+
pull_number: number;
|
|
135
|
+
comment?: string;
|
|
136
|
+
}>> & {
|
|
137
|
+
mutates?: boolean;
|
|
138
|
+
};
|