agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
192 lines (170 loc) โข 5.86 kB
JavaScript
/**
* @file Output formatter for problem-scope CLI
* @description Formats and displays analysis results
*/
/**
* Output analysis results in specified format
* @param {Object} results - Analysis results
* @param {string} format - Output format (json, summary, detailed)
*/
function outputResults(results, format = 'summary') {
switch (format) {
case 'json':
outputJSON(results);
break;
case 'detailed':
outputDetailed(results);
break;
case 'summary':
default:
outputSummary(results);
break;
}
}
/**
* Output results as JSON
* @param {Object} results - Analysis results
*/
function outputJSON(results) {
console.log(JSON.stringify(results, null, 2));
}
/**
* Output summary format
* @param {Object} results - Analysis results
*/
function outputSummary(results) {
console.log('\n๐ฏ PROBLEM SCOPE ANALYSIS SUMMARY');
console.log('===============================================');
// Overall summary
const riskIcon = getRiskIcon(results.summary.overallRiskLevel);
console.log(`${riskIcon} Overall Risk Level: ${results.summary.overallRiskLevel}`);
console.log(`๐ Total Issues: ${results.summary.totalIssues}`);
console.log(`๐จ Critical Issues: ${results.summary.criticalIssues}`);
console.log(`๐ก Recommendations: ${results.summary.recommendationsCount}`);
console.log(`โฑ๏ธ Execution Time: ${results.metadata.executionTime}ms\n`);
// Analysis breakdown
console.log('๐ ANALYSIS BREAKDOWN');
console.log('===============================================');
Object.entries(results.analyses).forEach(([type, analysis]) => {
const typeIcon = getAnalysisIcon(type);
const severityIcon = getRiskIcon(analysis.severity || 'LOW');
if (analysis.error) {
console.log(`${typeIcon} ${type.toUpperCase()}: โ Failed - ${analysis.error}`);
} else {
const issueCount = getIssueCount(analysis);
console.log(`${typeIcon} ${type.toUpperCase()}: ${severityIcon} ${analysis.severity || 'LOW'} (${issueCount} issues)`);
}
});
// Priority areas
if (results.summary.scopeAssessment.priorityAreas.length > 0) {
console.log('\n๐ฏ PRIORITY AREAS');
console.log('===============================================');
results.summary.scopeAssessment.priorityAreas.forEach(area => {
console.log(`โก ${area.toUpperCase()}`);
});
}
console.log('\n');
}
/**
* Output detailed format
* @param {Object} results - Analysis results
*/
function outputDetailed(results) {
outputSummary(results);
console.log('๐ DETAILED ANALYSIS RESULTS');
console.log('===============================================\n');
Object.entries(results.analyses).forEach(([type, analysis]) => {
console.log(`\n๐ ${type.toUpperCase()} ANALYSIS`);
console.log('-'.repeat(50));
if (analysis.error) {
console.log(`โ Error: ${analysis.error}\n`);
return;
}
console.log(`๐ฏ Severity: ${analysis.severity || 'LOW'}`);
// Show vulnerabilities
if (analysis.vulnerabilities && analysis.vulnerabilities.length > 0) {
console.log(`\n๐ Vulnerabilities (${analysis.vulnerabilities.length}):`);
analysis.vulnerabilities.slice(0, 10).forEach((vuln, i) => {
console.log(` ${i + 1}. [${vuln.severity}] ${vuln.title || vuln.description}`);
if (vuln.file) console.log(` ๐ ${vuln.file}:${vuln.line || '?'}`);
});
if (analysis.vulnerabilities.length > 10) {
console.log(` ... and ${analysis.vulnerabilities.length - 10} more`);
}
}
// Show violations
if (analysis.violations && analysis.violations.length > 0) {
console.log(`\nโ ๏ธ Violations (${analysis.violations.length}):`);
analysis.violations.slice(0, 10).forEach((violation, i) => {
console.log(` ${i + 1}. [${violation.severity}] ${violation.description}`);
if (violation.file) console.log(` ๐ ${violation.file}:${violation.line || '?'}`);
});
if (analysis.violations.length > 10) {
console.log(` ... and ${analysis.violations.length - 10} more`);
}
}
// Show opportunities
if (analysis.opportunities && analysis.opportunities.length > 0) {
console.log(`\n๐ก Opportunities (${analysis.opportunities.length}):`);
analysis.opportunities.slice(0, 10).forEach((opp, i) => {
console.log(` ${i + 1}. ${opp.description || opp.title}`);
if (opp.file) console.log(` ๐ ${opp.file}`);
});
if (analysis.opportunities.length > 10) {
console.log(` ... and ${analysis.opportunities.length - 10} more`);
}
}
console.log();
});
}
/**
* Get risk level icon
* @param {string} level - Risk level
* @returns {string} Icon
*/
function getRiskIcon(level) {
const icons = {
CRITICAL: '๐ด',
HIGH: '๐ ',
MEDIUM: '๐ก',
LOW: '๐ข'
};
return icons[level] || 'โช';
}
/**
* Get analysis type icon
* @param {string} type - Analysis type
* @returns {string} Icon
*/
function getAnalysisIcon(type) {
const icons = {
dependencies: '๐',
complexity: '๐งฎ',
security: '๐',
debt: '๐ธ',
srp: '๐',
cleanup: '๐งน',
refactoring: '๐ง',
performance: 'โก',
scalability: '๐'
};
return icons[type] || '๐';
}
/**
* Get issue count from analysis
* @param {Object} analysis - Analysis object
* @returns {number} Issue count
*/
function getIssueCount(analysis) {
let count = 0;
if (analysis.vulnerabilities) count += analysis.vulnerabilities.length;
if (analysis.violations) count += analysis.violations.length;
if (analysis.opportunities) count += analysis.opportunities.length;
return count;
}
module.exports = {
outputResults,
outputJSON,
outputSummary,
outputDetailed
};