incize
Version:
AI Commit Copilot for Power Developers
127 lines (118 loc) • 4.52 kB
JavaScript
;
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;