@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.
- package/README.md +268 -58
- package/bin/Dockerfile +158 -16
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +22 -2
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/command.types.d.ts +216 -0
- package/dist/cli/commands/command.types.d.ts.map +1 -0
- package/dist/cli/commands/command.types.js +64 -0
- package/dist/cli/commands/command.types.js.map +1 -0
- package/dist/cli/commands/history.command.d.ts +91 -0
- package/dist/cli/commands/history.command.d.ts.map +1 -0
- package/dist/cli/commands/history.command.js +336 -0
- package/dist/cli/commands/history.command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -3
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +7 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/optimize.command.d.ts +110 -0
- package/dist/cli/commands/optimize.command.d.ts.map +1 -0
- package/dist/cli/commands/optimize.command.js +497 -0
- package/dist/cli/commands/optimize.command.js.map +1 -0
- package/dist/cli/commands/report.command.d.ts +110 -0
- package/dist/cli/commands/report.command.d.ts.map +1 -0
- package/dist/cli/commands/report.command.js +532 -0
- package/dist/cli/commands/report.command.js.map +1 -0
- package/dist/cli/commands/review.command.d.ts +110 -0
- package/dist/cli/commands/review.command.d.ts.map +1 -0
- package/dist/cli/commands/review.command.js +520 -0
- package/dist/cli/commands/review.command.js.map +1 -0
- package/dist/cli/commands/score.command.d.ts +47 -0
- package/dist/cli/commands/score.command.d.ts.map +1 -0
- package/dist/cli/commands/score.command.js +261 -0
- package/dist/cli/commands/score.command.js.map +1 -0
- package/dist/cli/utils/index.d.ts +10 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/index.js +10 -0
- package/dist/cli/utils/index.js.map +1 -0
- package/dist/cli/utils/output.d.ts +192 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +411 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/progress.d.ts +204 -0
- package/dist/cli/utils/progress.d.ts.map +1 -0
- package/dist/cli/utils/progress.js +396 -0
- package/dist/cli/utils/progress.js.map +1 -0
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/project.types.d.ts +3 -3
- package/dist/core/types/project.types.d.ts.map +1 -1
- package/dist/core/types/scoring.types.d.ts +301 -0
- package/dist/core/types/scoring.types.d.ts.map +1 -0
- package/dist/core/types/scoring.types.js +8 -0
- package/dist/core/types/scoring.types.js.map +1 -0
- package/dist/services/detection/framework-detector.d.ts.map +1 -1
- package/dist/services/detection/framework-detector.js +74 -5
- package/dist/services/detection/framework-detector.js.map +1 -1
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
- package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/bug-detector.js +443 -0
- package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
- package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
- package/dist/services/optimization/detectors/index.d.ts +7 -0
- package/dist/services/optimization/detectors/index.d.ts.map +1 -0
- package/dist/services/optimization/detectors/index.js +7 -0
- package/dist/services/optimization/detectors/index.js.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.js +451 -0
- package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
- package/dist/services/optimization/index.d.ts +61 -0
- package/dist/services/optimization/index.d.ts.map +1 -0
- package/dist/services/optimization/index.js +69 -0
- package/dist/services/optimization/index.js.map +1 -0
- package/dist/services/optimization/optimization.service.d.ts +65 -0
- package/dist/services/optimization/optimization.service.d.ts.map +1 -0
- package/dist/services/optimization/optimization.service.js +511 -0
- package/dist/services/optimization/optimization.service.js.map +1 -0
- package/dist/services/optimization/optimization.types.d.ts +343 -0
- package/dist/services/optimization/optimization.types.d.ts.map +1 -0
- package/dist/services/optimization/optimization.types.js +8 -0
- package/dist/services/optimization/optimization.types.js.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
- package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/index.d.ts +7 -0
- package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/index.js +7 -0
- package/dist/services/optimization/optimizers/index.js.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.js +501 -0
- package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
- package/dist/services/optimization/patterns/index.d.ts +5 -0
- package/dist/services/optimization/patterns/index.d.ts.map +1 -0
- package/dist/services/optimization/patterns/index.js +5 -0
- package/dist/services/optimization/patterns/index.js.map +1 -0
- package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
- package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/chart.exporter.js +350 -0
- package/dist/services/reporting/export/chart.exporter.js.map +1 -0
- package/dist/services/reporting/export/index.d.ts +9 -0
- package/dist/services/reporting/export/index.d.ts.map +1 -0
- package/dist/services/reporting/export/index.js +10 -0
- package/dist/services/reporting/export/index.js.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.js +270 -0
- package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
- package/dist/services/reporting/history.service.d.ts +93 -0
- package/dist/services/reporting/history.service.d.ts.map +1 -0
- package/dist/services/reporting/history.service.js +285 -0
- package/dist/services/reporting/history.service.js.map +1 -0
- package/dist/services/reporting/index.d.ts +15 -0
- package/dist/services/reporting/index.d.ts.map +1 -0
- package/dist/services/reporting/index.js +16 -0
- package/dist/services/reporting/index.js.map +1 -0
- package/dist/services/reporting/report.service.d.ts +102 -0
- package/dist/services/reporting/report.service.d.ts.map +1 -0
- package/dist/services/reporting/report.service.js +240 -0
- package/dist/services/reporting/report.service.js.map +1 -0
- package/dist/services/reporting/reporting.types.d.ts +329 -0
- package/dist/services/reporting/reporting.types.d.ts.map +1 -0
- package/dist/services/reporting/reporting.types.js +8 -0
- package/dist/services/reporting/reporting.types.js.map +1 -0
- package/dist/services/reporting/templates/html.template.d.ts +81 -0
- package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/html.template.js +741 -0
- package/dist/services/reporting/templates/html.template.js.map +1 -0
- package/dist/services/reporting/templates/json.template.d.ts +85 -0
- package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/json.template.js +308 -0
- package/dist/services/reporting/templates/json.template.js.map +1 -0
- package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
- package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/markdown.template.js +311 -0
- package/dist/services/reporting/templates/markdown.template.js.map +1 -0
- package/dist/services/reporting/trend-analyzer.d.ts +73 -0
- package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
- package/dist/services/reporting/trend-analyzer.js +291 -0
- package/dist/services/reporting/trend-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
- package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/index.d.ts +13 -0
- package/dist/services/review/analyzers/index.d.ts.map +1 -0
- package/dist/services/review/analyzers/index.js +13 -0
- package/dist/services/review/analyzers/index.js.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.js +589 -0
- package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.js +512 -0
- package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.js +423 -0
- package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
- package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
- package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
- package/dist/services/review/fixers/auto-fixer.js +404 -0
- package/dist/services/review/fixers/auto-fixer.js.map +1 -0
- package/dist/services/review/fixers/index.d.ts +11 -0
- package/dist/services/review/fixers/index.d.ts.map +1 -0
- package/dist/services/review/fixers/index.js +11 -0
- package/dist/services/review/fixers/index.js.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.js +555 -0
- package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
- package/dist/services/review/fixers/test-generator.d.ts +99 -0
- package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
- package/dist/services/review/fixers/test-generator.js +458 -0
- package/dist/services/review/fixers/test-generator.js.map +1 -0
- package/dist/services/review/index.d.ts +14 -0
- package/dist/services/review/index.d.ts.map +1 -0
- package/dist/services/review/index.js +14 -0
- package/dist/services/review/index.js.map +1 -0
- package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
- package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/fix-reporter.js +437 -0
- package/dist/services/review/reporters/fix-reporter.js.map +1 -0
- package/dist/services/review/reporters/index.d.ts +10 -0
- package/dist/services/review/reporters/index.d.ts.map +1 -0
- package/dist/services/review/reporters/index.js +10 -0
- package/dist/services/review/reporters/index.js.map +1 -0
- package/dist/services/review/reporters/score-reporter.d.ts +84 -0
- package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/score-reporter.js +560 -0
- package/dist/services/review/reporters/score-reporter.js.map +1 -0
- package/dist/services/review/review.service.d.ts +129 -0
- package/dist/services/review/review.service.d.ts.map +1 -0
- package/dist/services/review/review.service.js +396 -0
- package/dist/services/review/review.service.js.map +1 -0
- package/dist/services/review/review.types.d.ts +443 -0
- package/dist/services/review/review.types.d.ts.map +1 -0
- package/dist/services/review/review.types.js +11 -0
- package/dist/services/review/review.types.js.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/index.d.ts +18 -0
- package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/index.js +27 -0
- package/dist/services/scoring/dimensions/index.js.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
- package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
- package/dist/services/scoring/index.d.ts +10 -0
- package/dist/services/scoring/index.d.ts.map +1 -0
- package/dist/services/scoring/index.js +10 -0
- package/dist/services/scoring/index.js.map +1 -0
- package/dist/services/scoring/scoring-service.d.ts +222 -0
- package/dist/services/scoring/scoring-service.d.ts.map +1 -0
- package/dist/services/scoring/scoring-service.js +636 -0
- package/dist/services/scoring/scoring-service.js.map +1 -0
- package/package.json +11 -3
- package/templates/README.md +183 -0
- package/templates/nestjs/controller.spec.ts +203 -0
- package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
- package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
- package/templates/nestjs/fixtures/test-module.ts +311 -0
- package/templates/nestjs/guard.spec.ts +314 -0
- package/templates/nestjs/interceptor.spec.ts +458 -0
- package/templates/nestjs/module.spec.ts +173 -0
- package/templates/nestjs/pipe.spec.ts +474 -0
- package/templates/nestjs/service.spec.ts +296 -0
- package/templates/rust/Cargo.toml +72 -0
- package/templates/rust/actix-controller.test.rs +114 -0
- package/templates/rust/axum-handler.test.rs +117 -0
- package/templates/rust/integration.test.rs +63 -0
- package/templates/rust/rocket-route.test.rs +106 -0
- 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
|