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,431 @@
|
|
|
1
|
+
import { closeSync, openSync, readdirSync, readSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Multi-language IaC support for the READ-ONLY surfaces (Assess / SARIF /
|
|
6
|
+
* evidence). One honest principle throughout: **breadth never dilutes the moat**
|
|
7
|
+
* — trivy and checkov already parse these formats, so Assess widens to them, but
|
|
8
|
+
* Remediate stays Terraform-first (the `✗→✓` proof + equivalence machinery is
|
|
9
|
+
* Terraform-specific and is never faked for other formats; `terraform_scan` and
|
|
10
|
+
* the fix loop keep their Terraform-only filter).
|
|
11
|
+
*
|
|
12
|
+
* Everything here is verified against the scanners' actual support matrices
|
|
13
|
+
* (checkov 3.3.x `--framework` values; trivy 0.7x `--misconfig-scanners`), and
|
|
14
|
+
* the matrix below records per-language coverage HONESTLY — including what is
|
|
15
|
+
* NOT scannable (Pulumi programs have no credible static scanner: checkov never
|
|
16
|
+
* shipped one, trivy has none, and `pulumi preview` requires the engine + a
|
|
17
|
+
* backend). A detected-but-unscannable language is REPORTED as such, never
|
|
18
|
+
* silently dropped and never given fabricated findings.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export const IAC_LANGUAGES = [
|
|
22
|
+
"terraform",
|
|
23
|
+
"cloudformation",
|
|
24
|
+
"kubernetes",
|
|
25
|
+
"helm",
|
|
26
|
+
"kustomize",
|
|
27
|
+
"dockerfile",
|
|
28
|
+
"arm",
|
|
29
|
+
"bicep",
|
|
30
|
+
"serverless",
|
|
31
|
+
"ansible",
|
|
32
|
+
"pulumi",
|
|
33
|
+
] as const;
|
|
34
|
+
export type IacLanguage = (typeof IAC_LANGUAGES)[number];
|
|
35
|
+
|
|
36
|
+
export const LANGUAGE_LABEL: Record<IacLanguage, string> = {
|
|
37
|
+
terraform: "Terraform / OpenTofu",
|
|
38
|
+
cloudformation: "CloudFormation",
|
|
39
|
+
kubernetes: "Kubernetes manifests",
|
|
40
|
+
helm: "Helm charts",
|
|
41
|
+
kustomize: "Kustomize",
|
|
42
|
+
dockerfile: "Dockerfile / Containerfile",
|
|
43
|
+
arm: "Azure ARM templates",
|
|
44
|
+
bicep: "Azure Bicep",
|
|
45
|
+
serverless: "Serverless Framework",
|
|
46
|
+
ansible: "Ansible",
|
|
47
|
+
pulumi: "Pulumi",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Which of the two multi-format scanners genuinely covers each language, with
|
|
52
|
+
* the caveat an operator must know. This is the single source of the honesty
|
|
53
|
+
* notes the scorecard prints — a language whose only covering scanner didn't
|
|
54
|
+
* run is a COVERAGE GAP, not a pass, and a language neither covers is reported
|
|
55
|
+
* `unsupported`, never scanned-and-silent.
|
|
56
|
+
*/
|
|
57
|
+
export const LANGUAGE_COVERAGE: Record<
|
|
58
|
+
IacLanguage,
|
|
59
|
+
{ trivy: boolean; checkov: boolean; note?: string }
|
|
60
|
+
> = {
|
|
61
|
+
terraform: {
|
|
62
|
+
trivy: true,
|
|
63
|
+
checkov: true,
|
|
64
|
+
note: "OpenTofu: `.tf` repos are fully covered; `.tofu` files are scanned by trivy only (checkov does not read them yet)",
|
|
65
|
+
},
|
|
66
|
+
cloudformation: { trivy: true, checkov: true },
|
|
67
|
+
kubernetes: { trivy: true, checkov: true },
|
|
68
|
+
helm: {
|
|
69
|
+
trivy: true,
|
|
70
|
+
checkov: true,
|
|
71
|
+
note: "trivy renders charts built-in; checkov's helm framework needs the `helm` binary on the runner (skipped without it)",
|
|
72
|
+
},
|
|
73
|
+
kustomize: {
|
|
74
|
+
trivy: false,
|
|
75
|
+
checkov: true,
|
|
76
|
+
note: "checkov only, and it needs the `kustomize` binary on the runner",
|
|
77
|
+
},
|
|
78
|
+
dockerfile: { trivy: true, checkov: true },
|
|
79
|
+
arm: { trivy: true, checkov: true },
|
|
80
|
+
bicep: {
|
|
81
|
+
trivy: false,
|
|
82
|
+
checkov: true,
|
|
83
|
+
note: "checkov scans .bicep natively; trivy needs `az bicep build` to ARM JSON first",
|
|
84
|
+
},
|
|
85
|
+
serverless: { trivy: false, checkov: true },
|
|
86
|
+
ansible: {
|
|
87
|
+
trivy: false,
|
|
88
|
+
checkov: true,
|
|
89
|
+
note: "checkov's ansible framework; trivy's ansible scanner is experimental (AWS S3 modules only) and not relied on",
|
|
90
|
+
},
|
|
91
|
+
pulumi: {
|
|
92
|
+
trivy: false,
|
|
93
|
+
checkov: false,
|
|
94
|
+
note: "no static scanner can parse Pulumi programs (TypeScript/Python/Go); `pulumi preview` needs the Pulumi engine + backend credentials",
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/** The checkov `--framework` values a language enables. `terraform_json` rides
|
|
99
|
+
* with terraform so CDKTF synth output (`cdk.tf.json`) is covered. */
|
|
100
|
+
const CHECKOV_FRAMEWORKS: Record<IacLanguage, string[]> = {
|
|
101
|
+
terraform: ["terraform", "terraform_json"],
|
|
102
|
+
cloudformation: ["cloudformation"],
|
|
103
|
+
kubernetes: ["kubernetes"],
|
|
104
|
+
helm: ["helm"],
|
|
105
|
+
kustomize: ["kustomize"],
|
|
106
|
+
dockerfile: ["dockerfile"],
|
|
107
|
+
arm: ["arm"],
|
|
108
|
+
bicep: ["bicep"],
|
|
109
|
+
serverless: ["serverless"],
|
|
110
|
+
ansible: ["ansible"],
|
|
111
|
+
pulumi: [],
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/** The checkov `--framework` list for a scanned-language set (sorted, deduped).
|
|
115
|
+
* Always includes terraform so the scanner invocation can never regress the
|
|
116
|
+
* core product even on an empty/odd scope. Pure. */
|
|
117
|
+
export function checkovFrameworksFor(scanned: readonly IacLanguage[]): string[] {
|
|
118
|
+
const out = new Set<string>(CHECKOV_FRAMEWORKS.terraform);
|
|
119
|
+
for (const lang of scanned) {
|
|
120
|
+
for (const fw of CHECKOV_FRAMEWORKS[lang] ?? []) out.add(fw);
|
|
121
|
+
}
|
|
122
|
+
return [...out].sort();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// trivy `Results[].Type` → language. Plan-JSON results count as terraform (they
|
|
126
|
+
// describe Terraform resources); yaml/json custom-check types are unmapped (off
|
|
127
|
+
// by default in trivy, and we don't enable them).
|
|
128
|
+
const TRIVY_TYPE_TO_LANGUAGE: Record<string, IacLanguage> = {
|
|
129
|
+
terraform: "terraform",
|
|
130
|
+
terraformplan: "terraform",
|
|
131
|
+
"terraformplan-json": "terraform",
|
|
132
|
+
"terraformplan-snapshot": "terraform",
|
|
133
|
+
cloudformation: "cloudformation",
|
|
134
|
+
kubernetes: "kubernetes",
|
|
135
|
+
helm: "helm",
|
|
136
|
+
dockerfile: "dockerfile",
|
|
137
|
+
"azure-arm": "arm",
|
|
138
|
+
ansible: "ansible",
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/** Map a trivy result `Type` to a language; null for types we don't model. Pure. */
|
|
142
|
+
export function trivyTypeToLanguage(type: string | undefined): IacLanguage | null {
|
|
143
|
+
return type ? (TRIVY_TYPE_TO_LANGUAGE[type.toLowerCase()] ?? null) : null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// checkov `check_type` → language (one JSON block per framework that ran).
|
|
147
|
+
const CHECKOV_TYPE_TO_LANGUAGE: Record<string, IacLanguage> = {
|
|
148
|
+
terraform: "terraform",
|
|
149
|
+
terraform_json: "terraform",
|
|
150
|
+
terraform_plan: "terraform",
|
|
151
|
+
cloudformation: "cloudformation",
|
|
152
|
+
kubernetes: "kubernetes",
|
|
153
|
+
helm: "helm",
|
|
154
|
+
kustomize: "kustomize",
|
|
155
|
+
dockerfile: "dockerfile",
|
|
156
|
+
arm: "arm",
|
|
157
|
+
bicep: "bicep",
|
|
158
|
+
serverless: "serverless",
|
|
159
|
+
ansible: "ansible",
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/** Map a checkov block `check_type` to a language; null for types we don't model. Pure. */
|
|
163
|
+
export function checkovTypeToLanguage(checkType: string | undefined): IacLanguage | null {
|
|
164
|
+
return checkType ? (CHECKOV_TYPE_TO_LANGUAGE[checkType.toLowerCase()] ?? null) : null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const YAML_EXT = /\.ya?ml$/i;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Classify a file by path alone (no content). Returns the language, or
|
|
171
|
+
* "needs-content" for yaml/json whose kind is only knowable by sniffing, or null
|
|
172
|
+
* for a file that is no IaC we model. Pure.
|
|
173
|
+
*/
|
|
174
|
+
export function classifyByPath(path: string): IacLanguage | "needs-content" | null {
|
|
175
|
+
const norm = path.replace(/\\/g, "/");
|
|
176
|
+
const base = (norm.split("/").pop() ?? "").toLowerCase();
|
|
177
|
+
|
|
178
|
+
if (base.endsWith(".tf") || base.endsWith(".tfvars") || base.endsWith(".tf.json"))
|
|
179
|
+
return "terraform";
|
|
180
|
+
if (base.endsWith(".tofu") || base.endsWith(".tofu.json")) return "terraform";
|
|
181
|
+
if (base === "dockerfile" || base === "containerfile" || base.endsWith(".dockerfile"))
|
|
182
|
+
return "dockerfile";
|
|
183
|
+
if (base.startsWith("dockerfile.") || base.startsWith("containerfile.")) return "dockerfile";
|
|
184
|
+
if (base.endsWith(".bicep")) return "bicep";
|
|
185
|
+
if (base === "chart.yaml" || base === "chart.yml") return "helm";
|
|
186
|
+
if (base === "kustomization.yaml" || base === "kustomization.yml") return "kustomize";
|
|
187
|
+
if (base === "serverless.yml" || base === "serverless.yaml") return "serverless";
|
|
188
|
+
if (base === "pulumi.yaml" || base === "pulumi.yml" || /^pulumi\..+\.ya?ml$/.test(base))
|
|
189
|
+
return "pulumi";
|
|
190
|
+
// CDK synth output — CloudFormation JSON regardless of directory.
|
|
191
|
+
if (base.endsWith(".template.json")) return "cloudformation";
|
|
192
|
+
if (YAML_EXT.test(base) || base.endsWith(".json")) return "needs-content";
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Classify a yaml/json file by its content (first few KB). Conservative: only
|
|
198
|
+
* unmistakable markers classify; anything ambiguous returns null (better to
|
|
199
|
+
* under-detect than to claim coverage of a file no scanner will read). Pure.
|
|
200
|
+
*/
|
|
201
|
+
export function classifyByContent(path: string, content: string): IacLanguage | null {
|
|
202
|
+
const head = content.slice(0, 4096);
|
|
203
|
+
if (/\.json$/i.test(path)) {
|
|
204
|
+
// ARM: the $schema pins it; CloudFormation JSON: template-version or typed Resources.
|
|
205
|
+
if (/"\$schema"\s*:\s*"[^"]*deploymentTemplate\.json/i.test(head)) return "arm";
|
|
206
|
+
if (/"AWSTemplateFormatVersion"/.test(head)) return "cloudformation";
|
|
207
|
+
if (/"Resources"\s*:/.test(head) && /"Type"\s*:\s*"(AWS|Alexa|Custom)::/.test(head))
|
|
208
|
+
return "cloudformation";
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
// yaml
|
|
212
|
+
if (/^AWSTemplateFormatVersion/m.test(head)) return "cloudformation";
|
|
213
|
+
if (/^Resources:/m.test(head) && /^\s+Type:\s*['"]?(AWS|Alexa|Custom)::/m.test(head))
|
|
214
|
+
return "cloudformation";
|
|
215
|
+
// A Go-templated file (`{{ … }}`) is a Helm chart template, NOT a raw Kubernetes
|
|
216
|
+
// manifest — even though it carries apiVersion/kind. Classifying it as kubernetes
|
|
217
|
+
// would double-count a Helm chart AND point checkov's k8s parser at un-rendered
|
|
218
|
+
// templates. Helm charts are detected by their `Chart.yaml` (classifyByPath); the
|
|
219
|
+
// helm framework renders the templates itself, so skip template files here.
|
|
220
|
+
if (head.includes("{{")) return null;
|
|
221
|
+
if (/^apiVersion:/m.test(head) && /^kind:/m.test(head)) return "kubernetes";
|
|
222
|
+
// Ansible playbook: a top-level play list with hosts + tasks/roles.
|
|
223
|
+
if (/^-\s+(name|hosts):/m.test(head) && /^\s+(hosts|tasks|roles):/m.test(head)) return "ansible";
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* The language a concern belongs to, for scope filtering: the scanner-reported
|
|
229
|
+
* language when present, else a path-only classification (fmt/validate/tflint
|
|
230
|
+
* only ever fire on Terraform), else terraform (the historical default — a
|
|
231
|
+
* reviewer-loaded concern with an unknowable file stays in the core scope
|
|
232
|
+
* rather than vanishing). Pure.
|
|
233
|
+
*/
|
|
234
|
+
export function languageOfConcern(c: {
|
|
235
|
+
language?: IacLanguage | undefined;
|
|
236
|
+
location: { file: string };
|
|
237
|
+
}): IacLanguage {
|
|
238
|
+
if (c.language) return c.language;
|
|
239
|
+
const byPath = classifyByPath(c.location.file);
|
|
240
|
+
return byPath === null || byPath === "needs-content" ? "terraform" : byPath;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// mirror walkTfFiles' bounds so a huge monorepo can't stall detection.
|
|
244
|
+
const SKIP_DIRS = new Set([
|
|
245
|
+
".git",
|
|
246
|
+
".terraform",
|
|
247
|
+
".terragrunt-cache",
|
|
248
|
+
".venv",
|
|
249
|
+
"venv",
|
|
250
|
+
"node_modules",
|
|
251
|
+
".idea",
|
|
252
|
+
".vscode",
|
|
253
|
+
]);
|
|
254
|
+
const MAX_DEPTH = 8;
|
|
255
|
+
const FILE_CAP = 4000;
|
|
256
|
+
// only this much of a yaml/json file is read for classification.
|
|
257
|
+
const SNIFF_BYTES = 4096;
|
|
258
|
+
|
|
259
|
+
/** the first SNIFF_BYTES of a file, without reading the rest (a giant yaml/json
|
|
260
|
+
* must not stall detection); "" when unreadable. */
|
|
261
|
+
function sniffHead(absPath: string): string {
|
|
262
|
+
try {
|
|
263
|
+
const fd = openSync(absPath, "r");
|
|
264
|
+
try {
|
|
265
|
+
const buf = Buffer.alloc(SNIFF_BYTES);
|
|
266
|
+
const n = readSync(fd, buf, 0, SNIFF_BYTES, 0);
|
|
267
|
+
return buf.toString("utf8", 0, n);
|
|
268
|
+
} finally {
|
|
269
|
+
closeSync(fd);
|
|
270
|
+
}
|
|
271
|
+
} catch {
|
|
272
|
+
return "";
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export interface DetectedLanguages {
|
|
277
|
+
/** every language present in the tree, most files first. */
|
|
278
|
+
detected: IacLanguage[];
|
|
279
|
+
/** file count per detected language (the scorecard's breadth line). */
|
|
280
|
+
fileCounts: Partial<Record<IacLanguage, number>>;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Walk the workspace and detect which IaC languages are present. Bounded (depth
|
|
285
|
+
* + file cap + skip dirs) and read-only; yaml/json files are sniffed from their
|
|
286
|
+
* first bytes only. Terraform is detected by extension; everything else by
|
|
287
|
+
* basename or unmistakable content markers. Pure-ish (read-only I/O).
|
|
288
|
+
*/
|
|
289
|
+
export function detectIacLanguages(cwd: string): DetectedLanguages {
|
|
290
|
+
const counts = new Map<IacLanguage, number>();
|
|
291
|
+
let seen = 0;
|
|
292
|
+
const visit = (dir: string, rel: string, depth: number): void => {
|
|
293
|
+
if (depth > MAX_DEPTH || seen >= FILE_CAP) return;
|
|
294
|
+
let entries: import("node:fs").Dirent[];
|
|
295
|
+
try {
|
|
296
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
297
|
+
} catch {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
for (const e of entries) {
|
|
301
|
+
if (seen >= FILE_CAP) return;
|
|
302
|
+
if (e.isDirectory()) {
|
|
303
|
+
if (SKIP_DIRS.has(e.name)) continue;
|
|
304
|
+
visit(join(dir, e.name), rel ? `${rel}/${e.name}` : e.name, depth + 1);
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
if (!e.isFile()) continue;
|
|
308
|
+
seen++;
|
|
309
|
+
const relPath = rel ? `${rel}/${e.name}` : e.name;
|
|
310
|
+
let lang = classifyByPath(relPath);
|
|
311
|
+
if (lang === "needs-content") {
|
|
312
|
+
lang = classifyByContent(relPath, sniffHead(join(dir, e.name)));
|
|
313
|
+
}
|
|
314
|
+
if (lang) counts.set(lang, (counts.get(lang) ?? 0) + 1);
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
visit(cwd, "", 0);
|
|
318
|
+
const detected = [...counts.entries()]
|
|
319
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
320
|
+
.map(([lang]) => lang);
|
|
321
|
+
const fileCounts: Partial<Record<IacLanguage, number>> = {};
|
|
322
|
+
for (const [lang, n] of counts) fileCounts[lang] = n;
|
|
323
|
+
return { detected, fileCounts };
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export interface LanguageScope {
|
|
327
|
+
/** the languages this run's read-only surfaces report on (scope ∩ scannable). */
|
|
328
|
+
scanned: IacLanguage[];
|
|
329
|
+
/** every language detected in the tree (superset of scanned + unsupported). */
|
|
330
|
+
detected: IacLanguage[];
|
|
331
|
+
fileCounts: Partial<Record<IacLanguage, number>>;
|
|
332
|
+
/** detected languages NO installed scanner can statically assess — surfaced,
|
|
333
|
+
* never silently dropped (e.g. pulumi). */
|
|
334
|
+
unsupported: { language: IacLanguage; reason: string }[];
|
|
335
|
+
/** iac_languages tokens that matched no known language (operator typo). */
|
|
336
|
+
unknown_tokens: string[];
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/** membership test for the scope filter (terraform is always in scope). */
|
|
340
|
+
export function inLanguageScope(scope: Pick<LanguageScope, "scanned">) {
|
|
341
|
+
const set = new Set<IacLanguage>(scope.scanned);
|
|
342
|
+
return (c: { language?: IacLanguage | undefined; location: { file: string } }): boolean =>
|
|
343
|
+
set.has(languageOfConcern(c));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Resolve the operator's `iac_languages` setting against what the tree actually
|
|
348
|
+
* contains. `auto` (the default) scans every detected language a scanner can
|
|
349
|
+
* read; `terraform` restores the historical Terraform-only behaviour; a comma
|
|
350
|
+
* list pins an explicit set (terraform is always included — the core product is
|
|
351
|
+
* never configured away). Detected-but-unscannable languages land in
|
|
352
|
+
* `unsupported` with the honest reason. Pure given the detection result.
|
|
353
|
+
*/
|
|
354
|
+
export function resolveLanguageScope(
|
|
355
|
+
raw: string | undefined,
|
|
356
|
+
detection: DetectedLanguages,
|
|
357
|
+
): LanguageScope {
|
|
358
|
+
const tokens = (raw ?? "auto")
|
|
359
|
+
.split(",")
|
|
360
|
+
.map((t) => t.trim().toLowerCase())
|
|
361
|
+
.filter(Boolean);
|
|
362
|
+
const auto = tokens.length === 0 || tokens.includes("auto");
|
|
363
|
+
const known = new Set<IacLanguage>(IAC_LANGUAGES);
|
|
364
|
+
const unknown_tokens = tokens.filter((t) => t !== "auto" && !known.has(t as IacLanguage));
|
|
365
|
+
|
|
366
|
+
const scannable = (lang: IacLanguage): boolean =>
|
|
367
|
+
LANGUAGE_COVERAGE[lang].trivy || LANGUAGE_COVERAGE[lang].checkov;
|
|
368
|
+
|
|
369
|
+
const wanted = new Set<IacLanguage>(["terraform"]);
|
|
370
|
+
if (auto) {
|
|
371
|
+
for (const lang of detection.detected) wanted.add(lang);
|
|
372
|
+
} else {
|
|
373
|
+
for (const t of tokens) {
|
|
374
|
+
if (known.has(t as IacLanguage)) wanted.add(t as IacLanguage);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const unsupported = [...wanted]
|
|
379
|
+
.filter((lang) => !scannable(lang))
|
|
380
|
+
.map((lang) => ({
|
|
381
|
+
language: lang,
|
|
382
|
+
reason: LANGUAGE_COVERAGE[lang].note ?? "no static scanner covers this language",
|
|
383
|
+
}));
|
|
384
|
+
|
|
385
|
+
const scanned = IAC_LANGUAGES.filter((lang) => wanted.has(lang) && scannable(lang));
|
|
386
|
+
return {
|
|
387
|
+
scanned,
|
|
388
|
+
detected: detection.detected,
|
|
389
|
+
fileCounts: detection.fileCounts,
|
|
390
|
+
unsupported,
|
|
391
|
+
unknown_tokens,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Enforce the matrix's own honesty rule AGAINST the run's actual scanner
|
|
397
|
+
* outcomes: a language whose every covering scanner was skipped/disabled this
|
|
398
|
+
* run (e.g. `tools_enabled: "-checkov"` on a Bicep repo — Bicep is checkov-only)
|
|
399
|
+
* moves from `scanned` to `unsupported` with the reason, instead of being
|
|
400
|
+
* reported as scanned-clean-with-zero-findings. Terraform always stays: the
|
|
401
|
+
* native toolchain (fmt/validate/tflint) covers it regardless of trivy/checkov.
|
|
402
|
+
*/
|
|
403
|
+
export function applyScannerAvailability(
|
|
404
|
+
scope: LanguageScope,
|
|
405
|
+
ran: { trivy: boolean; checkov: boolean },
|
|
406
|
+
): LanguageScope {
|
|
407
|
+
const uncovered = (lang: IacLanguage): boolean => {
|
|
408
|
+
if (lang === "terraform") return false;
|
|
409
|
+
const cov = LANGUAGE_COVERAGE[lang];
|
|
410
|
+
return !((cov.trivy && ran.trivy) || (cov.checkov && ran.checkov));
|
|
411
|
+
};
|
|
412
|
+
const dropped = scope.scanned.filter(uncovered);
|
|
413
|
+
if (dropped.length === 0) return scope;
|
|
414
|
+
return {
|
|
415
|
+
...scope,
|
|
416
|
+
scanned: scope.scanned.filter((lang) => !uncovered(lang)),
|
|
417
|
+
unsupported: [
|
|
418
|
+
...scope.unsupported,
|
|
419
|
+
...dropped.map((lang) => {
|
|
420
|
+
const cov = LANGUAGE_COVERAGE[lang];
|
|
421
|
+
const covering = [cov.trivy ? "trivy" : null, cov.checkov ? "checkov" : null]
|
|
422
|
+
.filter(Boolean)
|
|
423
|
+
.join(" / ");
|
|
424
|
+
return {
|
|
425
|
+
language: lang,
|
|
426
|
+
reason: `its covering scanner${covering.includes("/") ? "s" : ""} (${covering}) did not run this time — coverage gap, not a pass`,
|
|
427
|
+
};
|
|
428
|
+
}),
|
|
429
|
+
],
|
|
430
|
+
};
|
|
431
|
+
}
|