UNPKG

review-copilot

Version:

ReviewCopilot - AI-powered code review assistant with customizable prompts

123 lines (122 loc) 5.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.selectiveReviewCommand = selectiveReviewCommand; const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const config_manager_1 = require("../../config/config-manager"); const selective_review_service_1 = require("../../services/selective-review-service"); const git_platform_factory_1 = require("../../services/git-platform-factory"); const file_content_provider_1 = require("../../services/file-content-provider"); const fs_1 = __importDefault(require("fs")); async function selectiveReviewCommand(options) { let spinner; try { spinner = (0, ora_1.default)('Starting selective code review...').start(); // Load configuration const configManager = await config_manager_1.ConfigManager.getInstance(options.config); // Determine if running in CI environment const isCI = process.env.GITHUB_ACTIONS === 'true' || process.env.GITLAB_CI === 'true'; let fileContent = null; let prDetails = undefined; if (isCI) { // CI environment, remote pull PR information and file content const gitService = git_platform_factory_1.GitPlatformFactory.createService(); prDetails = await gitService.getPRDetails(); if (!prDetails) { if (spinner) spinner.fail('Could not get repository details'); return false; } const fileContentProvider = file_content_provider_1.FileContentProviderFactory.createProvider(gitService); fileContent = await fileContentProvider.getFileContent(options.file, { platform: prDetails.platform, commitId: prDetails.commitId, path: prDetails.path, owner: prDetails.owner, repo: prDetails.repo, pullNumber: prDetails.pullNumber, }); } else { // Local mode, read local file content try { fileContent = fs_1.default.readFileSync(options.file, 'utf-8'); } catch (e) { if (spinner) spinner.fail(`Could not read local file: ${options.file}`); return false; } } if (!fileContent) { if (spinner) spinner.fail(`Could not get content for file: ${options.file}`); return false; } // Extract the specific lines to review const lines = fileContent.split('\n'); if (options.startLine < 1 || options.endLine > lines.length) { if (spinner) spinner.fail(`Invalid line range: ${options.startLine}-${options.endLine}. File has ${lines.length} lines.`); return false; } // Use inclusive range for selected lines const selectedLines = lines.slice(options.startLine - 1, options.endLine); const selectedCodeContent = selectedLines.join('\n'); // Create review context with full file content for better context const context = { filePath: options.file, startLine: options.startLine, endLine: options.endLine, fullFileContent: fileContent, // Always pass the entire file content selectedCodeContent, triggerComment: options.comment, pullNumber: prDetails?.pullNumber, owner: prDetails?.owner, repo: prDetails?.repo, commentId: options.commentId, threadId: options.threadId, }; // Process the review if (spinner) spinner.text = 'Processing selective review...'; const reviewService = selective_review_service_1.SelectiveReviewService.getInstance(); const result = await reviewService.processSelectiveReview(context); if (result.success) { if (spinner) spinner.succeed('Selective review completed successfully'); } else { if (spinner) spinner.fail('Selective review failed'); console.error(chalk_1.default.red('\nError details:')); console.error(chalk_1.default.yellow('Error:'), result.error); } return result.success; } catch (error) { if (spinner) { spinner.fail('Selective review failed'); } if (error instanceof Error) { console.error(chalk_1.default.red('\nError details:')); console.error(chalk_1.default.yellow('Message:'), error.message); if (error.stack) { console.error(chalk_1.default.gray('\nStack trace:')); console.error(chalk_1.default.gray(error.stack)); } } else { console.error(chalk_1.default.red('\nUnknown error:'), error); } return false; } finally { if (spinner) { spinner.stop(); } } }