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,136 @@
|
|
|
1
|
+
import type { ExternalFinding } from "#app/mcp/terraform/cspm";
|
|
2
|
+
import type { Severity } from "#app/mcp/terraform/types";
|
|
3
|
+
/**
|
|
4
|
+
* Prowler OCSF ingestion (CSPM phase 1).
|
|
5
|
+
*
|
|
6
|
+
* Prowler is an Apache-2.0 live-cloud CSPM scanner. Infraweaver CONSUMES its
|
|
7
|
+
* findings and never runs it: the customer runs Prowler in their own CI with
|
|
8
|
+
* their own cloud credentials and Infraweaver ingests the resulting JSON. The
|
|
9
|
+
* zero-credential invariant is unchanged — this module only parses a file.
|
|
10
|
+
*
|
|
11
|
+
* Prowler writes OCSF `DetectionFinding` objects (class_uid 2004) as a single
|
|
12
|
+
* JSON ARRAY, not NDJSON. Field locations follow the OCSF 1.x DetectionFinding
|
|
13
|
+
* schema; `severity_id` is the OCSF enum (0 Unknown, 1 Informational, 2 Low,
|
|
14
|
+
* 3 Medium, 4 High, 5 Critical, 6 Fatal), which is deliberately NOT routed
|
|
15
|
+
* through `normalizeExternalSeverity()` — that function reads bare numbers as
|
|
16
|
+
* CVSS scores and would silently downgrade a Critical (5) to medium.
|
|
17
|
+
*
|
|
18
|
+
* Output is the existing `ExternalFinding` shape, so everything downstream —
|
|
19
|
+
* correlation, concern building, grouping, the Cloud report — is unchanged.
|
|
20
|
+
*/
|
|
21
|
+
/** OCSF `type_uid` for DetectionFinding: Create — what Prowler emits. */
|
|
22
|
+
export declare const DETECTION_FINDING_CREATE = 200401;
|
|
23
|
+
declare const ProwlerFinding: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
24
|
+
metadata?: {
|
|
25
|
+
event_code?: string;
|
|
26
|
+
product?: {
|
|
27
|
+
name?: string;
|
|
28
|
+
version?: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
status_code?: string;
|
|
32
|
+
status?: string;
|
|
33
|
+
status_detail?: string;
|
|
34
|
+
message?: string;
|
|
35
|
+
severity?: string;
|
|
36
|
+
severity_id?: number;
|
|
37
|
+
finding_info?: {
|
|
38
|
+
title?: string;
|
|
39
|
+
desc?: string;
|
|
40
|
+
};
|
|
41
|
+
remediation?: {
|
|
42
|
+
desc?: string;
|
|
43
|
+
references?: string[];
|
|
44
|
+
};
|
|
45
|
+
resources?: {
|
|
46
|
+
uid?: string;
|
|
47
|
+
name?: string;
|
|
48
|
+
type?: string;
|
|
49
|
+
region?: string;
|
|
50
|
+
labels?: string[];
|
|
51
|
+
}[];
|
|
52
|
+
cloud?: {
|
|
53
|
+
provider?: string;
|
|
54
|
+
account?: {
|
|
55
|
+
uid?: string;
|
|
56
|
+
};
|
|
57
|
+
region?: string;
|
|
58
|
+
};
|
|
59
|
+
type_uid?: number;
|
|
60
|
+
unmapped?: object;
|
|
61
|
+
}, {}>;
|
|
62
|
+
export type ProwlerFindingInput = typeof ProwlerFinding.infer;
|
|
63
|
+
/**
|
|
64
|
+
* True for a parsed value that looks like a Prowler OCSF feed: a non-empty array
|
|
65
|
+
* whose first item is a DetectionFinding or carries Prowler's product name.
|
|
66
|
+
* Checked BEFORE the native `infraweaver.external-findings/v1` validator, which is
|
|
67
|
+
* safe because the native feed is an OBJECT and this requires a non-empty ARRAY —
|
|
68
|
+
* the two shapes cannot collide, so existing feeds keep their exact behaviour.
|
|
69
|
+
*/
|
|
70
|
+
export declare function isProwlerOcsf(parsed: unknown): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Detect a Prowler output file that was never closed. Prowler streams `[`, then
|
|
73
|
+
* findings, and only seeks back to write `]` when the scan completes — so a
|
|
74
|
+
* crashed or still-running scan leaves an unterminated array that `JSON.parse`
|
|
75
|
+
* rejects with a message no operator can act on.
|
|
76
|
+
*/
|
|
77
|
+
export declare function isUnterminatedJsonArray(raw: string): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Resolve a finding's severity: the OCSF severity NAME first (what Prowler
|
|
80
|
+
* writes), then the numeric enum, then `medium` — matching the default the
|
|
81
|
+
* existing external-findings path uses when a feed says nothing.
|
|
82
|
+
*/
|
|
83
|
+
export declare function prowlerSeverity(finding: ProwlerFindingInput): Severity;
|
|
84
|
+
/** True when a Prowler compliance key names a framework we may lawfully carry. */
|
|
85
|
+
export declare function isFreeFrameworkKey(key: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* The free-framework compliance references a finding carries, as
|
|
88
|
+
* `FRAMEWORK: req-id` strings. Paywalled frameworks are dropped silently and by
|
|
89
|
+
* design. Returns [] when the finding carries none.
|
|
90
|
+
*/
|
|
91
|
+
export declare function freeComplianceRefs(finding: ProwlerFindingInput): string[];
|
|
92
|
+
export interface ProwlerParseResult {
|
|
93
|
+
/** FAIL findings mapped into the shared external-finding shape. */
|
|
94
|
+
findings: ExternalFinding[];
|
|
95
|
+
summary: {
|
|
96
|
+
total: number;
|
|
97
|
+
/** mapped to concerns (status_code FAIL, not muted). */
|
|
98
|
+
failed: number;
|
|
99
|
+
passed: number;
|
|
100
|
+
manual: number;
|
|
101
|
+
/** muted by the customer's Prowler mutelist — user intent we honour. */
|
|
102
|
+
muted: number;
|
|
103
|
+
/** items that did not match the DetectionFinding shape at all. */
|
|
104
|
+
malformed: number;
|
|
105
|
+
/** items whose `status_code` is one we do not model — distinct from malformed,
|
|
106
|
+
* so an operator can tell "new Prowler status" from "not a finding". */
|
|
107
|
+
unknown_status: number;
|
|
108
|
+
/** `metadata.product.version`, when the feed declared one. */
|
|
109
|
+
product_version: string | null;
|
|
110
|
+
/** set when type_uid drifted from the expected DetectionFinding value. */
|
|
111
|
+
schema_warning: string | null;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Parse a Prowler OCSF array into external findings + an honest tally.
|
|
116
|
+
*
|
|
117
|
+
* Only `status_code === "FAIL"` findings become concerns. PASS/MANUAL and muted
|
|
118
|
+
* findings are COUNTED but never mapped: a passing check is not a defect, and
|
|
119
|
+
* Prowler's mutelist is user-authored intent. The counts still matter — phase-2
|
|
120
|
+
* requirement coverage needs to say "3 checks FAIL, 12 PASS" rather than
|
|
121
|
+
* treating absence as unknown.
|
|
122
|
+
*
|
|
123
|
+
* Pure: no fs, no network.
|
|
124
|
+
*/
|
|
125
|
+
export declare function parseProwlerOcsf(items: readonly unknown[]): ProwlerParseResult;
|
|
126
|
+
/**
|
|
127
|
+
* The identity-bearing cloud tags a Prowler finding carries, lower-cased, as
|
|
128
|
+
* last-resort correlation hints.
|
|
129
|
+
*
|
|
130
|
+
* Two filters, both about not mis-mapping: only identity keys (above), and only
|
|
131
|
+
* values long enough to identify something — a short value like `eu` would match
|
|
132
|
+
* half the repo. A wrong mapping is worse than an honest unmapped alert, because
|
|
133
|
+
* it puts a real cloud finding on an unrelated line of someone's code.
|
|
134
|
+
*/
|
|
135
|
+
export declare function tagHints(labels: readonly string[] | undefined): string[];
|
|
136
|
+
export {};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refactor equivalence proof (Phase A — the "safe floor").
|
|
3
|
+
*
|
|
4
|
+
* The `refactor` verb relocates resources behind a module boundary and asserts
|
|
5
|
+
* behaviour is unchanged. The PROOF that backs that assertion has two layers:
|
|
6
|
+
*
|
|
7
|
+
* - the keys-free STATIC proof in this file (no cloud creds): same managed
|
|
8
|
+
* resource set, identical per-resource argument names, and — the highest-risk
|
|
9
|
+
* invariant — EVERY relocated address covered by a `moved {}` block, plus
|
|
10
|
+
* `terraform validate` and `terraform fmt -check` clean. `computeEquivalence`
|
|
11
|
+
* hard-fails on a single uncovered move: a missed `moved {}` is a silent
|
|
12
|
+
* destroy/create on live infrastructure (a sin of commission), so the gate
|
|
13
|
+
* must refuse rather than warn.
|
|
14
|
+
* - the OPTIONAL stronger proof (cloud creds present): a real `terraform plan`
|
|
15
|
+
* that is a pure-move plan (`isPureMovePlan` in plan.ts). That is corroboration
|
|
16
|
+
* layered on top of this floor, never a substitute for it.
|
|
17
|
+
*
|
|
18
|
+
* Everything here is pure parsing + set arithmetic over file contents — the tool
|
|
19
|
+
* wrapper supplies the before-tree (via `git show <base>:<path>`) and the
|
|
20
|
+
* after-tree (the working tree on disk), mirroring moduleExtraction.ts.
|
|
21
|
+
*
|
|
22
|
+
* `moved {}` semantics anchor:
|
|
23
|
+
* https://developer.hashicorp.com/terraform/language/modules/develop/refactoring
|
|
24
|
+
* moved { from = aws_instance.example to = module.ec2.aws_instance.example }
|
|
25
|
+
*/
|
|
26
|
+
import type { LocalToolContext } from "#app/mcp/localContext";
|
|
27
|
+
import { type ModuleSourceKind } from "#app/mcp/modules";
|
|
28
|
+
export interface ResourceRef {
|
|
29
|
+
/** full Terraform address, module-prefixed: `module.x.aws_s3_bucket.logs`. */
|
|
30
|
+
address: string;
|
|
31
|
+
/** the resource's logical identity, module-path-independent: `aws_s3_bucket.logs`. */
|
|
32
|
+
key: string;
|
|
33
|
+
type: string;
|
|
34
|
+
name: string;
|
|
35
|
+
/** sorted top-level argument names (attributes + nested block labels). */
|
|
36
|
+
argNames: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface MovedBlock {
|
|
39
|
+
from: string;
|
|
40
|
+
to: string;
|
|
41
|
+
}
|
|
42
|
+
export interface SourceFile {
|
|
43
|
+
/** repo-relative path, posix-separated. */
|
|
44
|
+
path: string;
|
|
45
|
+
hcl: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse every top-level `moved { from = <addr> to = <addr> }` block from HCL.
|
|
49
|
+
* Addresses are unquoted Terraform traversals (`module.x.aws_s3_bucket.logs`,
|
|
50
|
+
* `aws_instance.example[0]`), so the value is captured raw up to the line end or
|
|
51
|
+
* a trailing comment. Brace-matched so a stray `{}` in a comment can't fool it.
|
|
52
|
+
* A block missing either `from` or `to` is skipped (incomplete, not a relocation).
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseMovedBlocks(hcl: string): MovedBlock[];
|
|
55
|
+
/** collapse incidental whitespace so two spellings of the same address compare
|
|
56
|
+
* equal (`module.x . aws_s3_bucket.logs` is not valid HCL, but defensive). */
|
|
57
|
+
export declare function normaliseAddress(addr: string): string;
|
|
58
|
+
/** the leaf `<type>.<name>` of an address, stripping leading `module.X.` hops and
|
|
59
|
+
* any `[index]`/`["key"]` instance suffix. `module.db.aws_db_instance.main[0]`
|
|
60
|
+
* → `aws_db_instance.main`. */
|
|
61
|
+
export declare function addressKey(address: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Attribute every resource in a file tree to its full Terraform address.
|
|
64
|
+
* A resource in a file under a single-caller local module dir is prefixed
|
|
65
|
+
* `module.<caller>.`; a resource at root keeps its bare `<type>.<name>`. A module
|
|
66
|
+
* dir with MULTIPLE callers (instantiated more than once) or NESTED module dirs
|
|
67
|
+
* can't be attributed to one address deterministically — those resources are
|
|
68
|
+
* returned in `ambiguous` so the caller degrades honestly rather than asserting a
|
|
69
|
+
* false address. Pure.
|
|
70
|
+
*/
|
|
71
|
+
export declare function attributeAddresses(files: SourceFile[]): {
|
|
72
|
+
resources: ResourceRef[];
|
|
73
|
+
ambiguous: string[];
|
|
74
|
+
};
|
|
75
|
+
export interface EquivalenceResult {
|
|
76
|
+
/** the overall keys-free verdict: all sub-checks below passed. The push
|
|
77
|
+
* guardrail hard-blocks when this is false. */
|
|
78
|
+
equivalent: boolean;
|
|
79
|
+
/** same multiset of `<type>.<name>` across the whole tree before and after. */
|
|
80
|
+
resource_set_equivalent: boolean;
|
|
81
|
+
/** identical top-level argument names for every resource present in both. */
|
|
82
|
+
arg_names_equivalent: boolean;
|
|
83
|
+
/** every relocated address is covered by a `moved {}` block (zero uncovered).
|
|
84
|
+
* THE highest-risk invariant — a false here means a silent destroy/create. */
|
|
85
|
+
moves_exhaustive: boolean;
|
|
86
|
+
/** count of address relocations detected between before and after. */
|
|
87
|
+
moves_detected: number;
|
|
88
|
+
/** the relocations we detected (the authoritative move set). */
|
|
89
|
+
expected_moves: MovedBlock[];
|
|
90
|
+
/** relocations with NO matching `moved {}` block — the hard-fail set. */
|
|
91
|
+
uncovered_moves: MovedBlock[];
|
|
92
|
+
/** `moved {}` blocks that match no detected relocation (likely a typo'd
|
|
93
|
+
* `to`/`from` — surfaced, but not on its own a hard-fail). */
|
|
94
|
+
spurious_moved_blocks: MovedBlock[];
|
|
95
|
+
/** logical keys added / removed between before and after (must be empty for
|
|
96
|
+
* an equivalence-preserving refactor; a non-empty `added` is the b.4 "adopting
|
|
97
|
+
* a module adds a KMS key" signal — that's an ALTERING change, not equivalence). */
|
|
98
|
+
resource_set_diff: {
|
|
99
|
+
added: string[];
|
|
100
|
+
removed: string[];
|
|
101
|
+
};
|
|
102
|
+
/** per-resource argument-name drift. */
|
|
103
|
+
arg_diffs: {
|
|
104
|
+
resource: string;
|
|
105
|
+
added: string[];
|
|
106
|
+
removed: string[];
|
|
107
|
+
}[];
|
|
108
|
+
/** addresses that couldn't be attributed deterministically (multi-instantiated
|
|
109
|
+
* or nested modules) — equivalence is reported but flagged incomplete. */
|
|
110
|
+
ambiguous: string[];
|
|
111
|
+
/** human-readable reasons the verdict is what it is. */
|
|
112
|
+
reasons: string[];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Compute the keys-free equivalence verdict from the before/after resource
|
|
116
|
+
* address sets and the `moved {}` blocks present in the after tree. Validate/fmt
|
|
117
|
+
* results are merged in by the tool wrapper (they need a subprocess); this pure
|
|
118
|
+
* core proves the three static invariants — resource-set preservation, argument
|
|
119
|
+
* preservation, and moved-block exhaustiveness.
|
|
120
|
+
*/
|
|
121
|
+
export declare function computeEquivalence(before: ResourceRef[], after: ResourceRef[], movedBlocks: MovedBlock[], ambiguous?: string[]): EquivalenceResult;
|
|
122
|
+
/**
|
|
123
|
+
* Generate one `moved {}` block per resource being relocated under a module call,
|
|
124
|
+
* and the authoritative `expected_moves` list (the denominator
|
|
125
|
+
* `computeEquivalence` checks coverage against). Each input address keeps its
|
|
126
|
+
* leaf `<type>.<name>[index]`; the new address prefixes it with `module.<to_module>.`.
|
|
127
|
+
* Works for root→module and module→module — the
|
|
128
|
+
* leaf is taken after stripping any existing `module.X.` hops.
|
|
129
|
+
*/
|
|
130
|
+
export declare function generateMovedBlocks(addresses: string[], toModule: string): {
|
|
131
|
+
hcl: string;
|
|
132
|
+
expected_moves: MovedBlock[];
|
|
133
|
+
};
|
|
134
|
+
export interface ModuleProvenance {
|
|
135
|
+
/** the local `module "<name>"` call name. */
|
|
136
|
+
name: string;
|
|
137
|
+
source: string;
|
|
138
|
+
/** the pinned version (registry `version`, or a git `?ref=`), or null. */
|
|
139
|
+
version: string | null;
|
|
140
|
+
kind: ModuleSourceKind;
|
|
141
|
+
/** true when the source is pinned to an exact version/ref — the provenance
|
|
142
|
+
* discipline for adopting a third-party module (the analog to a SHA-pinned
|
|
143
|
+
* action). An unpinned external module is a supply-chain risk to flag. */
|
|
144
|
+
pinned: boolean;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Record the provenance of every EXTERNAL module the config calls (registry /
|
|
148
|
+
* git / remote — local modules have in-tree code, no provenance to record).
|
|
149
|
+
* Used by the refactor b.4 evidence: "adopted `<source>` at `<version>`",
|
|
150
|
+
* with `pinned` flagging an unpinned adoption. Pure over the file tree.
|
|
151
|
+
*/
|
|
152
|
+
export declare function collectModuleProvenance(files: SourceFile[]): ModuleProvenance[];
|
|
153
|
+
/** read the workspace's `.tf`/`.tfvars` tree and record external-module
|
|
154
|
+
* provenance (the impure wrapper the evidence bundle calls). */
|
|
155
|
+
export declare function collectWorkspaceProvenance(cwd: string): ModuleProvenance[];
|
|
156
|
+
/** the GitHub label an UNPROVEN b.4 change carries so it is never mistaken for a
|
|
157
|
+
* proven one. Applied to the PR and surfaced in the evidence bundle. */
|
|
158
|
+
export declare const PROPOSED_UNPROVEN_LABEL = "proposed-unproven";
|
|
159
|
+
/**
|
|
160
|
+
* The unmissable PR-body banner for a behaviour-ALTERING b.4 change that ran
|
|
161
|
+
* WITHOUT opt-in read creds (the default): Infraweaver proposes the change but
|
|
162
|
+
* proves nothing about its runtime effect. It must never silently read as a
|
|
163
|
+
* proven/equivalence change. Used verbatim at the top of such a PR's body and
|
|
164
|
+
* mirrored as the `proposed_unproven` marker in the evidence bundle.
|
|
165
|
+
*/
|
|
166
|
+
export declare const PROPOSED_UNPROVEN_BANNER: string;
|
|
167
|
+
export declare const TerraformEquivalenceCheckParams: import("arktype/internal/variants/object.ts").ObjectType<object, {}>;
|
|
168
|
+
export declare function TerraformEquivalenceCheckTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<object, object>> & {
|
|
169
|
+
mutates?: boolean;
|
|
170
|
+
};
|
|
171
|
+
export declare const TerraformGenerateMovedParams: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
172
|
+
resources: string[];
|
|
173
|
+
to_module: string;
|
|
174
|
+
}, {}>;
|
|
175
|
+
export declare function TerraformGenerateMovedTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
176
|
+
resources: string[];
|
|
177
|
+
to_module: string;
|
|
178
|
+
}, {
|
|
179
|
+
resources: string[];
|
|
180
|
+
to_module: string;
|
|
181
|
+
}>> & {
|
|
182
|
+
mutates?: boolean;
|
|
183
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry module intelligence — look up a PUBLISHED module's interface and
|
|
3
|
+
* search the public registry for modules to reuse.
|
|
4
|
+
*
|
|
5
|
+
* Complements `./currency.ts` (which answers "is a newer VERSION available?"):
|
|
6
|
+
* this answers "what does this module EXPECT and EXPOSE?" (root inputs/outputs)
|
|
7
|
+
* and "what published modules exist for this need?". It exists so the agent can
|
|
8
|
+
* wire a `module {}` block against a real, published interface — an organisation's
|
|
9
|
+
* own published modules included — instead of guessing variable names.
|
|
10
|
+
*
|
|
11
|
+
* Read-only, public default registry only (private/TFE hosts are rejected, same
|
|
12
|
+
* scope as the currency check), and degrades green on every failure.
|
|
13
|
+
*/
|
|
14
|
+
import { type LookupStatus } from "#app/mcp/terraform/currency";
|
|
15
|
+
export interface ModuleInput {
|
|
16
|
+
name: string;
|
|
17
|
+
type: string | null;
|
|
18
|
+
description: string | null;
|
|
19
|
+
default: string | null;
|
|
20
|
+
required: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface ModuleOutput {
|
|
23
|
+
name: string;
|
|
24
|
+
description: string | null;
|
|
25
|
+
}
|
|
26
|
+
export interface ModuleDetail {
|
|
27
|
+
source: string;
|
|
28
|
+
version: string | null;
|
|
29
|
+
description: string | null;
|
|
30
|
+
verified: boolean;
|
|
31
|
+
downloads: number | null;
|
|
32
|
+
published_at: string | null;
|
|
33
|
+
provider_dependencies: string[];
|
|
34
|
+
inputs: ModuleInput[];
|
|
35
|
+
outputs: ModuleOutput[];
|
|
36
|
+
}
|
|
37
|
+
/** the default public registry host — a bare `namespace/name/provider` (or a
|
|
38
|
+
* `registry.terraform.io/`-prefixed source) resolves here with no auth. */
|
|
39
|
+
export declare const PUBLIC_REGISTRY_HOST = "registry.terraform.io";
|
|
40
|
+
/** a module lookup's outcome: the shared `LookupStatus` plus two private-registry
|
|
41
|
+
* policy outcomes the tool surfaces with their own message. */
|
|
42
|
+
export type ModuleLookupStatus = LookupStatus | "host_not_allowed" | "auth_required";
|
|
43
|
+
/**
|
|
44
|
+
* Split a module source into its optional registry `host` and the
|
|
45
|
+
* `namespace/name/provider` path. A host-prefixed source
|
|
46
|
+
* (`app.terraform.io/acme/vpc/aws`) targets a PRIVATE registry; a bare
|
|
47
|
+
* `namespace/name/provider` targets the public default registry (host === null).
|
|
48
|
+
* `path` is null when the source isn't a valid module address (the detected host,
|
|
49
|
+
* if any, is still returned for the caller's error message).
|
|
50
|
+
*/
|
|
51
|
+
export declare function splitModuleAddress(source: string): {
|
|
52
|
+
host: string | null;
|
|
53
|
+
path: string | null;
|
|
54
|
+
};
|
|
55
|
+
export interface PrivateRegistryAuth {
|
|
56
|
+
/** the host(s) `token` authorises — a private source's host must be one of them.
|
|
57
|
+
* This is the security boundary: the agent names the source, but we only ever
|
|
58
|
+
* send the token to a host the operator allow-listed via `registry_host`. */
|
|
59
|
+
allowedHosts: string[];
|
|
60
|
+
/** the bearer token, or undefined when the run supplied no `registry_token`. */
|
|
61
|
+
token: string | undefined;
|
|
62
|
+
}
|
|
63
|
+
/** test seam: drop the per-host discovery cache. */
|
|
64
|
+
export declare function _clearModuleDiscoveryCache(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Look up a published module's interface. A bare `namespace/name/provider` hits
|
|
67
|
+
* the public default registry (no auth). A host-prefixed `host/namespace/name/
|
|
68
|
+
* provider` targets a PRIVATE registry (HCP Terraform / Terraform Enterprise / any
|
|
69
|
+
* protocol-compliant registry): the host must be in `auth.allowedHosts` AND a token
|
|
70
|
+
* supplied, then the API base is resolved via service discovery and the detail
|
|
71
|
+
* fetched with `Authorization: Bearer …`. Pass `version` to pin the lookup; omit it
|
|
72
|
+
* for the latest.
|
|
73
|
+
*/
|
|
74
|
+
export declare function fetchModuleDetail(source: string, opts?: {
|
|
75
|
+
version?: string | undefined;
|
|
76
|
+
auth?: PrivateRegistryAuth | undefined;
|
|
77
|
+
/** public-base override (tests). */
|
|
78
|
+
baseUrl?: string;
|
|
79
|
+
}): Promise<{
|
|
80
|
+
status: ModuleLookupStatus;
|
|
81
|
+
module: ModuleDetail | null;
|
|
82
|
+
}>;
|
|
83
|
+
export interface ModuleSearchResult {
|
|
84
|
+
address: string;
|
|
85
|
+
version: string | null;
|
|
86
|
+
description: string | null;
|
|
87
|
+
downloads: number | null;
|
|
88
|
+
verified: boolean;
|
|
89
|
+
}
|
|
90
|
+
export interface ModuleSearchQuery {
|
|
91
|
+
query: string;
|
|
92
|
+
namespace?: string | undefined;
|
|
93
|
+
provider?: string | undefined;
|
|
94
|
+
verified?: boolean | undefined;
|
|
95
|
+
limit?: number | undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* GET /v1/modules/search — discover published modules (the organisation's own
|
|
99
|
+
* namespace included) to REUSE instead of writing raw resources. Public default
|
|
100
|
+
* registry only. `limit` is clamped to a small range to keep the result tight.
|
|
101
|
+
*/
|
|
102
|
+
export declare function searchRegistryModules(params: ModuleSearchQuery, opts?: {
|
|
103
|
+
baseUrl?: string;
|
|
104
|
+
}): Promise<{
|
|
105
|
+
status: LookupStatus;
|
|
106
|
+
modules: ModuleSearchResult[];
|
|
107
|
+
limit: number;
|
|
108
|
+
}>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type NoiseAdjustment, type NoiseProfile } from "#app/mcp/terraform/noiseProfile";
|
|
2
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
3
|
+
export interface RiskFactors {
|
|
4
|
+
severity: number;
|
|
5
|
+
exposure: number;
|
|
6
|
+
fixability: number;
|
|
7
|
+
/** G7: the fleet-noise down-rank applied, as a NEGATIVE contribution. Present
|
|
8
|
+
* only when one applied, so a reader can always reconstruct the score from
|
|
9
|
+
* its parts and see that nothing was adjusted invisibly. */
|
|
10
|
+
noise?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface RiskScore {
|
|
13
|
+
score: number;
|
|
14
|
+
factors: RiskFactors;
|
|
15
|
+
/** the dismissal history behind `factors.noise`, when there is one. */
|
|
16
|
+
noise?: NoiseAdjustment;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Score a concern for SURFACING order.
|
|
20
|
+
*
|
|
21
|
+
* `profile` is the org's fleet-wide dismissal record (G7). It can only ever
|
|
22
|
+
* lower a score, is bounded and floored, and never applies to critical/high —
|
|
23
|
+
* see `noiseProfile.ts` for why a ranking model in an evidence product is
|
|
24
|
+
* allowed to reorder and nothing else. Defaults to empty, so every existing
|
|
25
|
+
* caller keeps the exact scores it had.
|
|
26
|
+
*/
|
|
27
|
+
export declare function scoreConcern(concern: Concern, profile?: NoiseProfile): RiskScore;
|
|
28
|
+
export declare function riskScore(concern: Concern, profile?: NoiseProfile): number;
|
|
29
|
+
export interface RankedConcern {
|
|
30
|
+
concern_id: string;
|
|
31
|
+
rule_id: string;
|
|
32
|
+
severity: Concern["severity"];
|
|
33
|
+
category: Concern["category"];
|
|
34
|
+
location: Concern["location"];
|
|
35
|
+
risk_score: number;
|
|
36
|
+
risk_factors: RiskFactors;
|
|
37
|
+
/** G7: why this was ranked lower, in the org's own words. Present only when a
|
|
38
|
+
* down-rank applied — an unexplained demotion is indistinguishable from a bug. */
|
|
39
|
+
noise_reason?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function topRisks(concerns: Concern[], n?: number, profile?: NoiseProfile): RankedConcern[];
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { ProvenFixPattern } from "#app/mcp/terraform/fixMemory";
|
|
2
|
+
import type { IdleFloorReport } from "#app/mcp/terraform/idleFloor";
|
|
3
|
+
import type { NoiseProfile } from "#app/mcp/terraform/noiseProfile";
|
|
4
|
+
import type { DriftEvidenceStatement } from "#app/mcp/terraform/planDrift";
|
|
5
|
+
import { type ProvenTransform, type TransformMatch, type UpgradeEvidenceStatement, type UpgradeIntent } from "#app/mcp/terraform/transformPacks";
|
|
6
|
+
import type { Concern } from "#app/mcp/terraform/types";
|
|
7
|
+
/**
|
|
8
|
+
* The terraform tool-to-tool session: the explicit, typed channel the terraform
|
|
9
|
+
* MCP tools use to hand results to one another (and to end-of-run reporting)
|
|
10
|
+
* across separate, agent-mediated invocations.
|
|
11
|
+
*
|
|
12
|
+
* This used to be ~11 loose fields on the 69-field `ToolState` god-bag, where
|
|
13
|
+
* the coupling was invisible in every signature and the ordering was silently
|
|
14
|
+
* load-bearing. Naming the channel makes the contract greppable and testable:
|
|
15
|
+
*
|
|
16
|
+
* - `terraform_scan` / `terraform_assess` / `read_findings` POPULATE the
|
|
17
|
+
* baseline (`baselineConcernIds` / `baselineConcernKeys` /
|
|
18
|
+
* `baselineFmtDriftFiles`) and the acted-on set (`lastScanConcerns`).
|
|
19
|
+
* - `terraform_plan` POPULATES `plannedDestroy` + the confidence signals
|
|
20
|
+
* (`lastBlastTier`, `lastIdempotent`); `infracost_diff` populates
|
|
21
|
+
* `lastCostDirection`; `terraform_emit_sarif` sets `emittedSarifPath`;
|
|
22
|
+
* the refactor equivalence check sets `refactorEquivalence` and
|
|
23
|
+
* `terraform_emit_evidence` sets `refactorProposedUnproven`.
|
|
24
|
+
* - `terraform_verify_remediation` CONSUMES the baseline + confidence signals;
|
|
25
|
+
* `terraform_validate` consumes `baselineFmtDriftFiles`; the push guardrails
|
|
26
|
+
* consume `plannedDestroy` / `refactorEquivalence`; end-of-run reporting
|
|
27
|
+
* (`runLifecycle`, `cloudReport`) consumes `lastScanConcerns` /
|
|
28
|
+
* `emittedSarifPath` / the refactor markers.
|
|
29
|
+
*
|
|
30
|
+
* Every field is still LITERAL (records a thing that happened) and every
|
|
31
|
+
* consumer degrades gracefully when its producer didn't run this session
|
|
32
|
+
* (`undefined`), so the ordering is documented here rather than assumed.
|
|
33
|
+
* Reach it through {@link scanSessionOf} so a partially-constructed `ToolState`
|
|
34
|
+
* (chiefly in tests) lazily gets a session rather than throwing.
|
|
35
|
+
*/
|
|
36
|
+
export interface ScanSession {
|
|
37
|
+
baselineConcernIds?: string[];
|
|
38
|
+
baselineConcernKeys?: string[];
|
|
39
|
+
baselineFmtDriftFiles?: string[];
|
|
40
|
+
lastScanConcerns?: Concern[];
|
|
41
|
+
plannedDestroy?: {
|
|
42
|
+
stateful: {
|
|
43
|
+
address: string;
|
|
44
|
+
action: string;
|
|
45
|
+
type: string;
|
|
46
|
+
}[];
|
|
47
|
+
ephemeral: {
|
|
48
|
+
address: string;
|
|
49
|
+
action: string;
|
|
50
|
+
type: string;
|
|
51
|
+
}[];
|
|
52
|
+
};
|
|
53
|
+
lastBlastTier?: "low" | "medium" | "high";
|
|
54
|
+
lastIdempotent?: boolean;
|
|
55
|
+
lastCostDirection?: "increase" | "decrease" | "no-change" | "unknown";
|
|
56
|
+
lastIdleFloor?: IdleFloorReport | undefined;
|
|
57
|
+
lastDrift?: DriftEvidenceStatement | undefined;
|
|
58
|
+
emittedSarifPath?: string;
|
|
59
|
+
refactorEquivalence?: {
|
|
60
|
+
equivalent: boolean;
|
|
61
|
+
resource_set_equivalent: boolean;
|
|
62
|
+
arg_names_equivalent: boolean;
|
|
63
|
+
moves_exhaustive: boolean;
|
|
64
|
+
moves_detected: number;
|
|
65
|
+
validate_passed: boolean;
|
|
66
|
+
fmt_clean: boolean;
|
|
67
|
+
uncovered_moves: {
|
|
68
|
+
from: string;
|
|
69
|
+
to: string;
|
|
70
|
+
}[];
|
|
71
|
+
reasons: string[];
|
|
72
|
+
};
|
|
73
|
+
refactorProposedUnproven?: boolean;
|
|
74
|
+
fixMemoryLibrary?: ProvenFixPattern[];
|
|
75
|
+
noiseProfile?: NoiseProfile;
|
|
76
|
+
provenFixCaptures?: ProvenFixPattern[];
|
|
77
|
+
provenTransformLibrary?: ProvenTransform[];
|
|
78
|
+
transformMatches?: TransformMatch[];
|
|
79
|
+
upgradeIntent?: UpgradeIntent;
|
|
80
|
+
lastPlanTotals?: {
|
|
81
|
+
to_add: number;
|
|
82
|
+
to_change: number;
|
|
83
|
+
to_destroy: number;
|
|
84
|
+
destructive: number;
|
|
85
|
+
};
|
|
86
|
+
planFollowedUpgradeDetection?: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The TC-2.2 upgrade statement for this session, or undefined when no provider
|
|
90
|
+
* pack applied.
|
|
91
|
+
*
|
|
92
|
+
* Deliberately computed in ONE place. Two consumers need it — the signed
|
|
93
|
+
* evidence bundle and the fleet report — and if each assembled the plan facts
|
|
94
|
+
* itself they could disagree, which would mean telling an org that a transform
|
|
95
|
+
* planned cleanly while the signed artefact for that same run said otherwise.
|
|
96
|
+
*/
|
|
97
|
+
export declare function upgradeStatementOf(session: ScanSession): UpgradeEvidenceStatement | undefined;
|
|
98
|
+
/** A fresh, empty terraform session. */
|
|
99
|
+
export declare function createScanSession(): ScanSession;
|
|
100
|
+
/**
|
|
101
|
+
* The single entry point to the terraform session on a `ToolState`. Lazily
|
|
102
|
+
* initializes it, so a partially-constructed `ToolState` (chiefly test fixtures
|
|
103
|
+
* that cast `{}`) still reads and writes safely rather than dereferencing
|
|
104
|
+
* `undefined`. In production `initToolState` seeds it, so this only ever
|
|
105
|
+
* lazy-creates for such fixtures.
|
|
106
|
+
*/
|
|
107
|
+
export declare function scanSessionOf(toolState: {
|
|
108
|
+
scanSession?: ScanSession;
|
|
109
|
+
}): ScanSession;
|
|
110
|
+
/**
|
|
111
|
+
* true once terraform_scan / read_findings captured a pre-fix baseline this
|
|
112
|
+
* session. terraform_verify_remediation key-maps requested ids against the
|
|
113
|
+
* baseline when this holds, and reports regressions on that basis; otherwise it
|
|
114
|
+
* falls back to raw-id matching and marks regressions as unchecked.
|
|
115
|
+
*/
|
|
116
|
+
export declare function hasBaseline(session: ScanSession): boolean;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type RunScannersOptions } from "#app/mcp/terraform/scanners";
|
|
2
|
+
import type { ScannerOutcome } from "#app/mcp/terraform/types";
|
|
3
|
+
/** Content hash of every Terraform file under `cwd` (sorted for determinism),
|
|
4
|
+
* mixed with an `extra` signature (the toolchain). Reading the files is cheap
|
|
5
|
+
* next to running Trivy/Checkov, and hashing CONTENT (not mtime) means an edit
|
|
6
|
+
* that rewrites a file in place still busts the key. */
|
|
7
|
+
export declare function treeHash(cwd: string, extra: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* `runScanners` with a per-process, tree-content-keyed cache — ONLY for the
|
|
10
|
+
* read-only scan path. Identical signature to `runScanners`. Never call this from
|
|
11
|
+
* the verifier; call `runScanners` there so it always re-scans fresh.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runScannersCached(cwd: string, opts?: RunScannersOptions): ScannerOutcome[];
|
|
14
|
+
/** Drop the cache (test isolation / explicit invalidation). */
|
|
15
|
+
export declare function clearScannerCache(): void;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-scanner network egress control (supply-chain phase 0.2).
|
|
3
|
+
*
|
|
4
|
+
* THE THREAT. The TeamPCP trivy payload dumped runner memory and *called home* —
|
|
5
|
+
* the breach was the exfiltration, not the dump. The 0.1 integrity gate refuses
|
|
6
|
+
* builds we KNOW are compromised; this bounds the ones we don't: a scanner that
|
|
7
|
+
* cannot egress is a local nuisance, not a breach.
|
|
8
|
+
*
|
|
9
|
+
* THE MECHANISM. Env-level proxy denial: the scanner subprocess gets
|
|
10
|
+
* `HTTP(S)_PROXY` pointed at a blackhole (a local port nothing listens on, so
|
|
11
|
+
* every proxied connection fails fast) and `NO_PROXY` naming only the hosts that
|
|
12
|
+
* tool legitimately needs (trivy's DB registries, tflint's ruleset releases —
|
|
13
|
+
* which bypass the proxy and connect directly). Go and Python HTTP stacks both
|
|
14
|
+
* honour these variables, which covers all three scanners.
|
|
15
|
+
*
|
|
16
|
+
* HONESTY. This is the *degrade path* of the roadmap item — an env contract,
|
|
17
|
+
* not a kernel boundary: a malicious binary can ignore proxy vars. So an
|
|
18
|
+
* outcome produced under this control records `egress_isolation: "partial"`,
|
|
19
|
+
* never a stronger claim. The netns default-deny (a real kernel boundary) is
|
|
20
|
+
* the unbuilt upgrade; when it lands, this stays as the fallback for runners
|
|
21
|
+
* that can't grant namespace privileges. Deny is OPT-IN (`tools_network`
|
|
22
|
+
* input): turning it on by default would break DB pulls on runners whose
|
|
23
|
+
* mirrors we can't know about.
|
|
24
|
+
*/
|
|
25
|
+
export type EgressPolicy = "open" | "deny";
|
|
26
|
+
/** the parsed `tools_network` input: a base policy + per-tool overrides. */
|
|
27
|
+
export interface ToolsNetworkDirective {
|
|
28
|
+
base: EgressPolicy;
|
|
29
|
+
perTool: Map<string, EgressPolicy>;
|
|
30
|
+
/** unrecognised tokens (warn, never fatal — matching `tools_enabled`). */
|
|
31
|
+
unknown: string[];
|
|
32
|
+
/** extra NO_PROXY hosts admitted for every denied tool (private mirrors). */
|
|
33
|
+
extraAllowedHosts: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Hosts each scanner legitimately needs when its egress is denied. Deliberately
|
|
37
|
+
* MINIMAL — every entry is a documented, first-party distribution endpoint, not
|
|
38
|
+
* a convenience:
|
|
39
|
+
*
|
|
40
|
+
* - trivy: vulnerability-DB / checks-bundle OCI registries (`trivy-db`,
|
|
41
|
+
* `trivy-checks` live on GHCR with the ECR Public mirror as fallback).
|
|
42
|
+
* - tflint: ruleset plugins are GitHub release assets, fetched by
|
|
43
|
+
* `tflint --init`.
|
|
44
|
+
* - checkov: scans fully offline — needs nothing.
|
|
45
|
+
*
|
|
46
|
+
* An operator whose runner uses a private mirror adds it via
|
|
47
|
+
* `tools_network: "deny,allow=<host>"`.
|
|
48
|
+
*/
|
|
49
|
+
export declare const SCANNER_EGRESS_ALLOWLIST: Readonly<Record<string, readonly string[]>>;
|
|
50
|
+
/**
|
|
51
|
+
* Parse the `tools_network` input (comma- or newline-separated). Grammar
|
|
52
|
+
* mirrors `tools_enabled`:
|
|
53
|
+
*
|
|
54
|
+
* - `deny` / `open` — base policy for every scanner (default open);
|
|
55
|
+
* - `<tool>=deny|open` — per-tool override (`trivy=deny`);
|
|
56
|
+
* - `allow=<host>` — extra NO_PROXY host admitted for every denied tool
|
|
57
|
+
* (private DB mirrors).
|
|
58
|
+
*
|
|
59
|
+
* Unrecognised tokens are collected, never fatal — a typo must not silently
|
|
60
|
+
* change a security posture NOR fail the run.
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseToolsNetwork(raw: string | undefined): ToolsNetworkDirective;
|
|
63
|
+
/** The effective policy for one tool under a directive. */
|
|
64
|
+
export declare function egressPolicyFor(tool: string, directive: ToolsNetworkDirective | undefined): EgressPolicy;
|
|
65
|
+
/**
|
|
66
|
+
* The env overlay that denies a tool's egress, or null when its policy is open.
|
|
67
|
+
* Both case spellings are set — Go reads either, Python's requests prefers
|
|
68
|
+
* lowercase. `NO_PROXY` admits the tool's documented endpoints (plus loopback,
|
|
69
|
+
* which is never egress) so the tool keeps working while everything else dies
|
|
70
|
+
* at the blackhole.
|
|
71
|
+
*/
|
|
72
|
+
export declare function egressEnvFor(tool: string, directive: ToolsNetworkDirective | undefined): Record<string, string> | null;
|