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,80 @@
|
|
|
1
|
+
import type { AgentId } from "#app/external";
|
|
2
|
+
import type { ToolState } from "#app/toolState";
|
|
3
|
+
import type { OctokitWithPlugins } from "#app/utils/github";
|
|
4
|
+
import type { ResolvedPayload } from "#app/utils/payload";
|
|
5
|
+
import type { RunContextData } from "#app/utils/runContextData";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Capability contexts: the narrow, per-family subsets of the 28-field
|
|
9
|
+
* `ToolContext` (see `mcp/server.ts`). Each interface is a structural subset, so
|
|
10
|
+
* the full `ToolContext` is assignable to it — the server wires every tool with
|
|
11
|
+
* one `ToolContext` and each factory sees only the capability it declares.
|
|
12
|
+
*
|
|
13
|
+
* The point is the TEST SURFACE. A git tool typed `GitToolContext` is unit-tested
|
|
14
|
+
* by constructing seven real fields with real types — not a 28-field object cast
|
|
15
|
+
* `as unknown as ToolContext`, whose cast hides whichever field the tool actually
|
|
16
|
+
* reaches for. `LocalToolContext` (see `mcp/localContext.ts`) is the cwd-scoped
|
|
17
|
+
* member of this same family; these three add the GitHub / git / cloud surfaces.
|
|
18
|
+
*
|
|
19
|
+
* `payload` and `toolState` stay their full shared types — they are legitimately
|
|
20
|
+
* broad state carriers every family reads, and narrowing them buys nothing for
|
|
21
|
+
* the test surface (a fixture builds them either way). What each interface drops
|
|
22
|
+
* is the top-level capability fields a family never touches: a cloud tool needn't
|
|
23
|
+
* fabricate an `octokit`, a git tool needn't fabricate an `apiToken`.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* GitHub REST/GraphQL capability: the authenticated `octokit` client, the repo
|
|
28
|
+
* coordinates it addresses, the installation token (raw-asset fetch), and the
|
|
29
|
+
* review-surface fields (`agentId` for tool-ref rendering, `prApproveEnabled`).
|
|
30
|
+
* The home of the ~15 issue/PR/review/comment/label tools.
|
|
31
|
+
*/
|
|
32
|
+
export interface GitHubToolContext {
|
|
33
|
+
octokit: OctokitWithPlugins;
|
|
34
|
+
githubInstallationToken: string;
|
|
35
|
+
repo: RunContextData["repo"];
|
|
36
|
+
payload: ResolvedPayload;
|
|
37
|
+
toolState: ToolState;
|
|
38
|
+
tmpdir: string;
|
|
39
|
+
agentId: AgentId;
|
|
40
|
+
prApproveEnabled: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Git capability: the token pushes authenticate with, the single-flight re-minter
|
|
45
|
+
* (`refreshGitToken`), the prepush lifecycle hook, and the repo/payload/state the
|
|
46
|
+
* push guardrails read. No `octokit` — the git tools shell out, they don't call
|
|
47
|
+
* the API.
|
|
48
|
+
*/
|
|
49
|
+
export interface GitToolContext {
|
|
50
|
+
gitToken: string;
|
|
51
|
+
// single-flight git-token re-minter, or undefined when re-minting isn't
|
|
52
|
+
// possible (off-CI / external GH_TOKEN). Mirrors `ToolContext.refreshGitToken`.
|
|
53
|
+
refreshGitToken?: ((stale: string) => Promise<string>) | undefined;
|
|
54
|
+
prepushScript: string | null;
|
|
55
|
+
repo: RunContextData["repo"];
|
|
56
|
+
payload: ResolvedPayload;
|
|
57
|
+
toolState: ToolState;
|
|
58
|
+
// needed only so the git tools can hand this context to the push guardrails,
|
|
59
|
+
// which spill a gitleaks report under tmpdir (see `mcp/guardrails.ts`).
|
|
60
|
+
tmpdir: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Cloud capability: the identity a tool presents to Infraweaver Cloud — the run's
|
|
65
|
+
* `api_token` (a `tmnd_`/`tmpx_` bearer) and its `runId`. Consumed by the upload
|
|
66
|
+
* tool and by `patchWorkflowRunFields`. See `utils/cloudClient.ts` (E3).
|
|
67
|
+
*/
|
|
68
|
+
export interface CloudToolContext {
|
|
69
|
+
apiToken: string;
|
|
70
|
+
runId: number | undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The write tools that create a GitHub artifact AND report its node-id back to
|
|
75
|
+
* Cloud via `patchWorkflowRunFields` (create_pull_request, create_issue,
|
|
76
|
+
* create_review, the plan-comment writers) genuinely span two capabilities: the
|
|
77
|
+
* GitHub surface plus the cloud identity. Naming the intersection keeps their
|
|
78
|
+
* signatures honest about both.
|
|
79
|
+
*/
|
|
80
|
+
export type GitHubWriteToolContext = GitHubToolContext & CloudToolContext;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { type } from "arktype";
|
|
2
|
+
import type { BaseBranchContext } from "#app/mcp/pr";
|
|
3
|
+
import { resolveBaseBranch } from "#app/mcp/pr";
|
|
4
|
+
import { execute, tool, toolOk } from "#app/mcp/shared";
|
|
5
|
+
import { skipResult } from "#app/mcp/terraform/types";
|
|
6
|
+
import { log } from "#app/utils/cli";
|
|
7
|
+
import { $ } from "#app/utils/shell";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* AI PR summaries — the deterministic Terraform-change anchor. A PR summary
|
|
11
|
+
* written purely by the model drifts (miscounts resources, invents changes). This
|
|
12
|
+
* parses the PR's unified diff for Terraform BLOCK changes (which resource /
|
|
13
|
+
* module / data / variable / output addresses were added or removed, which files
|
|
14
|
+
* were touched) so the human-readable summary is anchored to facts, not prose.
|
|
15
|
+
*
|
|
16
|
+
* Pure parser (`summarizeTerraformResourceDiff`) + a tool that runs the
|
|
17
|
+
* merge-base diff and feeds it in. Block ADDED/REMOVED is precise (a block header
|
|
18
|
+
* on a +/- line); in-place edits to an existing block surface as a touched FILE
|
|
19
|
+
* (attributing a sub-block edit to a specific address needs full-file parsing —
|
|
20
|
+
* we stay honest and report the file rather than guess).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export interface TerraformChangeSummary {
|
|
24
|
+
/** addresses of blocks added in this diff (e.g. `aws_s3_bucket.logs`, `module.vpc`). */
|
|
25
|
+
added: string[];
|
|
26
|
+
/** addresses of blocks removed in this diff. */
|
|
27
|
+
removed: string[];
|
|
28
|
+
/** Terraform files touched (a superset signal — includes in-place edits). */
|
|
29
|
+
files: string[];
|
|
30
|
+
counts: { added: number; removed: number; files: number };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const isTfFile = (file: string): boolean => /\.tf$|\.tfvars$/.test(file);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parse a Terraform block header into its address, or null when the line is not a
|
|
37
|
+
* top-level block header. Handles two-label blocks (`resource`/`data`) and
|
|
38
|
+
* single-label blocks (`module`/`variable`/`output`/`provider`). The line is the
|
|
39
|
+
* raw HCL (diff +/- prefix already stripped). Pure.
|
|
40
|
+
*/
|
|
41
|
+
export function parseBlockAddress(line: string): string | null {
|
|
42
|
+
const s = line.trim();
|
|
43
|
+
const two = s.match(/^(resource|data)\s+"([^"]+)"\s+"([^"]+)"\s*\{/);
|
|
44
|
+
if (two) {
|
|
45
|
+
const [, kind, t, name] = two;
|
|
46
|
+
return kind === "data" ? `data.${t}.${name}` : `${t}.${name}`;
|
|
47
|
+
}
|
|
48
|
+
const one = s.match(/^(module|variable|output|provider)\s+"([^"]+)"\s*\{/);
|
|
49
|
+
if (one) {
|
|
50
|
+
const [, kind, name] = one;
|
|
51
|
+
const prefix = kind === "variable" ? "var" : kind;
|
|
52
|
+
return `${prefix}.${name}`;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Summarise a unified `git diff` into added/removed Terraform block addresses +
|
|
59
|
+
* the touched Terraform files. Tracks the current file from `+++ b/<path>`
|
|
60
|
+
* headers and only considers `.tf`/`.tfvars` files. Pure; deterministic ordering
|
|
61
|
+
* (sorted, de-duplicated). A block counted as both added and removed (moved) is
|
|
62
|
+
* left in both lists — the prose can describe the move.
|
|
63
|
+
*/
|
|
64
|
+
export function summarizeTerraformResourceDiff(diff: string): TerraformChangeSummary {
|
|
65
|
+
const added = new Set<string>();
|
|
66
|
+
const removed = new Set<string>();
|
|
67
|
+
const files = new Set<string>();
|
|
68
|
+
let file = "";
|
|
69
|
+
let inTf = false;
|
|
70
|
+
for (const raw of diff.split("\n")) {
|
|
71
|
+
if (raw.startsWith("+++ ")) {
|
|
72
|
+
const path = raw.slice(4).trim().replace(/^b\//, "");
|
|
73
|
+
file = path === "/dev/null" ? "" : path;
|
|
74
|
+
inTf = !!file && isTfFile(file);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (raw.startsWith("--- ") || raw.startsWith("diff --git") || raw.startsWith("@@")) continue;
|
|
78
|
+
if (!inTf) continue;
|
|
79
|
+
if (raw.startsWith("+") || raw.startsWith("-")) {
|
|
80
|
+
files.add(file);
|
|
81
|
+
const addr = parseBlockAddress(raw.slice(1));
|
|
82
|
+
if (addr) (raw.startsWith("+") ? added : removed).add(addr);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const sort = (s: Set<string>): string[] => [...s].sort();
|
|
86
|
+
return {
|
|
87
|
+
added: sort(added),
|
|
88
|
+
removed: sort(removed),
|
|
89
|
+
files: sort(files),
|
|
90
|
+
counts: { added: added.size, removed: removed.size, files: files.size },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export const TerraformChangeSummaryParams = type({
|
|
95
|
+
"base?": type.string.describe(
|
|
96
|
+
"base branch to diff against (default: the run's resolved base branch — main/master or the base_branch input).",
|
|
97
|
+
),
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
export function TerraformChangeSummaryTool(ctx: BaseBranchContext) {
|
|
101
|
+
return tool({
|
|
102
|
+
name: "terraform_change_summary",
|
|
103
|
+
description:
|
|
104
|
+
"A DETERMINISTIC anchor for a PR summary: the Terraform `resource`/`module`/`data`/`variable`/" +
|
|
105
|
+
"`output` addresses ADDED and REMOVED on this branch vs its base, plus the Terraform files touched. " +
|
|
106
|
+
"Runs a merge-base `git diff` of `*.tf`/`*.tfvars` and parses the block headers, so the human-readable " +
|
|
107
|
+
"summary you write is grounded in real counts instead of guessed ones. Degrades green (returns " +
|
|
108
|
+
"`ok: false`) when git can't resolve the base (fetch it first) or nothing Terraform changed — then " +
|
|
109
|
+
"summarise from the diff yourself. In-place edits to an existing block surface as a touched `file` " +
|
|
110
|
+
"(not an added/removed address). Use it in SummarizePr (or any PR summary) before writing the prose.",
|
|
111
|
+
parameters: TerraformChangeSummaryParams,
|
|
112
|
+
execute: execute(async ({ base }) => {
|
|
113
|
+
const baseBranch = base ?? resolveBaseBranch(ctx);
|
|
114
|
+
const pathspec = ["--", "*.tf", "*.tfvars"];
|
|
115
|
+
let diff: string | null = null;
|
|
116
|
+
// prefer the remote-tracking base (origin/<base>), fall back to a local ref.
|
|
117
|
+
for (const ref of [`origin/${baseBranch}`, baseBranch]) {
|
|
118
|
+
try {
|
|
119
|
+
diff = $("git", ["diff", "--merge-base", ref, ...pathspec], { log: false });
|
|
120
|
+
break;
|
|
121
|
+
} catch {
|
|
122
|
+
diff = null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (diff === null) {
|
|
126
|
+
return skipResult(
|
|
127
|
+
"base_unresolved",
|
|
128
|
+
`could not diff against '${baseBranch}' (fetch the base first, e.g. git_fetch({ ref: "${baseBranch}" })) — summarise from the diff yourself`,
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
const summary = summarizeTerraformResourceDiff(diff);
|
|
132
|
+
if (summary.counts.files === 0) {
|
|
133
|
+
return skipResult(
|
|
134
|
+
"no_terraform_changes",
|
|
135
|
+
"no Terraform files changed vs the base — this PR's summary is not Terraform-specific; summarise from the diff yourself",
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
log.info(
|
|
139
|
+
`» terraform_change_summary: +${summary.counts.added} -${summary.counts.removed} block(s) ` +
|
|
140
|
+
`across ${summary.counts.files} file(s) vs ${baseBranch}`,
|
|
141
|
+
);
|
|
142
|
+
return toolOk({ base: baseBranch, ...summary });
|
|
143
|
+
}),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { type } from "arktype";
|
|
4
|
+
import type { GitHubToolContext } from "#app/mcp/capabilityContext";
|
|
5
|
+
import { execute, tool } from "#app/mcp/shared";
|
|
6
|
+
import { fenceUntrusted } from "#app/mcp/untrustedContent";
|
|
7
|
+
import { getTempDir } from "#app/utils/env";
|
|
8
|
+
import { log } from "#app/utils/log";
|
|
9
|
+
|
|
10
|
+
export const GetCheckSuiteLogs = type({
|
|
11
|
+
check_suite_id: type.number.describe("the id from check_suite.id"),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
type LogLine = {
|
|
15
|
+
line: number;
|
|
16
|
+
content: string;
|
|
17
|
+
type: "error" | "warning" | "failure" | "trace";
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type LogAnalysis = {
|
|
21
|
+
totalLines: number;
|
|
22
|
+
index: LogLine[];
|
|
23
|
+
excerpt: {
|
|
24
|
+
content: string;
|
|
25
|
+
startLine: number;
|
|
26
|
+
endLine: number;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export function analyzeLog(logs: string, excerptLines = 80): LogAnalysis {
|
|
31
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape codes use control chars
|
|
32
|
+
const clean = logs.replace(/\x1b\[[0-9;]*m/g, "");
|
|
33
|
+
const lines = clean.split("\n");
|
|
34
|
+
const totalLines = lines.length;
|
|
35
|
+
|
|
36
|
+
const index: LogLine[] = [];
|
|
37
|
+
|
|
38
|
+
const patterns: Array<{ type: LogLine["type"]; pattern: RegExp; skip?: RegExp }> = [
|
|
39
|
+
{ type: "error", pattern: /##\[error\]/i },
|
|
40
|
+
{ type: "error", pattern: /\bError:/i },
|
|
41
|
+
{ type: "error", pattern: /\bERR_/i },
|
|
42
|
+
{ type: "error", pattern: /exit code [1-9]/i },
|
|
43
|
+
{ type: "warning", pattern: /##\[warning\]/i },
|
|
44
|
+
{ type: "warning", pattern: /\bWARN\b/i, skip: /apt|dpkg|Reading package/i },
|
|
45
|
+
{ type: "failure", pattern: /\d+ failed/i },
|
|
46
|
+
{ type: "failure", pattern: /FAIL\b/i },
|
|
47
|
+
{ type: "failure", pattern: /✕|✗|×/ },
|
|
48
|
+
{ type: "trace", pattern: /^\s+at\s+/i },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
for (const [i, line] of lines.entries()) {
|
|
52
|
+
for (const p of patterns) {
|
|
53
|
+
if (p.pattern.test(line)) {
|
|
54
|
+
if (p.skip?.test(line)) continue;
|
|
55
|
+
|
|
56
|
+
// dedupe consecutive traces
|
|
57
|
+
if (p.type === "trace" && index.length > 0 && index[index.length - 1]!.type === "trace") {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// truncate long lines
|
|
62
|
+
const truncated = line.length > 120 ? `${line.slice(0, 117)}...` : line;
|
|
63
|
+
|
|
64
|
+
index.push({
|
|
65
|
+
line: i + 1,
|
|
66
|
+
content: truncated.trim(),
|
|
67
|
+
type: p.type,
|
|
68
|
+
});
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// find excerpt range: focus on LAST ##[error] line
|
|
75
|
+
let errorLine = -1;
|
|
76
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
77
|
+
if (/##\[error\]/i.test(lines[i]!)) {
|
|
78
|
+
errorLine = i;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
let start: number;
|
|
84
|
+
let end: number;
|
|
85
|
+
|
|
86
|
+
if (errorLine === -1) {
|
|
87
|
+
start = Math.max(0, totalLines - excerptLines);
|
|
88
|
+
end = totalLines;
|
|
89
|
+
} else {
|
|
90
|
+
const contextAfter = 5;
|
|
91
|
+
const contextBefore = excerptLines - contextAfter;
|
|
92
|
+
start = Math.max(0, errorLine - contextBefore);
|
|
93
|
+
end = Math.min(totalLines, errorLine + contextAfter);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
totalLines,
|
|
98
|
+
index,
|
|
99
|
+
excerpt: {
|
|
100
|
+
content: lines.slice(start, end).join("\n"),
|
|
101
|
+
startLine: start + 1,
|
|
102
|
+
endLine: end,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
type JobLogResult = {
|
|
108
|
+
job_id: number;
|
|
109
|
+
job_name: string;
|
|
110
|
+
job_url: string;
|
|
111
|
+
failed_steps: string[];
|
|
112
|
+
log_index: LogLine[];
|
|
113
|
+
excerpt: {
|
|
114
|
+
start_line: number;
|
|
115
|
+
end_line: number;
|
|
116
|
+
total_lines: number;
|
|
117
|
+
content: string;
|
|
118
|
+
};
|
|
119
|
+
full_log_path: string;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export function GetCheckSuiteLogsTool(ctx: GitHubToolContext) {
|
|
123
|
+
return tool({
|
|
124
|
+
name: "get_check_suite_logs",
|
|
125
|
+
description:
|
|
126
|
+
"get workflow run logs for a failed check suite. returns a log_index of interesting lines, " +
|
|
127
|
+
"a curated excerpt, and full_log_path for deeper investigation. " +
|
|
128
|
+
"pass check_suite.id from the webhook payload.",
|
|
129
|
+
parameters: GetCheckSuiteLogs,
|
|
130
|
+
execute: execute(async (params) => {
|
|
131
|
+
const check_suite_id = params.check_suite_id;
|
|
132
|
+
|
|
133
|
+
// get workflow runs for this specific check suite
|
|
134
|
+
const workflowRuns = await ctx.octokit.paginate(
|
|
135
|
+
ctx.octokit.rest.actions.listWorkflowRunsForRepo,
|
|
136
|
+
{
|
|
137
|
+
owner: ctx.repo.owner,
|
|
138
|
+
repo: ctx.repo.name,
|
|
139
|
+
check_suite_id,
|
|
140
|
+
per_page: 100,
|
|
141
|
+
request: { signal: AbortSignal.timeout(10_000) },
|
|
142
|
+
},
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const failedRuns = workflowRuns.filter((run) => run.conclusion === "failure");
|
|
146
|
+
|
|
147
|
+
if (failedRuns.length === 0) {
|
|
148
|
+
return {
|
|
149
|
+
check_suite_id,
|
|
150
|
+
message: "no failed workflow runs found for this check suite",
|
|
151
|
+
failed_jobs: [],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// setup logs directory
|
|
156
|
+
const tempDir = getTempDir();
|
|
157
|
+
const logsDir = join(tempDir, "ci-logs");
|
|
158
|
+
mkdirSync(logsDir, { recursive: true });
|
|
159
|
+
|
|
160
|
+
const jobResults: JobLogResult[] = [];
|
|
161
|
+
|
|
162
|
+
// get logs for each failed run
|
|
163
|
+
for (const run of failedRuns) {
|
|
164
|
+
const jobs = await ctx.octokit.paginate(ctx.octokit.rest.actions.listJobsForWorkflowRun, {
|
|
165
|
+
owner: ctx.repo.owner,
|
|
166
|
+
repo: ctx.repo.name,
|
|
167
|
+
run_id: run.id,
|
|
168
|
+
request: { signal: AbortSignal.timeout(10_000) },
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// only process failed jobs
|
|
172
|
+
const failedJobs = jobs.filter((job) => job.conclusion === "failure");
|
|
173
|
+
|
|
174
|
+
for (const job of failedJobs) {
|
|
175
|
+
try {
|
|
176
|
+
const logsResponse = await ctx.octokit.rest.actions.downloadJobLogsForWorkflowRun({
|
|
177
|
+
owner: ctx.repo.owner,
|
|
178
|
+
repo: ctx.repo.name,
|
|
179
|
+
job_id: job.id,
|
|
180
|
+
request: { signal: AbortSignal.timeout(10_000) },
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const logsUrl = logsResponse.url;
|
|
184
|
+
const logsResult = await fetch(logsUrl, { signal: AbortSignal.timeout(10_000) });
|
|
185
|
+
if (!logsResult.ok) {
|
|
186
|
+
throw new Error(
|
|
187
|
+
`failed to fetch logs: ${logsResult.status} ${logsResult.statusText}`,
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
const logsText = await logsResult.text();
|
|
191
|
+
|
|
192
|
+
// write full log to disk
|
|
193
|
+
const logPath = join(logsDir, `job-${job.id}.log`);
|
|
194
|
+
writeFileSync(logPath, logsText);
|
|
195
|
+
|
|
196
|
+
// analyze log
|
|
197
|
+
const analysis = analyzeLog(logsText, 80);
|
|
198
|
+
|
|
199
|
+
// get failed steps
|
|
200
|
+
const failedSteps =
|
|
201
|
+
job.steps
|
|
202
|
+
?.filter((s) => s.conclusion === "failure")
|
|
203
|
+
.map((s) => `Step ${s.number}: ${s.name}`) ?? [];
|
|
204
|
+
|
|
205
|
+
jobResults.push({
|
|
206
|
+
job_id: job.id,
|
|
207
|
+
job_name: job.name,
|
|
208
|
+
job_url: job.html_url ?? "",
|
|
209
|
+
failed_steps: failedSteps,
|
|
210
|
+
log_index: analysis.index,
|
|
211
|
+
excerpt: {
|
|
212
|
+
start_line: analysis.excerpt.startLine,
|
|
213
|
+
end_line: analysis.excerpt.endLine,
|
|
214
|
+
total_lines: analysis.totalLines,
|
|
215
|
+
// LLM01. This is stdout from a workflow defined in the branch
|
|
216
|
+
// under review — on a fork PR, ~80 lines an outside contributor
|
|
217
|
+
// chose, arriving as free prose in the middle of a tool result.
|
|
218
|
+
// Fenced rather than neutralised: the excerpt is diagnostic and
|
|
219
|
+
// must stay byte-faithful to be useful, and the fence bounds it
|
|
220
|
+
// without editing it. `fenceUntrusted` defangs its own marker
|
|
221
|
+
// phrase, so the log cannot close the quarantine it sits in.
|
|
222
|
+
content: fenceUntrusted(`CI job log — ${job.name}`, analysis.excerpt.content),
|
|
223
|
+
},
|
|
224
|
+
full_log_path: logPath,
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
log.debug(`analyzed logs for job ${job.name}: ${analysis.index.length} indexed lines`);
|
|
228
|
+
} catch (error) {
|
|
229
|
+
log.info(`failed to fetch logs for job ${job.id}: ${error}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
_instructions: {
|
|
236
|
+
overview:
|
|
237
|
+
"this result contains CI failure information. use log_index to find interesting lines, then read full_log_path for details.",
|
|
238
|
+
fields: {
|
|
239
|
+
log_index:
|
|
240
|
+
"array of interesting lines (errors, warnings, failures) with line numbers. use these to navigate the full log.",
|
|
241
|
+
excerpt:
|
|
242
|
+
"a curated ~80 line window around the last error. may not show all failures if they occur in different places.",
|
|
243
|
+
full_log_path:
|
|
244
|
+
"path to the complete log file. read specific line ranges using the line numbers from log_index.",
|
|
245
|
+
failed_steps:
|
|
246
|
+
"which CI steps failed. read the workflow yml to understand what commands these steps run.",
|
|
247
|
+
},
|
|
248
|
+
workflow: [
|
|
249
|
+
"1. scan log_index to see where errors/warnings/failures are located",
|
|
250
|
+
"2. read excerpt for immediate context",
|
|
251
|
+
"3. if excerpt doesn't show what you need, read specific line ranges from full_log_path",
|
|
252
|
+
"4. check failed_steps to understand what command failed",
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
check_suite_id,
|
|
256
|
+
repo: `${ctx.repo.owner}/${ctx.repo.name}`,
|
|
257
|
+
failed_jobs: jobResults,
|
|
258
|
+
};
|
|
259
|
+
}),
|
|
260
|
+
});
|
|
261
|
+
}
|