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,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize a scanner-reported path to a repo-relative POSIX path. Each scanner
|
|
3
|
+
* reports the file differently — tflint gives `main.tf` (relative), trivy a
|
|
4
|
+
* scan-dir-relative `Target`, terraform an absolute path (`/repo/main.tf` or
|
|
5
|
+
* `D:\repo\main.tf`), checkov a leading-slash path (`/main.tf`). Left
|
|
6
|
+
* unnormalized, these leak into `location.file` AND the
|
|
7
|
+
* content-derived `concernId`, making the id (and the `remediate/<id>` branch)
|
|
8
|
+
* machine-dependent and breaking the ✗→✓ re-scan id match across environments.
|
|
9
|
+
* So normalize BEFORE building any Concern.
|
|
10
|
+
*/
|
|
11
|
+
export declare function toRepoRelative(raw: string | undefined, cwd: string): string;
|
|
12
|
+
export interface ResolvedRoot {
|
|
13
|
+
/** absolute dir the per-root command (init/plan/validate) runs in. */
|
|
14
|
+
absDir: string;
|
|
15
|
+
/** that root's path relative to the scan `cwd` ("" when the root IS cwd) —
|
|
16
|
+
* prepended to per-root concern files so they stay cwd-relative. */
|
|
17
|
+
relDir: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The Terraform root modules to operate on under `cwd`. A repo can hold several
|
|
21
|
+
* roots (hepcare: `terraform/` + `terraform/core/`); `terraform validate` /
|
|
22
|
+
* `plan` are per-root, so they must run in EACH. Falls back to `cwd` itself as a
|
|
23
|
+
* single root when none is detected — so a normal single-root repo behaves
|
|
24
|
+
* exactly as before (no rebasing, one iteration).
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveRoots(cwd: string): ResolvedRoot[];
|
|
27
|
+
/** the repo's base ref for diff-scope, or null when one can't be determined. */
|
|
28
|
+
export declare function resolveBaseRef(cwd: string): string | null;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { BlastTier } from "#app/mcp/terraform/types";
|
|
2
|
+
export interface PlanSummary {
|
|
3
|
+
/** resources to add / change / destroy, from the plan's change_summary. */
|
|
4
|
+
add: number;
|
|
5
|
+
change: number;
|
|
6
|
+
destroy: number;
|
|
7
|
+
/** every resource with a real action (create/update/delete/replace) — the set
|
|
8
|
+
* that powers blast-radius and plan-stability. */
|
|
9
|
+
changed: {
|
|
10
|
+
address: string;
|
|
11
|
+
action: string;
|
|
12
|
+
}[];
|
|
13
|
+
/** resources that would be deleted or replaced — the destructive set. */
|
|
14
|
+
destructive: {
|
|
15
|
+
address: string;
|
|
16
|
+
action: string;
|
|
17
|
+
}[];
|
|
18
|
+
hasDestroyOrReplace: boolean;
|
|
19
|
+
/** state-only moves (`moved {}` blocks / refactors): the new address and the
|
|
20
|
+
* address it came from. Moves don't mutate live infrastructure, so they are
|
|
21
|
+
* NOT in `changed` — they power the modularization gate (`isPureMovePlan`). */
|
|
22
|
+
moved: {
|
|
23
|
+
address: string;
|
|
24
|
+
previousAddress: string | null;
|
|
25
|
+
}[];
|
|
26
|
+
}
|
|
27
|
+
export declare function parseTerraformPlanJson(stdout: string): PlanSummary;
|
|
28
|
+
/**
|
|
29
|
+
* modularization gate — true when the plan is PURELY state moves: at least
|
|
30
|
+
* one `moved` entry and zero create/update/delete/replace. That proves a
|
|
31
|
+
* resources→module refactor preserved every resource address (via `moved {}`
|
|
32
|
+
* blocks) and is a no-op on live infrastructure — the condition under which a
|
|
33
|
+
* modularization PR may proceed without human escalation.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isPureMovePlan(plan: {
|
|
36
|
+
add: number;
|
|
37
|
+
change: number;
|
|
38
|
+
destroy: number;
|
|
39
|
+
changed: {
|
|
40
|
+
address: string;
|
|
41
|
+
}[];
|
|
42
|
+
moved: {
|
|
43
|
+
address: string;
|
|
44
|
+
}[];
|
|
45
|
+
}): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Resource types that hold data/state — destroying or replacing one of these
|
|
48
|
+
* means data loss, not just recreation. A remediation that would delete or
|
|
49
|
+
* replace one is hard-blocked at push time unless the operator opts in via the
|
|
50
|
+
* `allow_replace` input. Not exhaustive: it covers the common managed
|
|
51
|
+
* datastores across AWS / Azure / GCP; extend as new ones come up.
|
|
52
|
+
*/
|
|
53
|
+
export declare const STATEFUL_RESOURCE_TYPES: ReadonlySet<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Extract the Terraform resource TYPE from a plan address, stripping any
|
|
56
|
+
* `module.<name>.` prefixes and an instance index/key suffix:
|
|
57
|
+
* `module.db.aws_db_instance.main` -> `aws_db_instance`
|
|
58
|
+
* `aws_s3_bucket.data["prod"]` -> `aws_s3_bucket`
|
|
59
|
+
* `module.a.module.b.google_storage_bucket.x[0]` -> `google_storage_bucket`
|
|
60
|
+
* Returns "" when the address has no parseable `type.name` pair.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resourceTypeOf(address: string): string;
|
|
63
|
+
export interface DestroyClassification {
|
|
64
|
+
/** destroy/replace of a data-bearing type — high-risk, blocked by default. */
|
|
65
|
+
stateful: {
|
|
66
|
+
address: string;
|
|
67
|
+
action: string;
|
|
68
|
+
type: string;
|
|
69
|
+
}[];
|
|
70
|
+
/** destroy/replace of a recreatable type — recorded, not blocked. */
|
|
71
|
+
ephemeral: {
|
|
72
|
+
address: string;
|
|
73
|
+
action: string;
|
|
74
|
+
type: string;
|
|
75
|
+
}[];
|
|
76
|
+
}
|
|
77
|
+
/** partition a plan's destructive set into stateful (blocked) vs ephemeral. */
|
|
78
|
+
export declare function classifyDestructive(destructive: {
|
|
79
|
+
address: string;
|
|
80
|
+
action: string;
|
|
81
|
+
}[]): DestroyClassification;
|
|
82
|
+
export interface BlastRadius {
|
|
83
|
+
tier: BlastTier;
|
|
84
|
+
/** count of resources the plan would create/update/delete/replace. */
|
|
85
|
+
resourceCount: number;
|
|
86
|
+
/** distinct module addresses touched (root resources count as `root`). */
|
|
87
|
+
modules: string[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Extract the module address from a resource address: the `module.X[.module.Y]`
|
|
91
|
+
* call path, or `root` for a top-level resource. Strips instance index/key from
|
|
92
|
+
* EVERY segment — a `count`/`for_each` MODULE carries its key on the module
|
|
93
|
+
* segment (`module.net[0]`), so all instances of one module collapse to one
|
|
94
|
+
* address (else a single-module fix would look cross-module). Removing keys
|
|
95
|
+
* first also tolerates a `.` inside a `for_each` string key.
|
|
96
|
+
* `aws_s3_bucket.b` -> `root`
|
|
97
|
+
* `module.db.aws_db_instance.main` -> `module.db`
|
|
98
|
+
* `module.net[0].aws_vpc.main` -> `module.net`
|
|
99
|
+
* `module.a.module.b.google_x.y[0]` -> `module.a.module.b`
|
|
100
|
+
*/
|
|
101
|
+
export declare function moduleAddressOf(address: string): string;
|
|
102
|
+
/**
|
|
103
|
+
* Score how much a fix touches, to route large changes through stricter review:
|
|
104
|
+
* 1–2 resources = `low`, 3–10 = `medium`, more than 10 OR spanning more than one
|
|
105
|
+
* module = `high`. A `high` blast radius should force human-in-the-loop
|
|
106
|
+
* regardless of finding severity. 0 changes is `low` (nothing to do).
|
|
107
|
+
*/
|
|
108
|
+
export declare function computeBlastRadius(changed: {
|
|
109
|
+
address: string;
|
|
110
|
+
}[]): BlastRadius;
|
|
111
|
+
export interface StabilityResult {
|
|
112
|
+
/** true when a second plan produced the identical change set. */
|
|
113
|
+
stable: boolean;
|
|
114
|
+
reason?: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Compare two consecutive plans for stability. Infraweaver never `apply`s (it only
|
|
118
|
+
* opens PRs), so a true "no perpetual diff after apply" cannot be proven here —
|
|
119
|
+
* but a fix whose plan is non-deterministic (e.g. `timestamp()`, `uuid()`, an
|
|
120
|
+
* unkeyed `random_*`, or a data source that varies run-to-run) yields a DIFFERENT
|
|
121
|
+
* plan on the second run, and that is a real perpetual-diff smell we can catch
|
|
122
|
+
* without applying. Stable ⇒ the two plans matched; unstable ⇒ report it.
|
|
123
|
+
*/
|
|
124
|
+
export declare function comparePlanStability(first: PlanSummary, second: PlanSummary): StabilityResult;
|
|
125
|
+
export interface RootPlan {
|
|
126
|
+
/** display label for the root ("." for the top-level root). */
|
|
127
|
+
dir: string;
|
|
128
|
+
summary: PlanSummary;
|
|
129
|
+
stable: boolean;
|
|
130
|
+
}
|
|
131
|
+
export interface AggregatedPlan {
|
|
132
|
+
add: number;
|
|
133
|
+
change: number;
|
|
134
|
+
destroy: number;
|
|
135
|
+
changed: {
|
|
136
|
+
address: string;
|
|
137
|
+
action: string;
|
|
138
|
+
}[];
|
|
139
|
+
destructive: {
|
|
140
|
+
address: string;
|
|
141
|
+
action: string;
|
|
142
|
+
}[];
|
|
143
|
+
hasDestroyOrReplace: boolean;
|
|
144
|
+
idempotent: boolean;
|
|
145
|
+
moved: {
|
|
146
|
+
address: string;
|
|
147
|
+
previousAddress: string | null;
|
|
148
|
+
}[];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Aggregate per-root plan results into one view: SUM the add/change/destroy
|
|
152
|
+
* counts, UNION the changed + destructive sets (so blast-radius and the
|
|
153
|
+
* destroy-block see every root's effect), and treat the whole run as
|
|
154
|
+
* non-idempotent if ANY root's plan was unstable. Pure. Single-root input passes
|
|
155
|
+
* straight through (identical to the pre-multi-root behaviour).
|
|
156
|
+
*/
|
|
157
|
+
export declare function aggregatePlans(roots: RootPlan[]): AggregatedPlan;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
2
|
+
export declare const PlanDocument: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
3
|
+
format_version?: string;
|
|
4
|
+
resource_changes?: {
|
|
5
|
+
address: string;
|
|
6
|
+
type?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
mode?: string;
|
|
9
|
+
change: {
|
|
10
|
+
actions: string[];
|
|
11
|
+
before?: unknown;
|
|
12
|
+
after?: unknown;
|
|
13
|
+
};
|
|
14
|
+
}[];
|
|
15
|
+
action_invocations?: {
|
|
16
|
+
address: string;
|
|
17
|
+
type?: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
provider_name?: string;
|
|
20
|
+
lifecycle_action_trigger?: {
|
|
21
|
+
triggering_resource_address?: string;
|
|
22
|
+
action_trigger_event?: string;
|
|
23
|
+
};
|
|
24
|
+
}[];
|
|
25
|
+
}, {}>;
|
|
26
|
+
export type DriftKind = "modified" | "deleted" | "recreated" | "replaced";
|
|
27
|
+
export interface DriftItem {
|
|
28
|
+
address: string;
|
|
29
|
+
type: string | null;
|
|
30
|
+
name: string | null;
|
|
31
|
+
/** the raw plan actions, e.g. ["update"] or ["delete","create"]. */
|
|
32
|
+
actions: string[];
|
|
33
|
+
kind: DriftKind;
|
|
34
|
+
/** top-level attributes whose value differs between `change.before` and
|
|
35
|
+
* `change.after` — the input the provider-noise filter judges. `null` when
|
|
36
|
+
* the plan carries no diffable before/after pair (the filter then makes no
|
|
37
|
+
* claim about this item and always keeps it). */
|
|
38
|
+
changed_fields: string[] | null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The plan-JSON document schema versions this parser understands. Terraform has
|
|
42
|
+
* only ever shipped 1.x for the `show -json` document form and adds keys within
|
|
43
|
+
* it additively, so any 1.x parses; a 2.x would be a redesign we have not read.
|
|
44
|
+
*
|
|
45
|
+
* Forward-compatibility is the DEFAULT here: an unknown 1.x minor (or an absent
|
|
46
|
+
* version on an old artifact) parses normally, because arktype ignores keys we
|
|
47
|
+
* do not declare. Only a MAJOR bump is called out — and even then as an honest
|
|
48
|
+
* coverage gap for the caller to surface, never a silent mis-parse.
|
|
49
|
+
*/
|
|
50
|
+
export declare const SUPPORTED_PLAN_FORMAT_MAJOR = 1;
|
|
51
|
+
/** True when a plan document's `format_version` is one this parser understands.
|
|
52
|
+
* An absent version is accepted (pre-versioning artifacts). Pure. */
|
|
53
|
+
export declare function isSupportedPlanFormat(formatVersion: string | undefined): boolean;
|
|
54
|
+
export interface ForgottenResource {
|
|
55
|
+
address: string;
|
|
56
|
+
type: string | null;
|
|
57
|
+
/** true when the type is data-bearing ([[governance]] `isStatefulResourceType`)
|
|
58
|
+
* — forgetting a database is the case that must route through needs-human:
|
|
59
|
+
* after it, the data-bearing object exists with NO destroy protection and no
|
|
60
|
+
* drift visibility, and nothing in code says so. */
|
|
61
|
+
stateful: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resources the plan would FORGET — dropped from state while the real cloud
|
|
65
|
+
* object keeps existing (Terraform `removed` blocks, OpenTofu `destroy = false`).
|
|
66
|
+
*
|
|
67
|
+
* A forget is deliberately NOT drift and NOT a destroy: nothing in the cloud
|
|
68
|
+
* changes, so reporting it as either would be a false positive. But it is not a
|
|
69
|
+
* non-event either — after a forget the resource is unmanaged, and every later
|
|
70
|
+
* drift scan is silently blind to it. Surfaced separately so the run can state
|
|
71
|
+
* the coverage gap instead of quietly shrinking what 'no drift' covers. Pure.
|
|
72
|
+
*/
|
|
73
|
+
export declare function classifyForgotten(doc: typeof PlanDocument.infer): ForgottenResource[];
|
|
74
|
+
/** The forgotten addresses only — the compact form of {@link classifyForgotten}. */
|
|
75
|
+
export declare function detectForgotten(doc: typeof PlanDocument.infer): string[];
|
|
76
|
+
/** Every drifted resource in a plan document. A clean plan yields `[]`. */
|
|
77
|
+
export declare function detectDrift(doc: typeof PlanDocument.infer): DriftItem[];
|
|
78
|
+
/**
|
|
79
|
+
* Computed fields whose churn is PROVIDER bookkeeping, not an operator touching
|
|
80
|
+
* infrastructure — the documented, always-computed merge targets that generate
|
|
81
|
+
* perpetual "drift" whenever provider-level defaults shift:
|
|
82
|
+
*
|
|
83
|
+
* - aws `tags_all`: the computed merge of `default_tags` into every resource's
|
|
84
|
+
* tags (the canonical drift-noise field of the AWS provider).
|
|
85
|
+
* - google `effective_labels` / `terraform_labels`: computed label merges
|
|
86
|
+
* introduced by provider v5's default-labels model.
|
|
87
|
+
*
|
|
88
|
+
* The list is deliberately SHORT and only ever names fields a provider computes
|
|
89
|
+
* — a field an operator can hand-edit in the console never belongs here, because
|
|
90
|
+
* filtering it would be exactly the false no-drift the roadmap forbids.
|
|
91
|
+
*/
|
|
92
|
+
export declare const PROVIDER_NOISE_FIELDS: Readonly<Record<string, readonly string[]>>;
|
|
93
|
+
/** A drift item excluded by the noise filter — retained for auditability, so the
|
|
94
|
+
* run can show WHAT was filtered and by which fields rather than silently
|
|
95
|
+
* shrinking the drift set. */
|
|
96
|
+
export interface NoiseFilteredDrift {
|
|
97
|
+
address: string;
|
|
98
|
+
kind: DriftKind;
|
|
99
|
+
/** the noisy fields that were the entire diff. */
|
|
100
|
+
fields: string[];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Split drift into signal and provider noise. An item is noise ONLY when every
|
|
104
|
+
* condition holds: it is a pure in-place update (`modified`), the plan carried a
|
|
105
|
+
* diffable before/after pair, at least one field changed, and EVERY changed
|
|
106
|
+
* field is on the noise list (the per-provider defaults plus any operator-
|
|
107
|
+
* supplied extras). Anything else — a delete, a replace, an undiffable change,
|
|
108
|
+
* a mixed diff where one field is real — is kept. The bias is deliberate:
|
|
109
|
+
* "never a false no-drift" means the filter must prove noise, not assume it.
|
|
110
|
+
*/
|
|
111
|
+
export declare function filterProviderNoise(items: ReadonlyArray<DriftItem>, extraNoiseFields?: readonly string[]): {
|
|
112
|
+
kept: DriftItem[];
|
|
113
|
+
filtered: NoiseFilteredDrift[];
|
|
114
|
+
};
|
|
115
|
+
export interface ActionInvocationItem {
|
|
116
|
+
/** absolute action address, `action.<type>.<name>`. */
|
|
117
|
+
address: string;
|
|
118
|
+
action_type: string | null;
|
|
119
|
+
/** the resource whose lifecycle event fires this action, when the plan says. */
|
|
120
|
+
triggered_by: string | null;
|
|
121
|
+
/** the lifecycle event (`after_create`, …), when the plan says. */
|
|
122
|
+
event: string | null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The provider actions this plan will invoke (TF 1.15's `action_invocations`).
|
|
126
|
+
* This is the RUNTIME counterpart of the static `imperative-action-trigger`
|
|
127
|
+
* finding ([[governance]]): the static rule says "an apply here can do work
|
|
128
|
+
* outside the resource graph"; this array is the plan saying "THIS apply will".
|
|
129
|
+
* Pure summarization — correlation to code happens in the tool, where the
|
|
130
|
+
* repo's HCL is available.
|
|
131
|
+
*/
|
|
132
|
+
export declare function summarizeActionInvocations(doc: typeof PlanDocument.infer): ActionInvocationItem[];
|
|
133
|
+
/**
|
|
134
|
+
* The drift statement the evidence bundle carries — the 2.1 differentiator:
|
|
135
|
+
* *signed, verifiable proof that live cloud matched the committed IaC at the
|
|
136
|
+
* time the plan artifact was produced*, with every bound on that claim stated
|
|
137
|
+
* in the artifact itself rather than left to the reader's optimism.
|
|
138
|
+
*/
|
|
139
|
+
export interface DriftEvidenceStatement {
|
|
140
|
+
/** the plan artifact the claim is derived from. */
|
|
141
|
+
source_file: string;
|
|
142
|
+
/** drifted resources AFTER noise filtering — the signal set. */
|
|
143
|
+
detected: number;
|
|
144
|
+
by_kind: Record<DriftKind, number>;
|
|
145
|
+
items: {
|
|
146
|
+
address: string;
|
|
147
|
+
kind: DriftKind;
|
|
148
|
+
}[];
|
|
149
|
+
/** drift excluded as provider bookkeeping — listed field-by-field so the
|
|
150
|
+
* filtering is auditable (the unfiltered diff stays in the plan artifact). */
|
|
151
|
+
noise_filtered: NoiseFilteredDrift[];
|
|
152
|
+
/** resources this plan drops from management — the standing blind spot every
|
|
153
|
+
* later drift claim inherits, so it must ride the signed statement. */
|
|
154
|
+
forgotten: ForgottenResource[];
|
|
155
|
+
/** drifted addresses with no matching resource block in code. */
|
|
156
|
+
unlocated: number;
|
|
157
|
+
/** honest bounds: unsupported format major, etc. Empty = fully readable. */
|
|
158
|
+
coverage_gaps: string[];
|
|
159
|
+
asserts: string;
|
|
160
|
+
does_not_assert: string;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Build the drift evidence statement (pure). The asserts line is graded by what
|
|
164
|
+
* the inputs actually prove: a clean, fully-readable plan asserts the live-
|
|
165
|
+
* matches-code claim; drift asserts the detection; a coverage gap asserts
|
|
166
|
+
* nothing confident. INCONCLUSIVE-over-silence, in the signed artifact itself.
|
|
167
|
+
*/
|
|
168
|
+
export declare function buildDriftStatement(args: {
|
|
169
|
+
sourceFile: string;
|
|
170
|
+
kept: ReadonlyArray<DriftItem>;
|
|
171
|
+
filtered: ReadonlyArray<NoiseFilteredDrift>;
|
|
172
|
+
forgotten: ReadonlyArray<ForgottenResource>;
|
|
173
|
+
unlocated: number;
|
|
174
|
+
coverageGaps?: readonly string[];
|
|
175
|
+
}): DriftEvidenceStatement;
|
|
176
|
+
/** Resolve a Terraform address to its source location, or null when the address
|
|
177
|
+
* isn't found in the repo's code (e.g. a resource removed from code but still in
|
|
178
|
+
* state). Supplied by the tool from a `.tf` resource index. */
|
|
179
|
+
export type LocationResolver = (address: string) => {
|
|
180
|
+
file: string;
|
|
181
|
+
line: number;
|
|
182
|
+
} | null;
|
|
183
|
+
/** A drift item that couldn't be tied to a resource block in code (reported, not dropped). */
|
|
184
|
+
export interface UnlocatedDrift {
|
|
185
|
+
address: string;
|
|
186
|
+
kind: DriftKind;
|
|
187
|
+
reason: string;
|
|
188
|
+
}
|
|
189
|
+
export interface DriftConcerns {
|
|
190
|
+
concerns: Concern[];
|
|
191
|
+
unlocated: UnlocatedDrift[];
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Turn drift items into `reviewer`-source concerns at each resource's file:line.
|
|
195
|
+
* Drift is honestly `not-code-verifiable` by the ✗→✓ re-scan (proving it fixed needs
|
|
196
|
+
* live cloud access, which Infraweaver refuses) — the `reviewer` source carries exactly
|
|
197
|
+
* that meaning. Items whose address isn't in code are returned under `unlocated`.
|
|
198
|
+
*/
|
|
199
|
+
export declare function driftToConcerns(items: ReadonlyArray<DriftItem>, resolve: LocationResolver): DriftConcerns;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { type Severity } from "#app/mcp/terraform/types";
|
|
2
|
+
/**
|
|
3
|
+
* The namespace an authored rule's id carries. Deliberately NOT the `infraweaver:`
|
|
4
|
+
* native-source prefix: these findings are produced by the customer's conftest
|
|
5
|
+
* running the customer's committed policy. We helped write it; we did not find
|
|
6
|
+
* it, and the label should not imply otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export declare const AUTHORED_RULE_PREFIX = "policy";
|
|
9
|
+
/** The fully-qualified rule id for an authored spec. */
|
|
10
|
+
export declare function authoredRuleId(id: string): string;
|
|
11
|
+
/** The closed predicate set. Anything not expressible here is not authorable —
|
|
12
|
+
* which is the point: an operator we cannot evaluate in process is an operator
|
|
13
|
+
* whose generated policy we cannot self-test. */
|
|
14
|
+
export declare const POLICY_OPERATORS: readonly ["equals", "not_equals", "in", "not_in", "present", "absent", "is_true", "is_false", "matches", "gte", "lte", "non_empty"];
|
|
15
|
+
export type PolicyOperator = (typeof POLICY_OPERATORS)[number];
|
|
16
|
+
export type PolicyScalar = string | number | boolean;
|
|
17
|
+
/**
|
|
18
|
+
* What the rule concludes when the attribute path resolves to nothing.
|
|
19
|
+
* Required, and deliberately not defaulted — see the module note.
|
|
20
|
+
*/
|
|
21
|
+
export type WhenAbsent = "violation" | "compliant";
|
|
22
|
+
/**
|
|
23
|
+
* The reviewed intermediate representation. This — not Rego — is what the model
|
|
24
|
+
* produces from prose, and what a human reviews.
|
|
25
|
+
*/
|
|
26
|
+
export interface PolicyRuleSpec {
|
|
27
|
+
/** kebab-case, unique within the authored pack. Becomes the rule id in every emitted artifact. */
|
|
28
|
+
id: string;
|
|
29
|
+
/** one-line human title. */
|
|
30
|
+
title: string;
|
|
31
|
+
/** the sentence of the SOURCE STANDARD this rule was derived from, quoted. The
|
|
32
|
+
* audit trail from prose to policy; carried into every emitted artifact. */
|
|
33
|
+
source_requirement: string;
|
|
34
|
+
/** the Terraform resource type the rule applies to, e.g. `aws_s3_bucket`. */
|
|
35
|
+
resource_type: string;
|
|
36
|
+
/** dotted path into the resource's planned values, e.g.
|
|
37
|
+
* `server_side_encryption_configuration.rule.apply_server_side_encryption_by_default.sse_algorithm`.
|
|
38
|
+
* A segment that resolves to an array is flattened — every element contributes
|
|
39
|
+
* a candidate value, and the rule must hold for ALL of them. */
|
|
40
|
+
attribute: string;
|
|
41
|
+
operator: PolicyOperator;
|
|
42
|
+
/** the operand. Scalar for equals/not_equals/matches/gte/lte, a list for
|
|
43
|
+
* in/not_in, omitted for the rest. */
|
|
44
|
+
value?: PolicyScalar | PolicyScalar[];
|
|
45
|
+
when_absent: WhenAbsent;
|
|
46
|
+
severity: Severity;
|
|
47
|
+
/** one of the reviewed crosswalk themes — this is what earns the control citation. */
|
|
48
|
+
theme: string;
|
|
49
|
+
/** the violation message a reviewer and an engineer both read. */
|
|
50
|
+
message: string;
|
|
51
|
+
/** a compliant value for the generated fixtures. REQUIRED for `matches`, where
|
|
52
|
+
* no value can be synthesised from the pattern; optional elsewhere. */
|
|
53
|
+
example_compliant?: PolicyScalar;
|
|
54
|
+
/** a violating value for the generated fixtures. REQUIRED for `matches`. */
|
|
55
|
+
example_violating?: PolicyScalar;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Structural validation of a spec. Returns the list of problems — empty means
|
|
59
|
+
* valid. Kept separate from the self-test: this catches "the spec is malformed",
|
|
60
|
+
* the self-test catches "the spec is well-formed but says nothing".
|
|
61
|
+
*/
|
|
62
|
+
export declare function validateSpec(spec: PolicyRuleSpec): string[];
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a dotted path against a planned-values object, flattening arrays: at
|
|
65
|
+
* each segment, an array contributes each of its elements as a candidate parent.
|
|
66
|
+
* Returns every leaf value the path reaches. An empty array means the path
|
|
67
|
+
* resolved to nothing — which is what `when_absent` decides on.
|
|
68
|
+
*
|
|
69
|
+
* `null` leaves are dropped: Terraform writes an unset optional argument as
|
|
70
|
+
* `null`, and "present but null" is the same fact as "absent" to a reader.
|
|
71
|
+
*/
|
|
72
|
+
export declare function resolvePath(root: unknown, path: string): unknown[];
|
|
73
|
+
/** Does one resolved value satisfy the rule? Pure; mirrored by the emitted Rego. */
|
|
74
|
+
export declare function valueSatisfies(spec: PolicyRuleSpec, value: unknown): boolean;
|
|
75
|
+
export interface SpecVerdict {
|
|
76
|
+
violates: boolean;
|
|
77
|
+
/** why — the sentence a test failure prints. */
|
|
78
|
+
reason: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Evaluate a spec against ONE resource's planned values. Universal over the
|
|
82
|
+
* resolved values: every matched value must satisfy the rule, so a list where
|
|
83
|
+
* one element is wrong is a violation.
|
|
84
|
+
*/
|
|
85
|
+
export declare function evaluateSpec(spec: PolicyRuleSpec, values: unknown): SpecVerdict;
|
|
86
|
+
/** Build the nested object a dotted path implies, with `leaf` at the end. */
|
|
87
|
+
export declare function nestValue(path: string, leaf: unknown): Record<string, unknown>;
|
|
88
|
+
export interface PolicyFixture {
|
|
89
|
+
/** `compliant` | `violating` | `absent` — the mock's role in the self-test. */
|
|
90
|
+
kind: "compliant" | "violating" | "absent";
|
|
91
|
+
/** the resource's planned values. */
|
|
92
|
+
values: Record<string, unknown>;
|
|
93
|
+
/** what the rule MUST conclude about it. */
|
|
94
|
+
expect_violation: boolean;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The three fixtures every authored rule is tested against. The `absent` case is
|
|
98
|
+
* the one that matters most: it is both the commonest real shape (an optional
|
|
99
|
+
* block simply not written) and the case a hand-written policy most often gets
|
|
100
|
+
* wrong.
|
|
101
|
+
*/
|
|
102
|
+
export declare function buildFixtures(spec: PolicyRuleSpec): PolicyFixture[];
|
|
103
|
+
export interface SelfTestCase {
|
|
104
|
+
kind: PolicyFixture["kind"];
|
|
105
|
+
expected: boolean;
|
|
106
|
+
actual: boolean;
|
|
107
|
+
passed: boolean;
|
|
108
|
+
reason: string;
|
|
109
|
+
}
|
|
110
|
+
export interface SelfTestReport {
|
|
111
|
+
/** every case behaved as its fixture demanded AND the rule denies something.
|
|
112
|
+
* Both, deliberately: a rule that agrees with all three fixtures by never
|
|
113
|
+
* firing has passed nothing. */
|
|
114
|
+
passed: boolean;
|
|
115
|
+
cases: SelfTestCase[];
|
|
116
|
+
/** true when the rule denied at least one fixture — the vacuity check. A rule
|
|
117
|
+
* that denies nothing is not a rule. */
|
|
118
|
+
denies_something: boolean;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Run the spec against its own fixtures. A spec that fails here is never
|
|
122
|
+
* emitted: the caller refuses it rather than hand a human a policy that does
|
|
123
|
+
* not do what its own description says.
|
|
124
|
+
*/
|
|
125
|
+
export declare function selfTestSpec(spec: PolicyRuleSpec): SelfTestReport;
|
|
126
|
+
/**
|
|
127
|
+
* The shared helper every emitted policy imports by inclusion. Kept as ONE
|
|
128
|
+
* reviewed block rather than inlined per rule, because the array-flattening
|
|
129
|
+
* semantics are the part a reader must check — and they should only have to
|
|
130
|
+
* check it once.
|
|
131
|
+
*
|
|
132
|
+
* Rego forbids recursion, so per-rule path traversal is unrolled at generation
|
|
133
|
+
* time (see `pathComprehension`); `_members` is the non-recursive primitive that
|
|
134
|
+
* makes each step uniform.
|
|
135
|
+
*/
|
|
136
|
+
export declare const REGO_PRELUDE = "# Shared helpers for Infraweaver-authored policies. Reviewed once, used by every rule.\n# _members normalises a node to a list so an array-valued block and a single\n# block traverse identically \u2014 the same rule Infraweaver's own evaluator applies.\n_members(x) := x if is_array(x)\n_members(x) := [x] if not is_array(x)\n\n# Only plan actions that produce or change configuration are judged. A delete\n# leaves no \"after\" to assert on, and a no-op has already been judged.\n_relevant(rc) if {\n\tsome action in rc.change.actions\n\taction in {\"create\", \"update\"}\n}\n";
|
|
137
|
+
/**
|
|
138
|
+
* Emit conftest-ready Rego for one spec. Pure and byte-stable — the same spec
|
|
139
|
+
* always yields the same file, so a re-run produces no diff and a diff means the
|
|
140
|
+
* spec changed.
|
|
141
|
+
*
|
|
142
|
+
* Targets `terraform show -json` output (`input.resource_changes`), which is what
|
|
143
|
+
* `policy_check` already feeds conftest.
|
|
144
|
+
*/
|
|
145
|
+
export declare function emitRego(spec: PolicyRuleSpec, opts?: {
|
|
146
|
+
packageName?: string;
|
|
147
|
+
}): string;
|
|
148
|
+
/**
|
|
149
|
+
* How faithful the `.policy.hcl` translation is to the spec.
|
|
150
|
+
*
|
|
151
|
+
* `exact` — a single-segment attribute path, where `attrs.<name>` means exactly
|
|
152
|
+
* what our resolver means.
|
|
153
|
+
* `approximate` — a nested path. tfpolicy's `attrs` traversal does not flatten
|
|
154
|
+
* arrays the way our resolver does, so a nested block that Terraform represents
|
|
155
|
+
* as a list needs `[0]` indexing and the translation asserts on the FIRST
|
|
156
|
+
* element rather than all of them. We emit it, we say so in the file, and the
|
|
157
|
+
* generated `.policytest.hcl` is how the customer confirms it before relying
|
|
158
|
+
* on it.
|
|
159
|
+
*
|
|
160
|
+
* This axis is about PATH SHAPE only. A second, unavoidable difference applies
|
|
161
|
+
* to every rule and is stated in the emitted header instead: HCL converts
|
|
162
|
+
* between types where it can, so a comparison there can succeed on an operand
|
|
163
|
+
* the Rego — which is explicitly type-guarded — rejects.
|
|
164
|
+
*/
|
|
165
|
+
export type PolicyHclFidelity = "exact" | "approximate";
|
|
166
|
+
export declare function policyHclFidelity(spec: PolicyRuleSpec): PolicyHclFidelity;
|
|
167
|
+
/**
|
|
168
|
+
* Emit a HashiCorp tfpolicy `.policy.hcl` for one spec.
|
|
169
|
+
*
|
|
170
|
+
* We AUTHOR this dialect; we do not enforce it. `tfpolicy` has no
|
|
171
|
+
* credential-free local plan evaluation and its binary is source-closed, so it
|
|
172
|
+
* cannot replace the OPA gate — the value is that an HCP customer gets a native
|
|
173
|
+
* artifact they can validate and run in their own pipeline.
|
|
174
|
+
*/
|
|
175
|
+
export declare function emitPolicyHcl(spec: PolicyRuleSpec): string;
|
|
176
|
+
/**
|
|
177
|
+
* Emit the `.policytest.hcl` companion — the same three fixtures the in-process
|
|
178
|
+
* self-test used, expressed as tfpolicy mocks. This is what turns "we authored
|
|
179
|
+
* it" into something the customer can verify in one command.
|
|
180
|
+
*/
|
|
181
|
+
export declare function emitPolicyTestHcl(spec: PolicyRuleSpec): string;
|
|
182
|
+
/**
|
|
183
|
+
* The generated fixtures as a `terraform show -json`-shaped document, so the
|
|
184
|
+
* emitted Rego can be executed against them by conftest without a real plan.
|
|
185
|
+
* One resource per fixture, named for its role.
|
|
186
|
+
*/
|
|
187
|
+
export declare function emitPlanFixture(spec: PolicyRuleSpec): string;
|
|
188
|
+
export declare function regoFileName(spec: PolicyRuleSpec): string;
|
|
189
|
+
export declare function policyFileName(spec: PolicyRuleSpec): string;
|
|
190
|
+
export declare function policyTestFileName(spec: PolicyRuleSpec): string;
|
|
191
|
+
export declare function planFixtureFileName(spec: PolicyRuleSpec): string;
|