vibecodingmachine-core 2026.2.20-438 → 2026.2.26-1739

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +240 -0
  2. package/package.json +10 -2
  3. package/src/agents/Agent.js +300 -0
  4. package/src/agents/AgentAdditionService.js +311 -0
  5. package/src/agents/AgentCheckService.js +690 -0
  6. package/src/agents/AgentInstallationService.js +140 -0
  7. package/src/agents/AgentSetupService.js +467 -0
  8. package/src/agents/AgentStatus.js +183 -0
  9. package/src/agents/AgentVerificationService.js +634 -0
  10. package/src/agents/ConfigurationSchemaValidator.js +543 -0
  11. package/src/agents/EnvironmentConfigurationManager.js +602 -0
  12. package/src/agents/InstallationErrorHandler.js +372 -0
  13. package/src/agents/InstallationLog.js +363 -0
  14. package/src/agents/InstallationMethod.js +510 -0
  15. package/src/agents/InstallationOrchestrator.js +352 -0
  16. package/src/agents/InstallationProgressReporter.js +372 -0
  17. package/src/agents/InstallationRetryManager.js +322 -0
  18. package/src/agents/InstallationType.js +254 -0
  19. package/src/agents/OperationTypes.js +310 -0
  20. package/src/agents/PerformanceMetricsCollector.js +493 -0
  21. package/src/agents/SecurityValidationService.js +534 -0
  22. package/src/agents/VerificationTest.js +354 -0
  23. package/src/agents/VerificationType.js +226 -0
  24. package/src/agents/WindowsPermissionHandler.js +518 -0
  25. package/src/agents/config/AgentConfigManager.js +393 -0
  26. package/src/agents/config/AgentDefaultsRegistry.js +373 -0
  27. package/src/agents/config/ConfigValidator.js +281 -0
  28. package/src/agents/discovery/AgentDiscoveryService.js +707 -0
  29. package/src/agents/logging/AgentLogger.js +511 -0
  30. package/src/agents/status/AgentStatusManager.js +481 -0
  31. package/src/agents/storage/FileManager.js +454 -0
  32. package/src/agents/verification/AgentCommunicationTester.js +474 -0
  33. package/src/agents/verification/BaseVerifier.js +430 -0
  34. package/src/agents/verification/CommandVerifier.js +480 -0
  35. package/src/agents/verification/FileOperationVerifier.js +453 -0
  36. package/src/agents/verification/ResultAnalyzer.js +707 -0
  37. package/src/agents/verification/TestRequirementManager.js +495 -0
  38. package/src/agents/verification/VerificationRunner.js +433 -0
  39. package/src/agents/windows/BaseWindowsInstaller.js +441 -0
  40. package/src/agents/windows/ChocolateyInstaller.js +509 -0
  41. package/src/agents/windows/DirectInstaller.js +443 -0
  42. package/src/agents/windows/InstallerFactory.js +391 -0
  43. package/src/agents/windows/NpmInstaller.js +505 -0
  44. package/src/agents/windows/PowerShellInstaller.js +458 -0
  45. package/src/agents/windows/WinGetInstaller.js +390 -0
  46. package/src/analysis/analysis-reporter.js +132 -0
  47. package/src/analysis/boundary-detector.js +712 -0
  48. package/src/analysis/categorizer.js +340 -0
  49. package/src/analysis/codebase-scanner.js +384 -0
  50. package/src/analysis/line-counter.js +513 -0
  51. package/src/analysis/priority-calculator.js +679 -0
  52. package/src/analysis/report/analysis-report.js +250 -0
  53. package/src/analysis/report/package-analyzer.js +278 -0
  54. package/src/analysis/report/recommendation-generator.js +382 -0
  55. package/src/analysis/report/statistics-generator.js +515 -0
  56. package/src/analysis/reports/analysis-report-model.js +101 -0
  57. package/src/analysis/reports/recommendation-generator.js +283 -0
  58. package/src/analysis/reports/report-generators.js +191 -0
  59. package/src/analysis/reports/statistics-calculator.js +231 -0
  60. package/src/analysis/reports/trend-analyzer.js +219 -0
  61. package/src/analysis/strategy-generator.js +814 -0
  62. package/src/auto-mode/AutoModeBusinessLogic.js +836 -0
  63. package/src/config/refactoring-config.js +307 -0
  64. package/src/health-tracking/json-storage.js +38 -2
  65. package/src/ide-integration/applescript-manager-core.js +233 -0
  66. package/src/ide-integration/applescript-manager.cjs +357 -28
  67. package/src/ide-integration/applescript-manager.js +89 -3599
  68. package/src/ide-integration/cdp-manager.js +306 -0
  69. package/src/ide-integration/claude-code-cli-manager.cjs +1 -1
  70. package/src/ide-integration/continuation-handler.js +337 -0
  71. package/src/ide-integration/ide-status-checker.js +292 -0
  72. package/src/ide-integration/macos-ide-manager.js +627 -0
  73. package/src/ide-integration/macos-text-sender.js +528 -0
  74. package/src/ide-integration/response-reader.js +548 -0
  75. package/src/ide-integration/windows-automation-manager.js +121 -0
  76. package/src/ide-integration/windows-ide-manager.js +373 -0
  77. package/src/index.cjs +25 -3
  78. package/src/index.js +15 -1
  79. package/src/llm/direct-llm-manager.cjs +90 -2
  80. package/src/models/compliance-report.js +538 -0
  81. package/src/models/file-analysis.js +681 -0
  82. package/src/models/refactoring-plan.js +770 -0
  83. package/src/monitoring/alert-system.js +834 -0
  84. package/src/monitoring/compliance-progress-tracker.js +437 -0
  85. package/src/monitoring/continuous-scan-notifications.js +661 -0
  86. package/src/monitoring/continuous-scanner.js +279 -0
  87. package/src/monitoring/file-monitor/file-analyzer.js +262 -0
  88. package/src/monitoring/file-monitor/file-monitor.js +237 -0
  89. package/src/monitoring/file-monitor/watcher.js +194 -0
  90. package/src/monitoring/file-monitor.js +17 -0
  91. package/src/monitoring/notification-manager.js +437 -0
  92. package/src/monitoring/scanner-core.js +368 -0
  93. package/src/monitoring/scanner-events.js +214 -0
  94. package/src/monitoring/violation-notification-system.js +515 -0
  95. package/src/refactoring/boundaries/cohesion-analyzer.js +316 -0
  96. package/src/refactoring/boundaries/extraction-result.js +285 -0
  97. package/src/refactoring/boundaries/extraction-strategies.js +392 -0
  98. package/src/refactoring/boundaries/module-boundary.js +209 -0
  99. package/src/refactoring/boundary/boundary-detector.js +741 -0
  100. package/src/refactoring/boundary/boundary-types.js +405 -0
  101. package/src/refactoring/boundary/extraction-strategies.js +554 -0
  102. package/src/refactoring/boundary-extraction-result.js +77 -0
  103. package/src/refactoring/boundary-extraction-strategies.js +330 -0
  104. package/src/refactoring/boundary-extractor.js +384 -0
  105. package/src/refactoring/boundary-types.js +46 -0
  106. package/src/refactoring/circular/circular-dependency.js +88 -0
  107. package/src/refactoring/circular/cycle-detection.js +147 -0
  108. package/src/refactoring/circular/dependency-node.js +82 -0
  109. package/src/refactoring/circular/dependency-result.js +107 -0
  110. package/src/refactoring/circular/dependency-types.js +58 -0
  111. package/src/refactoring/circular/graph-builder.js +213 -0
  112. package/src/refactoring/circular/resolution-strategy.js +72 -0
  113. package/src/refactoring/circular/strategy-generator.js +229 -0
  114. package/src/refactoring/circular-dependency-resolver-original.js +809 -0
  115. package/src/refactoring/circular-dependency-resolver.js +200 -0
  116. package/src/refactoring/code-mover.js +761 -0
  117. package/src/refactoring/file-splitter.js +696 -0
  118. package/src/refactoring/functionality-validator.js +816 -0
  119. package/src/refactoring/import-manager.js +774 -0
  120. package/src/refactoring/module-boundary.js +107 -0
  121. package/src/refactoring/refactoring-executor.js +672 -0
  122. package/src/refactoring/refactoring-rollback.js +614 -0
  123. package/src/refactoring/test-validator.js +631 -0
  124. package/src/requirement-management/default-requirement-manager.js +321 -0
  125. package/src/requirement-management/requirement-file-parser.js +159 -0
  126. package/src/requirement-management/requirement-sequencer.js +221 -0
  127. package/src/rui/commands/AgentCommandParser.js +600 -0
  128. package/src/rui/commands/AgentCommands.js +487 -0
  129. package/src/rui/commands/AgentResponseFormatter.js +832 -0
  130. package/src/scripts/verify-full-compliance.js +269 -0
  131. package/src/sync/sync-engine-core.js +1 -0
  132. package/src/sync/sync-engine-remote-handlers.js +135 -0
  133. package/src/task-generation/automated-task-generator.js +351 -0
  134. package/src/task-generation/prioritizer.js +287 -0
  135. package/src/task-generation/task-list-updater.js +215 -0
  136. package/src/task-generation/task-management-integration.js +480 -0
  137. package/src/task-generation/task-manager-integration.js +270 -0
  138. package/src/task-generation/violation-task-generator.js +474 -0
  139. package/src/task-management/continuous-scan-integration.js +342 -0
  140. package/src/timeout-management/index.js +12 -3
  141. package/src/timeout-management/response-time-tracker.js +167 -0
  142. package/src/timeout-management/timeout-calculator.js +159 -0
  143. package/src/timeout-management/timeout-config-manager.js +172 -0
  144. package/src/utils/ast-analyzer.js +417 -0
  145. package/src/utils/current-requirement-manager.js +276 -0
  146. package/src/utils/current-requirement-operations.js +472 -0
  147. package/src/utils/dependency-mapper.js +456 -0
  148. package/src/utils/download-with-progress.js +4 -2
  149. package/src/utils/electron-update-checker.js +4 -1
  150. package/src/utils/file-size-analyzer.js +272 -0
  151. package/src/utils/import-updater.js +280 -0
  152. package/src/utils/refactoring-tools.js +512 -0
  153. package/src/utils/report-generator.js +569 -0
  154. package/src/utils/reports/report-analysis.js +218 -0
  155. package/src/utils/reports/report-types.js +55 -0
  156. package/src/utils/reports/summary-generators.js +102 -0
  157. package/src/utils/requirement-file-management.js +157 -0
  158. package/src/utils/requirement-helpers/requirement-file-ops.js +392 -0
  159. package/src/utils/requirement-helpers/requirement-mover.js +414 -0
  160. package/src/utils/requirement-helpers/requirement-parser.js +326 -0
  161. package/src/utils/requirement-helpers/requirement-status.js +320 -0
  162. package/src/utils/requirement-helpers-new.js +55 -0
  163. package/src/utils/requirement-helpers-refactored.js +367 -0
  164. package/src/utils/requirement-helpers.js +291 -1191
  165. package/src/utils/requirement-movement-operations.js +450 -0
  166. package/src/utils/requirement-movement.js +312 -0
  167. package/src/utils/requirement-parsing-helpers.js +56 -0
  168. package/src/utils/requirement-statistics.js +200 -0
  169. package/src/utils/requirement-text-utils.js +58 -0
  170. package/src/utils/rollback/rollback-handlers.js +125 -0
  171. package/src/utils/rollback/rollback-operation.js +63 -0
  172. package/src/utils/rollback/rollback-recorder.js +166 -0
  173. package/src/utils/rollback/rollback-state-manager.js +175 -0
  174. package/src/utils/rollback/rollback-types.js +33 -0
  175. package/src/utils/rollback/rollback-utils.js +110 -0
  176. package/src/utils/rollback-manager-original.js +569 -0
  177. package/src/utils/rollback-manager.js +202 -0
  178. package/src/utils/smoke-test-cli.js +362 -0
  179. package/src/utils/smoke-test-gui.js +351 -0
  180. package/src/utils/smoke-test-orchestrator.js +321 -0
  181. package/src/utils/smoke-test-runner.js +60 -0
  182. package/src/utils/smoke-test-web.js +347 -0
  183. package/src/utils/specification-helpers.js +39 -13
  184. package/src/utils/specification-migration.js +97 -0
  185. package/src/utils/test-runner.js +579 -0
  186. package/src/utils/validation-framework.js +518 -0
  187. package/src/validation/compliance-analyzer.js +197 -0
  188. package/src/validation/compliance-report-generator.js +343 -0
  189. package/src/validation/compliance-reporter.js +711 -0
  190. package/src/validation/compliance-rules.js +127 -0
  191. package/src/validation/constitution-validator-new.js +196 -0
  192. package/src/validation/constitution-validator.js +17 -0
  193. package/src/validation/file-validators.js +170 -0
  194. package/src/validation/line-limit/file-analyzer.js +201 -0
  195. package/src/validation/line-limit/line-limit-validator.js +208 -0
  196. package/src/validation/line-limit/validation-result.js +144 -0
  197. package/src/validation/line-limit-core.js +225 -0
  198. package/src/validation/line-limit-reporter.js +134 -0
  199. package/src/validation/line-limit-result.js +125 -0
  200. package/src/validation/line-limit-validator.js +41 -0
  201. package/src/validation/metrics-calculator.js +660 -0
  202. package/src/sync/sync-engine-backup.js +0 -559
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Compliance Report Generator
3
+ *
4
+ * Generates comprehensive compliance reports with metrics and analysis.
5
+ */
6
+
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+ const { getComplianceSummary } = require('./constitution-validator');
10
+
11
+ /**
12
+ * Compliance Report Generator
13
+ */
14
+ class ComplianceReportGenerator {
15
+ constructor(options = {}) {
16
+ this.options = {
17
+ outputPath: options.outputPath || './compliance-report.json',
18
+ format: options.format || 'json', // json, markdown, html
19
+ includeDetails: options.includeDetails !== false,
20
+ includeRecommendations: options.includeRecommendations !== false,
21
+ ...options
22
+ };
23
+ }
24
+
25
+ /**
26
+ * Generate compliance report from validation results
27
+ */
28
+ generateReport(validationResults, options = {}) {
29
+ const config = { ...this.options, ...options };
30
+ const summary = getComplianceSummary(validationResults);
31
+
32
+ const report = {
33
+ metadata: this._generateMetadata(),
34
+ summary: this._enhanceSummary(summary),
35
+ analysis: this._generateAnalysis(validationResults, summary),
36
+ recommendations: this._generateRecommendations(summary),
37
+ details: config.includeDetails ? this._generateDetails(validationResults) : undefined
38
+ };
39
+
40
+ return report;
41
+ }
42
+
43
+ /**
44
+ * Save report to file
45
+ */
46
+ async saveReport(report, outputPath) {
47
+ const filePath = outputPath || this.options.outputPath;
48
+
49
+ try {
50
+ let content;
51
+
52
+ switch (this.options.format) {
53
+ case 'json':
54
+ content = JSON.stringify(report, null, 2);
55
+ break;
56
+
57
+ case 'markdown':
58
+ content = this._generateMarkdownReport(report);
59
+ break;
60
+
61
+ case 'html':
62
+ content = this._generateHtmlReport(report);
63
+ break;
64
+
65
+ default:
66
+ throw new Error(`Unsupported format: ${this.options.format}`);
67
+ }
68
+
69
+ await fs.promises.writeFile(filePath, content, 'utf8');
70
+ return filePath;
71
+
72
+ } catch (error) {
73
+ throw new Error(`Failed to save report: ${error.message}`);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Generate report metadata
79
+ */
80
+ _generateMetadata() {
81
+ return {
82
+ generatedAt: new Date().toISOString(),
83
+ generator: 'Vibe Coding Machine - Compliance Report Generator',
84
+ version: '1.0.0',
85
+ projectRoot: process.cwd(),
86
+ nodeVersion: process.version,
87
+ platform: process.platform
88
+ };
89
+ }
90
+
91
+ /**
92
+ * Enhance summary with additional metrics
93
+ */
94
+ _enhanceSummary(summary) {
95
+ return {
96
+ ...summary,
97
+ complianceRate: summary.totalFiles > 0 ? (summary.compliantFiles / summary.totalFiles * 100).toFixed(2) : 0,
98
+ averageIssuesPerFile: summary.nonCompliantFiles > 0 ? (summary.totalIssues / summary.nonCompliantFiles).toFixed(2) : 0,
99
+ criticalIssues: summary.issuesBySeverity.error || 0,
100
+ warningIssues: summary.issuesBySeverity.warning || 0,
101
+ infoIssues: summary.issuesBySeverity.info || 0
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Generate analysis section
107
+ */
108
+ _generateAnalysis(validationResults, summary) {
109
+ const analysis = {
110
+ topIssues: this._getTopIssues(validationResults),
111
+ fileTypes: this._analyzeFileTypes(validationResults),
112
+ severityDistribution: summary.issuesBySeverity,
113
+ categoryDistribution: summary.issuesByCategory,
114
+ trends: this._generateTrends(validationResults)
115
+ };
116
+
117
+ return analysis;
118
+ }
119
+
120
+ /**
121
+ * Generate recommendations
122
+ */
123
+ _generateRecommendations(summary) {
124
+ const recommendations = [];
125
+
126
+ if (summary.criticalIssues > 0) {
127
+ recommendations.push({
128
+ priority: 'high',
129
+ category: 'critical',
130
+ title: 'Address Critical Issues',
131
+ description: `Fix ${summary.criticalIssues} critical issue(s) that prevent compliance`,
132
+ action: 'Review and fix all error-level issues'
133
+ });
134
+ }
135
+
136
+ if (summary.complianceRate < 90) {
137
+ recommendations.push({
138
+ priority: 'medium',
139
+ category: 'compliance',
140
+ title: 'Improve Overall Compliance',
141
+ description: `Current compliance rate is ${summary.complianceRate}%, target is 90%+`,
142
+ action: 'Focus on fixing warning-level issues to improve compliance'
143
+ });
144
+ }
145
+
146
+ if (summary.issuesByCategory.file_size > 0) {
147
+ recommendations.push({
148
+ priority: 'high',
149
+ category: 'file_size',
150
+ title: 'Reduce File Sizes',
151
+ description: `${summary.issuesByCategory.file_size} files exceed the 555-line limit`,
152
+ action: 'Refactor large files into smaller, focused modules'
153
+ });
154
+ }
155
+
156
+ if (summary.issuesByCategory.code_structure > 5) {
157
+ recommendations.push({
158
+ priority: 'medium',
159
+ category: 'code_structure',
160
+ title: 'Improve Code Structure',
161
+ description: `Found ${summary.issuesByCategory.code_structure} code structure issues`,
162
+ action: 'Review coding standards and apply consistent formatting'
163
+ });
164
+ }
165
+
166
+ return recommendations;
167
+ }
168
+
169
+ /**
170
+ * Generate detailed issues list
171
+ */
172
+ _generateDetails(validationResults) {
173
+ const details = [];
174
+
175
+ for (const [filePath, issues] of validationResults) {
176
+ if (issues.length > 0) {
177
+ details.push({
178
+ file: filePath,
179
+ issueCount: issues.length,
180
+ issues: issues.map(issue => ({
181
+ rule: issue.rule,
182
+ severity: issue.severity,
183
+ category: issue.category,
184
+ message: issue.message,
185
+ line: issue.line,
186
+ column: issue.column
187
+ }))
188
+ });
189
+ }
190
+ }
191
+
192
+ return details.sort((a, b) => b.issueCount - a.issueCount);
193
+ }
194
+
195
+ /**
196
+ * Get top issues by frequency
197
+ */
198
+ _getTopIssues(validationResults) {
199
+ const issueCounts = {};
200
+
201
+ for (const [filePath, issues] of validationResults) {
202
+ for (const issue of issues) {
203
+ const key = `${issue.rule}:${issue.category}`;
204
+ issueCounts[key] = (issueCounts[key] || 0) + 1;
205
+ }
206
+ }
207
+
208
+ return Object.entries(issueCounts)
209
+ .map(([key, count]) => {
210
+ const [rule, category] = key.split(':');
211
+ return { rule, category, count };
212
+ })
213
+ .sort((a, b) => b.count - a.count)
214
+ .slice(0, 10);
215
+ }
216
+
217
+ /**
218
+ * Analyze file types
219
+ */
220
+ _analyzeFileTypes(validationResults) {
221
+ const typeStats = {};
222
+
223
+ for (const [filePath, issues] of validationResults) {
224
+ const ext = path.extname(filePath);
225
+ if (!typeStats[ext]) {
226
+ typeStats[ext] = { files: 0, issues: 0, compliant: 0 };
227
+ }
228
+
229
+ typeStats[ext].files++;
230
+ typeStats[ext].issues += issues.length;
231
+ if (issues.length === 0) {
232
+ typeStats[ext].compliant++;
233
+ }
234
+ }
235
+
236
+ return typeStats;
237
+ }
238
+
239
+ /**
240
+ * Generate trends (placeholder for future enhancement)
241
+ */
242
+ _generateTrends(validationResults) {
243
+ return {
244
+ note: 'Trend analysis requires historical data',
245
+ suggestion: 'Run compliance checks regularly to track trends over time'
246
+ };
247
+ }
248
+
249
+ /**
250
+ * Generate markdown report
251
+ */
252
+ _generateMarkdownReport(report) {
253
+ const sections = [];
254
+
255
+ sections.push('# Compliance Report');
256
+ sections.push(`Generated: ${new Date(report.metadata.generatedAt).toLocaleString()}`);
257
+ sections.push('');
258
+
259
+ // Summary
260
+ sections.push('## Summary');
261
+ sections.push(`- Total Files: ${report.summary.totalFiles}`);
262
+ sections.push(`- Compliant Files: ${report.summary.compliantFiles}`);
263
+ sections.push(`- Non-Compliant Files: ${report.summary.nonCompliantFiles}`);
264
+ sections.push(`- Compliance Rate: ${report.summary.complianceRate}%`);
265
+ sections.push(`- Total Issues: ${report.summary.totalIssues}`);
266
+ sections.push('');
267
+
268
+ // Recommendations
269
+ if (report.recommendations.length > 0) {
270
+ sections.push('## Recommendations');
271
+ report.recommendations.forEach(rec => {
272
+ sections.push(`### ${rec.title} (${rec.priority})`);
273
+ sections.push(`${rec.description}`);
274
+ sections.push(`**Action:** ${rec.action}`);
275
+ sections.push('');
276
+ });
277
+ }
278
+
279
+ // Top Issues
280
+ if (report.analysis.topIssues.length > 0) {
281
+ sections.push('## Top Issues');
282
+ report.analysis.topIssues.forEach((issue, index) => {
283
+ sections.push(`${index + 1}. **${issue.rule}** (${issue.category}): ${issue.count} occurrences`);
284
+ });
285
+ sections.push('');
286
+ }
287
+
288
+ return sections.join('\n');
289
+ }
290
+
291
+ /**
292
+ * Generate HTML report
293
+ */
294
+ _generateHtmlReport(report) {
295
+ return `
296
+ <!DOCTYPE html>
297
+ <html>
298
+ <head>
299
+ <title>Compliance Report</title>
300
+ <style>
301
+ body { font-family: Arial, sans-serif; margin: 20px; }
302
+ .summary { background: #f5f5f5; padding: 15px; border-radius: 5px; }
303
+ .recommendation { margin: 10px 0; padding: 10px; border-left: 4px solid #007cba; }
304
+ .high-priority { border-left-color: #d32f2f; }
305
+ .medium-priority { border-left-color: #f57c00; }
306
+ .low-priority { border-left-color: #388e3c; }
307
+ </style>
308
+ </head>
309
+ <body>
310
+ <h1>Compliance Report</h1>
311
+ <p>Generated: ${new Date(report.metadata.generatedAt).toLocaleString()}</p>
312
+
313
+ <div class="summary">
314
+ <h2>Summary</h2>
315
+ <p>Total Files: ${report.summary.totalFiles}</p>
316
+ <p>Compliant Files: ${report.summary.compliantFiles}</p>
317
+ <p>Non-Compliant Files: ${report.summary.nonCompliantFiles}</p>
318
+ <p>Compliance Rate: ${report.summary.complianceRate}%</p>
319
+ <p>Total Issues: ${report.summary.totalIssues}</p>
320
+ </div>
321
+
322
+ <h2>Recommendations</h2>
323
+ ${report.recommendations.map(rec => `
324
+ <div class="recommendation ${rec.priority}-priority">
325
+ <h3>${rec.title} (${rec.priority})</h3>
326
+ <p>${rec.description}</p>
327
+ <p><strong>Action:</strong> ${rec.action}</p>
328
+ </div>
329
+ `).join('')}
330
+ </body>
331
+ </html>`;
332
+ }
333
+ }
334
+
335
+ // Export singleton instance
336
+ const generator = new ComplianceReportGenerator();
337
+
338
+ module.exports = {
339
+ ComplianceReportGenerator,
340
+ generator,
341
+ generateReport: (results, options) => generator.generateReport(results, options),
342
+ saveReport: (report, outputPath) => generator.saveReport(report, outputPath)
343
+ };