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,5 @@
|
|
|
1
|
+
// Generated by `pnpm run gen:crosswalk-digest` — do not edit by hand.
|
|
2
|
+
// Pinned sha256 of the reviewed compliance crosswalk (LLM04 integrity gate). It is
|
|
3
|
+
// verified fail-closed before any compliance verdict is produced; see crosswalk.ts.
|
|
4
|
+
// Regenerate this file whenever the crosswalk tables in crosswalk.ts change intentionally.
|
|
5
|
+
export const EXPECTED_CROSSWALK_DIGEST = "a42bd438bbc32ba302c3bc7a74238adb97560e534f5c94d908f4e81ffe7c6a05";
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { mapConcernToControls } from "#app/mcp/crosswalk";
|
|
2
|
+
import type { Concern, Severity } from "#app/mcp/terraform/types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Cyber Essentials posture, derived from the indicative crosswalk. Pure and
|
|
6
|
+
* dependency-light (crosswalk + types only) so BOTH the read-only Assess report
|
|
7
|
+
* and the Cloud report compute the identical number from the identical inputs —
|
|
8
|
+
* the score is never the model's word.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export const CE_FRAMEWORK = "Cyber Essentials";
|
|
12
|
+
|
|
13
|
+
// Points deducted from a perfect 100 per OPEN Cyber-Essentials concern, by
|
|
14
|
+
// severity. Tuned so a handful of mediums stays in the 80s while a single
|
|
15
|
+
// critical reads unambiguously as "action required" (the dashboard's red band).
|
|
16
|
+
const CE_SEVERITY_PENALTY: Record<Severity, number> = {
|
|
17
|
+
critical: 25,
|
|
18
|
+
high: 12,
|
|
19
|
+
medium: 5,
|
|
20
|
+
low: 2,
|
|
21
|
+
info: 0,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** The Cyber Essentials control labels a concern touches (via the indicative
|
|
25
|
+
* crosswalk), or `[]` when it maps to none — what the finding-detail "Maps to
|
|
26
|
+
* Cyber Essentials" panel renders. */
|
|
27
|
+
export function cyberEssentialsControls(concern: Concern): string[] {
|
|
28
|
+
return mapConcernToControls(concern)
|
|
29
|
+
.controls.filter((c) => c.framework === CE_FRAMEWORK)
|
|
30
|
+
.map((c) => c.control);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The repo's Cyber Essentials posture as a deterministic 0–100 score — what the
|
|
35
|
+
* dashboard's "CE SCORE" shows. Honest by construction: only OPEN (non-suppressed)
|
|
36
|
+
* concerns that map to a Cyber Essentials control deduct from a perfect 100, so a
|
|
37
|
+
* suppressed/accepted finding or one that doesn't touch a CE control never moves
|
|
38
|
+
* the score, and a clean repo scores 100. Pure.
|
|
39
|
+
*/
|
|
40
|
+
export function cyberEssentialsScore(concerns: Concern[]): number {
|
|
41
|
+
let penalty = 0;
|
|
42
|
+
for (const c of concerns) {
|
|
43
|
+
if (c.suppression) continue;
|
|
44
|
+
if (cyberEssentialsControls(c).length === 0) continue;
|
|
45
|
+
penalty += CE_SEVERITY_PENALTY[c.severity];
|
|
46
|
+
}
|
|
47
|
+
return Math.max(0, Math.round(100 - penalty));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** The distinct Cyber Essentials controls left at risk by the OPEN concern set —
|
|
51
|
+
* the "N control(s) at risk" the assessment headline names. Sorted for a stable
|
|
52
|
+
* report; empty when nothing open maps to a CE control. */
|
|
53
|
+
export function cyberEssentialsControlsAtRisk(concerns: Concern[]): string[] {
|
|
54
|
+
const atRisk = new Set<string>();
|
|
55
|
+
for (const c of concerns) {
|
|
56
|
+
if (c.suppression) continue;
|
|
57
|
+
for (const control of cyberEssentialsControls(c)) atRisk.add(control);
|
|
58
|
+
}
|
|
59
|
+
return [...atRisk].sort();
|
|
60
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { type } from "arktype";
|
|
2
|
+
import { COMMENT_COMMAND, PRODUCT_NAME } from "#app/brand";
|
|
3
|
+
import { dashboardStrings } from "#app/i18n/scaffolding";
|
|
4
|
+
import type { GitHubToolContext } from "#app/mcp/capabilityContext";
|
|
5
|
+
import { recordCreatedTarget } from "#app/mcp/scope";
|
|
6
|
+
import { execute, tool } from "#app/mcp/shared";
|
|
7
|
+
import { log } from "#app/utils/cli";
|
|
8
|
+
import { fixDoubleEscapedString } from "#app/utils/fixDoubleEscapedString";
|
|
9
|
+
import type { UserFacingLanguage } from "#app/utils/payload";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The per-repo "Remediation Dashboard" issue (Renovate's single pinned
|
|
13
|
+
* Dependency Dashboard, mapped to Infraweaver). ONE issue per repo gives the
|
|
14
|
+
* maintainer a stable, at-a-glance view of the Terraform remediation state:
|
|
15
|
+
* which remediation PRs are open, which concern-groups are waiting (held back by
|
|
16
|
+
* the per-run/concurrency caps), and which findings are suppressed. A waiting
|
|
17
|
+
* group is opened on demand from the dashboard's Remediate button or a
|
|
18
|
+
* `@infraweaver fix …` comment — the surfaces that actually dispatch a run.
|
|
19
|
+
*
|
|
20
|
+
* This file is the engine seam: a pure body renderer (`buildDashboardBody`) and
|
|
21
|
+
* an upsert tool that finds-or-creates the single issue. Each waiting row carries
|
|
22
|
+
* a hidden `<!-- group:ID -->` anchor reserved for a future tick-to-request
|
|
23
|
+
* consumer (a Renovate-style checkbox read back on the next run); that consumer
|
|
24
|
+
* is not yet wired, so the body renders a plain list rather than a checkbox that
|
|
25
|
+
* would silently do nothing. In keeping with the product's hard rule, the
|
|
26
|
+
* dashboard never merges or deploys anything.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/** trailing marker that identifies the dashboard issue when we search for it. */
|
|
30
|
+
export const DASHBOARD_MARKER = "<!-- infraweaver:remediation-dashboard -->";
|
|
31
|
+
/** label applied to the dashboard issue (the primary find key + a pin target). */
|
|
32
|
+
export const DASHBOARD_LABEL = "infraweaver-dashboard";
|
|
33
|
+
export const DASHBOARD_TITLE = `${PRODUCT_NAME} — Remediation Dashboard`;
|
|
34
|
+
|
|
35
|
+
export interface DashboardOpenPr {
|
|
36
|
+
number: number;
|
|
37
|
+
title: string;
|
|
38
|
+
url: string;
|
|
39
|
+
group_id?: string;
|
|
40
|
+
zombie?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface DashboardPending {
|
|
43
|
+
title: string;
|
|
44
|
+
severity?: string;
|
|
45
|
+
files?: string;
|
|
46
|
+
group_id?: string;
|
|
47
|
+
reason?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface DashboardSuppressed {
|
|
50
|
+
title: string;
|
|
51
|
+
reason?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface DashboardData {
|
|
54
|
+
open_prs: DashboardOpenPr[];
|
|
55
|
+
pending: DashboardPending[];
|
|
56
|
+
suppressed?: DashboardSuppressed[];
|
|
57
|
+
note?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Render the dashboard issue body (pure — no I/O). The trailing {@link
|
|
62
|
+
* DASHBOARD_MARKER} lets the upsert recognise the issue on the next run. The
|
|
63
|
+
* fixed section headers/notes are localized by the run's `language` (default
|
|
64
|
+
* English); the data rows (PR titles, counts, group markers) are unchanged.
|
|
65
|
+
*/
|
|
66
|
+
export function buildDashboardBody(
|
|
67
|
+
data: DashboardData,
|
|
68
|
+
language: UserFacingLanguage = "en",
|
|
69
|
+
): string {
|
|
70
|
+
const t = dashboardStrings(language);
|
|
71
|
+
const lines: string[] = [];
|
|
72
|
+
lines.push(t.maintainedBy);
|
|
73
|
+
lines.push("");
|
|
74
|
+
|
|
75
|
+
lines.push(`## ${t.openPrs} (${data.open_prs.length})`);
|
|
76
|
+
if (data.open_prs.length === 0) {
|
|
77
|
+
lines.push(t.noneOpen);
|
|
78
|
+
} else {
|
|
79
|
+
for (const pr of data.open_prs) {
|
|
80
|
+
lines.push(
|
|
81
|
+
`- [#${pr.number}](${pr.url}) — ${pr.title}${pr.zombie ? " · ⚠️ stale" : ""}`,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
lines.push("");
|
|
86
|
+
|
|
87
|
+
lines.push(`## ${t.waiting} (${data.pending.length})`);
|
|
88
|
+
if (data.pending.length === 0) {
|
|
89
|
+
lines.push(t.nothingWaiting);
|
|
90
|
+
} else {
|
|
91
|
+
lines.push(t.openOnDemand);
|
|
92
|
+
for (const p of data.pending) {
|
|
93
|
+
const sev = p.severity ? ` \`${p.severity}\`` : "";
|
|
94
|
+
const files = p.files ? ` — ${p.files}` : "";
|
|
95
|
+
const reason = p.reason ? ` _(${p.reason})_` : "";
|
|
96
|
+
const marker = p.group_id ? ` <!-- group:${p.group_id} -->` : "";
|
|
97
|
+
lines.push(`- **${p.title}**${sev}${files}${reason}${marker}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
lines.push("");
|
|
101
|
+
|
|
102
|
+
const suppressed = data.suppressed ?? [];
|
|
103
|
+
if (suppressed.length > 0) {
|
|
104
|
+
lines.push(`## ${t.suppressed} (${suppressed.length})`);
|
|
105
|
+
for (const s of suppressed) {
|
|
106
|
+
lines.push(`- ${s.title}${s.reason ? ` — _${s.reason}_` : ""}`);
|
|
107
|
+
}
|
|
108
|
+
lines.push("");
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (data.note) {
|
|
112
|
+
lines.push(data.note);
|
|
113
|
+
lines.push("");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
lines.push(DASHBOARD_MARKER);
|
|
117
|
+
return lines.join("\n");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export const RemediationDashboardParams = type({
|
|
121
|
+
open_prs: type({
|
|
122
|
+
number: type.number,
|
|
123
|
+
title: type.string,
|
|
124
|
+
url: type.string,
|
|
125
|
+
"group_id?": type.string,
|
|
126
|
+
"zombie?": type.boolean,
|
|
127
|
+
})
|
|
128
|
+
.array()
|
|
129
|
+
.describe(
|
|
130
|
+
"the currently-open remediation PRs (pass `pull_requests` from list_remediation_prs).",
|
|
131
|
+
),
|
|
132
|
+
pending: type({
|
|
133
|
+
title: type.string,
|
|
134
|
+
"severity?": type.string,
|
|
135
|
+
"files?": type.string,
|
|
136
|
+
"group_id?": type.string,
|
|
137
|
+
"reason?": type.string,
|
|
138
|
+
})
|
|
139
|
+
.array()
|
|
140
|
+
.describe(
|
|
141
|
+
"concern groups not yet opened as PRs — e.g. held back by max_prs/pr_concurrent_limit, or awaiting an on-demand request. Pass the scan groups you did NOT open this run.",
|
|
142
|
+
),
|
|
143
|
+
suppressed: type({ title: type.string, "reason?": type.string })
|
|
144
|
+
.array()
|
|
145
|
+
.describe("findings suppressed via inline skips / ignore rules (optional).")
|
|
146
|
+
.optional(),
|
|
147
|
+
"note?": type.string.describe(
|
|
148
|
+
"an optional free-text note appended to the dashboard.",
|
|
149
|
+
),
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Create or update the single per-repo Remediation Dashboard issue. Idempotent:
|
|
154
|
+
* finds the existing issue by the {@link DASHBOARD_LABEL} + marker and updates
|
|
155
|
+
* its body, else creates it. Bound by the same `push: disabled` read-only gate as
|
|
156
|
+
* the other issue/PR writes.
|
|
157
|
+
*/
|
|
158
|
+
export function UpsertRemediationDashboardTool(ctx: GitHubToolContext) {
|
|
159
|
+
return tool({
|
|
160
|
+
name: "upsert_remediation_dashboard",
|
|
161
|
+
description:
|
|
162
|
+
`Create or update the repo's single ${PRODUCT_NAME} Remediation Dashboard issue: a stable, pinned ` +
|
|
163
|
+
"summary of open remediation PRs, the concern groups waiting to be opened (each requestable on demand " +
|
|
164
|
+
`via the Remediate button or a \`${COMMENT_COMMAND} fix\` comment), and suppressed findings. Idempotent — it ` +
|
|
165
|
+
"reuses the existing dashboard issue (found by " +
|
|
166
|
+
`the \`${DASHBOARD_LABEL}\` label) instead of filing a new one each run. Call it at the END of a ` +
|
|
167
|
+
"Remediate/RefreshRemediation run with the current state. Blocked under `push: disabled`. Never merges.",
|
|
168
|
+
parameters: RemediationDashboardParams,
|
|
169
|
+
execute: execute(async (data) => {
|
|
170
|
+
if (ctx.payload.push === "disabled") {
|
|
171
|
+
throw new Error(
|
|
172
|
+
"Updating the remediation dashboard is disabled. This repository is configured for read-only access (push: disabled).",
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
const owner = ctx.repo.owner;
|
|
176
|
+
const repo = ctx.repo.name;
|
|
177
|
+
const body = fixDoubleEscapedString(
|
|
178
|
+
buildDashboardBody(data as DashboardData, ctx.payload.language),
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
// Find the existing dashboard: a single OPEN issue carrying our label. The
|
|
182
|
+
// listForRepo result includes PRs too (a PR is an issue), so exclude those
|
|
183
|
+
// and require the marker — belt and braces against a label collision.
|
|
184
|
+
const candidates = await ctx.octokit.paginate(
|
|
185
|
+
ctx.octokit.rest.issues.listForRepo,
|
|
186
|
+
{
|
|
187
|
+
owner,
|
|
188
|
+
repo,
|
|
189
|
+
state: "open",
|
|
190
|
+
labels: DASHBOARD_LABEL,
|
|
191
|
+
per_page: 100,
|
|
192
|
+
},
|
|
193
|
+
);
|
|
194
|
+
const existing = candidates.find(
|
|
195
|
+
(i) => !i.pull_request && (i.body ?? "").includes(DASHBOARD_MARKER),
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
if (existing) {
|
|
199
|
+
const updated = await ctx.octokit.rest.issues.update({
|
|
200
|
+
owner,
|
|
201
|
+
repo,
|
|
202
|
+
issue_number: existing.number,
|
|
203
|
+
body,
|
|
204
|
+
});
|
|
205
|
+
recordCreatedTarget(ctx, existing.number);
|
|
206
|
+
log.info(`» updated remediation dashboard issue #${existing.number}`);
|
|
207
|
+
return {
|
|
208
|
+
success: true,
|
|
209
|
+
action: "updated" as const,
|
|
210
|
+
number: existing.number,
|
|
211
|
+
url: updated.data.html_url,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const created = await ctx.octokit.rest.issues.create({
|
|
216
|
+
owner,
|
|
217
|
+
repo,
|
|
218
|
+
title: DASHBOARD_TITLE,
|
|
219
|
+
body,
|
|
220
|
+
labels: [DASHBOARD_LABEL],
|
|
221
|
+
});
|
|
222
|
+
recordCreatedTarget(ctx, created.data.number);
|
|
223
|
+
log.info(`» created remediation dashboard issue #${created.data.number}`);
|
|
224
|
+
return {
|
|
225
|
+
success: true,
|
|
226
|
+
action: "created" as const,
|
|
227
|
+
number: created.data.number,
|
|
228
|
+
url: created.data.html_url,
|
|
229
|
+
};
|
|
230
|
+
}),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { type } from "arktype";
|
|
2
|
+
import type { ToolContext } from "#app/mcp/server";
|
|
3
|
+
import { execute, tool } from "#app/mcp/shared";
|
|
4
|
+
import type { PrepOptions, PrepResult } from "#app/prep/index";
|
|
5
|
+
import { runPrepPhase } from "#app/prep/index";
|
|
6
|
+
import { packageManagerBinDir } from "#app/utils/packageManager";
|
|
7
|
+
|
|
8
|
+
// empty schema for tools with no parameters
|
|
9
|
+
const EmptyParams = type({});
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* format prep results into agent-friendly message
|
|
13
|
+
*/
|
|
14
|
+
function formatPrepResults(results: PrepResult[]): string {
|
|
15
|
+
if (results.length === 0) {
|
|
16
|
+
return `No supported language detected in this repository (checked for package.json, requirements.txt, pyproject.toml, etc.).
|
|
17
|
+
|
|
18
|
+
Inspect the repository structure to determine how dependencies should be installed, then use shell to install them.`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const lines: string[] = [];
|
|
22
|
+
|
|
23
|
+
for (const result of results) {
|
|
24
|
+
if (result.language === "unknown") {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const langDisplay = result.language === "node" ? "Node.js" : "Python";
|
|
29
|
+
|
|
30
|
+
if (result.dependenciesInstalled) {
|
|
31
|
+
if (result.language === "node") {
|
|
32
|
+
lines.push(
|
|
33
|
+
`${langDisplay} dependencies installed successfully via ${result.packageManager}.`,
|
|
34
|
+
);
|
|
35
|
+
} else if (result.language === "python") {
|
|
36
|
+
lines.push(
|
|
37
|
+
`${langDisplay} dependencies installed successfully via ${result.packageManager} (from ${result.configFile}).`,
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
const errorMsg = result.issues.length > 0 ? result.issues.join("\n") : "unknown error";
|
|
42
|
+
|
|
43
|
+
if (result.language === "node") {
|
|
44
|
+
lines.push(`${langDisplay} dependency installation failed via ${result.packageManager}.
|
|
45
|
+
|
|
46
|
+
Error:
|
|
47
|
+
${errorMsg}
|
|
48
|
+
|
|
49
|
+
Use shell or other tools at your disposal to diagnose and resolve the issue, then install dependencies manually.`);
|
|
50
|
+
} else if (result.language === "python") {
|
|
51
|
+
lines.push(`${langDisplay} dependency installation failed via ${result.packageManager} (from ${result.configFile}).
|
|
52
|
+
|
|
53
|
+
Error:
|
|
54
|
+
${errorMsg}
|
|
55
|
+
|
|
56
|
+
Use shell or other tools at your disposal to diagnose and resolve the issue, then install dependencies manually.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (lines.length === 0) {
|
|
62
|
+
return `No supported language detected in this repository (checked for package.json, requirements.txt, pyproject.toml, etc.).
|
|
63
|
+
|
|
64
|
+
Inspect the repository structure to determine how dependencies should be installed, then use shell to install them.`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return lines.join("\n\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* start dependency installation in the background (non-blocking, idempotent).
|
|
72
|
+
* called eagerly from main.ts at startup and also available via MCP tools.
|
|
73
|
+
*/
|
|
74
|
+
export function startInstallation(ctx: ToolContext): void {
|
|
75
|
+
// already started or completed - do nothing
|
|
76
|
+
if (ctx.toolState.dependencyInstallation) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// SECURITY: when shell is disabled, suppress lifecycle scripts to prevent
|
|
81
|
+
// agents from using package.json scripts as a backdoor for code execution
|
|
82
|
+
const prepOptions: PrepOptions = {
|
|
83
|
+
ignoreScripts: ctx.payload.shell === "disabled",
|
|
84
|
+
binDir: packageManagerBinDir(ctx.tmpdir),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// initialize state and start installation
|
|
88
|
+
const promise = runPrepPhase(prepOptions);
|
|
89
|
+
ctx.toolState.dependencyInstallation = {
|
|
90
|
+
status: "in_progress",
|
|
91
|
+
promise,
|
|
92
|
+
results: undefined,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// when promise completes, update state
|
|
96
|
+
promise.then(
|
|
97
|
+
(results) => {
|
|
98
|
+
if (ctx.toolState.dependencyInstallation) {
|
|
99
|
+
const hasFailure = results.some((r) => !r.dependenciesInstalled && r.issues.length > 0);
|
|
100
|
+
ctx.toolState.dependencyInstallation.status = hasFailure ? "failed" : "completed";
|
|
101
|
+
ctx.toolState.dependencyInstallation.results = results;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
() => {
|
|
105
|
+
if (ctx.toolState.dependencyInstallation) {
|
|
106
|
+
ctx.toolState.dependencyInstallation.status = "failed";
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function StartDependencyInstallationTool(ctx: ToolContext) {
|
|
113
|
+
return tool({
|
|
114
|
+
mutates: true,
|
|
115
|
+
name: "start_dependency_installation",
|
|
116
|
+
description:
|
|
117
|
+
"Start installing project dependencies in the background. This is non-blocking and returns immediately. Call this early (right after branch checkout) if you anticipate needing to run tests, builds, or other commands that require dependencies. Idempotent - safe to call multiple times.",
|
|
118
|
+
parameters: EmptyParams,
|
|
119
|
+
execute: execute(async () => {
|
|
120
|
+
const state = ctx.toolState.dependencyInstallation;
|
|
121
|
+
|
|
122
|
+
// already completed
|
|
123
|
+
if (state?.status === "completed" || state?.status === "failed") {
|
|
124
|
+
return {
|
|
125
|
+
status: state.status,
|
|
126
|
+
message: `Dependency installation already completed.`,
|
|
127
|
+
summary: formatPrepResults(state.results || []),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// already in progress
|
|
132
|
+
if (state?.status === "in_progress") {
|
|
133
|
+
return {
|
|
134
|
+
status: "in_progress",
|
|
135
|
+
message:
|
|
136
|
+
"Dependency installation is already in progress. Call await_dependency_installation when you need to use them.",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// start installation
|
|
141
|
+
startInstallation(ctx);
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
status: "started",
|
|
145
|
+
message:
|
|
146
|
+
"Dependency installation started in background. Continue with other tasks and call await_dependency_installation when you need to run tests, builds, or other commands that require dependencies.",
|
|
147
|
+
};
|
|
148
|
+
}),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function AwaitDependencyInstallationTool(ctx: ToolContext) {
|
|
153
|
+
return tool({
|
|
154
|
+
name: "await_dependency_installation",
|
|
155
|
+
description:
|
|
156
|
+
"Wait for dependency installation to complete and get the results. If installation hasn't been started yet, this will start it automatically. Call this before running tests, builds, or other commands that require dependencies.",
|
|
157
|
+
parameters: EmptyParams,
|
|
158
|
+
execute: execute(async () => {
|
|
159
|
+
// auto-start if not started
|
|
160
|
+
if (!ctx.toolState.dependencyInstallation) {
|
|
161
|
+
startInstallation(ctx);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const state = ctx.toolState.dependencyInstallation;
|
|
165
|
+
if (!state) {
|
|
166
|
+
throw new Error("failed to initialize dependency installation state");
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// if already completed, return cached results
|
|
170
|
+
if (state.status === "completed" || state.status === "failed") {
|
|
171
|
+
return {
|
|
172
|
+
status: state.status,
|
|
173
|
+
message: formatPrepResults(state.results || []),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// await the promise
|
|
178
|
+
if (!state.promise) {
|
|
179
|
+
throw new Error("dependency installation state is corrupted - no promise found");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const results = await state.promise;
|
|
183
|
+
|
|
184
|
+
return {
|
|
185
|
+
status: state.status,
|
|
186
|
+
message: formatPrepResults(results),
|
|
187
|
+
};
|
|
188
|
+
}),
|
|
189
|
+
});
|
|
190
|
+
}
|