@oalacea/daemon 0.6.4 → 0.7.0

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 (285) hide show
  1. package/README.md +268 -58
  2. package/bin/Dockerfile +158 -16
  3. package/dist/cli/cli.d.ts.map +1 -1
  4. package/dist/cli/cli.js +22 -2
  5. package/dist/cli/cli.js.map +1 -1
  6. package/dist/cli/commands/command.types.d.ts +216 -0
  7. package/dist/cli/commands/command.types.d.ts.map +1 -0
  8. package/dist/cli/commands/command.types.js +64 -0
  9. package/dist/cli/commands/command.types.js.map +1 -0
  10. package/dist/cli/commands/history.command.d.ts +91 -0
  11. package/dist/cli/commands/history.command.d.ts.map +1 -0
  12. package/dist/cli/commands/history.command.js +336 -0
  13. package/dist/cli/commands/history.command.js.map +1 -0
  14. package/dist/cli/commands/index.d.ts +14 -3
  15. package/dist/cli/commands/index.d.ts.map +1 -1
  16. package/dist/cli/commands/index.js +7 -0
  17. package/dist/cli/commands/index.js.map +1 -1
  18. package/dist/cli/commands/optimize.command.d.ts +110 -0
  19. package/dist/cli/commands/optimize.command.d.ts.map +1 -0
  20. package/dist/cli/commands/optimize.command.js +497 -0
  21. package/dist/cli/commands/optimize.command.js.map +1 -0
  22. package/dist/cli/commands/report.command.d.ts +110 -0
  23. package/dist/cli/commands/report.command.d.ts.map +1 -0
  24. package/dist/cli/commands/report.command.js +532 -0
  25. package/dist/cli/commands/report.command.js.map +1 -0
  26. package/dist/cli/commands/review.command.d.ts +110 -0
  27. package/dist/cli/commands/review.command.d.ts.map +1 -0
  28. package/dist/cli/commands/review.command.js +520 -0
  29. package/dist/cli/commands/review.command.js.map +1 -0
  30. package/dist/cli/commands/score.command.d.ts +47 -0
  31. package/dist/cli/commands/score.command.d.ts.map +1 -0
  32. package/dist/cli/commands/score.command.js +261 -0
  33. package/dist/cli/commands/score.command.js.map +1 -0
  34. package/dist/cli/utils/index.d.ts +10 -0
  35. package/dist/cli/utils/index.d.ts.map +1 -0
  36. package/dist/cli/utils/index.js +10 -0
  37. package/dist/cli/utils/index.js.map +1 -0
  38. package/dist/cli/utils/output.d.ts +192 -0
  39. package/dist/cli/utils/output.d.ts.map +1 -0
  40. package/dist/cli/utils/output.js +411 -0
  41. package/dist/cli/utils/output.js.map +1 -0
  42. package/dist/cli/utils/progress.d.ts +204 -0
  43. package/dist/cli/utils/progress.d.ts.map +1 -0
  44. package/dist/cli/utils/progress.js +396 -0
  45. package/dist/cli/utils/progress.js.map +1 -0
  46. package/dist/core/types/index.d.ts +1 -0
  47. package/dist/core/types/index.d.ts.map +1 -1
  48. package/dist/core/types/project.types.d.ts +3 -3
  49. package/dist/core/types/project.types.d.ts.map +1 -1
  50. package/dist/core/types/scoring.types.d.ts +301 -0
  51. package/dist/core/types/scoring.types.d.ts.map +1 -0
  52. package/dist/core/types/scoring.types.js +8 -0
  53. package/dist/core/types/scoring.types.js.map +1 -0
  54. package/dist/services/detection/framework-detector.d.ts.map +1 -1
  55. package/dist/services/detection/framework-detector.js +74 -5
  56. package/dist/services/detection/framework-detector.js.map +1 -1
  57. package/dist/services/index.d.ts +12 -0
  58. package/dist/services/index.d.ts.map +1 -1
  59. package/dist/services/index.js +14 -0
  60. package/dist/services/index.js.map +1 -1
  61. package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
  62. package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
  63. package/dist/services/optimization/detectors/bug-detector.js +443 -0
  64. package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
  65. package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
  66. package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
  67. package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
  68. package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
  69. package/dist/services/optimization/detectors/index.d.ts +7 -0
  70. package/dist/services/optimization/detectors/index.d.ts.map +1 -0
  71. package/dist/services/optimization/detectors/index.js +7 -0
  72. package/dist/services/optimization/detectors/index.js.map +1 -0
  73. package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
  74. package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
  75. package/dist/services/optimization/detectors/perf-detector.js +451 -0
  76. package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
  77. package/dist/services/optimization/index.d.ts +61 -0
  78. package/dist/services/optimization/index.d.ts.map +1 -0
  79. package/dist/services/optimization/index.js +69 -0
  80. package/dist/services/optimization/index.js.map +1 -0
  81. package/dist/services/optimization/optimization.service.d.ts +65 -0
  82. package/dist/services/optimization/optimization.service.d.ts.map +1 -0
  83. package/dist/services/optimization/optimization.service.js +511 -0
  84. package/dist/services/optimization/optimization.service.js.map +1 -0
  85. package/dist/services/optimization/optimization.types.d.ts +343 -0
  86. package/dist/services/optimization/optimization.types.d.ts.map +1 -0
  87. package/dist/services/optimization/optimization.types.js +8 -0
  88. package/dist/services/optimization/optimization.types.js.map +1 -0
  89. package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
  90. package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
  91. package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
  92. package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
  93. package/dist/services/optimization/optimizers/index.d.ts +7 -0
  94. package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
  95. package/dist/services/optimization/optimizers/index.js +7 -0
  96. package/dist/services/optimization/optimizers/index.js.map +1 -0
  97. package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
  98. package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
  99. package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
  100. package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
  101. package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
  102. package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
  103. package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
  104. package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
  105. package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
  106. package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
  107. package/dist/services/optimization/patterns/anti-patterns.js +501 -0
  108. package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
  109. package/dist/services/optimization/patterns/index.d.ts +5 -0
  110. package/dist/services/optimization/patterns/index.d.ts.map +1 -0
  111. package/dist/services/optimization/patterns/index.js +5 -0
  112. package/dist/services/optimization/patterns/index.js.map +1 -0
  113. package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
  114. package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
  115. package/dist/services/reporting/export/chart.exporter.js +350 -0
  116. package/dist/services/reporting/export/chart.exporter.js.map +1 -0
  117. package/dist/services/reporting/export/index.d.ts +9 -0
  118. package/dist/services/reporting/export/index.d.ts.map +1 -0
  119. package/dist/services/reporting/export/index.js +10 -0
  120. package/dist/services/reporting/export/index.js.map +1 -0
  121. package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
  122. package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
  123. package/dist/services/reporting/export/pdf.exporter.js +270 -0
  124. package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
  125. package/dist/services/reporting/history.service.d.ts +93 -0
  126. package/dist/services/reporting/history.service.d.ts.map +1 -0
  127. package/dist/services/reporting/history.service.js +285 -0
  128. package/dist/services/reporting/history.service.js.map +1 -0
  129. package/dist/services/reporting/index.d.ts +15 -0
  130. package/dist/services/reporting/index.d.ts.map +1 -0
  131. package/dist/services/reporting/index.js +16 -0
  132. package/dist/services/reporting/index.js.map +1 -0
  133. package/dist/services/reporting/report.service.d.ts +102 -0
  134. package/dist/services/reporting/report.service.d.ts.map +1 -0
  135. package/dist/services/reporting/report.service.js +240 -0
  136. package/dist/services/reporting/report.service.js.map +1 -0
  137. package/dist/services/reporting/reporting.types.d.ts +329 -0
  138. package/dist/services/reporting/reporting.types.d.ts.map +1 -0
  139. package/dist/services/reporting/reporting.types.js +8 -0
  140. package/dist/services/reporting/reporting.types.js.map +1 -0
  141. package/dist/services/reporting/templates/html.template.d.ts +81 -0
  142. package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
  143. package/dist/services/reporting/templates/html.template.js +741 -0
  144. package/dist/services/reporting/templates/html.template.js.map +1 -0
  145. package/dist/services/reporting/templates/json.template.d.ts +85 -0
  146. package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
  147. package/dist/services/reporting/templates/json.template.js +308 -0
  148. package/dist/services/reporting/templates/json.template.js.map +1 -0
  149. package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
  150. package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
  151. package/dist/services/reporting/templates/markdown.template.js +311 -0
  152. package/dist/services/reporting/templates/markdown.template.js.map +1 -0
  153. package/dist/services/reporting/trend-analyzer.d.ts +73 -0
  154. package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
  155. package/dist/services/reporting/trend-analyzer.js +291 -0
  156. package/dist/services/reporting/trend-analyzer.js.map +1 -0
  157. package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
  158. package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
  159. package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
  160. package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
  161. package/dist/services/review/analyzers/index.d.ts +13 -0
  162. package/dist/services/review/analyzers/index.d.ts.map +1 -0
  163. package/dist/services/review/analyzers/index.js +13 -0
  164. package/dist/services/review/analyzers/index.js.map +1 -0
  165. package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
  166. package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
  167. package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
  168. package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
  169. package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
  170. package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
  171. package/dist/services/review/analyzers/performance-analyzer.js +589 -0
  172. package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
  173. package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
  174. package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
  175. package/dist/services/review/analyzers/security-analyzer.js +512 -0
  176. package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
  177. package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
  178. package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
  179. package/dist/services/review/analyzers/static-analyzer.js +423 -0
  180. package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
  181. package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
  182. package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
  183. package/dist/services/review/fixers/auto-fixer.js +404 -0
  184. package/dist/services/review/fixers/auto-fixer.js.map +1 -0
  185. package/dist/services/review/fixers/index.d.ts +11 -0
  186. package/dist/services/review/fixers/index.d.ts.map +1 -0
  187. package/dist/services/review/fixers/index.js +11 -0
  188. package/dist/services/review/fixers/index.js.map +1 -0
  189. package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
  190. package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
  191. package/dist/services/review/fixers/refactor-suggester.js +555 -0
  192. package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
  193. package/dist/services/review/fixers/test-generator.d.ts +99 -0
  194. package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
  195. package/dist/services/review/fixers/test-generator.js +458 -0
  196. package/dist/services/review/fixers/test-generator.js.map +1 -0
  197. package/dist/services/review/index.d.ts +14 -0
  198. package/dist/services/review/index.d.ts.map +1 -0
  199. package/dist/services/review/index.js +14 -0
  200. package/dist/services/review/index.js.map +1 -0
  201. package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
  202. package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
  203. package/dist/services/review/reporters/fix-reporter.js +437 -0
  204. package/dist/services/review/reporters/fix-reporter.js.map +1 -0
  205. package/dist/services/review/reporters/index.d.ts +10 -0
  206. package/dist/services/review/reporters/index.d.ts.map +1 -0
  207. package/dist/services/review/reporters/index.js +10 -0
  208. package/dist/services/review/reporters/index.js.map +1 -0
  209. package/dist/services/review/reporters/score-reporter.d.ts +84 -0
  210. package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
  211. package/dist/services/review/reporters/score-reporter.js +560 -0
  212. package/dist/services/review/reporters/score-reporter.js.map +1 -0
  213. package/dist/services/review/review.service.d.ts +129 -0
  214. package/dist/services/review/review.service.d.ts.map +1 -0
  215. package/dist/services/review/review.service.js +396 -0
  216. package/dist/services/review/review.service.js.map +1 -0
  217. package/dist/services/review/review.types.d.ts +443 -0
  218. package/dist/services/review/review.types.d.ts.map +1 -0
  219. package/dist/services/review/review.types.js +11 -0
  220. package/dist/services/review/review.types.js.map +1 -0
  221. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
  222. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
  223. package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
  224. package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
  225. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
  226. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
  227. package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
  228. package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
  229. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
  230. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
  231. package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
  232. package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
  233. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
  234. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
  235. package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
  236. package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
  237. package/dist/services/scoring/dimensions/index.d.ts +18 -0
  238. package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
  239. package/dist/services/scoring/dimensions/index.js +27 -0
  240. package/dist/services/scoring/dimensions/index.js.map +1 -0
  241. package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
  242. package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
  243. package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
  244. package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
  245. package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
  246. package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
  247. package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
  248. package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
  249. package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
  250. package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
  251. package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
  252. package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
  253. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
  254. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
  255. package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
  256. package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
  257. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
  258. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
  259. package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
  260. package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
  261. package/dist/services/scoring/index.d.ts +10 -0
  262. package/dist/services/scoring/index.d.ts.map +1 -0
  263. package/dist/services/scoring/index.js +10 -0
  264. package/dist/services/scoring/index.js.map +1 -0
  265. package/dist/services/scoring/scoring-service.d.ts +222 -0
  266. package/dist/services/scoring/scoring-service.d.ts.map +1 -0
  267. package/dist/services/scoring/scoring-service.js +636 -0
  268. package/dist/services/scoring/scoring-service.js.map +1 -0
  269. package/package.json +11 -3
  270. package/templates/README.md +183 -0
  271. package/templates/nestjs/controller.spec.ts +203 -0
  272. package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
  273. package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
  274. package/templates/nestjs/fixtures/test-module.ts +311 -0
  275. package/templates/nestjs/guard.spec.ts +314 -0
  276. package/templates/nestjs/interceptor.spec.ts +458 -0
  277. package/templates/nestjs/module.spec.ts +173 -0
  278. package/templates/nestjs/pipe.spec.ts +474 -0
  279. package/templates/nestjs/service.spec.ts +296 -0
  280. package/templates/rust/Cargo.toml +72 -0
  281. package/templates/rust/actix-controller.test.rs +114 -0
  282. package/templates/rust/axum-handler.test.rs +117 -0
  283. package/templates/rust/integration.test.rs +63 -0
  284. package/templates/rust/rocket-route.test.rs +106 -0
  285. package/templates/rust/unit.test.rs +38 -0
