Spaces:
Sleeping
Sleeping
| 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; | |