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,343 @@
|
|
|
1
|
+
import { TOOL_NAME } from "#app/brand";
|
|
2
|
+
import { type AssessmentScorecard, type AssessWaiver } from "#app/mcp/assess";
|
|
3
|
+
import { type CrosswalkReport } from "#app/mcp/crosswalk";
|
|
4
|
+
import type { LocalToolContext } from "#app/mcp/localContext";
|
|
5
|
+
import { type EidasSeal } from "#app/mcp/terraform/eidas";
|
|
6
|
+
import { type IdleFloorReport } from "#app/mcp/terraform/idleFloor";
|
|
7
|
+
import type { DriftEvidenceStatement } from "#app/mcp/terraform/planDrift";
|
|
8
|
+
import { type ModuleProvenance } from "#app/mcp/terraform/refactor";
|
|
9
|
+
import { type SignatureMetadata } from "#app/mcp/terraform/signing";
|
|
10
|
+
import type { UpgradeEvidenceStatement } from "#app/mcp/terraform/transformPacks";
|
|
11
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
12
|
+
import { type VerificationStatus, type VerificationSummary } from "#app/mcp/terraform/verification";
|
|
13
|
+
/**
|
|
14
|
+
* Backend-free compliance evidence bundle (the WS4a wedge — an auditor-facing
|
|
15
|
+
* artifact the OSS action can emit with **zero cloud and no backend**, committed
|
|
16
|
+
* to a `compliance/` path). It packages the read-only assessment — posture,
|
|
17
|
+
* per-control statements with their five-status verdict ([[verification]]), the
|
|
18
|
+
* crosswalk index, and the scanner coverage — into one deterministic JSON file.
|
|
19
|
+
*
|
|
20
|
+
* SCHEMA / HONESTY: this is Infraweaver's OWN structured schema, NOT OSCAL. A
|
|
21
|
+
* strict OSCAL (or compliance-trestle / C2P) emitter is a deliberate follow-up,
|
|
22
|
+
* gated on a buyer who actually needs OSCAL — emitting OSCAL nobody consumes is
|
|
23
|
+
* cost without value. The bundle is INDICATIVE alignment guidance, never an audit
|
|
24
|
+
* verdict, and it never claims `pass` for an unfired control (absence of a
|
|
25
|
+
* finding is not proof). Pure builder + a thin file-writing tool.
|
|
26
|
+
*/
|
|
27
|
+
export declare const EVIDENCE_SCHEMA: "infraweaver-evidence/v0.8";
|
|
28
|
+
export declare const DEFAULT_EVIDENCE_PATH = "compliance/infraweaver-evidence.json";
|
|
29
|
+
export interface EvidenceControlStatement {
|
|
30
|
+
concern_id: string;
|
|
31
|
+
/** line-independent anchor (sha1(source|rule|file), see `concernKeyOf`) — the
|
|
32
|
+
* stable deep-link key into this bundle: a dashboard finding carries the same
|
|
33
|
+
* key, so its entry here is locatable even after a fix shifts line numbers.
|
|
34
|
+
* Absent when the backing concern wasn't supplied to the builder. */
|
|
35
|
+
concern_key?: string | undefined;
|
|
36
|
+
rule_id: string;
|
|
37
|
+
/** the five-status verdict for this statement (fail / not-code-verifiable). */
|
|
38
|
+
status: VerificationStatus;
|
|
39
|
+
severity?: string | undefined;
|
|
40
|
+
file?: string | undefined;
|
|
41
|
+
line?: number | null | undefined;
|
|
42
|
+
controls: {
|
|
43
|
+
framework: string;
|
|
44
|
+
control: string;
|
|
45
|
+
title: string;
|
|
46
|
+
}[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A refactor's evidence statement — emitted only for a refactor run. Carries the
|
|
50
|
+
* verdict, the equivalence sub-results that BACK it (when a keys-free proof ran),
|
|
51
|
+
* the adopted-module provenance, and — per §8 — BOTH what it asserts and what it
|
|
52
|
+
* explicitly does NOT. A `proposed-unproven` verdict (a b.4 third-party adoption
|
|
53
|
+
* shipped without a plan) asserts nothing about runtime behaviour.
|
|
54
|
+
*/
|
|
55
|
+
export interface EvidenceRefactorStatement {
|
|
56
|
+
verdict: "equivalence-proven" | "equivalence-failed" | "proposed-unproven";
|
|
57
|
+
equivalence?: {
|
|
58
|
+
resource_set_preserved: boolean;
|
|
59
|
+
arguments_preserved: boolean;
|
|
60
|
+
moves_exhaustive: boolean;
|
|
61
|
+
moves_detected: number;
|
|
62
|
+
uncovered_moves: number;
|
|
63
|
+
validate_passed: boolean;
|
|
64
|
+
fmt_clean: boolean;
|
|
65
|
+
} | undefined;
|
|
66
|
+
/** every external module the config adopts, with its pinned version (provenance
|
|
67
|
+
* discipline — the analog to a SHA-pinned action). */
|
|
68
|
+
module_provenance: ModuleProvenance[];
|
|
69
|
+
/** true when the change is proposed but unproven — the unmissable b.4 marker. */
|
|
70
|
+
proposed_unproven: boolean;
|
|
71
|
+
asserts: string;
|
|
72
|
+
does_not_assert: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The §5.19 cost statement: the credential-free IDLE FLOOR — what this
|
|
76
|
+
* configuration bills at zero traffic — with the same asserts/does_not_assert
|
|
77
|
+
* honesty pair the refactor statement carries. Deliberately NOT a monthly total:
|
|
78
|
+
* usage-dependent lines are not derivable from Terraform, so the floor is the
|
|
79
|
+
* only cost figure this bundle is willing to sign.
|
|
80
|
+
*/
|
|
81
|
+
export interface EvidenceCostStatement {
|
|
82
|
+
/** Currency of every figure below (from the bundled price snapshot). */
|
|
83
|
+
currency: string;
|
|
84
|
+
/** Cloud region the list prices were captured for. */
|
|
85
|
+
region: string;
|
|
86
|
+
/** ISO date the bundled price snapshot was captured — makes staleness visible. */
|
|
87
|
+
priced_at: string;
|
|
88
|
+
/** Monthly cost that accrues at zero traffic. */
|
|
89
|
+
monthly_floor: number;
|
|
90
|
+
/** One entry per resource contributing to the floor. */
|
|
91
|
+
resources: {
|
|
92
|
+
address: string;
|
|
93
|
+
resource_type: string;
|
|
94
|
+
file: string;
|
|
95
|
+
line: number;
|
|
96
|
+
monthly_cost: number;
|
|
97
|
+
}[];
|
|
98
|
+
/** Catalogued resources left unpriced because their tier was not identifiable
|
|
99
|
+
* — the signed floor is a lower bound by exactly these. */
|
|
100
|
+
unpriced: {
|
|
101
|
+
address: string;
|
|
102
|
+
resource_type: string;
|
|
103
|
+
file: string;
|
|
104
|
+
line: number;
|
|
105
|
+
reason: string;
|
|
106
|
+
}[];
|
|
107
|
+
asserts: string;
|
|
108
|
+
does_not_assert: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Build the suppression summary (pure). Unlike `cost` and `drift`, this block is
|
|
112
|
+
* **always present** — including with `count: 0`. An omitted section would be
|
|
113
|
+
* ambiguous ("nothing silenced" vs "this version didn't record it"), and the
|
|
114
|
+
* whole point is that a reader can tell a clean repo from a quiet one without
|
|
115
|
+
* having to trust that we'd have mentioned it.
|
|
116
|
+
*/
|
|
117
|
+
export declare function buildSuppressionSummary(waivers: ReadonlyArray<AssessWaiver>): EvidenceSuppressionSummary;
|
|
118
|
+
/**
|
|
119
|
+
* Build the cost evidence statement (pure). Returns undefined when no cost
|
|
120
|
+
* analysis ran or nothing priced, so the bundle omits the section entirely
|
|
121
|
+
* rather than signing a zero that could be read as "this costs nothing".
|
|
122
|
+
*/
|
|
123
|
+
export declare function buildCostStatement(report: IdleFloorReport | undefined): EvidenceCostStatement | undefined;
|
|
124
|
+
/** the equivalence sub-results buildRefactorStatement reads (the shape recorded
|
|
125
|
+
* in `scanSession.refactorEquivalence`). */
|
|
126
|
+
export interface RefactorEquivalenceInput {
|
|
127
|
+
equivalent: boolean;
|
|
128
|
+
resource_set_equivalent: boolean;
|
|
129
|
+
arg_names_equivalent: boolean;
|
|
130
|
+
moves_exhaustive: boolean;
|
|
131
|
+
moves_detected: number;
|
|
132
|
+
validate_passed: boolean;
|
|
133
|
+
fmt_clean: boolean;
|
|
134
|
+
uncovered_moves: {
|
|
135
|
+
from: string;
|
|
136
|
+
to: string;
|
|
137
|
+
}[];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Build the refactor evidence statement (pure). Returns undefined when nothing
|
|
141
|
+
* refactor-related happened (no equivalence proof, not a proposed-unproven b.4,
|
|
142
|
+
* no external module) so the bundle omits the section entirely. Infraweaver asserts
|
|
143
|
+
* only what the inputs prove — a failed or absent proof asserts nothing.
|
|
144
|
+
*/
|
|
145
|
+
export declare function buildRefactorStatement(args: {
|
|
146
|
+
equivalence?: RefactorEquivalenceInput | undefined;
|
|
147
|
+
provenance: ModuleProvenance[];
|
|
148
|
+
proposedUnproven: boolean;
|
|
149
|
+
}): EvidenceRefactorStatement | undefined;
|
|
150
|
+
/**
|
|
151
|
+
* What this run did NOT judge, because a human had already accepted it.
|
|
152
|
+
*
|
|
153
|
+
* WHY THIS IS IN THE SIGNED BYTES. `posture` and `control_statements` describe
|
|
154
|
+
* the OPEN findings only — suppressed ones are excluded by design, because a
|
|
155
|
+
* waived finding genuinely is an accepted risk. But that means a repo with
|
|
156
|
+
* thirty active waivers produced a bundle byte-indistinguishable from a
|
|
157
|
+
* genuinely clean one, and the difference is exactly what an assessor is there
|
|
158
|
+
* to examine. The human-readable report has always listed waivers; the SIGNED
|
|
159
|
+
* artifact did not, which made the signature cover the flattering half of the
|
|
160
|
+
* story.
|
|
161
|
+
*
|
|
162
|
+
* Each entry is what was silenced, where it is, why (a reason is mandatory
|
|
163
|
+
* everywhere), by which mechanism, and until when.
|
|
164
|
+
*
|
|
165
|
+
* A note on `source`. It records the two things the suppression pipeline
|
|
166
|
+
* actually models: `inline` (a directive in the source file) and `policy` (the
|
|
167
|
+
* `.infraweaver.yml` block). A skip written for ANOTHER scanner
|
|
168
|
+
* (`# checkov:skip=…`) is honoured and lands under `inline`, with the pipeline's
|
|
169
|
+
* own `[via <tool> skip]` marker appended to its reason — so the distinction is
|
|
170
|
+
* visible in the entry without this block claiming a structured tally the
|
|
171
|
+
* concern model does not carry.
|
|
172
|
+
*/
|
|
173
|
+
export interface EvidenceSuppressionRecord {
|
|
174
|
+
rule_id: string;
|
|
175
|
+
severity: string;
|
|
176
|
+
file: string;
|
|
177
|
+
line?: number | null | undefined;
|
|
178
|
+
/** mandatory everywhere; carries the `[via <tool> skip]` marker when the
|
|
179
|
+
* directive was another scanner's rather than ours. */
|
|
180
|
+
reason: string;
|
|
181
|
+
/** `inline` = a directive in the source file; `policy` = the `.infraweaver.yml` block. */
|
|
182
|
+
source: string;
|
|
183
|
+
/** ISO date the waiver lapses, or null for an open-ended one. */
|
|
184
|
+
expires: string | null;
|
|
185
|
+
}
|
|
186
|
+
export interface EvidenceSuppressionSummary {
|
|
187
|
+
/** how many findings this bundle's posture excludes. 0 ⇒ nothing silenced. */
|
|
188
|
+
count: number;
|
|
189
|
+
/** count by mechanism (`inline` / `policy`) — how the silencing was applied. */
|
|
190
|
+
by_source: Record<string, number>;
|
|
191
|
+
/** open-ended waivers — the ones with no review date. */
|
|
192
|
+
never_expire: number;
|
|
193
|
+
entries: EvidenceSuppressionRecord[];
|
|
194
|
+
asserts: string;
|
|
195
|
+
does_not_assert: string;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* WHO produced this evidence (A.3). The bundle always named the engine; after
|
|
199
|
+
* the Trivy compromise that is not enough — a poisoned scanner produces
|
|
200
|
+
* poisoned findings under a clean engine version. This block records the whole
|
|
201
|
+
* acting chain: the model that drove the agent, the runtime, and the exact
|
|
202
|
+
* scanner builds the integrity gate observed (`toolchainIntegrity`) before
|
|
203
|
+
* executing them. Nothing here is fabricated: a tool that never ran this
|
|
204
|
+
* session is simply absent from `scanners`, and an unresolved model is null.
|
|
205
|
+
*/
|
|
206
|
+
export interface EvidenceProvenance {
|
|
207
|
+
/** resolved model specifier that drove the agent, or null (auto/unknown —
|
|
208
|
+
* e.g. a local `infraweaver mcp` session has no agent of its own). */
|
|
209
|
+
model: string | null;
|
|
210
|
+
/** the Node.js runtime the engine executed on (`process.version`). */
|
|
211
|
+
node: string;
|
|
212
|
+
/** exact scanner versions probed by the integrity gate before execution —
|
|
213
|
+
* only tools that actually ran this session appear. */
|
|
214
|
+
scanners: {
|
|
215
|
+
tool: string;
|
|
216
|
+
version: string | null;
|
|
217
|
+
}[];
|
|
218
|
+
}
|
|
219
|
+
export interface EvidenceBundle {
|
|
220
|
+
/** Infraweaver's own schema id — explicitly NOT OSCAL (see module note). */
|
|
221
|
+
schema: typeof EVIDENCE_SCHEMA;
|
|
222
|
+
/** caller-supplied ISO timestamp (kept out of the builder so it stays pure). */
|
|
223
|
+
generated_at: string;
|
|
224
|
+
tool: {
|
|
225
|
+
name: typeof TOOL_NAME;
|
|
226
|
+
version: string;
|
|
227
|
+
};
|
|
228
|
+
/** who produced this evidence — model + runtime + observed scanner builds. */
|
|
229
|
+
provenance: EvidenceProvenance;
|
|
230
|
+
subject: {
|
|
231
|
+
scanned_dir: string;
|
|
232
|
+
repo?: string | undefined;
|
|
233
|
+
ref?: string | undefined;
|
|
234
|
+
commit?: string | undefined;
|
|
235
|
+
};
|
|
236
|
+
posture: AssessmentScorecard["posture"];
|
|
237
|
+
summary: {
|
|
238
|
+
total: number;
|
|
239
|
+
by_severity: AssessmentScorecard["by_severity"];
|
|
240
|
+
verification: VerificationSummary["counts"];
|
|
241
|
+
};
|
|
242
|
+
/** one statement per mapped concern, each carrying its status + controls. */
|
|
243
|
+
control_statements: EvidenceControlStatement[];
|
|
244
|
+
/** which scanners code-verified vs which were inconclusive (coverage gaps). */
|
|
245
|
+
coverage: VerificationSummary["coverage"];
|
|
246
|
+
/** what the posture above EXCLUDES because a human accepted it. Always
|
|
247
|
+
* present (0 when nothing was silenced) so a clean repo and a quiet one are
|
|
248
|
+
* distinguishable from the signed bytes alone. */
|
|
249
|
+
suppressions: EvidenceSuppressionSummary;
|
|
250
|
+
crosswalk: {
|
|
251
|
+
version: string;
|
|
252
|
+
reviewed: string;
|
|
253
|
+
/** sha256 of the reviewed crosswalk tables that produced these verdicts —
|
|
254
|
+
* binds the exact (integrity-gated) control mapping into the signed bundle. */
|
|
255
|
+
digest: string;
|
|
256
|
+
by_framework: CrosswalkReport["by_framework"];
|
|
257
|
+
};
|
|
258
|
+
/** the five-status legend, so the bundle is self-describing for an assessor. */
|
|
259
|
+
legend: Record<VerificationStatus, string>;
|
|
260
|
+
/** present only on a refactor run — the equivalence/proposed-unproven statement
|
|
261
|
+
* with the proof that backs it (omitted entirely otherwise). */
|
|
262
|
+
refactor?: EvidenceRefactorStatement | undefined;
|
|
263
|
+
/** present only when the credential-free cost analysis ran — the §5.19 idle
|
|
264
|
+
* floor (what this bills at zero traffic), never a monthly total. */
|
|
265
|
+
cost?: EvidenceCostStatement | undefined;
|
|
266
|
+
/** present only when detect_plan_drift ran — the TC-2.1 drift statement:
|
|
267
|
+
* signed, bounded proof of whether live infrastructure matched the committed
|
|
268
|
+
* configuration when the plan artifact was produced, with the `forgotten`
|
|
269
|
+
* blind-spot list and every coverage gap carried in the claim itself. */
|
|
270
|
+
drift?: DriftEvidenceStatement | undefined;
|
|
271
|
+
/** present only when a provider-major upgrade was detected (TC-2.2) — which
|
|
272
|
+
* boundary was crossed, the codified transforms found in this configuration,
|
|
273
|
+
* and the plan that proves (or fails to prove) the result. A `no-plan` verdict
|
|
274
|
+
* is recorded rather than omitted: an upgrade shipped without a plan is
|
|
275
|
+
* exactly the thing a reader must be able to see. */
|
|
276
|
+
upgrade?: UpgradeEvidenceStatement | undefined;
|
|
277
|
+
/** Ed25519 signing metadata (public key + fingerprint + the sibling `.sig`
|
|
278
|
+
* carrying the detached signature over this file's exact bytes), or an
|
|
279
|
+
* explicit null when no INFRAWEAVER_SIGNING_KEY is configured — never fake. */
|
|
280
|
+
signature: SignatureMetadata | null;
|
|
281
|
+
/** §5.16 always-present eIDAS assurance declaration: which electronic-seal
|
|
282
|
+
* tier the `signature` above actually reaches, and — the load-bearing half —
|
|
283
|
+
* which it does not. `signature` says HOW the bytes were signed; this says
|
|
284
|
+
* WHAT THAT IS WORTH legally, so a reader cannot over-read an Ed25519
|
|
285
|
+
* signature as a qualified seal. Present even when unsigned (`level: "none"`),
|
|
286
|
+
* because an omitted section is ambiguous. See [[eidas]]. */
|
|
287
|
+
seal: EidasSeal;
|
|
288
|
+
disclaimer: string;
|
|
289
|
+
}
|
|
290
|
+
export interface EvidenceSubject {
|
|
291
|
+
scanned_dir: string;
|
|
292
|
+
repo?: string | undefined;
|
|
293
|
+
ref?: string | undefined;
|
|
294
|
+
commit?: string | undefined;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Build the evidence bundle from an assessment's scorecard + crosswalk. Pure —
|
|
298
|
+
* `generatedAt` and the subject identifiers are passed in so the same inputs
|
|
299
|
+
* always produce the same bytes (and tests don't need a clock). Control
|
|
300
|
+
* statements come from the crosswalk entries (which already carry the
|
|
301
|
+
* verification status), enriched with the concern's severity/location when the
|
|
302
|
+
* scanned concerns are supplied (the crosswalk entry itself carries neither).
|
|
303
|
+
*/
|
|
304
|
+
export declare function buildEvidenceBundle(args: {
|
|
305
|
+
scorecard: AssessmentScorecard;
|
|
306
|
+
crosswalk: CrosswalkReport;
|
|
307
|
+
subject: EvidenceSubject;
|
|
308
|
+
generatedAt: string;
|
|
309
|
+
version?: string;
|
|
310
|
+
/** the scanned concerns backing the crosswalk entries — the source of each
|
|
311
|
+
* statement's severity/file/line enrichment. */
|
|
312
|
+
concerns?: Concern[];
|
|
313
|
+
refactor?: EvidenceRefactorStatement | undefined;
|
|
314
|
+
/** the §5.19 idle-floor statement; omitted when no cost analysis ran. */
|
|
315
|
+
cost?: EvidenceCostStatement | undefined;
|
|
316
|
+
/** the TC-2.1 drift statement; omitted when detect_plan_drift didn't run. */
|
|
317
|
+
drift?: DriftEvidenceStatement | undefined;
|
|
318
|
+
/** the TC-2.2 upgrade statement; omitted when no provider-major pack applied. */
|
|
319
|
+
upgrade?: UpgradeEvidenceStatement | undefined;
|
|
320
|
+
/** who produced this evidence (A.3). REQUIRED — an evidence bundle that
|
|
321
|
+
* doesn't name its actor is the gap this block exists to close. Callers pass
|
|
322
|
+
* real values (the builder stays pure; no ambient reads here). */
|
|
323
|
+
provenance: EvidenceProvenance;
|
|
324
|
+
/** signing metadata when a key is configured; omitted/null ⇒ explicit
|
|
325
|
+
* `"signature": null` (the honest-unsigned marker). */
|
|
326
|
+
signature?: SignatureMetadata | null;
|
|
327
|
+
}): EvidenceBundle;
|
|
328
|
+
export declare const TerraformEmitEvidenceParams: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
329
|
+
output_path?: string;
|
|
330
|
+
severity_threshold?: "critical" | "high" | "info" | "low" | "medium";
|
|
331
|
+
proposed_unproven?: boolean;
|
|
332
|
+
}, {}>;
|
|
333
|
+
export declare function TerraformEmitEvidenceTool(ctx: LocalToolContext): import("fastmcp").Tool<any, import("@standard-schema/spec").StandardSchemaV1<{
|
|
334
|
+
output_path?: string;
|
|
335
|
+
severity_threshold?: "critical" | "high" | "info" | "low" | "medium";
|
|
336
|
+
proposed_unproven?: boolean;
|
|
337
|
+
}, {
|
|
338
|
+
output_path?: string;
|
|
339
|
+
severity_threshold?: "critical" | "high" | "info" | "low" | "medium";
|
|
340
|
+
proposed_unproven?: boolean;
|
|
341
|
+
}>> & {
|
|
342
|
+
mutates?: boolean;
|
|
343
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
2
|
+
/**
|
|
3
|
+
* Map a reviewer `findings.json` body into Concern[]. Drops `human_only`
|
|
4
|
+
* findings (out of scope — not auto-remediable). Paths are normalized to
|
|
5
|
+
* repo-relative POSIX (same as the scanners) so ids and grouping stay portable.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseReviewerFindings(json: string, cwd?: string): Concern[];
|
|
8
|
+
declare const SarifReport: import("arktype/internal/variants/object.ts").ObjectType<{
|
|
9
|
+
version?: string;
|
|
10
|
+
$schema?: string;
|
|
11
|
+
runs?: {
|
|
12
|
+
tool?: {
|
|
13
|
+
driver?: {
|
|
14
|
+
name?: string;
|
|
15
|
+
rules?: {
|
|
16
|
+
id?: string;
|
|
17
|
+
helpUri?: string;
|
|
18
|
+
shortDescription?: {
|
|
19
|
+
text?: string;
|
|
20
|
+
};
|
|
21
|
+
}[];
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
results?: {
|
|
25
|
+
ruleId?: string;
|
|
26
|
+
level?: string;
|
|
27
|
+
message?: {
|
|
28
|
+
text?: string;
|
|
29
|
+
};
|
|
30
|
+
locations?: {
|
|
31
|
+
physicalLocation?: {
|
|
32
|
+
artifactLocation?: {
|
|
33
|
+
uri?: string;
|
|
34
|
+
};
|
|
35
|
+
region?: {
|
|
36
|
+
startLine?: number;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}[];
|
|
40
|
+
properties?: {
|
|
41
|
+
"security-severity"?: string;
|
|
42
|
+
};
|
|
43
|
+
suppressions?: {
|
|
44
|
+
kind: "external" | "inSource";
|
|
45
|
+
justification?: string;
|
|
46
|
+
}[];
|
|
47
|
+
}[];
|
|
48
|
+
}[];
|
|
49
|
+
}, {}>;
|
|
50
|
+
type SarifReport = typeof SarifReport.infer;
|
|
51
|
+
/** true when a parsed JSON object looks like a SARIF report (the standard
|
|
52
|
+
* scanner-output format) rather than a terraform-reviewer findings.json. */
|
|
53
|
+
export declare function isSarif(parsed: unknown): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Parse a SARIF 2.1.0 report (the standard scanner-output format Trivy /
|
|
56
|
+
* Checkov / tflint all emit) into Concern[]. The driver name picks the source so
|
|
57
|
+
* a finding from a scanner Infraweaver re-runs reproduces the SAME content id
|
|
58
|
+
* (✗→✓ verifiable); other tools collapse to `reviewer`. Rule docs come from the
|
|
59
|
+
* matching `tool.driver.rules[].helpUri`. Non-Terraform files are dropped.
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseSarifFindings(json: string, cwd?: string): Concern[];
|
|
62
|
+
/** dispatch a findings file to the right parser: SARIF (standard scanner
|
|
63
|
+
* output) or a terraform-reviewer findings.json. */
|
|
64
|
+
export declare function parseFindingsFile(json: string, cwd?: string): Concern[];
|
|
65
|
+
/**
|
|
66
|
+
* Emit a set of concerns as a SARIF 2.1.0 report for GitHub code-scanning (the
|
|
67
|
+
* inverse of `parseSarifFindings` — close the loop so a Infraweaver scan can
|
|
68
|
+
* populate the repo's Security tab via `github/codeql-action/upload-sarif`). One
|
|
69
|
+
* `run` with the `infraweaver` driver, a deduped `rules` array (each rule's
|
|
70
|
+
* `helpUri` from `ruleDocUrl`), and one `result` per concern carrying its
|
|
71
|
+
* `level`, `security-severity`, message, and `file:line`. Pure + deterministic
|
|
72
|
+
* (rules sorted, stable partialFingerprints from the content id) so re-emitting
|
|
73
|
+
* an unchanged scan yields a byte-identical report.
|
|
74
|
+
*/
|
|
75
|
+
export declare function buildSarifReport(concerns: Concern[]): SarifReport;
|
|
76
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
2
|
+
export declare const FIX_MEMORY_FILENAME = ".infraweaver.fix-memory.json";
|
|
3
|
+
/**
|
|
4
|
+
* A proven-fix pattern. Freshly CAPTURED patterns carry only the identity +
|
|
5
|
+
* guidance (no stats); LIBRARY entries (loaded from Cloud / a local file) also
|
|
6
|
+
* carry the reuse stats and the operator `disabled` flag. The finding-TYPE key
|
|
7
|
+
* (`finding_type`) is file-independent on purpose — the whole point is to reuse
|
|
8
|
+
* across files and repos.
|
|
9
|
+
*/
|
|
10
|
+
export interface ProvenFixPattern {
|
|
11
|
+
/** the finding-TYPE shape: `source|bareRule` (file-independent). The match key. */
|
|
12
|
+
finding_type: string;
|
|
13
|
+
/** producing scanner, when known (null for reviewer-loaded concerns). */
|
|
14
|
+
source: string | null;
|
|
15
|
+
/** cross-scanner canonical class (e.g. "aws-s3-encryption"), when recognised. */
|
|
16
|
+
canonical_class: string | null;
|
|
17
|
+
category: string;
|
|
18
|
+
/** human label — the namespaced rule id (e.g. "trivy:AVD-AWS-0088"). */
|
|
19
|
+
title: string;
|
|
20
|
+
/** the scanner's "what is wrong" message, trimmed + capped. */
|
|
21
|
+
description: string | null;
|
|
22
|
+
/** the remediation guidance that proved out (trivy Resolution / fmt hint / …). */
|
|
23
|
+
remediation_hint: string | null;
|
|
24
|
+
/** a representative BEFORE snippet from the repo the pattern was proven on —
|
|
25
|
+
* a concrete example for the fixer to adapt, never a patch to apply verbatim. */
|
|
26
|
+
before_example: string | null;
|
|
27
|
+
/** how many times this type went `✗→✓` (across the fleet, from Cloud). */
|
|
28
|
+
times_proven?: number;
|
|
29
|
+
/** distinct repos it's been proven on. */
|
|
30
|
+
repos_count?: number;
|
|
31
|
+
/** ISO timestamp of the most recent proof. */
|
|
32
|
+
last_proven?: string;
|
|
33
|
+
/** operator retired this pattern in the dashboard — never offered to the fixer. */
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** The finding-TYPE identity: `source|bareRule`, file-independent (unlike
|
|
37
|
+
* `concernKeyOf`, which folds in the file). Two instances of the same rule in
|
|
38
|
+
* different files/repos share this key — the reuse unit. */
|
|
39
|
+
export declare function findingTypeOf(c: Pick<Concern, "source" | "rule_id">): string;
|
|
40
|
+
/** Build a fresh pattern from a concern that just proved out `✗→✓`. Pure. */
|
|
41
|
+
export declare function captureProvenFix(c: Concern): ProvenFixPattern;
|
|
42
|
+
/**
|
|
43
|
+
* De-duplicate a run's captures to one pattern per finding-type. When the same
|
|
44
|
+
* type is proven on several concerns this run, keep the FIRST that carries a
|
|
45
|
+
* before-example (a concrete example beats none), else the first seen — the
|
|
46
|
+
* order is otherwise stable so the wire is deterministic.
|
|
47
|
+
*/
|
|
48
|
+
export declare function dedupeCaptures(captures: ProvenFixPattern[]): ProvenFixPattern[];
|
|
49
|
+
/**
|
|
50
|
+
* Match a loaded library against the CURRENT scan's concerns: return the patterns
|
|
51
|
+
* whose finding-type is present in this scan (deduped, `disabled` excluded),
|
|
52
|
+
* newest-proven first, capped. This is what the fixer is offered — a proven prior
|
|
53
|
+
* for the exact finding-types it's about to fix. Pure.
|
|
54
|
+
*/
|
|
55
|
+
export declare function matchPatternsForConcerns(library: ProvenFixPattern[], concerns: Pick<Concern, "source" | "rule_id">[], max?: number): ProvenFixPattern[];
|
|
56
|
+
export interface FixMemoryFile {
|
|
57
|
+
version: 1;
|
|
58
|
+
/** ISO timestamp of the last write (informational). */
|
|
59
|
+
updated?: string;
|
|
60
|
+
patterns: ProvenFixPattern[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Merge freshly-captured patterns into a local library, keyed by finding-type:
|
|
64
|
+
* bump `times_proven`, advance `last_proven`, and prefer a non-empty
|
|
65
|
+
* before-example/hint over an empty one. The local file is single-repo memory
|
|
66
|
+
* (the fleet count lives in Cloud), so `repos_count` stays 1 here. Pure.
|
|
67
|
+
*/
|
|
68
|
+
export declare function mergeFixMemory(existing: ProvenFixPattern[], captured: ProvenFixPattern[], provenAt: string): ProvenFixPattern[];
|
|
69
|
+
export declare function serializeFixMemory(patterns: ProvenFixPattern[], updated: string): FixMemoryFile;
|
|
70
|
+
/** Parse fix-memory JSON into a pattern list; tolerant of a malformed/old file (→ null). */
|
|
71
|
+
export declare function parseFixMemory(raw: string): ProvenFixPattern[] | null;
|
|
72
|
+
/** Structural guard for one untrusted pattern (from a file or the Cloud library). */
|
|
73
|
+
export declare function isProvenFixPattern(value: unknown): value is ProvenFixPattern;
|
|
74
|
+
/** Load `.infraweaver.fix-memory.json` under `cwd`; [] when absent/unreadable/malformed. */
|
|
75
|
+
export declare function loadFixMemory(cwd: string | undefined): ProvenFixPattern[];
|
|
76
|
+
/**
|
|
77
|
+
* Coerce an untrusted library payload (the Cloud run-context `provenFixes` blob)
|
|
78
|
+
* into typed patterns, keeping only structurally-valid, non-disabled entries.
|
|
79
|
+
* Pure — the wire boundary can't be typechecked across repos.
|
|
80
|
+
*/
|
|
81
|
+
export declare function coerceLibrary(raw: unknown): ProvenFixPattern[];
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type Concern } from "#app/mcp/terraform/types";
|
|
2
|
+
export interface ActionTriggerSite {
|
|
3
|
+
/** the resource the trigger hangs off, `<type>.<name>`. */
|
|
4
|
+
resourceAddress: string;
|
|
5
|
+
/** 1-based line of the `action_trigger` block. */
|
|
6
|
+
line: number;
|
|
7
|
+
/** lifecycle events the trigger fires on, as written (`after_create`, …). */
|
|
8
|
+
events: string[];
|
|
9
|
+
/** the action references invoked, as written (`action.aws_lambda_invoke.x`). */
|
|
10
|
+
actions: string[];
|
|
11
|
+
/** true when the trigger is conditional — the side-effect may or may not run,
|
|
12
|
+
* which is strictly harder to reason about, not easier. */
|
|
13
|
+
conditional: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Every `lifecycle { action_trigger { … } }` in `hcl`, with the resource it
|
|
17
|
+
* belongs to. Walks resource → lifecycle → action_trigger explicitly rather than
|
|
18
|
+
* matching `action_trigger` anywhere, so a same-named argument elsewhere can't
|
|
19
|
+
* fabricate a governance finding.
|
|
20
|
+
*/
|
|
21
|
+
export declare function findActionTriggers(hcl: string): ActionTriggerSite[];
|
|
22
|
+
/** Declared `action "<type>" "<name>" {}` blocks — the definitions the triggers
|
|
23
|
+
* reference. Reported as inventory, never as a finding: declaring an action is
|
|
24
|
+
* inert; only invoking one from a lifecycle event has an effect. */
|
|
25
|
+
export declare function findActionDeclarations(hcl: string): {
|
|
26
|
+
address: string;
|
|
27
|
+
line: number;
|
|
28
|
+
}[];
|
|
29
|
+
export declare function actionTriggersToConcerns(sites: ActionTriggerSite[], file: string): Concern[];
|
|
30
|
+
export declare function isStatefulResourceType(resourceType: string): boolean;
|
|
31
|
+
export interface DynamicDestroyProtectionSite {
|
|
32
|
+
resourceAddress: string;
|
|
33
|
+
resourceType: string;
|
|
34
|
+
/** 1-based line of the `prevent_destroy` assignment. */
|
|
35
|
+
line: number;
|
|
36
|
+
/** the expression as written, e.g. `var.protect`. */
|
|
37
|
+
expression: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Every `prevent_destroy` on a STATEFUL resource whose value is an expression
|
|
41
|
+
* rather than a literal. A literal `true` or `false` is decidable from the code
|
|
42
|
+
* and reported by nobody here; a non-stateful resource is out of scope by design.
|
|
43
|
+
*/
|
|
44
|
+
export declare function findDynamicDestroyProtection(hcl: string): DynamicDestroyProtectionSite[];
|
|
45
|
+
export declare function dynamicDestroyProtectionToConcerns(sites: DynamicDestroyProtectionSite[], file: string): Concern[];
|
|
46
|
+
export interface GovernanceScan {
|
|
47
|
+
concerns: Concern[];
|
|
48
|
+
/** action declarations found — inventory for the run summary, not findings. */
|
|
49
|
+
actionDeclarations: {
|
|
50
|
+
address: string;
|
|
51
|
+
line: number;
|
|
52
|
+
file: string;
|
|
53
|
+
}[];
|
|
54
|
+
}
|
|
55
|
+
/** Both governance rules over one file's HCL. Pure. */
|
|
56
|
+
export declare function scanGovernanceFile(hcl: string, file: string): GovernanceScan;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared, tolerant HCL block scanning.
|
|
3
|
+
*
|
|
4
|
+
* Every native rule in this engine ([[writeOnly]], [[governance]], [[tfquery]],
|
|
5
|
+
* and the provider-schema cross-check in [[scanners]]) needs the same primitive:
|
|
6
|
+
* walk a file's `<keyword> "label" "label" { … }` blocks and read their top-level
|
|
7
|
+
* arguments, without being fooled by a `}` inside a string, a commented-out brace,
|
|
8
|
+
* or a heredoc body. Getting that wrong doesn't produce a parse error — it
|
|
9
|
+
* produces a WRONG FINDING at a wrong line, which is the failure mode this
|
|
10
|
+
* product can least afford. So there is exactly one implementation of it.
|
|
11
|
+
*
|
|
12
|
+
* Deliberately NOT a real HCL parser. We never evaluate expressions, resolve
|
|
13
|
+
* variables, or validate syntax — `terraform validate` (the customer's own
|
|
14
|
+
* binary) owns that. This reads structure only, and every consumer is written to
|
|
15
|
+
* degrade to "no finding" rather than guess when the structure is unclear.
|
|
16
|
+
*
|
|
17
|
+
* Pure: string in, structure out. No filesystem, no subprocess.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* A non-code span in HCL — a `"…"` string, a `#`/`//` line comment, or a
|
|
21
|
+
* `<<EOF` heredoc — that the brace/argument scanners must skip wholesale (an
|
|
22
|
+
* interpolation's `${…}`, a commented `}`, or a heredoc's `key = value` lines
|
|
23
|
+
* would otherwise corrupt brace depth or fabricate an argument). Returned for a
|
|
24
|
+
* span starting at `i`: `end` is the index of its LAST char (caller resumes at
|
|
25
|
+
* `end + 1`), and `endsLine` is true when the span finished at a line boundary
|
|
26
|
+
* (comment / heredoc — the next token begins a fresh statement). null when `i`
|
|
27
|
+
* isn't the start of a non-code span.
|
|
28
|
+
*/
|
|
29
|
+
export declare function skipNonCode(s: string, i: number): {
|
|
30
|
+
end: number;
|
|
31
|
+
endsLine: boolean;
|
|
32
|
+
} | null;
|
|
33
|
+
/**
|
|
34
|
+
* Brace-match from an opening `{` at `open`; returns the inner text + end index
|
|
35
|
+
* (the matching `}`), string/comment/heredoc-aware so interpolation braces, a
|
|
36
|
+
* commented `}`, or a heredoc body don't fool it. null when the block never
|
|
37
|
+
* closes (a truncated or malformed file) — callers stop rather than guess.
|
|
38
|
+
*/
|
|
39
|
+
export declare function matchBraceBody(hcl: string, open: number): {
|
|
40
|
+
text: string;
|
|
41
|
+
end: number;
|
|
42
|
+
} | null;
|
|
43
|
+
/** 1-based line number of `index` in `hcl`. */
|
|
44
|
+
export declare function lineOf(hcl: string, index: number): number;
|
|
45
|
+
/** A top-level block (`resource "aws_s3_bucket" "b" { … }`) with its source span. */
|
|
46
|
+
export interface HclBlock {
|
|
47
|
+
/** the block keyword — `resource`, `action`, `list`, … */
|
|
48
|
+
keyword: string;
|
|
49
|
+
/** the quoted labels after the keyword, in order. */
|
|
50
|
+
labels: string[];
|
|
51
|
+
/** the block's inner text (between the braces). */
|
|
52
|
+
body: string;
|
|
53
|
+
/** 1-based line of the block header. */
|
|
54
|
+
line: number;
|
|
55
|
+
/** 1-based line of the body's opening `{`. Body-relative lines add to this
|
|
56
|
+
* (`absolute = bodyLine + bodyRelativeLine - 1`), so a caller never needs a
|
|
57
|
+
* second `lineOf` scan to place an assignment. */
|
|
58
|
+
bodyLine: number;
|
|
59
|
+
/** 1-based line of the matching `}` — the block's last line. */
|
|
60
|
+
endLine: number;
|
|
61
|
+
/** index in `hcl` of the header's first char. */
|
|
62
|
+
start: number;
|
|
63
|
+
/** index in `hcl` of the body's opening `{`. */
|
|
64
|
+
bodyStart: number;
|
|
65
|
+
/** index in `hcl` of the matching `}`. */
|
|
66
|
+
end: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Every TOP-LEVEL block in `hcl` whose keyword is in `keywords`.
|
|
70
|
+
*
|
|
71
|
+
* Anchored to a line start so a `resource` mentioned inside a string or a nested
|
|
72
|
+
* body can't be mistaken for a declaration, and each match resumes past the
|
|
73
|
+
* block's closing brace so nested blocks of the same keyword are never
|
|
74
|
+
* double-reported. A block that doesn't close terminates the scan (see
|
|
75
|
+
* `matchBraceBody`) — an unparseable tail yields fewer findings, never wrong ones.
|
|
76
|
+
*
|
|
77
|
+
* Line numbers are counted forward as the scan advances rather than by rescanning
|
|
78
|
+
* from the start of the file for each one. Matches arrive in increasing index
|
|
79
|
+
* order, so this is exact — and it keeps a file with many blocks linear instead of
|
|
80
|
+
* quadratic, which matters on the monorepos this walks 2000 files of.
|
|
81
|
+
*/
|
|
82
|
+
export declare function parseBlocks(hcl: string, keywords: readonly string[]): HclBlock[];
|
|
83
|
+
/** One `name = <value>` assignment found at the top level of a block body. */
|
|
84
|
+
export interface HclAssignment {
|
|
85
|
+
name: string;
|
|
86
|
+
/** the raw right-hand side, trimmed — an expression, not an evaluated value. */
|
|
87
|
+
value: string;
|
|
88
|
+
/** 1-based line of the assignment, RELATIVE TO THE BODY text. */
|
|
89
|
+
bodyLine: number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Top-level `name = value` assignments in a block body, string/comment/heredoc-
|
|
93
|
+
* aware and depth-0 only (a `password` inside a nested block belongs to that
|
|
94
|
+
* block, not this one). Nested BLOCKS are ignored here — use `parseBlocks` on the
|
|
95
|
+
* body for those.
|
|
96
|
+
*
|
|
97
|
+
* The value is captured raw to the end of its line, which is right for the
|
|
98
|
+
* single-line assignments every rule here inspects (`password = var.x`,
|
|
99
|
+
* `prevent_destroy = true`). A multi-line value (a list or object literal
|
|
100
|
+
* spanning lines) is captured only as far as its first line; no rule asserts on
|
|
101
|
+
* such a value, and each is written to skip what it cannot read.
|
|
102
|
+
*/
|
|
103
|
+
export declare function topLevelAssignments(body: string): HclAssignment[];
|
|
104
|
+
/**
|
|
105
|
+
* Strip a trailing `# …` / `// …` comment from a captured right-hand side.
|
|
106
|
+
*
|
|
107
|
+
* Deliberately handles ONLY strings and comments, not the full `skipNonCode` set:
|
|
108
|
+
* a heredoc opener (`<<EOF`) is part of the value, and treating it as a span to
|
|
109
|
+
* stop at would silently truncate the value to the empty string — which then
|
|
110
|
+
* flows into a proposed edit as `password_wo = ` and produces a broken rewrite.
|
|
111
|
+
*/
|
|
112
|
+
export declare function stripTrailingComment(value: string): string;
|
|
113
|
+
/** True when a right-hand side is a bare quoted string LITERAL with no
|
|
114
|
+
* interpolation — i.e. the value is written into the config, not referenced. */
|
|
115
|
+
export declare function isStringLiteral(value: string): boolean;
|