diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..56ffd96 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,49 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.2.0] - 2025-12-22 + +### Added + +- **Test Suggestions**: Automatically detects code changes without corresponding tests and generates copyable test templates + - Supports Jest, Mocha, Vitest, pytest, and unittest frameworks + - Auto-detects testing framework from project configuration + - Suggests appropriate test file paths based on project structure + +- **Coverage Reporting**: Reports test coverage percentage when a coverage tool is configured + - Supports Jest/NYC JSON, lcov, and Cobertura XML formats + - Only runs when coverage tool is detected in project (per user preference) + - Shows overall percentage, line coverage, and branch coverage + +- **DevOps Cost Estimation**: Estimates AWS infrastructure costs for DevOps-related changes + - Detects Terraform, CloudFormation, CDK, Pulumi, Docker, and Kubernetes files + - Built-in pricing data for EC2, Lambda, S3, RDS, ECS, ALB, NAT Gateway, and more + - Shows confidence level for each estimate + +- **Enhanced CLI Output**: New sections in `pr-agent analyze` output + - ๐Ÿงช Test Suggestions section with copyable test code + - ๐Ÿ“Š Coverage Report section with percentage and file breakdown + - ๐Ÿ’ฐ AWS Cost Estimates section with monthly cost impact + +- **Smart Change Detection**: Agent automatically shows only relevant outputs + - Categorizes files as code, test, or DevOps + - Code without tests โ†’ Shows test suggestions + - Terraform/CloudFormation โ†’ Shows cost estimates + - Coverage tool configured โ†’ Shows coverage report + +### New Files + +- `src/tools/test-suggestion-tool.ts` - Test framework detection and test generation +- `src/tools/coverage-reporter.ts` - Coverage report parsing and formatting +- `src/tools/devops-cost-estimator.ts` - IaC file detection and AWS cost estimation + +### Changed + +- `src/types/agent.types.ts` - Added `CodeSuggestion`, `TestSuggestion`, `DevOpsCostEstimate`, and `CoverageReport` interfaces +- `src/tools/index.ts` - Exports for new tools +- `src/cli/commands/analyze.command.ts` - Display sections for new features + diff --git a/dist/agents/base-pr-agent-workflow.d.ts b/dist/agents/base-pr-agent-workflow.d.ts index 862b716..8b181d1 100644 --- a/dist/agents/base-pr-agent-workflow.d.ts +++ b/dist/agents/base-pr-agent-workflow.d.ts @@ -54,6 +54,10 @@ export declare abstract class BasePRAgentWorkflow { * Fast path execution - skip refinement loop but still use LLM for detailed analysis */ private executeFastPath; + /** + * Smart change detection - analyzes files and returns only relevant enhanced features + */ + private detectAndAnalyzeChangeTypes; private analyzeFilesNode; private detectRisksNode; private calculateComplexityNode; diff --git a/dist/agents/base-pr-agent-workflow.js b/dist/agents/base-pr-agent-workflow.js index cf6b2dc..29cb9e5 100644 --- a/dist/agents/base-pr-agent-workflow.js +++ b/dist/agents/base-pr-agent-workflow.js @@ -7,6 +7,9 @@ import { MemorySaver } from '@langchain/langgraph'; import { parseDiff, createFileAnalyzerTool, createRiskDetectorTool, createComplexityScorerTool, createSummaryGeneratorTool, } from '../tools/pr-analysis-tools.js'; import { formatArchDocsForPrompt, getSecurityContext, getPatternsContext } from '../utils/arch-docs-rag.js'; import { parseAllArchDocs } from '../utils/arch-docs-parser.js'; +import { isTestFile, isCodeFile, detectTestFramework, generateTestTemplate, suggestTestFilePath, } from '../tools/test-suggestion-tool.js'; +import { isDevOpsFile, analyzeDevOpsFiles, } from '../tools/devops-cost-estimator.js'; +import { detectCoverageTool, readCoverageReport, } from '../tools/coverage-reporter.js'; /** * Agent workflow state */ @@ -204,6 +207,9 @@ export class BasePRAgentWorkflow { influencedStages: [...new Set(stateAny.archDocsInfluencedStages || [])], keyInsights: [...new Set(stateAny.archDocsKeyInsights || [])], } : undefined; + // Smart change detection - only include relevant outputs + const files = parseDiff(context.diff); + const enhancedResult = await this.detectAndAnalyzeChangeTypes(files, context); return { summary: finalState.currentSummary, fileAnalyses: finalState.fileAnalyses, @@ -218,6 +224,8 @@ export class BasePRAgentWorkflow { executionTime, mode: context.mode, archDocsImpact, + // Conditionally include new features based on change types + ...enhancedResult, }; } /** @@ -265,6 +273,9 @@ export class BasePRAgentWorkflow { influencedStages: [...new Set(stateAny.archDocsInfluencedStages || [])], keyInsights: [...new Set(stateAny.archDocsKeyInsights || [])], } : undefined; + // Smart change detection - only include relevant outputs + const files = parseDiff(context.diff); + const enhancedResult = await this.detectAndAnalyzeChangeTypes(files, context); return { summary: state.currentSummary, fileAnalyses: state.fileAnalyses, @@ -279,6 +290,8 @@ export class BasePRAgentWorkflow { executionTime, mode: context.mode, archDocsImpact, + // Conditionally include new features based on change types + ...enhancedResult, }; } catch (error) { @@ -286,6 +299,69 @@ export class BasePRAgentWorkflow { throw error; } } + /** + * Smart change detection - analyzes files and returns only relevant enhanced features + */ + async detectAndAnalyzeChangeTypes(files, context) { + const result = {}; + // Categorize files by type + const codeFiles = files.filter(f => isCodeFile(f.path) && !isTestFile(f.path)); + const testFiles = files.filter(f => isTestFile(f.path)); + const devOpsFiles = files.filter(f => isDevOpsFile(f.path).isDevOps); + console.log(`๐Ÿ“Š Change Analysis: ${codeFiles.length} code files, ${testFiles.length} test files, ${devOpsFiles.length} DevOps files`); + // 1. Developer changes without tests โ†’ Test Suggestions + if (codeFiles.length > 0 && codeFiles.length > testFiles.length) { + console.log(`๐Ÿงช Detecting test suggestions for ${codeFiles.length} code files...`); + const frameworkInfo = detectTestFramework(context.config?.repoPath || '.'); + const testSuggestions = []; + for (const file of codeFiles) { + // Check if there's a corresponding test file in the PR + const baseName = file.path.replace(/\.[^/.]+$/, '').split('/').pop() || ''; + const hasTest = testFiles.some(t => t.path.toLowerCase().includes(baseName.toLowerCase())); + if (!hasTest && file.additions > 5) { + // Extract function names from diff for better test generation + const functionMatches = file.diff.match(/(?:function|const|let|var|async)\s+(\w+)/g) || []; + const functionNames = functionMatches + .map(m => m.replace(/(?:function|const|let|var|async)\s+/, '')) + .filter(name => name.length > 2 && !['the', 'and', 'for'].includes(name)); + const testCode = generateTestTemplate(frameworkInfo.framework, file.path, file.diff, functionNames.slice(0, 5)); + testSuggestions.push({ + forFile: file.path, + testFramework: frameworkInfo.framework, + testCode, + description: `Suggested tests for new/modified code in ${file.path}`, + testFilePath: suggestTestFilePath(file.path, frameworkInfo.framework), + }); + } + } + if (testSuggestions.length > 0) { + result.testSuggestions = testSuggestions; + console.log(`โœ… Generated ${testSuggestions.length} test suggestions`); + } + } + // 2. DevOps/IaC changes โ†’ Cost Estimation + if (devOpsFiles.length > 0) { + console.log(`๐Ÿ’ฐ Analyzing DevOps costs for ${devOpsFiles.length} files...`); + const costAnalysis = analyzeDevOpsFiles(devOpsFiles); + if (costAnalysis.hasDevOpsChanges && costAnalysis.estimates.length > 0) { + result.devOpsCostEstimates = costAnalysis.estimates; + console.log(`โœ… Estimated costs for ${costAnalysis.estimates.length} resources (~$${costAnalysis.totalEstimatedCost.toFixed(2)}/month)`); + } + } + // 3. Test/QA changes โ†’ Coverage Report (only if configured) + if (testFiles.length > 0 || codeFiles.length > 0) { + const coverageConfig = detectCoverageTool(context.config?.repoPath || '.'); + if (coverageConfig.configured) { + console.log(`๐Ÿ“Š Checking coverage (${coverageConfig.tool} detected)...`); + const coverage = readCoverageReport(context.config?.repoPath || '.'); + if (coverage.available) { + result.coverageReport = coverage; + console.log(`โœ… Coverage: ${coverage.overallPercentage?.toFixed(1)}%`); + } + } + } + return result; + } // Workflow nodes async analyzeFilesNode(state) { const { context } = state; diff --git a/dist/agents/base-pr-agent-workflow.js.map b/dist/agents/base-pr-agent-workflow.js.map index d269460..bfaf41c 100644 --- a/dist/agents/base-pr-agent-workflow.js.map +++ b/dist/agents/base-pr-agent-workflow.js.map @@ -1 +1 @@ -{"version":3,"file":"base-pr-agent-workflow.js","sourceRoot":"","sources":["../../src/agents/base-pr-agent-workflow.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"base-pr-agent-workflow.js","sourceRoot":"","sources":["../../src/agents/base-pr-agent-workflow.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/cli/commands/analyze.command.js b/dist/cli/commands/analyze.command.js index b6e7cf3..4141e96 100644 --- a/dist/cli/commands/analyze.command.js +++ b/dist/cli/commands/analyze.command.js @@ -542,6 +542,71 @@ function displayAgentResults(result, mode, verbose) { if (result.totalTokensUsed) { console.log(chalk.gray(`\nTotal tokens used: ${result.totalTokensUsed.toLocaleString()}`)); } + // Show test suggestions if available + if (result.testSuggestions && result.testSuggestions.length > 0) { + console.log(chalk.gray('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”')); + console.log(chalk.yellow.bold(`\n๐Ÿงช Test Suggestions (${result.testSuggestions.length} files need tests)\n`)); + for (const suggestion of result.testSuggestions) { + console.log(chalk.cyan(` ๐Ÿ“ ${suggestion.forFile}`)); + console.log(chalk.gray(` Framework: ${suggestion.testFramework}`)); + if (suggestion.testFilePath) { + console.log(chalk.gray(` Suggested test file: ${suggestion.testFilePath}`)); + } + console.log(chalk.white(` ${suggestion.description}\n`)); + if (suggestion.testCode) { + console.log(chalk.gray(' โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€')); + const codeLines = suggestion.testCode.split('\n').slice(0, 10); + codeLines.forEach((line) => { + console.log(chalk.gray(' โ”‚ ') + chalk.white(line)); + }); + if (suggestion.testCode.split('\n').length > 10) { + console.log(chalk.gray(' โ”‚ ... (copy full code below)')); + } + console.log(chalk.gray(' โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n')); + } + } + } + // Show coverage report if available + if (result.coverageReport && result.coverageReport.available) { + console.log(chalk.gray('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”')); + console.log(chalk.green.bold('\n๐Ÿ“Š Test Coverage Report\n')); + const coverage = result.coverageReport; + if (coverage.overallPercentage !== undefined) { + const emoji = coverage.overallPercentage >= 80 ? '๐ŸŸข' : coverage.overallPercentage >= 60 ? '๐ŸŸก' : '๐Ÿ”ด'; + console.log(chalk.white(` ${emoji} Overall Coverage: ${coverage.overallPercentage.toFixed(1)}%`)); + } + if (coverage.lineCoverage !== undefined) { + console.log(chalk.gray(` Lines: ${coverage.lineCoverage.toFixed(1)}%`)); + } + if (coverage.branchCoverage !== undefined) { + console.log(chalk.gray(` Branches: ${coverage.branchCoverage.toFixed(1)}%`)); + } + if (coverage.delta !== undefined) { + const deltaEmoji = coverage.delta >= 0 ? '๐Ÿ“ˆ' : '๐Ÿ“‰'; + const deltaColor = coverage.delta >= 0 ? chalk.green : chalk.red; + console.log(deltaColor(` ${deltaEmoji} Coverage Delta: ${coverage.delta >= 0 ? '+' : ''}${coverage.delta.toFixed(1)}%`)); + } + if (coverage.coverageTool) { + console.log(chalk.gray(`\n Tool: ${coverage.coverageTool}`)); + } + console.log(''); + } + // Show DevOps cost estimates if available + if (result.devOpsCostEstimates && result.devOpsCostEstimates.length > 0) { + console.log(chalk.gray('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”')); + console.log(chalk.yellow.bold('\n๐Ÿ’ฐ AWS Cost Estimates\n')); + let totalCost = 0; + for (const estimate of result.devOpsCostEstimates) { + const emoji = estimate.confidence === 'high' ? '๐ŸŸข' : estimate.confidence === 'medium' ? '๐ŸŸก' : '๐Ÿ”ด'; + console.log(chalk.white(` ${emoji} ${estimate.resourceType.toUpperCase()}: ~$${estimate.estimatedNewCost.toFixed(2)}/month`)); + if (estimate.details) { + console.log(chalk.gray(` ${estimate.details}`)); + } + totalCost += estimate.estimatedNewCost; + } + console.log(chalk.cyan.bold(`\n ๐Ÿ“Š Total Estimated Impact: ~$${totalCost.toFixed(2)}/month`)); + console.log(chalk.gray('\n โš ๏ธ Estimates are approximate. Actual costs depend on usage and configuration.\n')); + } console.log(chalk.gray('\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n')); } //# sourceMappingURL=analyze.command.js.map \ No newline at end of file diff --git a/dist/cli/commands/analyze.command.js.map b/dist/cli/commands/analyze.command.js.map index 08e352d..a3d2575 100644 --- a/dist/cli/commands/analyze.command.js.map +++ b/dist/cli/commands/analyze.command.js.map @@ -1 +1 @@ -{"version":3,"file":"analyze.command.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AA0BrF;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,0BAA0B;IAC1B,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,2BAA2B;IAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,0CAA0C,EAAE;YAClE,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,OAAgB,EAAE,aAAsB;IAChE,IAAI,CAAC;QACH,IAAI,IAAI,GAAW,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;QAE7C,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACtC,8BAA8B;YAC9B,MAAM,MAAM,GAAG,aAAa,IAAI,aAAa,CAAC;YAC9C,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,YAAY,MAAM,EAAE,EAAE;oBACpC,QAAQ,EAAE,OAAO;oBACjB,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,QAAQ,CAChB,mCAAmC,MAAM,8EAA8E,MAAM,EAAE,EAC/H,YAAY,MAAM,EAAE,CACrB,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,mBAAmB,EAAE;oBACnC,QAAQ,EAAE,OAAO;oBACjB,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,QAAQ,CAChB,qFAAqF,EACrF,mBAAmB,CACpB,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,YAAY,OAAO,EAAE,EAAE;oBACrC,QAAQ,EAAE,OAAO;oBACjB,SAAS;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,QAAQ,CAChB,4BAA4B,OAAO,2CAA2C,EAC9E,YAAY,OAAO,EAAE,CACtB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEnB,6CAA6C;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAC3D,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAChE,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7B,6DAA6D;wBAC7D,CAAC,EAAE,CAAC;wBACJ,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;4BAC9D,CAAC,EAAE,CAAC;wBACN,CAAC;wBACD,SAAS,CAAC,yBAAyB;oBACrC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,EAAE,CAAC;QACN,CAAC;QACD,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAEvC,wEAAwE;QACxE,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACjD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;gBACtC,IAAI,cAAc,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACvC,IAAI,CAAC;oBACH,gDAAgD;oBAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACvC,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACpC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;wBAAE,SAAS;oBAE3C,oDAAoD;oBACpD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAElC,2DAA2D;oBAC3D,MAAM,UAAU,GAAG,2BAA2B,QAAQ,wEAAwE,QAAQ,gBAAgB,KAAK,CAAC,MAAM,OAAO,CAAC;oBAE1K,8CAA8C;oBAC9C,IAAI,QAAQ,GAAG,UAAU,CAAC;oBAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC;oBAC3B,CAAC;oBAED,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;gBACxC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,oEAAoE;oBACpE,IAAI,CAAC;wBACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;4BACpC,4BAA4B;4BAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,2BAA2B,QAAQ,wCAAwC,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;wBAChJ,CAAC;oBACH,CAAC;oBAAC,OAAO,OAAO,EAAE,CAAC;wBACjB,iBAAiB;wBACjB,SAAS;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,4CAA4C;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA0B,EAAE;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,6BAA6B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE3D,IAAI,CAAC;QACH,kCAAkC;QAClC,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACpC,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,sDAAsD;QACtD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,EAAE,EAAE,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;QAClG,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,EAAE,QAAQ,IAAI,WAAW,CAAC,CAAC,WAAW,EAAuC,CAAC;QAC7H,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC,CAAC;YACjG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;YAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;QAElD,mCAAmC;QACnC,IAAI,aAAiC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACzE,OAAO,CAAC,IAAI,GAAG,6BAA6B,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC;oBAC9C,YAAY,EAAE,MAAM,CAAC,GAAG,EAAE,aAAa;oBACvC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;oBACrC,aAAa,EAAE,IAAI;iBACpB,CAAC,CAAC;gBAEH,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC;gBAEpC,IAAI,YAAY,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC;gBAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,aAAa,aAAa,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,cAAc,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;oBAC3E,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;oBACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACjD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;wBACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;wBACrE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;wBACxE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC,CAAC;oBACvH,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,MAAM,IAAI,GAAiB;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK;YACjD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK;YAC7C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK;SACxD,CAAC;QAEF,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAElC,eAAe;QACf,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACtB,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACxB,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACxE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;gBAC9E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBAC1E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;gBAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;QAEpD,uBAAuB;QACvB,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,OAAO,CACb,gBAAgB,eAAe,CAAC,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACjG,CAAC;QAEF,+BAA+B;QAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,OAAO,CAAC,IAAI,CAChB,qFAAqF,CACtF,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,sBAAsB;QACtB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,mCAAmC;QACnF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QAErC,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;QAC9F,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iEAAiE,CAAC,CAAC,CAAC;QAC/F,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;YAChC,QAAQ,EAAE,QAAe;YACzB,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YACpD,WAAW,EAAE,WAAW,IAAI,WAAW;YACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QAEH,kBAAkB;QAClB,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEhC,0DAA0D;QAC1D,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;YAC5F,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAClF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,kEAAkE;YAClE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,mDAAmD;YACnD,MAAM,gBAAgB,GAAG,YAAY;iBAClC,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC;iBACvC,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC;iBACvC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe;YAErC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAW,EAAE,IAAkB,EAAE,OAAgB;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAEjE,yDAAyD;IACzD,IAAI,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;IAClC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACpE,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAC9D,YAAY,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,8CAA8C;IAC9C,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAyB,CAAC;QACtF,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAExF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,cAAc,CAAC,MAAM,sBAAsB,CAAC,CAAC,CAAC;YAElG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,CAAS,EAAE,EAAE;oBAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;wBAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC;oBACzD,CAAC;yBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;wBAC9D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;4BAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;4BAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,iBAAiB,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;4BACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBACzE,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,CAAS,EAAE,EAAE;gBACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;gBAClD,CAAC;qBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;oBAC5D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,iBAAiB,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;wBACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,kDAAkD;IAClD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;QAEzF,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAyB,CAAC;QACtF,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;QACvF,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;QAE1F,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACrD,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;gBACnE,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC5G,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC1D,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YACH,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,gBAAgB,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,CAAS,EAAE,EAAE;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAc,EAAE,CAAS,EAAE,EAAE;YACrD,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QAEzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,cAAc,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QAE5F,IAAI,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;gBAC/D,MAAM,UAAU,GAAG,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnC,KAAK,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBACnC,KAAK,KAAK,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;4BAC3C,KAAK,KAAK,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gCACvC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,UAAU,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACtE,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAe,EAAE,CAAS,EAAE,EAAE;gBACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;AAC1E,CAAC"} \ No newline at end of file +{"version":3,"file":"analyze.command.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.command.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tools/coverage-reporter.d.ts b/dist/tools/coverage-reporter.d.ts new file mode 100644 index 0000000..de47606 --- /dev/null +++ b/dist/tools/coverage-reporter.d.ts @@ -0,0 +1,40 @@ +/** + * Coverage Reporter Tool for PR Analysis + * Reads coverage reports and extracts metrics when coverage tool is configured + */ +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +import { CoverageReport } from '../types/agent.types.js'; +/** + * Detect if coverage tool is configured in the project + */ +export declare function detectCoverageTool(repoPath?: string): { + tool: string | null; + configured: boolean; + coveragePath?: string; +}; +/** + * Find existing coverage report files + */ +export declare function findCoverageFiles(repoPath?: string): string[]; +/** + * Read and parse coverage report + */ +export declare function readCoverageReport(repoPath?: string): CoverageReport; +/** + * Create coverage reporter tool + */ +export declare function createCoverageReporterTool(): DynamicStructuredTool; + forceRead: z.ZodOptional; +}, z.core.$strip>, { + repoPath?: string; + forceRead?: boolean; +}, { + repoPath?: string | undefined; + forceRead?: boolean | undefined; +}, string>; +/** + * Format coverage report for display + */ +export declare function formatCoverageReport(report: CoverageReport): string; diff --git a/dist/tools/coverage-reporter.js b/dist/tools/coverage-reporter.js new file mode 100644 index 0000000..480af01 --- /dev/null +++ b/dist/tools/coverage-reporter.js @@ -0,0 +1,306 @@ +/** + * Coverage Reporter Tool for PR Analysis + * Reads coverage reports and extracts metrics when coverage tool is configured + */ +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +import fs from 'node:fs'; +import path from 'node:path'; +// Common coverage file locations +const COVERAGE_PATHS = { + jest: ['coverage/coverage-summary.json', 'coverage/lcov.info', 'coverage/coverage-final.json'], + nyc: ['coverage/coverage-summary.json', '.nyc_output/coverage.json', 'coverage/lcov.info'], + vitest: ['coverage/coverage-summary.json', 'coverage/lcov.info'], + pytest: ['coverage.xml', 'htmlcov/coverage.json', '.coverage'], + generic: ['coverage.json', 'coverage/lcov.info', 'coverage.xml'], +}; +/** + * Detect if coverage tool is configured in the project + */ +export function detectCoverageTool(repoPath = '.') { + const packageJsonPath = path.join(repoPath, 'package.json'); + // Check for Node.js project with coverage config + if (fs.existsSync(packageJsonPath)) { + try { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); + // Check Jest config + if (packageJson.jest?.collectCoverage || packageJson.jest?.coverageDirectory) { + return { tool: 'jest', configured: true }; + } + // Check for coverage scripts + const scripts = packageJson.scripts || {}; + const hasCoverageScript = Object.values(scripts).some((script) => typeof script === 'string' && (script.includes('--coverage') || script.includes('nyc'))); + if (hasCoverageScript) { + // Determine which tool + const deps = { ...packageJson.dependencies, ...packageJson.devDependencies }; + if (deps.jest) + return { tool: 'jest', configured: true }; + if (deps.nyc || deps['istanbul']) + return { tool: 'nyc', configured: true }; + if (deps.vitest) + return { tool: 'vitest', configured: true }; + if (deps.c8) + return { tool: 'c8', configured: true }; + return { tool: 'node', configured: true }; + } + } + catch (e) { + // Ignore parse errors + } + } + // Check for Jest config file + if (fs.existsSync(path.join(repoPath, 'jest.config.js')) || fs.existsSync(path.join(repoPath, 'jest.config.ts'))) { + try { + const configPath = fs.existsSync(path.join(repoPath, 'jest.config.js')) + ? path.join(repoPath, 'jest.config.js') + : path.join(repoPath, 'jest.config.ts'); + const content = fs.readFileSync(configPath, 'utf-8'); + if (content.includes('collectCoverage') || content.includes('coverageDirectory')) { + return { tool: 'jest', configured: true }; + } + } + catch (e) { + // Ignore read errors + } + } + // Check for Python coverage + const setupCfg = path.join(repoPath, 'setup.cfg'); + const pyprojectToml = path.join(repoPath, 'pyproject.toml'); + if (fs.existsSync(setupCfg)) { + try { + const content = fs.readFileSync(setupCfg, 'utf-8'); + if (content.includes('[coverage:') || content.includes('coverage')) { + return { tool: 'pytest-cov', configured: true }; + } + } + catch (e) { + // Ignore read errors + } + } + if (fs.existsSync(pyprojectToml)) { + try { + const content = fs.readFileSync(pyprojectToml, 'utf-8'); + if (content.includes('[tool.coverage]') || content.includes('pytest-cov')) { + return { tool: 'pytest-cov', configured: true }; + } + } + catch (e) { + // Ignore read errors + } + } + return { tool: null, configured: false }; +} +/** + * Find existing coverage report files + */ +export function findCoverageFiles(repoPath = '.') { + const foundFiles = []; + for (const paths of Object.values(COVERAGE_PATHS)) { + for (const coveragePath of paths) { + const fullPath = path.join(repoPath, coveragePath); + if (fs.existsSync(fullPath)) { + foundFiles.push(fullPath); + } + } + } + return [...new Set(foundFiles)]; // Remove duplicates +} +/** + * Parse Jest/NYC coverage-summary.json format + */ +function parseJestCoverageSummary(filePath) { + try { + const content = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + const total = content.total; + if (!total) + return null; + const fileBreakdown = []; + for (const [file, data] of Object.entries(content)) { + if (file === 'total') + continue; + const fileData = data; + fileBreakdown.push({ + file, + lineCoverage: fileData.lines?.pct || 0, + branchCoverage: fileData.branches?.pct, + }); + } + return { + available: true, + overallPercentage: total.lines?.pct || total.statements?.pct || 0, + lineCoverage: total.lines?.pct, + branchCoverage: total.branches?.pct, + fileBreakdown: fileBreakdown.slice(0, 20), // Limit to 20 files + coverageTool: 'jest/nyc', + }; + } + catch (e) { + return null; + } +} +/** + * Parse LCOV format + */ +function parseLcov(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + const files = []; + let currentFile = ''; + let linesHit = 0; + let linesTotal = 0; + for (const line of content.split('\n')) { + if (line.startsWith('SF:')) { + currentFile = line.substring(3); + linesHit = 0; + linesTotal = 0; + } + else if (line.startsWith('LH:')) { + linesHit = parseInt(line.substring(3), 10); + } + else if (line.startsWith('LF:')) { + linesTotal = parseInt(line.substring(3), 10); + } + else if (line === 'end_of_record' && currentFile) { + files.push({ file: currentFile, linesHit, linesTotal }); + currentFile = ''; + } + } + const totalHit = files.reduce((sum, f) => sum + f.linesHit, 0); + const totalLines = files.reduce((sum, f) => sum + f.linesTotal, 0); + const overallPercentage = totalLines > 0 ? (totalHit / totalLines) * 100 : 0; + return { + available: true, + overallPercentage: Math.round(overallPercentage * 100) / 100, + lineCoverage: overallPercentage, + fileBreakdown: files.slice(0, 20).map(f => ({ + file: f.file, + lineCoverage: f.linesTotal > 0 ? (f.linesHit / f.linesTotal) * 100 : 0, + })), + coverageTool: 'lcov', + }; + } + catch (e) { + return null; + } +} +/** + * Parse Cobertura XML format + */ +function parseCobertura(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + // Simple regex parsing for line-rate attribute + const lineRateMatch = content.match(/line-rate="([0-9.]+)"/); + const branchRateMatch = content.match(/branch-rate="([0-9.]+)"/); + if (!lineRateMatch) + return null; + const lineRate = parseFloat(lineRateMatch[1]) * 100; + const branchRate = branchRateMatch ? parseFloat(branchRateMatch[1]) * 100 : undefined; + return { + available: true, + overallPercentage: Math.round(lineRate * 100) / 100, + lineCoverage: lineRate, + branchCoverage: branchRate, + coverageTool: 'cobertura', + }; + } + catch (e) { + return null; + } +} +/** + * Read and parse coverage report + */ +export function readCoverageReport(repoPath = '.') { + const coverageFiles = findCoverageFiles(repoPath); + if (coverageFiles.length === 0) { + return { available: false }; + } + // Try to parse each file type + for (const filePath of coverageFiles) { + const fileName = path.basename(filePath); + if (fileName === 'coverage-summary.json' || fileName === 'coverage.json') { + const report = parseJestCoverageSummary(filePath); + if (report) + return report; + } + if (fileName === 'lcov.info' || fileName.endsWith('.lcov')) { + const report = parseLcov(filePath); + if (report) + return report; + } + if (fileName === 'coverage.xml' || fileName.endsWith('cobertura.xml')) { + const report = parseCobertura(filePath); + if (report) + return report; + } + } + return { available: false }; +} +/** + * Create coverage reporter tool + */ +export function createCoverageReporterTool() { + return new DynamicStructuredTool({ + name: 'report_coverage', + description: 'Read test coverage reports and extract metrics (only if coverage tool is configured)', + schema: z.object({ + repoPath: z.string().optional().describe('Repository path to check for coverage'), + forceRead: z.boolean().optional().describe('Force reading coverage even if not configured'), + }), + func: async ({ repoPath, forceRead }) => { + const projectPath = repoPath || '.'; + // Check if coverage tool is configured + const toolConfig = detectCoverageTool(projectPath); + if (!toolConfig.configured && !forceRead) { + return JSON.stringify({ + available: false, + reason: 'No coverage tool configured in project', + configured: false, + }); + } + // Try to read coverage report + const report = readCoverageReport(projectPath); + return JSON.stringify({ + ...report, + configured: toolConfig.configured, + tool: toolConfig.tool, + }); + }, + }); +} +/** + * Format coverage report for display + */ +export function formatCoverageReport(report) { + if (!report.available) { + return 'No coverage data available'; + } + let output = ''; + if (report.overallPercentage !== undefined) { + const emoji = report.overallPercentage >= 80 ? '๐ŸŸข' : report.overallPercentage >= 60 ? '๐ŸŸก' : '๐Ÿ”ด'; + output += `${emoji} Overall Coverage: ${report.overallPercentage.toFixed(1)}%\n`; + } + if (report.lineCoverage !== undefined) { + output += ` Lines: ${report.lineCoverage.toFixed(1)}%\n`; + } + if (report.branchCoverage !== undefined) { + output += ` Branches: ${report.branchCoverage.toFixed(1)}%\n`; + } + if (report.delta !== undefined) { + const deltaEmoji = report.delta >= 0 ? '๐Ÿ“ˆ' : '๐Ÿ“‰'; + output += `${deltaEmoji} Coverage Delta: ${report.delta >= 0 ? '+' : ''}${report.delta.toFixed(1)}%\n`; + } + if (report.fileBreakdown && report.fileBreakdown.length > 0) { + output += '\nFile Breakdown:\n'; + for (const file of report.fileBreakdown.slice(0, 10)) { + const emoji = file.lineCoverage >= 80 ? 'โœ…' : file.lineCoverage >= 60 ? 'โš ๏ธ' : 'โŒ'; + output += ` ${emoji} ${path.basename(file.file)}: ${file.lineCoverage.toFixed(1)}%\n`; + } + if (report.fileBreakdown.length > 10) { + output += ` ... and ${report.fileBreakdown.length - 10} more files\n`; + } + } + return output; +} +//# sourceMappingURL=coverage-reporter.js.map \ No newline at end of file diff --git a/dist/tools/coverage-reporter.js.map b/dist/tools/coverage-reporter.js.map new file mode 100644 index 0000000..a00facb --- /dev/null +++ b/dist/tools/coverage-reporter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"coverage-reporter.js","sourceRoot":"","sources":["../../src/tools/coverage-reporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,iCAAiC;AACjC,MAAM,cAAc,GAAG;IACnB,IAAI,EAAE,CAAC,gCAAgC,EAAE,oBAAoB,EAAE,8BAA8B,CAAC;IAC9F,GAAG,EAAE,CAAC,gCAAgC,EAAE,2BAA2B,EAAE,oBAAoB,CAAC;IAC1F,MAAM,EAAE,CAAC,gCAAgC,EAAE,oBAAoB,CAAC;IAChE,MAAM,EAAE,CAAC,cAAc,EAAE,uBAAuB,EAAE,WAAW,CAAC;IAC9D,OAAO,EAAE,CAAC,eAAe,EAAE,oBAAoB,EAAE,cAAc,CAAC;CACnE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB,GAAG;IAKrD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAE5D,iDAAiD;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YAE1E,oBAAoB;YACpB,IAAI,WAAW,CAAC,IAAI,EAAE,eAAe,IAAI,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;gBAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9C,CAAC;YAED,6BAA6B;YAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;YAC1C,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAe,EAAE,EAAE,CACtE,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAC1F,CAAC;YAEF,IAAI,iBAAiB,EAAE,CAAC;gBACpB,uBAAuB;gBACvB,MAAM,IAAI,GAAG,EAAE,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;gBAC7E,IAAI,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBACzD,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;oBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBAC3E,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,EAAE;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9C,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,sBAAsB;QAC1B,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC/G,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;gBACnE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9C,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,qBAAqB;QACzB,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACpD,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,qBAAqB;QACzB,CAAC;IACL,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACpD,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,qBAAqB;QACzB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,GAAG;IACpD,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QAChD,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,aAAa,GAAoC,EAAE,CAAC;QAE1D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,IAAI,IAAI,KAAK,OAAO;gBAAE,SAAS;YAC/B,MAAM,QAAQ,GAAG,IAA+D,CAAC;YACjF,aAAa,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;gBACtC,cAAc,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG;aACzC,CAAC,CAAC;QACP,CAAC;QAED,OAAO;YACH,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC;YACjE,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG;YAC9B,cAAc,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG;YACnC,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,oBAAoB;YAC/D,YAAY,EAAE,UAAU;SAC3B,CAAC;IACN,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,QAAgB;IAC/B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAkE,EAAE,CAAC;QAChF,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAChC,QAAQ,GAAG,CAAC,CAAC;gBACb,UAAU,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,IAAI,KAAK,eAAe,IAAI,WAAW,EAAE,CAAC;gBACjD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;gBACxD,WAAW,GAAG,EAAE,CAAC;YACrB,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7E,OAAO;YACH,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,GAAG,GAAG;YAC5D,YAAY,EAAE,iBAAiB;YAC/B,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,YAAY,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;aACzE,CAAC,CAAC;YACH,YAAY,EAAE,MAAM;SACvB,CAAC;IACN,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACpC,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnD,+CAA+C;QAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7D,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAEjE,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACpD,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QAEtF,OAAO;YACH,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG;YACnD,YAAY,EAAE,QAAQ;YACtB,cAAc,EAAE,UAAU;YAC1B,YAAY,EAAE,WAAW;SAC5B,CAAC;IACN,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB,GAAG;IACrD,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,QAAQ,KAAK,uBAAuB,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;YACvE,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC9B,CAAC;QAED,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC9B,CAAC;QAED,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACpE,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACtC,OAAO,IAAI,qBAAqB,CAAC;QAC7B,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,sFAAsF;QACnG,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACjF,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;SAC9F,CAAC;QACF,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAA8C,EAAE,EAAE;YAChF,MAAM,WAAW,GAAG,QAAQ,IAAI,GAAG,CAAC;YAEpC,uCAAuC;YACvC,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAEnD,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAC,SAAS,CAAC;oBAClB,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,wCAAwC;oBAChD,UAAU,EAAE,KAAK;iBACpB,CAAC,CAAC;YACP,CAAC;YAED,8BAA8B;YAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAE/C,OAAO,IAAI,CAAC,SAAS,CAAC;gBAClB,GAAG,MAAM;gBACT,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,IAAI,EAAE,UAAU,CAAC,IAAI;aACxB,CAAC,CAAC;QACP,CAAC;KACJ,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,4BAA4B,CAAC;IACxC,CAAC;IAED,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACnG,MAAM,IAAI,GAAG,KAAK,sBAAsB,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACrF,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,YAAY,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,IAAI,eAAe,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,MAAM,IAAI,GAAG,UAAU,oBAAoB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3G,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,qBAAqB,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACnF,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3F,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,aAAa,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,eAAe,CAAC;QAC3E,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"} \ No newline at end of file diff --git a/dist/tools/devops-cost-estimator.d.ts b/dist/tools/devops-cost-estimator.d.ts new file mode 100644 index 0000000..3e9a1e2 --- /dev/null +++ b/dist/tools/devops-cost-estimator.d.ts @@ -0,0 +1,65 @@ +/** + * DevOps Cost Estimator Tool for PR Analysis + * Estimates AWS infrastructure costs for DevOps-related changes (IaC, Dockerfiles, etc.) + * Uses MCP to connect to AWS for cost estimation when available + */ +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +import { DevOpsCostEstimate } from '../types/agent.types.js'; +/** + * Check if a file is a DevOps-related file + */ +export declare function isDevOpsFile(filePath: string): { + isDevOps: boolean; + type: string | null; +}; +/** + * Analyze DevOps files and estimate costs + */ +export declare function analyzeDevOpsFiles(files: Array<{ + path: string; + diff: string; +}>): { + hasDevOpsChanges: boolean; + fileTypes: string[]; + estimates: DevOpsCostEstimate[]; + totalEstimatedCost: number; +}; +/** + * Create DevOps cost estimator tool + */ +export declare function createDevOpsCostEstimatorTool(): DynamicStructuredTool>; + awsCredentials: z.ZodOptional; + secretAccessKey: z.ZodOptional; + region: z.ZodOptional; + }, z.core.$strip>>; +}, z.core.$strip>, { + files: Array<{ + path: string; + diff: string; + }>; + awsCredentials?: { + accessKeyId?: string; + secretAccessKey?: string; + region?: string; + }; +}, { + files: { + path: string; + diff: string; + }[]; + awsCredentials?: { + accessKeyId?: string | undefined; + secretAccessKey?: string | undefined; + region?: string | undefined; + } | undefined; +}, string>; +/** + * Format cost estimates for display + */ +export declare function formatCostEstimates(estimates: DevOpsCostEstimate[], totalCost: number): string; diff --git a/dist/tools/devops-cost-estimator.js b/dist/tools/devops-cost-estimator.js new file mode 100644 index 0000000..6f3a7da --- /dev/null +++ b/dist/tools/devops-cost-estimator.js @@ -0,0 +1,343 @@ +/** + * DevOps Cost Estimator Tool for PR Analysis + * Estimates AWS infrastructure costs for DevOps-related changes (IaC, Dockerfiles, etc.) + * Uses MCP to connect to AWS for cost estimation when available + */ +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +// DevOps file patterns +const DEVOPS_PATTERNS = { + terraform: [/\.tf$/, /\.tfvars$/], + cloudformation: [/template\.(yaml|yml|json)$/, /cloudformation\.(yaml|yml|json)$/], + cdk: [/cdk\.json$/, /\.ts$.*cdk/], + pulumi: [/Pulumi\.(yaml|yml)$/, /pulumi\..*\.(ts|js|py|go)$/], + docker: [/Dockerfile/, /docker-compose\.(yaml|yml)$/], + kubernetes: [/k8s.*\.(yaml|yml)$/, /kubernetes.*\.(yaml|yml)$/, /\.kube.*\.(yaml|yml)$/], + github_actions: [/\.github\/workflows\/.*\.(yaml|yml)$/], + serverless: [/serverless\.(yaml|yml|json)$/], +}; +// AWS resource cost estimates (monthly USD, approximate) +const AWS_RESOURCE_COSTS = { + 'ec2-t3.micro': { min: 8, typical: 8.5, max: 10 }, + 'ec2-t3.small': { min: 15, typical: 17, max: 20 }, + 'ec2-t3.medium': { min: 30, typical: 34, max: 40 }, + 'ec2-t3.large': { min: 60, typical: 68, max: 80 }, + 'ec2-m5.large': { min: 70, typical: 80, max: 95 }, + 'ec2-m5.xlarge': { min: 140, typical: 160, max: 190 }, + 'lambda-1m-invocations': { min: 0.2, typical: 0.4, max: 2 }, + 'lambda-10m-invocations': { min: 2, typical: 4, max: 20 }, + 's3-storage-gb': { min: 0.023, typical: 0.023, max: 0.025 }, + 's3-requests-1k': { min: 0.004, typical: 0.005, max: 0.006 }, + 'rds-db.t3.micro': { min: 13, typical: 15, max: 18 }, + 'rds-db.t3.small': { min: 26, typical: 30, max: 35 }, + 'rds-db.t3.medium': { min: 52, typical: 60, max: 70 }, + 'rds-db.m5.large': { min: 140, typical: 160, max: 190 }, + 'ecs-task-256cpu-512mem': { min: 10, typical: 12, max: 15 }, + 'ecs-task-512cpu-1024mem': { min: 20, typical: 24, max: 30 }, + 'ecs-task-1024cpu-2048mem': { min: 40, typical: 48, max: 60 }, + 'alb': { min: 16, typical: 22, max: 30 }, + 'nat-gateway': { min: 32, typical: 45, max: 60 }, + 'elasticache-t3.micro': { min: 12, typical: 15, max: 18 }, + 'cloudfront-1tb': { min: 85, typical: 100, max: 120 }, + 'api-gateway-1m-requests': { min: 3.5, typical: 4, max: 5 }, + 'sqs-1m-requests': { min: 0.4, typical: 0.5, max: 0.6 }, + 'sns-1m-notifications': { min: 0.5, typical: 0.6, max: 0.7 }, + 'dynamodb-25wcu-25rcu': { min: 25, typical: 30, max: 40 }, +}; +/** + * Check if a file is a DevOps-related file + */ +export function isDevOpsFile(filePath) { + for (const [type, patterns] of Object.entries(DEVOPS_PATTERNS)) { + for (const pattern of patterns) { + if (pattern.test(filePath)) { + return { isDevOps: true, type }; + } + } + } + return { isDevOps: false, type: null }; +} +/** + * Extract AWS resources from Terraform content + */ +function extractTerraformResources(content) { + const resources = []; + // Match resource blocks + const resourceRegex = /resource\s+"([^"]+)"\s+"([^"]+)"/g; + let match; + while ((match = resourceRegex.exec(content)) !== null) { + const resourceType = match[1]; + const resourceName = match[2]; + // Map Terraform resources to our cost categories + if (resourceType.startsWith('aws_instance')) { + resources.push({ resource: resourceName, type: 'ec2' }); + } + else if (resourceType.startsWith('aws_lambda')) { + resources.push({ resource: resourceName, type: 'lambda' }); + } + else if (resourceType.startsWith('aws_s3')) { + resources.push({ resource: resourceName, type: 's3' }); + } + else if (resourceType.startsWith('aws_rds') || resourceType.startsWith('aws_db')) { + resources.push({ resource: resourceName, type: 'rds' }); + } + else if (resourceType.startsWith('aws_ecs')) { + resources.push({ resource: resourceName, type: 'ecs' }); + } + else if (resourceType.startsWith('aws_alb') || resourceType.startsWith('aws_lb')) { + resources.push({ resource: resourceName, type: 'alb' }); + } + else if (resourceType.startsWith('aws_nat')) { + resources.push({ resource: resourceName, type: 'nat-gateway' }); + } + else if (resourceType.startsWith('aws_elasticache')) { + resources.push({ resource: resourceName, type: 'elasticache' }); + } + else if (resourceType.startsWith('aws_cloudfront')) { + resources.push({ resource: resourceName, type: 'cloudfront' }); + } + else if (resourceType.startsWith('aws_api_gateway') || resourceType.startsWith('aws_apigatewayv2')) { + resources.push({ resource: resourceName, type: 'api-gateway' }); + } + else if (resourceType.startsWith('aws_sqs')) { + resources.push({ resource: resourceName, type: 'sqs' }); + } + else if (resourceType.startsWith('aws_sns')) { + resources.push({ resource: resourceName, type: 'sns' }); + } + else if (resourceType.startsWith('aws_dynamodb')) { + resources.push({ resource: resourceName, type: 'dynamodb' }); + } + } + return resources; +} +/** + * Extract AWS resources from CloudFormation content + */ +function extractCloudFormationResources(content) { + const resources = []; + // Simple pattern matching for CFN resources + const typeMap = { + 'AWS::EC2::Instance': 'ec2', + 'AWS::Lambda::Function': 'lambda', + 'AWS::S3::Bucket': 's3', + 'AWS::RDS::DBInstance': 'rds', + 'AWS::ECS::Service': 'ecs', + 'AWS::ECS::TaskDefinition': 'ecs', + 'AWS::ElasticLoadBalancingV2::LoadBalancer': 'alb', + 'AWS::EC2::NatGateway': 'nat-gateway', + 'AWS::ElastiCache::CacheCluster': 'elasticache', + 'AWS::CloudFront::Distribution': 'cloudfront', + 'AWS::ApiGateway::RestApi': 'api-gateway', + 'AWS::ApiGatewayV2::Api': 'api-gateway', + 'AWS::SQS::Queue': 'sqs', + 'AWS::SNS::Topic': 'sns', + 'AWS::DynamoDB::Table': 'dynamodb', + }; + for (const [awsType, costType] of Object.entries(typeMap)) { + if (content.includes(awsType)) { + // Try to extract logical ID + const regex = new RegExp(`(\\w+):\\s*\\n\\s*Type:\\s*['"]?${awsType.replace(/::/g, '::')}`, 'g'); + const matches = content.matchAll(regex); + for (const match of matches) { + resources.push({ resource: match[1] || costType, type: costType }); + } + // Fallback if no match found but type exists + if (resources.filter(r => r.type === costType).length === 0) { + resources.push({ resource: costType, type: costType }); + } + } + } + return resources; +} +/** + * Estimate cost for a resource type + */ +function estimateResourceCost(resourceType) { + // Find matching cost entry + let costKey = ''; + let confidence = 'low'; + switch (resourceType) { + case 'ec2': + costKey = 'ec2-t3.medium'; + confidence = 'medium'; + break; + case 'lambda': + costKey = 'lambda-1m-invocations'; + confidence = 'low'; + break; + case 's3': + costKey = 's3-storage-gb'; + confidence = 'low'; + break; + case 'rds': + costKey = 'rds-db.t3.small'; + confidence = 'medium'; + break; + case 'ecs': + costKey = 'ecs-task-512cpu-1024mem'; + confidence = 'medium'; + break; + case 'alb': + costKey = 'alb'; + confidence = 'high'; + break; + case 'nat-gateway': + costKey = 'nat-gateway'; + confidence = 'high'; + break; + case 'elasticache': + costKey = 'elasticache-t3.micro'; + confidence = 'medium'; + break; + case 'cloudfront': + costKey = 'cloudfront-1tb'; + confidence = 'low'; + break; + case 'api-gateway': + costKey = 'api-gateway-1m-requests'; + confidence = 'low'; + break; + case 'sqs': + costKey = 'sqs-1m-requests'; + confidence = 'low'; + break; + case 'sns': + costKey = 'sns-1m-notifications'; + confidence = 'low'; + break; + case 'dynamodb': + costKey = 'dynamodb-25wcu-25rcu'; + confidence = 'low'; + break; + default: + return { + resource: resourceType, + resourceType, + estimatedNewCost: 0, + confidence: 'low', + details: 'Unknown resource type - manual estimation required', + }; + } + const cost = AWS_RESOURCE_COSTS[costKey]; + if (!cost) { + return { + resource: resourceType, + resourceType, + estimatedNewCost: 0, + confidence: 'low', + details: 'Cost data not available', + }; + } + return { + resource: resourceType, + resourceType, + estimatedNewCost: cost.typical, + confidence, + details: `Estimated $${cost.min.toFixed(2)} - $${cost.max.toFixed(2)}/month`, + }; +} +/** + * Analyze DevOps files and estimate costs + */ +export function analyzeDevOpsFiles(files) { + const devOpsFiles = files.filter(f => isDevOpsFile(f.path).isDevOps); + if (devOpsFiles.length === 0) { + return { + hasDevOpsChanges: false, + fileTypes: [], + estimates: [], + totalEstimatedCost: 0, + }; + } + const fileTypes = new Set(); + const allResources = []; + for (const file of devOpsFiles) { + const { type } = isDevOpsFile(file.path); + if (type) + fileTypes.add(type); + // Get the full content (in real scenario, we'd read the file) + // For now, analyze the diff + const content = file.diff; + if (type === 'terraform') { + allResources.push(...extractTerraformResources(content)); + } + else if (type === 'cloudformation') { + allResources.push(...extractCloudFormationResources(content)); + } + // Add more extractors for other IaC types as needed + } + // Estimate costs for each resource + const estimates = []; + const seenTypes = new Set(); + for (const resource of allResources) { + if (!seenTypes.has(resource.type)) { + seenTypes.add(resource.type); + estimates.push(estimateResourceCost(resource.type)); + } + } + const totalEstimatedCost = estimates.reduce((sum, e) => sum + e.estimatedNewCost, 0); + return { + hasDevOpsChanges: true, + fileTypes: Array.from(fileTypes), + estimates, + totalEstimatedCost, + }; +} +/** + * Create DevOps cost estimator tool + */ +export function createDevOpsCostEstimatorTool() { + return new DynamicStructuredTool({ + name: 'estimate_devops_costs', + description: 'Analyze DevOps/IaC files and estimate AWS infrastructure costs', + schema: z.object({ + files: z.array(z.object({ + path: z.string(), + diff: z.string(), + })).describe('Array of changed files to analyze'), + awsCredentials: z.object({ + accessKeyId: z.string().optional(), + secretAccessKey: z.string().optional(), + region: z.string().optional(), + }).optional().describe('AWS credentials for live cost lookup (optional)'), + }), + func: async ({ files }) => { + const analysis = analyzeDevOpsFiles(files); + if (!analysis.hasDevOpsChanges) { + return JSON.stringify({ + hasDevOpsChanges: false, + message: 'No DevOps/IaC files detected in changes', + }); + } + return JSON.stringify({ + hasDevOpsChanges: true, + fileTypes: analysis.fileTypes, + estimates: analysis.estimates, + totalEstimatedCost: analysis.totalEstimatedCost, + message: `Detected ${analysis.fileTypes.join(', ')} changes. Estimated monthly cost impact: $${analysis.totalEstimatedCost.toFixed(2)}`, + disclaimer: 'Cost estimates are approximate and based on typical resource sizes. Actual costs depend on usage patterns, region, and specific configurations.', + }); + }, + }); +} +/** + * Format cost estimates for display + */ +export function formatCostEstimates(estimates, totalCost) { + if (estimates.length === 0) { + return 'No cost estimates available'; + } + let output = '๐Ÿ’ฐ AWS Cost Estimates\n\n'; + for (const estimate of estimates) { + const emoji = estimate.confidence === 'high' ? '๐ŸŸข' : estimate.confidence === 'medium' ? '๐ŸŸก' : '๐Ÿ”ด'; + output += `${emoji} ${estimate.resourceType.toUpperCase()}: ~$${estimate.estimatedNewCost.toFixed(2)}/month\n`; + if (estimate.details) { + output += ` ${estimate.details}\n`; + } + } + output += `\n๐Ÿ“Š Total Estimated Impact: ~$${totalCost.toFixed(2)}/month\n`; + output += '\nโš ๏ธ Estimates are approximate. Actual costs depend on usage and configuration.\n'; + return output; +} +//# sourceMappingURL=devops-cost-estimator.js.map \ No newline at end of file diff --git a/dist/tools/devops-cost-estimator.js.map b/dist/tools/devops-cost-estimator.js.map new file mode 100644 index 0000000..3cf3a32 --- /dev/null +++ b/dist/tools/devops-cost-estimator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"devops-cost-estimator.js","sourceRoot":"","sources":["../../src/tools/devops-cost-estimator.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tools/index.d.ts b/dist/tools/index.d.ts index f37318c..30b01c2 100644 --- a/dist/tools/index.d.ts +++ b/dist/tools/index.d.ts @@ -2,3 +2,6 @@ * Export all PR analysis tools */ export { parseDiff, createFileAnalyzerTool, createRiskDetectorTool, createComplexityScorerTool, createSummaryGeneratorTool, createCodeSuggestionTool, } from './pr-analysis-tools.js'; +export { detectTestFramework, isTestFile, isCodeFile, suggestTestFilePath, createTestSuggestionTool, generateTestTemplate, } from './test-suggestion-tool.js'; +export { detectCoverageTool, findCoverageFiles, readCoverageReport, createCoverageReporterTool, formatCoverageReport, } from './coverage-reporter.js'; +export { isDevOpsFile, analyzeDevOpsFiles, createDevOpsCostEstimatorTool, formatCostEstimates, } from './devops-cost-estimator.js'; diff --git a/dist/tools/index.js b/dist/tools/index.js index e2b5967..09704ba 100644 --- a/dist/tools/index.js +++ b/dist/tools/index.js @@ -2,4 +2,7 @@ * Export all PR analysis tools */ export { parseDiff, createFileAnalyzerTool, createRiskDetectorTool, createComplexityScorerTool, createSummaryGeneratorTool, createCodeSuggestionTool, } from './pr-analysis-tools.js'; +export { detectTestFramework, isTestFile, isCodeFile, suggestTestFilePath, createTestSuggestionTool, generateTestTemplate, } from './test-suggestion-tool.js'; +export { detectCoverageTool, findCoverageFiles, readCoverageReport, createCoverageReporterTool, formatCoverageReport, } from './coverage-reporter.js'; +export { isDevOpsFile, analyzeDevOpsFiles, createDevOpsCostEstimatorTool, formatCostEstimates, } from './devops-cost-estimator.js'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/tools/index.js.map b/dist/tools/index.js.map index fe58612..be8f6a6 100644 --- a/dist/tools/index.js.map +++ b/dist/tools/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,wBAAwB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC"} \ No newline at end of file diff --git a/dist/tools/test-suggestion-tool.d.ts b/dist/tools/test-suggestion-tool.d.ts new file mode 100644 index 0000000..15440ab --- /dev/null +++ b/dist/tools/test-suggestion-tool.d.ts @@ -0,0 +1,58 @@ +/** + * Test Suggestion Tool for PR Analysis + * Generates test code suggestions for code changes without corresponding tests + */ +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +/** + * Detect test framework from project configuration + */ +export declare function detectTestFramework(repoPath?: string): { + framework: 'jest' | 'mocha' | 'vitest' | 'pytest' | 'unittest' | 'other'; + detected: boolean; + configFile?: string; +}; +/** + * Check if a file is a test file + */ +export declare function isTestFile(filePath: string): boolean; +/** + * Check if a file is a code file that should have tests + */ +export declare function isCodeFile(filePath: string): boolean; +/** + * Generate test file path suggestion + */ +export declare function suggestTestFilePath(sourceFilePath: string, framework: string): string; +/** + * Create test suggestion tool + */ +export declare function createTestSuggestionTool(): DynamicStructuredTool>; + framework: z.ZodOptional; + repoPath: z.ZodOptional; +}, z.core.$strip>, { + files: { + path: string; + diff: string; + additions: number; + }[]; + framework?: string | undefined; + repoPath?: string | undefined; +}, { + files: { + path: string; + diff: string; + additions: number; + }[]; + framework?: string | undefined; + repoPath?: string | undefined; +}, string>; +/** + * Generate test code template based on framework and code + */ +export declare function generateTestTemplate(framework: string, filePath: string, codeSnippet: string, functionNames?: string[]): string; diff --git a/dist/tools/test-suggestion-tool.js b/dist/tools/test-suggestion-tool.js new file mode 100644 index 0000000..0cb77fc --- /dev/null +++ b/dist/tools/test-suggestion-tool.js @@ -0,0 +1,261 @@ +/** + * Test Suggestion Tool for PR Analysis + * Generates test code suggestions for code changes without corresponding tests + */ +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +import fs from 'node:fs'; +import path from 'node:path'; +/** + * Detect test framework from project configuration + */ +export function detectTestFramework(repoPath = '.') { + const packageJsonPath = path.join(repoPath, 'package.json'); + // Check for Node.js project + if (fs.existsSync(packageJsonPath)) { + try { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); + const deps = { + ...packageJson.dependencies, + ...packageJson.devDependencies, + }; + // Check for Jest + if (deps.jest || deps['@jest/core'] || fs.existsSync(path.join(repoPath, 'jest.config.js')) || fs.existsSync(path.join(repoPath, 'jest.config.ts'))) { + return { framework: 'jest', detected: true, configFile: 'jest.config.js' }; + } + // Check for Vitest + if (deps.vitest || fs.existsSync(path.join(repoPath, 'vitest.config.js')) || fs.existsSync(path.join(repoPath, 'vitest.config.ts'))) { + return { framework: 'vitest', detected: true, configFile: 'vitest.config.js' }; + } + // Check for Mocha + if (deps.mocha || fs.existsSync(path.join(repoPath, '.mocharc.js')) || fs.existsSync(path.join(repoPath, '.mocharc.json'))) { + return { framework: 'mocha', detected: true, configFile: '.mocharc.js' }; + } + } + catch (e) { + // Ignore JSON parse errors + } + } + // Check for Python project + const pytestIni = path.join(repoPath, 'pytest.ini'); + const pyprojectToml = path.join(repoPath, 'pyproject.toml'); + const setupPy = path.join(repoPath, 'setup.py'); + if (fs.existsSync(pytestIni)) { + return { framework: 'pytest', detected: true, configFile: 'pytest.ini' }; + } + if (fs.existsSync(pyprojectToml)) { + try { + const content = fs.readFileSync(pyprojectToml, 'utf-8'); + if (content.includes('[tool.pytest]') || content.includes('pytest')) { + return { framework: 'pytest', detected: true, configFile: 'pyproject.toml' }; + } + } + catch (e) { + // Ignore read errors + } + } + if (fs.existsSync(setupPy)) { + try { + const content = fs.readFileSync(setupPy, 'utf-8'); + if (content.includes('pytest')) { + return { framework: 'pytest', detected: true, configFile: 'setup.py' }; + } + } + catch (e) { + // Ignore read errors + } + } + return { framework: 'other', detected: false }; +} +/** + * Check if a file is a test file + */ +export function isTestFile(filePath) { + const testPatterns = [ + /\.test\.[jt]sx?$/, + /\.spec\.[jt]sx?$/, + /_test\.py$/, + /test_.*\.py$/, + /\.test\.go$/, + /_test\.go$/, + /Test\.java$/, + /\.test\.rs$/, + ]; + return testPatterns.some(pattern => pattern.test(filePath)); +} +/** + * Check if a file is a code file that should have tests + */ +export function isCodeFile(filePath) { + const codeExtensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.java', '.rs', '.rb', '.cs']; + const ext = path.extname(filePath).toLowerCase(); + // Exclude config files, type definitions, etc. + if (filePath.includes('.d.ts') || filePath.includes('.config.') || filePath.includes('index.')) { + return false; + } + return codeExtensions.includes(ext); +} +/** + * Generate test file path suggestion + */ +export function suggestTestFilePath(sourceFilePath, framework) { + const ext = path.extname(sourceFilePath); + const baseName = path.basename(sourceFilePath, ext); + const dirName = path.dirname(sourceFilePath); + // For TypeScript/JavaScript + if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) { + if (framework === 'jest' || framework === 'vitest') { + // Check if there's a __tests__ folder pattern + if (dirName.includes('src')) { + const testsDir = dirName.replace('src', 'tests'); + return path.join(testsDir, `${baseName}.test${ext}`); + } + return path.join(dirName, `${baseName}.test${ext}`); + } + if (framework === 'mocha') { + return path.join(dirName, `${baseName}.spec${ext}`); + } + } + // For Python + if (ext === '.py') { + return path.join(dirName, `test_${baseName}.py`); + } + // For Go + if (ext === '.go') { + return path.join(dirName, `${baseName}_test.go`); + } + // Default + return path.join(dirName, `${baseName}.test${ext}`); +} +/** + * Create test suggestion tool + */ +export function createTestSuggestionTool() { + return new DynamicStructuredTool({ + name: 'suggest_tests', + description: 'Analyze code changes and suggest tests for files without test coverage', + schema: z.object({ + files: z.array(z.object({ + path: z.string(), + diff: z.string(), + additions: z.number(), + })).describe('Array of changed files to analyze'), + framework: z.string().optional().describe('Test framework to use'), + repoPath: z.string().optional().describe('Repository path for framework detection'), + }), + func: async ({ files, framework: providedFramework, repoPath }) => { + const detectedFramework = detectTestFramework(repoPath || '.'); + const testFramework = providedFramework || detectedFramework.framework; + // Filter to code files only + const codeFiles = files.filter(f => isCodeFile(f.path) && !isTestFile(f.path)); + // Check if corresponding test files exist in the PR + const testFilesInPR = files.filter(f => isTestFile(f.path)).map(f => f.path); + const filesNeedingTests = []; + for (const file of codeFiles) { + // Check if a test for this file is included in the PR + const baseNameWithoutExt = path.basename(file.path, path.extname(file.path)); + const hasPRTest = testFilesInPR.some(testPath => testPath.toLowerCase().includes(baseNameWithoutExt.toLowerCase())); + if (!hasPRTest && file.additions > 5) { // Only suggest for files with significant changes + // Extract added code from diff + const addedLines = file.diff + .split('\n') + .filter(line => line.startsWith('+') && !line.startsWith('+++')) + .map(line => line.substring(1)) + .join('\n'); + filesNeedingTests.push({ + file: file.path, + hasPRTest: false, + suggestedTestPath: suggestTestFilePath(file.path, testFramework), + codeSnippet: addedLines.substring(0, 1000), // Limit for context + }); + } + } + return JSON.stringify({ + testFramework, + frameworkDetected: detectedFramework.detected, + configFile: detectedFramework.configFile, + filesAnalyzed: codeFiles.length, + filesNeedingTests: filesNeedingTests.length, + files: filesNeedingTests, + }); + }, + }); +} +/** + * Generate test code template based on framework and code + */ +export function generateTestTemplate(framework, filePath, codeSnippet, functionNames = []) { + const baseName = path.basename(filePath, path.extname(filePath)); + const modulePath = filePath.replace(/\.[^/.]+$/, ''); + switch (framework) { + case 'jest': + case 'vitest': + return `import { describe, it, expect } from '${framework === 'vitest' ? 'vitest' : '@jest/globals'}'; +import { /* exported functions */ } from '${modulePath}'; + +describe('${baseName}', () => { +${functionNames.map(fn => ` describe('${fn}', () => { + it('should work correctly', () => { + // TODO: Add test implementation + expect(true).toBe(true); + }); + + it('should handle edge cases', () => { + // TODO: Add edge case tests + }); + }); +`).join('\n') || ` it('should be implemented', () => { + // TODO: Add tests for ${baseName} + expect(true).toBe(true); + }); +`} +}); +`; + case 'mocha': + return `const { expect } = require('chai'); +const { /* exported functions */ } = require('${modulePath}'); + +describe('${baseName}', function() { +${functionNames.map(fn => ` describe('${fn}', function() { + it('should work correctly', function() { + // TODO: Add test implementation + expect(true).to.be.true; + }); + }); +`).join('\n') || ` it('should be implemented', function() { + // TODO: Add tests for ${baseName} + expect(true).to.be.true; + }); +`} +}); +`; + case 'pytest': + return `import pytest +from ${modulePath.replace(/\//g, '.')} import * + +class Test${baseName.charAt(0).toUpperCase() + baseName.slice(1)}: +${functionNames.map(fn => ` def test_${fn}_works(self): + """Test that ${fn} works correctly.""" + # TODO: Add test implementation + assert True + + def test_${fn}_edge_cases(self): + """Test ${fn} edge cases.""" + # TODO: Add edge case tests + assert True +`).join('\n') || ` def test_implementation(self): + """Test ${baseName} functionality.""" + # TODO: Add tests + assert True +`} +`; + default: + return `// TODO: Add tests for ${baseName} +// Detected framework: ${framework} +// +// Test the following functionality: +${functionNames.map(fn => `// - ${fn}`).join('\n') || '// - Main module functionality'} +`; + } +} +//# sourceMappingURL=test-suggestion-tool.js.map \ No newline at end of file diff --git a/dist/tools/test-suggestion-tool.js.map b/dist/tools/test-suggestion-tool.js.map new file mode 100644 index 0000000..30510bd --- /dev/null +++ b/dist/tools/test-suggestion-tool.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test-suggestion-tool.js","sourceRoot":"","sources":["../../src/tools/test-suggestion-tool.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/types/agent.types.d.ts b/dist/types/agent.types.d.ts index d1cf2a5..a1a0fd6 100644 --- a/dist/types/agent.types.d.ts +++ b/dist/types/agent.types.d.ts @@ -48,6 +48,57 @@ export interface RiskItem { reason: string; }; } +/** + * Code suggestion for fixing issues found during review + */ +export interface CodeSuggestion { + filePath: string; + lineRange: { + start: number; + end: number; + }; + originalCode: string; + suggestedCode: string; + reason: string; +} +/** + * Test suggestion for code without tests + */ +export interface TestSuggestion { + forFile: string; + testFramework: 'jest' | 'mocha' | 'vitest' | 'pytest' | 'unittest' | 'other'; + testCode: string; + description: string; + testFilePath?: string; +} +/** + * DevOps cost estimate for infrastructure changes + */ +export interface DevOpsCostEstimate { + resource: string; + resourceType: string; + currentMonthlyCost?: number; + estimatedNewCost: number; + difference?: number; + confidence: 'high' | 'medium' | 'low'; + details?: string; +} +/** + * Test coverage report + */ +export interface CoverageReport { + available: boolean; + overallPercentage?: number; + lineCoverage?: number; + branchCoverage?: number; + fileBreakdown?: Array<{ + file: string; + lineCoverage: number; + branchCoverage?: number; + }>; + delta?: number; + coverageTool?: string; +} export interface FileAnalysis { path: string; summary: string; @@ -58,6 +109,7 @@ export interface FileAnalysis { deletions: number; }; recommendations: string[]; + suggestedChanges?: CodeSuggestion[]; } export interface AgentResult { summary: string; @@ -79,6 +131,9 @@ export interface AgentResult { influencedStages: string[]; keyInsights: string[]; }; + testSuggestions?: TestSuggestion[]; + devOpsCostEstimates?: DevOpsCostEstimate[]; + coverageReport?: CoverageReport; } export type AgentAnalysisResult = AgentResult; export interface AgentMetadata { diff --git a/dist/types/agent.types.js.map b/dist/types/agent.types.js.map index d9c7a84..48ebe65 100644 --- a/dist/types/agent.types.js.map +++ b/dist/types/agent.types.js.map @@ -1 +1 @@ -{"version":3,"file":"agent.types.js","sourceRoot":"","sources":["../../src/types/agent.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuGH,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,kCAAiB,CAAA;IACjB,4BAAW,CAAA;AACb,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"} \ No newline at end of file +{"version":3,"file":"agent.types.js","sourceRoot":"","sources":["../../src/types/agent.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgKH,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,kCAAiB,CAAA;IACjB,4BAAW,CAAA;AACb,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 36d9467..d53f329 100644 --- a/package-lock.json +++ b/package-lock.json @@ -154,6 +154,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1859,6 +1860,7 @@ "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.0.tgz", "integrity": "sha512-yJ6JHcU9psjnQbzRFkXjIdNTA+3074dA+2pHdH8ewvQCSleSk6JcjkCMIb5+NASjeMoi1ZuntlLKVsNqF38YxA==", "license": "MIT", + "peer": true, "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", @@ -2389,6 +2391,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -2699,6 +2702,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -3865,6 +3869,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -4511,6 +4516,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=10" } @@ -5744,6 +5750,7 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -7705,6 +7712,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", @@ -8950,6 +8958,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9354,6 +9363,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 77755e4..0a0aa37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pr-agent", - "version": "0.1.0", + "version": "0.2.0", "description": "Simple AI GitHub PR analyzer", "type": "module", "main": "./dist/index.js", @@ -59,4 +59,4 @@ "node": ">=18.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/src/agents/base-pr-agent-workflow.ts b/src/agents/base-pr-agent-workflow.ts index a60f8a9..a2bef58 100644 --- a/src/agents/base-pr-agent-workflow.ts +++ b/src/agents/base-pr-agent-workflow.ts @@ -6,7 +6,7 @@ import { StateGraph, Annotation, END } from '@langchain/langgraph'; import { MemorySaver } from '@langchain/langgraph'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { AgentContext, AgentResult, FileAnalysis, AgentExecutionOptions } from '../types/agent.types.js'; +import { AgentContext, AgentResult, FileAnalysis, AgentExecutionOptions, TestSuggestion, DevOpsCostEstimate, CoverageReport } from '../types/agent.types.js'; import { parseDiff, createFileAnalyzerTool, @@ -16,6 +16,21 @@ import { } from '../tools/pr-analysis-tools.js'; import { formatArchDocsForPrompt, getSecurityContext, getPatternsContext } from '../utils/arch-docs-rag.js'; import { parseAllArchDocs } from '../utils/arch-docs-parser.js'; +import { + isTestFile, + isCodeFile, + detectTestFramework, + generateTestTemplate, + suggestTestFilePath, +} from '../tools/test-suggestion-tool.js'; +import { + isDevOpsFile, + analyzeDevOpsFiles, +} from '../tools/devops-cost-estimator.js'; +import { + detectCoverageTool, + readCoverageReport, +} from '../tools/coverage-reporter.js'; /** * Agent workflow state @@ -259,6 +274,10 @@ export abstract class BasePRAgentWorkflow { keyInsights: [...new Set(stateAny.archDocsKeyInsights || [])], } : undefined; + // Smart change detection - only include relevant outputs + const files = parseDiff(context.diff); + const enhancedResult = await this.detectAndAnalyzeChangeTypes(files, context); + return { summary: finalState.currentSummary, fileAnalyses: finalState.fileAnalyses, @@ -273,6 +292,8 @@ export abstract class BasePRAgentWorkflow { executionTime, mode: context.mode, archDocsImpact, + // Conditionally include new features based on change types + ...enhancedResult, }; } @@ -303,19 +324,19 @@ export abstract class BasePRAgentWorkflow { try { // 1. Analyze files state = await this.analyzeFilesNode(state); - + // 2. Detect risks state = await this.detectRisksNode(state); - + // 3. Calculate complexity state = await this.calculateComplexityNode(state); - + // 4. Generate summary state = await this.generateSummaryNode(state); - + // 5. Generate recommendations (skip quality evaluation) state = await this.refineAnalysisNode(state); - + // 6. Finalize state = await this.finalizeNode(state); @@ -331,6 +352,10 @@ export abstract class BasePRAgentWorkflow { keyInsights: [...new Set(stateAny.archDocsKeyInsights || [])], } : undefined; + // Smart change detection - only include relevant outputs + const files = parseDiff(context.diff); + const enhancedResult = await this.detectAndAnalyzeChangeTypes(files, context); + return { summary: state.currentSummary, fileAnalyses: state.fileAnalyses, @@ -345,6 +370,8 @@ export abstract class BasePRAgentWorkflow { executionTime, mode: context.mode, archDocsImpact, + // Conditionally include new features based on change types + ...enhancedResult, }; } catch (error) { console.error('Fast path execution error:', error); @@ -352,14 +379,113 @@ export abstract class BasePRAgentWorkflow { } } + /** + * Smart change detection - analyzes files and returns only relevant enhanced features + */ + private async detectAndAnalyzeChangeTypes( + files: Array<{ path: string; diff: string; additions: number; deletions: number }>, + context: AgentContext + ): Promise<{ + testSuggestions?: TestSuggestion[]; + devOpsCostEstimates?: DevOpsCostEstimate[]; + coverageReport?: CoverageReport; + }> { + const result: { + testSuggestions?: TestSuggestion[]; + devOpsCostEstimates?: DevOpsCostEstimate[]; + coverageReport?: CoverageReport; + } = {}; + + // Categorize files by type + const codeFiles = files.filter(f => isCodeFile(f.path) && !isTestFile(f.path)); + const testFiles = files.filter(f => isTestFile(f.path)); + const devOpsFiles = files.filter(f => isDevOpsFile(f.path).isDevOps); + + console.log(`๐Ÿ“Š Change Analysis: ${codeFiles.length} code files, ${testFiles.length} test files, ${devOpsFiles.length} DevOps files`); + + // 1. Developer changes without tests โ†’ Test Suggestions + if (codeFiles.length > 0 && codeFiles.length > testFiles.length) { + console.log(`๐Ÿงช Detecting test suggestions for ${codeFiles.length} code files...`); + + const frameworkInfo = detectTestFramework(context.config?.repoPath as string || '.'); + const testSuggestions: TestSuggestion[] = []; + + for (const file of codeFiles) { + // Check if there's a corresponding test file in the PR + const baseName = file.path.replace(/\.[^/.]+$/, '').split('/').pop() || ''; + const hasTest = testFiles.some(t => + t.path.toLowerCase().includes(baseName.toLowerCase()) + ); + + if (!hasTest && file.additions > 5) { + // Extract function names from diff for better test generation + const functionMatches = file.diff.match(/(?:function|const|let|var|async)\s+(\w+)/g) || []; + const functionNames = functionMatches + .map(m => m.replace(/(?:function|const|let|var|async)\s+/, '')) + .filter(name => name.length > 2 && !['the', 'and', 'for'].includes(name)); + + const testCode = generateTestTemplate( + frameworkInfo.framework, + file.path, + file.diff, + functionNames.slice(0, 5) + ); + + testSuggestions.push({ + forFile: file.path, + testFramework: frameworkInfo.framework, + testCode, + description: `Suggested tests for new/modified code in ${file.path}`, + testFilePath: suggestTestFilePath(file.path, frameworkInfo.framework), + }); + } + } + + if (testSuggestions.length > 0) { + result.testSuggestions = testSuggestions; + console.log(`โœ… Generated ${testSuggestions.length} test suggestions`); + } + } + + // 2. DevOps/IaC changes โ†’ Cost Estimation + if (devOpsFiles.length > 0) { + console.log(`๐Ÿ’ฐ Analyzing DevOps costs for ${devOpsFiles.length} files...`); + + const costAnalysis = analyzeDevOpsFiles(devOpsFiles); + + if (costAnalysis.hasDevOpsChanges && costAnalysis.estimates.length > 0) { + result.devOpsCostEstimates = costAnalysis.estimates; + console.log(`โœ… Estimated costs for ${costAnalysis.estimates.length} resources (~$${costAnalysis.totalEstimatedCost.toFixed(2)}/month)`); + } + } + + // 3. Test/QA changes โ†’ Coverage Report (only if configured) + if (testFiles.length > 0 || codeFiles.length > 0) { + const coverageConfig = detectCoverageTool(context.config?.repoPath as string || '.'); + + if (coverageConfig.configured) { + console.log(`๐Ÿ“Š Checking coverage (${coverageConfig.tool} detected)...`); + + const coverage = readCoverageReport(context.config?.repoPath as string || '.'); + + if (coverage.available) { + result.coverageReport = coverage; + console.log(`โœ… Coverage: ${coverage.overallPercentage?.toFixed(1)}%`); + } + } + } + + return result; + } + // Workflow nodes private async analyzeFilesNode(state: typeof PRAgentState.State) { const { context } = state; const files = parseDiff(context.diff); - + console.log(`๐Ÿ” Analyzing ${files.length} files...`); - + // Show arch-docs status if available if (context.archDocs?.available) { console.log(`๐Ÿ“š Using architecture documentation (${context.archDocs.totalDocs} docs, ${context.archDocs.relevantDocs.length} relevant sections)`); @@ -375,9 +501,9 @@ export abstract class BasePRAgentWorkflow { // Analyze files in batches for detailed insights const filesToAnalyze = files.slice(0, 15); // Limit to 15 files for detailed analysis - const importantFiles = filesToAnalyze.filter(f => + const importantFiles = filesToAnalyze.filter(f => f.additions + f.deletions > 20 || // Significant changes - f.path.includes('config') || + f.path.includes('config') || f.path.includes('schema') || f.path.includes('migration') || f.path.includes('test') @@ -424,7 +550,7 @@ ${archDocsContext ? 'Each summary MUST reference the specific architecture docum const response = await this.model.invoke(fileDetailsPrompt); const content = response.content as string; - + // Track tokens const usage = (response.response_metadata as any)?.usage; const inputTokens = usage?.input_tokens || 0; @@ -435,7 +561,7 @@ ${archDocsContext ? 'Each summary MUST reference the specific architecture docum const jsonMatch = content.match(/\{[\s\S]*\}/); if (jsonMatch) { const detailedAnalyses = JSON.parse(jsonMatch[0]); - + // Apply detailed analysis to file analyses for (const file of importantFiles) { const detail = detailedAnalyses[file.path]; @@ -493,7 +619,7 @@ ${archDocsContext ? 'Each summary MUST reference the specific architecture docum const hasArchDocsContext = archDocsContext && archDocsContext.length > 0; const archDocsStages = hasArchDocsContext ? ['file-analysis'] : []; const archDocsInsights = []; - + if (hasArchDocsContext && context.archDocs?.available) { archDocsInsights.push(`Applied ${context.archDocs.relevantDocs.length} architecture documentation sections to analyze files in context of repository standards`); } @@ -509,13 +635,13 @@ ${archDocsContext ? 'Each summary MUST reference the specific architecture docum private async detectRisksNode(state: typeof PRAgentState.State) { const { context, fileAnalyses } = state; - + console.log('โš ๏ธ Detecting risks...'); // Build context for risk analysis const fileList = Array.from(fileAnalyses.entries()) .slice(0, 15) - .map(([path, analysis]) => + .map(([path, analysis]) => `${path} (+${analysis.changes.additions} -${analysis.changes.deletions})` ) .join('\n'); @@ -528,7 +654,7 @@ ${archDocsContext ? 'Each summary MUST reference the specific architecture docum let allDocs: any[] = []; let securityDoc: any = null; let patternsDoc: any = null; - + if (context.archDocs?.available) { allDocs = parseAllArchDocs(); const secDoc = getSecurityContext(allDocs); @@ -536,7 +662,7 @@ ${archDocsContext ? 'Each summary MUST reference the specific architecture docum securityContext = `\n## Security Guidelines from Repository Documentation\n\n${secDoc.substring(0, 3000)}\n`; securityDoc = allDocs.find(d => d.filename === 'security'); } - + // Also get patterns that might indicate risks const patterns = getPatternsContext(allDocs); if (patterns) { @@ -605,7 +731,7 @@ Only include risks that are actually present. If no significant risks, return an try { const response = await this.model.invoke(riskPrompt); const content = response.content as string; - + // Track tokens const usage = (response.response_metadata as any)?.usage; const inputTokens = usage?.input_tokens || 0; @@ -614,13 +740,13 @@ Only include risks that are actually present. If no significant risks, return an // Parse JSON response let risks: any[] = []; let hasArchDocsEnhancement = false; - + try { // Extract JSON from markdown code blocks if present const jsonMatch = content.match(/\[[\s\S]*\]/); if (jsonMatch) { const parsedRisks = JSON.parse(jsonMatch[0]); - + // Check if risks have arch-docs references if (parsedRisks.length > 0 && typeof parsedRisks[0] === 'object' && 'archDocsSource' in parsedRisks[0]) { // Transform to our RiskItem format @@ -668,7 +794,7 @@ Only include risks that are actually present. If no significant risks, return an patternRisks.push(riskDesc); } } - + if (fileAnalyses.size > 20) { const qualityDoc = allDocs.find(d => d.filename === 'code-quality'); if (qualityDoc && securityContext) { @@ -684,7 +810,7 @@ Only include risks that are actually present. If no significant risks, return an patternRisks.push(`Large change set (${fileAnalyses.size} files) - may be difficult to review thoroughly`); } } - + if (context.diff.includes('DROP TABLE') || context.diff.includes('ALTER TABLE')) { if (securityContext) { patternRisks.push({ @@ -713,7 +839,7 @@ Only include risks that are actually present. If no significant risks, return an // Track arch-docs usage in risk detection const archDocsStages = securityContext ? ['risk-detection'] : []; const archDocsInsights = []; - + if (securityContext && context.archDocs?.available) { const enhancedCount = allRisks.filter(r => typeof r === 'object' && r.archDocsReference).length; if (enhancedCount > 0) { @@ -732,7 +858,7 @@ Only include risks that are actually present. If no significant risks, return an }; } catch (error) { console.error('Error in risk detection:', error); - + // Fallback to basic pattern matching const basicRisks: string[] = []; if (context.diff.includes('password') || context.diff.includes('secret')) { @@ -752,7 +878,7 @@ Only include risks that are actually present. If no significant risks, return an private async calculateComplexityNode(state: typeof PRAgentState.State) { const { fileAnalyses, context } = state; - + console.log('๐Ÿ“Š Calculating complexity...'); const complexities = Array.from(fileAnalyses.values()).map(f => f.complexity); @@ -763,7 +889,7 @@ Only include risks that are actually present. If no significant risks, return an // Track arch-docs influence on complexity const archDocsStages = context.archDocs?.available ? ['complexity-calculation'] : []; const archDocsInsights = []; - + if (context.archDocs?.available) { // Check if patterns documentation helped understand complexity const allDocs = parseAllArchDocs(); @@ -783,7 +909,7 @@ Only include risks that are actually present. If no significant risks, return an private async generateSummaryNode(state: typeof PRAgentState.State) { const { context, fileAnalyses, currentRisks, currentComplexity } = state; - + console.log('๐Ÿ“ Generating detailed summary...'); const totalFiles = fileAnalyses.size; @@ -793,7 +919,7 @@ Only include risks that are actually present. If no significant risks, return an // Build file list with changes const fileList = Array.from(fileAnalyses.entries()) .slice(0, 20) - .map(([path, analysis]) => + .map(([path, analysis]) => `- ${path}: +${analysis.changes.additions} -${analysis.changes.deletions} (complexity: ${analysis.complexity}/5)` ) .join('\n'); @@ -848,7 +974,7 @@ Provide a detailed, well-structured summary (3-5 paragraphs) that would help a r // Track arch-docs usage in summary const archDocsStages = patternsContext ? ['summary-generation'] : []; const archDocsInsights = []; - + if (patternsContext && context.archDocs?.available) { archDocsInsights.push(`Generated summary aligned with repository architecture and established patterns`); } @@ -882,7 +1008,7 @@ ${context.title ? `Title: ${context.title}` : ''}`; private async evaluateQualityNode(state: typeof PRAgentState.State) { const { iteration } = state; - + console.log(`๐Ÿ” Evaluating quality (iteration ${iteration + 1})...`); // Simple quality check @@ -897,20 +1023,20 @@ ${context.title ? `Title: ${context.title}` : ''}`; private async refineAnalysisNode(state: typeof PRAgentState.State) { const { currentSummary, currentRisks, fileAnalyses, context } = state; - + console.log('๐Ÿ”„ Refining analysis...'); // Build arch-docs context for refinement let archDocsRefinementContext = ''; if (context.archDocs?.available) { const allDocs = parseAllArchDocs(); - + // Get recommendations from arch-docs const recommendationsDoc = allDocs.find(d => d.filename === 'recommendations'); if (recommendationsDoc) { archDocsRefinementContext += `\n## Repository Improvement Guidelines\n\n${recommendationsDoc.content.substring(0, 2000)}\n`; } - + // Get code quality guidelines const qualityDoc = allDocs.find(d => d.filename === 'code-quality'); if (qualityDoc) { @@ -953,7 +1079,7 @@ Provide a JSON array of 3-5 specific, actionable recommendations: try { const response = await this.model.invoke(refinementPrompt); const content = response.content as string; - + // Track tokens const usage = (response.response_metadata as any)?.usage; const inputTokens = usage?.input_tokens || 0; @@ -988,7 +1114,7 @@ Provide a JSON array of 3-5 specific, actionable recommendations: // Track arch-docs usage in refinement const archDocsStages = archDocsRefinementContext ? ['refinement'] : []; const archDocsInsights = []; - + if (archDocsRefinementContext && context.archDocs?.available) { archDocsInsights.push(`Generated ${recommendations.length} recommendations based on repository quality standards and KPIs`); } @@ -1016,7 +1142,7 @@ Provide a JSON array of 3-5 specific, actionable recommendations: private async finalizeNode(state: typeof PRAgentState.State) { console.log('โœจ Finalizing analysis...'); - + return state; } diff --git a/src/cli/commands/analyze.command.ts b/src/cli/commands/analyze.command.ts index ba82f01..f03685a 100644 --- a/src/cli/commands/analyze.command.ts +++ b/src/cli/commands/analyze.command.ts @@ -261,7 +261,7 @@ export async function analyzePR(options: AnalyzeOptions = {}): Promise { } throw error; } - + // Get provider and API key from config or environment if (options.verbose) { console.log(chalk.gray(` Debug: options.provider: ${options.provider || 'undefined'}`)); @@ -269,7 +269,7 @@ export async function analyzePR(options: AnalyzeOptions = {}): Promise { } const provider = (options.provider || config.ai?.provider || 'anthropic').toLowerCase() as 'anthropic' | 'openai' | 'google'; const apiKey = getApiKey(provider, config); - + if (!apiKey) { spinner.fail('No API key found'); console.error(chalk.yellow('๐Ÿ’ก Please set it in one of these ways:')); @@ -280,7 +280,7 @@ export async function analyzePR(options: AnalyzeOptions = {}): Promise { console.error(chalk.gray(' - Google (Gemini): export GOOGLE_API_KEY="your-api-key"')); process.exit(1); } - + spinner.succeed(`Using AI provider: ${provider}`); // Resolve default branch if needed @@ -293,13 +293,13 @@ export async function analyzePR(options: AnalyzeOptions = {}): Promise { githubToken: process.env.GITHUB_TOKEN, fallbackToGit: true, }); - + defaultBranch = branchResult.branch; - + if (branchResult.warning && options.verbose) { console.log(chalk.yellow(`\nโš ๏ธ ${branchResult.warning}`)); } - + if (options.verbose) { console.log(chalk.gray(` Using branch: ${defaultBranch} (source: ${branchResult.source})`)); } @@ -390,7 +390,7 @@ export async function analyzePR(options: AnalyzeOptions = {}): Promise { // Check for arch-docs const useArchDocs = options.archDocs !== false; // Default to true if not specified const hasArchDocs = archDocsExists(); - + if (useArchDocs && hasArchDocs) { console.log(chalk.cyan('๐Ÿ“š Architecture documentation detected - including in analysis\n')); } else if (options.archDocs && !hasArchDocs) { @@ -412,7 +412,7 @@ export async function analyzePR(options: AnalyzeOptions = {}): Promise { displayAgentResults(result, mode, options.verbose || false); } catch (error: any) { spinner.fail('Analysis failed'); - + // Handle specific error types with user-friendly messages if (error instanceof ConfigurationError) { console.error(chalk.red(`\nโŒ Configuration Error: ${error.message}`)); @@ -441,7 +441,7 @@ export async function analyzePR(options: AnalyzeOptions = {}): Promise { .replace(/sk-[a-zA-Z0-9_-]+/g, 'sk-***') .replace(/ghp_[a-zA-Z0-9]+/g, 'ghp_***') .substring(0, 500); // Limit length - + console.error(chalk.red(`\nโŒ Error: ${sanitizedMessage}`)); if (options.verbose && error.stack) { console.error(chalk.gray('\nStack trace:')); @@ -579,23 +579,23 @@ function displayAgentResults(result: any, mode: AnalysisMode, verbose: boolean): if (result.archDocsImpact?.used) { console.log(chalk.gray('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”')); console.log(chalk.blue.bold('\n๐Ÿ“š Architecture Documentation Impact\n')); - + console.log(chalk.white(`Documents analyzed: ${result.archDocsImpact.docsAvailable}`)); console.log(chalk.white(`Relevant sections used: ${result.archDocsImpact.sectionsUsed}\n`)); - + if (result.archDocsImpact.influencedStages.length > 0) { console.log(chalk.cyan('Stages influenced by arch-docs:')); result.archDocsImpact.influencedStages.forEach((stage: string) => { const stageEmoji = stage === 'file-analysis' ? '๐Ÿ”' : - stage === 'risk-detection' ? 'โš ๏ธ' : - stage === 'complexity-calculation' ? '๐Ÿ“Š' : - stage === 'summary-generation' ? '๐Ÿ“' : - stage === 'refinement' ? '๐Ÿ”„' : 'โœจ'; + stage === 'risk-detection' ? 'โš ๏ธ' : + stage === 'complexity-calculation' ? '๐Ÿ“Š' : + stage === 'summary-generation' ? '๐Ÿ“' : + stage === 'refinement' ? '๐Ÿ”„' : 'โœจ'; console.log(chalk.white(` ${stageEmoji} ${stage}`)); }); console.log(''); } - + if (result.archDocsImpact.keyInsights.length > 0) { console.log(chalk.cyan('Key insights from arch-docs integration:\n')); result.archDocsImpact.keyInsights.forEach((insight: string, i: number) => { @@ -609,6 +609,83 @@ function displayAgentResults(result: any, mode: AnalysisMode, verbose: boolean): console.log(chalk.gray(`\nTotal tokens used: ${result.totalTokensUsed.toLocaleString()}`)); } + // Show test suggestions if available + if (result.testSuggestions && result.testSuggestions.length > 0) { + console.log(chalk.gray('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”')); + console.log(chalk.yellow.bold(`\n๐Ÿงช Test Suggestions (${result.testSuggestions.length} files need tests)\n`)); + + for (const suggestion of result.testSuggestions) { + console.log(chalk.cyan(` ๐Ÿ“ ${suggestion.forFile}`)); + console.log(chalk.gray(` Framework: ${suggestion.testFramework}`)); + if (suggestion.testFilePath) { + console.log(chalk.gray(` Suggested test file: ${suggestion.testFilePath}`)); + } + console.log(chalk.white(` ${suggestion.description}\n`)); + + if (suggestion.testCode) { + console.log(chalk.gray(' โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€')); + const codeLines = suggestion.testCode.split('\n').slice(0, 10); + codeLines.forEach((line: string) => { + console.log(chalk.gray(' โ”‚ ') + chalk.white(line)); + }); + if (suggestion.testCode.split('\n').length > 10) { + console.log(chalk.gray(' โ”‚ ... (copy full code below)')); + } + console.log(chalk.gray(' โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n')); + } + } + } + + // Show coverage report if available + if (result.coverageReport && result.coverageReport.available) { + console.log(chalk.gray('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”')); + console.log(chalk.green.bold('\n๐Ÿ“Š Test Coverage Report\n')); + + const coverage = result.coverageReport; + if (coverage.overallPercentage !== undefined) { + const emoji = coverage.overallPercentage >= 80 ? '๐ŸŸข' : coverage.overallPercentage >= 60 ? '๐ŸŸก' : '๐Ÿ”ด'; + console.log(chalk.white(` ${emoji} Overall Coverage: ${coverage.overallPercentage.toFixed(1)}%`)); + } + + if (coverage.lineCoverage !== undefined) { + console.log(chalk.gray(` Lines: ${coverage.lineCoverage.toFixed(1)}%`)); + } + + if (coverage.branchCoverage !== undefined) { + console.log(chalk.gray(` Branches: ${coverage.branchCoverage.toFixed(1)}%`)); + } + + if (coverage.delta !== undefined) { + const deltaEmoji = coverage.delta >= 0 ? '๐Ÿ“ˆ' : '๐Ÿ“‰'; + const deltaColor = coverage.delta >= 0 ? chalk.green : chalk.red; + console.log(deltaColor(` ${deltaEmoji} Coverage Delta: ${coverage.delta >= 0 ? '+' : ''}${coverage.delta.toFixed(1)}%`)); + } + + if (coverage.coverageTool) { + console.log(chalk.gray(`\n Tool: ${coverage.coverageTool}`)); + } + console.log(''); + } + + // Show DevOps cost estimates if available + if (result.devOpsCostEstimates && result.devOpsCostEstimates.length > 0) { + console.log(chalk.gray('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”')); + console.log(chalk.yellow.bold('\n๐Ÿ’ฐ AWS Cost Estimates\n')); + + let totalCost = 0; + for (const estimate of result.devOpsCostEstimates) { + const emoji = estimate.confidence === 'high' ? '๐ŸŸข' : estimate.confidence === 'medium' ? '๐ŸŸก' : '๐Ÿ”ด'; + console.log(chalk.white(` ${emoji} ${estimate.resourceType.toUpperCase()}: ~$${estimate.estimatedNewCost.toFixed(2)}/month`)); + if (estimate.details) { + console.log(chalk.gray(` ${estimate.details}`)); + } + totalCost += estimate.estimatedNewCost; + } + + console.log(chalk.cyan.bold(`\n ๐Ÿ“Š Total Estimated Impact: ~$${totalCost.toFixed(2)}/month`)); + console.log(chalk.gray('\n โš ๏ธ Estimates are approximate. Actual costs depend on usage and configuration.\n')); + } + console.log(chalk.gray('\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n')); } diff --git a/src/tools/coverage-reporter.ts b/src/tools/coverage-reporter.ts new file mode 100644 index 0000000..fbded56 --- /dev/null +++ b/src/tools/coverage-reporter.ts @@ -0,0 +1,341 @@ +/** + * Coverage Reporter Tool for PR Analysis + * Reads coverage reports and extracts metrics when coverage tool is configured + */ + +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +import fs from 'node:fs'; +import path from 'node:path'; +import { CoverageReport } from '../types/agent.types.js'; + +// Common coverage file locations +const COVERAGE_PATHS = { + jest: ['coverage/coverage-summary.json', 'coverage/lcov.info', 'coverage/coverage-final.json'], + nyc: ['coverage/coverage-summary.json', '.nyc_output/coverage.json', 'coverage/lcov.info'], + vitest: ['coverage/coverage-summary.json', 'coverage/lcov.info'], + pytest: ['coverage.xml', 'htmlcov/coverage.json', '.coverage'], + generic: ['coverage.json', 'coverage/lcov.info', 'coverage.xml'], +}; + +/** + * Detect if coverage tool is configured in the project + */ +export function detectCoverageTool(repoPath: string = '.'): { + tool: string | null; + configured: boolean; + coveragePath?: string; +} { + const packageJsonPath = path.join(repoPath, 'package.json'); + + // Check for Node.js project with coverage config + if (fs.existsSync(packageJsonPath)) { + try { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); + + // Check Jest config + if (packageJson.jest?.collectCoverage || packageJson.jest?.coverageDirectory) { + return { tool: 'jest', configured: true }; + } + + // Check for coverage scripts + const scripts = packageJson.scripts || {}; + const hasCoverageScript = Object.values(scripts).some((script: unknown) => + typeof script === 'string' && (script.includes('--coverage') || script.includes('nyc')) + ); + + if (hasCoverageScript) { + // Determine which tool + const deps = { ...packageJson.dependencies, ...packageJson.devDependencies }; + if (deps.jest) return { tool: 'jest', configured: true }; + if (deps.nyc || deps['istanbul']) return { tool: 'nyc', configured: true }; + if (deps.vitest) return { tool: 'vitest', configured: true }; + if (deps.c8) return { tool: 'c8', configured: true }; + return { tool: 'node', configured: true }; + } + } catch (e) { + // Ignore parse errors + } + } + + // Check for Jest config file + if (fs.existsSync(path.join(repoPath, 'jest.config.js')) || fs.existsSync(path.join(repoPath, 'jest.config.ts'))) { + try { + const configPath = fs.existsSync(path.join(repoPath, 'jest.config.js')) + ? path.join(repoPath, 'jest.config.js') + : path.join(repoPath, 'jest.config.ts'); + const content = fs.readFileSync(configPath, 'utf-8'); + if (content.includes('collectCoverage') || content.includes('coverageDirectory')) { + return { tool: 'jest', configured: true }; + } + } catch (e) { + // Ignore read errors + } + } + + // Check for Python coverage + const setupCfg = path.join(repoPath, 'setup.cfg'); + const pyprojectToml = path.join(repoPath, 'pyproject.toml'); + + if (fs.existsSync(setupCfg)) { + try { + const content = fs.readFileSync(setupCfg, 'utf-8'); + if (content.includes('[coverage:') || content.includes('coverage')) { + return { tool: 'pytest-cov', configured: true }; + } + } catch (e) { + // Ignore read errors + } + } + + if (fs.existsSync(pyprojectToml)) { + try { + const content = fs.readFileSync(pyprojectToml, 'utf-8'); + if (content.includes('[tool.coverage]') || content.includes('pytest-cov')) { + return { tool: 'pytest-cov', configured: true }; + } + } catch (e) { + // Ignore read errors + } + } + + return { tool: null, configured: false }; +} + +/** + * Find existing coverage report files + */ +export function findCoverageFiles(repoPath: string = '.'): string[] { + const foundFiles: string[] = []; + + for (const paths of Object.values(COVERAGE_PATHS)) { + for (const coveragePath of paths) { + const fullPath = path.join(repoPath, coveragePath); + if (fs.existsSync(fullPath)) { + foundFiles.push(fullPath); + } + } + } + + return [...new Set(foundFiles)]; // Remove duplicates +} + +/** + * Parse Jest/NYC coverage-summary.json format + */ +function parseJestCoverageSummary(filePath: string): CoverageReport | null { + try { + const content = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + const total = content.total; + + if (!total) return null; + + const fileBreakdown: CoverageReport['fileBreakdown'] = []; + + for (const [file, data] of Object.entries(content)) { + if (file === 'total') continue; + const fileData = data as { lines?: { pct: number }; branches?: { pct: number } }; + fileBreakdown.push({ + file, + lineCoverage: fileData.lines?.pct || 0, + branchCoverage: fileData.branches?.pct, + }); + } + + return { + available: true, + overallPercentage: total.lines?.pct || total.statements?.pct || 0, + lineCoverage: total.lines?.pct, + branchCoverage: total.branches?.pct, + fileBreakdown: fileBreakdown.slice(0, 20), // Limit to 20 files + coverageTool: 'jest/nyc', + }; + } catch (e) { + return null; + } +} + +/** + * Parse LCOV format + */ +function parseLcov(filePath: string): CoverageReport | null { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + const files: Array<{ file: string; linesHit: number; linesTotal: number }> = []; + let currentFile = ''; + let linesHit = 0; + let linesTotal = 0; + + for (const line of content.split('\n')) { + if (line.startsWith('SF:')) { + currentFile = line.substring(3); + linesHit = 0; + linesTotal = 0; + } else if (line.startsWith('LH:')) { + linesHit = parseInt(line.substring(3), 10); + } else if (line.startsWith('LF:')) { + linesTotal = parseInt(line.substring(3), 10); + } else if (line === 'end_of_record' && currentFile) { + files.push({ file: currentFile, linesHit, linesTotal }); + currentFile = ''; + } + } + + const totalHit = files.reduce((sum, f) => sum + f.linesHit, 0); + const totalLines = files.reduce((sum, f) => sum + f.linesTotal, 0); + const overallPercentage = totalLines > 0 ? (totalHit / totalLines) * 100 : 0; + + return { + available: true, + overallPercentage: Math.round(overallPercentage * 100) / 100, + lineCoverage: overallPercentage, + fileBreakdown: files.slice(0, 20).map(f => ({ + file: f.file, + lineCoverage: f.linesTotal > 0 ? (f.linesHit / f.linesTotal) * 100 : 0, + })), + coverageTool: 'lcov', + }; + } catch (e) { + return null; + } +} + +/** + * Parse Cobertura XML format + */ +function parseCobertura(filePath: string): CoverageReport | null { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + + // Simple regex parsing for line-rate attribute + const lineRateMatch = content.match(/line-rate="([0-9.]+)"/); + const branchRateMatch = content.match(/branch-rate="([0-9.]+)"/); + + if (!lineRateMatch) return null; + + const lineRate = parseFloat(lineRateMatch[1]) * 100; + const branchRate = branchRateMatch ? parseFloat(branchRateMatch[1]) * 100 : undefined; + + return { + available: true, + overallPercentage: Math.round(lineRate * 100) / 100, + lineCoverage: lineRate, + branchCoverage: branchRate, + coverageTool: 'cobertura', + }; + } catch (e) { + return null; + } +} + +/** + * Read and parse coverage report + */ +export function readCoverageReport(repoPath: string = '.'): CoverageReport { + const coverageFiles = findCoverageFiles(repoPath); + + if (coverageFiles.length === 0) { + return { available: false }; + } + + // Try to parse each file type + for (const filePath of coverageFiles) { + const fileName = path.basename(filePath); + + if (fileName === 'coverage-summary.json' || fileName === 'coverage.json') { + const report = parseJestCoverageSummary(filePath); + if (report) return report; + } + + if (fileName === 'lcov.info' || fileName.endsWith('.lcov')) { + const report = parseLcov(filePath); + if (report) return report; + } + + if (fileName === 'coverage.xml' || fileName.endsWith('cobertura.xml')) { + const report = parseCobertura(filePath); + if (report) return report; + } + } + + return { available: false }; +} + +/** + * Create coverage reporter tool + */ +export function createCoverageReporterTool() { + return new DynamicStructuredTool({ + name: 'report_coverage', + description: 'Read test coverage reports and extract metrics (only if coverage tool is configured)', + schema: z.object({ + repoPath: z.string().optional().describe('Repository path to check for coverage'), + forceRead: z.boolean().optional().describe('Force reading coverage even if not configured'), + }), + func: async ({ repoPath, forceRead }: { repoPath?: string; forceRead?: boolean }) => { + const projectPath = repoPath || '.'; + + // Check if coverage tool is configured + const toolConfig = detectCoverageTool(projectPath); + + if (!toolConfig.configured && !forceRead) { + return JSON.stringify({ + available: false, + reason: 'No coverage tool configured in project', + configured: false, + }); + } + + // Try to read coverage report + const report = readCoverageReport(projectPath); + + return JSON.stringify({ + ...report, + configured: toolConfig.configured, + tool: toolConfig.tool, + }); + }, + }); +} + +/** + * Format coverage report for display + */ +export function formatCoverageReport(report: CoverageReport): string { + if (!report.available) { + return 'No coverage data available'; + } + + let output = ''; + + if (report.overallPercentage !== undefined) { + const emoji = report.overallPercentage >= 80 ? '๐ŸŸข' : report.overallPercentage >= 60 ? '๐ŸŸก' : '๐Ÿ”ด'; + output += `${emoji} Overall Coverage: ${report.overallPercentage.toFixed(1)}%\n`; + } + + if (report.lineCoverage !== undefined) { + output += ` Lines: ${report.lineCoverage.toFixed(1)}%\n`; + } + + if (report.branchCoverage !== undefined) { + output += ` Branches: ${report.branchCoverage.toFixed(1)}%\n`; + } + + if (report.delta !== undefined) { + const deltaEmoji = report.delta >= 0 ? '๐Ÿ“ˆ' : '๐Ÿ“‰'; + output += `${deltaEmoji} Coverage Delta: ${report.delta >= 0 ? '+' : ''}${report.delta.toFixed(1)}%\n`; + } + + if (report.fileBreakdown && report.fileBreakdown.length > 0) { + output += '\nFile Breakdown:\n'; + for (const file of report.fileBreakdown.slice(0, 10)) { + const emoji = file.lineCoverage >= 80 ? 'โœ…' : file.lineCoverage >= 60 ? 'โš ๏ธ' : 'โŒ'; + output += ` ${emoji} ${path.basename(file.file)}: ${file.lineCoverage.toFixed(1)}%\n`; + } + if (report.fileBreakdown.length > 10) { + output += ` ... and ${report.fileBreakdown.length - 10} more files\n`; + } + } + + return output; +} diff --git a/src/tools/devops-cost-estimator.ts b/src/tools/devops-cost-estimator.ts new file mode 100644 index 0000000..4602f88 --- /dev/null +++ b/src/tools/devops-cost-estimator.ts @@ -0,0 +1,371 @@ +/** + * DevOps Cost Estimator Tool for PR Analysis + * Estimates AWS infrastructure costs for DevOps-related changes (IaC, Dockerfiles, etc.) + * Uses MCP to connect to AWS for cost estimation when available + */ + +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +import fs from 'node:fs'; +import path from 'node:path'; +import { DevOpsCostEstimate } from '../types/agent.types.js'; + +// DevOps file patterns +const DEVOPS_PATTERNS = { + terraform: [/\.tf$/, /\.tfvars$/], + cloudformation: [/template\.(yaml|yml|json)$/, /cloudformation\.(yaml|yml|json)$/], + cdk: [/cdk\.json$/, /\.ts$.*cdk/], + pulumi: [/Pulumi\.(yaml|yml)$/, /pulumi\..*\.(ts|js|py|go)$/], + docker: [/Dockerfile/, /docker-compose\.(yaml|yml)$/], + kubernetes: [/k8s.*\.(yaml|yml)$/, /kubernetes.*\.(yaml|yml)$/, /\.kube.*\.(yaml|yml)$/], + github_actions: [/\.github\/workflows\/.*\.(yaml|yml)$/], + serverless: [/serverless\.(yaml|yml|json)$/], +}; + +// AWS resource cost estimates (monthly USD, approximate) +const AWS_RESOURCE_COSTS: Record = { + 'ec2-t3.micro': { min: 8, typical: 8.5, max: 10 }, + 'ec2-t3.small': { min: 15, typical: 17, max: 20 }, + 'ec2-t3.medium': { min: 30, typical: 34, max: 40 }, + 'ec2-t3.large': { min: 60, typical: 68, max: 80 }, + 'ec2-m5.large': { min: 70, typical: 80, max: 95 }, + 'ec2-m5.xlarge': { min: 140, typical: 160, max: 190 }, + 'lambda-1m-invocations': { min: 0.2, typical: 0.4, max: 2 }, + 'lambda-10m-invocations': { min: 2, typical: 4, max: 20 }, + 's3-storage-gb': { min: 0.023, typical: 0.023, max: 0.025 }, + 's3-requests-1k': { min: 0.004, typical: 0.005, max: 0.006 }, + 'rds-db.t3.micro': { min: 13, typical: 15, max: 18 }, + 'rds-db.t3.small': { min: 26, typical: 30, max: 35 }, + 'rds-db.t3.medium': { min: 52, typical: 60, max: 70 }, + 'rds-db.m5.large': { min: 140, typical: 160, max: 190 }, + 'ecs-task-256cpu-512mem': { min: 10, typical: 12, max: 15 }, + 'ecs-task-512cpu-1024mem': { min: 20, typical: 24, max: 30 }, + 'ecs-task-1024cpu-2048mem': { min: 40, typical: 48, max: 60 }, + 'alb': { min: 16, typical: 22, max: 30 }, + 'nat-gateway': { min: 32, typical: 45, max: 60 }, + 'elasticache-t3.micro': { min: 12, typical: 15, max: 18 }, + 'cloudfront-1tb': { min: 85, typical: 100, max: 120 }, + 'api-gateway-1m-requests': { min: 3.5, typical: 4, max: 5 }, + 'sqs-1m-requests': { min: 0.4, typical: 0.5, max: 0.6 }, + 'sns-1m-notifications': { min: 0.5, typical: 0.6, max: 0.7 }, + 'dynamodb-25wcu-25rcu': { min: 25, typical: 30, max: 40 }, +}; + +/** + * Check if a file is a DevOps-related file + */ +export function isDevOpsFile(filePath: string): { isDevOps: boolean; type: string | null } { + for (const [type, patterns] of Object.entries(DEVOPS_PATTERNS)) { + for (const pattern of patterns) { + if (pattern.test(filePath)) { + return { isDevOps: true, type }; + } + } + } + return { isDevOps: false, type: null }; +} + +/** + * Extract AWS resources from Terraform content + */ +function extractTerraformResources(content: string): Array<{ resource: string; type: string }> { + const resources: Array<{ resource: string; type: string }> = []; + + // Match resource blocks + const resourceRegex = /resource\s+"([^"]+)"\s+"([^"]+)"/g; + let match; + + while ((match = resourceRegex.exec(content)) !== null) { + const resourceType = match[1]; + const resourceName = match[2]; + + // Map Terraform resources to our cost categories + if (resourceType.startsWith('aws_instance')) { + resources.push({ resource: resourceName, type: 'ec2' }); + } else if (resourceType.startsWith('aws_lambda')) { + resources.push({ resource: resourceName, type: 'lambda' }); + } else if (resourceType.startsWith('aws_s3')) { + resources.push({ resource: resourceName, type: 's3' }); + } else if (resourceType.startsWith('aws_rds') || resourceType.startsWith('aws_db')) { + resources.push({ resource: resourceName, type: 'rds' }); + } else if (resourceType.startsWith('aws_ecs')) { + resources.push({ resource: resourceName, type: 'ecs' }); + } else if (resourceType.startsWith('aws_alb') || resourceType.startsWith('aws_lb')) { + resources.push({ resource: resourceName, type: 'alb' }); + } else if (resourceType.startsWith('aws_nat')) { + resources.push({ resource: resourceName, type: 'nat-gateway' }); + } else if (resourceType.startsWith('aws_elasticache')) { + resources.push({ resource: resourceName, type: 'elasticache' }); + } else if (resourceType.startsWith('aws_cloudfront')) { + resources.push({ resource: resourceName, type: 'cloudfront' }); + } else if (resourceType.startsWith('aws_api_gateway') || resourceType.startsWith('aws_apigatewayv2')) { + resources.push({ resource: resourceName, type: 'api-gateway' }); + } else if (resourceType.startsWith('aws_sqs')) { + resources.push({ resource: resourceName, type: 'sqs' }); + } else if (resourceType.startsWith('aws_sns')) { + resources.push({ resource: resourceName, type: 'sns' }); + } else if (resourceType.startsWith('aws_dynamodb')) { + resources.push({ resource: resourceName, type: 'dynamodb' }); + } + } + + return resources; +} + +/** + * Extract AWS resources from CloudFormation content + */ +function extractCloudFormationResources(content: string): Array<{ resource: string; type: string }> { + const resources: Array<{ resource: string; type: string }> = []; + + // Simple pattern matching for CFN resources + const typeMap: Record = { + 'AWS::EC2::Instance': 'ec2', + 'AWS::Lambda::Function': 'lambda', + 'AWS::S3::Bucket': 's3', + 'AWS::RDS::DBInstance': 'rds', + 'AWS::ECS::Service': 'ecs', + 'AWS::ECS::TaskDefinition': 'ecs', + 'AWS::ElasticLoadBalancingV2::LoadBalancer': 'alb', + 'AWS::EC2::NatGateway': 'nat-gateway', + 'AWS::ElastiCache::CacheCluster': 'elasticache', + 'AWS::CloudFront::Distribution': 'cloudfront', + 'AWS::ApiGateway::RestApi': 'api-gateway', + 'AWS::ApiGatewayV2::Api': 'api-gateway', + 'AWS::SQS::Queue': 'sqs', + 'AWS::SNS::Topic': 'sns', + 'AWS::DynamoDB::Table': 'dynamodb', + }; + + for (const [awsType, costType] of Object.entries(typeMap)) { + if (content.includes(awsType)) { + // Try to extract logical ID + const regex = new RegExp(`(\\w+):\\s*\\n\\s*Type:\\s*['"]?${awsType.replace(/::/g, '::')}`, 'g'); + const matches = content.matchAll(regex); + for (const match of matches) { + resources.push({ resource: match[1] || costType, type: costType }); + } + // Fallback if no match found but type exists + if (resources.filter(r => r.type === costType).length === 0) { + resources.push({ resource: costType, type: costType }); + } + } + } + + return resources; +} + +/** + * Estimate cost for a resource type + */ +function estimateResourceCost(resourceType: string): DevOpsCostEstimate { + // Find matching cost entry + let costKey = ''; + let confidence: 'high' | 'medium' | 'low' = 'low'; + + switch (resourceType) { + case 'ec2': + costKey = 'ec2-t3.medium'; + confidence = 'medium'; + break; + case 'lambda': + costKey = 'lambda-1m-invocations'; + confidence = 'low'; + break; + case 's3': + costKey = 's3-storage-gb'; + confidence = 'low'; + break; + case 'rds': + costKey = 'rds-db.t3.small'; + confidence = 'medium'; + break; + case 'ecs': + costKey = 'ecs-task-512cpu-1024mem'; + confidence = 'medium'; + break; + case 'alb': + costKey = 'alb'; + confidence = 'high'; + break; + case 'nat-gateway': + costKey = 'nat-gateway'; + confidence = 'high'; + break; + case 'elasticache': + costKey = 'elasticache-t3.micro'; + confidence = 'medium'; + break; + case 'cloudfront': + costKey = 'cloudfront-1tb'; + confidence = 'low'; + break; + case 'api-gateway': + costKey = 'api-gateway-1m-requests'; + confidence = 'low'; + break; + case 'sqs': + costKey = 'sqs-1m-requests'; + confidence = 'low'; + break; + case 'sns': + costKey = 'sns-1m-notifications'; + confidence = 'low'; + break; + case 'dynamodb': + costKey = 'dynamodb-25wcu-25rcu'; + confidence = 'low'; + break; + default: + return { + resource: resourceType, + resourceType, + estimatedNewCost: 0, + confidence: 'low', + details: 'Unknown resource type - manual estimation required', + }; + } + + const cost = AWS_RESOURCE_COSTS[costKey]; + if (!cost) { + return { + resource: resourceType, + resourceType, + estimatedNewCost: 0, + confidence: 'low', + details: 'Cost data not available', + }; + } + + return { + resource: resourceType, + resourceType, + estimatedNewCost: cost.typical, + confidence, + details: `Estimated $${cost.min.toFixed(2)} - $${cost.max.toFixed(2)}/month`, + }; +} + +/** + * Analyze DevOps files and estimate costs + */ +export function analyzeDevOpsFiles(files: Array<{ path: string; diff: string }>): { + hasDevOpsChanges: boolean; + fileTypes: string[]; + estimates: DevOpsCostEstimate[]; + totalEstimatedCost: number; +} { + const devOpsFiles = files.filter(f => isDevOpsFile(f.path).isDevOps); + + if (devOpsFiles.length === 0) { + return { + hasDevOpsChanges: false, + fileTypes: [], + estimates: [], + totalEstimatedCost: 0, + }; + } + + const fileTypes = new Set(); + const allResources: Array<{ resource: string; type: string }> = []; + + for (const file of devOpsFiles) { + const { type } = isDevOpsFile(file.path); + if (type) fileTypes.add(type); + + // Get the full content (in real scenario, we'd read the file) + // For now, analyze the diff + const content = file.diff; + + if (type === 'terraform') { + allResources.push(...extractTerraformResources(content)); + } else if (type === 'cloudformation') { + allResources.push(...extractCloudFormationResources(content)); + } + // Add more extractors for other IaC types as needed + } + + // Estimate costs for each resource + const estimates: DevOpsCostEstimate[] = []; + const seenTypes = new Set(); + + for (const resource of allResources) { + if (!seenTypes.has(resource.type)) { + seenTypes.add(resource.type); + estimates.push(estimateResourceCost(resource.type)); + } + } + + const totalEstimatedCost = estimates.reduce((sum, e) => sum + e.estimatedNewCost, 0); + + return { + hasDevOpsChanges: true, + fileTypes: Array.from(fileTypes), + estimates, + totalEstimatedCost, + }; +} + +/** + * Create DevOps cost estimator tool + */ +export function createDevOpsCostEstimatorTool() { + return new DynamicStructuredTool({ + name: 'estimate_devops_costs', + description: 'Analyze DevOps/IaC files and estimate AWS infrastructure costs', + schema: z.object({ + files: z.array(z.object({ + path: z.string(), + diff: z.string(), + })).describe('Array of changed files to analyze'), + awsCredentials: z.object({ + accessKeyId: z.string().optional(), + secretAccessKey: z.string().optional(), + region: z.string().optional(), + }).optional().describe('AWS credentials for live cost lookup (optional)'), + }), + func: async ({ files }: { files: Array<{ path: string; diff: string }>; awsCredentials?: { accessKeyId?: string; secretAccessKey?: string; region?: string } }) => { + const analysis = analyzeDevOpsFiles(files); + + if (!analysis.hasDevOpsChanges) { + return JSON.stringify({ + hasDevOpsChanges: false, + message: 'No DevOps/IaC files detected in changes', + }); + } + + return JSON.stringify({ + hasDevOpsChanges: true, + fileTypes: analysis.fileTypes, + estimates: analysis.estimates, + totalEstimatedCost: analysis.totalEstimatedCost, + message: `Detected ${analysis.fileTypes.join(', ')} changes. Estimated monthly cost impact: $${analysis.totalEstimatedCost.toFixed(2)}`, + disclaimer: 'Cost estimates are approximate and based on typical resource sizes. Actual costs depend on usage patterns, region, and specific configurations.', + }); + }, + }); +} + +/** + * Format cost estimates for display + */ +export function formatCostEstimates(estimates: DevOpsCostEstimate[], totalCost: number): string { + if (estimates.length === 0) { + return 'No cost estimates available'; + } + + let output = '๐Ÿ’ฐ AWS Cost Estimates\n\n'; + + for (const estimate of estimates) { + const emoji = estimate.confidence === 'high' ? '๐ŸŸข' : estimate.confidence === 'medium' ? '๐ŸŸก' : '๐Ÿ”ด'; + output += `${emoji} ${estimate.resourceType.toUpperCase()}: ~$${estimate.estimatedNewCost.toFixed(2)}/month\n`; + if (estimate.details) { + output += ` ${estimate.details}\n`; + } + } + + output += `\n๐Ÿ“Š Total Estimated Impact: ~$${totalCost.toFixed(2)}/month\n`; + output += '\nโš ๏ธ Estimates are approximate. Actual costs depend on usage and configuration.\n'; + + return output; +} diff --git a/src/tools/index.ts b/src/tools/index.ts index 139aeb8..4103e32 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -11,3 +11,26 @@ export { createCodeSuggestionTool, } from './pr-analysis-tools.js'; +export { + detectTestFramework, + isTestFile, + isCodeFile, + suggestTestFilePath, + createTestSuggestionTool, + generateTestTemplate, +} from './test-suggestion-tool.js'; + +export { + detectCoverageTool, + findCoverageFiles, + readCoverageReport, + createCoverageReporterTool, + formatCoverageReport, +} from './coverage-reporter.js'; + +export { + isDevOpsFile, + analyzeDevOpsFiles, + createDevOpsCostEstimatorTool, + formatCostEstimates, +} from './devops-cost-estimator.js'; diff --git a/src/tools/test-suggestion-tool.ts b/src/tools/test-suggestion-tool.ts new file mode 100644 index 0000000..c8b5a4a --- /dev/null +++ b/src/tools/test-suggestion-tool.ts @@ -0,0 +1,307 @@ +/** + * Test Suggestion Tool for PR Analysis + * Generates test code suggestions for code changes without corresponding tests + */ + +import { DynamicStructuredTool } from '@langchain/core/tools'; +import { z } from 'zod'; +import fs from 'node:fs'; +import path from 'node:path'; + +/** + * Detect test framework from project configuration + */ +export function detectTestFramework(repoPath: string = '.'): { + framework: 'jest' | 'mocha' | 'vitest' | 'pytest' | 'unittest' | 'other'; + detected: boolean; + configFile?: string; +} { + const packageJsonPath = path.join(repoPath, 'package.json'); + + // Check for Node.js project + if (fs.existsSync(packageJsonPath)) { + try { + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')); + const deps = { + ...packageJson.dependencies, + ...packageJson.devDependencies, + }; + + // Check for Jest + if (deps.jest || deps['@jest/core'] || fs.existsSync(path.join(repoPath, 'jest.config.js')) || fs.existsSync(path.join(repoPath, 'jest.config.ts'))) { + return { framework: 'jest', detected: true, configFile: 'jest.config.js' }; + } + + // Check for Vitest + if (deps.vitest || fs.existsSync(path.join(repoPath, 'vitest.config.js')) || fs.existsSync(path.join(repoPath, 'vitest.config.ts'))) { + return { framework: 'vitest', detected: true, configFile: 'vitest.config.js' }; + } + + // Check for Mocha + if (deps.mocha || fs.existsSync(path.join(repoPath, '.mocharc.js')) || fs.existsSync(path.join(repoPath, '.mocharc.json'))) { + return { framework: 'mocha', detected: true, configFile: '.mocharc.js' }; + } + } catch (e) { + // Ignore JSON parse errors + } + } + + // Check for Python project + const pytestIni = path.join(repoPath, 'pytest.ini'); + const pyprojectToml = path.join(repoPath, 'pyproject.toml'); + const setupPy = path.join(repoPath, 'setup.py'); + + if (fs.existsSync(pytestIni)) { + return { framework: 'pytest', detected: true, configFile: 'pytest.ini' }; + } + + if (fs.existsSync(pyprojectToml)) { + try { + const content = fs.readFileSync(pyprojectToml, 'utf-8'); + if (content.includes('[tool.pytest]') || content.includes('pytest')) { + return { framework: 'pytest', detected: true, configFile: 'pyproject.toml' }; + } + } catch (e) { + // Ignore read errors + } + } + + if (fs.existsSync(setupPy)) { + try { + const content = fs.readFileSync(setupPy, 'utf-8'); + if (content.includes('pytest')) { + return { framework: 'pytest', detected: true, configFile: 'setup.py' }; + } + } catch (e) { + // Ignore read errors + } + } + + return { framework: 'other', detected: false }; +} + +/** + * Check if a file is a test file + */ +export function isTestFile(filePath: string): boolean { + const testPatterns = [ + /\.test\.[jt]sx?$/, + /\.spec\.[jt]sx?$/, + /_test\.py$/, + /test_.*\.py$/, + /\.test\.go$/, + /_test\.go$/, + /Test\.java$/, + /\.test\.rs$/, + ]; + + return testPatterns.some(pattern => pattern.test(filePath)); +} + +/** + * Check if a file is a code file that should have tests + */ +export function isCodeFile(filePath: string): boolean { + const codeExtensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.java', '.rs', '.rb', '.cs']; + const ext = path.extname(filePath).toLowerCase(); + + // Exclude config files, type definitions, etc. + if (filePath.includes('.d.ts') || filePath.includes('.config.') || filePath.includes('index.')) { + return false; + } + + return codeExtensions.includes(ext); +} + +/** + * Generate test file path suggestion + */ +export function suggestTestFilePath(sourceFilePath: string, framework: string): string { + const ext = path.extname(sourceFilePath); + const baseName = path.basename(sourceFilePath, ext); + const dirName = path.dirname(sourceFilePath); + + // For TypeScript/JavaScript + if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) { + if (framework === 'jest' || framework === 'vitest') { + // Check if there's a __tests__ folder pattern + if (dirName.includes('src')) { + const testsDir = dirName.replace('src', 'tests'); + return path.join(testsDir, `${baseName}.test${ext}`); + } + return path.join(dirName, `${baseName}.test${ext}`); + } + if (framework === 'mocha') { + return path.join(dirName, `${baseName}.spec${ext}`); + } + } + + // For Python + if (ext === '.py') { + return path.join(dirName, `test_${baseName}.py`); + } + + // For Go + if (ext === '.go') { + return path.join(dirName, `${baseName}_test.go`); + } + + // Default + return path.join(dirName, `${baseName}.test${ext}`); +} + +/** + * Create test suggestion tool + */ +export function createTestSuggestionTool() { + return new DynamicStructuredTool({ + name: 'suggest_tests', + description: 'Analyze code changes and suggest tests for files without test coverage', + schema: z.object({ + files: z.array(z.object({ + path: z.string(), + diff: z.string(), + additions: z.number(), + })).describe('Array of changed files to analyze'), + framework: z.string().optional().describe('Test framework to use'), + repoPath: z.string().optional().describe('Repository path for framework detection'), + }), + func: async ({ files, framework: providedFramework, repoPath }) => { + const detectedFramework = detectTestFramework(repoPath || '.'); + const testFramework = providedFramework || detectedFramework.framework; + + // Filter to code files only + const codeFiles = files.filter(f => isCodeFile(f.path) && !isTestFile(f.path)); + + // Check if corresponding test files exist in the PR + const testFilesInPR = files.filter(f => isTestFile(f.path)).map(f => f.path); + + const filesNeedingTests: Array<{ + file: string; + hasPRTest: boolean; + suggestedTestPath: string; + codeSnippet: string; + }> = []; + + for (const file of codeFiles) { + // Check if a test for this file is included in the PR + const baseNameWithoutExt = path.basename(file.path, path.extname(file.path)); + const hasPRTest = testFilesInPR.some(testPath => + testPath.toLowerCase().includes(baseNameWithoutExt.toLowerCase()) + ); + + if (!hasPRTest && file.additions > 5) { // Only suggest for files with significant changes + // Extract added code from diff + const addedLines = file.diff + .split('\n') + .filter(line => line.startsWith('+') && !line.startsWith('+++')) + .map(line => line.substring(1)) + .join('\n'); + + filesNeedingTests.push({ + file: file.path, + hasPRTest: false, + suggestedTestPath: suggestTestFilePath(file.path, testFramework), + codeSnippet: addedLines.substring(0, 1000), // Limit for context + }); + } + } + + return JSON.stringify({ + testFramework, + frameworkDetected: detectedFramework.detected, + configFile: detectedFramework.configFile, + filesAnalyzed: codeFiles.length, + filesNeedingTests: filesNeedingTests.length, + files: filesNeedingTests, + }); + }, + }); +} + +/** + * Generate test code template based on framework and code + */ +export function generateTestTemplate( + framework: string, + filePath: string, + codeSnippet: string, + functionNames: string[] = [] +): string { + const baseName = path.basename(filePath, path.extname(filePath)); + const modulePath = filePath.replace(/\.[^/.]+$/, ''); + + switch (framework) { + case 'jest': + case 'vitest': + return `import { describe, it, expect } from '${framework === 'vitest' ? 'vitest' : '@jest/globals'}'; +import { /* exported functions */ } from '${modulePath}'; + +describe('${baseName}', () => { +${functionNames.map(fn => ` describe('${fn}', () => { + it('should work correctly', () => { + // TODO: Add test implementation + expect(true).toBe(true); + }); + + it('should handle edge cases', () => { + // TODO: Add edge case tests + }); + }); +`).join('\n') || ` it('should be implemented', () => { + // TODO: Add tests for ${baseName} + expect(true).toBe(true); + }); +`} +}); +`; + + case 'mocha': + return `const { expect } = require('chai'); +const { /* exported functions */ } = require('${modulePath}'); + +describe('${baseName}', function() { +${functionNames.map(fn => ` describe('${fn}', function() { + it('should work correctly', function() { + // TODO: Add test implementation + expect(true).to.be.true; + }); + }); +`).join('\n') || ` it('should be implemented', function() { + // TODO: Add tests for ${baseName} + expect(true).to.be.true; + }); +`} +}); +`; + + case 'pytest': + return `import pytest +from ${modulePath.replace(/\//g, '.')} import * + +class Test${baseName.charAt(0).toUpperCase() + baseName.slice(1)}: +${functionNames.map(fn => ` def test_${fn}_works(self): + """Test that ${fn} works correctly.""" + # TODO: Add test implementation + assert True + + def test_${fn}_edge_cases(self): + """Test ${fn} edge cases.""" + # TODO: Add edge case tests + assert True +`).join('\n') || ` def test_implementation(self): + """Test ${baseName} functionality.""" + # TODO: Add tests + assert True +`} +`; + + default: + return `// TODO: Add tests for ${baseName} +// Detected framework: ${framework} +// +// Test the following functionality: +${functionNames.map(fn => `// - ${fn}`).join('\n') || '// - Main module functionality'} +`; + } +} diff --git a/src/types/agent.types.ts b/src/types/agent.types.ts index 2c6ef68..5b9371d 100644 --- a/src/types/agent.types.ts +++ b/src/types/agent.types.ts @@ -54,6 +54,58 @@ export interface RiskItem { }; } +/** + * Code suggestion for fixing issues found during review + */ +export interface CodeSuggestion { + filePath: string; + lineRange: { start: number; end: number }; + originalCode: string; + suggestedCode: string; + reason: string; +} + +/** + * Test suggestion for code without tests + */ +export interface TestSuggestion { + forFile: string; + testFramework: 'jest' | 'mocha' | 'vitest' | 'pytest' | 'unittest' | 'other'; + testCode: string; + description: string; + testFilePath?: string; // Suggested path for the test file +} + +/** + * DevOps cost estimate for infrastructure changes + */ +export interface DevOpsCostEstimate { + resource: string; + resourceType: string; // e.g., 'EC2', 'Lambda', 'S3', 'RDS' + currentMonthlyCost?: number; + estimatedNewCost: number; + difference?: number; + confidence: 'high' | 'medium' | 'low'; + details?: string; +} + +/** + * Test coverage report + */ +export interface CoverageReport { + available: boolean; + overallPercentage?: number; + lineCoverage?: number; + branchCoverage?: number; + fileBreakdown?: Array<{ + file: string; + lineCoverage: number; + branchCoverage?: number; + }>; + delta?: number; // Change in coverage compared to baseline + coverageTool?: string; // e.g., 'jest', 'nyc', 'coverage.py' +} + export interface FileAnalysis { path: string; summary: string; @@ -64,6 +116,7 @@ export interface FileAnalysis { deletions: number; }; recommendations: string[]; + suggestedChanges?: CodeSuggestion[]; // Specific code fix suggestions } export interface AgentResult { @@ -86,6 +139,10 @@ export interface AgentResult { influencedStages: string[]; keyInsights: string[]; }; + // Enhanced analysis features + testSuggestions?: TestSuggestion[]; + devOpsCostEstimates?: DevOpsCostEstimate[]; + coverageReport?: CoverageReport; } // Alias for backward compatibility