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,8 @@
|
|
|
1
|
+
/** Region these list prices were captured for. */
|
|
2
|
+
export declare const AZURE_PRICE_REGION = "westeurope";
|
|
3
|
+
/** Currency of every price below. */
|
|
4
|
+
export declare const AZURE_PRICE_CURRENCY = "EUR";
|
|
5
|
+
/** ISO date the snapshot was captured — surfaced in cost.md so staleness is visible. */
|
|
6
|
+
export declare const AZURE_PRICE_FETCHED_AT = "2026-07-25";
|
|
7
|
+
/** meter key → list price per HOUR. */
|
|
8
|
+
export declare const AZURE_HOURLY_PRICES: Record<string, number>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Concern, type Severity } from "#app/mcp/terraform/types";
|
|
2
|
+
export declare const BASELINE_FILENAME = ".infraweaver.baseline.json";
|
|
3
|
+
/** Findings at/above this severity fail the gate. High = high + critical. */
|
|
4
|
+
export declare const DEFAULT_GATE_SEVERITY: Severity;
|
|
5
|
+
export interface BaselineFile {
|
|
6
|
+
version: 1;
|
|
7
|
+
/** ISO date the baseline was taken (informational). */
|
|
8
|
+
created?: string;
|
|
9
|
+
/** line-independent concern keys (see `concernKeyOf`) present at baseline time. */
|
|
10
|
+
keys: string[];
|
|
11
|
+
}
|
|
12
|
+
/** The serialized baseline for the current concern set (what a `--write-baseline` emits). */
|
|
13
|
+
export declare function serializeBaseline(concerns: Concern[], created: string): BaselineFile;
|
|
14
|
+
/** Parse baseline JSON into a key set; tolerant of a malformed/old file (→ null). */
|
|
15
|
+
export declare function parseBaseline(raw: string): Set<string> | null;
|
|
16
|
+
/** Load `.infraweaver.baseline.json` under `cwd`; null when absent/unreadable/malformed. */
|
|
17
|
+
export declare function loadBaseline(cwd: string | undefined): Set<string> | null;
|
|
18
|
+
export interface LoadedBaseline {
|
|
19
|
+
keys: Set<string>;
|
|
20
|
+
/** ISO date the baseline was taken — the report's "since baseline (…)" label. */
|
|
21
|
+
created: string | null;
|
|
22
|
+
}
|
|
23
|
+
/** Load the baseline WITH its `created` date (the report's delta needs both the
|
|
24
|
+
* keys to diff against and the date to label the comparison). Null when
|
|
25
|
+
* absent/unreadable/malformed. `loadBaseline` stays the keys-only path the gate uses. */
|
|
26
|
+
export declare function loadBaselineWithMeta(cwd: string | undefined): LoadedBaseline | null;
|
|
27
|
+
export interface BaselineDelta {
|
|
28
|
+
/** active keys NOT in the baseline — new since the checkpoint. */
|
|
29
|
+
added: number;
|
|
30
|
+
/** baseline keys no longer present — cleared since the checkpoint. */
|
|
31
|
+
fixed: number;
|
|
32
|
+
/** keys in both — carried, unchanged. */
|
|
33
|
+
unchanged: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The new / fixed / unchanged split of the current ACTIVE concern set against a
|
|
37
|
+
* baseline checkpoint, keyed line-independently (`concernKeyOf`) so a line shift
|
|
38
|
+
* never reads as a fix or a regression. Pure — the report's "what changed" line.
|
|
39
|
+
*/
|
|
40
|
+
export declare function baselineDelta(concerns: Concern[], baselineKeys: Set<string>): BaselineDelta;
|
|
41
|
+
export interface GateResult {
|
|
42
|
+
/** active concerns whose key is NOT in the baseline (or all, when no baseline). */
|
|
43
|
+
newConcerns: Concern[];
|
|
44
|
+
/** the new concerns at/above the gate severity — these fail the check. */
|
|
45
|
+
gating: Concern[];
|
|
46
|
+
/** true = the gate passes (no new finding at/above the gate severity). */
|
|
47
|
+
pass: boolean;
|
|
48
|
+
/** whether a baseline was supplied (false ⇒ every active concern is "new"). */
|
|
49
|
+
hasBaseline: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Evaluate the gate. `concerns` should already be the ACTIVE set (suppressed
|
|
53
|
+
* concerns excluded — a suppression keeps a finding out of the gate by design).
|
|
54
|
+
* With no baseline (`baselineKeys` null) every active concern counts as new, so
|
|
55
|
+
* the gate behaves as a plain High/Critical gate.
|
|
56
|
+
*/
|
|
57
|
+
export declare function evaluateGate(concerns: Concern[], baselineKeys: Set<string> | null, threshold?: Severity): GateResult;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { LocalToolContext } from "#app/mcp/localContext";
|
|
2
|
+
import { annotateGroups, planBatches } from "#app/mcp/terraform/decisions";
|
|
3
|
+
import { type Concern, type Severity } from "#app/mcp/terraform/types";
|
|
4
|
+
export interface ConcernResult {
|
|
5
|
+
/** non-suppressed concerns ≥ threshold, sorted */
|
|
6
|
+
active: Concern[];
|
|
7
|
+
/** concerns that matched a suppression rule */
|
|
8
|
+
suppressed: Concern[];
|
|
9
|
+
/** active ∪ suppressed (post-suppression annotation) — scan stores this as lastScanConcerns */
|
|
10
|
+
annotated: Concern[];
|
|
11
|
+
groups: ReturnType<typeof annotateGroups>;
|
|
12
|
+
batchPlan: ReturnType<typeof planBatches>;
|
|
13
|
+
bySeverity: Record<string, number>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The shared concerns→result pipeline behind `terraform_scan` and `read_findings`:
|
|
17
|
+
* capture the line-pinned + line-independent baseline (so verify's regression diff
|
|
18
|
+
* is apples-to-apples), filter to in-scope Terraform concerns ≥ threshold, apply
|
|
19
|
+
* suppressions, group + annotate autonomy, plan batches, and tally by severity.
|
|
20
|
+
* Both tools then wrap their own envelope around this. The diff-scope predicate is
|
|
21
|
+
* `scan`-only (defaults to "everything in scope"); `lastScanConcerns` is written by
|
|
22
|
+
* `scan` from `annotated`, not here, since `read_findings` does not set it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildConcernResult(ctx: LocalToolContext, rawConcerns: Concern[], opts: {
|
|
25
|
+
cwd: string;
|
|
26
|
+
minRank: number;
|
|
27
|
+
grouping: "file" | "rule";
|
|
28
|
+
autonomyThreshold: Severity;
|
|
29
|
+
inScope?: (c: Concern) => boolean;
|
|
30
|
+
/** How this call affects the session's verify baseline. `replace` (default)
|
|
31
|
+
* is for the full-workspace sources (`scan`, `read_findings`). The narrow
|
|
32
|
+
* concern sources (`detect_plan_drift`, `ingest_external_findings`) pass
|
|
33
|
+
* `merge`: their small set must JOIN an existing scan baseline, not clobber
|
|
34
|
+
* it — otherwise a later `terraform_verify_remediation` diffs the full
|
|
35
|
+
* re-scan against the narrow set and reports every pre-existing scanner
|
|
36
|
+
* concern as a false regression. */
|
|
37
|
+
baselineMode?: "replace" | "merge";
|
|
38
|
+
}): ConcernResult;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type RunResult } from "#app/mcp/terraform/subprocess";
|
|
2
|
+
export interface CostBreakdown {
|
|
3
|
+
/** total estimated monthly cost, or null when no resources are priced. */
|
|
4
|
+
totalMonthlyCost: number | null;
|
|
5
|
+
currency: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Parse `infracost breakdown --format json`. The top-level `totalMonthlyCost`
|
|
9
|
+
* is a decimal string (absent / null when a project has no priced resources);
|
|
10
|
+
* `currency` defaults to USD. A missing/unparseable cost becomes null so the
|
|
11
|
+
* caller reports "unpriced" rather than a misleading $0.00.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseInfracostBreakdown(stdout: string): CostBreakdown;
|
|
14
|
+
export interface ResourceCost {
|
|
15
|
+
name: string;
|
|
16
|
+
monthlyCost: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse the per-resource monthly costs from `infracost breakdown --format json`
|
|
20
|
+
* (`projects[].breakdown.resources[]`), so a cost increase can be attributed to
|
|
21
|
+
* the specific resources that drove it instead of just a total. Skips unpriced
|
|
22
|
+
* (null/zero) resources; returns them sorted most-expensive first. Pure.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseInfracostResources(stdout: string): ResourceCost[];
|
|
25
|
+
export interface CostDelta {
|
|
26
|
+
currency: string;
|
|
27
|
+
baselineMonthly: number | null;
|
|
28
|
+
currentMonthly: number | null;
|
|
29
|
+
/** current − baseline, rounded to cents; null when either side is unknown. */
|
|
30
|
+
deltaMonthly: number | null;
|
|
31
|
+
direction: "increase" | "decrease" | "no-change" | "unknown";
|
|
32
|
+
}
|
|
33
|
+
/** Pure cost-delta computation: current (post-fix) vs the base-branch baseline. */
|
|
34
|
+
export declare function computeCostDelta(baseline: CostBreakdown | null, current: CostBreakdown): CostDelta;
|
|
35
|
+
export interface CostEscalation {
|
|
36
|
+
/** true when the monthly increase meets/exceeds the operator's threshold. */
|
|
37
|
+
escalate: boolean;
|
|
38
|
+
reason?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* decide whether a cost increase is large enough to escalate the PR
|
|
42
|
+
* to human review (`needs-human`). Compares the monthly delta against the
|
|
43
|
+
* operator's `cost_increase_block_usd` threshold. No threshold set, an unknown
|
|
44
|
+
* delta, or a decrease/no-change ⇒ no escalation. Pure + deterministic so the
|
|
45
|
+
* decision is auditable, not a model judgement.
|
|
46
|
+
*/
|
|
47
|
+
export declare function classifyCostEscalation(deltaMonthly: number | null, thresholdUsd: number | undefined): CostEscalation;
|
|
48
|
+
export declare function runInfracostBreakdown(scanCwd: string, key: string): RunResult;
|
|
49
|
+
/**
|
|
50
|
+
* Cost of the base-branch version of the same Terraform, computed in a detached
|
|
51
|
+
* git worktree so the current (fixed) checkout is never disturbed. Best-effort:
|
|
52
|
+
* any failure (no base ref, worktree add fails, infracost errors) returns null
|
|
53
|
+
* and the caller falls back to reporting current cost only.
|
|
54
|
+
*/
|
|
55
|
+
export declare function infracostBaseline(cwd: string, key: string, tmpdir: string): CostBreakdown | null;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type Concern, type Severity } from "#app/mcp/terraform/types";
|
|
2
|
+
declare const ExternalFinding: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
3
|
+
rule_id: string;
|
|
4
|
+
provider?: string;
|
|
5
|
+
severity?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
message?: string;
|
|
8
|
+
remediation?: string;
|
|
9
|
+
resource?: {
|
|
10
|
+
address?: string;
|
|
11
|
+
type?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
id?: string;
|
|
14
|
+
arn?: string;
|
|
15
|
+
tags?: string[];
|
|
16
|
+
};
|
|
17
|
+
}, {}>;
|
|
18
|
+
export declare const ExternalFindingsFile: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
19
|
+
schema?: string;
|
|
20
|
+
findings: {
|
|
21
|
+
rule_id: string;
|
|
22
|
+
provider?: string;
|
|
23
|
+
severity?: string;
|
|
24
|
+
title?: string;
|
|
25
|
+
message?: string;
|
|
26
|
+
remediation?: string;
|
|
27
|
+
resource?: {
|
|
28
|
+
address?: string;
|
|
29
|
+
type?: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
id?: string;
|
|
32
|
+
arn?: string;
|
|
33
|
+
tags?: string[];
|
|
34
|
+
};
|
|
35
|
+
}[];
|
|
36
|
+
}, {}>;
|
|
37
|
+
export type ExternalFinding = typeof ExternalFinding.infer;
|
|
38
|
+
/** True for a parsed object that looks like an external-findings feed (vs a SARIF or
|
|
39
|
+
* reviewer findings.json), so a dispatcher can route it. */
|
|
40
|
+
export declare function isExternalFindings(parsed: unknown): boolean;
|
|
41
|
+
export interface TfResourceEntry {
|
|
42
|
+
/** `type.name` — the Terraform address of the block. */
|
|
43
|
+
address: string;
|
|
44
|
+
type: string;
|
|
45
|
+
name: string;
|
|
46
|
+
file: string;
|
|
47
|
+
/** 1-based line of the `resource "type" "name" {` header. */
|
|
48
|
+
line: number;
|
|
49
|
+
/** String-literal values inside the block body (bucket names, tags, ids) — the
|
|
50
|
+
* values a CSPM alert's cloud id / ARN is correlated against. Lower-cased. */
|
|
51
|
+
identifiers: string[];
|
|
52
|
+
}
|
|
53
|
+
/** Build a line-aware index of every `resource` block across the given `.tf` files. */
|
|
54
|
+
export declare function indexTfResources(files: ReadonlyArray<{
|
|
55
|
+
file: string;
|
|
56
|
+
hcl: string;
|
|
57
|
+
}>): TfResourceEntry[];
|
|
58
|
+
/** Correlate one external finding to a resource block, best key first. Returns the
|
|
59
|
+
* matched entry, or null when the alert can't be tied to code. */
|
|
60
|
+
export declare function matchResource(finding: ExternalFinding, index: TfResourceEntry[]): TfResourceEntry | null;
|
|
61
|
+
/** Why an alert couldn't be mapped to a resource in code (for honest reporting). */
|
|
62
|
+
export interface UnmappedFinding {
|
|
63
|
+
rule_id: string;
|
|
64
|
+
provider: string | null;
|
|
65
|
+
resource: ExternalFinding["resource"] | null;
|
|
66
|
+
reason: string;
|
|
67
|
+
}
|
|
68
|
+
export interface MappedExternalFindings {
|
|
69
|
+
concerns: Concern[];
|
|
70
|
+
unmapped: UnmappedFinding[];
|
|
71
|
+
}
|
|
72
|
+
/** Normalise an external severity string (word or numeric CVSS) to our scale. */
|
|
73
|
+
export declare function normalizeExternalSeverity(raw: string | undefined): Severity;
|
|
74
|
+
/**
|
|
75
|
+
* Turn a batch of external findings into `reviewer`-source concerns by mapping each
|
|
76
|
+
* to its Terraform resource. Unmappable alerts are returned separately so the caller
|
|
77
|
+
* can report them honestly rather than drop them.
|
|
78
|
+
*/
|
|
79
|
+
export declare function mapExternalFindings(findings: ReadonlyArray<ExternalFinding>, index: TfResourceEntry[]): MappedExternalFindings;
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version currency (provider currency / module upgrades).
|
|
3
|
+
*
|
|
4
|
+
* Answers one question the scanners can't: "is a NEWER version available?"
|
|
5
|
+
* tflint checks that versions are *pinned*; nothing we run checks that they're
|
|
6
|
+
* *current*. This module compares the workspace's pinned provider requirements
|
|
7
|
+
* and registry-module pins against the Terraform Registry's published versions.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately NOT a scanner source: results are advisory intelligence the
|
|
10
|
+
* Remediate mode turns into `chore(deps)` upgrade PRs, not `Concern`s — the
|
|
11
|
+
* finding baseline stays scanner-owned (see docs/workplan/04-implementation-plan.md).
|
|
12
|
+
*
|
|
13
|
+
* Degrades green everywhere: a per-source lookup failure is reported on that
|
|
14
|
+
* row (`lookup: "error" | "not_found" | "unsupported_source"`), and only a
|
|
15
|
+
* fully-unreachable registry (every lookup failed) becomes a tool-level skip.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DEFAULT_REGISTRY_BASE_URL = "https://registry.terraform.io";
|
|
18
|
+
/**
|
|
19
|
+
* Convert ONE Terraform version constraint string (comma-separated comparators,
|
|
20
|
+
* AND semantics) into an npm semver range, or null when any comparator is
|
|
21
|
+
* unparseable. `~>` is Terraform's pessimistic operator: the RIGHTMOST given
|
|
22
|
+
* component may float (`~> 5.0` → `>=5.0.0 <6.0.0`, `~> 5.1.2` → `>=5.1.2 <5.2.0`,
|
|
23
|
+
* `~> 5` → `>=5.0.0 <6.0.0`). `!=` comparators have no single-range npm
|
|
24
|
+
* equivalent and are skipped — acceptable here because the result only ranks
|
|
25
|
+
* candidate versions, it never selects what gets installed.
|
|
26
|
+
*/
|
|
27
|
+
export declare function terraformConstraintToRange(constraint: string): string | null;
|
|
28
|
+
export interface CurrencyVerdict {
|
|
29
|
+
/** newest stable version the registry publishes (null: nothing published). */
|
|
30
|
+
latest: string | null;
|
|
31
|
+
/** newest published version the written constraint admits (null: no
|
|
32
|
+
* constraint, unparseable constraint, or nothing satisfies). */
|
|
33
|
+
newestSatisfying: string | null;
|
|
34
|
+
/** true when the registry has a stable version the constraint does NOT admit
|
|
35
|
+
* — i.e. an upgrade PR is available. Always false without a constraint. */
|
|
36
|
+
outdated: boolean;
|
|
37
|
+
/** how many MAJORs the constraint's best version trails the latest by —
|
|
38
|
+
* >0 signals an interface-risk upgrade that must be `needs-human`. */
|
|
39
|
+
majorsBehind: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function classifyCurrency(params: {
|
|
42
|
+
constraint: string | null;
|
|
43
|
+
available: string[];
|
|
44
|
+
}): CurrencyVerdict;
|
|
45
|
+
export type LookupStatus = "ok" | "not_found" | "error" | "unsupported_source";
|
|
46
|
+
/** strip a leading default-registry host; reject other hosts (private/TFE
|
|
47
|
+
* registries use different auth + paths — out of scope for the public check). */
|
|
48
|
+
export declare function normalizeRegistryPath(base: string, expectedSegments: number): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* One registry GET that returns parsed JSON or a per-lookup status. Shared by
|
|
51
|
+
* the version-currency lookups here and the registry module-detail/search
|
|
52
|
+
* lookups in `./registry.ts` so every registry call degrades green identically:
|
|
53
|
+
* 404 → `not_found`, network/non-2xx/parse failure → `error`. `headers` carries
|
|
54
|
+
* the `Authorization: Bearer …` token for a private-registry call (public default
|
|
55
|
+
* registry calls pass none).
|
|
56
|
+
*/
|
|
57
|
+
export declare function fetchRegistryJson(url: string, headers?: Record<string, string>): Promise<{
|
|
58
|
+
status: LookupStatus;
|
|
59
|
+
body: unknown;
|
|
60
|
+
}>;
|
|
61
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
62
|
+
/** GET /v1/providers/{namespace}/{type}/versions — provider release list. */
|
|
63
|
+
export declare function fetchProviderVersions(source: string, opts?: {
|
|
64
|
+
baseUrl?: string;
|
|
65
|
+
}): Promise<{
|
|
66
|
+
status: LookupStatus;
|
|
67
|
+
versions: string[];
|
|
68
|
+
}>;
|
|
69
|
+
/** GET /v1/modules/{namespace}/{name}/{provider}/versions — registry-module
|
|
70
|
+
* release list (the response nests per-module records; the first is the
|
|
71
|
+
* requested module, the rest are dependency records we don't want). */
|
|
72
|
+
export declare function fetchModuleVersions(sourceBase: string, opts?: {
|
|
73
|
+
baseUrl?: string;
|
|
74
|
+
}): Promise<{
|
|
75
|
+
status: LookupStatus;
|
|
76
|
+
versions: string[];
|
|
77
|
+
}>;
|
|
78
|
+
export interface ProviderCurrencyRow {
|
|
79
|
+
name: string;
|
|
80
|
+
source: string;
|
|
81
|
+
constraint: string | null;
|
|
82
|
+
latest: string | null;
|
|
83
|
+
newest_satisfying: string | null;
|
|
84
|
+
outdated: boolean;
|
|
85
|
+
majors_behind: number;
|
|
86
|
+
lookup: LookupStatus;
|
|
87
|
+
}
|
|
88
|
+
export interface ModuleCurrencyRow {
|
|
89
|
+
name: string;
|
|
90
|
+
source: string;
|
|
91
|
+
version: string | null;
|
|
92
|
+
latest: string | null;
|
|
93
|
+
newest_satisfying: string | null;
|
|
94
|
+
outdated: boolean;
|
|
95
|
+
/** registry module with no `version` attribute — pin it (to `latest`). */
|
|
96
|
+
unpinned: boolean;
|
|
97
|
+
lookup: LookupStatus;
|
|
98
|
+
declared_in: string;
|
|
99
|
+
}
|
|
100
|
+
export interface CurrencyReport {
|
|
101
|
+
providers: ProviderCurrencyRow[];
|
|
102
|
+
modules: ModuleCurrencyRow[];
|
|
103
|
+
outdated_count: number;
|
|
104
|
+
unpinned_count: number;
|
|
105
|
+
lookups_attempted: number;
|
|
106
|
+
lookups_failed: number;
|
|
107
|
+
}
|
|
108
|
+
export declare function checkVersionCurrency(cwd: string, opts?: {
|
|
109
|
+
baseUrl?: string;
|
|
110
|
+
}): Promise<CurrencyReport>;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { CostDelta } from "#app/mcp/terraform/cost";
|
|
2
|
+
import { type Autonomy, type BlastTier, type Concern, type ConcernGroup, type Severity } from "#app/mcp/terraform/types";
|
|
3
|
+
/** group concerns by file into scoped units, sorted by max severity. */
|
|
4
|
+
export declare function groupConcerns(concerns: Concern[]): ConcernGroup[];
|
|
5
|
+
/**
|
|
6
|
+
* group concerns by RULE across files instead of by file. When a single
|
|
7
|
+
* rule fires in many files ("add `tags` to every resource", "enable encryption
|
|
8
|
+
* on every bucket"), fixing it as ONE coherent change is far better than N
|
|
9
|
+
* near-identical per-file PRs. Each group covers one `rule_id` and lists every
|
|
10
|
+
* `file` it spans; the branch key (`remediate/<id>`) is rule-derived and stable.
|
|
11
|
+
* Opt-in (scan `group_by: "rule"`) — by-file stays the default because it keeps
|
|
12
|
+
* each PR's blast radius smaller; by-rule suits sweeping, low-risk rules.
|
|
13
|
+
*/
|
|
14
|
+
export declare function groupConcernsByRule(concerns: Concern[]): ConcernGroup[];
|
|
15
|
+
/**
|
|
16
|
+
* annotate each group with an autonomy decision. Works for BOTH grouping
|
|
17
|
+
* modes: it resolves a group's concerns by `concern_ids` membership (not by
|
|
18
|
+
* `file`, which is just a label for by-rule groups), so the severity/category
|
|
19
|
+
* policy applies identically. Blast radius isn't known until terraform_plan
|
|
20
|
+
* runs, so it can only escalate a group later (the plan tool + prompt apply the
|
|
21
|
+
* `high`-blast override); at scan time autonomy is severity/category-driven.
|
|
22
|
+
*/
|
|
23
|
+
export declare function annotateGroups(groups: ConcernGroup[], all: Concern[], threshold: Severity): ConcernGroup[];
|
|
24
|
+
export interface BatchPlan {
|
|
25
|
+
/** group ids safe to combine into ONE low-risk PR (`remediate/batch-<hash>`). */
|
|
26
|
+
batchable: string[];
|
|
27
|
+
/** group ids that must each get their own PR (security / higher severity /
|
|
28
|
+
* needs-human / large blast). */
|
|
29
|
+
isolated: string[];
|
|
30
|
+
/** deterministic branch name for the batch (stable for the same member set). */
|
|
31
|
+
batch_branch: string | null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* split annotated groups into a single low-risk BATCH (merged into one
|
|
35
|
+
* easy-to-review PR) and the riskier groups that each stay ISOLATED in their own
|
|
36
|
+
* PR (so they can be reviewed/reverted independently). The batch branch name
|
|
37
|
+
* hashes the sorted member ids, so re-runs over the same set reuse the branch
|
|
38
|
+
* (idempotent). Returns `batch_branch: null` when fewer than two groups are
|
|
39
|
+
* batchable (one group is just a normal single-group PR, not a batch).
|
|
40
|
+
*/
|
|
41
|
+
export declare function planBatches(groups: ConcernGroup[]): BatchPlan;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the canonical documentation URL for a concern's rule, for the PR's
|
|
44
|
+
* per-finding explanation. Prefers the scanner's own `remediation_hint` when it
|
|
45
|
+
* is already a URL (checkov guideline, tflint rule link, trivy reference).
|
|
46
|
+
* Otherwise derives the well-known page deterministically: a trivy `AVD-*` rule
|
|
47
|
+
* maps to its Aqua Vulnerability Database page. Returns null when no canonical
|
|
48
|
+
* URL is known (the agent then explains from `evidence` alone).
|
|
49
|
+
*/
|
|
50
|
+
export declare function ruleDocUrl(concern: Pick<Concern, "rule_id" | "remediation_hint">): string | null;
|
|
51
|
+
/** distinct rule→doc-url map for a group, for the PR body's per-finding links. */
|
|
52
|
+
export declare function docUrlsForGroup(g: ConcernGroup, all: Concern[]): Record<string, string>;
|
|
53
|
+
export interface AutonomyDecision {
|
|
54
|
+
autonomy: Autonomy;
|
|
55
|
+
/** human-readable reasons a group was escalated (empty for `auto`). */
|
|
56
|
+
reasons: string[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Decide whether a group of concerns can be auto-fixed and opened as a normal
|
|
60
|
+
* PR (`auto`), or must be flagged for human review (`needs-human`). Trivial
|
|
61
|
+
* findings (style/correctness, deprecated args, missing tags, formatting) open
|
|
62
|
+
* as normal; high-severity SECURITY findings escalate by default, as does a
|
|
63
|
+
* `high` blast radius regardless of finding severity (overrides upward).
|
|
64
|
+
*
|
|
65
|
+
* `threshold` is the minimum severity at which a *security* concern escalates
|
|
66
|
+
* (default `high`, so critical/high security → human; medium/low → auto). The
|
|
67
|
+
* decision is deterministic and computed from the `Concern` model's existing
|
|
68
|
+
* `severity` + `category` — no model self-assessment.
|
|
69
|
+
*/
|
|
70
|
+
export declare function classifyAutonomy(concerns: Pick<Concern, "severity" | "category">[], threshold?: Severity, blastTier?: BlastTier): AutonomyDecision;
|
|
71
|
+
export interface SuggestionDecision {
|
|
72
|
+
/** true ⇒ post a GitHub one-click `suggestion` instead of opening a full PR. */
|
|
73
|
+
suggest: boolean;
|
|
74
|
+
reason: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* decide whether a fix is small/low-risk enough to post as a GitHub
|
|
78
|
+
* one-click **suggested change** (a ` ```suggestion ` block on the existing PR)
|
|
79
|
+
* rather than opening a whole `remediate/*` branch + PR. Much lower friction for
|
|
80
|
+
* trivial fixes. Only when ALL hold: there IS an existing PR context (a comment
|
|
81
|
+
* trigger on a PR); the group is `low`/`info` severity; the fix is a single hunk
|
|
82
|
+
* in a single file; and the blast radius (when known) is `low`. Anything bigger
|
|
83
|
+
* keeps full-PR mode.
|
|
84
|
+
*/
|
|
85
|
+
export declare function shouldSuggestInline(opts: {
|
|
86
|
+
hasPrContext: boolean;
|
|
87
|
+
severity: Severity;
|
|
88
|
+
fileCount: number;
|
|
89
|
+
hunkCount: number;
|
|
90
|
+
blastTier?: BlastTier | undefined;
|
|
91
|
+
}): SuggestionDecision;
|
|
92
|
+
export type Confidence = "high" | "medium" | "low";
|
|
93
|
+
export interface ConfidenceSignals {
|
|
94
|
+
/** every targeted concern id was cleared by the re-scan. */
|
|
95
|
+
verified: boolean;
|
|
96
|
+
/** count of NEW concern ids the fix introduced (0 is good). */
|
|
97
|
+
regressionCount: number;
|
|
98
|
+
/** second plan matched the first. undefined when plan didn't run. */
|
|
99
|
+
idempotent?: boolean | undefined;
|
|
100
|
+
/** blast tier. undefined when plan didn't run. */
|
|
101
|
+
blastTier?: BlastTier | undefined;
|
|
102
|
+
/** cost direction. undefined when infracost didn't run. */
|
|
103
|
+
costDirection?: CostDelta["direction"] | undefined;
|
|
104
|
+
}
|
|
105
|
+
export interface ConfidenceResult {
|
|
106
|
+
level: Confidence;
|
|
107
|
+
reasons: string[];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Derive a fix's confidence DETERMINISTICALLY from the verification evidence
|
|
111
|
+
* already gathered — never a model self-assessment, which keeps it honest.
|
|
112
|
+
*
|
|
113
|
+
* - A fix that didn't verify or introduced a regression is `low`:
|
|
114
|
+
* the proof failed, full stop.
|
|
115
|
+
* - Otherwise it starts `high` and is capped to `medium` by any weaker signal:
|
|
116
|
+
* a non-deterministic plan (`idempotent: false`), a `high` blast radius,
|
|
117
|
+
* a cost increase, or a signal that was *skipped* (plan /
|
|
118
|
+
* infracost didn't run, so we have less proof — `high` requires the full
|
|
119
|
+
* stack). A skipped signal lowers confidence but does not, by itself, make a
|
|
120
|
+
* verified, regression-free fix `low`.
|
|
121
|
+
*/
|
|
122
|
+
export declare function computeConfidence(signals: ConfidenceSignals): ConfidenceResult;
|
|
123
|
+
export interface RefusalDecision {
|
|
124
|
+
/** true ⇒ this concern needs a human decision; prefer a structured non-fix
|
|
125
|
+
* (an issue) over guessing a fix that could break the stack. */
|
|
126
|
+
refuse: boolean;
|
|
127
|
+
reason?: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* advisory check: would auto-fixing this concern require a judgement only
|
|
131
|
+
* a human can make? If so, the Remediate flow should post a STRUCTURED refusal
|
|
132
|
+
* (an issue describing the concern, why it won't auto-fix, and what a human
|
|
133
|
+
* should do) rather than guess a fix that could break the stack. Deterministic
|
|
134
|
+
* and conservative — it only flags the well-known human-decision classes.
|
|
135
|
+
*/
|
|
136
|
+
export declare function classifyRefusal(concern: Pick<Concern, "rule_id" | "evidence">): RefusalDecision;
|
|
137
|
+
/**
|
|
138
|
+
* format a structured non-fix for a concern Infraweaver won't auto-fix. The
|
|
139
|
+
* output is a Markdown issue body: what's wrong, why it isn't auto-fixed, and
|
|
140
|
+
* the concrete next step for a human. Pure (string in → string out).
|
|
141
|
+
*/
|
|
142
|
+
export declare function buildRefusalReport(input: {
|
|
143
|
+
concern: Pick<Concern, "rule_id" | "evidence" | "location">;
|
|
144
|
+
whyNoAutoFix: string;
|
|
145
|
+
humanAction: string;
|
|
146
|
+
}): string;
|
|
147
|
+
export interface PreventiveControl {
|
|
148
|
+
/** the mechanism that stops this class of concern recurring. */
|
|
149
|
+
mechanism: string;
|
|
150
|
+
/** a copy-pasteable config/CI snippet. */
|
|
151
|
+
snippet: string;
|
|
152
|
+
note: string;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* alongside the patch, suggest the guardrail that stops the concern
|
|
156
|
+
* RECURRING: a CI gate keyed on the producing scanner. Deterministic by source
|
|
157
|
+
* (the scanner is the right enforcement point), parameterised by the rule id.
|
|
158
|
+
* Returns null for sources with no natural preventive gate.
|
|
159
|
+
*/
|
|
160
|
+
export declare function preventiveControlFor(concern: Pick<Concern, "source" | "rule_id">): PreventiveControl | null;
|
|
161
|
+
export interface LocationCluster {
|
|
162
|
+
file: string;
|
|
163
|
+
line: number | null;
|
|
164
|
+
/** the concern ids at this exact location (likely the same underlying defect). */
|
|
165
|
+
concern_ids: string[];
|
|
166
|
+
/** the distinct scanners that flagged this location. */
|
|
167
|
+
sources: string[];
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* surface concerns that DIFFERENT scanners flagged at the same `file:line`
|
|
171
|
+
* — almost always the same underlying defect (trivy ∩ checkov overlap heavily on
|
|
172
|
+
* e.g. S3 encryption). Reported so the agent writes ONE canonical fix + ONE
|
|
173
|
+
* explanation for the cluster rather than treating each as separate work. This
|
|
174
|
+
* is purely advisory: it NEVER removes a concern from the verification set (a
|
|
175
|
+
* missing id must still provably clear), so it can't drop a real finding. Only
|
|
176
|
+
* clusters spanning more than one scanner are returned.
|
|
177
|
+
*/
|
|
178
|
+
export declare function clusterByLocation(concerns: Concern[]): LocationCluster[];
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §5.16 (first half) — the eIDAS assurance-level declaration.
|
|
3
|
+
*
|
|
4
|
+
* WHAT PROBLEM THIS SOLVES TODAY. The evidence bundle carries
|
|
5
|
+
* `signature: { algorithm: "ed25519", … }`, and a reader in a procurement or
|
|
6
|
+
* audit context can very reasonably over-read that as a legal seal. Under
|
|
7
|
+
* eIDAS (Reg. (EU) 910/2014 as amended by 2024/1183) an *electronic seal* is a
|
|
8
|
+
* defined legal instrument with three tiers, and ours is at the bottom one:
|
|
9
|
+
*
|
|
10
|
+
* - **simple** — data attached to other data to ensure origin and integrity.
|
|
11
|
+
* A raw Ed25519 signature over the bytes is exactly this, and no more.
|
|
12
|
+
* - **advanced** (Art. 36) — additionally uniquely linked to, and capable of
|
|
13
|
+
* identifying, the creating legal person, using seal-creation data that
|
|
14
|
+
* person controls. That requires a certificate binding the key to an
|
|
15
|
+
* identity; a bare public key in a JSON file binds it to nobody.
|
|
16
|
+
* - **qualified** (Art. 35) — an advanced seal created by a qualified
|
|
17
|
+
* seal-creation device with a **qualified certificate** from a QTSP on the
|
|
18
|
+
* EU Trusted List. Only this tier gets the Art. 35(2) presumption of
|
|
19
|
+
* integrity and correctness of origin.
|
|
20
|
+
*
|
|
21
|
+
* Art. 41's qualified electronic **time stamp** is a separate qualified service
|
|
22
|
+
* again, and is what gives a presumption about the *date and time*.
|
|
23
|
+
*
|
|
24
|
+
* SO THE BUNDLE SAYS SO, IN MACHINE-READABLE FORM. This block is not a
|
|
25
|
+
* disclaimer in prose that a parser skips — it is a field with a closed
|
|
26
|
+
* vocabulary, inside the signed bytes, that a buyer's tooling can assert on.
|
|
27
|
+
* Declaring a limit precisely is worth more than implying a capability we do
|
|
28
|
+
* not have, and this is the same correction the `suppressions` block made: the
|
|
29
|
+
* human-readable report and the signed artifact must not disagree about what a
|
|
30
|
+
* claim covers.
|
|
31
|
+
*
|
|
32
|
+
* ⚠️ WHAT IS DELIBERATELY NOT HERE. No ASiC-E container, no CAdES-LTA, no
|
|
33
|
+
* RFC 3161 timestamping, no QTSP integration. Those are the rest of §5.16 and
|
|
34
|
+
* they are blocked on a commercial and legal step — onboarding with a qualified
|
|
35
|
+
* trust service provider — that has not started. Building seal machinery we
|
|
36
|
+
* cannot exercise against a real QTSP would produce artifacts nobody can
|
|
37
|
+
* verify, and in an attestation product an unverifiable seal is worse than no
|
|
38
|
+
* seal. What this module does instead is make the CURRENT claim exact, and give
|
|
39
|
+
* the future qualified seal a schema slot to land in without a breaking change:
|
|
40
|
+
* `level` gains `"advanced"` / `"qualified"` and the optional fields fill in.
|
|
41
|
+
*
|
|
42
|
+
* Pure — no I/O, no ambient reads.
|
|
43
|
+
*/
|
|
44
|
+
import type { SignatureMetadata } from "#app/mcp/terraform/signing";
|
|
45
|
+
/**
|
|
46
|
+
* The eIDAS electronic-seal tier this bundle's signature actually reaches.
|
|
47
|
+
* A closed vocabulary so a consumer can branch on it rather than parse prose.
|
|
48
|
+
*
|
|
49
|
+
* `"none"` is distinct from `"simple"` and is not a synonym for it: an unsigned
|
|
50
|
+
* bundle has no integrity protection at all, whereas a `"simple"` seal really
|
|
51
|
+
* does prove the bytes have not changed. Collapsing the two would understate a
|
|
52
|
+
* signed bundle and overstate an unsigned one.
|
|
53
|
+
*/
|
|
54
|
+
export type EidasSealLevel = "none" | "simple" | "advanced" | "qualified";
|
|
55
|
+
export interface EidasSeal {
|
|
56
|
+
level: EidasSealLevel;
|
|
57
|
+
/** the precise claim this level supports. */
|
|
58
|
+
asserts: string;
|
|
59
|
+
/** the claim a reader might infer that this level does NOT support. Always
|
|
60
|
+
* present — the whole point of the block is the second half. */
|
|
61
|
+
does_not_assert: string;
|
|
62
|
+
/**
|
|
63
|
+
* True only for `"qualified"`: whether Art. 35(2)'s presumption of integrity
|
|
64
|
+
* and of correctness of origin applies. Stated explicitly rather than left to
|
|
65
|
+
* be inferred from `level`, because that presumption is the entire commercial
|
|
66
|
+
* difference between the tiers.
|
|
67
|
+
*/
|
|
68
|
+
eu_presumption: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* The qualified trust service provider that issued the seal certificate, and
|
|
71
|
+
* its EU Trusted List entry. Absent until §5.16's QTSP onboarding completes —
|
|
72
|
+
* and its absence is itself the honest signal that no QTSP is involved.
|
|
73
|
+
*/
|
|
74
|
+
qtsp?: {
|
|
75
|
+
name: string;
|
|
76
|
+
trusted_list_url: string;
|
|
77
|
+
};
|
|
78
|
+
/** Art. 41 qualified electronic time stamp, when one has been obtained.
|
|
79
|
+
* Absent today: we apply no timestamp of any kind, qualified or not. */
|
|
80
|
+
timestamp?: {
|
|
81
|
+
authority: string;
|
|
82
|
+
obtained_at: string;
|
|
83
|
+
token_path: string;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Declare the eIDAS assurance level for a bundle, from its signature metadata.
|
|
88
|
+
*
|
|
89
|
+
* Derived from what is actually present rather than configured, so the
|
|
90
|
+
* declaration cannot drift from reality: there is no input that makes an
|
|
91
|
+
* unsigned bundle claim a seal, and no way to assert `qualified` without the
|
|
92
|
+
* QTSP fields that do not yet exist.
|
|
93
|
+
*/
|
|
94
|
+
export declare function eidasSealFor(signature: SignatureMetadata | null): EidasSeal;
|
|
95
|
+
/**
|
|
96
|
+
* Whether a level may claim the Art. 35(2) presumption. Only `"qualified"` may,
|
|
97
|
+
* and today nothing produces that level — this exists so the invariant is
|
|
98
|
+
* asserted in one place rather than re-derived when the QTSP work lands.
|
|
99
|
+
*/
|
|
100
|
+
export declare function grantsEuPresumption(level: EidasSealLevel): boolean;
|