UNPKG

@versatil/claude-opera

Version:

๐ŸŽญ Claude Opera by VERSATIL v6.4.0 - Production-ready OPERA orchestration with 17 agents (7 core + 10 language-specific sub-agents), automatic roadmap generation, 11-MCP ecosystem, RAG memory achieving 98%+ context retention, proactive daemon with file-ba

150 lines (124 loc) โ€ข 6.88 kB
#!/usr/bin/env ts-node /** * Test script for Repository Organization System * Tests RepositoryAnalyzer and StructureOptimizer */ import { RepositoryAnalyzer } from '../dist/agents/opera/sarah-pm/repository-analyzer.js'; import { StructureOptimizer } from '../dist/agents/opera/sarah-pm/structure-optimizer.js'; async function testRepositoryAnalysis() { console.log('๐Ÿงช Testing Repository Organization System\n'); const projectPath = process.cwd(); // Initialize analyzer console.log('๐Ÿ“Š Initializing Repository Analyzer...'); const analyzer = new RepositoryAnalyzer({ ignorePaths: ['node_modules', 'dist', 'build', '.git', 'coverage'], standardDirectories: ['src', 'docs', 'tests', '.github'], maxFileSize: 10 * 1024 * 1024, // 10 MB checkGitignore: true }); // Listen to events analyzer.on('analysis:started', ({ projectPath }) => { console.log(` โ†’ Analyzing: ${projectPath}`); }); analyzer.on('analysis:completed', (result) => { const grade = result.health.score >= 90 ? 'A' : result.health.score >= 80 ? 'B' : result.health.score >= 70 ? 'C' : result.health.score >= 60 ? 'D' : 'F'; console.log(` โœ… Analysis complete: Health ${result.health.score}/100 (${grade})`); }); // Run analysis console.log('\n๐Ÿ“ˆ Running repository analysis...\n'); const analysis = await analyzer.analyze(projectPath); // Display results console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”'); console.log('๐Ÿ“Š ANALYSIS RESULTS'); console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n'); const grade = analysis.health.score >= 90 ? 'A' : analysis.health.score >= 80 ? 'B' : analysis.health.score >= 70 ? 'C' : analysis.health.score >= 60 ? 'D' : 'F'; console.log(`๐ŸŽฏ Health Score: ${analysis.health.score}/100 (Grade: ${grade})`); console.log(`๐Ÿ“ Total Files: ${analysis.statistics.totalFiles}`); console.log(`๐Ÿ“‚ Total Directories: ${analysis.statistics.totalDirectories}`); console.log(`โš ๏ธ Total Issues: ${analysis.issues.length}\n`); // Issues by severity console.log('๐Ÿ“‹ Issues by Severity:'); console.log(` ๐Ÿ”ด P0 (Critical): ${analysis.health.issuesBySeverity.P0}`); console.log(` ๐ŸŸก P1 (High): ${analysis.health.issuesBySeverity.P1}`); console.log(` ๐ŸŸข P2 (Medium): ${analysis.health.issuesBySeverity.P2}`); console.log(` โšช P3 (Low): ${analysis.health.issuesBySeverity.P3}\n`); // Issues by category console.log('๐Ÿท๏ธ Issues by Category:'); console.log(` ๐Ÿ“ Structure: ${analysis.health.categories.structure}`); console.log(` ๐Ÿ—‚๏ธ Organization: ${analysis.health.categories.organization}`); console.log(` ๐Ÿงน Cleanup: ${analysis.health.categories.cleanup}`); console.log(` โ“ Missing: ${analysis.health.categories.missing}`); console.log(` ๐Ÿ”’ Security: ${analysis.health.categories.security}\n`); // File type distribution (top 10) console.log('๐Ÿ“„ File Type Distribution (Top 10):'); const sortedExtensions = Object.entries(analysis.statistics.filesByExtension) .sort(([, a], [, b]) => b - a) .slice(0, 10); for (const [ext, count] of sortedExtensions) { const extDisplay = ext || '(no extension)'; console.log(` ${extDisplay}: ${count} files`); } console.log(); // Documentation coverage console.log(`๐Ÿ“– Documentation Coverage: ${analysis.statistics.documentationCoverage.toFixed(1)}%`); // Test coverage if (analysis.statistics.testCoverage.hasTests) { const testRatio = analysis.statistics.testCoverage.testFiles / analysis.statistics.testCoverage.sourceFiles; console.log(`๐Ÿงช Test Coverage: ${analysis.statistics.testCoverage.testFiles} test files, ${analysis.statistics.testCoverage.sourceFiles} source files (ratio: ${testRatio.toFixed(2)})`); } else { console.log('๐Ÿงช Test Coverage: No tests detected'); } console.log(); // Show critical issues const criticalIssues = analysis.issues.filter(i => i.severity === 'P0'); if (criticalIssues.length > 0) { console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”'); console.log('๐Ÿšจ CRITICAL ISSUES (P0)'); console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n'); criticalIssues.forEach((issue, idx) => { console.log(`${idx + 1}. ${issue.title}`); console.log(` Description: ${issue.description}`); console.log(` Recommendation: ${issue.recommendation}`); console.log(` Auto-fixable: ${issue.autoFixable ? 'โœ… Yes' : 'โŒ No'}`); if (issue.files && issue.files.length > 0) { console.log(` Files affected: ${issue.files.length}`); } console.log(); }); } // Show recommendations if (analysis.recommendations.length > 0) { console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”'); console.log('๐Ÿ’ก RECOMMENDATIONS'); console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n'); analysis.recommendations.forEach((rec, idx) => { console.log(`${idx + 1}. ${rec}`); }); console.log(); } // Test StructureOptimizer if there are issues if (analysis.issues.length > 0) { console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”'); console.log('๐Ÿ”ง GENERATING MIGRATION PLAN'); console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n'); const optimizer = new StructureOptimizer({ requireApproval: true, createBackup: true, generateScripts: true, dryRun: true }); const plan = await optimizer.generatePlan(analysis); const preview = optimizer.formatPlanPreview(plan); console.log(preview); } else { console.log('\nโœ… Repository is healthy - no migration plan needed!'); } console.log('\nโœ… Test completed successfully!\n'); } // Run test testRepositoryAnalysis().catch(err => { console.error('โŒ Test failed:', err); process.exit(1); });