@@ -0,0 +1,270 @@
1
+ /**
2
+ * PDF Exporter
3
+ *
4
+ * Generates PDF reports from HTML templates.
5
+ * Uses browser print API or server-side rendering.
6
+ *
7
+ * Note: This is a placeholder implementation. Full PDF generation
8
+ * would require additional dependencies like puppeteer or jsPDF.
9
+ */
10
+ /**
11
+ * PDF Exporter class
12
+ *
13
+ * Provides PDF export functionality for reports.
14
+ */
15
+ export class PdfExporter {
16
+ /**
17
+ * Generate PDF from HTML report
18
+ *
19
+ * @param htmlReport - HTML content to convert
20
+ * @param options - PDF export options
21
+ * @returns Promise resolving to PDF buffer or base64 string
22
+ */
23
+ static async generatePdf(htmlReport, options = {}) {
24
+ // For client-side PDF generation, we would use libraries like jsPDF
25
+ // For server-side, we would use puppeteer or similar
26
+ // This is a placeholder that creates a simple text-based PDF-like output
27
+ // In a real implementation, this would use a proper PDF library
28
+ const content = this.extractTextContent(htmlReport);
29
+ const pdfData = this.createBasicPdf(content, options);
30
+ return new Uint8Array(pdfData);
31
+ }
32
+ /**
33
+ * Generate PDF from report
34
+ *
35
+ * @param report - Report object
36
+ * @param options - PDF export options
37
+ * @returns Promise resolving to PDF buffer
38
+ */
39
+ static async exportReportToPdf(report, options = {}) {
40
+ if (report.format !== 'html') {
41
+ throw new Error('PDF export requires HTML format report');
42
+ }
43
+ return this.generatePdf(report.content, options);
44
+ }
45
+ /**
46
+ * Save PDF to file (Node.js environment)
47
+ *
48
+ * @param pdfData - PDF buffer
49
+ * @param outputPath - File path to save to
50
+ */
51
+ static async savePdf(pdfData, outputPath) {
52
+ const { promises: fs } = await import('fs');
53
+ const { dirname } = await import('path');
54
+ // Ensure directory exists
55
+ await fs.mkdir(dirname(outputPath), { recursive: true });
56
+ // Write PDF file
57
+ await fs.writeFile(outputPath, pdfData);
58
+ }
59
+ /**
60
+ * Generate print-friendly HTML
61
+ *
62
+ * @param htmlReport - Original HTML report
63
+ * @returns Print-friendly HTML with print styles
64
+ */
65
+ static generatePrintHtml(htmlReport) {
66
+ const printStyles = `
67
+ @media print {
68
+ @page { margin: 1cm; size: A4; }
69
+ body { print-color-adjust: exact; -webkit-print-color-adjust: exact; }
70
+ .no-print { display: none !important; }
71
+ .page-break { page-break-before: always; }
72
+ .page-break-after { page-break-after: always; }
73
+ .avoid-break { page-break-inside: avoid; }
74
+ }
75
+ `;
76
+ // Insert print styles before closing head tag
77
+ return htmlReport.replace('</head>', ` <style>${printStyles}</style>\n</head>`);
78
+ }
79
+ /**
80
+ * Get recommended print options for browser
81
+ *
82
+ * @returns Print options object
83
+ */
84
+ static getBrowserPrintOptions() {
85
+ return {
86
+ orientation: 'portrait',
87
+ size: 'A4',
88
+ printBackground: true,
89
+ preferCSSPageSize: true,
90
+ };
91
+ }
92
+ /**
93
+ * Extract text content from HTML
94
+ *
95
+ * @param html - HTML content
96
+ * @returns Extracted text content
97
+ */
98
+ static extractTextContent(html) {
99
+ // Remove HTML tags and get text content
100
+ const text = html
101
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
102
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
103
+ .replace(/<[^>]+>/g, ' ')
104
+ .replace(/\s+/g, ' ')
105
+ .trim();
106
+ return text;
107
+ }
108
+ /**
109
+ * Create basic PDF-like data
110
+ *
111
+ * This is a simplified implementation. Real PDF generation
112
+ * would use libraries like jsPDF or PDFKit.
113
+ *
114
+ * @param content - Text content
115
+ * @param options - PDF options
116
+ * @returns PDF data buffer
117
+ */
118
+ static createBasicPdf(content, options) {
119
+ // This is a placeholder - in production, use a proper PDF library
120
+ // The implementation below creates a minimal valid PDF structure
121
+ const now = new Date();
122
+ const pdfDate = `D:${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}${String(now.getSeconds()).padStart(2, '0')}`;
123
+ // Minimal PDF header and content
124
+ const pdfHeader = `%PDF-1.4\n`;
125
+ const pdfContent = `
126
+ 1 0 obj
127
+ <<
128
+ /Type /Catalog
129
+ /Pages 2 0 R
130
+ >>
131
+ endobj
132
+
133
+ 2 0 obj
134
+ <<
135
+ /Type /Pages
136
+ /Kids [3 0 R]
137
+ /Count 1
138
+ >>
139
+ endobj
140
+
141
+ 3 0 obj
142
+ <<
143
+ /Type /Page
144
+ /Parent 2 0 R
145
+ /Resources <<
146
+ /Font <<
147
+ /F1 4 0 R
148
+ >>
149
+ >>
150
+ /MediaBox [0 0 612 792]
151
+ /Contents 5 0 R
152
+ >>
153
+ endobj
154
+
155
+ 4 0 obj
156
+ <<
157
+ /Type /Font
158
+ /Subtype /Type1
159
+ /BaseFont /Helvetica
160
+ >>
161
+ endobj
162
+
163
+ 5 0 obj
164
+ <<
165
+ /Length ${content.length + 100}
166
+ >>
167
+ stream
168
+ BT
169
+ /F1 12 Tf
170
+ 50 750 Td
171
+ (${this.escapePdfString('Daemon Code Quality Report')}) Tj
172
+ 0 -20 Td
173
+ (${this.escapePdfString('Generated: ' + now.toISOString())}) Tj
174
+ 0 -40 Td
175
+ (${this.escapePdfString(content.substring(0, 500))}) Tj
176
+ ET
177
+ endstream
178
+ endobj
179
+
180
+ xref
181
+ 0 6
182
+ 0000000000 65535 f
183
+ 0000000009 00000 n
184
+ 0000000058 00000 n
185
+ 0000000115 00000 n
186
+ 0000000262 00000 n
187
+ 0000000345 00000 n
188
+ trailer
189
+ <<
190
+ /Size 6
191
+ /Root 1 0 R
192
+ >>
193
+ startxref
194
+ ${pdfHeader.length + 800}
195
+ %%EOF
196
+ `;
197
+ const pdfString = pdfHeader + pdfContent;
198
+ return Array.from(pdfString).map(c => c.charCodeAt(0));
199
+ }
200
+ /**
201
+ * Escape string for PDF content
202
+ *
203
+ * @param str - String to escape
204
+ * @returns Escaped string
205
+ */
206
+ static escapePdfString(str) {
207
+ return str
208
+ .replace(/\\/g, '\\\\')
209
+ .replace(/\(/g, '\\(')
210
+ .replace(/\)/g, '\\)')
211
+ .replace(/\r\n/g, '\n')
212
+ .substring(0, 200); // Limit length for safety
213
+ }
214
+ /**
215
+ * Check if PDF export is available
216
+ *
217
+ * @returns True if PDF export dependencies are available
218
+ */
219
+ static isPdfExportAvailable() {
220
+ // In a real implementation, this would check for puppeteer, jsPDF, etc.
221
+ return true; // Placeholder - always returns true for basic export
222
+ }
223
+ /**
224
+ * Get PDF export capabilities
225
+ *
226
+ * @returns Object describing available features
227
+ */
228
+ static getCapabilities() {
229
+ return {
230
+ basic: true,
231
+ serverSide: false, // Would require puppeteer installation
232
+ clientSide: true, // Uses browser print API
233
+ charts: false, // Requires additional setup
234
+ customFonts: false,
235
+ };
236
+ }
237
+ }
238
+ /**
239
+ * HTML to PDF conversion via print command
240
+ *
241
+ * This utility provides instructions for generating PDFs
242
+ * using the browser's print functionality.
243
+ */
244
+ export class PrintPdfExporter {
245
+ /**
246
+ * Generate HTML with print dialog trigger
247
+ *
248
+ * @param htmlReport - HTML report content
249
+ * @returns HTML with print script
250
+ */
251
+ static generatePrintableHtml(htmlReport) {
252
+ const printScript = `
253
+ <script>
254
+ window.addEventListener('load', function() {
255
+ window.print();
256
+ });
257
+ </script>
258
+ `;
259
+ return htmlReport.replace('</body>', printScript + '</body>');
260
+ }
261
+ /**
262
+ * Get browser-compatible print URL
263
+ *
264
+ * @returns Data URL for printing
265
+ */
266
+ static getPrintDataUrl(htmlContent) {
267
+ return 'data:text/html;charset=utf-8,' + encodeURIComponent(htmlContent);
268
+ }
269
+ }
270
+ //# sourceMappingURL=pdf.exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.exporter.js","sourceRoot":"","sources":["../../../../src/services/reporting/export/pdf.exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * History Service
3
+ *
4
+ * Manages historical score tracking, storage, and retrieval.
5
+ * Stores data in local JSON files in the .daemon directory.
6
+ */
7
+ import type { ScoreSnapshot, ScoreTrend, Comparison, ExtendedProjectScore, CodeDimension } from './reporting.types.js';
8
+ /**
9
+ * History service for managing score snapshots
10
+ */
11
+ export declare class HistoryService {
12
+ private analyzer;
13
+ private storageCache;
14
+ constructor();
15
+ /**
16
+ * Save a score snapshot to history
17
+ *
18
+ * @param projectPath - Path to the project
19
+ * @param score - Score to save
20
+ * @returns Promise resolving when saved
21
+ */
22
+ saveScore(projectPath: string, score: ExtendedProjectScore): Promise<void>;
23
+ /**
24
+ * Get historical scores for a project
25
+ *
26
+ * @param projectPath - Path to the project
27
+ * @param limit - Maximum number of snapshots to return
28
+ * @returns Array of score snapshots
29
+ */
30
+ getHistory(projectPath: string, limit?: number): Promise<ScoreSnapshot[]>;
31
+ /**
32
+ * Get trend data for a project
33
+ *
34
+ * @param projectPath - Path to the project
35
+ * @param dimension - Optional dimension to analyze
36
+ * @returns Score trend information
37
+ */
38
+ getTrend(projectPath: string, dimension?: CodeDimension): Promise<ScoreTrend>;
39
+ /**
40
+ * Compare two snapshots
41
+ *
42
+ * @param before - Earlier snapshot
43
+ * @param after - Later snapshot
44
+ * @returns Comparison result
45
+ */
46
+ compareSnapshots(before: ScoreSnapshot, after: ScoreSnapshot): Promise<Comparison>;
47
+ /**
48
+ * Prune old history entries
49
+ *
50
+ * @param projectPath - Path to the project
51
+ * @param keepLast - Number of recent snapshots to keep
52
+ * @returns Promise resolving when pruned
53
+ */
54
+ pruneHistory(projectPath: string, keepLast?: number): Promise<void>;
55
+ /**
56
+ * Get the full trend analysis
57
+ *
58
+ * @param projectPath - Path to the project
59
+ * @returns Complete trend analysis
60
+ */
61
+ getFullAnalysis(projectPath: string): Promise<import("./reporting.types.js").TrendAnalysis>;
62
+ /**
63
+ * Get latest snapshot for a project
64
+ *
65
+ * @param projectPath - Path to the project
66
+ * @returns Latest snapshot or null
67
+ */
68
+ getLatest(projectPath: string): Promise<ScoreSnapshot | null>;
69
+ /**
70
+ * Clear all history for a project
71
+ *
72
+ * @param projectPath - Path to the project
73
+ * @returns Promise resolving when cleared
74
+ */
75
+ clearHistory(projectPath: string): Promise<void>;
76
+ /**
77
+ * Get history directory path for a project
78
+ */
79
+ private getHistoryDir;
80
+ /**
81
+ * Load storage from file or cache
82
+ */
83
+ private loadStorage;
84
+ /**
85
+ * Create empty storage structure
86
+ */
87
+ private createEmptyStorage;
88
+ /**
89
+ * Generate comparison summary text
90
+ */
91
+ private generateComparisonSummary;
92
+ }
93
+ //# sourceMappingURL=history.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.service.d.ts","sourceRoot":"","sources":["../../../src/services/reporting/history.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,UAAU,EAEV,oBAAoB,EACpB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAa9B;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,YAAY,CAA0C;;IAM9D;;;;;;OAMG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8ChF;;;;;;OAMG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAY/E;;;;;;OAMG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BnF;;;;;;OAMG;IACG,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;IAoDxF;;;;;;OAMG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BhG;;;;;OAKG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM;IAKzC;;;;;OAKG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAKnE;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;YACW,WAAW;IA2BzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;CAclC"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * History Service
3
+ *
4
+ * Manages historical score tracking, storage, and retrieval.
5
+ * Stores data in local JSON files in the .daemon directory.
6
+ */
7
+ import { promises as fs } from 'fs';
8
+ import { join } from 'path';
9
+ import { TrendAnalyzer } from './trend-analyzer.js';
10
+ /**
11
+ * Maximum number of snapshots to keep by default
12
+ */
13
+ const DEFAULT_HISTORY_LIMIT = 100;
14
+ /**
15
+ * History storage file name
16
+ */
17
+ const HISTORY_FILE = 'scores.json';
18
+ /**
19
+ * History service for managing score snapshots
20
+ */
21
+ export class HistoryService {
22
+ analyzer;
23
+ storageCache = new Map();
24
+ constructor() {
25
+ this.analyzer = new TrendAnalyzer();
26
+ }
27
+ /**
28
+ * Save a score snapshot to history
29
+ *
30
+ * @param projectPath - Path to the project
31
+ * @param score - Score to save
32
+ * @returns Promise resolving when saved
33
+ */
34
+ async saveScore(projectPath, score) {
35
+ const historyDir = this.getHistoryDir(projectPath);
36
+ const historyFile = join(historyDir, HISTORY_FILE);
37
+ // Ensure directory exists
38
+ await fs.mkdir(historyDir, { recursive: true });
39
+ // Load existing history or create new
40
+ let storage;
41
+ try {
42
+ const content = await fs.readFile(historyFile, 'utf-8');
43
+ storage = JSON.parse(content);
44
+ }
45
+ catch {
46
+ storage = this.createEmptyStorage(projectPath);
47
+ }
48
+ // Create snapshot
49
+ const snapshot = {
50
+ timestamp: score.timestamp,
51
+ commit: score.commit ?? 'unknown',
52
+ branch: score.branch ?? 'unknown',
53
+ overall: score.overall,
54
+ dimensions: score.dimensions,
55
+ issueCount: score.issues.length,
56
+ criticalCount: score.issues.filter((i) => i.severity === 'critical').length,
57
+ };
58
+ // Add snapshot (avoid duplicates for same commit)
59
+ const existingIndex = storage.scores.findIndex(s => s.commit === snapshot.commit);
60
+ if (existingIndex >= 0) {
61
+ storage.scores[existingIndex] = snapshot;
62
+ }
63
+ else {
64
+ storage.scores.push(snapshot);
65
+ }
66
+ // Update metadata
67
+ storage.lastUpdated = new Date();
68
+ storage.version = 1;
69
+ // Save to file
70
+ await fs.writeFile(historyFile, JSON.stringify(storage, null, 2), 'utf-8');
71
+ // Update cache
72
+ this.storageCache.set(projectPath, storage);
73
+ }
74
+ /**
75
+ * Get historical scores for a project
76
+ *
77
+ * @param projectPath - Path to the project
78
+ * @param limit - Maximum number of snapshots to return
79
+ * @returns Array of score snapshots
80
+ */
81
+ async getHistory(projectPath, limit) {
82
+ const storage = await this.loadStorage(projectPath);
83
+ let snapshots = storage.scores
84
+ .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
85
+ if (limit) {
86
+ snapshots = snapshots.slice(0, limit);
87
+ }
88
+ return snapshots;
89
+ }
90
+ /**
91
+ * Get trend data for a project
92
+ *
93
+ * @param projectPath - Path to the project
94
+ * @param dimension - Optional dimension to analyze
95
+ * @returns Score trend information
96
+ */
97
+ async getTrend(projectPath, dimension) {
98
+ const snapshots = await this.getHistory(projectPath);
99
+ const sortedSnapshots = snapshots.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
100
+ if (sortedSnapshots.length < 2) {
101
+ return {
102
+ dimension: dimension ?? 'overall',
103
+ current: sortedSnapshots[0]?.overall ?? 0,
104
+ previous: 0,
105
+ delta: 0,
106
+ trend: 'stable',
107
+ history: sortedSnapshots.map(s => s.overall),
108
+ timestamps: sortedSnapshots.map(s => s.timestamp),
109
+ };
110
+ }
111
+ const analysis = this.analyzer.analyze(sortedSnapshots);
112
+ if (dimension) {
113
+ return analysis.dimensionTrends[dimension] ?? analysis.overallTrend;
114
+ }
115
+ return analysis.overallTrend;
116
+ }
117
+ /**
118
+ * Compare two snapshots
119
+ *
120
+ * @param before - Earlier snapshot
121
+ * @param after - Later snapshot
122
+ * @returns Comparison result
123
+ */
124
+ async compareSnapshots(before, after) {
125
+ const overallChange = after.overall - before.overall;
126
+ // Calculate dimension changes
127
+ const dimensionChanges = {};
128
+ const allDimensions = new Set([
129
+ ...Object.keys(before.dimensions),
130
+ ...Object.keys(after.dimensions),
131
+ ]);
132
+ for (const dim of Array.from(allDimensions)) {
133
+ const beforeScore = before.dimensions[dim]?.score ?? 0;
134
+ const afterScore = after.dimensions[dim]?.score ?? 0;
135
+ const delta = afterScore - beforeScore;
136
+ let trend = 'stable';
137
+ if (delta > 5)
138
+ trend = 'improving';
139
+ else if (delta < -5)
140
+ trend = 'declining';
141
+ dimensionChanges[dim] = {
142
+ before: beforeScore,
143
+ after: afterScore,
144
+ delta,
145
+ trend,
146
+ };
147
+ }
148
+ // Note: We can't track individual issues between snapshots without storing them
149
+ // This is a simplified implementation
150
+ const addedIssues = [];
151
+ const resolvedIssues = [];
152
+ // Generate summary
153
+ const summary = this.generateComparisonSummary(overallChange, before, after);
154
+ return {
155
+ before,
156
+ after,
157
+ overallChange,
158
+ dimensionChanges,
159
+ addedIssues,
160
+ resolvedIssues,
161
+ summary,
162
+ };
163
+ }
164
+ /**
165
+ * Prune old history entries
166
+ *
167
+ * @param projectPath - Path to the project
168
+ * @param keepLast - Number of recent snapshots to keep
169
+ * @returns Promise resolving when pruned
170
+ */
171
+ async pruneHistory(projectPath, keepLast = DEFAULT_HISTORY_LIMIT) {
172
+ const historyFile = join(this.getHistoryDir(projectPath), HISTORY_FILE);
173
+ try {
174
+ const content = await fs.readFile(historyFile, 'utf-8');
175
+ const storage = JSON.parse(content);
176
+ if (storage.scores.length > keepLast) {
177
+ // Sort by timestamp and keep the most recent
178
+ const sortedScores = storage.scores.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
179
+ // Keep last N and any significant milestones (high scores)
180
+ const recent = sortedScores.slice(0, keepLast);
181
+ const milestones = sortedScores.slice(keepLast)
182
+ .filter(s => s.overall >= 90 || s.criticalCount === 0);
183
+ storage.scores = [...recent, ...milestones];
184
+ storage.lastUpdated = new Date();
185
+ await fs.writeFile(historyFile, JSON.stringify(storage, null, 2), 'utf-8');
186
+ // Update cache
187
+ this.storageCache.set(projectPath, storage);
188
+ }
189
+ }
190
+ catch {
191
+ // File doesn't exist or is invalid, nothing to prune
192
+ }
193
+ }
194
+ /**
195
+ * Get the full trend analysis
196
+ *
197
+ * @param projectPath - Path to the project
198
+ * @returns Complete trend analysis
199
+ */
200
+ async getFullAnalysis(projectPath) {
201
+ const snapshots = await this.getHistory(projectPath);
202
+ return this.analyzer.analyze(snapshots);
203
+ }
204
+ /**
205
+ * Get latest snapshot for a project
206
+ *
207
+ * @param projectPath - Path to the project
208
+ * @returns Latest snapshot or null
209
+ */
210
+ async getLatest(projectPath) {
211
+ const snapshots = await this.getHistory(projectPath, 1);
212
+ return snapshots[0] ?? null;
213
+ }
214
+ /**
215
+ * Clear all history for a project
216
+ *
217
+ * @param projectPath - Path to the project
218
+ * @returns Promise resolving when cleared
219
+ */
220
+ async clearHistory(projectPath) {
221
+ const historyFile = join(this.getHistoryDir(projectPath), HISTORY_FILE);
222
+ try {
223
+ await fs.unlink(historyFile);
224
+ this.storageCache.delete(projectPath);
225
+ }
226
+ catch {
227
+ // File doesn't exist, ignore
228
+ }
229
+ }
230
+ /**
231
+ * Get history directory path for a project
232
+ */
233
+ getHistoryDir(projectPath) {
234
+ return join(projectPath, '.daemon', 'history');
235
+ }
236
+ /**
237
+ * Load storage from file or cache
238
+ */
239
+ async loadStorage(projectPath) {
240
+ // Check cache first
241
+ const cached = this.storageCache.get(projectPath);
242
+ if (cached) {
243
+ return cached;
244
+ }
245
+ const historyFile = join(this.getHistoryDir(projectPath), HISTORY_FILE);
246
+ try {
247
+ const content = await fs.readFile(historyFile, 'utf-8');
248
+ const storage = JSON.parse(content);
249
+ // Parse date strings back to Date objects
250
+ for (const score of storage.scores) {
251
+ score.timestamp = new Date(score.timestamp);
252
+ }
253
+ this.storageCache.set(projectPath, storage);
254
+ return storage;
255
+ }
256
+ catch {
257
+ const empty = this.createEmptyStorage(projectPath);
258
+ this.storageCache.set(projectPath, empty);
259
+ return empty;
260
+ }
261
+ }
262
+ /**
263
+ * Create empty storage structure
264
+ */
265
+ createEmptyStorage(projectPath) {
266
+ return {
267
+ projectPath,
268
+ scores: [],
269
+ version: 1,
270
+ lastUpdated: new Date(),
271
+ };
272
+ }
273
+ /**
274
+ * Generate comparison summary text
275
+ */
276
+ generateComparisonSummary(overallChange, before, after) {
277
+ const direction = overallChange > 0 ? 'improved' : overallChange < 0 ? 'declined' : 'remained stable';
278
+ const change = Math.abs(overallChange);
279
+ if (change === 0) {
280
+ return `Overall score ${direction} at ${after.overall}.`;
281
+ }
282
+ return `Overall score ${direction} by ${change} points, from ${before.overall} to ${after.overall}.`;
283
+ }
284
+ }
285
+ //# sourceMappingURL=history.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.service.js","sourceRoot":"","sources":["../../../src/services/reporting/history.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Reporting Service Barrel Export
3
+ *
4
+ * Central exports for the reporting and history system.
5
+ */
6
+ export type { ReportFormat, CodeDimension, ReportDimensionScore, ReportIssue, ExtendedProjectScore, ScoreSnapshot, ScoreTrend, Regression, Improvement, TrendAnalysis, TrendPrediction, Comparison, Report, HistoryStorage, ChartConfig, GaugeOptions, TrendDataPoint, BarChartData, ReportOptions, TestResultForReport, DimensionStatus, IssueSeverity, } from './reporting.types.js';
7
+ export { ReportService } from './report.service.js';
8
+ export { HistoryService } from './history.service.js';
9
+ export { TrendAnalyzer } from './trend-analyzer.js';
10
+ export { HtmlTemplate } from './templates/html.template.js';
11
+ export { MarkdownTemplate } from './templates/markdown.template.js';
12
+ export { JsonTemplate } from './templates/json.template.js';
13
+ export { ChartExporter, PdfExporter, PrintPdfExporter } from './export/index.js';
14
+ export type { PdfExportOptions } from './export/index.js';
15
+ //# sourceMappingURL=index.d.ts.map