@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
text/typescript
/**
* 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);
});