Code Review MCP Server

by crazyrabbitLTC
Verified
#!/usr/bin/env node /** * @file CLI Tool for Code Quality Analysis * @version 0.1.0 * * Command-line interface for testing code quality analysis functionality */ import * as path from 'path'; import { executeRepomix } from './repomix.js'; import { createCodeReviewService } from './llm/index.js'; import { CodeReviewIssue, CodeReviewResult } from './llm/types.js'; // Load environment variables import * as dotenv from 'dotenv'; dotenv.config(); async function main() { try { // Parse command line arguments const args = process.argv.slice(2); if (args.length === 0 || args.includes('--help') || args.includes('-h')) { console.log(` CodeQualityAdvisor CLI - Test code quality analysis functionality Usage: cli.js <repo_path> [options] Arguments: repo_path Path to the repository to analyze Options: --files <file1,file2> Specific files to review --types <.js,.ts> File types to include in the review --detail <basic|detailed> Level of detail (default: detailed) --focus <areas> Areas to focus on (security,performance,quality,maintainability) --help, -h Show this help message `); process.exit(0); } // Extract the repository path const repoPath = args[0]; // Parse options let specificFiles: string[] | undefined; let fileTypes: string[] | undefined; let detailLevel: 'basic' | 'detailed' = 'detailed'; let focusAreas: ('security' | 'performance' | 'quality' | 'maintainability')[] = ['security', 'performance', 'quality', 'maintainability']; for (let i = 1; i < args.length; i++) { const arg = args[i]; if (arg === '--files' && i + 1 < args.length) { specificFiles = args[++i].split(','); } else if (arg === '--types' && i + 1 < args.length) { fileTypes = args[++i].split(','); } else if (arg === '--detail' && i + 1 < args.length) { const detail = args[++i]; if (detail === 'basic' || detail === 'detailed') { detailLevel = detail; } else { console.error(`Invalid detail level: ${detail}. Using 'detailed' instead.`); } } else if (arg === '--focus' && i + 1 < args.length) { const focus = args[++i].split(',') as ('security' | 'performance' | 'quality' | 'maintainability')[]; if (focus.length > 0) { focusAreas = focus; } } } console.log(`Analyzing repository: ${repoPath}`); if (specificFiles) { console.log(`Specific files: ${specificFiles.join(', ')}`); } if (fileTypes) { console.log(`File types: ${fileTypes.join(', ')}`); } console.log(`Detail level: ${detailLevel}`); console.log(`Focus areas: ${focusAreas.join(', ')}`); // Execute Repomix to get the flattened codebase console.log('\nFlattening codebase structure...'); const repomixOutput = await executeRepomix({ includePaths: specificFiles || [repoPath], fileTypes, outputFormat: 'plain', }); console.log(`Codebase structure analysis complete. Output size: ${repomixOutput.length} characters`); // Create the code review service console.log('\nInitializing code quality analysis service...'); const codeReviewService = createCodeReviewService(); // Perform the code review console.log('\nPerforming comprehensive quality review...'); const reviewResult = await codeReviewService.reviewCodeFromRepomix(repomixOutput, { detailLevel, focusAreas, }); // Display the results console.log('\nCode Quality Review Results:'); console.log('=============================\n'); console.log(`Summary: ${reviewResult.summary}`); console.log('\nIssues:'); if (reviewResult.issues.length === 0) { console.log(' No issues found'); } else { reviewResult.issues.forEach((issue: CodeReviewIssue, index: number) => { console.log(` ${index + 1}. [${issue.severity}] ${issue.type}: ${issue.description}`); if (issue.line_numbers && issue.line_numbers.length > 0) { console.log(` Lines: ${issue.line_numbers.join(', ')}`); } console.log(` Recommendation: ${issue.recommendation}`); console.log(); }); } console.log('\nStrengths:'); reviewResult.strengths.forEach((strength: string, index: number) => { console.log(` ${index + 1}. ${strength}`); }); console.log('\nRecommendations:'); reviewResult.recommendations.forEach((recommendation: string, index: number) => { console.log(` ${index + 1}. ${recommendation}`); }); } catch (error) { console.error('Error:', (error as Error).message); process.exit(1); } } main();