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,379 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: terraform-best-practices
|
|
3
|
+
description: Fix Terraform to best practice from a scanner concern — the minimal, correct change for a trivy/checkov/tflint/fmt/validate finding, plus the security, structure, and naming conventions a good fix must follow. Use when remediating Terraform, applying a `terraform_scan` concern, or generating new HCL that must start compliant.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Terraform best-practice remediation
|
|
7
|
+
|
|
8
|
+
You are fixing Terraform against a **concern** emitted by `terraform_scan` (or
|
|
9
|
+
`terraform_validate`). Each concern names the producing `source`, a `rule_id`,
|
|
10
|
+
the `location` (file + line), an `evidence` string (what's wrong), and often a
|
|
11
|
+
`remediation_hint`. Your job is the **smallest correct change** that clears that
|
|
12
|
+
concern — nothing more.
|
|
13
|
+
|
|
14
|
+
## The remediation loop
|
|
15
|
+
|
|
16
|
+
1. **Read the concern.** The `rule_id` tells you the class of problem; the
|
|
17
|
+
`evidence` tells you the specifics; `location.file:line` tells you where.
|
|
18
|
+
2. **Open the file and understand the surrounding resource** before editing.
|
|
19
|
+
Don't fix a line in isolation — know which `resource` / `module` / `variable`
|
|
20
|
+
block it belongs to.
|
|
21
|
+
3. **Apply the minimal fix** (see the catalogue below). Touch only `*.tf` /
|
|
22
|
+
`*.tfvars`. Do not reformat, reorder, or "improve" unrelated code — that
|
|
23
|
+
buries the real fix and breaks the one-concern-per-PR contract.
|
|
24
|
+
4. **Re-validate** with `terraform_validate`. If it doesn't pass, your fix is
|
|
25
|
+
incomplete or introduced a new problem — fix that before opening a PR.
|
|
26
|
+
5. **Confirm the concern cleared** by re-running `terraform_scan` on the branch.
|
|
27
|
+
The concern's `id` must be gone. If it isn't, say so honestly.
|
|
28
|
+
|
|
29
|
+
## What a good fix looks like, by source
|
|
30
|
+
|
|
31
|
+
- **`terraform-fmt:unformatted`** — run `terraform fmt` on the named file. This
|
|
32
|
+
is whitespace/alignment only; never combine it with a behavioural change in
|
|
33
|
+
the same PR.
|
|
34
|
+
- **`tflint:*`** — idiomatic-HCL and provider-rule issues. Common fixes: remove
|
|
35
|
+
unused `variable`/`local`/`data` declarations; pin deprecated syntax forward;
|
|
36
|
+
add missing required provider/version constraints. Follow the rule's link.
|
|
37
|
+
- **`trivy:*` / `checkov:*`** — security misconfiguration. These are the
|
|
38
|
+
high-value fixes. Apply the **secure default**, e.g.:
|
|
39
|
+
- **encryption at rest** — add the `server_side_encryption_configuration` /
|
|
40
|
+
`encryption` block (S3, RDS, EBS, etc.); prefer a CMK where the rule asks.
|
|
41
|
+
- **no public access** — set `block_public_acls`/`block_public_policy` etc. to
|
|
42
|
+
`true`; remove `acl = "public-read"`; tighten `0.0.0.0/0` ingress to the
|
|
43
|
+
real CIDR or a referenced security group.
|
|
44
|
+
- **least privilege** — replace `"*"` actions/resources in IAM policies with
|
|
45
|
+
the specific actions/ARNs actually needed.
|
|
46
|
+
- **logging / versioning** — add the access-logging, audit, or versioning
|
|
47
|
+
block the rule requires.
|
|
48
|
+
- **`terraform-validate:*`** — a correctness error (bad reference, type
|
|
49
|
+
mismatch, missing required argument). Fix the actual HCL so `terraform
|
|
50
|
+
validate` passes.
|
|
51
|
+
|
|
52
|
+
## Secure-default catalogue (by problem class)
|
|
53
|
+
|
|
54
|
+
Copy-pasteable shapes for the highest-frequency security concerns. These target
|
|
55
|
+
the **AWS provider v5+** layout (encryption / versioning / ACL / public-access
|
|
56
|
+
are standalone resources, not inline `aws_s3_bucket` blocks). Adapt resource and
|
|
57
|
+
attribute names to the block the concern points at — don't paste blindly.
|
|
58
|
+
|
|
59
|
+
### Encryption at rest
|
|
60
|
+
|
|
61
|
+
S3 — server-side encryption with a customer-managed key (preferred over `AES256`
|
|
62
|
+
when the rule asks for a CMK):
|
|
63
|
+
|
|
64
|
+
```hcl
|
|
65
|
+
resource "aws_s3_bucket_server_side_encryption_configuration" "this" {
|
|
66
|
+
bucket = aws_s3_bucket.this.id
|
|
67
|
+
rule {
|
|
68
|
+
apply_server_side_encryption_by_default {
|
|
69
|
+
sse_algorithm = "aws:kms"
|
|
70
|
+
kms_master_key_id = aws_kms_key.this.arn
|
|
71
|
+
}
|
|
72
|
+
bucket_key_enabled = true
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
EBS volume / root device: `encrypted = true` (add `kms_key_id` when a CMK is
|
|
78
|
+
required). RDS: `storage_encrypted = true` (+ `kms_key_id`). When `aws:kms` needs
|
|
79
|
+
a key and none exists, reference an existing `aws_kms_key`/`var.*`; only add a new
|
|
80
|
+
`aws_kms_key` resource if the stack genuinely has none — keep `AES256` if the rule
|
|
81
|
+
is satisfied by SSE-S3 alone.
|
|
82
|
+
|
|
83
|
+
### Block public access
|
|
84
|
+
|
|
85
|
+
S3 — the four-flag public-access block is the canonical fix; wire it to the same
|
|
86
|
+
bucket:
|
|
87
|
+
|
|
88
|
+
```hcl
|
|
89
|
+
resource "aws_s3_bucket_public_access_block" "this" {
|
|
90
|
+
bucket = aws_s3_bucket.this.id
|
|
91
|
+
block_public_acls = true
|
|
92
|
+
block_public_policy = true
|
|
93
|
+
ignore_public_acls = true
|
|
94
|
+
restrict_public_buckets = true
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Also remove any `acl = "public-read"` (move to a private `aws_s3_bucket_acl` if an
|
|
99
|
+
ACL is needed at all).
|
|
100
|
+
|
|
101
|
+
### Network ingress
|
|
102
|
+
|
|
103
|
+
Replace world-open ingress with the real source. Never leave `0.0.0.0/0` on admin
|
|
104
|
+
ports (22/3389/database ports):
|
|
105
|
+
|
|
106
|
+
```hcl
|
|
107
|
+
ingress {
|
|
108
|
+
from_port = 443
|
|
109
|
+
to_port = 443
|
|
110
|
+
protocol = "tcp"
|
|
111
|
+
cidr_blocks = [var.allowed_cidr] # or: security_groups = [aws_security_group.lb.id]
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### IAM least privilege
|
|
116
|
+
|
|
117
|
+
Replace wildcard `Action`/`Resource` with the specific actions and ARNs the
|
|
118
|
+
workload actually uses. If you can't determine the exact set from the surrounding
|
|
119
|
+
code, this is a human decision — report it rather than guessing a narrow policy
|
|
120
|
+
that breaks the stack.
|
|
121
|
+
|
|
122
|
+
### Versioning & logging
|
|
123
|
+
|
|
124
|
+
S3 versioning and access logging as standalone resources:
|
|
125
|
+
|
|
126
|
+
```hcl
|
|
127
|
+
resource "aws_s3_bucket_versioning" "this" {
|
|
128
|
+
bucket = aws_s3_bucket.this.id
|
|
129
|
+
versioning_configuration { status = "Enabled" }
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### EC2 instance metadata (IMDSv2)
|
|
134
|
+
|
|
135
|
+
Require token-backed metadata to close the SSRF→credential path:
|
|
136
|
+
|
|
137
|
+
```hcl
|
|
138
|
+
metadata_options {
|
|
139
|
+
http_endpoint = "enabled"
|
|
140
|
+
http_tokens = "required"
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Deprecations & style
|
|
145
|
+
|
|
146
|
+
- **Provider v4→v5 S3 split** — inline `server_side_encryption_configuration` /
|
|
147
|
+
`versioning` / `acl` / `logging` blocks on `aws_s3_bucket` are deprecated; move
|
|
148
|
+
each to its standalone resource (above). Don't bump the provider major version
|
|
149
|
+
as a side effect of a remediation — if a fix genuinely requires a newer
|
|
150
|
+
provider, report that as a blocker.
|
|
151
|
+
- **`terraform-fmt:unformatted`** — run `terraform fmt` on the named file only;
|
|
152
|
+
never fold a formatting pass into a behavioural fix.
|
|
153
|
+
|
|
154
|
+
## Don't over-reach
|
|
155
|
+
|
|
156
|
+
- **Smallest change that clears the concern.** Add the missing block; don't
|
|
157
|
+
refactor the resource, rename it, or restructure the file around it.
|
|
158
|
+
- **Don't add speculative hardening** the concern didn't ask for (extra KMS keys,
|
|
159
|
+
new modules, blanket tagging) — that's scope creep and buries the real fix.
|
|
160
|
+
- **Don't widen or bump version pins** to reach a resource or attribute.
|
|
161
|
+
- **One concern's blast radius only.** If the secure default would break the
|
|
162
|
+
stack or needs a human call (a real CIDR, an IAM action set, a CMK policy),
|
|
163
|
+
stop and report it instead of opening a broken or guessed PR.
|
|
164
|
+
|
|
165
|
+
## Conventions every fix must honour
|
|
166
|
+
|
|
167
|
+
- **Variables over hardcoded values.** Don't bake an account id, region, CIDR,
|
|
168
|
+
or ARN into a fix — reference an existing `var.*`/`local.*`, or add a typed
|
|
169
|
+
`variable` with a sensible `default` and `description` when one is genuinely
|
|
170
|
+
needed.
|
|
171
|
+
- **Pin versions.** When adding a provider or module, include a version
|
|
172
|
+
constraint. Never widen an existing pin as a side effect.
|
|
173
|
+
- **Approved modules first.** Call `list_modules` — if a catalogue is configured,
|
|
174
|
+
prefer the catalogue module (a registry module or a local/house module) + its
|
|
175
|
+
exact variable names over inlining a raw resource, and pin its `version`. See
|
|
176
|
+
_Using Terraform modules_ below.
|
|
177
|
+
- **No secrets in HCL or state.** Never introduce a literal credential. If the
|
|
178
|
+
fix needs a secret, reference a variable or a secrets data source.
|
|
179
|
+
- **Idempotent, reviewable diffs.** The diff should read so a senior engineer
|
|
180
|
+
approves it without hesitation: one concern, one rationale, no churn.
|
|
181
|
+
|
|
182
|
+
## Gold standards (the bar every fix is measured against)
|
|
183
|
+
|
|
184
|
+
These are the non-negotiable defaults a "good" Terraform change embodies. A fix
|
|
185
|
+
should never _move away_ from any of these, and should move _toward_ them when
|
|
186
|
+
the concern is adjacent:
|
|
187
|
+
|
|
188
|
+
- **Encrypt everything, at rest and in transit.** Storage encrypted (CMK where
|
|
189
|
+
the data is sensitive); TLS-only endpoints; no plaintext in state.
|
|
190
|
+
- **Private by default.** No `0.0.0.0/0` to admin/database ports; public access
|
|
191
|
+
blocked unless the resource's whole purpose is to be public (and then scoped).
|
|
192
|
+
- **Least privilege.** No `"*"` IAM actions/resources; scope to what the workload
|
|
193
|
+
uses. Prefer a referenced role/policy over an inline wildcard.
|
|
194
|
+
- **Pinned + reproducible.** `required_version` and every `required_providers` /
|
|
195
|
+
module `version` constrained (`~>`); no floating `latest`.
|
|
196
|
+
- **Parameterised, not hardcoded** (see below).
|
|
197
|
+
- **Tagged + named consistently.** Match the repo's existing tag keys and naming
|
|
198
|
+
scheme; don't invent a new convention.
|
|
199
|
+
- **Observable.** Logging / versioning / audit trails enabled where the provider
|
|
200
|
+
supports them and the concern is about data durability or traceability.
|
|
201
|
+
- **Idempotent + deterministic.** No `timestamp()`/`uuid()`/unkeyed `random_*`
|
|
202
|
+
driving a value that lands in state — it produces a perpetual diff.
|
|
203
|
+
|
|
204
|
+
When in doubt, the secure/idiomatic default from the catalogue above IS the gold
|
|
205
|
+
standard. Don't gold-plate beyond the concern, but never regress one of these.
|
|
206
|
+
|
|
207
|
+
## Parameterize, don't hardcode
|
|
208
|
+
|
|
209
|
+
A value that varies by environment, account, or deployment must be a `variable`
|
|
210
|
+
or `local`, never a literal baked into a resource:
|
|
211
|
+
|
|
212
|
+
- **Reuse first.** If the repo already exposes `var.region` / `local.tags` /
|
|
213
|
+
`var.vpc_cidr`, reference it — don't introduce a parallel one.
|
|
214
|
+
- **Introduce a typed variable** when none fits: give it a `type`, a
|
|
215
|
+
`description`, and a safe `default` only when a default is genuinely sane
|
|
216
|
+
(secrets and account-specific ids get NO default). Match the repo's existing
|
|
217
|
+
file layout — add to `variables.tf` if the repo separates them, otherwise keep
|
|
218
|
+
it next to the resource as the repo does.
|
|
219
|
+
- **Derive with `locals`.** Computed/repeated values (a name prefix, a merged tag
|
|
220
|
+
map) belong in `locals`, referenced everywhere — not copy-pasted.
|
|
221
|
+
- **Never inline a secret, account id, ARN, or CIDR.** A "fix" that pastes a
|
|
222
|
+
literal credential is itself a finding (and the secret-scan guardrail will
|
|
223
|
+
block the push). Reference a variable or a secrets data source.
|
|
224
|
+
|
|
225
|
+
## Using Terraform modules (registry, private git libraries, your own)
|
|
226
|
+
|
|
227
|
+
Prefer a well-formed module over a pile of raw resources when one cleanly fits —
|
|
228
|
+
it carries the secure defaults for you. **Always call `list_modules` first**; it
|
|
229
|
+
returns three things: the operator's `module_catalogue`, the
|
|
230
|
+
`discovered_house_modules` (local modules already used in THIS repo), and a note.
|
|
231
|
+
|
|
232
|
+
Four source kinds you'll encounter, each pinned differently:
|
|
233
|
+
|
|
234
|
+
- **Public registry module** — `terraform-aws-modules/vpc/aws`. Pin with a
|
|
235
|
+
`version = "~> 5.0"` argument. The big public collections
|
|
236
|
+
([terraform-aws-modules](https://registry.terraform.io/namespaces/terraform-aws-modules):
|
|
237
|
+
`vpc`, `s3-bucket`, `rds`, `eks`, …) are the default when nothing is configured.
|
|
238
|
+
A registry submodule is `…/aws//modules/log-group`.
|
|
239
|
+
- **Private registry module** — a host-prefixed address like
|
|
240
|
+
`app.terraform.io/acme/networking/aws` (HCP Terraform / Terraform Enterprise / an
|
|
241
|
+
org registry). Pin with a `version` argument, exactly like a public registry
|
|
242
|
+
module. `terraform_module_lookup` reads its real interface when the run supplies a
|
|
243
|
+
`registry_token` (+ `registry_host`) — the token is only ever sent to the
|
|
244
|
+
allow-listed host. (There is no private `search`; look these up by exact address.)
|
|
245
|
+
- **Private git module library** — e.g.
|
|
246
|
+
`git::https://github.com/acme/tf-modules.git//aws/s3?ref=s3-v0.1.2`. The
|
|
247
|
+
`//aws/s3` selects the module within the repo and **`?ref=s3-v0.1.2` IS the
|
|
248
|
+
version pin** (git modules have no `version` argument). Keep the exact `ref`;
|
|
249
|
+
never float it. Many orgs (e.g. UKHSA's `data-integration-terraform-modules`)
|
|
250
|
+
ship a whole library this way, tagged per-module.
|
|
251
|
+
- **House module** — one of the repo's own `modules/<name>` dirs. `list_modules`
|
|
252
|
+
surfaces these under `discovered_house_modules` with their caller files — reuse
|
|
253
|
+
the existing one with its **real variable names** (read its `variables.tf`)
|
|
254
|
+
rather than re-implementing it.
|
|
255
|
+
|
|
256
|
+
Rules: use the module's **exact variable names**, set the secure-relevant inputs
|
|
257
|
+
the concern is about, and keep the version **pinned**. Don't introduce a module
|
|
258
|
+
mid-remediation just to "improve" things — using a module is right when
|
|
259
|
+
_generating_ new infra or when the fix is genuinely a module swap; for a one-line
|
|
260
|
+
security fix on an existing raw resource, fix the resource in place.
|
|
261
|
+
|
|
262
|
+
Prefer authoritative registry knowledge over recalling it from memory — it moves
|
|
263
|
+
faster than any training data, and a fix written against a remembered-but-renamed
|
|
264
|
+
argument breaks `plan`. Built in and always on: `terraform_module_lookup` reads a
|
|
265
|
+
published module's real inputs/outputs + resolved version, `terraform_module_search`
|
|
266
|
+
finds published modules to reuse (pass your org's namespace to surface your own),
|
|
267
|
+
`terraform_version_currency` reports versions, and `terraform_provider_schema` gives
|
|
268
|
+
the installed provider's arguments. When the **`terraform` MCP server** is registered
|
|
269
|
+
(the `terraform_mcp` input), it adds the deeper provider/resource documentation
|
|
270
|
+
surface on top — prefer it for provider argument shapes.
|
|
271
|
+
|
|
272
|
+
### Authoring a reusable module (standard layout)
|
|
273
|
+
|
|
274
|
+
When you GENERATE a reusable module, follow the conventional layout real module
|
|
275
|
+
libraries use so it's drop-in familiar:
|
|
276
|
+
|
|
277
|
+
- `main.tf` (resources), `variables.tf` (every input typed, with a `description`
|
|
278
|
+
and a `validation` block where it helps), `outputs.tf`, `versions.tf` /
|
|
279
|
+
`providers.tf` (`required_version` + `required_providers` pinned), `README.md`
|
|
280
|
+
(usage + inputs/outputs), and a `CHANGELOG.md` if the repo versions modules.
|
|
281
|
+
- Do **not** generate `examples/` fixtures. Document usage in the module's
|
|
282
|
+
`README.md` instead; test coverage comes from the opt-in terratest scaffold
|
|
283
|
+
(see below), which plans the module directly.
|
|
284
|
+
|
|
285
|
+
### Module-source-aware fixes
|
|
286
|
+
|
|
287
|
+
Before fixing a concern, call `terraform_module_graph` to see where the file
|
|
288
|
+
lives in the module call-graph:
|
|
289
|
+
|
|
290
|
+
- **Concern inside a LOCAL module dir** (listed in `local_module_dirs`): fix it
|
|
291
|
+
**once at the module source**. The fix propagates to every caller — do not
|
|
292
|
+
patch each call site. Note the callers in the PR body so a reviewer sees the
|
|
293
|
+
blast radius.
|
|
294
|
+
- **Concern that would require editing a REGISTRY / git / remote module**: that
|
|
295
|
+
source lives outside this repo — you **cannot** fix it here. Do **not** vendor
|
|
296
|
+
the module or fork it inline. Instead report it (open an issue / PR comment)
|
|
297
|
+
naming the upstream module + version and the concern, so a human routes it.
|
|
298
|
+
|
|
299
|
+
### Modularization as remediation (M2)
|
|
300
|
+
|
|
301
|
+
`module_extraction_candidates` finds clusters of raw resources that should be a
|
|
302
|
+
module call, each matched against the repo's house modules (real resource-type
|
|
303
|
+
signature + `required_variables`) and the operator's `module_catalogue`. Turn a
|
|
304
|
+
candidate into a refactor PR under this contract:
|
|
305
|
+
|
|
306
|
+
- **One PR per cluster**, branch `remediate/modularize-<cluster file/prefix>` —
|
|
307
|
+
never mix two clusters or a behavioural fix into a modularization PR.
|
|
308
|
+
- Replace the cluster's raw resources with ONE `module` block calling the
|
|
309
|
+
candidate (pin the version for registry sources; wire the module's REAL
|
|
310
|
+
variable names from `required_variables` / `terraform_module_interface` for a
|
|
311
|
+
local module, or `terraform_module_lookup` for a registry-sourced one).
|
|
312
|
+
- **Preserve state with `moved {}` blocks** — one per resource, mapping the old
|
|
313
|
+
address to its new `module.<name>.` address:
|
|
314
|
+
|
|
315
|
+
```hcl
|
|
316
|
+
moved {
|
|
317
|
+
from = aws_s3_bucket.logs
|
|
318
|
+
to = module.logging.aws_s3_bucket.this
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
- **The gate:** the PR may proceed only when `terraform_validate` passes AND
|
|
323
|
+
`terraform_plan` reports `refactor_safe: true` (a pure-move plan — zero
|
|
324
|
+
add/change/destroy). Anything else means a moved block is wrong or the module
|
|
325
|
+
diverges from the raw resources — fix that or report it; never accept
|
|
326
|
+
resource churn as "the refactor".
|
|
327
|
+
- A required variable you can't derive from the existing attributes is a
|
|
328
|
+
**PR question for the reviewer**, never a guessed value.
|
|
329
|
+
|
|
330
|
+
### Version currency (provider + module upgrades)
|
|
331
|
+
|
|
332
|
+
`terraform_version_currency` reports which pinned providers and registry modules
|
|
333
|
+
trail the registry's latest stable version, and which registry modules are
|
|
334
|
+
unpinned. Turn its rows into upgrade PRs under this contract:
|
|
335
|
+
|
|
336
|
+
- **One `chore(deps)` PR per upgrade group** — never mix a version bump with a
|
|
337
|
+
behavioural fix; a bump PR must read as "only the constraint changed".
|
|
338
|
+
- **Minor/patch bumps** (`outdated` with `majors_behind: 0`) may proceed
|
|
339
|
+
autonomously: update the `version` constraint to admit `newest_satisfying` →
|
|
340
|
+
`latest`, then prove it with `terraform_validate` (and `terraform_plan` when
|
|
341
|
+
credentials exist).
|
|
342
|
+
- **Major bumps** (`majors_behind > 0`) mean the provider/module interface may
|
|
343
|
+
have changed — apply only with the `needs-human` label, and consult
|
|
344
|
+
`terraform_module_interface` / `terraform_provider_schema` for what moved.
|
|
345
|
+
- **Unpinned registry modules**: pin to the reported `latest` (`version = "~> X.Y"`),
|
|
346
|
+
one PR for all unpinned modules in a file group — pinning is low-risk and sweeps well.
|
|
347
|
+
- An upgrade whose `terraform_plan` shows **destructive changes is never auto** —
|
|
348
|
+
escalate with the plan excerpt in the PR body.
|
|
349
|
+
|
|
350
|
+
## Tests for modules
|
|
351
|
+
|
|
352
|
+
Infraweaver does **not** create or edit `examples/` fixtures — leave any the repo
|
|
353
|
+
already ships untouched. Module test coverage is **opt-in** via the `terratest`
|
|
354
|
+
input:
|
|
355
|
+
|
|
356
|
+
- **Terratest (opt-in).** When the `terratest` input is enabled, call
|
|
357
|
+
`scaffold_terratest` (module name + dir) to generate a plan-only Go
|
|
358
|
+
[Terratest](https://terratest.gruntwork.io/) smoke test (`test/<name>_test.go`)
|
|
359
|
+
**and** a Terraform-native `*.tftest.hcl` in the module's own `tests/` dir.
|
|
360
|
+
Both plan the **module directly** (no example fixture). Write the returned files
|
|
361
|
+
(the input also widens `allowed_paths` to permit them). If the repo already has
|
|
362
|
+
a Terratest suite, update its options/assertions to match the new interface
|
|
363
|
+
instead.
|
|
364
|
+
|
|
365
|
+
In all cases: Infraweaver **never runs** the tests — it holds no cloud credentials,
|
|
366
|
+
and Terratest needs Go + a real `apply`. It keeps the test source consistent with
|
|
367
|
+
the module and flags in the PR that the suite should be run in the user's
|
|
368
|
+
pipeline. **Never weaken an assertion or delete a test to go green.**
|
|
369
|
+
|
|
370
|
+
## Hard rules
|
|
371
|
+
|
|
372
|
+
- Only modify `*.tf` / `*.tfvars` (and, when `allowed_paths` permits — i.e. the
|
|
373
|
+
`terratest` input is on — that module's test files). Never touch CI, application
|
|
374
|
+
code, or unrelated config in a remediation PR.
|
|
375
|
+
- One concern per PR. If you notice other issues, leave them for their own runs.
|
|
376
|
+
- Never auto-merge. The PR is for a human to review.
|
|
377
|
+
- If you cannot fix a concern cleanly (it needs a human decision, or the secure
|
|
378
|
+
default would break the stack), do **not** open a broken PR — report it
|
|
379
|
+
instead with what's blocking.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { DispatchRecorder } from "#app/agents/dispatchMetrics";
|
|
2
|
+
import type { AgentUsage } from "#app/agents/shared";
|
|
3
|
+
import { type ScanSession } from "#app/mcp/terraform/scanSession";
|
|
4
|
+
import type { PrepResult } from "#app/prep/types";
|
|
5
|
+
import type { AgentDiagnostic } from "#app/utils/agentHangReport";
|
|
6
|
+
import type { DiffCoverageState } from "#app/utils/diffCoverage";
|
|
7
|
+
import { type ProgressComment, type ProgressCommentType } from "#app/utils/progressComment";
|
|
8
|
+
import type { UserFacingLanguage } from "#app/utils/payload";
|
|
9
|
+
import type { TodoTracker } from "#app/utils/todoTracking";
|
|
10
|
+
export type BackgroundProcess = {
|
|
11
|
+
pid: number;
|
|
12
|
+
outputPath: string;
|
|
13
|
+
pidPath: string;
|
|
14
|
+
};
|
|
15
|
+
export type StoredPushDest = {
|
|
16
|
+
remoteName: string;
|
|
17
|
+
remoteBranch: string;
|
|
18
|
+
localBranch: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Valid inline-comment anchor lines per side at a particular checkout SHA.
|
|
22
|
+
* Lives here (not in `mcp/review.ts`) so `ToolState` — which caches
|
|
23
|
+
* `Map<path, CommentableLines>` per checkout — does not pull the MCP server
|
|
24
|
+
* graph into every consumer of run state (the action's main loop, agent
|
|
25
|
+
* harnesses, cf-worker indexing).
|
|
26
|
+
*/
|
|
27
|
+
export type CommentableLines = {
|
|
28
|
+
RIGHT: Set<number>;
|
|
29
|
+
LEFT: Set<number>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* mutable per-run record of facts that occurred during execution. shared
|
|
33
|
+
* between the action process and the MCP server (one process — toolState is
|
|
34
|
+
* just a JS object passed by reference into both surfaces).
|
|
35
|
+
*
|
|
36
|
+
* design rule: ToolState is LITERAL. each field records a thing that
|
|
37
|
+
* happened — `review` is set when `create_pull_request_review` succeeded,
|
|
38
|
+
* `finalSummaryWritten` flips when `report_progress` wrote a non-plan body,
|
|
39
|
+
* `selectedMode` is set when `select_mode` was called. fields should never
|
|
40
|
+
* encode the absence of an event ("unsubmittedReview", "missingArtifact"),
|
|
41
|
+
* speculative state, or values derived from other fields.
|
|
42
|
+
*
|
|
43
|
+
* any predicate the rest of the code needs ("the agent picked review mode but
|
|
44
|
+
* never produced a review or progress write") is computed inline at the call
|
|
45
|
+
* site, not stored. derived state in this struct invariably drifts from the
|
|
46
|
+
* literal fields under refactors and is the wrong layer for the check.
|
|
47
|
+
*
|
|
48
|
+
* write narrowly: prefer adding state inside the tool that mutates it (e.g.
|
|
49
|
+
* `create_pull_request_review` populates `toolState.review`) and reading
|
|
50
|
+
* narrowly elsewhere. don't introduce flags from main.ts that mirror what an
|
|
51
|
+
* MCP tool already records.
|
|
52
|
+
*/
|
|
53
|
+
export interface ToolState {
|
|
54
|
+
pushUrl?: string;
|
|
55
|
+
pushDest?: StoredPushDest;
|
|
56
|
+
initialHead?: {
|
|
57
|
+
kind: "branch";
|
|
58
|
+
name: string;
|
|
59
|
+
} | {
|
|
60
|
+
kind: "detached";
|
|
61
|
+
sha: string;
|
|
62
|
+
};
|
|
63
|
+
issueNumber?: number;
|
|
64
|
+
createdTargets?: Set<number>;
|
|
65
|
+
checkoutSha?: string;
|
|
66
|
+
commentableLinesByFile?: Map<string, CommentableLines>;
|
|
67
|
+
commentableLinesPullNumber?: number;
|
|
68
|
+
commentableLinesCheckoutSha?: string | undefined;
|
|
69
|
+
beforeSha?: string;
|
|
70
|
+
selectedMode?: string;
|
|
71
|
+
remediationPrsOpened?: number;
|
|
72
|
+
scanSession?: ScanSession;
|
|
73
|
+
prepushFailureCount: number;
|
|
74
|
+
backgroundProcesses: Map<string, BackgroundProcess>;
|
|
75
|
+
review?: {
|
|
76
|
+
id: number;
|
|
77
|
+
nodeId: string;
|
|
78
|
+
reviewedSha: string | undefined;
|
|
79
|
+
};
|
|
80
|
+
reviewReplies?: Map<number, {
|
|
81
|
+
commentId: number;
|
|
82
|
+
url: string | undefined;
|
|
83
|
+
bodyWithFooter: string;
|
|
84
|
+
}>;
|
|
85
|
+
dependencyInstallation?: {
|
|
86
|
+
status: "not_started" | "in_progress" | "completed" | "failed";
|
|
87
|
+
promise: Promise<PrepResult[]> | undefined;
|
|
88
|
+
results: PrepResult[] | undefined;
|
|
89
|
+
};
|
|
90
|
+
progressComment: ProgressComment | null | undefined;
|
|
91
|
+
hadProgressComment: boolean;
|
|
92
|
+
lastProgressBody?: string;
|
|
93
|
+
wasUpdated?: boolean;
|
|
94
|
+
finalSummaryWritten?: boolean;
|
|
95
|
+
answerCommentPosted?: boolean;
|
|
96
|
+
existingPlanCommentId?: number;
|
|
97
|
+
previousPlanBody?: string;
|
|
98
|
+
summaryFilePath?: string;
|
|
99
|
+
summarySeed?: string;
|
|
100
|
+
summaryPersistAttempted?: boolean;
|
|
101
|
+
learningsFilePath?: string;
|
|
102
|
+
learningsSeed?: string;
|
|
103
|
+
learningsPersistAttempted?: boolean;
|
|
104
|
+
output?: string | undefined;
|
|
105
|
+
usageEntries: AgentUsage[];
|
|
106
|
+
dispatchMetrics: DispatchRecorder;
|
|
107
|
+
model?: string | undefined;
|
|
108
|
+
modelFallback?: {
|
|
109
|
+
from: string;
|
|
110
|
+
} | undefined;
|
|
111
|
+
language?: UserFacingLanguage | undefined;
|
|
112
|
+
todoTracker?: TodoTracker | undefined;
|
|
113
|
+
diffCoverage?: DiffCoverageState | undefined;
|
|
114
|
+
agentDiagnostic?: AgentDiagnostic | undefined;
|
|
115
|
+
}
|
|
116
|
+
interface InitToolStateParams {
|
|
117
|
+
progressComment: {
|
|
118
|
+
id: string;
|
|
119
|
+
type: ProgressCommentType;
|
|
120
|
+
} | undefined;
|
|
121
|
+
}
|
|
122
|
+
export declare function initToolState(params: InitToolStateParams): ToolState;
|
|
123
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generic `spawn()` idle default for ordinary short-lived subprocesses (prep
|
|
3
|
+
* probes, package-manager invocations, dependency installs). these should be
|
|
4
|
+
* producing output steadily, so a comparatively tight budget catches a wedged
|
|
5
|
+
* command promptly. the long-silent-tool tolerance the agent harnesses need
|
|
6
|
+
* lives in AGENT_ACTIVITY_TIMEOUT_MS, applied explicitly at those sites.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_ACTIVITY_TIMEOUT_MS = 300000;
|
|
9
|
+
/**
|
|
10
|
+
* flat idle budget for the agent activity watchdog (the outer process-output
|
|
11
|
+
* monitor, the v1 harness spawns, and the v2 inner event-silence watchdog).
|
|
12
|
+
* sized to exceed the worst-case legitimate silent tool window (issue #760:
|
|
13
|
+
* `checkout_pr` git fetch+deepen on a large monorepo, ~4-5min) with generous
|
|
14
|
+
* headroom, so no single in-flight tool call can be mistaken for a stall. a
|
|
15
|
+
* timeout this generous needs no suspend/resume bracketing — the cost of a
|
|
16
|
+
* genuinely hung run is only GitHub Actions minutes, not tokens.
|
|
17
|
+
*/
|
|
18
|
+
export declare const AGENT_ACTIVITY_TIMEOUT_MS = 900000;
|
|
19
|
+
export declare const DEFAULT_ACTIVITY_CHECK_INTERVAL_MS = 5000;
|
|
20
|
+
export declare const ACTIVITY_NOISE_PATTERNS: readonly RegExp[];
|
|
21
|
+
export declare function isActivityNoise(chunk: string | Uint8Array): boolean;
|
|
22
|
+
type ActivityTimeoutContext = {
|
|
23
|
+
timeoutMs: number;
|
|
24
|
+
checkIntervalMs: number;
|
|
25
|
+
};
|
|
26
|
+
export type ActivityTimeout = {
|
|
27
|
+
promise: Promise<never>;
|
|
28
|
+
stop: () => void;
|
|
29
|
+
/** force the timeout to reject immediately with a custom reason */
|
|
30
|
+
forceReject: (reason: string) => void;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* mark activity to reset the no-output timeout.
|
|
34
|
+
* call this whenever the agent emits any event, even if it isn't logged to stdout.
|
|
35
|
+
*/
|
|
36
|
+
export declare function markActivity(): void;
|
|
37
|
+
/** get the time since last activity in milliseconds. */
|
|
38
|
+
export declare function getIdleMs(): number;
|
|
39
|
+
export declare function createProcessOutputActivityTimeout(ctx: ActivityTimeoutContext): ActivityTimeout;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Agent } from "#app/agents/index";
|
|
2
|
+
/**
|
|
3
|
+
* resolve the effective model for this run.
|
|
4
|
+
*
|
|
5
|
+
* priority:
|
|
6
|
+
* 1. INFRAWEAVER_MODEL env var — resolved through the alias registry first,
|
|
7
|
+
* so values like "anthropic/claude-opus" become "anthropic/claude-opus-4-7".
|
|
8
|
+
* raw specifiers (e.g. "anthropic/claude-opus-4-6") pass through unchanged.
|
|
9
|
+
* always wins — bypasses Bedrock routing entirely. to test a different
|
|
10
|
+
* Bedrock model, change `BEDROCK_MODEL_ID`, not `INFRAWEAVER_MODEL`.
|
|
11
|
+
* 2. slug from repo config / payload → alias registry. routing slugs
|
|
12
|
+
* (e.g. `bedrock/byok`) defer to a separate env var (`BEDROCK_MODEL_ID`).
|
|
13
|
+
* 3. undefined — agent will auto-select.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveModel(ctx: {
|
|
16
|
+
slug?: string | undefined;
|
|
17
|
+
}): string | undefined;
|
|
18
|
+
export declare function resolveAgent(ctx: {
|
|
19
|
+
model?: string | undefined;
|
|
20
|
+
}): Agent;
|
|
21
|
+
/**
|
|
22
|
+
* The single BYOK model gate: resolve the slug, pick the harness, and run the
|
|
23
|
+
* fallback decision in one place. Throws the actionable authorized-model list
|
|
24
|
+
* on the `unavailable` decision (key present but model unroutable — fail loudly,
|
|
25
|
+
* never silently downgrade).
|
|
26
|
+
*/
|
|
27
|
+
export interface ModelGateResult {
|
|
28
|
+
/** the effective model that will run (post-fallback); undefined → auto-select */
|
|
29
|
+
model: string | undefined;
|
|
30
|
+
/** the slug to surface in footers/logs */
|
|
31
|
+
effectiveSlug: string | undefined;
|
|
32
|
+
/** the harness resolved for the effective model */
|
|
33
|
+
agent: Agent;
|
|
34
|
+
/** set only when the free safety-net fallback engaged */
|
|
35
|
+
fallback?: {
|
|
36
|
+
from: string;
|
|
37
|
+
to: string;
|
|
38
|
+
};
|
|
39
|
+
/** operator warnings to log at the orchestration layer */
|
|
40
|
+
warnings: string[];
|
|
41
|
+
/** whether the caller should still run `validateAgentApiKey` */
|
|
42
|
+
validate: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare function resolveModelWithGating(input: {
|
|
45
|
+
slug?: string | undefined;
|
|
46
|
+
authorized: Set<string>;
|
|
47
|
+
}): ModelGateResult;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mutable per-run handle the agent harness writes to as a run progresses.
|
|
3
|
+
* the action's outer try/catch in `main.ts` reads this off `toolState` when
|
|
4
|
+
* the activity-timeout watchdog wins the race against the harness's own
|
|
5
|
+
* catch — the bare timer reject reason ("activity timeout: no output for
|
|
6
|
+
* 302s") tells the user nothing actionable, but `recentStderr` +
|
|
7
|
+
* `lastProviderError` together usually point straight at the upstream cause.
|
|
8
|
+
*
|
|
9
|
+
* `recentStderr` is shared by reference with the harness's bounded ring
|
|
10
|
+
* buffer, so the diagnostic always reflects the latest captured tail.
|
|
11
|
+
*/
|
|
12
|
+
export type AgentDiagnostic = {
|
|
13
|
+
/** display label for the agent, e.g. "Infraweaver". used in the headline. */
|
|
14
|
+
label: string;
|
|
15
|
+
/** shared reference to the harness's bounded stderr ring buffer. */
|
|
16
|
+
recentStderr: string[];
|
|
17
|
+
/** most-recent provider-error label from `detectProviderError`, if any. */
|
|
18
|
+
lastProviderError: string | undefined;
|
|
19
|
+
/** count of stdout events successfully parsed before the failure. */
|
|
20
|
+
eventCount: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Build a user-facing markdown body for an agent hang or failure.
|
|
24
|
+
*
|
|
25
|
+
* Rendered into both the PR progress comment and the GitHub Actions job
|
|
26
|
+
* summary. Returns `null` when no diagnostic is available, which signals to
|
|
27
|
+
* the caller to fall back to its bare-error rendering.
|
|
28
|
+
*
|
|
29
|
+
* `errorMessage` is the underlying timer / spawn reject string (e.g.
|
|
30
|
+
* `activity timeout: no output for 301s`). The idle seconds are parsed out
|
|
31
|
+
* of it for the hang explanation — total runtime would overstate the stall
|
|
32
|
+
* for runs that streamed for a long time before going quiet.
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatAgentHangBody(input: {
|
|
35
|
+
diagnostic: AgentDiagnostic | undefined;
|
|
36
|
+
isHang: boolean;
|
|
37
|
+
errorMessage: string;
|
|
38
|
+
}): string | null;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Concern } from "#app/mcp/terraform/types";
|
|
2
|
+
/** Max annotations emitted per run (GitHub throttles display well below this). */
|
|
3
|
+
export declare const MAX_ANNOTATIONS = 50;
|
|
4
|
+
export interface FindingAnnotation {
|
|
5
|
+
level: "error" | "warning";
|
|
6
|
+
message: string;
|
|
7
|
+
title: string;
|
|
8
|
+
file: string;
|
|
9
|
+
startLine: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build annotation descriptors for the active concerns. `gatingIds` is the set of
|
|
13
|
+
* concern ids that fail the gate (new high/critical) — those become `error`s,
|
|
14
|
+
* sorted first so they survive the cap. Concerns with no file location are skipped
|
|
15
|
+
* (an annotation needs a file to anchor to).
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildFindingAnnotations(active: Concern[], gatingIds: ReadonlySet<string>, max?: number): FindingAnnotation[];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CloudFetchOptions } from "#app/utils/cloudFetchCore";
|
|
2
|
+
export type ApiFetchOptions = CloudFetchOptions;
|
|
3
|
+
/**
|
|
4
|
+
* fetch wrapper for hitting the Infraweaver API. the transport concerns —
|
|
5
|
+
* default host, host allowlist, Vercel bypass secret, default timeout —
|
|
6
|
+
* live in cloudFetchCore.ts, shared with the stdlib-only post hook.
|
|
7
|
+
*
|
|
8
|
+
* requests without an explicit `signal` get the core's default timeout, so a
|
|
9
|
+
* stalled backend can't hang the action.
|
|
10
|
+
*/
|
|
11
|
+
export declare function apiFetch(options: ApiFetchOptions): Promise<Response>;
|