import logger from '../utils/logger.js'; class CodeReviewEngine { constructor(aiProvider, memory, developer) { this.ai = aiProvider; this.memory = memory; this.developer = developer; } async reviewPullRequest(pr, files) { const reviews = []; for (const file of files.slice(0, 5)) { const content = file.patch || file.content || ''; if (!content || content.length < 50) continue; try { const review = await this._reviewFile(file, content); if (review) { reviews.push(review); } } catch (error) { logger.error(`Failed to review file ${file.filename}: ${error.message}`); } } return reviews; } async _reviewFile(file, content) { const roleContext = this.developer.getRoleContext(); const prompt = `أنت تراجع كود في Pull Request. الملف: ${file.filename} نوع التغيير: ${file.status} الدور: ${roleContext.role} الكود: \`\`\` ${content.slice(0, 2000)} \`\`\` قم بمراجعة الكود واذكر: 1. هل هناك مشاكل أمنية؟ 2. هل هناك مشاكل أداء؟ 3. هل الكود نظيف ومقروء؟ 4. هل هناك أخطاء محتملة؟ 5. اقتراحات للتحسين اكتب مراجعة مختصرة (3-5 نقاط) بالعربية أو الإنجليزية.`; const review = await this.ai.generate(prompt, { maxTokens: 500, temperature: 0.7, }); return { file: file.filename, review: review.trim(), type: this._determineReviewType(review), }; } _determineReviewType(review) { const lower = review.toLowerCase(); if (lower.includes('security') || lower.includes('vulnerability') || lower.includes('xss') || lower.includes('sql injection')) { return 'security'; } if (lower.includes('performance') || lower.includes('slow') || lower.includes('n+1') || lower.includes('optimize')) { return 'performance'; } if (lower.includes('bug') || lower.includes('error') || lower.includes('crash') || lower.includes('null')) { return 'bug'; } if (lower.includes('good') || lower.includes('clean') || lower.includes('nice') || lower.includes('excellent')) { return 'positive'; } return 'suggestion'; } async generateLineComment(line, context, file) { try { const prompt = `تعليق على سطر كود في ملف ${file}. السطر: ${line} السياق: ${context?.slice(0, 200) || ''} اكتب تعليق قصير (جملة واحدة) على هذا السطر.`; const comment = await this.ai.generate(prompt, { maxTokens: 100, temperature: 0.8, }); return comment.trim(); } catch (error) { logger.error(`Failed to generate line comment: ${error.message}`); return 'Consider reviewing this line.'; } } async suggestImprovements(code, language) { try { const prompt = `اقترح تحسينات على هذا الكود (${language}): \`\`\` ${code.slice(0, 1500)} \`\`\` اذكر 2-3 تحسينات محددة.`; const suggestions = await this.ai.generate(prompt, { maxTokens: 300, temperature: 0.7, }); return suggestions.trim(); } catch (error) { logger.error(`Failed to suggest improvements: ${error.message}`); return 'Consider adding error handling and tests.'; } } async checkForBugs(code, language) { try { const prompt = `هل ترى أي أخطاء في هذا الكود (${language})؟ \`\`\` ${code.slice(0, 1500)} \`\`\` اكتب أي أخطاء محتملة أو "No bugs found" إذا لم تجد شيء.`; const result = await this.ai.generate(prompt, { maxTokens: 200, temperature: 0.6, }); return result.trim(); } catch (error) { logger.error(`Failed to check for bugs: ${error.message}`); return 'Unable to check for bugs.'; } } } export default CodeReviewEngine;