UNPKG

cortexweaver

Version:

CortexWeaver is a command-line interface (CLI) tool that orchestrates a swarm of specialized AI agents, powered by Claude Code and Gemini CLI, to assist in software development. It transforms a high-level project plan (plan.md) into a series of coordinate

221 lines 9.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PromptAnalyzer = void 0; /** * PromptAnalyzer handles diff generation, content analysis, and validation * for prompt improvement workflows */ class PromptAnalyzer { /** * Generate unified diff between original and improved content */ async generateUnifiedDiff(originalContent, improvedContent, filename) { if (originalContent === improvedContent) { return ''; } const originalLines = originalContent.split('\n'); const improvedLines = improvedContent.split('\n'); // Simple diff algorithm - for production, consider using a more sophisticated library const diff = this.createUnifiedDiff(originalLines, improvedLines, filename); return diff; } /** * Create a unified diff format string */ createUnifiedDiff(originalLines, improvedLines, filename) { const diffLines = []; diffLines.push(`--- ${filename}`); diffLines.push(`+++ ${filename}`); // Simple implementation - track changes line by line let originalIndex = 0; let improvedIndex = 0; while (originalIndex < originalLines.length || improvedIndex < improvedLines.length) { const originalLine = originalLines[originalIndex]; const improvedLine = improvedLines[improvedIndex]; if (originalLine === improvedLine) { // Lines match originalIndex++; improvedIndex++; continue; } // Find next matching line to determine context const contextStart = Math.max(0, originalIndex - 1); const contextEnd = Math.min(originalLines.length, originalIndex + 3); diffLines.push(`@@ -${originalIndex + 1},${contextEnd - contextStart} +${improvedIndex + 1},${contextEnd - contextStart} @@`); // Add context before change if (contextStart < originalIndex) { diffLines.push(` ${originalLines[contextStart]}`); } // Add removed line if (originalIndex < originalLines.length) { diffLines.push(`-${originalLine || ''}`); originalIndex++; } // Add added line if (improvedIndex < improvedLines.length) { diffLines.push(`+${improvedLine || ''}`); improvedIndex++; } // Add context after change if (originalIndex < originalLines.length && improvedIndex < improvedLines.length) { const nextOriginal = originalLines[originalIndex]; const nextImproved = improvedLines[improvedIndex]; if (nextOriginal === nextImproved) { diffLines.push(` ${nextOriginal}`); } } } return diffLines.join('\n'); } /** * Analyze diff content for complexity and impact */ analyzeDiff(diff) { const lines = diff.split('\n'); let addedLines = 0; let removedLines = 0; let modifiedLines = 0; let hasStructuralChanges = false; for (const line of lines) { if (line.startsWith('+') && !line.startsWith('+++')) { addedLines++; if (line.includes('##') || line.includes('###') || line.includes('```')) { hasStructuralChanges = true; } } else if (line.startsWith('-') && !line.startsWith('---')) { removedLines++; if (line.includes('##') || line.includes('###') || line.includes('```')) { hasStructuralChanges = true; } } } modifiedLines = Math.min(addedLines, removedLines); // Determine complexity based on changes let complexity = 'low'; const totalChanges = addedLines + removedLines; if (totalChanges > 20 || hasStructuralChanges) { complexity = 'high'; } else if (totalChanges > 5) { complexity = 'medium'; } return { addedLines, removedLines, modifiedLines, complexity, hasStructuralChanges }; } /** * Validate content for basic requirements */ validateContent(originalContent, improvedContent) { const hasContent = originalContent.trim().length > 0 && improvedContent.trim().length > 0; const hasChanges = originalContent !== improvedContent; let estimatedImpact = 'minimal'; if (hasChanges) { const lengthDifference = Math.abs(improvedContent.length - originalContent.length); const lengthRatio = lengthDifference / originalContent.length; if (lengthRatio > 0.5) { estimatedImpact = 'significant'; } else if (lengthRatio > 0.2) { estimatedImpact = 'moderate'; } } return { isValid: hasContent, hasContent, hasChanges, estimatedImpact }; } /** * Apply diff to content (simplified implementation) */ applyDiffToContent(originalContent, diff) { // This is a simplified implementation // In production, use a proper diff library const lines = originalContent.split('\n'); const diffLines = diff.split('\n'); let result = [...lines]; for (const diffLine of diffLines) { if (diffLine.startsWith('+') && !diffLine.startsWith('+++')) { result.push(diffLine.substring(1)); } else if (diffLine.startsWith('-') && !diffLine.startsWith('---')) { const lineToRemove = diffLine.substring(1); const index = result.indexOf(lineToRemove); if (index !== -1) { result.splice(index, 1); } } } return result.join('\n'); } /** * Extract key metrics from prompt content */ extractContentMetrics(content) { const words = content.trim().split(/\s+/).filter(w => w.length > 0); const lines = content.split('\n'); const hasInstructions = /you\s+(should|must|need|will)/i.test(content) || /please\s+/i.test(content) || /instructions?:/i.test(content); const hasExamples = /example[s]?[:.]?/i.test(content) || /for\s+instance/i.test(content) || /such\s+as/i.test(content); const hasConstraints = /don['']?t|do\s+not|avoid|never|always/i.test(content) || /constraint[s]?[:.]?/i.test(content) || /limit[s]?[:.]?/i.test(content); return { wordCount: words.length, lineCount: lines.length, characterCount: content.length, hasInstructions, hasExamples, hasConstraints }; } /** * Compare content metrics between original and improved versions */ compareContentMetrics(originalContent, improvedContent) { const originalMetrics = this.extractContentMetrics(originalContent); const improvedMetrics = this.extractContentMetrics(improvedContent); const structuralChanges = []; const improvementIndicators = []; // Detect structural changes if (originalMetrics.hasInstructions !== improvedMetrics.hasInstructions) { structuralChanges.push(improvedMetrics.hasInstructions ? 'Added instructions' : 'Removed instructions'); } if (originalMetrics.hasExamples !== improvedMetrics.hasExamples) { structuralChanges.push(improvedMetrics.hasExamples ? 'Added examples' : 'Removed examples'); } if (originalMetrics.hasConstraints !== improvedMetrics.hasConstraints) { structuralChanges.push(improvedMetrics.hasConstraints ? 'Added constraints' : 'Removed constraints'); } // Detect improvement indicators if (improvedMetrics.hasExamples && !originalMetrics.hasExamples) { improvementIndicators.push('Added examples for clarity'); } if (improvedMetrics.hasConstraints && !originalMetrics.hasConstraints) { improvementIndicators.push('Added constraints for better control'); } const wordCountDelta = improvedMetrics.wordCount - originalMetrics.wordCount; if (wordCountDelta > 0 && wordCountDelta < originalMetrics.wordCount * 0.3) { improvementIndicators.push('Added helpful detail while maintaining conciseness'); } return { wordCountDelta: improvedMetrics.wordCount - originalMetrics.wordCount, lineCountDelta: improvedMetrics.lineCount - originalMetrics.lineCount, characterCountDelta: improvedMetrics.characterCount - originalMetrics.characterCount, structuralChanges, improvementIndicators }; } } exports.PromptAnalyzer = PromptAnalyzer; //# sourceMappingURL=analyzer.js.map