UNPKG

incize

Version:

AI Commit Copilot for Power Developers

127 lines (118 loc) 4.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PromptFormatter = void 0; class PromptFormatter { static SYSTEM_PROMPT = `You are Shard, an AI commit copilot for power developers. Your role is to analyze Git diffs and provide: 1. **Concise Summary**: 1-2 sentence summary of changes 2. **Risk Assessment**: Score 0-100 with level (low/medium/high/critical) 3. **Actionable Suggestions**: Specific improvements for code quality, security, performance 4. **Changelog Entry**: Professional changelog format 5. **Test Suggestions**: What tests should be added/modified Focus on: - Code quality and maintainability - Security vulnerabilities - Performance implications - Breaking changes - Testing gaps Be surgical and precise. No fluff.`; /** * Format prompt for AI analysis */ formatAnalysisPrompt(diff, commit, repository) { const userPrompt = this.buildUserPrompt(diff, commit, repository); return { systemPrompt: PromptFormatter.SYSTEM_PROMPT, userPrompt: userPrompt, }; } /** * Build user prompt with diff and context */ buildUserPrompt(diff, commit, repository) { const summary = this.buildDiffSummary(diff); const fileDetails = this.buildFileDetails(diff); const context = this.buildContext(commit, repository); return `Analyze this Git diff and provide structured feedback: ${context} ${summary} ${fileDetails} Provide your analysis in this exact JSON format: { "summary": "1-2 sentence summary", "riskScore": 0-100, "riskLevel": "low|medium|high|critical", "suggestions": ["specific actionable suggestion 1", "suggestion 2"], "changelog": "professional changelog entry", "testSuggestions": ["test suggestion 1", "test suggestion 2"], "confidence": 0.0-1.0 }`; } /** * Build diff summary section */ buildDiffSummary(diff) { const { additions, deletions, totalChanges } = diff.summary; const fileCount = diff.files.length; const languages = [...new Set(diff.files.map(f => f.language).filter(Boolean))]; return `## Diff Summary - Files changed: ${fileCount} - Lines added: ${additions} - Lines deleted: ${deletions} - Total changes: ${totalChanges} - Languages: ${languages.join(', ') || 'Unknown'}`; } /** * Build detailed file information */ buildFileDetails(diff) { if (diff.files.length === 0) { return '## Files\nNo files changed'; } const fileDetails = diff.files.map(file => { const status = file.status.toUpperCase(); const lang = file.language ? ` (${file.language})` : ''; return `- ${file.path} [${status}]${lang} (+${file.additions}, -${file.deletions})`; }).join('\n'); return `## Files\n${fileDetails}`; } /** * Build context information */ buildContext(commit, repository) { return `## Context - Repository: ${repository} - Branch: ${commit.branch} - Author: ${commit.author} - Commit Message: ${commit.message} - Date: ${commit.date}`; } /** * Create a focused prompt for specific analysis types */ createFocusedPrompt(diff, commit, focus) { const basePrompt = this.formatAnalysisPrompt(diff, commit, 'unknown'); const focusPrompts = { security: 'Focus specifically on security vulnerabilities, data exposure, authentication issues, and input validation.', performance: 'Focus specifically on performance implications, bottlenecks, memory usage, and optimization opportunities.', quality: 'Focus specifically on code quality, maintainability, readability, and best practices.', testing: 'Focus specifically on test coverage gaps, edge cases, and testing strategies.' }; return { systemPrompt: `${basePrompt.systemPrompt}\n\n${focusPrompts[focus]}`, userPrompt: basePrompt.userPrompt, }; } /** * Create a prompt for mock AI responses (offline mode) */ createMockPrompt(diff, commit) { return { systemPrompt: 'You are in offline mode. Provide a basic analysis based on diff statistics.', userPrompt: `Analyze this diff with basic metrics: ${this.buildDiffSummary(diff)} ${this.buildContext(commit, 'local')} Provide a simple analysis focusing on change volume and file types.`, }; } } exports.PromptFormatter = PromptFormatter;