UNPKG

mcp-siber-security-audit

Version:

MCP server for security code audit with auto-fix capabilities

75 lines (63 loc) 2.03 kB
const fs = require('fs'); const path = require('path'); class ReportGenerator { constructor() { this.report = { metadata: { timestamp: new Date().toISOString(), version: require('../../package.json').version }, summary: { totalIssues: 0, bySeverity: { high: 0, medium: 0, low: 0 }, byType: {}, byScanner: {} }, issues: [] }; } addIssues(issues) { // Sort issues by severity and file const sortedIssues = [...issues].sort((a, b) => { const severityOrder = { high: 3, medium: 2, low: 1 }; if (severityOrder[a.severity] !== severityOrder[b.severity]) { return severityOrder[b.severity] - severityOrder[a.severity]; } return a.file.localeCompare(b.file); }); this.report.issues = this.report.issues.concat(sortedIssues); this._updateSummary(); } _updateSummary() { const summary = this.report.summary; summary.totalIssues = this.report.issues.length; // Reset counters summary.bySeverity = { high: 0, medium: 0, low: 0 }; summary.byType = {}; summary.byScanner = {}; // Count issues for (const issue of this.report.issues) { // Count by severity summary.bySeverity[issue.severity]++; // Count by type summary.byType[issue.type] = (summary.byType[issue.type] || 0) + 1; // Count by scanner summary.byScanner[issue.scanner] = (summary.byScanner[issue.scanner] || 0) + 1; } } saveReport(outputDir = 'security-reports') { // Create output directory if it doesn't exist if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const jsonPath = path.join(outputDir, `security-report-${timestamp}.json`); fs.writeFileSync(jsonPath, JSON.stringify(this.report, null, 2)); return { jsonPath }; } } module.exports = ReportGenerator;