@oalacea/daemon 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/README.md +268 -58
  2. package/bin/Dockerfile +158 -16
  3. package/dist/cli/cli.d.ts.map +1 -1
  4. package/dist/cli/cli.js +22 -2
  5. package/dist/cli/cli.js.map +1 -1
  6. package/dist/cli/commands/command.types.d.ts +216 -0
  7. package/dist/cli/commands/command.types.d.ts.map +1 -0
  8. package/dist/cli/commands/command.types.js +64 -0
  9. package/dist/cli/commands/command.types.js.map +1 -0
  10. package/dist/cli/commands/history.command.d.ts +91 -0
  11. package/dist/cli/commands/history.command.d.ts.map +1 -0
  12. package/dist/cli/commands/history.command.js +336 -0
  13. package/dist/cli/commands/history.command.js.map +1 -0
  14. package/dist/cli/commands/index.d.ts +14 -3
  15. package/dist/cli/commands/index.d.ts.map +1 -1
  16. package/dist/cli/commands/index.js +7 -0
  17. package/dist/cli/commands/index.js.map +1 -1
  18. package/dist/cli/commands/optimize.command.d.ts +110 -0
  19. package/dist/cli/commands/optimize.command.d.ts.map +1 -0
  20. package/dist/cli/commands/optimize.command.js +497 -0
  21. package/dist/cli/commands/optimize.command.js.map +1 -0
  22. package/dist/cli/commands/report.command.d.ts +110 -0
  23. package/dist/cli/commands/report.command.d.ts.map +1 -0
  24. package/dist/cli/commands/report.command.js +532 -0
  25. package/dist/cli/commands/report.command.js.map +1 -0
  26. package/dist/cli/commands/review.command.d.ts +110 -0
  27. package/dist/cli/commands/review.command.d.ts.map +1 -0
  28. package/dist/cli/commands/review.command.js +520 -0
  29. package/dist/cli/commands/review.command.js.map +1 -0
  30. package/dist/cli/commands/score.command.d.ts +47 -0
  31. package/dist/cli/commands/score.command.d.ts.map +1 -0
  32. package/dist/cli/commands/score.command.js +261 -0
  33. package/dist/cli/commands/score.command.js.map +1 -0
  34. package/dist/cli/utils/index.d.ts +10 -0
  35. package/dist/cli/utils/index.d.ts.map +1 -0
  36. package/dist/cli/utils/index.js +10 -0
  37. package/dist/cli/utils/index.js.map +1 -0
  38. package/dist/cli/utils/output.d.ts +192 -0
  39. package/dist/cli/utils/output.d.ts.map +1 -0
  40. package/dist/cli/utils/output.js +411 -0
  41. package/dist/cli/utils/output.js.map +1 -0
  42. package/dist/cli/utils/progress.d.ts +204 -0
  43. package/dist/cli/utils/progress.d.ts.map +1 -0
  44. package/dist/cli/utils/progress.js +396 -0
  45. package/dist/cli/utils/progress.js.map +1 -0
  46. package/dist/core/types/index.d.ts +1 -0
  47. package/dist/core/types/index.d.ts.map +1 -1
  48. package/dist/core/types/project.types.d.ts +3 -3
  49. package/dist/core/types/project.types.d.ts.map +1 -1
  50. package/dist/core/types/scoring.types.d.ts +301 -0
  51. package/dist/core/types/scoring.types.d.ts.map +1 -0
  52. package/dist/core/types/scoring.types.js +8 -0
  53. package/dist/core/types/scoring.types.js.map +1 -0
  54. package/dist/services/detection/framework-detector.d.ts.map +1 -1
  55. package/dist/services/detection/framework-detector.js +74 -5
  56. package/dist/services/detection/framework-detector.js.map +1 -1
  57. package/dist/services/index.d.ts +12 -0
  58. package/dist/services/index.d.ts.map +1 -1
  59. package/dist/services/index.js +14 -0
  60. package/dist/services/index.js.map +1 -1
  61. package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
  62. package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
  63. package/dist/services/optimization/detectors/bug-detector.js +443 -0
  64. package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
  65. package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
  66. package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
  67. package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
  68. package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
  69. package/dist/services/optimization/detectors/index.d.ts +7 -0
  70. package/dist/services/optimization/detectors/index.d.ts.map +1 -0
  71. package/dist/services/optimization/detectors/index.js +7 -0
  72. package/dist/services/optimization/detectors/index.js.map +1 -0
  73. package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
  74. package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
  75. package/dist/services/optimization/detectors/perf-detector.js +451 -0
  76. package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
  77. package/dist/services/optimization/index.d.ts +61 -0
  78. package/dist/services/optimization/index.d.ts.map +1 -0
  79. package/dist/services/optimization/index.js +69 -0
  80. package/dist/services/optimization/index.js.map +1 -0
  81. package/dist/services/optimization/optimization.service.d.ts +65 -0
  82. package/dist/services/optimization/optimization.service.d.ts.map +1 -0
  83. package/dist/services/optimization/optimization.service.js +511 -0
  84. package/dist/services/optimization/optimization.service.js.map +1 -0
  85. package/dist/services/optimization/optimization.types.d.ts +343 -0
  86. package/dist/services/optimization/optimization.types.d.ts.map +1 -0
  87. package/dist/services/optimization/optimization.types.js +8 -0
  88. package/dist/services/optimization/optimization.types.js.map +1 -0
  89. package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
  90. package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
  91. package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
  92. package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
  93. package/dist/services/optimization/optimizers/index.d.ts +7 -0
  94. package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
  95. package/dist/services/optimization/optimizers/index.js +7 -0
  96. package/dist/services/optimization/optimizers/index.js.map +1 -0
  97. package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
  98. package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
  99. package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
  100. package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
  101. package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
  102. package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
  103. package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
  104. package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
  105. package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
  106. package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
  107. package/dist/services/optimization/patterns/anti-patterns.js +501 -0
  108. package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
  109. package/dist/services/optimization/patterns/index.d.ts +5 -0
  110. package/dist/services/optimization/patterns/index.d.ts.map +1 -0
  111. package/dist/services/optimization/patterns/index.js +5 -0
  112. package/dist/services/optimization/patterns/index.js.map +1 -0
  113. package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
  114. package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
  115. package/dist/services/reporting/export/chart.exporter.js +350 -0
  116. package/dist/services/reporting/export/chart.exporter.js.map +1 -0
  117. package/dist/services/reporting/export/index.d.ts +9 -0
  118. package/dist/services/reporting/export/index.d.ts.map +1 -0
  119. package/dist/services/reporting/export/index.js +10 -0
  120. package/dist/services/reporting/export/index.js.map +1 -0
  121. package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
  122. package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
  123. package/dist/services/reporting/export/pdf.exporter.js +270 -0
  124. package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
  125. package/dist/services/reporting/history.service.d.ts +93 -0
  126. package/dist/services/reporting/history.service.d.ts.map +1 -0
  127. package/dist/services/reporting/history.service.js +285 -0
  128. package/dist/services/reporting/history.service.js.map +1 -0
  129. package/dist/services/reporting/index.d.ts +15 -0
  130. package/dist/services/reporting/index.d.ts.map +1 -0
  131. package/dist/services/reporting/index.js +16 -0
  132. package/dist/services/reporting/index.js.map +1 -0
  133. package/dist/services/reporting/report.service.d.ts +102 -0
  134. package/dist/services/reporting/report.service.d.ts.map +1 -0
  135. package/dist/services/reporting/report.service.js +240 -0
  136. package/dist/services/reporting/report.service.js.map +1 -0
  137. package/dist/services/reporting/reporting.types.d.ts +329 -0
  138. package/dist/services/reporting/reporting.types.d.ts.map +1 -0
  139. package/dist/services/reporting/reporting.types.js +8 -0
  140. package/dist/services/reporting/reporting.types.js.map +1 -0
  141. package/dist/services/reporting/templates/html.template.d.ts +81 -0
  142. package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
  143. package/dist/services/reporting/templates/html.template.js +741 -0
  144. package/dist/services/reporting/templates/html.template.js.map +1 -0
  145. package/dist/services/reporting/templates/json.template.d.ts +85 -0
  146. package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
  147. package/dist/services/reporting/templates/json.template.js +308 -0
  148. package/dist/services/reporting/templates/json.template.js.map +1 -0
  149. package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
  150. package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
  151. package/dist/services/reporting/templates/markdown.template.js +311 -0
  152. package/dist/services/reporting/templates/markdown.template.js.map +1 -0
  153. package/dist/services/reporting/trend-analyzer.d.ts +73 -0
  154. package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
  155. package/dist/services/reporting/trend-analyzer.js +291 -0
  156. package/dist/services/reporting/trend-analyzer.js.map +1 -0
  157. package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
  158. package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
  159. package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
  160. package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
  161. package/dist/services/review/analyzers/index.d.ts +13 -0
  162. package/dist/services/review/analyzers/index.d.ts.map +1 -0
  163. package/dist/services/review/analyzers/index.js +13 -0
  164. package/dist/services/review/analyzers/index.js.map +1 -0
  165. package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
  166. package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
  167. package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
  168. package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
  169. package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
  170. package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
  171. package/dist/services/review/analyzers/performance-analyzer.js +589 -0
  172. package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
  173. package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
  174. package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
  175. package/dist/services/review/analyzers/security-analyzer.js +512 -0
  176. package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
  177. package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
  178. package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
  179. package/dist/services/review/analyzers/static-analyzer.js +423 -0
  180. package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
  181. package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
  182. package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
  183. package/dist/services/review/fixers/auto-fixer.js +404 -0
  184. package/dist/services/review/fixers/auto-fixer.js.map +1 -0
  185. package/dist/services/review/fixers/index.d.ts +11 -0
  186. package/dist/services/review/fixers/index.d.ts.map +1 -0
  187. package/dist/services/review/fixers/index.js +11 -0
  188. package/dist/services/review/fixers/index.js.map +1 -0
  189. package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
  190. package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
  191. package/dist/services/review/fixers/refactor-suggester.js +555 -0
  192. package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
  193. package/dist/services/review/fixers/test-generator.d.ts +99 -0
  194. package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
  195. package/dist/services/review/fixers/test-generator.js +458 -0
  196. package/dist/services/review/fixers/test-generator.js.map +1 -0
  197. package/dist/services/review/index.d.ts +14 -0
  198. package/dist/services/review/index.d.ts.map +1 -0
  199. package/dist/services/review/index.js +14 -0
  200. package/dist/services/review/index.js.map +1 -0
  201. package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
  202. package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
  203. package/dist/services/review/reporters/fix-reporter.js +437 -0
  204. package/dist/services/review/reporters/fix-reporter.js.map +1 -0
  205. package/dist/services/review/reporters/index.d.ts +10 -0
  206. package/dist/services/review/reporters/index.d.ts.map +1 -0
  207. package/dist/services/review/reporters/index.js +10 -0
  208. package/dist/services/review/reporters/index.js.map +1 -0
  209. package/dist/services/review/reporters/score-reporter.d.ts +84 -0
  210. package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
  211. package/dist/services/review/reporters/score-reporter.js +560 -0
  212. package/dist/services/review/reporters/score-reporter.js.map +1 -0
  213. package/dist/services/review/review.service.d.ts +129 -0
  214. package/dist/services/review/review.service.d.ts.map +1 -0
  215. package/dist/services/review/review.service.js +396 -0
  216. package/dist/services/review/review.service.js.map +1 -0
  217. package/dist/services/review/review.types.d.ts +443 -0
  218. package/dist/services/review/review.types.d.ts.map +1 -0
  219. package/dist/services/review/review.types.js +11 -0
  220. package/dist/services/review/review.types.js.map +1 -0
  221. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
  222. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
  223. package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
  224. package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
  225. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
  226. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
  227. package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
  228. package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
  229. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
  230. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
  231. package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
  232. package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
  233. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
  234. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
  235. package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
  236. package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
  237. package/dist/services/scoring/dimensions/index.d.ts +18 -0
  238. package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
  239. package/dist/services/scoring/dimensions/index.js +27 -0
  240. package/dist/services/scoring/dimensions/index.js.map +1 -0
  241. package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
  242. package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
  243. package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
  244. package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
  245. package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
  246. package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
  247. package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
  248. package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
  249. package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
  250. package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
  251. package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
  252. package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
  253. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
  254. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
  255. package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
  256. package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
  257. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
  258. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
  259. package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
  260. package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
  261. package/dist/services/scoring/index.d.ts +10 -0
  262. package/dist/services/scoring/index.d.ts.map +1 -0
  263. package/dist/services/scoring/index.js +10 -0
  264. package/dist/services/scoring/index.js.map +1 -0
  265. package/dist/services/scoring/scoring-service.d.ts +222 -0
  266. package/dist/services/scoring/scoring-service.d.ts.map +1 -0
  267. package/dist/services/scoring/scoring-service.js +636 -0
  268. package/dist/services/scoring/scoring-service.js.map +1 -0
  269. package/package.json +11 -3
  270. package/templates/README.md +183 -0
  271. package/templates/nestjs/controller.spec.ts +203 -0
  272. package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
  273. package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
  274. package/templates/nestjs/fixtures/test-module.ts +311 -0
  275. package/templates/nestjs/guard.spec.ts +314 -0
  276. package/templates/nestjs/interceptor.spec.ts +458 -0
  277. package/templates/nestjs/module.spec.ts +173 -0
  278. package/templates/nestjs/pipe.spec.ts +474 -0
  279. package/templates/nestjs/service.spec.ts +296 -0
  280. package/templates/rust/Cargo.toml +72 -0
  281. package/templates/rust/actix-controller.test.rs +114 -0
  282. package/templates/rust/axum-handler.test.rs +117 -0
  283. package/templates/rust/integration.test.rs +63 -0
  284. package/templates/rust/rocket-route.test.rs +106 -0
  285. package/templates/rust/unit.test.rs +38 -0
@@ -0,0 +1,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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"}