@oalacea/daemon 0.6.3 → 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/init.command.d.ts +12 -14
- package/dist/cli/commands/init.command.d.ts.map +1 -1
- package/dist/cli/commands/init.command.js +278 -144
- package/dist/cli/commands/init.command.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,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trend Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyzes score trends over time, detects regressions,
|
|
5
|
+
* and predicts future trends.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Trend analyzer service
|
|
9
|
+
*/
|
|
10
|
+
export class TrendAnalyzer {
|
|
11
|
+
/**
|
|
12
|
+
* Minimum number of snapshots required for trend analysis
|
|
13
|
+
*/
|
|
14
|
+
static MIN_SNAPSHOTS = 2;
|
|
15
|
+
/**
|
|
16
|
+
* Threshold for considering a change significant
|
|
17
|
+
*/
|
|
18
|
+
static SIGNIFICANT_CHANGE = 5;
|
|
19
|
+
/**
|
|
20
|
+
* Threshold for regression detection
|
|
21
|
+
*/
|
|
22
|
+
static REGRESSION_THRESHOLD = 10;
|
|
23
|
+
/**
|
|
24
|
+
* Analyze trends from score snapshots
|
|
25
|
+
*
|
|
26
|
+
* @param snapshots - Historical score snapshots
|
|
27
|
+
* @returns Complete trend analysis
|
|
28
|
+
*/
|
|
29
|
+
analyze(scores) {
|
|
30
|
+
if (scores.length < TrendAnalyzer.MIN_SNAPSHOTS) {
|
|
31
|
+
return this.createEmptyAnalysis(scores);
|
|
32
|
+
}
|
|
33
|
+
const sortedScores = [...scores].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
34
|
+
const overallTrend = this.calculateTrend('overall', sortedScores.map(s => s.overall), sortedScores);
|
|
35
|
+
const dimensionTrends = {};
|
|
36
|
+
// Analyze each dimension
|
|
37
|
+
const allDimensions = new Set();
|
|
38
|
+
for (const score of sortedScores) {
|
|
39
|
+
Object.keys(score.dimensions).forEach(dim => allDimensions.add(dim));
|
|
40
|
+
}
|
|
41
|
+
for (const dimension of Array.from(allDimensions)) {
|
|
42
|
+
const values = sortedScores
|
|
43
|
+
.map(s => s.dimensions[dimension]?.score ?? 0)
|
|
44
|
+
.filter(v => v > 0);
|
|
45
|
+
if (values.length >= TrendAnalyzer.MIN_SNAPSHOTS) {
|
|
46
|
+
dimensionTrends[dimension] = this.calculateTrend(dimension, values, sortedScores);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const regressions = this.detectRegressions(sortedScores);
|
|
50
|
+
const improvements = this.detectImprovements(sortedScores);
|
|
51
|
+
const velocity = this.calculateVelocity(sortedScores);
|
|
52
|
+
return {
|
|
53
|
+
overallTrend,
|
|
54
|
+
dimensionTrends,
|
|
55
|
+
regressions,
|
|
56
|
+
improvements,
|
|
57
|
+
velocity,
|
|
58
|
+
period: {
|
|
59
|
+
start: sortedScores[0]?.timestamp ?? new Date(),
|
|
60
|
+
end: sortedScores[sortedScores.length - 1]?.timestamp ?? new Date(),
|
|
61
|
+
snapshotCount: sortedScores.length,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Detect regressions in score history
|
|
67
|
+
*
|
|
68
|
+
* @param scores - Historical scores
|
|
69
|
+
* @returns Array of detected regressions
|
|
70
|
+
*/
|
|
71
|
+
detectRegressions(scores) {
|
|
72
|
+
const regressions = [];
|
|
73
|
+
const sortedScores = [...scores].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
74
|
+
// Check overall regression
|
|
75
|
+
for (let i = 1; i < sortedScores.length; i++) {
|
|
76
|
+
const prev = sortedScores[i - 1];
|
|
77
|
+
const curr = sortedScores[i];
|
|
78
|
+
const drop = prev.overall - curr.overall;
|
|
79
|
+
if (drop >= TrendAnalyzer.REGRESSION_THRESHOLD) {
|
|
80
|
+
regressions.push({
|
|
81
|
+
dimension: 'overall',
|
|
82
|
+
previousScore: prev.overall,
|
|
83
|
+
currentScore: curr.overall,
|
|
84
|
+
drop,
|
|
85
|
+
severity: this.getRegressionSeverity(drop),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Check dimension regressions
|
|
90
|
+
const allDimensions = new Set();
|
|
91
|
+
for (const score of sortedScores) {
|
|
92
|
+
Object.keys(score.dimensions).forEach(dim => allDimensions.add(dim));
|
|
93
|
+
}
|
|
94
|
+
for (const dimension of Array.from(allDimensions)) {
|
|
95
|
+
for (let i = 1; i < sortedScores.length; i++) {
|
|
96
|
+
const prevScore = sortedScores[i - 1].dimensions[dimension]?.score ?? 0;
|
|
97
|
+
const currScore = sortedScores[i].dimensions[dimension]?.score ?? 0;
|
|
98
|
+
const drop = prevScore - currScore;
|
|
99
|
+
if (drop >= TrendAnalyzer.REGRESSION_THRESHOLD && prevScore > 0) {
|
|
100
|
+
regressions.push({
|
|
101
|
+
dimension: dimension,
|
|
102
|
+
previousScore: prevScore,
|
|
103
|
+
currentScore: currScore,
|
|
104
|
+
drop,
|
|
105
|
+
severity: this.getRegressionSeverity(drop),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return regressions;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Detect improvements in score history
|
|
114
|
+
*
|
|
115
|
+
* @param scores - Historical scores
|
|
116
|
+
* @returns Array of detected improvements
|
|
117
|
+
*/
|
|
118
|
+
detectImprovements(scores) {
|
|
119
|
+
const improvements = [];
|
|
120
|
+
const sortedScores = [...scores].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
121
|
+
// Check overall improvements
|
|
122
|
+
for (let i = 1; i < sortedScores.length; i++) {
|
|
123
|
+
const prev = sortedScores[i - 1];
|
|
124
|
+
const curr = sortedScores[i];
|
|
125
|
+
const increase = curr.overall - prev.overall;
|
|
126
|
+
if (increase >= TrendAnalyzer.SIGNIFICANT_CHANGE) {
|
|
127
|
+
improvements.push({
|
|
128
|
+
dimension: 'overall',
|
|
129
|
+
previousScore: prev.overall,
|
|
130
|
+
currentScore: curr.overall,
|
|
131
|
+
increase,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Check dimension improvements
|
|
136
|
+
const allDimensions = new Set();
|
|
137
|
+
for (const score of sortedScores) {
|
|
138
|
+
Object.keys(score.dimensions).forEach(dim => allDimensions.add(dim));
|
|
139
|
+
}
|
|
140
|
+
for (const dimension of Array.from(allDimensions)) {
|
|
141
|
+
for (let i = 1; i < sortedScores.length; i++) {
|
|
142
|
+
const prevScore = sortedScores[i - 1].dimensions[dimension]?.score ?? 0;
|
|
143
|
+
const currScore = sortedScores[i].dimensions[dimension]?.score ?? 0;
|
|
144
|
+
const increase = currScore - prevScore;
|
|
145
|
+
if (increase >= TrendAnalyzer.SIGNIFICANT_CHANGE && prevScore > 0) {
|
|
146
|
+
improvements.push({
|
|
147
|
+
dimension: dimension,
|
|
148
|
+
previousScore: prevScore,
|
|
149
|
+
currentScore: currScore,
|
|
150
|
+
increase,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return improvements;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Predict future trend based on historical data
|
|
159
|
+
*
|
|
160
|
+
* @param scores - Historical scores
|
|
161
|
+
* @param horizon - Number of snapshots to predict ahead
|
|
162
|
+
* @returns Trend prediction
|
|
163
|
+
*/
|
|
164
|
+
predictTrend(scores, horizon = 3) {
|
|
165
|
+
if (scores.length < 3) {
|
|
166
|
+
return {
|
|
167
|
+
dimension: 'overall',
|
|
168
|
+
current: scores[scores.length - 1]?.overall ?? 0,
|
|
169
|
+
predicted: scores[scores.length - 1]?.overall ?? 0,
|
|
170
|
+
confidence: 0,
|
|
171
|
+
horizon,
|
|
172
|
+
trend: 'stable',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const sortedScores = [...scores].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
176
|
+
const values = sortedScores.map(s => s.overall);
|
|
177
|
+
const current = values[values.length - 1];
|
|
178
|
+
// Simple linear regression for prediction
|
|
179
|
+
const n = values.length;
|
|
180
|
+
const sumX = (n * (n - 1)) / 2;
|
|
181
|
+
const sumY = values.reduce((a, b) => a + b, 0);
|
|
182
|
+
const sumXY = values.reduce((sum, y, i) => sum + i * y, 0);
|
|
183
|
+
const sumX2 = (n * (n - 1) * (2 * n - 1)) / 6;
|
|
184
|
+
const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
|
|
185
|
+
const predicted = Math.max(0, Math.min(100, current + slope * horizon));
|
|
186
|
+
// Calculate confidence based on variance
|
|
187
|
+
const mean = sumY / n;
|
|
188
|
+
const variance = values.reduce((sum, v) => sum + Math.pow(v - mean, 2), 0) / n;
|
|
189
|
+
const confidence = Math.max(0, Math.min(1, 1 - variance / 1000));
|
|
190
|
+
let trend = 'stable';
|
|
191
|
+
if (slope > 1)
|
|
192
|
+
trend = 'improving';
|
|
193
|
+
else if (slope < -1)
|
|
194
|
+
trend = 'declining';
|
|
195
|
+
return {
|
|
196
|
+
dimension: 'overall',
|
|
197
|
+
current,
|
|
198
|
+
predicted: Math.round(predicted),
|
|
199
|
+
confidence: Math.round(confidence * 100) / 100,
|
|
200
|
+
horizon,
|
|
201
|
+
trend,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Calculate development velocity
|
|
206
|
+
*
|
|
207
|
+
* @param scores - Historical scores
|
|
208
|
+
* @returns Velocity score (points per snapshot)
|
|
209
|
+
*/
|
|
210
|
+
calculateVelocity(scores) {
|
|
211
|
+
if (scores.length < 2)
|
|
212
|
+
return 0;
|
|
213
|
+
const sortedScores = [...scores].sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
214
|
+
let totalChange = 0;
|
|
215
|
+
for (let i = 1; i < sortedScores.length; i++) {
|
|
216
|
+
const change = sortedScores[i].overall - sortedScores[i - 1].overall;
|
|
217
|
+
totalChange += Math.max(change, 0); // Only count improvements
|
|
218
|
+
}
|
|
219
|
+
return Math.round((totalChange / (sortedScores.length - 1)) * 10) / 10;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Calculate trend for a specific dimension
|
|
223
|
+
*/
|
|
224
|
+
calculateTrend(dimension, values, snapshots) {
|
|
225
|
+
if (values.length < 2) {
|
|
226
|
+
return {
|
|
227
|
+
dimension,
|
|
228
|
+
current: values[0] ?? 0,
|
|
229
|
+
previous: 0,
|
|
230
|
+
delta: 0,
|
|
231
|
+
trend: 'stable',
|
|
232
|
+
history: values,
|
|
233
|
+
timestamps: snapshots.map(s => s.timestamp),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
const current = values[values.length - 1];
|
|
237
|
+
const previous = values[values.length - 2] ?? current;
|
|
238
|
+
const delta = current - previous;
|
|
239
|
+
let trend = 'stable';
|
|
240
|
+
if (delta > TrendAnalyzer.SIGNIFICANT_CHANGE)
|
|
241
|
+
trend = 'improving';
|
|
242
|
+
else if (delta < -TrendAnalyzer.SIGNIFICANT_CHANGE)
|
|
243
|
+
trend = 'declining';
|
|
244
|
+
return {
|
|
245
|
+
dimension,
|
|
246
|
+
current,
|
|
247
|
+
previous,
|
|
248
|
+
delta,
|
|
249
|
+
trend,
|
|
250
|
+
history: values,
|
|
251
|
+
timestamps: snapshots.map(s => s.timestamp),
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get regression severity based on score drop
|
|
256
|
+
*/
|
|
257
|
+
getRegressionSeverity(drop) {
|
|
258
|
+
if (drop < 15)
|
|
259
|
+
return 'minor';
|
|
260
|
+
if (drop < 25)
|
|
261
|
+
return 'moderate';
|
|
262
|
+
return 'severe';
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Create empty analysis for insufficient data
|
|
266
|
+
*/
|
|
267
|
+
createEmptyAnalysis(scores) {
|
|
268
|
+
const latest = scores[0];
|
|
269
|
+
return {
|
|
270
|
+
overallTrend: {
|
|
271
|
+
dimension: 'overall',
|
|
272
|
+
current: latest?.overall ?? 0,
|
|
273
|
+
previous: latest?.overall ?? 0,
|
|
274
|
+
delta: 0,
|
|
275
|
+
trend: 'stable',
|
|
276
|
+
history: latest ? [latest.overall] : [],
|
|
277
|
+
timestamps: latest ? [latest.timestamp] : [],
|
|
278
|
+
},
|
|
279
|
+
dimensionTrends: {},
|
|
280
|
+
regressions: [],
|
|
281
|
+
improvements: [],
|
|
282
|
+
velocity: 0,
|
|
283
|
+
period: {
|
|
284
|
+
start: latest?.timestamp ?? new Date(),
|
|
285
|
+
end: latest?.timestamp ?? new Date(),
|
|
286
|
+
snapshotCount: scores.length,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=trend-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trend-analyzer.js","sourceRoot":"","sources":["../../../src/services/reporting/trend-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyse des dépendances du projet:
|
|
5
|
+
* - Détection des packages obsolètes
|
|
6
|
+
* - Vulnérabilités de sécurité
|
|
7
|
+
* - Dépendances en double
|
|
8
|
+
* - Dépendances non utilisées
|
|
9
|
+
* - Conformité des licences
|
|
10
|
+
*
|
|
11
|
+
* @module services/review/analyzers/dependency-analyzer
|
|
12
|
+
*/
|
|
13
|
+
import type { Issue, DependencyAnalysis, DependencyAnalyzerConfig } from '../review.types.js';
|
|
14
|
+
import { DockerManager } from '../../docker/docker-manager.js';
|
|
15
|
+
/**
|
|
16
|
+
* Analyseur de dépendances
|
|
17
|
+
*/
|
|
18
|
+
export declare class DependencyAnalyzer {
|
|
19
|
+
private readonly docker;
|
|
20
|
+
private readonly logger;
|
|
21
|
+
private config;
|
|
22
|
+
private issueCounter;
|
|
23
|
+
constructor(config?: DependencyAnalyzerConfig, docker?: DockerManager);
|
|
24
|
+
/**
|
|
25
|
+
* Configure l'analyseur
|
|
26
|
+
*/
|
|
27
|
+
configure(config: Partial<DependencyAnalyzerConfig>): void;
|
|
28
|
+
/**
|
|
29
|
+
* Analyse les dépendances d'un projet
|
|
30
|
+
*
|
|
31
|
+
* @param projectPath - Chemin du projet à analyser
|
|
32
|
+
* @returns Analyse des dépendances et issues
|
|
33
|
+
*/
|
|
34
|
+
analyze(projectPath: string): Promise<{
|
|
35
|
+
analysis: DependencyAnalysis;
|
|
36
|
+
issues: Issue[];
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Vérifie les packages obsolètes
|
|
40
|
+
*/
|
|
41
|
+
private checkOutdated;
|
|
42
|
+
/**
|
|
43
|
+
* Vérifie les vulnérabilités de sécurité
|
|
44
|
+
*/
|
|
45
|
+
private checkVulnerabilities;
|
|
46
|
+
/**
|
|
47
|
+
* Détecte les dépendances non utilisées
|
|
48
|
+
*/
|
|
49
|
+
private detectUnused;
|
|
50
|
+
/**
|
|
51
|
+
* Détecte les dépendances en double
|
|
52
|
+
*/
|
|
53
|
+
private detectDuplicates;
|
|
54
|
+
/**
|
|
55
|
+
* Vérifie les licences des dépendances
|
|
56
|
+
*/
|
|
57
|
+
private checkLicenses;
|
|
58
|
+
/**
|
|
59
|
+
* Convertit une info de dépendance en Issue
|
|
60
|
+
*/
|
|
61
|
+
private dependencyToIssue;
|
|
62
|
+
/**
|
|
63
|
+
* Convertit un doublon en Issue
|
|
64
|
+
*/
|
|
65
|
+
private duplicateToIssue;
|
|
66
|
+
/**
|
|
67
|
+
* Convertit un problème de licence en Issue
|
|
68
|
+
*/
|
|
69
|
+
private licenseIssueToIssue;
|
|
70
|
+
/**
|
|
71
|
+
* Génère un ID unique pour l'issue
|
|
72
|
+
*/
|
|
73
|
+
private generateIssueId;
|
|
74
|
+
/**
|
|
75
|
+
* Map la sévérité npm audit vers notre format
|
|
76
|
+
*/
|
|
77
|
+
private mapSeverity;
|
|
78
|
+
/**
|
|
79
|
+
* Détermine le type de dépendance
|
|
80
|
+
*/
|
|
81
|
+
private getDependencyType;
|
|
82
|
+
/**
|
|
83
|
+
* Lit et parse le package.json
|
|
84
|
+
*/
|
|
85
|
+
private readPackageJson;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=dependency-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-analyzer.d.ts","sourceRoot":"","sources":["../../../../src/services/review/analyzers/dependency-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,KAAK,EACL,kBAAkB,EAElB,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAoB/D;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,YAAY,CAAK;gBAEb,MAAM,GAAE,wBAA6B,EAAE,MAAM,CAAC,EAAE,aAAa;IAMzE;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,IAAI;IAI1D;;;;;OAKG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,kBAAkB,CAAC;QAAC,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC;IAmF9F;;OAEG;YACW,aAAa;IAkC3B;;OAEG;YACW,oBAAoB;IAkClC;;OAEG;YACW,YAAY;IA0C1B;;OAEG;YACW,gBAAgB;IAwD9B;;OAEG;YACW,aAAa;IA6C3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;YACW,eAAe;CAU9B"}
|