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,13 @@
|
|
|
1
|
+
import { type Type } from "arktype";
|
|
2
|
+
/**
|
|
3
|
+
* Parse + shape-validate JSON from an external subprocess (terraform, tflint,
|
|
4
|
+
* trivy, checkov, infracost, reviewer findings). MCP tool inputs are already
|
|
5
|
+
* arktype-validated at the tool boundary; this applies the same rigor to the
|
|
6
|
+
* other untrusted boundary — scanner stdout — so a version bump that changes a
|
|
7
|
+
* tool's output shape fails that scanner loudly (callers degrade to `skipped`
|
|
8
|
+
* / empty) instead of feeding silently-wrong fields into concerns.
|
|
9
|
+
*
|
|
10
|
+
* Throws on invalid JSON (exactly like the bare `JSON.parse` it replaces) and
|
|
11
|
+
* on a shape mismatch, with the offending paths in the message.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseScannerJson<t>(schema: Type<t>, stdout: string, tool: string): t;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { type ToolsNetworkDirective } from "#app/mcp/terraform/scannerEgress";
|
|
2
|
+
import { type Concern, type ScannerOutcome } from "#app/mcp/terraform/types";
|
|
3
|
+
import { type ResolvedToolSelection } from "#app/utils/toolSelection";
|
|
4
|
+
export declare function scanFmt(cwd: string): ScannerOutcome;
|
|
5
|
+
/** `terraform fmt -check -list=true` prints one unformatted file path per line. */
|
|
6
|
+
export declare function parseFmtOutput(stdout: string, cwd?: string): Concern[];
|
|
7
|
+
/**
|
|
8
|
+
* Run `terraform validate` across EVERY root and aggregate. `validate` is the
|
|
9
|
+
* one scanner that's per-root (fmt/tflint/trivy/checkov are recursive over the
|
|
10
|
+
* whole tree), so a multi-root repo only catches subdir-root validate errors
|
|
11
|
+
* when we visit each root.
|
|
12
|
+
*/
|
|
13
|
+
export declare function scanValidate(cwd: string, extraEnv?: Record<string, string>): ScannerOutcome;
|
|
14
|
+
/** parse `terraform validate -json`; keeps real errors, drops uninitialized-dir noise. */
|
|
15
|
+
export declare function parseValidateOutput(stdout: string, cwd?: string): Concern[];
|
|
16
|
+
export interface ProviderRequirement {
|
|
17
|
+
/** local name, e.g. `aws`. */
|
|
18
|
+
name: string;
|
|
19
|
+
/** registry source, e.g. `hashicorp/aws`, or null (legacy string form). */
|
|
20
|
+
source: string | null;
|
|
21
|
+
/** raw version constraint, e.g. `~> 5.0`, or null when unconstrained. */
|
|
22
|
+
version: string | null;
|
|
23
|
+
/** the pinned MAJOR (the lower-bound major of the constraint) — the number a
|
|
24
|
+
* fix must target, since argument schemas differ across provider majors. */
|
|
25
|
+
major: number | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parse every `required_providers { … }` block in some HCL text into the pinned
|
|
29
|
+
* provider requirements. Handles the modern object form
|
|
30
|
+
* (`aws = { source = "hashicorp/aws", version = "~> 5.0" }`) and the legacy
|
|
31
|
+
* string form (`aws = "~> 5.0"`). A repo's "correct" fix depends on the provider
|
|
32
|
+
* MAJOR — argument names and valid blocks differ across AWS/Azure majors — so
|
|
33
|
+
* surfacing the pinned major lets a fix target the right schema instead of
|
|
34
|
+
* breaking `plan`. Brace-matched (not a fragile single regex) so nested objects
|
|
35
|
+
* don't confuse it. First declaration of a name wins (dedup across files).
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseRequiredProviders(hcl: string): ProviderRequirement[];
|
|
38
|
+
/** read the repo's `*.tf` files (recursively — root + subdir roots + nested
|
|
39
|
+
* modules) and parse their pinned provider requirements (best-effort; an
|
|
40
|
+
* unreadable tree yields none). First declaration of a provider wins. */
|
|
41
|
+
export declare function collectProviderRequirements(cwd: string): ProviderRequirement[];
|
|
42
|
+
/** the top-level arguments of a single `resource` block. */
|
|
43
|
+
export interface ResourceArguments {
|
|
44
|
+
resourceType: string;
|
|
45
|
+
/** the resource's local name (`resource "aws_s3_bucket" "<name>"`). */
|
|
46
|
+
name: string;
|
|
47
|
+
/** top-level attribute + nested-block names (meta-arguments excluded). */
|
|
48
|
+
args: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse every `resource "<type>" "<name>" { … }` block's TOP-LEVEL argument
|
|
52
|
+
* names (attributes assigned with `=` and nested block labels) from some HCL.
|
|
53
|
+
* Conservative by design — it skips `"…"` strings and `#`/`//` line comments so
|
|
54
|
+
* an interpolation's braces or a commented line can't corrupt the brace depth or
|
|
55
|
+
* fabricate an argument, and only reports depth-0 names. A `dynamic "x"` block
|
|
56
|
+
* contributes `x` (the generated block type). Used to cross-check written
|
|
57
|
+
* arguments against the installed provider schema; pure.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parseResourceArguments(hcl: string): ResourceArguments[];
|
|
60
|
+
export interface UnknownArgument {
|
|
61
|
+
resource_type: string;
|
|
62
|
+
/** the resource's local name. */
|
|
63
|
+
name: string;
|
|
64
|
+
/** repo-relative file the resource is declared in. */
|
|
65
|
+
file: string;
|
|
66
|
+
/** the argument names not present in the installed provider's schema. */
|
|
67
|
+
unknown: string[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Cross-check every resource's written arguments against the
|
|
71
|
+
* INSTALLED provider's schema, so an argument that's invalid for the pinned
|
|
72
|
+
* provider major (a "correct" fix for the wrong version) is caught at validate
|
|
73
|
+
* time, not as a later `plan` failure. Degrades green: returns
|
|
74
|
+
* `{ checked: false }` when the schema is unavailable (terraform not installed /
|
|
75
|
+
* dir not init-ed). A resource type absent from the schema is skipped (can't
|
|
76
|
+
* judge), never flagged.
|
|
77
|
+
*/
|
|
78
|
+
export declare function checkArgumentsAgainstSchema(cwd: string): {
|
|
79
|
+
checked: boolean;
|
|
80
|
+
unknown_arguments: UnknownArgument[];
|
|
81
|
+
};
|
|
82
|
+
/** A parsed resource block plus the file it came from. `parseResourceArguments`
|
|
83
|
+
* works on one file's text and so cannot carry a location; the transform-pack
|
|
84
|
+
* matcher (TC-2.2) needs one to tell the agent WHERE to edit. */
|
|
85
|
+
export interface LocatedResource extends ResourceArguments {
|
|
86
|
+
/** repo-relative file the resource is declared in. */
|
|
87
|
+
file: string;
|
|
88
|
+
}
|
|
89
|
+
/** Every `resource` block under `cwd`, with its file. Best-effort in the same
|
|
90
|
+
* way as `collectProviderRequirements` — an unreadable file is skipped rather
|
|
91
|
+
* than failing the walk. */
|
|
92
|
+
export declare function collectResourceArguments(cwd: string): LocatedResource[];
|
|
93
|
+
export declare function scanTflint(cwd: string, network?: ToolsNetworkDirective): ScannerOutcome;
|
|
94
|
+
/** parse `tflint --format json` output into concerns. */
|
|
95
|
+
export declare function parseTflintOutput(stdout: string, cwd?: string): Concern[];
|
|
96
|
+
/**
|
|
97
|
+
* Parse `trivy config --format json` output into concerns. Trivy nests
|
|
98
|
+
* misconfigurations under `Results[].Misconfigurations[]`, keyed to the result's
|
|
99
|
+
* `Target` file. `trivy config` reports only failures by default, but we
|
|
100
|
+
* defensively drop any `Status: "PASS"` entry so an `--include-non-failures`
|
|
101
|
+
* run can't leak passing checks into the concern set. Each concern carries the
|
|
102
|
+
* IaC language from the result's `Type` (terraform / cloudformation / kubernetes
|
|
103
|
+
* / helm / dockerfile / azure-arm), which is what the read-only surfaces scope on
|
|
104
|
+
* — trivy scans every format it finds, and the language tag keeps that honest.
|
|
105
|
+
*/
|
|
106
|
+
export declare function parseTrivyOutput(stdout: string, cwd?: string): Concern[];
|
|
107
|
+
/**
|
|
108
|
+
* Best-effort fallback so EVERY located finding shows its code, not only the
|
|
109
|
+
* trivy/checkov ones whose scanner emits a source window. For any concern that
|
|
110
|
+
* has a line but no scanner-attached snippet (terraform-validate, tflint, …),
|
|
111
|
+
* read the flagged line from disk. Files are read once and cached; a missing or
|
|
112
|
+
* unreadable file just leaves the snippet null. Pure-ish (read-only I/O).
|
|
113
|
+
*/
|
|
114
|
+
export declare function attachSourceSnippets(concerns: Concern[], cwd: string): Concern[];
|
|
115
|
+
/** parse `checkov -o json` output (object for one framework, array for several).
|
|
116
|
+
* Each block's `check_type` names the framework that produced it (terraform /
|
|
117
|
+
* cloudformation / kubernetes / …) — carried onto every concern as its language. */
|
|
118
|
+
export declare function parseCheckovOutput(stdout: string, cwd?: string): Concern[];
|
|
119
|
+
/**
|
|
120
|
+
* Terraform files changed on the current branch vs the base. Returns null when
|
|
121
|
+
* the base can't be determined (caller then falls back to a full scan).
|
|
122
|
+
*/
|
|
123
|
+
export declare function changedTerraformFiles(cwd: string): Set<string> | null;
|
|
124
|
+
export interface RunScannersOptions {
|
|
125
|
+
/** the resolved tool selection. A scanner whose tool is gated/disabled
|
|
126
|
+
* is reported as a `skipped` outcome (with the licence/disable reason) instead
|
|
127
|
+
* of running, so `terraform_scan` and the ✗→✓ verifier see the SAME toolchain. */
|
|
128
|
+
selection?: ResolvedToolSelection | undefined;
|
|
129
|
+
/** module-fetch credential env, threaded into `terraform validate`'s
|
|
130
|
+
* init so a private cross-repo `git::` module resolves during a scan. */
|
|
131
|
+
terraformEnv?: Record<string, string> | undefined;
|
|
132
|
+
/** when true, checkov resolves and scans INSIDE registry/git modules
|
|
133
|
+
* (`--download-external-modules true`). Required by the refactor b.4 path so
|
|
134
|
+
* adopting a third-party module can't launder its internal findings; off by
|
|
135
|
+
* default to keep the normal scan fast and offline. */
|
|
136
|
+
downloadExternalModules?: boolean | undefined;
|
|
137
|
+
/** checkov `--framework` values (see checkovFrameworksFor). Defaults to the
|
|
138
|
+
* Terraform-only pair — the fix loop never widens; the read-only Assess path
|
|
139
|
+
* passes the language-scope-derived set for multi-language breadth. */
|
|
140
|
+
checkovFrameworks?: string[] | undefined;
|
|
141
|
+
/** per-scanner egress policy (supply-chain 0.2, the `tools_network` input).
|
|
142
|
+
* A denied tool runs under the blackhole-proxy env overlay and its outcome
|
|
143
|
+
* records `egress_isolation: "partial"`. Absent ⇒ open egress (today's
|
|
144
|
+
* behaviour) — deny is opt-in. */
|
|
145
|
+
toolsNetwork?: ToolsNetworkDirective | undefined;
|
|
146
|
+
}
|
|
147
|
+
/** run every scanner once over `cwd`. shared by `terraform_scan` and the
|
|
148
|
+
* deterministic remediation verifier so both see the identical toolchain. A
|
|
149
|
+
* scanner the selection has turned off is emitted as `skipped` (never run), so
|
|
150
|
+
* the gate applies identically to the scan and its verification re-scan. */
|
|
151
|
+
export declare function runScanners(cwd: string, opts?: RunScannersOptions): ScannerOutcome[];
|
|
152
|
+
export interface RemediationVerdict {
|
|
153
|
+
/** true only when every original concern id is absent from the re-scan. */
|
|
154
|
+
verified: boolean;
|
|
155
|
+
/** original ids no longer present (the fix cleared them). */
|
|
156
|
+
resolved: string[];
|
|
157
|
+
/** original ids still present (the fix did NOT clear them). */
|
|
158
|
+
remaining: string[];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Deterministic ✗→✓ check: partition the group's original `concern_ids` into
|
|
162
|
+
* those gone from a fresh scan (`resolved`) and those still present
|
|
163
|
+
* (`remaining`). Concern ids are content hashes (`sha1(source|rule|file|line)`),
|
|
164
|
+
* so a missing id means that exact concern is gone — the correct primitive for
|
|
165
|
+
* "did the fix clear it", independent of severity/scope filtering. This is the
|
|
166
|
+
* code-level replacement for the agent eyeballing a re-scan and self-reporting.
|
|
167
|
+
*/
|
|
168
|
+
export declare function computeRemediationVerdict(originalConcernIds: string[], currentConcernIds: Set<string>): RemediationVerdict;
|
|
169
|
+
/**
|
|
170
|
+
* Regression guard. The full re-scan (`terraform_verify_remediation`)
|
|
171
|
+
* already sees the whole workspace, so a concern the fix *introduced* shows up
|
|
172
|
+
* in the current scan. Regressions are exactly the content ids present after the
|
|
173
|
+
* fix that were not in the pre-fix baseline — `current − baseline`. A non-empty
|
|
174
|
+
* result means the fix traded one defect for another (e.g. an encryption block
|
|
175
|
+
* that trips a different tflint rule) and must downgrade the PR to needs-human.
|
|
176
|
+
*
|
|
177
|
+
* Both id sets are computed the same way (the deduped union of every scanner's
|
|
178
|
+
* concern ids, unfiltered by severity) so the diff is apples-to-apples — a
|
|
179
|
+
* regression at ANY severity is caught, not just ones above the run threshold.
|
|
180
|
+
* Returns sorted ids for a stable PR body.
|
|
181
|
+
*/
|
|
182
|
+
export declare function computeRegressions(baselineConcernIds: Iterable<string>, currentConcernIds: Iterable<string>): string[];
|
|
183
|
+
/**
|
|
184
|
+
* Line-INDEPENDENT ✗→✓ partition (the integrity-preserving replacement for the
|
|
185
|
+
* raw-id `computeRemediationVerdict` when scan context is available). Each
|
|
186
|
+
* requested entry carries its display `id` and its `key` (see `concernKeyOf`);
|
|
187
|
+
* a concern is `remaining` iff its KEY still appears in the re-scan, else
|
|
188
|
+
* `resolved`. Because a fix that shifts lines keeps the same (source|rule|file)
|
|
189
|
+
* key, an unfixed concern can no longer be mis-reported as resolved. Pure.
|
|
190
|
+
*/
|
|
191
|
+
export declare function partitionByKey(requested: {
|
|
192
|
+
id: string;
|
|
193
|
+
key: string;
|
|
194
|
+
}[], currentKeys: Set<string>): RemediationVerdict;
|
|
195
|
+
/**
|
|
196
|
+
* Line-INDEPENDENT regression set: one representative current concern id per KEY
|
|
197
|
+
* present in the re-scan but absent from the pre-fix baseline keys. A pre-existing
|
|
198
|
+
* concern that merely shifted to a new line (same key) is NOT a regression — only
|
|
199
|
+
* a genuinely new (rule, file) defect is. Replaces the raw-id `computeRegressions`
|
|
200
|
+
* for the integrity path. Pure; returns sorted ids for a stable PR body.
|
|
201
|
+
*/
|
|
202
|
+
export declare function regressionIdsByKey(current: {
|
|
203
|
+
id: string;
|
|
204
|
+
key: string;
|
|
205
|
+
}[], baselineKeys: Set<string>): string[];
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detached Ed25519 signing for the compliance artefacts (the evidence bundle in
|
|
3
|
+
* [[evidence]] and the CycloneDX VEX in [[vex]]) — the "signed evidence" story.
|
|
4
|
+
*
|
|
5
|
+
* Design constraints, in order:
|
|
6
|
+
* - **Sign the exact bytes written to disk.** The builders are already
|
|
7
|
+
* deterministic (same inputs ⇒ same bytes), so no JSON canonicaliser is
|
|
8
|
+
* needed — the detached `.sig` covers the file verbatim.
|
|
9
|
+
* - **`node:crypto` only** (`sign`/`verify` with a `null` digest — Ed25519 is
|
|
10
|
+
* a pure signature scheme); no new dependency.
|
|
11
|
+
* - **Honest when unsigned.** The private key arrives via env only
|
|
12
|
+
* (`INFRAWEAVER_SIGNING_KEY`, a base64-encoded PKCS#8 PEM). Unset ⇒ the
|
|
13
|
+
* artefact records an explicit `"signature": null` — never a fake or
|
|
14
|
+
* self-referential signature. A key that is SET but malformed throws (a
|
|
15
|
+
* mis-configured signer must fail loudly, not silently emit unsigned).
|
|
16
|
+
* - The key name matches the `_KEY` suffix in `utils/secrets.ts`
|
|
17
|
+
* SENSITIVE_PATTERNS, so it is redacted from logs and stripped from every
|
|
18
|
+
* subprocess env by the default-deny filter.
|
|
19
|
+
*
|
|
20
|
+
* Verify side: `infraweaver verify-evidence <bundle> <sig> <pubkey>` (src/cli.ts →
|
|
21
|
+
* commands/verifyEvidence.ts) re-checks a bundle offline with only the public key.
|
|
22
|
+
*/
|
|
23
|
+
import { type KeyObject } from "node:crypto";
|
|
24
|
+
export declare const SIGNING_KEY_ENV = "INFRAWEAVER_SIGNING_KEY";
|
|
25
|
+
export declare const SIGNATURE_ALGORITHM: "Ed25519";
|
|
26
|
+
export interface SigningKey {
|
|
27
|
+
privateKey: KeyObject;
|
|
28
|
+
/** the public half, SPKI PEM — embedded in artefact metadata so a consumer
|
|
29
|
+
* can verify without any other channel. */
|
|
30
|
+
publicKeyPem: string;
|
|
31
|
+
/** sha256 of the SPKI DER, hex — the short handle a PR body / log names. */
|
|
32
|
+
fingerprint: string;
|
|
33
|
+
}
|
|
34
|
+
/** metadata embedded in a signed artefact (never the signature itself — the
|
|
35
|
+
* signature covers these bytes, so it must live in the detached `.sig`). */
|
|
36
|
+
export interface SignatureMetadata {
|
|
37
|
+
algorithm: typeof SIGNATURE_ALGORITHM;
|
|
38
|
+
public_key: string;
|
|
39
|
+
fingerprint_sha256: string;
|
|
40
|
+
/** sibling file carrying the base64 detached signature. */
|
|
41
|
+
detached_signature: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Load the signing key from the env (base64-encoded PKCS#8 PEM, Ed25519).
|
|
45
|
+
* Returns null when unset/empty (the honest-unsigned path); throws when a key
|
|
46
|
+
* is present but not a valid Ed25519 PKCS#8 PEM — a configured signer that
|
|
47
|
+
* can't sign is an operator error, never a silent downgrade.
|
|
48
|
+
*/
|
|
49
|
+
export declare function loadSigningKey(raw?: string | undefined): SigningKey | null;
|
|
50
|
+
/** detached Ed25519 signature over the exact bytes, base64. */
|
|
51
|
+
export declare function signBytes(bytes: string | Buffer, key: SigningKey): string;
|
|
52
|
+
/** verify a detached base64 signature against the exact bytes + an SPKI PEM
|
|
53
|
+
* public key. Returns false (never throws) on a malformed signature/key, so a
|
|
54
|
+
* verifier can report FAILED rather than crash on garbage input. */
|
|
55
|
+
export declare function verifyBytes(bytes: string | Buffer, signatureB64: string, publicKeyPem: string): boolean;
|
|
56
|
+
/** sha256 fingerprint (hex) of an SPKI PEM public key — the same handle
|
|
57
|
+
* {@link loadSigningKey} derives, computable by a verifier from the PEM alone. */
|
|
58
|
+
export declare function publicKeyFingerprint(publicKeyPem: string): string;
|
|
59
|
+
/** the metadata block an artefact embeds when this key signs it. `sigFile` is
|
|
60
|
+
* the sibling `.sig` filename (relative — beside the artefact). */
|
|
61
|
+
export declare function signatureMetadata(key: SigningKey, sigFile: string): SignatureMetadata;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
2
|
+
export interface DeprecatedLockingSite {
|
|
3
|
+
/** 1-based line of the `backend "s3"` block. */
|
|
4
|
+
line: number;
|
|
5
|
+
/** the `dynamodb_table` value as written (a literal, or an expression). */
|
|
6
|
+
table: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Every `terraform { backend "s3" { … } }` that locks via `dynamodb_table`
|
|
10
|
+
* without `use_lockfile = true`.
|
|
11
|
+
*
|
|
12
|
+
* Walks `terraform` → `backend` explicitly rather than matching `dynamodb_table`
|
|
13
|
+
* anywhere: `aws_dynamodb_table` resources and module inputs of the same name
|
|
14
|
+
* are common, and a currency finding fabricated from one of those would be
|
|
15
|
+
* indistinguishable from a real one to whoever reads the report.
|
|
16
|
+
*/
|
|
17
|
+
export declare function findDeprecatedStateLocking(hcl: string): DeprecatedLockingSite[];
|
|
18
|
+
export declare function deprecatedStateLockingToConcerns(sites: DeprecatedLockingSite[], file: string): Concern[];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type RunResult = {
|
|
2
|
+
status: number;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
missing: boolean;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Hard wall-clock cap on any single scanner/terraform invocation. Bounds a hung
|
|
9
|
+
* subprocess (e.g. `terraform init`/`plan` stalling on a private registry, a
|
|
10
|
+
* tflint plugin fetch that never returns) so it can't block the run forever.
|
|
11
|
+
* Generous (5 min) so it only ever fires on a genuine hang, never a slow-but-
|
|
12
|
+
* progressing plan. A timeout surfaces as a non-zero/`-1` status the caller
|
|
13
|
+
* already treats as "this scanner did not produce results".
|
|
14
|
+
*/
|
|
15
|
+
export declare const SUBPROCESS_TIMEOUT_MS = 300000;
|
|
16
|
+
/**
|
|
17
|
+
* Run a scanner without throwing. Terraform tools exit non-zero when they FIND
|
|
18
|
+
* issues, so a non-zero status is normal, not an error. `missing` is set when
|
|
19
|
+
* the binary isn't on PATH (ENOENT) — the scanner then degrades to "skipped"
|
|
20
|
+
* rather than failing the run (a tool being absent must not block).
|
|
21
|
+
*
|
|
22
|
+
* `extraEnv` opts a specific command back into a needed credential: the scanners
|
|
23
|
+
* run with a restricted env that strips every `*_KEY`/secret, but infracost
|
|
24
|
+
* legitimately needs its `INFRACOST_API_KEY`. resolveEnv(object) merges the
|
|
25
|
+
* restricted base with the explicit vars, so only the named keys get through.
|
|
26
|
+
*/
|
|
27
|
+
export declare function run(cmd: string, args: string[], cwd: string, extraEnv?: Record<string, string>): RunResult;
|
|
28
|
+
/** test seam — forget the resolved CLI so a test can exercise both branches. */
|
|
29
|
+
export declare function resetTerraformCliCache(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Run a Terraform CLI command, preferring `terraform` and transparently falling
|
|
32
|
+
* back to OpenTofu (`tofu`) when `terraform` is ABSENT from PATH (ENOENT). The two
|
|
33
|
+
* share the exact surface the engine uses (fmt / validate / init / plan / show),
|
|
34
|
+
* and the licence posture already prefers OpenTofu (Terraform is BUSL) — so an
|
|
35
|
+
* OpenTofu-only runner keeps full fmt/validate/plan coverage instead of reporting
|
|
36
|
+
* everything skipped. The fallback is probed via the FIRST real command (no
|
|
37
|
+
* separate `version` call, so a mocked runner that answers `fmt`/`init`/`plan`
|
|
38
|
+
* needs no extra stubbing) and the chosen binary is memoised for the rest of the
|
|
39
|
+
* process — the one-time resolution to `tofu` is logged so the operator sees which
|
|
40
|
+
* CLI ran. When BOTH are absent the terraform result (missing) is returned so the
|
|
41
|
+
* caller degrades to "skipped" exactly as before. `runner` is injectable for tests.
|
|
42
|
+
*/
|
|
43
|
+
export declare function runTf(args: string[], cwd: string, extraEnv?: Record<string, string>, runner?: typeof run): RunResult;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Concern, ConcernSuppression } from "#app/mcp/terraform/types";
|
|
2
|
+
export type SuppressionSource = ConcernSuppression["source"];
|
|
3
|
+
export interface Suppression {
|
|
4
|
+
source: SuppressionSource;
|
|
5
|
+
rule: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
expires: string | null;
|
|
8
|
+
paths: string[];
|
|
9
|
+
file: string | null;
|
|
10
|
+
/** Set when this came from a NATIVE scanner skip directive (checkov/tfsec/trivy)
|
|
11
|
+
* rather than a `#infraweaver:ignore`. The owning scanner already honours it; we
|
|
12
|
+
* carry the provenance so the unified audit trail shows where it came from. */
|
|
13
|
+
tool?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ParsedSuppressions {
|
|
16
|
+
suppressions: Suppression[];
|
|
17
|
+
warnings: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function parseInlineSuppressions(content: string, file: string): ParsedSuppressions;
|
|
20
|
+
/** A native scanner-skip directive with its source location — the line-aware shape
|
|
21
|
+
* behind both the suppression pipeline and the orphan-skip audit. */
|
|
22
|
+
export interface NativeSkip {
|
|
23
|
+
tool: string;
|
|
24
|
+
/** namespaced rule, e.g. "checkov:CKV_AWS_20" — matches a concern's `rule_id`. */
|
|
25
|
+
rule: string;
|
|
26
|
+
reason: string;
|
|
27
|
+
expires: string | null;
|
|
28
|
+
file: string;
|
|
29
|
+
/** 1-based line of the directive. */
|
|
30
|
+
line: number;
|
|
31
|
+
}
|
|
32
|
+
/** Collect every native scanner-skip directive in a file, WITH line numbers. The
|
|
33
|
+
* single source of truth for native-skip parsing (used by the suppression pipeline
|
|
34
|
+
* and the orphan-skip audit). At most one directive per line. */
|
|
35
|
+
export declare function collectNativeSkips(content: string, file: string): NativeSkip[];
|
|
36
|
+
/**
|
|
37
|
+
* Parse native scanner skip directives (`#checkov:skip=…`, `#tfsec:ignore:…`,
|
|
38
|
+
* `#trivy:ignore:…`) into the unified `Suppression` shape so they can be honoured
|
|
39
|
+
* and audited alongside `#infraweaver:ignore`. Native skips don't mandate a reason
|
|
40
|
+
* (their tools don't), so a synthetic one records the provenance. The rule is
|
|
41
|
+
* namespaced (`checkov:CKV_AWS_20`) so it matches a surviving concern's `rule_id`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseNativeSuppressions(content: string, file: string): ParsedSuppressions;
|
|
44
|
+
/**
|
|
45
|
+
* Native skips that NO concern corresponds to — the owning scanner already dropped
|
|
46
|
+
* the finding (or the rule never fired), so the skip is invisible to Infraweaver's
|
|
47
|
+
* gate and posture. Surfacing these keeps scanner-native suppressions auditable
|
|
48
|
+
* (a `#checkov:skip` can silently hide a real issue forever). A skip "matches" a
|
|
49
|
+
* concern when its rule matches (exact / bare / `:suffix`) AND the file is the same.
|
|
50
|
+
* Canonical cross-rule matching (a trivy skip vs a checkov concern for the *same*
|
|
51
|
+
* issue) is a future taxonomy refinement — see `taxonomy.ts`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function findOrphanNativeSkips(skips: NativeSkip[], concerns: Concern[]): NativeSkip[];
|
|
54
|
+
export interface NativeSkipAudit {
|
|
55
|
+
/** every native skip found in the scanned tree. */
|
|
56
|
+
skips: NativeSkip[];
|
|
57
|
+
/** the subset with no corresponding concern (the audit signal). */
|
|
58
|
+
orphans: NativeSkip[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Walk a file list, collect native skips, and partition them against the scan's
|
|
62
|
+
* concern set. `read` returns a file's content or null (missing). Pure given its
|
|
63
|
+
* inputs, so it's unit-testable without a real tree.
|
|
64
|
+
*/
|
|
65
|
+
export declare function auditNativeSkips(files: string[], concerns: Concern[], read: (relPath: string) => string | null): NativeSkipAudit;
|
|
66
|
+
export declare function parseSuppressionPolicy(raw: string, format: "yaml" | "json"): ParsedSuppressions;
|
|
67
|
+
export declare function loadSuppressionPolicy(cwd: string | undefined): ParsedSuppressions;
|
|
68
|
+
/**
|
|
69
|
+
* The suppression policy that APPLIES to this run.
|
|
70
|
+
*
|
|
71
|
+
* On a pull-request run the `suppressions:` block is read from the **base ref**,
|
|
72
|
+
* not the PR's head: a waiver is an accepted risk, and accepting it is exactly
|
|
73
|
+
* what the review is for. Letting a PR silence the finding that would otherwise
|
|
74
|
+
* block it is the self-approval hole the two-person SoD on waivers (§5.3) exists
|
|
75
|
+
* to close — this closes the file-shaped version of it. A PR that adds a waiver
|
|
76
|
+
* still sees the finding; the waiver applies from the next run on the merged base.
|
|
77
|
+
*
|
|
78
|
+
* Everything degrades to the head value with a warning when the base ref can't
|
|
79
|
+
* be read (shallow clone) or the run isn't a PR — stated, never silent.
|
|
80
|
+
*/
|
|
81
|
+
export declare function loadSuppressionPolicyForRun(cwd: string | undefined): ParsedSuppressions;
|
|
82
|
+
export interface ApplySuppressionsOptions {
|
|
83
|
+
policy: Suppression[];
|
|
84
|
+
cwd: string;
|
|
85
|
+
now?: Date;
|
|
86
|
+
readFile?: (relPath: string) => string | null;
|
|
87
|
+
onWarn?: (warning: string) => void;
|
|
88
|
+
}
|
|
89
|
+
export declare function applySuppressions(concerns: Concern[], opts: ApplySuppressionsOptions): Concern[];
|
|
90
|
+
export declare function suppressConcerns(concerns: Concern[], cwd: string, now?: Date): Concern[];
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-scanner canonical taxonomy (2c, v1).
|
|
3
|
+
*
|
|
4
|
+
* Different scanners flag the SAME real misconfiguration under different rule IDs
|
|
5
|
+
* — trivy `AVD-AWS-0088`, checkov `CKV_AWS_19` and tfsec
|
|
6
|
+
* `aws-s3-enable-bucket-encryption` are all "S3 bucket not encrypted". Without a
|
|
7
|
+
* mapping, that one issue surfaces as up-to-three findings. This module maps known
|
|
8
|
+
* rule IDs onto a canonical resource+misconfig class so the same issue at the same
|
|
9
|
+
* resource collapses into ONE finding tagged with every tool that caught it.
|
|
10
|
+
*
|
|
11
|
+
* v1 scope: a curated table of high-value AWS misconfigs (the long tail + non-AWS
|
|
12
|
+
* providers expand the table over time). The merge is conservative — it only
|
|
13
|
+
* collapses concerns that share a canonical class AND a file AND were reported by
|
|
14
|
+
* DIFFERENT tools, so two distinct same-tool resources in one file are never
|
|
15
|
+
* silently merged.
|
|
16
|
+
*/
|
|
17
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
18
|
+
export interface CanonicalClass {
|
|
19
|
+
/** stable id, e.g. "aws-s3-encryption". */
|
|
20
|
+
id: string;
|
|
21
|
+
/** short human title for the merged finding. */
|
|
22
|
+
title: string;
|
|
23
|
+
/** member rule IDs (bare, lowercased — no scanner namespace). */
|
|
24
|
+
rules: string[];
|
|
25
|
+
}
|
|
26
|
+
/** The curated taxonomy. Each entry's `rules` are the equivalent rule IDs across
|
|
27
|
+
* scanners. Keep `rules` lowercased + namespace-free; lookup normalises both. */
|
|
28
|
+
export declare const CANONICAL_CLASSES: readonly CanonicalClass[];
|
|
29
|
+
/** The canonical class id this concern maps to, or null when it isn't in the table. */
|
|
30
|
+
export declare function canonicalClassOf(concern: Concern): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Collapse cross-scanner duplicates. Concerns sharing a canonical class + file,
|
|
33
|
+
* reported by ≥2 DIFFERENT tools, merge into one (highest severity wins, the
|
|
34
|
+
* canonical title is used, `flagged_by` lists every contributing tool). Concerns
|
|
35
|
+
* with a class but only one tool are tagged (class + `flagged_by`) but kept
|
|
36
|
+
* separate; concerns with no canonical class pass through untouched. Input order
|
|
37
|
+
* is otherwise preserved.
|
|
38
|
+
*/
|
|
39
|
+
export declare function dedupeCrossScanner(concerns: Concern[]): Concern[];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { LocalToolContext } from "#app/mcp/localContext";
|
|
2
|
+
/** The extension Terraform reserves for query configuration. */
|
|
3
|
+
export declare const TFQUERY_SUFFIX = ".tfquery.hcl";
|
|
4
|
+
/** True for a path Terraform would execute as a query configuration. */
|
|
5
|
+
export declare function isQueryFile(path: string): boolean;
|
|
6
|
+
/** One `list "<type>" "<name>" { … }` block — a declared intent to discover
|
|
7
|
+
* unmanaged resources of that type. */
|
|
8
|
+
export interface QueryListBlock {
|
|
9
|
+
/** the resource type being searched for, e.g. `google_compute_instance`. */
|
|
10
|
+
resourceType: string;
|
|
11
|
+
/** the query's local name, unique within the directory. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** the `provider` argument as written — which provider configuration is
|
|
14
|
+
* queried. Null when absent (Terraform requires it; we report, not validate). */
|
|
15
|
+
provider: string | null;
|
|
16
|
+
/** the `limit` as written, or null when defaulted (Terraform's default is 100). */
|
|
17
|
+
limit: string | null;
|
|
18
|
+
/** whether the block asks for full resource bodies (`include_resource`). */
|
|
19
|
+
includeResource: boolean;
|
|
20
|
+
/** 1-based line of the block header. */
|
|
21
|
+
line: number;
|
|
22
|
+
}
|
|
23
|
+
export interface QueryFileInventory {
|
|
24
|
+
file: string;
|
|
25
|
+
lists: QueryListBlock[];
|
|
26
|
+
}
|
|
27
|
+
/** Parse one query file's `list` blocks. Pure. */
|
|
28
|
+
export declare function parseQueryFile(hcl: string): QueryListBlock[];
|
|
29
|
+
export interface QueryInventory {
|
|
30
|
+
files: QueryFileInventory[];
|
|
31
|
+
/** total `list` blocks across the tree. */
|
|
32
|
+
total: number;
|
|
33
|
+
/** distinct resource types being searched for, sorted. */
|
|
34
|
+
resourceTypes: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Every query file under `cwd` and the `list` blocks it declares.
|
|
38
|
+
*
|
|
39
|
+
* Returns an inventory, never findings — see the module note. An unreadable file
|
|
40
|
+
* is skipped rather than reported: a query file we cannot read is a gap in the
|
|
41
|
+
* inventory, and inventing an entry for it would be worse than a shorter list.
|
|
42
|
+
*/
|
|
43
|
+
export declare function collectQueryInventory(cwd: string): QueryInventory;
|
|
44
|
+
export declare const TerraformQueryInventoryParams: import("arktype/internal/variants/object.ts").ObjectType<object, {}>;
|
|
45
|
+
export declare function TerraformQueryInventoryTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<object, object>> & {
|
|
46
|
+
mutates?: boolean;
|
|
47
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compromised-scanner gate (supply-chain phase 0.1).
|
|
3
|
+
*
|
|
4
|
+
* THE THREAT, CONCRETELY. In March 2026 the Trivy project was compromised
|
|
5
|
+
* (TeamPCP): a malicious **v0.69.4** was published across GHCR, ECR Public,
|
|
6
|
+
* Docker Hub, deb/rpm and `get.trivy.dev` on 19 Mar; 76 of 77 `trivy-action`
|
|
7
|
+
* tags and all 7 `setup-trivy` tags were repointed at infostealer commits;
|
|
8
|
+
* malicious 0.69.5 / 0.69.6 images followed on 22 Mar. The payload dumped
|
|
9
|
+
* runner memory and called home. Advisory: GHSA-69fq-xp46-6x23. Last clean
|
|
10
|
+
* release before the incident: 0.69.3.
|
|
11
|
+
*
|
|
12
|
+
* WHY THIS LIVES HERE. Infraweaver does not download the toolchain — it executes
|
|
13
|
+
* whatever `trivy`/`checkov`/`tflint` the customer's CI put on PATH, inside the
|
|
14
|
+
* customer's runner, alongside their credentials. So the registry-side controls
|
|
15
|
+
* that failed in this incident are not ours to fix; what we CAN do is refuse to
|
|
16
|
+
* execute a build we know is malicious. A scanner is the one subprocess whose
|
|
17
|
+
* output we trust, so running a known-backdoored one is the worst case for an
|
|
18
|
+
* attestation product: we would be both the execution vector and the notary.
|
|
19
|
+
*
|
|
20
|
+
* FAIL-CLOSED, NOT SKIP. Every other scanner problem here degrades to
|
|
21
|
+
* "skipped" (absent binary, unparseable output) because a missing tool must not
|
|
22
|
+
* block a run. A KNOWN-COMPROMISED tool is the opposite: continuing would mean
|
|
23
|
+
* knowingly executing malware, so this throws and the run stops.
|
|
24
|
+
*/
|
|
25
|
+
/** A published release known to be malicious. */
|
|
26
|
+
interface CompromisedRelease {
|
|
27
|
+
/** Binary name as invoked (matches the `run()` command). */
|
|
28
|
+
tool: string;
|
|
29
|
+
/** Exact affected versions — never a range, so a fix release can't be caught. */
|
|
30
|
+
versions: readonly string[];
|
|
31
|
+
/** Advisory id to name in the failure message. */
|
|
32
|
+
advisory: string;
|
|
33
|
+
/** Shortest safe instruction for the operator. */
|
|
34
|
+
guidance: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The denylist. Deliberately EXACT versions: a range would sweep up the fixed
|
|
38
|
+
* release and turn a security control into an outage. Add an entry per advisory.
|
|
39
|
+
*/
|
|
40
|
+
export declare const COMPROMISED_RELEASES: readonly CompromisedRelease[];
|
|
41
|
+
/**
|
|
42
|
+
* Extract a semantic version from a tool's `--version` output. Tools disagree
|
|
43
|
+
* wildly on format (`Version: 0.55.0`, `TFLint version 0.52.0`, a bare
|
|
44
|
+
* `3.2.0`), so take the first `x.y.z` that appears. Returns null when the output
|
|
45
|
+
* carries no recognisable version. Pure.
|
|
46
|
+
*/
|
|
47
|
+
export declare function parseToolVersion(output: string): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* The advisory matching a tool+version, or null when the pair is not known to be
|
|
50
|
+
* compromised. Pure — the whole decision is table-driven and testable without a
|
|
51
|
+
* subprocess.
|
|
52
|
+
*/
|
|
53
|
+
export declare function compromisedRelease(tool: string, version: string | null): CompromisedRelease | null;
|
|
54
|
+
/** The operator-facing failure text for a compromised tool. Pure. */
|
|
55
|
+
export declare function compromisedToolMessage(rel: CompromisedRelease, version: string): string;
|
|
56
|
+
/** Reset the probe cache — tests only. */
|
|
57
|
+
export declare function resetToolVersionCache(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Every tool version probed this process, sorted by tool name — the scanner
|
|
60
|
+
* half of the evidence bundle's PROVENANCE block (A.3). These are the versions
|
|
61
|
+
* the integrity gate actually observed before executing each scanner, so the
|
|
62
|
+
* signed bundle records the toolchain that genuinely ran — nothing is probed
|
|
63
|
+
* retroactively and nothing is fabricated for a tool that never ran. `null`
|
|
64
|
+
* means the tool ran a probe but printed no recognisable version.
|
|
65
|
+
*/
|
|
66
|
+
export declare function probedToolVersions(): {
|
|
67
|
+
tool: string;
|
|
68
|
+
version: string | null;
|
|
69
|
+
}[];
|
|
70
|
+
/**
|
|
71
|
+
* Detect a tool's version by running `<tool> --version`. Returns null when the
|
|
72
|
+
* binary is absent or prints nothing recognisable (both are non-events — the
|
|
73
|
+
* caller's normal "skipped" path handles an absent tool).
|
|
74
|
+
*/
|
|
75
|
+
export declare function detectToolVersion(tool: string, cwd: string): string | null;
|
|
76
|
+
/**
|
|
77
|
+
* Fail-closed gate: throws when `tool` on PATH is a known-compromised release.
|
|
78
|
+
* A no-op for an absent tool, an unknown version, or any tool with no advisory —
|
|
79
|
+
* this must never become a reason a clean run fails.
|
|
80
|
+
*/
|
|
81
|
+
export declare function assertToolchainIntegrity(tool: string, cwd: string): void;
|
|
82
|
+
export {};
|