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
package/README.md
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# Infraweaver
|
|
2
|
+
|
|
3
|
+
[](LICENSE)
|
|
4
|
+
[](https://github.com/infraweaver-io/infraweaver-action/actions/workflows/test.yml)
|
|
5
|
+
[](package.json)
|
|
6
|
+
|
|
7
|
+
**Infraweaver brings your Terraform up to best practice — automatically, as reviewable pull requests.**
|
|
8
|
+
|
|
9
|
+
> 🌐 **Languages:** [🇩🇪 Deutsch](docs/i18n/README.de.md) · [🇪🇸 Español](docs/i18n/README.es.md) · [🇵🇱 Polski](docs/i18n/README.pl.md) · [🇷🇴 Română](docs/i18n/README.ro.md) — condensed summaries; this English README is canonical.
|
|
10
|
+
|
|
11
|
+
Infraweaver is an open-source ([AGPL-3.0](#licence)) GitHub Action and agent runtime. Point it at a
|
|
12
|
+
repository and it scans the Terraform with standard deterministic tools, then opens **one scoped,
|
|
13
|
+
reviewable pull request per concern** that fixes the issue and **proves it fixed** by re-scanning the
|
|
14
|
+
branch (✗ → ✓). It never auto-merges — a human always reviews.
|
|
15
|
+
|
|
16
|
+
- **It proves its own fixes.** The PR body records `✗ → ✓ <rule> resolved`, produced by re-running the
|
|
17
|
+
same deterministic scanners on the branch. Anyone can reproduce it — evidence, not a claim.
|
|
18
|
+
- **Tools decide, the LLM assists.** Findings come from `terraform fmt`/`validate`, tflint, Trivy and
|
|
19
|
+
Checkov — not the model's opinion. The agent only applies the minimal, constrained fix.
|
|
20
|
+
- **One scoped PR per concern.** Small, reviewable diffs on stable `remediate/<id>` branches. Re-runs
|
|
21
|
+
update the existing PR rather than opening duplicates.
|
|
22
|
+
- **Guardrails enforced in code, not prompts.** Terraform-only edits, no inlined secrets, no destroying
|
|
23
|
+
stateful data, never auto-merges — all fail-closed at push time.
|
|
24
|
+
- **Module-aware.** Fixes land at the module source, version upgrades arrive as scoped `chore(deps)`
|
|
25
|
+
PRs, and resource piles become module calls only when a pure-`moved` plan proves the refactor is a
|
|
26
|
+
no-op.
|
|
27
|
+
- **Bring your own key, no hosted backend.** Supply your own LLM key, pointed at an approved endpoint
|
|
28
|
+
where data residency matters. Nothing leaves your runner that you didn't configure.
|
|
29
|
+
|
|
30
|
+
## Quickstart
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
name: Infraweaver — Terraform remediation
|
|
34
|
+
on:
|
|
35
|
+
workflow_dispatch:
|
|
36
|
+
schedule:
|
|
37
|
+
- cron: "0 6 * * 1" # weekly drift sweep
|
|
38
|
+
|
|
39
|
+
permissions:
|
|
40
|
+
contents: write # push the remediation branch
|
|
41
|
+
pull-requests: write # open the PR
|
|
42
|
+
|
|
43
|
+
jobs:
|
|
44
|
+
remediate:
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
steps:
|
|
47
|
+
# Pin third-party actions to a commit SHA — a tag can be force-repointed.
|
|
48
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
|
|
49
|
+
|
|
50
|
+
# install the Terraform best-practice toolchain (absent tools are skipped, never fatal)
|
|
51
|
+
- uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3
|
|
52
|
+
- uses: terraform-linters/setup-tflint@90f302c255ef959cbfb4bd10581afecdb7ece3e6 # v4
|
|
53
|
+
- uses: aquasecurity/setup-trivy@81e514348e19b6112ce2a7e3ecbafe19c1e1f567 # v0.3.1
|
|
54
|
+
with:
|
|
55
|
+
# renovate: datasource=github-releases depName=aquasecurity/trivy
|
|
56
|
+
version: v0.72.0 # pin the TOOL too: a SHA-pinned action still installs floating-latest
|
|
57
|
+
- run: pipx install checkov
|
|
58
|
+
|
|
59
|
+
- name: Run Infraweaver
|
|
60
|
+
uses: infraweaver-io/infraweaver-action@main
|
|
61
|
+
with:
|
|
62
|
+
mode: remediate
|
|
63
|
+
severity_threshold: medium # only act on medium+ concerns
|
|
64
|
+
max_prs: 1 # one scoped PR per run
|
|
65
|
+
env:
|
|
66
|
+
# bring your own LLM key (BYOK)
|
|
67
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
68
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
> **Ready-to-use workflows:** [`examples/`](examples/) has copy-pasteable workflows — scheduled
|
|
72
|
+
> [remediation](examples/remediate.yml), [behaviour-preserving refactors](examples/refactor.yml),
|
|
73
|
+
> [comment-triggered fixes](examples/comment-fix.yml), and the full
|
|
74
|
+
> [SARIF + plan-gate + policy setup](examples/remediate-advanced.yml).
|
|
75
|
+
|
|
76
|
+
## How it works
|
|
77
|
+
|
|
78
|
+
```mermaid
|
|
79
|
+
flowchart LR
|
|
80
|
+
A[Scan<br/>fmt · validate · tflint<br/>Trivy · Checkov] --> B[Concerns<br/>severity-ranked,<br/>grouped]
|
|
81
|
+
B --> C[Fix<br/>minimal change,<br/>Terraform-only]
|
|
82
|
+
C --> D[Validate<br/>fmt · validate · tflint]
|
|
83
|
+
D --> E[Plan gate<br/>optional, with creds]
|
|
84
|
+
E --> F[Open one<br/>scoped PR]
|
|
85
|
+
F --> G[Re-scan branch<br/>✗ → ✓ proof]
|
|
86
|
+
G -.->|regression / needs-human| H[Label for a human]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Scanners find the problem, the agent applies the minimal fix, and the scanners verify it** before a
|
|
90
|
+
single PR is opened. Coverage is inherited, not reinvented: findings come from the scanners Infraweaver
|
|
91
|
+
runs (Checkov's 1,000+ policies, Trivy's AVD checks, tflint's provider rulesets, `fmt`/`validate`), so
|
|
92
|
+
new upstream checks show up the day you update the scanner. The PR's **Validation (✗ → ✓)** section is
|
|
93
|
+
the part you can trust without trusting Infraweaver — re-run the same scanners on the branch and
|
|
94
|
+
reproduce it. Higher-risk fixes (a regression, a stateful destroy/replace, a large blast radius, a
|
|
95
|
+
non-deterministic plan) get a `> [!CAUTION]` banner and a `needs-human` label.
|
|
96
|
+
|
|
97
|
+
## How Infraweaver compares
|
|
98
|
+
|
|
99
|
+
| | Reports findings | Fixes the code | Proves the fix | Opens a PR | Auto-merges |
|
|
100
|
+
| -------------------------------------------- | :--------------: | :----------------: | :----------------: | :------------------: | :---------: |
|
|
101
|
+
| **Scanners** (Checkov, Trivy, tfsec, tflint) | ✅ | ❌ | ❌ | ❌ | — |
|
|
102
|
+
| **Plan orchestrators** (Atlantis, Digger) | ❌ | ❌ | ❌ | comments on yours | ❌ |
|
|
103
|
+
| **Dependency bots** (Dependabot, Renovate) | ✅ (deps) | ✅ (version bumps) | ❌ | ✅ | optional |
|
|
104
|
+
| **Auto-fix AI bots** | partial | ✅ | rarely | ✅ | often |
|
|
105
|
+
| **Infraweaver** | ✅ | ✅ | ✅ (✗ → ✓ re-scan) | ✅ (one per concern) | **never** |
|
|
106
|
+
|
|
107
|
+
## Modes
|
|
108
|
+
|
|
109
|
+
A run is one **mode** — the verb it performs. Pin it with the `mode:` input for a deterministic CI
|
|
110
|
+
run (the Terraform CI modes ship an engine-owned prompt that a workflow can't override), or omit it
|
|
111
|
+
to let Infraweaver pick from the trigger. Full reference: **<https://infraweaver.dev/docs/modes>**.
|
|
112
|
+
|
|
113
|
+
| Mode | Commits? | What it does |
|
|
114
|
+
| --- | :---: | --- |
|
|
115
|
+
| **Assess** | ❌ | Read-only security/best-practice posture scan — the PR gate. |
|
|
116
|
+
| **TerraformCodeReview** | ❌ | Read-only `*.tf`-only review of a human PR (security, state-safety, version pins, module hygiene). |
|
|
117
|
+
| **PolicyGate** | ❌ | Read-only OPA/conftest policy gate (PASS / FAIL / INCONCLUSIVE). |
|
|
118
|
+
| **DriftDetect** | ❌ | Read-only scheduled drift check — `terraform plan` vs live state. |
|
|
119
|
+
| **ComplianceAudit** | ❌ | Read-only controls audit mapped to `required_controls`, emits OSCAL. |
|
|
120
|
+
| **Remediate** | ✅ | Fixes the top finding group, one scoped PR, proven by a ✗→✓ re-scan. |
|
|
121
|
+
| **Refactor** | ✅ | Behaviour-preserving modularise/normalise, proven `equivalent: true`. |
|
|
122
|
+
| **RemediateAndRefactor** | ✅ | Fix + modularise in one PR with two distinct proofs. |
|
|
123
|
+
| **UpdateDependencies** | ✅ | Bumps stale provider/module pins, proven by equivalence or a reviewed plan. |
|
|
124
|
+
| **ModernizeDeprecated** | ✅ | Migrates deprecated patterns, one class per PR, proven by a reviewed plan. |
|
|
125
|
+
| **CostOptimization** | ✅ | infracost-quantified rightsizing PRs (needs `INFRACOST_API_KEY`). |
|
|
126
|
+
|
|
127
|
+
Plus general verbs auto-selected from the trigger — **Build**, **Review**, **IncrementalReview**,
|
|
128
|
+
**AddressReviews**, **Fix**, **Plan**, **SummarizePr**, **ResolveConflicts**, **Task**. Infraweaver
|
|
129
|
+
**never auto-merges** — every PR is left for human review.
|
|
130
|
+
|
|
131
|
+
### Signed evidence
|
|
132
|
+
|
|
133
|
+
The compliance artefacts (`terraform_emit_evidence`, `terraform_emit_vex`) can be **signed** with a
|
|
134
|
+
detached Ed25519 signature so an auditor can verify them offline. Generate a keypair once, store the
|
|
135
|
+
private half as a repo/org secret, and pass it to the runs that emit evidence:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# one-time: generate the keypair (private key never leaves your secret store)
|
|
139
|
+
openssl genpkey -algorithm ed25519 -out infraweaver-signing.pem
|
|
140
|
+
openssl pkey -in infraweaver-signing.pem -pubout -out infraweaver-signing.pub.pem # publish this half
|
|
141
|
+
base64 -w0 infraweaver-signing.pem # → the INFRAWEAVER_SIGNING_KEY secret value
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
```yaml
|
|
145
|
+
env:
|
|
146
|
+
INFRAWEAVER_SIGNING_KEY: ${{ secrets.INFRAWEAVER_SIGNING_KEY }}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Each artefact then ships with a sibling `.sig` plus the public key + fingerprint embedded in its
|
|
150
|
+
`signature` metadata; verify with `infraweaver verify-evidence <bundle> <bundle>.sig <pubkey.pem>`.
|
|
151
|
+
Without the secret nothing breaks — artefacts honestly record `"signature": null`.
|
|
152
|
+
|
|
153
|
+
#### Keyless (Sigstore) attestation — no key to manage
|
|
154
|
+
|
|
155
|
+
For a second, key-free tier, set `INFRAWEAVER_KEYLESS_SIGNING: true` on a GitHub Actions run that emits
|
|
156
|
+
evidence. Infraweaver then also writes a `<artefact>.sigstore.json` — an in-toto attestation of the
|
|
157
|
+
artefact (by sha256 digest) signed with the **workflow's ephemeral OIDC identity**: [Fulcio][fulcio]
|
|
158
|
+
issues a short-lived certificate bound to *this repo + workflow + run*, and the signing event is
|
|
159
|
+
recorded in the public [Rekor][rekor] transparency log. There is nothing to distribute — a verifier
|
|
160
|
+
checks the certificate identity (the workflow + the GitHub OIDC issuer), auditable in a public log. It
|
|
161
|
+
reuses the `id-token: write` permission Infraweaver already requires, so **no extra workflow permission
|
|
162
|
+
is needed**, and it's best-effort (a Fulcio/Rekor hiccup never blocks emitting evidence). Verify it
|
|
163
|
+
with the Cloud MCP server's `infraweaver_verify_keyless` tool.
|
|
164
|
+
|
|
165
|
+
[fulcio]: https://github.com/sigstore/fulcio
|
|
166
|
+
[rekor]: https://github.com/sigstore/rekor
|
|
167
|
+
|
|
168
|
+
#### Verifying Infraweaver itself
|
|
169
|
+
|
|
170
|
+
Evidence over trust applies to us too: don't take the code on faith, check it. Infraweaver is consumed
|
|
171
|
+
from `main`, so there are no published release artefacts — you verify the tree you're running and the
|
|
172
|
+
inventory it builds.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# 1. Build the CycloneDX SBOM from the same lockfile CI installs from, then
|
|
176
|
+
# Ed25519-sign it with your own key.
|
|
177
|
+
pnpm sbom && pnpm sign:sbom
|
|
178
|
+
|
|
179
|
+
# 2. Verify the signature offline — no network, no trust in npm or GitHub,
|
|
180
|
+
# using the public key shipped beside it.
|
|
181
|
+
node -e "const s=require('./infraweaver.cdx.json.sig.json');require('node:fs').writeFileSync('pub.pem',s.public_key)"
|
|
182
|
+
infraweaver verify-evidence infraweaver.cdx.json infraweaver.cdx.json.sig pub.pem
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
`infraweaver.cdx.json` is a **CycloneDX 1.7 SBOM of the locked dependency tree** — generated from
|
|
186
|
+
`pnpm-lock.yaml` (what CI actually installed from), so it describes exactly what a run installs
|
|
187
|
+
rather than a re-resolution of it. If you need it for a CRA or procurement dossier, that file plus
|
|
188
|
+
the verification step above is the artefact set.
|
|
189
|
+
|
|
190
|
+
> **What this does and does not prove.** The signature binds the inventory to bytes. It does not
|
|
191
|
+
> assert the dependencies are free of vulnerabilities — that's what the SBOM is *for*: feed it to
|
|
192
|
+
> your own scanner.
|
|
193
|
+
|
|
194
|
+
## Documentation
|
|
195
|
+
|
|
196
|
+
The full guides live on the docs site, **<https://infraweaver.dev/docs>**. The repo keeps the
|
|
197
|
+
machine-generated references next to the code.
|
|
198
|
+
|
|
199
|
+
| Doc | What's in it | Full guide |
|
|
200
|
+
| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
|
|
201
|
+
| [Action inputs & outputs](docs/action-inputs.md) | The complete `action.yml` reference (generated — never drifts) | — |
|
|
202
|
+
| Modes | Every run mode — what it does, whether it commits, and how it proves its change | <https://infraweaver.dev/docs/modes> |
|
|
203
|
+
| [Configuration](docs/configuration.md) | Modes, comment-scoped runs, scoping out findings, the plan gate & OIDC roles, BYOK, SARIF, repo config, scheduling, modules | <https://infraweaver.dev/docs/configuration> |
|
|
204
|
+
| [Security model](docs/security-model.md) | The code-level guardrails and the trust/data-privacy story (generated from `src/mcp/guardrails.ts`) | <https://infraweaver.dev/docs/security-model> |
|
|
205
|
+
| [Native rules](docs/native-rules.md) | The `source: infraweaver` findings no upstream scanner can produce, and the bands that decide each verdict | — |
|
|
206
|
+
| [Policy authoring](docs/policy-authoring.md) | Turning a written standard into reviewable Rego with `policy_author`, enforced by `policy_check` | — |
|
|
207
|
+
| [MCP server (local)](docs/mcp.md) | `infraweaver mcp` in your IDE + pairing with HashiCorp's terraform-mcp-server | <https://infraweaver.dev/docs/mcp> |
|
|
208
|
+
| MCP server (Cloud) | `@infraweaver/mcp-server` — read a connected repo's Cloud findings, health score & signed evidence from your IDE agent | <https://infraweaver.dev/docs/mcp-cloud> |
|
|
209
|
+
| [Tools](docs/tools.md) | Every MCP tool the agent uses, and the CLI binaries they shell out to | <https://infraweaver.dev/docs/tools> |
|
|
210
|
+
| [Supported models](docs/models.md) | The model catalog and how selection works (generated) | — |
|
|
211
|
+
|
|
212
|
+
## Support
|
|
213
|
+
|
|
214
|
+
- **Getting started / usage** — this README, the [docs](https://infraweaver.dev/docs), and the [`examples/`](examples/) workflows.
|
|
215
|
+
- **Bug reports & feature requests** — open a [GitHub issue](https://github.com/infraweaver-io/infraweaver-action/issues).
|
|
216
|
+
- **Security vulnerabilities** — **don't** use a public issue; see [Security](#security) below.
|
|
217
|
+
|
|
218
|
+
## Contributing
|
|
219
|
+
|
|
220
|
+
Contributions are welcome. Infraweaver standardises on **Node 24** and **pnpm 11**:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
corepack enable
|
|
224
|
+
pnpm install --frozen-lockfile
|
|
225
|
+
pnpm typecheck
|
|
226
|
+
pnpm test
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
All contributions are accepted under the [Contributor License Agreement](CLA.md) (enforced by the CLA
|
|
230
|
+
Assistant on your first PR). There are no tagged releases — consumers reference the action at
|
|
231
|
+
`@main`, and [Conventional Commits](https://www.conventionalcommits.org) prefixes keep the history
|
|
232
|
+
readable. See
|
|
233
|
+
[`CONTRIBUTING.md`](CONTRIBUTING.md) for the full development, commit, and action-pinning conventions.
|
|
234
|
+
|
|
235
|
+
## Security
|
|
236
|
+
|
|
237
|
+
Infraweaver runs AI coding agents with write access to repositories and CI secrets, and is positioned for
|
|
238
|
+
security- and compliance-sensitive use. **Please don't open public issues for vulnerabilities** — report
|
|
239
|
+
them privately via [GitHub Security Advisories](https://github.com/infraweaver-io/infraweaver-action/security/advisories/new).
|
|
240
|
+
See [`SECURITY.md`](SECURITY.md) for scope, supported versions, and response targets.
|
|
241
|
+
|
|
242
|
+
## Licence
|
|
243
|
+
|
|
244
|
+
Infraweaver is licensed under the **GNU Affero General Public License v3.0 or later** (AGPL-3.0-or-later).
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { DispatchRecorder } from "#app/agents/dispatchMetrics";
|
|
2
|
+
import { type AgentResult, type AgentRunContext } from "#app/agents/shared";
|
|
3
|
+
import { type RunTokenQuota } from "#app/agents/tokenQuota";
|
|
4
|
+
import type { TodoTracker } from "#app/utils/todoTracking";
|
|
5
|
+
export declare const CLAUDE_EXEC_TOOL_DENY_RULES: string[];
|
|
6
|
+
export declare function writeMcpConfig(ctx: AgentRunContext): string;
|
|
7
|
+
/**
|
|
8
|
+
* Build the `--agents` JSON definition for the `loupe` subagent.
|
|
9
|
+
*
|
|
10
|
+
* The Claude Code path always runs against an Anthropic model (see
|
|
11
|
+
* resolveAgent), so we hardcode the cheaper-sibling downshift: lenses run
|
|
12
|
+
* on Sonnet, the orchestrator stays on whatever model `--model` was passed.
|
|
13
|
+
*
|
|
14
|
+
* Per-call model override is also possible (Task tool's `model` arg accepts
|
|
15
|
+
* 'sonnet' | 'opus' | 'haiku') and takes precedence over what's set here —
|
|
16
|
+
* we don't pass it; the per-subagent `model` field is the right default.
|
|
17
|
+
*
|
|
18
|
+
* The `model` is route-aware: the bare Anthropic-API id `claude-sonnet-5`
|
|
19
|
+
* is only valid on the direct API. On Bedrock (`eu.anthropic.…`) and Vertex
|
|
20
|
+
* (`@`-versioned) routes that id is rejected, and claude-code does not
|
|
21
|
+
* translate per-agent model names — so on those routes we omit `model`
|
|
22
|
+
* entirely and the lens inherits the orchestrator's (already valid) model.
|
|
23
|
+
*
|
|
24
|
+
* Kept in lockstep with the `claude-sonnet` alias in models.ts (the opencode
|
|
25
|
+
* path derives the same target via deriveSubagentModels); bump both together.
|
|
26
|
+
*
|
|
27
|
+
* The non-mutative + non-recursive contract is enforced by the prose system
|
|
28
|
+
* prompt baked into the agent — see action/agents/reviewer.ts for why we
|
|
29
|
+
* no longer wire per-agent `disallowedTools` here.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildAgentsJson(routeAware?: {
|
|
32
|
+
isBedrock: boolean;
|
|
33
|
+
isVertex: boolean;
|
|
34
|
+
}): string;
|
|
35
|
+
export declare function stripProviderPrefix(specifier: string): string;
|
|
36
|
+
type RunParams = {
|
|
37
|
+
label: string;
|
|
38
|
+
cmd: string;
|
|
39
|
+
args: string[];
|
|
40
|
+
cwd: string;
|
|
41
|
+
env: Record<string, string | undefined>;
|
|
42
|
+
todoTracker?: TodoTracker | undefined;
|
|
43
|
+
onActivityTimeout?: (() => void) | undefined;
|
|
44
|
+
onToolUse?: ((event: {
|
|
45
|
+
toolName: string;
|
|
46
|
+
input: unknown;
|
|
47
|
+
}) => void) | undefined;
|
|
48
|
+
/** per-run token ceiling (LLM10). `label` is the accumulator's source key, so
|
|
49
|
+
* a `--resume` retry is charged on top of the attempt it resumes rather than
|
|
50
|
+
* replacing it. Absent → nothing to enforce. */
|
|
51
|
+
tokenQuota?: RunTokenQuota | undefined;
|
|
52
|
+
/** specialist-routing watch (agents/dispatchMetrics.ts). Passed as the bare
|
|
53
|
+
* recorder rather than the whole `toolState` — this runner drives a
|
|
54
|
+
* subprocess and has no business reading run state it cannot act on.
|
|
55
|
+
* Optional for the same reason `tokenQuota` is: subagent and test call sites
|
|
56
|
+
* have nothing to record. */
|
|
57
|
+
dispatchMetrics?: DispatchRecorder | undefined;
|
|
58
|
+
};
|
|
59
|
+
type ClaudeRunResult = AgentResult & {
|
|
60
|
+
sessionId?: string | undefined;
|
|
61
|
+
/** set when the failure was a synthetic-stop with a retryable provider
|
|
62
|
+
* status — the session is intact and worth a `--resume` retry. */
|
|
63
|
+
retryableTransient?: boolean | undefined;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Provider statuses worth a resume-retry: rate limit (429) and upstream 5xx
|
|
67
|
+
* (500–599, which includes Anthropic's 529 "overloaded"). Deterministic
|
|
68
|
+
* failures (401 auth, 400 validation) are excluded — resuming would just
|
|
69
|
+
* replay the same error at full cost.
|
|
70
|
+
*/
|
|
71
|
+
export declare function isRetryableApiStatus(status: number | null | undefined): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Continue prompt for a `--resume` retry after a transient provider failure.
|
|
74
|
+
* The interrupted turn's tail may or may not have been applied server-side,
|
|
75
|
+
* so the prompt asks the model to re-check before repeating its last action.
|
|
76
|
+
*/
|
|
77
|
+
export declare const TRANSIENT_RESUME_PROMPT: string;
|
|
78
|
+
/**
|
|
79
|
+
* Return the tail of `text` capped at `maxCodeUnits` UTF-16 code units,
|
|
80
|
+
* dropping any partial first line. used in the exit-non-zero stdout fallback
|
|
81
|
+
* so we never surface a truncated NDJSON event to operators —
|
|
82
|
+
* `result.stdout.slice(-2048)` would otherwise cut mid-line and produce a
|
|
83
|
+
* syntactically broken JSON fragment. code units rather than bytes because
|
|
84
|
+
* `String.prototype.slice` operates on UTF-16 units; for multi-byte UTF-8
|
|
85
|
+
* content the effective byte budget can be up to 4× the nominal limit.
|
|
86
|
+
*/
|
|
87
|
+
export declare function tailLines(text: string, maxCodeUnits: number): string;
|
|
88
|
+
export declare function runClaude(params: RunParams): Promise<ClaudeRunResult>;
|
|
89
|
+
/**
|
|
90
|
+
* managed Stop hook. swaps the old `--resume <sessionId>` follow-up
|
|
91
|
+
* subprocesses (reflection + every gate retry — cost audit on PR #792
|
|
92
|
+
* showed reflection alone burned ~$0.85 / 111K cache_write per Opus run,
|
|
93
|
+
* almost all of it wasted re-running `getAttachmentMessages` in the fresh
|
|
94
|
+
* process) for a `{decision: "block", reason: ...}` injection inside the
|
|
95
|
+
* live `queryLoop`. existing session context is already in the prompt
|
|
96
|
+
* cache so only the new reason text is fresh cache_write.
|
|
97
|
+
*
|
|
98
|
+
* the script is intentionally minimal — all decision logic lives in the
|
|
99
|
+
* sidecar gate server (`gateServer.ts`), which reads live `ctx.toolState`
|
|
100
|
+
* mutations from the same process the MCP server runs in. budget +
|
|
101
|
+
* one-shot tracking lives there too, so re-fires across multiple stops in
|
|
102
|
+
* one session are safe. claude-code's 8-consecutive-block override is the
|
|
103
|
+
* last-line backstop.
|
|
104
|
+
*/
|
|
105
|
+
export declare function buildStopHookScript(): string;
|
|
106
|
+
export interface ManagedSettingsParams {
|
|
107
|
+
ctx: AgentRunContext;
|
|
108
|
+
stopHookPath: string | null;
|
|
109
|
+
pretoolGateScriptPath: string;
|
|
110
|
+
}
|
|
111
|
+
export declare function buildManagedSettings(params: ManagedSettingsParams): Record<string, unknown>;
|
|
112
|
+
export declare const claude: import("#app/agents/shared").Agent;
|
|
113
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code `PreToolUse` hook source — written into `ctx.tmpdir` at runtime
|
|
3
|
+
* and registered via a tmpdir-scoped `settings.json` referenced by
|
|
4
|
+
* `--settings <path>` (see action/agents/claude.ts).
|
|
5
|
+
*
|
|
6
|
+
* Closes the subagent → state-mutating MCP tool path that motivated the
|
|
7
|
+
* 2026-05-18 zed-industries/cloud incident (`terralens` lens called
|
|
8
|
+
* `checkout_pr` mid-review and the orchestrator's next push clobbered an
|
|
9
|
+
* unrelated branch). Pairs with the `tool.execute.before` hook in
|
|
10
|
+
* action/agents/opencodePlugin.ts; both runtimes embed the same per-run deny
|
|
11
|
+
* set, derived from each MCP tool's `mutates` flag (`subagentDeniedToolNames`
|
|
12
|
+
* in action/mcp/server.ts).
|
|
13
|
+
*
|
|
14
|
+
* PreToolUse hook contract (verified against yasasbanukaofficial/claude-code
|
|
15
|
+
* `src/utils/hooks/hooksConfigManager.ts` and `src/utils/hooks.ts`):
|
|
16
|
+
* - stdin: JSON with `hook_event_name: "PreToolUse"`, `tool_name`,
|
|
17
|
+
* `tool_input`, `tool_use_id`, `session_id`, `cwd`, `transcript_path`,
|
|
18
|
+
* and crucially `agent_id` / `agent_type` populated when the call
|
|
19
|
+
* originates from a subagent (set by the SDK when a Task/Agent
|
|
20
|
+
* dispatches a tool — see `createBaseHookInput` in claude-code source).
|
|
21
|
+
* - exit 0 → allow, no output shown
|
|
22
|
+
* - exit 2 → block tool call AND show stderr to model (this is the path
|
|
23
|
+
* we want for the deny case — the subagent gets a clear refusal it can
|
|
24
|
+
* reason about and pick a different action)
|
|
25
|
+
* - other → show stderr to user only, continue with tool call
|
|
26
|
+
*
|
|
27
|
+
* The hook itself is intentionally tiny: stdin → JSON → check `agent_id`
|
|
28
|
+
* presence + `tool_name` against the deny list → exit 0 or 2. No deps.
|
|
29
|
+
*
|
|
30
|
+
* Why the script source is a string template, not a separate `.ts` file
|
|
31
|
+
* shipped with the action: the action runs as a published npm package; at
|
|
32
|
+
* install time we don't have the source on disk in a stable place. Embedding
|
|
33
|
+
* the source into `dist/main.mjs` and writing it out per-run keeps the path
|
|
34
|
+
* inside `ctx.tmpdir` (where `--settings` can find it) and survives bundle
|
|
35
|
+
* minification.
|
|
36
|
+
*/
|
|
37
|
+
/**
|
|
38
|
+
* The pinned `@anthropic-ai/claude-code` version against which the subagent
|
|
39
|
+
* gate's `agent_id` discriminator was last verified (see the contract notes in
|
|
40
|
+
* the gate source below). The gate fails OPEN for subagents if claude-code ever
|
|
41
|
+
* stops populating `agent_id` in the PreToolUse hook payload, so a version bump
|
|
42
|
+
* must be paired with a re-verification of `createBaseHookInput`.
|
|
43
|
+
*
|
|
44
|
+
* `claudePretoolGate.test.ts` asserts this equals the version pinned in
|
|
45
|
+
* `package.json` — that test fails on any bump, forcing the re-verification
|
|
46
|
+
* before the pin and this constant are updated together.
|
|
47
|
+
*
|
|
48
|
+
* 2.1.220 verified 2026-07-28 against the schema embedded in the shipped
|
|
49
|
+
* binary: the base hook input still declares `agent_id` as
|
|
50
|
+
* `string().optional().describe("Subagent identifier. Present only when the
|
|
51
|
+
* hook fires from within a subagent (e.g., a tool called by an AgentTool
|
|
52
|
+
* worker). Absent for the main thread, even in --agent sessions. Use this
|
|
53
|
+
* field (not agent_type) to distinguish subagent calls from main-thread
|
|
54
|
+
* calls.")` — exactly the discriminator the gate relies on, byte-for-byte
|
|
55
|
+
* unchanged from the 2.1.198 verification (2026-07-10), itself unchanged from
|
|
56
|
+
* 2.1.195 (2026-07-01) and 2.1.190 (2026-06-25), which was more explicit than
|
|
57
|
+
* the 2.1.177 schema it replaced. The 2.1.220 pass additionally confirmed the
|
|
58
|
+
* field is still POPULATED and not merely declared — the minified bundle
|
|
59
|
+
* assigns `agent_id` from real identifier sources (`e.agentId`,
|
|
60
|
+
* `e.parentAgentId`, `e.data.agentId`), not a hardcoded empty value.
|
|
61
|
+
*
|
|
62
|
+
* Scope of this verification, stated honestly: it is static inspection of the
|
|
63
|
+
* shipped binary. No CI job exercises the Claude subagent gate against a live
|
|
64
|
+
* agent — `security-tests.yml` is deliberately opencode-only (free keyless
|
|
65
|
+
* model; Claude Code cannot use an `opencode/*` gateway model). So this pin,
|
|
66
|
+
* plus the tripwire test, IS the contract check. Keep both.
|
|
67
|
+
*/
|
|
68
|
+
export declare const CLAUDE_CODE_AGENT_ID_VERIFIED_VERSION: "2.1.220";
|
|
69
|
+
/**
|
|
70
|
+
* Source written to `<ctx.tmpdir>/infraweaver-pretool-gate.mjs`. Plain ESM,
|
|
71
|
+
* no TypeScript, no dependencies — node executes it directly via the
|
|
72
|
+
* `#!/usr/bin/env node` shebang and the executable bit set by the harness.
|
|
73
|
+
*
|
|
74
|
+
* `deniedTools` is the per-run deny set derived from each MCP tool's `mutates`
|
|
75
|
+
* flag (see `subagentDeniedToolNames`), embedded into the hook's `Set` literal so
|
|
76
|
+
* the gate fences exactly the mutating tools registered for this run — no
|
|
77
|
+
* hand-maintained list to drift.
|
|
78
|
+
*/
|
|
79
|
+
export declare const CLAUDE_PRETOOL_GATE_FILENAME: "infraweaver-pretool-gate.mjs";
|
|
80
|
+
/**
|
|
81
|
+
* Claude Code's native file-writing tools. The gate intercepts these to enforce
|
|
82
|
+
* `allowed_paths` / `protected_paths` at WRITE time; without them the only
|
|
83
|
+
* enforcement is the push-time diff scan, which lets a disallowed file exist in
|
|
84
|
+
* the tree for the rest of the run (see action/agents/writePolicy.ts).
|
|
85
|
+
*
|
|
86
|
+
* `MultiEdit` is included even though recent claude-code folds it into `Edit` —
|
|
87
|
+
* an extra name in the matcher is inert, a missing one is a hole.
|
|
88
|
+
*/
|
|
89
|
+
export declare const CLAUDE_WRITE_TOOL_NAMES: readonly ["Write", "Edit", "MultiEdit", "NotebookEdit"];
|
|
90
|
+
export declare function buildClaudePretoolGateSource(deniedTools: readonly string[], writePolicyAbsolutePath: string): string;
|
|
91
|
+
/**
|
|
92
|
+
* Settings JSON shape registered via `claude --settings <path>`. The
|
|
93
|
+
* matcher `^mcp__infraweaver__` is treated as a regex by claude-code's
|
|
94
|
+
* `matchesPattern` helper (anything outside `[a-zA-Z0-9_|]` triggers the
|
|
95
|
+
* regex branch — verified in src/utils/hooks.ts), so this anchors at the
|
|
96
|
+
* start of the tool name and fires for every Infraweaver MCP tool. We narrow
|
|
97
|
+
* inside the script itself rather than declaring per-tool matchers because
|
|
98
|
+
* the deny list is the source of truth.
|
|
99
|
+
*
|
|
100
|
+
* The hook process inherits the parent's PATH, so `node` resolves to the
|
|
101
|
+
* runner's node binary; the `--settings` flag accepts either a path or a
|
|
102
|
+
* literal JSON string per claude-code source `src/main.tsx` (`Path to a
|
|
103
|
+
* settings JSON file or a JSON string`), but we use a path so the script
|
|
104
|
+
* and its config sit side-by-side under `ctx.tmpdir`.
|
|
105
|
+
*
|
|
106
|
+
* `execToolDenyRules` are the native exec tools (Bash/Monitor/REPL/Workflow +
|
|
107
|
+
* their `Agent(...)` forms) to deny at a settings-source rule — the
|
|
108
|
+
* authoritative, bypass-immune layer. `--disallowedTools` alone (a `cliArg`
|
|
109
|
+
* deny) was observed to leak under `--dangerously-skip-permissions`, so the
|
|
110
|
+
* deny is carried here too. Both consumers use both returned fields: the flag
|
|
111
|
+
* `--settings` JSON (covers non-CI runs) writes the whole object, and
|
|
112
|
+
* `buildManagedSettings` (CI, /etc managed settings) spreads `hooks` and folds
|
|
113
|
+
* `permissions.deny` into its richer deny list.
|
|
114
|
+
*/
|
|
115
|
+
export declare function buildClaudePretoolGateSettings(scriptAbsolutePath: string, execToolDenyRules: string[]): {
|
|
116
|
+
hooks: {
|
|
117
|
+
PreToolUse: Array<{
|
|
118
|
+
matcher: string;
|
|
119
|
+
hooks: Array<{
|
|
120
|
+
type: "command";
|
|
121
|
+
command: string;
|
|
122
|
+
timeout?: number;
|
|
123
|
+
}>;
|
|
124
|
+
}>;
|
|
125
|
+
/** layered in by writePretoolGateAssets so non-CI runs (no managed
|
|
126
|
+
* settings) still fire the gate-server Stop hook. */
|
|
127
|
+
Stop?: Array<{
|
|
128
|
+
hooks: Array<{
|
|
129
|
+
type: "command";
|
|
130
|
+
command: string;
|
|
131
|
+
}>;
|
|
132
|
+
}>;
|
|
133
|
+
};
|
|
134
|
+
permissions: {
|
|
135
|
+
deny: string[];
|
|
136
|
+
};
|
|
137
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Specialist-dispatch instrumentation.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. Review routing moved from a **count-parity** gate ("0 or 2+
|
|
5
|
+
* lenses, never exactly 1", gated on diff size) to **hypothesis coverage**
|
|
6
|
+
* (one specialist per falsifiable, load-bearing question, no size threshold).
|
|
7
|
+
* The evaluation that adopted it named its own risk plainly: the bar to
|
|
8
|
+
* dispatch *something* drops, each specialist re-reads the diff, so cost is
|
|
9
|
+
* "plausibly neutral-to-slightly-up" — and the recommendation was to ship it
|
|
10
|
+
* "behind a close watch on dispatch-rate/cost". See `docs/AGENT-HARDENING.md`.
|
|
11
|
+
*
|
|
12
|
+
* That watch never existed. Tokens were summed for the whole run with no split
|
|
13
|
+
* between the orchestrator and the subagents it dispatched, so the one number
|
|
14
|
+
* that would settle the question — what share of a run the specialists cost —
|
|
15
|
+
* was not observable at any point. "Plausibly neutral" was an assumption with
|
|
16
|
+
* no instrument behind it.
|
|
17
|
+
*
|
|
18
|
+
* WHAT IS MEASURED, AND HOW MUCH IT CAN BE TRUSTED. Two different qualities of
|
|
19
|
+
* signal, deliberately kept apart rather than blended into one number:
|
|
20
|
+
*
|
|
21
|
+
* - **Dispatch counts are exact.** They are recorded from the actual Task
|
|
22
|
+
* tool call, one per dispatch, not inferred from the event stream.
|
|
23
|
+
* - **The token split is robust but coarse.** Tokens are attributed to
|
|
24
|
+
* "orchestrator" vs "subagents", never per-lens. Per-session labels come
|
|
25
|
+
* from `SessionLabeler`, whose own contract says its FIFO dispatch↔session
|
|
26
|
+
* pairing is for log readability and is not depended on for correctness.
|
|
27
|
+
* A mis-paired label would corrupt a *per-lens* number — but both sides of
|
|
28
|
+
* a mis-pairing are still subagents, so the orchestrator/subagent split is
|
|
29
|
+
* unaffected by exactly the weakness the labeler warns about. That is why
|
|
30
|
+
* this file reports the split and not the breakdown.
|
|
31
|
+
*
|
|
32
|
+
* Deliberately NOT a database column. A new `WorkflowRun` field needs manual
|
|
33
|
+
* production DDL, and a metric nobody looks at is not a watch. This surfaces
|
|
34
|
+
* where the comparison actually gets made — the run's own log line and job
|
|
35
|
+
* summary — so "before/after the routing change" is two runs side by side.
|
|
36
|
+
*/
|
|
37
|
+
export interface DispatchTally {
|
|
38
|
+
/** subagent dispatches this run — exact, counted at the Task call. */
|
|
39
|
+
dispatches: number;
|
|
40
|
+
/** dispatch count per resolved label, e.g. `lens:iam-blast-radius`. */
|
|
41
|
+
byLabel: ReadonlyMap<string, number>;
|
|
42
|
+
/** billable tokens (input incl. cache + output) attributed to the orchestrator. */
|
|
43
|
+
orchestratorTokens: number;
|
|
44
|
+
/** …and to every subagent session combined. */
|
|
45
|
+
subagentTokens: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Per-run accumulator. Lives on `ToolState` and is written by whichever harness
|
|
49
|
+
* is driving, so the counts survive across agent invocations (post-run resume,
|
|
50
|
+
* transient-provider retry) the same way `usageEntries` does.
|
|
51
|
+
*/
|
|
52
|
+
export declare class DispatchRecorder {
|
|
53
|
+
#private;
|
|
54
|
+
/** Record one subagent dispatch. Call at the Task tool_use, not at completion:
|
|
55
|
+
* a dispatch that errors out still cost the decision and usually the tokens. */
|
|
56
|
+
recordDispatch(label: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Attribute billable tokens to a session label. Anything that is not the
|
|
59
|
+
* orchestrator counts as subagent — including a session the labeler could not
|
|
60
|
+
* name, because an unnamed session is by definition not the orchestrator's.
|
|
61
|
+
*/
|
|
62
|
+
recordTokens(label: string, billableTokens: number): void;
|
|
63
|
+
tally(): DispatchTally;
|
|
64
|
+
}
|
|
65
|
+
/** subagent share of attributed tokens, 0–1. Null when nothing was attributed —
|
|
66
|
+
* distinct from 0, which means specialists genuinely cost nothing. */
|
|
67
|
+
export declare function subagentTokenShare(tally: DispatchTally): number | null;
|
|
68
|
+
/** One stdout line. Empty when the run dispatched nothing AND attributed nothing —
|
|
69
|
+
* a solo run has no routing to report and the line would be noise. */
|
|
70
|
+
export declare function describeDispatchTally(tally: DispatchTally): string;
|
|
71
|
+
/**
|
|
72
|
+
* Markdown block for the GitHub job summary, rendered beside the usage table.
|
|
73
|
+
* Collapsed like the usage table so it costs nothing to ignore, and carries its
|
|
74
|
+
* own accuracy caveat: a reader comparing two runs needs to know the split is
|
|
75
|
+
* coarse before they draw a conclusion from it.
|
|
76
|
+
*/
|
|
77
|
+
export declare function formatDispatchSummary(tally: DispatchTally): string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AgentRunContext } from "#app/agents/shared";
|
|
2
|
+
export interface GateServerHandle {
|
|
3
|
+
url: string;
|
|
4
|
+
token: string;
|
|
5
|
+
[Symbol.asyncDispose]: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function startGateServer(ctx: AgentRunContext): Promise<GateServerHandle>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** worktree-relative blanket WRITE deny for the entire `.git` tree, in
|
|
2
|
+
* OpenCode Wildcard dialect (`*` compiles to regex `.*`, matching `/`
|
|
3
|
+
* recursively — see packages/core/src/util/wildcard.ts). spread into the
|
|
4
|
+
* `edit` ruleset after a `"*": "allow"` baseline — `evaluate` is
|
|
5
|
+
* last-match-wins by key order, so the deny keys must follow the wildcard
|
|
6
|
+
* allow.
|
|
7
|
+
*
|
|
8
|
+
* four patterns, because the root-anchored descendants glob only matches
|
|
9
|
+
* paths under a root `.git` *directory* — it misses `.git` when it's a gitfile
|
|
10
|
+
* (worktree / submodule layouts: a regular file whose `gitdir:` line redirects
|
|
11
|
+
* git metadata) and misses nested gitfiles (a `.git` inside a subdirectory).
|
|
12
|
+
* rewriting either pointer is the same code-exec surface (`core.hooksPath`,
|
|
13
|
+
* clean/smudge filters, credential.helper) the blanket deny exists to seal, so
|
|
14
|
+
* we cover the gitfile itself and any nested `.git` too. */
|
|
15
|
+
export declare const GIT_NATIVE_WRITE_DENY_OPENCODE: Record<string, "deny">;
|
|
16
|
+
/** worktree-relative narrow READ deny (`.git/config` only), in OpenCode
|
|
17
|
+
* Wildcard dialect. spread into the `read` ruleset after the `"*": "allow"`
|
|
18
|
+
* baseline. */
|
|
19
|
+
export declare const GIT_NATIVE_READ_DENY_OPENCODE: Record<string, "deny">;
|
|
20
|
+
/** Claude `permissions.deny` entries for the blanket `.git` WRITE deny across
|
|
21
|
+
* BOTH write-capable native tools — mirrors {@link GIT_NATIVE_WRITE_DENY_OPENCODE}.
|
|
22
|
+
* Write is included so the agent can't PLANT a new hook/config file (e.g.
|
|
23
|
+
* `.git/hooks/pre-push`) that an Edit-only deny would miss. */
|
|
24
|
+
export declare const GIT_NATIVE_WRITE_DENY_CLAUDE: string[];
|
|
25
|
+
/** Claude `permissions.deny` entries for the narrow `.git/config` READ deny,
|
|
26
|
+
* one per read/enumerate tool — mirrors {@link GIT_NATIVE_READ_DENY_OPENCODE}. */
|
|
27
|
+
export declare const GIT_NATIVE_READ_DENY_CLAUDE: string[];
|
|
28
|
+
/** Claude `permissions.deny` entries protecting the harness-owned files in the
|
|
29
|
+
* per-run tmpdir (`infraweaver-*`: the PreToolUse gate script, the Stop hook
|
|
30
|
+
* script, the write-policy JSON, the flag settings). The tmpdir doubles as the
|
|
31
|
+
* agent's $HOME, so these paths are discoverable; the hook scripts are
|
|
32
|
+
* re-executed by claude-code with the full process env, which makes
|
|
33
|
+
* overwriting one arbitrary command execution outside every other deny. Both
|
|
34
|
+
* single- and double-slash forms are emitted, mirroring the secretDenyPaths
|
|
35
|
+
* pattern in buildManagedSettings. */
|
|
36
|
+
export declare function harnessTmpdirWriteDenyClaude(tmpdir: string | undefined): string[];
|
|
37
|
+
/** Claude `permissions.deny` (Edit+Write) keeping native file writes out of the
|
|
38
|
+
* out-of-workspace persistence/credential targets above. The agent runs with
|
|
39
|
+
* HOME pointed at a throwaway tmpdir, so the only way a poisoned native write
|
|
40
|
+
* reaches a file a later step trusts is an absolute path under the real runner
|
|
41
|
+
* $HOME — which these enumerate. Enumerated rather than deny-all on purpose:
|
|
42
|
+
* Claude's permission model has no allow carve-out under a broad deny (a
|
|
43
|
+
* `Edit(/**)` deny would also block the in-repo fix), and `sandbox.filesystem`
|
|
44
|
+
* governs only Bash — so "deny everything outside the repo" is not expressible
|
|
45
|
+
* for native tools. Returns [] when the runner $HOME is unknown. */
|
|
46
|
+
export declare function runnerHomeWriteDenyClaude(runnerHome: string | undefined): string[];
|