MarkdownReporter.tsโข3.26 kB
/**
* Markdown Reporter - Generates markdown reports for GitHub
* Placeholder implementation - to be completed
*/
import type { SecurityReport, ScanResult, SecurityFinding } from '../types.js';
export class MarkdownReporter implements SecurityReport {
private result: ScanResult;
constructor(result: ScanResult) {
this.result = result;
}
generate(): string {
const lines: string[] = [];
// Header
lines.push('# Security Audit Report');
lines.push('');
lines.push(`Generated: ${new Date().toISOString()}`);
lines.push(`Duration: ${this.result.duration}ms`);
lines.push('');
// Summary
lines.push('## Summary');
lines.push('');
lines.push(`- **Total Findings**: ${this.result.findings.length}`);
lines.push(`- **Files Scanned**: ${this.result.scannedFiles}`);
lines.push('');
// Findings by severity
lines.push('### Findings by Severity');
lines.push('');
lines.push(`- ๐ด **Critical**: ${this.result.summary.bySeverity.critical}`);
lines.push(`- ๐ **High**: ${this.result.summary.bySeverity.high}`);
lines.push(`- ๐ก **Medium**: ${this.result.summary.bySeverity.medium}`);
lines.push(`- ๐ข **Low**: ${this.result.summary.bySeverity.low}`);
lines.push(`- โน๏ธ **Info**: ${this.result.summary.bySeverity.info}`);
lines.push('');
// Detailed findings
if (this.result.findings.length > 0) {
lines.push('## Detailed Findings');
lines.push('');
// Group by severity
const severityOrder: Array<import('../types.js').SeverityLevel> = ['critical', 'high', 'medium', 'low', 'info'];
for (const severity of severityOrder) {
const findings = this.result.findings.filter(f => f.severity === severity);
if (findings.length === 0) continue;
lines.push(`### ${severity.toUpperCase()} (${findings.length})`);
lines.push('');
for (const finding of findings) {
lines.push(`#### ${finding.ruleId}: ${finding.message}`);
lines.push('');
lines.push(`- **File**: \`${finding.file}\``);
if (finding.line) lines.push(`- **Line**: ${finding.line}`);
if (finding.column) lines.push(`- **Column**: ${finding.column}`);
if (finding.code) lines.push(`- **Code**: \`${finding.code.substring(0, 100)}${finding.code.length > 100 ? '...' : ''}\``);
lines.push(`- **Confidence**: ${finding.confidence || 'medium'}`);
if (finding.remediation) lines.push(`- **Remediation**: ${finding.remediation}`);
lines.push('');
}
}
}
// Recommendations
lines.push('## Recommendations');
lines.push('');
lines.push('1. Address all critical and high severity issues immediately');
lines.push('2. Review medium severity issues and plan remediation');
lines.push('3. Consider adding suppressions for false positives');
lines.push('4. Run security audit regularly (e.g., in CI/CD pipeline)');
lines.push('');
return lines.join('\n');
}
getSummary(): string {
return `Found ${this.result.findings.length} security issues`;
}
getFindings(): SecurityFinding[] {
return this.result.findings;
}
}