@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,636 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoring Service
|
|
3
|
+
*
|
|
4
|
+
* Main service for evaluating project quality across multiple dimensions.
|
|
5
|
+
* Coordinates various analyzers to produce comprehensive project scores.
|
|
6
|
+
*
|
|
7
|
+
* @module services/scoring/scoring-service
|
|
8
|
+
*/
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { FrameworkDetector } from '../detection/framework-detector.js';
|
|
13
|
+
import { CommandExecutor } from '../../shared/utils/command-executor.js';
|
|
14
|
+
import { createLogger } from '../../shared/utils/logger.js';
|
|
15
|
+
/**
|
|
16
|
+
* Default weights for each dimension (if not specified in options)
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULT_DIMENSION_WEIGHTS = {
|
|
19
|
+
'test-coverage': 0.18,
|
|
20
|
+
'code-quality': 0.14,
|
|
21
|
+
'performance': 0.14,
|
|
22
|
+
'security': 0.14,
|
|
23
|
+
'accessibility': 0.09,
|
|
24
|
+
'ui-ux': 0.09,
|
|
25
|
+
'backend-logic': 0.09,
|
|
26
|
+
'business-logic': 0.04,
|
|
27
|
+
'seo': 0.09,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Grade thresholds for converting numeric scores to letter grades
|
|
31
|
+
*/
|
|
32
|
+
const GRADE_THRESHOLDS = {
|
|
33
|
+
A: { min: 90, max: 100 },
|
|
34
|
+
B: { min: 75, max: 89 },
|
|
35
|
+
C: { min: 60, max: 74 },
|
|
36
|
+
D: { min: 40, max: 59 },
|
|
37
|
+
F: { min: 0, max: 39 },
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Score history directory name
|
|
41
|
+
*/
|
|
42
|
+
const SCORE_HISTORY_DIR = '.daemon';
|
|
43
|
+
const SCORE_HISTORY_FILE = 'score-history.json';
|
|
44
|
+
/**
|
|
45
|
+
* Daemon version (will be updated by build process)
|
|
46
|
+
*/
|
|
47
|
+
const DAEMON_VERSION = '0.7.0';
|
|
48
|
+
/**
|
|
49
|
+
* Main scoring service
|
|
50
|
+
*
|
|
51
|
+
* Orchestrates the scoring process across all dimensions,
|
|
52
|
+
* manages historical data, and provides trend analysis.
|
|
53
|
+
*/
|
|
54
|
+
export class ScoringService {
|
|
55
|
+
executor;
|
|
56
|
+
logger;
|
|
57
|
+
frameworkDetector;
|
|
58
|
+
historyDir;
|
|
59
|
+
analyzers = new Map();
|
|
60
|
+
constructor(options = {}) {
|
|
61
|
+
this.executor = options.executor ?? new CommandExecutor();
|
|
62
|
+
this.logger = options.logger ?? createLogger('ScoringService');
|
|
63
|
+
this.frameworkDetector = options.frameworkDetector ?? new FrameworkDetector();
|
|
64
|
+
this.historyDir = options.historyDir ?? SCORE_HISTORY_DIR;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Register a dimension analyzer
|
|
68
|
+
*
|
|
69
|
+
* @param analyzer - The analyzer to register
|
|
70
|
+
*/
|
|
71
|
+
registerAnalyzer(analyzer) {
|
|
72
|
+
this.analyzers.set(analyzer.config.dimension, analyzer);
|
|
73
|
+
this.logger.debug(`Registered analyzer for dimension: ${analyzer.config.dimension}`);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Unregister a dimension analyzer
|
|
77
|
+
*
|
|
78
|
+
* @param dimension - The dimension to unregister
|
|
79
|
+
*/
|
|
80
|
+
unregisterAnalyzer(dimension) {
|
|
81
|
+
this.analyzers.delete(dimension);
|
|
82
|
+
this.logger.debug(`Unregistered analyzer for dimension: ${dimension}`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all registered analyzers
|
|
86
|
+
*
|
|
87
|
+
* @returns Map of registered analyzers
|
|
88
|
+
*/
|
|
89
|
+
getAnalyzers() {
|
|
90
|
+
return new Map(this.analyzers);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get a specific analyzer by dimension
|
|
94
|
+
*
|
|
95
|
+
* @param dimension - The dimension to get the analyzer for
|
|
96
|
+
* @returns The analyzer or undefined if not registered
|
|
97
|
+
*/
|
|
98
|
+
getAnalyzer(dimension) {
|
|
99
|
+
return this.analyzers.get(dimension);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Score a project across all dimensions
|
|
103
|
+
*
|
|
104
|
+
* @param projectPath - Path to the project root
|
|
105
|
+
* @param options - Scoring options
|
|
106
|
+
* @returns Complete project score
|
|
107
|
+
*/
|
|
108
|
+
async scoreProject(projectPath, options = {}) {
|
|
109
|
+
const startTime = performance.now();
|
|
110
|
+
this.logger.info(`Starting project scoring for: ${projectPath}`);
|
|
111
|
+
// Detect framework first
|
|
112
|
+
const detectionResult = await this.frameworkDetector.detect(projectPath);
|
|
113
|
+
const framework = detectionResult.value ?? 'Unknown';
|
|
114
|
+
this.logger.debug(`Detected framework: ${framework} (confidence: ${detectionResult.confidence})`);
|
|
115
|
+
// Determine which dimensions to score
|
|
116
|
+
const dimensionsToScore = options.dimensions ?? Object.keys(DEFAULT_DIMENSION_WEIGHTS);
|
|
117
|
+
// Filter out dimensions without analyzers
|
|
118
|
+
const validDimensions = dimensionsToScore.filter((d) => this.analyzers.has(d));
|
|
119
|
+
if (validDimensions.length === 0) {
|
|
120
|
+
this.logger.warn('No analyzers registered for requested dimensions');
|
|
121
|
+
return this.createEmptyScore(projectPath, framework);
|
|
122
|
+
}
|
|
123
|
+
// Combine default and custom weights
|
|
124
|
+
const weights = { ...DEFAULT_DIMENSION_WEIGHTS, ...options.weights };
|
|
125
|
+
// Score each dimension
|
|
126
|
+
const dimensionScores = [];
|
|
127
|
+
const allIssues = [];
|
|
128
|
+
const allImprovements = [];
|
|
129
|
+
for (const dimension of validDimensions) {
|
|
130
|
+
try {
|
|
131
|
+
this.logger.debug(`Scoring dimension: ${dimension}`);
|
|
132
|
+
const analyzer = this.analyzers.get(dimension);
|
|
133
|
+
if (!analyzer)
|
|
134
|
+
continue;
|
|
135
|
+
// Skip if not supported for this framework
|
|
136
|
+
if (analyzer.config.supportedFrameworks &&
|
|
137
|
+
analyzer.config.supportedFrameworks.length > 0 &&
|
|
138
|
+
!analyzer.config.supportedFrameworks.includes(framework)) {
|
|
139
|
+
this.logger.debug(`Skipping ${dimension}: not supported for ${framework}`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const dimensionScore = await analyzer.analyze(projectPath, framework, options);
|
|
143
|
+
// Apply weight
|
|
144
|
+
const weight = weights[dimension] ?? DEFAULT_DIMENSION_WEIGHTS[dimension];
|
|
145
|
+
dimensionScore.weight = weight;
|
|
146
|
+
dimensionScore.weightedScore = dimensionScore.score * weight;
|
|
147
|
+
dimensionScores.push(dimensionScore);
|
|
148
|
+
allIssues.push(...dimensionScore.issues);
|
|
149
|
+
allImprovements.push(...dimensionScore.improvements);
|
|
150
|
+
this.logger.debug(`Dimension ${dimension} scored: ${dimensionScore.score}/100`);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
this.logger.error(`Failed to score dimension ${dimension}:`, error);
|
|
154
|
+
// Add a failed dimension entry
|
|
155
|
+
dimensionScores.push({
|
|
156
|
+
dimension,
|
|
157
|
+
score: 0,
|
|
158
|
+
weight: weights[dimension] ?? DEFAULT_DIMENSION_WEIGHTS[dimension],
|
|
159
|
+
weightedScore: 0,
|
|
160
|
+
issues: [],
|
|
161
|
+
improvements: [],
|
|
162
|
+
metadata: { error: String(error) },
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Calculate overall score
|
|
167
|
+
const totalWeight = dimensionScores.reduce((sum, ds) => sum + ds.weight, 0);
|
|
168
|
+
const overall = totalWeight > 0
|
|
169
|
+
? Math.round(dimensionScores.reduce((sum, ds) => sum + (ds.weightedScore ?? 0), 0) / totalWeight)
|
|
170
|
+
: 0;
|
|
171
|
+
// Get trend if requested
|
|
172
|
+
let trend;
|
|
173
|
+
if (options.includeTrend) {
|
|
174
|
+
trend = await this.calculateTrend(projectPath, overall, options.trendHistorySize);
|
|
175
|
+
}
|
|
176
|
+
// Generate recommendations
|
|
177
|
+
const recommendations = this.generateRecommendations(dimensionScores, allIssues, options.maxRecommendations);
|
|
178
|
+
// Get grade
|
|
179
|
+
const grade = this.getGrade(overall);
|
|
180
|
+
const duration = Math.round(performance.now() - startTime);
|
|
181
|
+
const projectScore = {
|
|
182
|
+
overall,
|
|
183
|
+
grade,
|
|
184
|
+
dimensions: dimensionScores,
|
|
185
|
+
trend,
|
|
186
|
+
recommendations,
|
|
187
|
+
projectPath,
|
|
188
|
+
framework,
|
|
189
|
+
timestamp: new Date(),
|
|
190
|
+
duration,
|
|
191
|
+
daemonVersion: DAEMON_VERSION,
|
|
192
|
+
};
|
|
193
|
+
// Save for history if requested
|
|
194
|
+
if (options.saveForHistory !== false) {
|
|
195
|
+
await this.saveScore(projectPath, projectScore);
|
|
196
|
+
}
|
|
197
|
+
this.logger.info(`Project scoring complete: ${overall}/100 (${grade}) in ${duration}ms`);
|
|
198
|
+
return projectScore;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Score a single dimension
|
|
202
|
+
*
|
|
203
|
+
* @param projectPath - Path to the project root
|
|
204
|
+
* @param dimension - The dimension to score
|
|
205
|
+
* @param options - Scoring options
|
|
206
|
+
* @returns Dimension score
|
|
207
|
+
*/
|
|
208
|
+
async scoreDimension(projectPath, dimension, options = {}) {
|
|
209
|
+
this.logger.debug(`Scoring single dimension: ${dimension}`);
|
|
210
|
+
const analyzer = this.analyzers.get(dimension);
|
|
211
|
+
if (!analyzer) {
|
|
212
|
+
throw new Error(`No analyzer registered for dimension: ${dimension}`);
|
|
213
|
+
}
|
|
214
|
+
// Detect framework
|
|
215
|
+
const detectionResult = await this.frameworkDetector.detect(projectPath);
|
|
216
|
+
const framework = detectionResult.value ?? 'Unknown';
|
|
217
|
+
const dimensionScore = await analyzer.analyze(projectPath, framework, options);
|
|
218
|
+
// Apply weight
|
|
219
|
+
const weights = { ...DEFAULT_DIMENSION_WEIGHTS, ...options.weights };
|
|
220
|
+
const weight = weights[dimension] ?? DEFAULT_DIMENSION_WEIGHTS[dimension];
|
|
221
|
+
dimensionScore.weight = weight;
|
|
222
|
+
dimensionScore.weightedScore = dimensionScore.score * weight;
|
|
223
|
+
return dimensionScore;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get historical scores for a project
|
|
227
|
+
*
|
|
228
|
+
* @param projectPath - Path to the project root
|
|
229
|
+
* @param limit - Maximum number of entries to return
|
|
230
|
+
* @returns Array of historical scores
|
|
231
|
+
*/
|
|
232
|
+
async getHistoricalScores(projectPath, limit = 10) {
|
|
233
|
+
const historyFile = this.getHistoryFilePath(projectPath);
|
|
234
|
+
try {
|
|
235
|
+
if (!existsSync(historyFile)) {
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
const content = await readFile(historyFile, 'utf-8');
|
|
239
|
+
const history = JSON.parse(content);
|
|
240
|
+
// Sort by timestamp descending and limit
|
|
241
|
+
return history
|
|
242
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())
|
|
243
|
+
.slice(0, limit);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
this.logger.warn('Failed to read score history:', error);
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Save a score for historical tracking
|
|
252
|
+
*
|
|
253
|
+
* @param projectPath - Path to the project root
|
|
254
|
+
* @param score - The score to save
|
|
255
|
+
* @returns The historical score entry
|
|
256
|
+
*/
|
|
257
|
+
async saveScore(projectPath, score) {
|
|
258
|
+
const historyFile = this.getHistoryFilePath(projectPath);
|
|
259
|
+
// Ensure directory exists
|
|
260
|
+
const historyDir = join(projectPath, this.historyDir);
|
|
261
|
+
if (!existsSync(historyDir)) {
|
|
262
|
+
await mkdir(historyDir, { recursive: true });
|
|
263
|
+
}
|
|
264
|
+
// Get existing history
|
|
265
|
+
let history = [];
|
|
266
|
+
if (existsSync(historyFile)) {
|
|
267
|
+
try {
|
|
268
|
+
const content = await readFile(historyFile, 'utf-8');
|
|
269
|
+
history = JSON.parse(content);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// File exists but is invalid, start fresh
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Get current git info if available
|
|
276
|
+
let commitHash;
|
|
277
|
+
let branch;
|
|
278
|
+
try {
|
|
279
|
+
const hashResult = await this.executor.execute('git rev-parse HEAD', {
|
|
280
|
+
timeout: 5000,
|
|
281
|
+
silent: true,
|
|
282
|
+
});
|
|
283
|
+
if (hashResult.success && hashResult.data) {
|
|
284
|
+
commitHash = hashResult.data.stdout.trim();
|
|
285
|
+
}
|
|
286
|
+
const branchResult = await this.executor.execute('git rev-parse --abbrev-ref HEAD', {
|
|
287
|
+
timeout: 5000,
|
|
288
|
+
silent: true,
|
|
289
|
+
});
|
|
290
|
+
if (branchResult.success && branchResult.data) {
|
|
291
|
+
branch = branchResult.data.stdout.trim();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// Not a git repo or git not available
|
|
296
|
+
}
|
|
297
|
+
// Create historical entry
|
|
298
|
+
const entry = {
|
|
299
|
+
id: `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
|
|
300
|
+
projectPath,
|
|
301
|
+
overallScore: score.overall,
|
|
302
|
+
dimensions: score.dimensions,
|
|
303
|
+
timestamp: score.timestamp,
|
|
304
|
+
commitHash,
|
|
305
|
+
branch,
|
|
306
|
+
daemonVersion: score.daemonVersion,
|
|
307
|
+
};
|
|
308
|
+
// Add to history and save
|
|
309
|
+
history.push(entry);
|
|
310
|
+
// Keep only last 100 entries
|
|
311
|
+
if (history.length > 100) {
|
|
312
|
+
history = history.slice(-100);
|
|
313
|
+
}
|
|
314
|
+
await writeFile(historyFile, JSON.stringify(history, null, 2), 'utf-8');
|
|
315
|
+
this.logger.debug(`Saved score to history: ${entry.id}`);
|
|
316
|
+
return entry;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Compare two scores to identify changes
|
|
320
|
+
*
|
|
321
|
+
* @param before - Score before changes
|
|
322
|
+
* @param after - Score after changes
|
|
323
|
+
* @returns Detailed comparison
|
|
324
|
+
*/
|
|
325
|
+
compareScores(before, after) {
|
|
326
|
+
const overallChange = after.overall - before.overall;
|
|
327
|
+
const dimensionChanges = new Map();
|
|
328
|
+
// Build lookup map for before dimensions
|
|
329
|
+
const beforeDimensions = new Map(before.dimensions.map((d) => [d.dimension, d]));
|
|
330
|
+
// Calculate changes for each dimension
|
|
331
|
+
for (const afterDim of after.dimensions) {
|
|
332
|
+
const beforeDim = beforeDimensions.get(afterDim.dimension);
|
|
333
|
+
const beforeScore = beforeDim?.score ?? 0;
|
|
334
|
+
dimensionChanges.set(afterDim.dimension, afterDim.score - beforeScore);
|
|
335
|
+
}
|
|
336
|
+
// Find new and resolved issues
|
|
337
|
+
const beforeIssues = new Set(before.dimensions.flatMap((d) => d.issues.map(this.issueKey)));
|
|
338
|
+
const afterIssues = new Set(after.dimensions.flatMap((d) => d.issues.map(this.issueKey)));
|
|
339
|
+
const newIssues = after.dimensions
|
|
340
|
+
.flatMap((d) => d.issues)
|
|
341
|
+
.filter((issue) => !beforeIssues.has(this.issueKey(issue)));
|
|
342
|
+
const resolvedIssues = before.dimensions
|
|
343
|
+
.flatMap((d) => d.issues)
|
|
344
|
+
.filter((issue) => !afterIssues.has(this.issueKey(issue)));
|
|
345
|
+
const issueCountDelta = after.dimensions.reduce((sum, d) => sum + d.issues.length, 0) -
|
|
346
|
+
before.dimensions.reduce((sum, d) => sum + d.issues.length, 0);
|
|
347
|
+
return {
|
|
348
|
+
before,
|
|
349
|
+
after,
|
|
350
|
+
overallChange,
|
|
351
|
+
dimensionChanges,
|
|
352
|
+
newIssues,
|
|
353
|
+
resolvedIssues,
|
|
354
|
+
issueCountDelta,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Generate a summary of the score
|
|
359
|
+
*
|
|
360
|
+
* @param score - The project score
|
|
361
|
+
* @returns Concise summary
|
|
362
|
+
*/
|
|
363
|
+
generateSummary(score) {
|
|
364
|
+
const issuesBySeverity = {
|
|
365
|
+
critical: 0,
|
|
366
|
+
high: 0,
|
|
367
|
+
medium: 0,
|
|
368
|
+
low: 0,
|
|
369
|
+
info: 0,
|
|
370
|
+
};
|
|
371
|
+
// Count issues by severity
|
|
372
|
+
for (const dimension of score.dimensions) {
|
|
373
|
+
for (const issue of dimension.issues) {
|
|
374
|
+
issuesBySeverity[issue.severity]++;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Find weak and strong dimensions
|
|
378
|
+
const sortedDimensions = [...score.dimensions].sort((a, b) => a.score - b.score);
|
|
379
|
+
const weakDimensions = sortedDimensions.slice(0, 3).map((d) => d.dimension);
|
|
380
|
+
const strongDimensions = sortedDimensions.slice(-3).reverse().map((d) => d.dimension);
|
|
381
|
+
// Count priority recommendations
|
|
382
|
+
const priorityRecommendations = score.recommendations.filter((r) => r.priority === 'p0' || r.priority === 'p1').length;
|
|
383
|
+
return {
|
|
384
|
+
overall: score.overall,
|
|
385
|
+
grade: score.grade,
|
|
386
|
+
issuesBySeverity,
|
|
387
|
+
weakDimensions,
|
|
388
|
+
strongDimensions,
|
|
389
|
+
priorityRecommendations,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Calculate trend information
|
|
394
|
+
*
|
|
395
|
+
* @param projectPath - Path to the project
|
|
396
|
+
* @param currentScore - Current overall score
|
|
397
|
+
* @param historySize - Number of historical entries to consider
|
|
398
|
+
* @returns Trend information
|
|
399
|
+
*/
|
|
400
|
+
async calculateTrend(projectPath, currentScore, historySize = 5) {
|
|
401
|
+
const history = await this.getHistoricalScores(projectPath, historySize);
|
|
402
|
+
if (history.length === 0) {
|
|
403
|
+
return undefined;
|
|
404
|
+
}
|
|
405
|
+
// Get most recent score
|
|
406
|
+
const previous = history[0];
|
|
407
|
+
const previousScore = previous.overallScore;
|
|
408
|
+
const delta = currentScore - previousScore;
|
|
409
|
+
let direction = 'stable';
|
|
410
|
+
if (delta > 2) {
|
|
411
|
+
direction = 'up';
|
|
412
|
+
}
|
|
413
|
+
else if (delta < -2) {
|
|
414
|
+
direction = 'down';
|
|
415
|
+
}
|
|
416
|
+
return {
|
|
417
|
+
current: currentScore,
|
|
418
|
+
previous: previousScore,
|
|
419
|
+
delta,
|
|
420
|
+
direction,
|
|
421
|
+
timestamp: new Date(),
|
|
422
|
+
previousTimestamp: new Date(previous.timestamp),
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Generate prioritized recommendations from issues and improvements
|
|
427
|
+
*
|
|
428
|
+
* @param dimensionScores - All dimension scores
|
|
429
|
+
* @param allIssues - All issues found
|
|
430
|
+
* @param maxRecommendations - Maximum number of recommendations
|
|
431
|
+
* @returns Prioritized recommendations
|
|
432
|
+
*/
|
|
433
|
+
generateRecommendations(dimensionScores, allIssues, maxRecommendations = 10) {
|
|
434
|
+
const recommendations = [];
|
|
435
|
+
// Group issues by category
|
|
436
|
+
const issuesByCategory = new Map();
|
|
437
|
+
for (const issue of allIssues) {
|
|
438
|
+
const existing = issuesByCategory.get(issue.category) ?? [];
|
|
439
|
+
existing.push(issue);
|
|
440
|
+
issuesByCategory.set(issue.category, existing);
|
|
441
|
+
}
|
|
442
|
+
// Create recommendations for each category with issues
|
|
443
|
+
for (const [category, issues] of issuesByCategory.entries()) {
|
|
444
|
+
if (issues.length === 0)
|
|
445
|
+
continue;
|
|
446
|
+
// Calculate priority based on severity
|
|
447
|
+
const criticalCount = issues.filter((i) => i.severity === 'critical').length;
|
|
448
|
+
const highCount = issues.filter((i) => i.severity === 'high').length;
|
|
449
|
+
let priority;
|
|
450
|
+
if (criticalCount > 0) {
|
|
451
|
+
priority = 'p0';
|
|
452
|
+
}
|
|
453
|
+
else if (highCount > 0) {
|
|
454
|
+
priority = 'p1';
|
|
455
|
+
}
|
|
456
|
+
else if (issues.length > 5) {
|
|
457
|
+
priority = 'p2';
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
priority = 'p3';
|
|
461
|
+
}
|
|
462
|
+
// Find related dimension
|
|
463
|
+
const relatedDimension = dimensionScores.find((ds) => ds.issues.some((issue) => issue.category === category))?.dimension;
|
|
464
|
+
// Estimate effort
|
|
465
|
+
const effort = criticalCount > 2 || highCount > 5 ? 'major' :
|
|
466
|
+
criticalCount > 0 || highCount > 2 ? 'significant' :
|
|
467
|
+
issues.length > 3 ? 'moderate' : 'quick';
|
|
468
|
+
// Generate action items from fixable issues
|
|
469
|
+
const actions = issues
|
|
470
|
+
.filter((i) => i.fixable)
|
|
471
|
+
.slice(0, 5)
|
|
472
|
+
.map((i) => i.suggestion ?? `Fix: ${i.description}`);
|
|
473
|
+
recommendations.push({
|
|
474
|
+
priority,
|
|
475
|
+
category,
|
|
476
|
+
title: this.generateCategoryTitle(category),
|
|
477
|
+
description: `${issues.length} ${issues.length === 1 ? 'issue' : 'issues'} found in ${category}.`,
|
|
478
|
+
effort,
|
|
479
|
+
dimension: relatedDimension,
|
|
480
|
+
issueCount: issues.length,
|
|
481
|
+
actions,
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
// Sort by priority and count
|
|
485
|
+
const priorityOrder = { p0: 0, p1: 1, p2: 2, p3: 3 };
|
|
486
|
+
recommendations.sort((a, b) => {
|
|
487
|
+
const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
488
|
+
if (priorityDiff !== 0)
|
|
489
|
+
return priorityDiff;
|
|
490
|
+
return b.issueCount - a.issueCount;
|
|
491
|
+
});
|
|
492
|
+
return recommendations.slice(0, maxRecommendations);
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Get letter grade from numeric score
|
|
496
|
+
*
|
|
497
|
+
* @param score - Numeric score (0-100)
|
|
498
|
+
* @returns Letter grade
|
|
499
|
+
*/
|
|
500
|
+
getGrade(score) {
|
|
501
|
+
if (score >= GRADE_THRESHOLDS.A.min)
|
|
502
|
+
return 'A';
|
|
503
|
+
if (score >= GRADE_THRESHOLDS.B.min)
|
|
504
|
+
return 'B';
|
|
505
|
+
if (score >= GRADE_THRESHOLDS.C.min)
|
|
506
|
+
return 'C';
|
|
507
|
+
if (score >= GRADE_THRESHOLDS.D.min)
|
|
508
|
+
return 'D';
|
|
509
|
+
return 'F';
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Get the file path for storing score history
|
|
513
|
+
*
|
|
514
|
+
* @param projectPath - Path to the project
|
|
515
|
+
* @returns Full path to history file
|
|
516
|
+
*/
|
|
517
|
+
getHistoryFilePath(projectPath) {
|
|
518
|
+
return join(projectPath, this.historyDir, SCORE_HISTORY_FILE);
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Generate a unique key for an issue (for comparison)
|
|
522
|
+
*
|
|
523
|
+
* @param issue - The issue
|
|
524
|
+
* @returns Unique key
|
|
525
|
+
*/
|
|
526
|
+
issueKey(issue) {
|
|
527
|
+
return `${issue.category}:${issue.description}:${issue.location ?? ''}`;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Generate a human-readable title for a category
|
|
531
|
+
*
|
|
532
|
+
* @param category - The issue category
|
|
533
|
+
* @returns Title
|
|
534
|
+
*/
|
|
535
|
+
generateCategoryTitle(category) {
|
|
536
|
+
const titles = {
|
|
537
|
+
testing: 'Improve Test Coverage',
|
|
538
|
+
'code-style': 'Code Style Issues',
|
|
539
|
+
performance: 'Performance Optimizations',
|
|
540
|
+
security: 'Security Vulnerabilities',
|
|
541
|
+
a11y: 'Accessibility Improvements',
|
|
542
|
+
ux: 'User Experience Enhancements',
|
|
543
|
+
architecture: 'Architecture Concerns',
|
|
544
|
+
documentation: 'Documentation Needs',
|
|
545
|
+
'error-handling': 'Error Handling Improvements',
|
|
546
|
+
'type-safety': 'Type Safety Improvements',
|
|
547
|
+
'seo': 'SEO Optimizations',
|
|
548
|
+
};
|
|
549
|
+
return titles[category] ?? category;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Create an empty score result when no analyzers are available
|
|
553
|
+
*
|
|
554
|
+
* @param projectPath - Project path
|
|
555
|
+
* @param framework - Detected framework
|
|
556
|
+
* @returns Empty project score
|
|
557
|
+
*/
|
|
558
|
+
createEmptyScore(projectPath, framework) {
|
|
559
|
+
return {
|
|
560
|
+
overall: 0,
|
|
561
|
+
grade: 'F',
|
|
562
|
+
dimensions: [],
|
|
563
|
+
recommendations: [],
|
|
564
|
+
projectPath,
|
|
565
|
+
framework,
|
|
566
|
+
timestamp: new Date(),
|
|
567
|
+
duration: 0,
|
|
568
|
+
daemonVersion: DAEMON_VERSION,
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Clear score history for a project
|
|
573
|
+
*
|
|
574
|
+
* @param projectPath - Path to the project root
|
|
575
|
+
*/
|
|
576
|
+
async clearHistory(projectPath) {
|
|
577
|
+
const historyFile = this.getHistoryFilePath(projectPath);
|
|
578
|
+
if (existsSync(historyFile)) {
|
|
579
|
+
await writeFile(historyFile, '[]', 'utf-8');
|
|
580
|
+
this.logger.debug(`Cleared score history for: ${projectPath}`);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Default scoring service instance
|
|
586
|
+
*/
|
|
587
|
+
let defaultService = null;
|
|
588
|
+
/**
|
|
589
|
+
* Get or create the default scoring service
|
|
590
|
+
*
|
|
591
|
+
* @param options - Optional configuration
|
|
592
|
+
* @returns Scoring service instance
|
|
593
|
+
*/
|
|
594
|
+
export function getScoringService(options) {
|
|
595
|
+
if (!defaultService) {
|
|
596
|
+
defaultService = new ScoringService(options);
|
|
597
|
+
}
|
|
598
|
+
return defaultService;
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Quick score function using default service
|
|
602
|
+
*
|
|
603
|
+
* @param projectPath - Path to the project root
|
|
604
|
+
* @param options - Scoring options
|
|
605
|
+
* @returns Project score
|
|
606
|
+
*/
|
|
607
|
+
export async function scoreProject(projectPath, options) {
|
|
608
|
+
const service = getScoringService();
|
|
609
|
+
return service.scoreProject(projectPath, options);
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Get or create a scoring service with all default analyzers registered
|
|
613
|
+
*
|
|
614
|
+
* This function creates a new ScoringService instance and registers
|
|
615
|
+
* all built-in dimension analyzers automatically.
|
|
616
|
+
*
|
|
617
|
+
* @param options - Optional configuration
|
|
618
|
+
* @returns Scoring service instance with all analyzers registered
|
|
619
|
+
*/
|
|
620
|
+
export async function getScoringServiceWithDefaults(options) {
|
|
621
|
+
const service = new ScoringService(options);
|
|
622
|
+
// Import all dimension analyzers
|
|
623
|
+
const { testCoverageAnalyzer, codeQualityAnalyzer, performanceAnalyzer, securityAnalyzer, accessibilityAnalyzer, uiUxAnalyzer, backendLogicAnalyzer, businessLogicAnalyzer, seoAnalyzer, } = await import('./dimensions/index.js');
|
|
624
|
+
// Register all analyzers
|
|
625
|
+
service.registerAnalyzer(testCoverageAnalyzer);
|
|
626
|
+
service.registerAnalyzer(codeQualityAnalyzer);
|
|
627
|
+
service.registerAnalyzer(performanceAnalyzer);
|
|
628
|
+
service.registerAnalyzer(securityAnalyzer);
|
|
629
|
+
service.registerAnalyzer(accessibilityAnalyzer);
|
|
630
|
+
service.registerAnalyzer(uiUxAnalyzer);
|
|
631
|
+
service.registerAnalyzer(backendLogicAnalyzer);
|
|
632
|
+
service.registerAnalyzer(businessLogicAnalyzer);
|
|
633
|
+
service.registerAnalyzer(seoAnalyzer);
|
|
634
|
+
return service;
|
|
635
|
+
}
|
|
636
|
+
//# sourceMappingURL=scoring-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring-service.js","sourceRoot":"","sources":["../../../src/services/scoring/scoring-service.ts"],"names":[],"mappings":"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"}
|