arela
Version:
AI-powered CTO with multi-agent orchestration, code summarization, visual testing (web + mobile) for blazing fast development.
182 lines • 7.81 kB
JavaScript
/**
* Architecture Report Reporter
* Formats and displays architecture analysis results
*/
import path from "path";
import fs from "fs-extra";
import pc from "picocolors";
/**
* Report architecture analysis to console
*/
export function reportArchitecture(report, verbose = false) {
console.log(pc.bold(`📊 Architecture Type: ${formatArchType(report.overallArchitecture)}`));
console.log(pc.gray(` Horizontal: ${report.overallScores.horizontal}% | Vertical: ${report.overallScores.vertical}%\n`));
// Report per-repository
if (report.repositories.length > 0) {
console.log(pc.bold("📁 Repository Analysis:\n"));
for (const repo of report.repositories) {
const icon = repo.architecture === "horizontal" ? "📚" : "🎯";
console.log(`${icon} ${repo.name}`);
console.log(pc.gray(` Type: ${repo.architecture} (${Math.max(repo.scores.horizontal, repo.scores.vertical)}%)`));
console.log(pc.gray(` Coupling: ${repo.metrics.coupling} | Cohesion: ${repo.metrics.cohesion}`));
if (verbose && repo.directories.length > 0) {
console.log(pc.gray(` Directories: ${repo.directories.length}`));
for (const dir of repo.directories.slice(0, 5)) {
console.log(pc.dim(` • ${dir.path} (${dir.type}) - ${dir.fileCount} files, internal: ${dir.internalImports}`));
}
if (repo.directories.length > 5) {
console.log(pc.dim(` ... and ${repo.directories.length - 5} more`));
}
}
console.log("");
}
}
// Report issues
if (report.issues.length > 0) {
console.log(pc.bold("❌ Issues Found:\n"));
const criticalIssues = report.issues.filter(i => i.severity === "critical");
const warnings = report.issues.filter(i => i.severity === "warning");
if (criticalIssues.length > 0) {
console.log(pc.red(`🔴 Critical (${criticalIssues.length}):`));
for (const issue of criticalIssues.slice(0, 3)) {
console.log(pc.red(` • ${issue.title}`));
if (verbose) {
console.log(pc.gray(` ${issue.description}`));
}
}
if (criticalIssues.length > 3) {
console.log(pc.red(` ... and ${criticalIssues.length - 3} more critical issues`));
}
console.log("");
}
if (warnings.length > 0) {
console.log(pc.yellow(`🟡 Warnings (${warnings.length}):`));
for (const issue of warnings.slice(0, 3)) {
console.log(pc.yellow(` • ${issue.title}`));
if (verbose) {
console.log(pc.gray(` ${issue.description}`));
}
}
if (warnings.length > 3) {
console.log(pc.yellow(` ... and ${warnings.length - 3} more warnings`));
}
console.log("");
}
}
// Report metrics summary
console.log(pc.bold("📈 Global Metrics:\n"));
console.log(pc.gray(` Coupling: ${report.globalMetrics.coupling} (0=perfect, 100=tightly coupled)`));
console.log(pc.gray(` Cohesion: ${report.globalMetrics.cohesion} (0=scattered, 100=cohesive)\n`));
// Report recommendations
if (report.recommendations.length > 0) {
console.log(pc.bold("💡 Recommendations:\n"));
for (const rec of report.recommendations.slice(0, 5)) {
console.log(pc.cyan(` ${rec}`));
}
if (report.recommendations.length > 5) {
console.log(pc.cyan(` ... and ${report.recommendations.length - 5} more`));
}
console.log("");
}
// Report effort estimates
if (report.effort) {
console.log(pc.bold("⏱️ VSA Migration Estimates:\n"));
console.log(pc.gray(` Effort: ${report.effort.estimated}`));
console.log(pc.gray(` Breakeven: ${report.effort.breakeven}`));
console.log(pc.gray(` 3-Year ROI: ${report.effort.roi3Year}%\n`));
}
// Next steps
console.log(pc.bold("🚀 Next Steps:\n"));
console.log(pc.cyan(" $ arela detect slices # Identify optimal vertical slices"));
console.log(pc.cyan(" $ arela flow generate # Create refactoring proposals\n"));
}
/**
* Export architecture report to JSON
*/
export function exportArchitectureJson(report, filePath) {
const dir = path.dirname(filePath);
fs.ensureDirSync(dir);
fs.writeJsonSync(filePath, report, { spaces: 2 });
}
/**
* Export architecture report to markdown
*/
export function exportArchitectureMarkdown(report, filePath) {
const markdown = generateMarkdownReport(report);
const dir = path.dirname(filePath);
fs.ensureDirSync(dir);
fs.writeFileSync(filePath, markdown);
}
/**
* Generate markdown report
*/
export function generateMarkdownReport(report) {
let md = `# Architecture Analysis Report\n\n`;
md += `Generated: ${new Date(report.timestamp).toLocaleString()}\n\n`;
md += `## Summary\n\n`;
md += `- **Overall Architecture**: ${report.overallArchitecture.toUpperCase()}\n`;
md += `- **Horizontal Score**: ${report.overallScores.horizontal}%\n`;
md += `- **Vertical Score**: ${report.overallScores.vertical}%\n`;
md += `- **Coupling**: ${report.globalMetrics.coupling} (lower is better)\n`;
md += `- **Cohesion**: ${report.globalMetrics.cohesion} (higher is better)\n\n`;
md += `## Repository Analysis\n\n`;
for (const repo of report.repositories) {
md += `### ${repo.name}\n\n`;
md += `- **Architecture Type**: ${repo.architecture}\n`;
md += `- **Horizontal**: ${repo.scores.horizontal}%\n`;
md += `- **Vertical**: ${repo.scores.vertical}%\n`;
md += `- **Coupling**: ${repo.metrics.coupling}\n`;
md += `- **Cohesion**: ${repo.metrics.cohesion}\n`;
md += `- **Directories**: ${repo.directories.length}\n\n`;
if (repo.directories.length > 0) {
md += `#### Directory Structure\n\n`;
md += `| Directory | Type | Files | Internal Imports |\n`;
md += `|-----------|------|-------|------------------|\n`;
for (const dir of repo.directories) {
md += `| ${dir.path} | ${dir.type} | ${dir.fileCount} | ${dir.internalImports} |\n`;
}
md += `\n`;
}
}
if (report.issues.length > 0) {
md += `## Issues\n\n`;
md += `Found ${report.issues.length} issue(s):\n\n`;
for (const issue of report.issues) {
md += `### ${issue.severity.toUpperCase()}: ${issue.title}\n\n`;
md += `${issue.description}\n\n`;
if (issue.recommendation) {
md += `**Recommendation**: ${issue.recommendation}\n\n`;
}
}
}
if (report.recommendations.length > 0) {
md += `## Recommendations\n\n`;
for (const rec of report.recommendations) {
md += `- ${rec}\n`;
}
md += `\n`;
}
if (report.effort) {
md += `## Migration Effort Estimates\n\n`;
md += `- **Estimated Effort**: ${report.effort.estimated}\n`;
md += `- **Breakeven Point**: ${report.effort.breakeven}\n`;
md += `- **3-Year ROI**: ${report.effort.roi3Year}%\n\n`;
}
return md;
}
/**
* Format architecture type for display
*/
function formatArchType(type) {
switch (type) {
case "horizontal":
return "📚 Horizontal (Layered)";
case "vertical":
return "🎯 Vertical (Feature-Sliced)";
case "hybrid":
return "🔄 Hybrid";
default:
return type;
}
}
//# sourceMappingURL=reporter.js.map