review-copilot
Version:
ReviewCopilot - AI-powered code review assistant with customizable prompts
123 lines (122 loc) • 5.2 kB
JavaScript
;
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();
}
}
}