@vyuhlabs/dxkit 1.5.0 → 1.6.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 (258) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +272 -358
  3. package/THIRD_PARTY_NOTICES.md +40 -0
  4. package/dist/analyzers/developer/detailed.d.ts +26 -0
  5. package/dist/analyzers/developer/detailed.d.ts.map +1 -0
  6. package/dist/analyzers/developer/detailed.js +193 -0
  7. package/dist/analyzers/developer/detailed.js.map +1 -0
  8. package/dist/analyzers/developer/gather.d.ts +11 -0
  9. package/dist/analyzers/developer/gather.d.ts.map +1 -0
  10. package/dist/analyzers/developer/gather.js +167 -0
  11. package/dist/analyzers/developer/gather.js.map +1 -0
  12. package/dist/analyzers/developer/index.d.ts +8 -0
  13. package/dist/analyzers/developer/index.d.ts.map +1 -0
  14. package/dist/analyzers/developer/index.js +168 -0
  15. package/dist/analyzers/developer/index.js.map +1 -0
  16. package/dist/analyzers/developer/types.d.ts +49 -0
  17. package/dist/analyzers/developer/types.d.ts.map +1 -0
  18. package/dist/analyzers/developer/types.js +6 -0
  19. package/dist/analyzers/developer/types.js.map +1 -0
  20. package/dist/analyzers/docs/shallow.d.ts +9 -0
  21. package/dist/analyzers/docs/shallow.d.ts.map +1 -0
  22. package/dist/analyzers/docs/shallow.js +8 -0
  23. package/dist/analyzers/docs/shallow.js.map +1 -0
  24. package/dist/analyzers/dx/shallow.d.ts +9 -0
  25. package/dist/analyzers/dx/shallow.d.ts.map +1 -0
  26. package/dist/analyzers/dx/shallow.js +8 -0
  27. package/dist/analyzers/dx/shallow.js.map +1 -0
  28. package/dist/analyzers/evidence.d.ts +36 -0
  29. package/dist/analyzers/evidence.d.ts.map +1 -0
  30. package/dist/analyzers/evidence.js +3 -0
  31. package/dist/analyzers/evidence.js.map +1 -0
  32. package/dist/analyzers/health/actions.d.ts +10 -0
  33. package/dist/analyzers/health/actions.d.ts.map +1 -0
  34. package/dist/analyzers/health/actions.js +284 -0
  35. package/dist/analyzers/health/actions.js.map +1 -0
  36. package/dist/analyzers/health/detailed.d.ts +26 -0
  37. package/dist/analyzers/health/detailed.d.ts.map +1 -0
  38. package/dist/analyzers/health/detailed.js +147 -0
  39. package/dist/analyzers/health/detailed.js.map +1 -0
  40. package/dist/analyzers/health.d.ts +22 -0
  41. package/dist/analyzers/health.d.ts.map +1 -0
  42. package/dist/analyzers/health.js +270 -0
  43. package/dist/analyzers/health.js.map +1 -0
  44. package/dist/analyzers/index.d.ts +3 -0
  45. package/dist/analyzers/index.d.ts.map +1 -0
  46. package/dist/analyzers/index.js +6 -0
  47. package/dist/analyzers/index.js.map +1 -0
  48. package/dist/analyzers/maintainability/shallow.d.ts +9 -0
  49. package/dist/analyzers/maintainability/shallow.d.ts.map +1 -0
  50. package/dist/analyzers/maintainability/shallow.js +8 -0
  51. package/dist/analyzers/maintainability/shallow.js.map +1 -0
  52. package/dist/analyzers/quality/actions.d.ts +5 -0
  53. package/dist/analyzers/quality/actions.d.ts.map +1 -0
  54. package/dist/analyzers/quality/actions.js +158 -0
  55. package/dist/analyzers/quality/actions.js.map +1 -0
  56. package/dist/analyzers/quality/detailed.d.ts +17 -0
  57. package/dist/analyzers/quality/detailed.d.ts.map +1 -0
  58. package/dist/analyzers/quality/detailed.js +122 -0
  59. package/dist/analyzers/quality/detailed.js.map +1 -0
  60. package/dist/analyzers/quality/gather.d.ts +38 -0
  61. package/dist/analyzers/quality/gather.d.ts.map +1 -0
  62. package/dist/analyzers/quality/gather.js +279 -0
  63. package/dist/analyzers/quality/gather.js.map +1 -0
  64. package/dist/analyzers/quality/index.d.ts +12 -0
  65. package/dist/analyzers/quality/index.d.ts.map +1 -0
  66. package/dist/analyzers/quality/index.js +281 -0
  67. package/dist/analyzers/quality/index.js.map +1 -0
  68. package/dist/analyzers/quality/shallow.d.ts +9 -0
  69. package/dist/analyzers/quality/shallow.d.ts.map +1 -0
  70. package/dist/analyzers/quality/shallow.js +8 -0
  71. package/dist/analyzers/quality/shallow.js.map +1 -0
  72. package/dist/analyzers/quality/types.d.ts +66 -0
  73. package/dist/analyzers/quality/types.d.ts.map +1 -0
  74. package/dist/analyzers/quality/types.js +3 -0
  75. package/dist/analyzers/quality/types.js.map +1 -0
  76. package/dist/analyzers/remediation.d.ts +42 -0
  77. package/dist/analyzers/remediation.d.ts.map +1 -0
  78. package/dist/analyzers/remediation.js +28 -0
  79. package/dist/analyzers/remediation.js.map +1 -0
  80. package/dist/analyzers/scoring.d.ts +32 -0
  81. package/dist/analyzers/scoring.d.ts.map +1 -0
  82. package/dist/analyzers/scoring.js +410 -0
  83. package/dist/analyzers/scoring.js.map +1 -0
  84. package/dist/analyzers/security/actions.d.ts +7 -0
  85. package/dist/analyzers/security/actions.d.ts.map +1 -0
  86. package/dist/analyzers/security/actions.js +104 -0
  87. package/dist/analyzers/security/actions.js.map +1 -0
  88. package/dist/analyzers/security/detailed.d.ts +14 -0
  89. package/dist/analyzers/security/detailed.d.ts.map +1 -0
  90. package/dist/analyzers/security/detailed.js +124 -0
  91. package/dist/analyzers/security/detailed.js.map +1 -0
  92. package/dist/analyzers/security/gather.d.ts +12 -0
  93. package/dist/analyzers/security/gather.d.ts.map +1 -0
  94. package/dist/analyzers/security/gather.js +195 -0
  95. package/dist/analyzers/security/gather.js.map +1 -0
  96. package/dist/analyzers/security/index.d.ts +8 -0
  97. package/dist/analyzers/security/index.d.ts.map +1 -0
  98. package/dist/analyzers/security/index.js +173 -0
  99. package/dist/analyzers/security/index.js.map +1 -0
  100. package/dist/analyzers/security/scoring.d.ts +29 -0
  101. package/dist/analyzers/security/scoring.d.ts.map +1 -0
  102. package/dist/analyzers/security/scoring.js +40 -0
  103. package/dist/analyzers/security/scoring.js.map +1 -0
  104. package/dist/analyzers/security/shallow.d.ts +10 -0
  105. package/dist/analyzers/security/shallow.d.ts.map +1 -0
  106. package/dist/analyzers/security/shallow.js +8 -0
  107. package/dist/analyzers/security/shallow.js.map +1 -0
  108. package/dist/analyzers/security/types.d.ts +43 -0
  109. package/dist/analyzers/security/types.d.ts.map +1 -0
  110. package/dist/analyzers/security/types.js +6 -0
  111. package/dist/analyzers/security/types.js.map +1 -0
  112. package/dist/analyzers/tests/actions.d.ts +6 -0
  113. package/dist/analyzers/tests/actions.d.ts.map +1 -0
  114. package/dist/analyzers/tests/actions.js +80 -0
  115. package/dist/analyzers/tests/actions.js.map +1 -0
  116. package/dist/analyzers/tests/detailed.d.ts +14 -0
  117. package/dist/analyzers/tests/detailed.d.ts.map +1 -0
  118. package/dist/analyzers/tests/detailed.js +121 -0
  119. package/dist/analyzers/tests/detailed.js.map +1 -0
  120. package/dist/analyzers/tests/gather.d.ts +5 -0
  121. package/dist/analyzers/tests/gather.d.ts.map +1 -0
  122. package/dist/analyzers/tests/gather.js +270 -0
  123. package/dist/analyzers/tests/gather.js.map +1 -0
  124. package/dist/analyzers/tests/import-graph.d.ts +48 -0
  125. package/dist/analyzers/tests/import-graph.d.ts.map +1 -0
  126. package/dist/analyzers/tests/import-graph.js +231 -0
  127. package/dist/analyzers/tests/import-graph.js.map +1 -0
  128. package/dist/analyzers/tests/index.d.ts +8 -0
  129. package/dist/analyzers/tests/index.d.ts.map +1 -0
  130. package/dist/analyzers/tests/index.js +247 -0
  131. package/dist/analyzers/tests/index.js.map +1 -0
  132. package/dist/analyzers/tests/scoring.d.ts +27 -0
  133. package/dist/analyzers/tests/scoring.d.ts.map +1 -0
  134. package/dist/analyzers/tests/scoring.js +38 -0
  135. package/dist/analyzers/tests/scoring.js.map +1 -0
  136. package/dist/analyzers/tests/shallow.d.ts +9 -0
  137. package/dist/analyzers/tests/shallow.d.ts.map +1 -0
  138. package/dist/analyzers/tests/shallow.js +8 -0
  139. package/dist/analyzers/tests/shallow.js.map +1 -0
  140. package/dist/analyzers/tests/types.d.ts +49 -0
  141. package/dist/analyzers/tests/types.d.ts.map +1 -0
  142. package/dist/analyzers/tests/types.js +6 -0
  143. package/dist/analyzers/tests/types.js.map +1 -0
  144. package/dist/analyzers/tools/cloc.d.ts +8 -0
  145. package/dist/analyzers/tools/cloc.d.ts.map +1 -0
  146. package/dist/analyzers/tools/cloc.js +49 -0
  147. package/dist/analyzers/tools/cloc.js.map +1 -0
  148. package/dist/analyzers/tools/coverage.d.ts +59 -0
  149. package/dist/analyzers/tools/coverage.d.ts.map +1 -0
  150. package/dist/analyzers/tools/coverage.js +280 -0
  151. package/dist/analyzers/tools/coverage.js.map +1 -0
  152. package/dist/analyzers/tools/cvss-v4-lookup.d.ts +10 -0
  153. package/dist/analyzers/tools/cvss-v4-lookup.d.ts.map +1 -0
  154. package/dist/analyzers/tools/cvss-v4-lookup.js +284 -0
  155. package/dist/analyzers/tools/cvss-v4-lookup.js.map +1 -0
  156. package/dist/analyzers/tools/cvss-v4.d.ts +24 -0
  157. package/dist/analyzers/tools/cvss-v4.d.ts.map +1 -0
  158. package/dist/analyzers/tools/cvss-v4.js +362 -0
  159. package/dist/analyzers/tools/cvss-v4.js.map +1 -0
  160. package/dist/analyzers/tools/default-exclusions.gitignore +56 -0
  161. package/dist/analyzers/tools/exclusions.d.ts +70 -0
  162. package/dist/analyzers/tools/exclusions.d.ts.map +1 -0
  163. package/dist/analyzers/tools/exclusions.js +250 -0
  164. package/dist/analyzers/tools/exclusions.js.map +1 -0
  165. package/dist/analyzers/tools/generic.d.ts +4 -0
  166. package/dist/analyzers/tools/generic.d.ts.map +1 -0
  167. package/dist/analyzers/tools/generic.js +198 -0
  168. package/dist/analyzers/tools/generic.js.map +1 -0
  169. package/dist/analyzers/tools/gitleaks.d.ts +8 -0
  170. package/dist/analyzers/tools/gitleaks.d.ts.map +1 -0
  171. package/dist/analyzers/tools/gitleaks.js +58 -0
  172. package/dist/analyzers/tools/gitleaks.js.map +1 -0
  173. package/dist/analyzers/tools/graphify.d.ts +4 -0
  174. package/dist/analyzers/tools/graphify.d.ts.map +1 -0
  175. package/dist/analyzers/tools/graphify.js +222 -0
  176. package/dist/analyzers/tools/graphify.js.map +1 -0
  177. package/dist/analyzers/tools/osv.d.ts +51 -0
  178. package/dist/analyzers/tools/osv.d.ts.map +1 -0
  179. package/dist/analyzers/tools/osv.js +188 -0
  180. package/dist/analyzers/tools/osv.js.map +1 -0
  181. package/dist/analyzers/tools/parallel.d.ts +8 -0
  182. package/dist/analyzers/tools/parallel.d.ts.map +1 -0
  183. package/dist/analyzers/tools/parallel.js +195 -0
  184. package/dist/analyzers/tools/parallel.js.map +1 -0
  185. package/dist/analyzers/tools/runner.d.ts +13 -0
  186. package/dist/analyzers/tools/runner.d.ts.map +1 -0
  187. package/dist/analyzers/tools/runner.js +109 -0
  188. package/dist/analyzers/tools/runner.js.map +1 -0
  189. package/dist/analyzers/tools/suppressions.d.ts +55 -0
  190. package/dist/analyzers/tools/suppressions.d.ts.map +1 -0
  191. package/dist/analyzers/tools/suppressions.js +203 -0
  192. package/dist/analyzers/tools/suppressions.js.map +1 -0
  193. package/dist/analyzers/tools/timing.d.ts +9 -0
  194. package/dist/analyzers/tools/timing.d.ts.map +1 -0
  195. package/dist/analyzers/tools/timing.js +29 -0
  196. package/dist/analyzers/tools/timing.js.map +1 -0
  197. package/dist/analyzers/tools/tool-registry.d.ts +86 -0
  198. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -0
  199. package/dist/analyzers/tools/tool-registry.js +705 -0
  200. package/dist/analyzers/tools/tool-registry.js.map +1 -0
  201. package/dist/analyzers/types.d.ts +125 -0
  202. package/dist/analyzers/types.d.ts.map +1 -0
  203. package/dist/analyzers/types.js +11 -0
  204. package/dist/analyzers/types.js.map +1 -0
  205. package/dist/cli.d.ts.map +1 -1
  206. package/dist/cli.js +462 -0
  207. package/dist/cli.js.map +1 -1
  208. package/dist/detect.d.ts.map +1 -1
  209. package/dist/detect.js +24 -15
  210. package/dist/detect.js.map +1 -1
  211. package/dist/languages/csharp.d.ts +5 -0
  212. package/dist/languages/csharp.d.ts.map +1 -0
  213. package/dist/languages/csharp.js +265 -0
  214. package/dist/languages/csharp.js.map +1 -0
  215. package/dist/languages/go.d.ts +11 -0
  216. package/dist/languages/go.d.ts.map +1 -0
  217. package/dist/languages/go.js +321 -0
  218. package/dist/languages/go.js.map +1 -0
  219. package/dist/languages/index.d.ts +6 -0
  220. package/dist/languages/index.d.ts.map +1 -0
  221. package/dist/languages/index.js +18 -0
  222. package/dist/languages/index.js.map +1 -0
  223. package/dist/languages/python.d.ts +3 -0
  224. package/dist/languages/python.d.ts.map +1 -0
  225. package/dist/languages/python.js +284 -0
  226. package/dist/languages/python.js.map +1 -0
  227. package/dist/languages/rust.d.ts +17 -0
  228. package/dist/languages/rust.d.ts.map +1 -0
  229. package/dist/languages/rust.js +333 -0
  230. package/dist/languages/rust.js.map +1 -0
  231. package/dist/languages/types.d.ts +38 -0
  232. package/dist/languages/types.d.ts.map +1 -0
  233. package/dist/languages/types.js +3 -0
  234. package/dist/languages/types.js.map +1 -0
  235. package/dist/languages/typescript.d.ts +15 -0
  236. package/dist/languages/typescript.d.ts.map +1 -0
  237. package/dist/languages/typescript.js +353 -0
  238. package/dist/languages/typescript.js.map +1 -0
  239. package/dist/logger.d.ts +1 -0
  240. package/dist/logger.d.ts.map +1 -1
  241. package/dist/logger.js +25 -12
  242. package/dist/logger.js.map +1 -1
  243. package/dist/project-yaml.d.ts.map +1 -1
  244. package/dist/project-yaml.js +1 -0
  245. package/dist/project-yaml.js.map +1 -1
  246. package/dist/tools-cli.d.ts +2 -0
  247. package/dist/tools-cli.d.ts.map +1 -0
  248. package/dist/tools-cli.js +231 -0
  249. package/dist/tools-cli.js.map +1 -0
  250. package/dist/types.d.ts +10 -0
  251. package/dist/types.d.ts.map +1 -1
  252. package/package.json +6 -2
  253. package/templates/.claude/commands/dev-report.md +34 -4
  254. package/templates/.claude/commands/health.md +45 -2
  255. package/templates/.claude/commands/quality.md.template +38 -15
  256. package/templates/.claude/commands/test-gaps.md +36 -2
  257. package/templates/.claude/commands/vulnerabilities.md +36 -2
  258. package/templates/.project/scripts/setup/interactive-setup.sh +6 -2
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scoreTest = scoreTest;
4
+ exports.scoreQuality = scoreQuality;
5
+ exports.scoreDocumentation = scoreDocumentation;
6
+ exports.scoreSecurity = scoreSecurity;
7
+ exports.scoreMaintainability = scoreMaintainability;
8
+ exports.scoreDeveloperExperience = scoreDeveloperExperience;
9
+ exports.computeOverall = computeOverall;
10
+ function status(score) {
11
+ if (score >= 80)
12
+ return 'excellent';
13
+ if (score >= 60)
14
+ return 'good';
15
+ if (score >= 40)
16
+ return 'fair';
17
+ if (score >= 20)
18
+ return 'poor';
19
+ return 'critical';
20
+ }
21
+ function clamp(value, min = 0, max = 100) {
22
+ return Math.round(Math.max(min, Math.min(max, value)));
23
+ }
24
+ /** Testing: 0-100 */
25
+ function scoreTest(m) {
26
+ const sourceCount = Math.max(m.sourceFiles, 1);
27
+ const testRatio = m.testFiles / sourceCount;
28
+ let score;
29
+ if (m.testFiles === 0) {
30
+ score = 0;
31
+ }
32
+ else {
33
+ score = Math.min(testRatio * 200, 60);
34
+ if (m.coverageConfigExists)
35
+ score += 10;
36
+ if (m.testsPass === true)
37
+ score += 15;
38
+ if (m.coveragePercent !== null && m.coveragePercent >= 60)
39
+ score += 10;
40
+ if (m.coveragePercent !== null && m.coveragePercent >= 80)
41
+ score += 5;
42
+ }
43
+ // AST enhancement: detect commented-out code files
44
+ if (m.commentedCodeRatio !== null && m.commentedCodeRatio > 0.5) {
45
+ score -= 15;
46
+ }
47
+ score = clamp(score);
48
+ return {
49
+ score,
50
+ maxScore: 100,
51
+ status: status(score),
52
+ metrics: {
53
+ sourceFiles: m.sourceFiles,
54
+ testFiles: m.testFiles,
55
+ testRatio: Math.round(testRatio * 100) / 100,
56
+ testsPass: m.testsPass,
57
+ coveragePercent: m.coveragePercent,
58
+ coverageConfigExists: m.coverageConfigExists,
59
+ testFramework: m.testFramework,
60
+ commentedCodeRatio: m.commentedCodeRatio,
61
+ },
62
+ details: m.testFiles === 0
63
+ ? `No test files found across ${m.sourceFiles} source files. 0% test coverage.`
64
+ : `${m.testFiles} test files for ${m.sourceFiles} source files (ratio: ${(testRatio * 100).toFixed(1)}%). ` +
65
+ `Tests ${m.testsPass === true ? 'pass' : m.testsPass === false ? 'fail' : 'not run'}. ` +
66
+ (m.coveragePercent !== null
67
+ ? `Coverage: ${m.coveragePercent}%. `
68
+ : 'No coverage data. ') +
69
+ (m.testFramework ? `Framework: ${m.testFramework}.` : '') +
70
+ (m.commentedCodeRatio !== null && m.commentedCodeRatio > 0.5
71
+ ? ` Warning: ${(m.commentedCodeRatio * 100).toFixed(0)}% of source files appear to contain only comments.`
72
+ : ''),
73
+ };
74
+ }
75
+ /** Code Quality: 0-100 */
76
+ function scoreQuality(m) {
77
+ const sourceCount = Math.max(m.sourceFiles, 1);
78
+ let score = 100;
79
+ // Lint errors
80
+ if (m.lintErrors > 0) {
81
+ const errorRatio = m.lintErrors / sourceCount;
82
+ score -= Math.min(errorRatio * 100, 40);
83
+ }
84
+ // Large files
85
+ if (m.filesOver500Lines > 5)
86
+ score -= 10;
87
+ if (m.filesOver500Lines > 20)
88
+ score -= 10;
89
+ if (m.largestFileLines > 5000)
90
+ score -= 10;
91
+ if (m.largestFileLines > 10000)
92
+ score -= 10;
93
+ // Console/debug statements
94
+ const consoleDensity = m.consoleLogCount / sourceCount;
95
+ if (consoleDensity > 3)
96
+ score -= 15;
97
+ else if (consoleDensity > 1)
98
+ score -= 10;
99
+ else if (consoleDensity > 0.3)
100
+ score -= 5;
101
+ // Loose typing
102
+ const anyDensity = m.anyTypeCount / sourceCount;
103
+ if (anyDensity > 10)
104
+ score -= 15;
105
+ else if (anyDensity > 5)
106
+ score -= 10;
107
+ else if (anyDensity > 1)
108
+ score -= 5;
109
+ // Type errors
110
+ if (m.typeErrors !== null && m.typeErrors > 0) {
111
+ score -= Math.min((m.typeErrors / sourceCount) * 50, 15);
112
+ }
113
+ // AST enhancements
114
+ if (m.maxFunctionsInFile !== null && m.maxFunctionsInFile > 50)
115
+ score -= 10;
116
+ if (m.deadImportCount !== null && m.deadImportCount > 20)
117
+ score -= 5;
118
+ score = clamp(score);
119
+ return {
120
+ score,
121
+ maxScore: 100,
122
+ status: status(score),
123
+ metrics: {
124
+ lintErrors: m.lintErrors,
125
+ lintWarnings: m.lintWarnings,
126
+ lintTool: m.lintTool,
127
+ filesOver500Lines: m.filesOver500Lines,
128
+ largestFileLines: m.largestFileLines,
129
+ largestFilePath: m.largestFilePath,
130
+ consoleLogCount: m.consoleLogCount,
131
+ anyTypeCount: m.anyTypeCount,
132
+ typeErrors: m.typeErrors,
133
+ maxFunctionsInFile: m.maxFunctionsInFile,
134
+ deadImportCount: m.deadImportCount,
135
+ },
136
+ details: `${m.lintErrors} lint errors, ${m.lintWarnings} warnings` +
137
+ (m.lintTool ? ` (${m.lintTool})` : '') +
138
+ `. ${m.filesOver500Lines} files exceed 500 lines` +
139
+ `. Largest file: ${m.largestFilePath} (${m.largestFileLines} lines)` +
140
+ `. ${m.consoleLogCount} console/debug statements` +
141
+ (m.anyTypeCount > 0 ? `. ${m.anyTypeCount} loose type annotations` : '') +
142
+ (m.maxFunctionsInFile !== null ? `. Densest file: ${m.maxFunctionsInFile} functions` : '') +
143
+ '.',
144
+ };
145
+ }
146
+ /** Documentation: 0-100 */
147
+ function scoreDocumentation(m) {
148
+ const sourceCount = Math.max(m.sourceFiles, 1);
149
+ let score = 0;
150
+ if (m.readmeExists) {
151
+ if (m.readmeLines > 100)
152
+ score += 25;
153
+ else if (m.readmeLines > 50)
154
+ score += 20;
155
+ else if (m.readmeLines > 20)
156
+ score += 15;
157
+ else
158
+ score += 5;
159
+ }
160
+ const docRatio = m.docCommentFiles / sourceCount;
161
+ if (docRatio > 0.5)
162
+ score += 25;
163
+ else if (docRatio > 0.2)
164
+ score += 15;
165
+ else if (docRatio > 0.05)
166
+ score += 5;
167
+ if (m.apiDocsExist)
168
+ score += 20;
169
+ if (m.architectureDocsExist)
170
+ score += 15;
171
+ if (m.contributingExists)
172
+ score += 10;
173
+ if (m.changelogExists)
174
+ score += 5;
175
+ score = clamp(score);
176
+ return {
177
+ score,
178
+ maxScore: 100,
179
+ status: status(score),
180
+ metrics: {
181
+ readmeExists: m.readmeExists,
182
+ readmeLines: m.readmeLines,
183
+ docCommentFiles: m.docCommentFiles,
184
+ docRatio: Math.round(docRatio * 100) / 100,
185
+ apiDocsExist: m.apiDocsExist,
186
+ architectureDocsExist: m.architectureDocsExist,
187
+ contributingExists: m.contributingExists,
188
+ changelogExists: m.changelogExists,
189
+ },
190
+ details: `README: ${m.readmeExists ? `${m.readmeLines} lines` : 'missing'}` +
191
+ `. ${m.docCommentFiles}/${m.sourceFiles} files have doc comments (${(docRatio * 100).toFixed(1)}%)` +
192
+ `. API docs: ${m.apiDocsExist ? 'yes' : 'no'}` +
193
+ `. Architecture docs: ${m.architectureDocsExist ? 'yes' : 'no'}` +
194
+ `. Contributing: ${m.contributingExists ? 'yes' : 'no'}` +
195
+ '.',
196
+ };
197
+ }
198
+ /** Security: 0-100 */
199
+ function scoreSecurity(m) {
200
+ let score = 100;
201
+ // Hardcoded secrets (max -25)
202
+ if (m.secretFindings > 10)
203
+ score -= 25;
204
+ else if (m.secretFindings > 5)
205
+ score -= 20;
206
+ else if (m.secretFindings > 0)
207
+ score -= 15;
208
+ // Private keys in repo (max -20)
209
+ if (m.privateKeyFiles > 0)
210
+ score -= 20;
211
+ // eval/exec (max -10)
212
+ if (m.evalCount > 3)
213
+ score -= 10;
214
+ else if (m.evalCount > 0)
215
+ score -= 5;
216
+ // .env in git (max -10)
217
+ if (m.envFilesInGit > 0)
218
+ score -= 10;
219
+ // TLS disabled (max -10)
220
+ if (m.tlsDisabledCount > 0)
221
+ score -= 10;
222
+ // Dependency vulnerabilities (max -25)
223
+ if (m.depVulnCritical > 0)
224
+ score -= 15;
225
+ if (m.depVulnHigh > 5)
226
+ score -= 10;
227
+ else if (m.depVulnHigh > 0)
228
+ score -= 5;
229
+ score = clamp(score);
230
+ return {
231
+ score,
232
+ maxScore: 100,
233
+ status: status(score),
234
+ metrics: {
235
+ secretFindings: m.secretFindings,
236
+ privateKeyFiles: m.privateKeyFiles,
237
+ evalCount: m.evalCount,
238
+ envFilesInGit: m.envFilesInGit,
239
+ tlsDisabledCount: m.tlsDisabledCount,
240
+ depVulnCritical: m.depVulnCritical,
241
+ depVulnHigh: m.depVulnHigh,
242
+ depVulnMedium: m.depVulnMedium,
243
+ depVulnLow: m.depVulnLow,
244
+ depAuditTool: m.depAuditTool,
245
+ },
246
+ details: `${m.secretFindings} hardcoded secret patterns found` +
247
+ `. ${m.privateKeyFiles} private key files in repo` +
248
+ `. ${m.evalCount} eval/exec calls` +
249
+ `. ${m.envFilesInGit} .env files tracked in git` +
250
+ `. ${m.tlsDisabledCount} TLS verification disabled` +
251
+ `. Dependency vulns: ${m.depVulnCritical} critical, ${m.depVulnHigh} high, ${m.depVulnMedium} medium, ${m.depVulnLow} low` +
252
+ (m.depAuditTool ? ` (${m.depAuditTool})` : '') +
253
+ '.',
254
+ };
255
+ }
256
+ /** Maintainability: 0-100 */
257
+ function scoreMaintainability(m) {
258
+ let score = 70;
259
+ // God files penalty
260
+ if (m.largestFileLines > 10000)
261
+ score -= 25;
262
+ else if (m.largestFileLines > 5000)
263
+ score -= 15;
264
+ else if (m.largestFileLines > 2000)
265
+ score -= 10;
266
+ else if (m.largestFileLines > 1000)
267
+ score -= 5;
268
+ if (m.filesOver500Lines > 30)
269
+ score -= 15;
270
+ else if (m.filesOver500Lines > 15)
271
+ score -= 10;
272
+ else if (m.filesOver500Lines > 5)
273
+ score -= 5;
274
+ if (m.consoleLogCount > 500)
275
+ score -= 10;
276
+ else if (m.consoleLogCount > 100)
277
+ score -= 5;
278
+ // Outdated Node engine
279
+ if (m.nodeEngineVersion) {
280
+ const majorMatch = m.nodeEngineVersion.match(/(\d+)/);
281
+ if (majorMatch) {
282
+ const major = parseInt(majorMatch[1]);
283
+ if (major < 16)
284
+ score -= 10;
285
+ else if (major < 18)
286
+ score -= 5;
287
+ }
288
+ }
289
+ // Small codebase bonus
290
+ if (m.sourceFiles < 50)
291
+ score += 10;
292
+ if (m.sourceFiles < 20)
293
+ score += 5;
294
+ // AST enhancements (calibrated for real-world repos)
295
+ if (m.godNodeCount !== null) {
296
+ const godRatio = m.godNodeCount / Math.max(m.sourceFiles, 1);
297
+ if (godRatio > 0.1)
298
+ score -= 10;
299
+ else if (godRatio > 0.05)
300
+ score -= 5;
301
+ }
302
+ if (m.avgCohesion !== null && m.avgCohesion < 0.15)
303
+ score -= 5;
304
+ score = clamp(score);
305
+ return {
306
+ score,
307
+ maxScore: 100,
308
+ status: status(score),
309
+ metrics: {
310
+ sourceFiles: m.sourceFiles,
311
+ controllers: m.controllers,
312
+ models: m.models,
313
+ directories: m.directories,
314
+ largestFileLines: m.largestFileLines,
315
+ filesOver500Lines: m.filesOver500Lines,
316
+ nodeEngineVersion: m.nodeEngineVersion,
317
+ godNodeCount: m.godNodeCount,
318
+ communityCount: m.communityCount,
319
+ avgCohesion: m.avgCohesion,
320
+ orphanModuleCount: m.orphanModuleCount,
321
+ },
322
+ details: `${m.sourceFiles} source files across ${m.directories} directories` +
323
+ `. ${m.controllers} controllers/handlers, ${m.models} models` +
324
+ `. Largest file: ${m.largestFileLines} lines` +
325
+ `. ${m.filesOver500Lines} files over 500 lines` +
326
+ (m.nodeEngineVersion ? `. Node engine: ${m.nodeEngineVersion}` : '') +
327
+ (m.communityCount !== null ? `. ${m.communityCount} architectural communities` : '') +
328
+ (m.avgCohesion !== null ? `. Avg cohesion: ${m.avgCohesion.toFixed(2)}` : '') +
329
+ '.',
330
+ };
331
+ }
332
+ /** Developer Experience: 0-100 */
333
+ function scoreDeveloperExperience(m) {
334
+ let score = 0;
335
+ if (m.ciConfigCount > 0)
336
+ score += 20;
337
+ if (m.dockerConfigCount > 0)
338
+ score += 15;
339
+ if (m.precommitConfigCount > 0)
340
+ score += 10;
341
+ if (m.makefileExists)
342
+ score += 10;
343
+ if (m.envExampleExists)
344
+ score += 10;
345
+ if (m.npmScriptsCount >= 8)
346
+ score += 15;
347
+ else if (m.npmScriptsCount >= 4)
348
+ score += 10;
349
+ else if (m.npmScriptsCount >= 1)
350
+ score += 5;
351
+ if (m.contributingExists)
352
+ score += 10;
353
+ if (m.readmeLines > 50)
354
+ score += 5;
355
+ if (m.changelogExists)
356
+ score += 5;
357
+ score = clamp(score);
358
+ return {
359
+ score,
360
+ maxScore: 100,
361
+ status: status(score),
362
+ metrics: {
363
+ ciConfigCount: m.ciConfigCount,
364
+ dockerConfigCount: m.dockerConfigCount,
365
+ precommitConfigCount: m.precommitConfigCount,
366
+ makefileExists: m.makefileExists,
367
+ envExampleExists: m.envExampleExists,
368
+ npmScriptsCount: m.npmScriptsCount,
369
+ contributingExists: m.contributingExists,
370
+ changelogExists: m.changelogExists,
371
+ },
372
+ details: `CI configs: ${m.ciConfigCount}` +
373
+ `. Docker: ${m.dockerConfigCount > 0 ? 'yes' : 'no'}` +
374
+ `. Pre-commit hooks: ${m.precommitConfigCount > 0 ? 'yes' : 'no'}` +
375
+ `. Makefile: ${m.makefileExists ? 'yes' : 'no'}` +
376
+ `. .env.example: ${m.envExampleExists ? 'yes' : 'no'}` +
377
+ `. npm scripts: ${m.npmScriptsCount}` +
378
+ '.',
379
+ };
380
+ }
381
+ /** Compute overall weighted score and grade. */
382
+ function computeOverall(dimensions) {
383
+ const weights = {
384
+ testing: 0.25,
385
+ quality: 0.2,
386
+ documentation: 0.1,
387
+ security: 0.2,
388
+ maintainability: 0.1,
389
+ developerExperience: 0.15,
390
+ };
391
+ const overallScore = Math.round(dimensions.testing.score * weights.testing +
392
+ dimensions.quality.score * weights.quality +
393
+ dimensions.documentation.score * weights.documentation +
394
+ dimensions.security.score * weights.security +
395
+ dimensions.maintainability.score * weights.maintainability +
396
+ dimensions.developerExperience.score * weights.developerExperience);
397
+ let grade;
398
+ if (overallScore >= 80)
399
+ grade = 'A';
400
+ else if (overallScore >= 60)
401
+ grade = 'B';
402
+ else if (overallScore >= 40)
403
+ grade = 'C';
404
+ else if (overallScore >= 20)
405
+ grade = 'D';
406
+ else
407
+ grade = 'F';
408
+ return { overallScore, grade };
409
+ }
410
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/analyzers/scoring.ts"],"names":[],"mappings":";;AAqBA,8BAgDC;AAGD,oCAiEC;AAGD,gDA4CC;AAGD,sCAqDC;AAGD,oDAkEC;AAGD,4DAyCC;AAGD,wCAkCC;AA9XD,SAAS,MAAM,CAAC,KAAa;IAC3B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,qBAAqB;AACrB,SAAgB,SAAS,CAAC,CAAgB;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC;IAE5C,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,GAAG,CAAC,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,oBAAoB;YAAE,KAAK,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,SAAS,KAAK,IAAI;YAAE,KAAK,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,eAAe,KAAK,IAAI,IAAI,CAAC,CAAC,eAAe,IAAI,EAAE;YAAE,KAAK,IAAI,EAAE,CAAC;QACvE,IAAI,CAAC,CAAC,eAAe,KAAK,IAAI,IAAI,CAAC,CAAC,eAAe,IAAI,EAAE;YAAE,KAAK,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,mDAAmD;IACnD,IAAI,CAAC,CAAC,kBAAkB,KAAK,IAAI,IAAI,CAAC,CAAC,kBAAkB,GAAG,GAAG,EAAE,CAAC;QAChE,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACrB,OAAO,EAAE;YACP,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG;YAC5C,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;YAC5C,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;SACzC;QACD,OAAO,EACL,CAAC,CAAC,SAAS,KAAK,CAAC;YACf,CAAC,CAAC,8BAA8B,CAAC,CAAC,WAAW,kCAAkC;YAC/E,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,mBAAmB,CAAC,CAAC,WAAW,yBAAyB,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBACzG,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI;gBACvF,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI;oBACzB,CAAC,CAAC,aAAa,CAAC,CAAC,eAAe,KAAK;oBACrC,CAAC,CAAC,oBAAoB,CAAC;gBACzB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,CAAC,CAAC,CAAC,kBAAkB,KAAK,IAAI,IAAI,CAAC,CAAC,kBAAkB,GAAG,GAAG;oBAC1D,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD;oBAC1G,CAAC,CAAC,EAAE,CAAC;KACd,CAAC;AACJ,CAAC;AAED,0BAA0B;AAC1B,SAAgB,YAAY,CAAC,CAAgB;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,cAAc;IACd,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC;QAC9C,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,cAAc;IACd,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,CAAC,iBAAiB,GAAG,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,CAAC,gBAAgB,GAAG,IAAI;QAAE,KAAK,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,CAAC,gBAAgB,GAAG,KAAK;QAAE,KAAK,IAAI,EAAE,CAAC;IAE5C,2BAA2B;IAC3B,MAAM,cAAc,GAAG,CAAC,CAAC,eAAe,GAAG,WAAW,CAAC;IACvD,IAAI,cAAc,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SAC/B,IAAI,cAAc,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SACpC,IAAI,cAAc,GAAG,GAAG;QAAE,KAAK,IAAI,CAAC,CAAC;IAE1C,eAAe;IACf,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC;IAChD,IAAI,UAAU,GAAG,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;SAC5B,IAAI,UAAU,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SAChC,IAAI,UAAU,GAAG,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAEpC,cAAc;IACd,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,CAAC,kBAAkB,KAAK,IAAI,IAAI,CAAC,CAAC,kBAAkB,GAAG,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;IAC5E,IAAI,CAAC,CAAC,eAAe,KAAK,IAAI,IAAI,CAAC,CAAC,eAAe,GAAG,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC;IAErE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACrB,OAAO,EAAE;YACP,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,eAAe,EAAE,CAAC,CAAC,eAAe;SACnC;QACD,OAAO,EACL,GAAG,CAAC,CAAC,UAAU,iBAAiB,CAAC,CAAC,YAAY,WAAW;YACzD,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,CAAC,iBAAiB,yBAAyB;YACjD,mBAAmB,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,gBAAgB,SAAS;YACpE,KAAK,CAAC,CAAC,eAAe,2BAA2B;YACjD,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,CAAC,CAAC,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,kBAAkB,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1F,GAAG;KACN,CAAC;AACJ,CAAC;AAED,2BAA2B;AAC3B,SAAgB,kBAAkB,CAAC,CAAgB;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,WAAW,GAAG,GAAG;YAAE,KAAK,IAAI,EAAE,CAAC;aAChC,IAAI,CAAC,CAAC,WAAW,GAAG,EAAE;YAAE,KAAK,IAAI,EAAE,CAAC;aACpC,IAAI,CAAC,CAAC,WAAW,GAAG,EAAE;YAAE,KAAK,IAAI,EAAE,CAAC;;YACpC,KAAK,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,GAAG,WAAW,CAAC;IACjD,IAAI,QAAQ,GAAG,GAAG;QAAE,KAAK,IAAI,EAAE,CAAC;SAC3B,IAAI,QAAQ,GAAG,GAAG;QAAE,KAAK,IAAI,EAAE,CAAC;SAChC,IAAI,QAAQ,GAAG,IAAI;QAAE,KAAK,IAAI,CAAC,CAAC;IAErC,IAAI,CAAC,CAAC,YAAY;QAAE,KAAK,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC,qBAAqB;QAAE,KAAK,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,CAAC,kBAAkB;QAAE,KAAK,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,CAAC,eAAe;QAAE,KAAK,IAAI,CAAC,CAAC;IAElC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACrB,OAAO,EAAE;YACP,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG;YAC1C,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,qBAAqB,EAAE,CAAC,CAAC,qBAAqB;YAC9C,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,eAAe,EAAE,CAAC,CAAC,eAAe;SACnC;QACD,OAAO,EACL,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE;YAClE,KAAK,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,WAAW,6BAA6B,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACnG,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YAC9C,wBAAwB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YAChE,mBAAmB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YACxD,GAAG;KACN,CAAC;AACJ,CAAC;AAED,sBAAsB;AACtB,SAAgB,aAAa,CAAC,CAAgB;IAC5C,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,8BAA8B;IAC9B,IAAI,CAAC,CAAC,cAAc,GAAG,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;SAClC,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SACtC,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAE3C,iCAAiC;IACjC,IAAI,CAAC,CAAC,eAAe,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAEvC,sBAAsB;IACtB,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SAC5B,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAErC,wBAAwB;IACxB,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAErC,yBAAyB;IACzB,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAExC,uCAAuC;IACvC,IAAI,CAAC,CAAC,eAAe,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SAC9B,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAEvC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACrB,OAAO,EAAE;YACP,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;SAC7B;QACD,OAAO,EACL,GAAG,CAAC,CAAC,cAAc,kCAAkC;YACrD,KAAK,CAAC,CAAC,eAAe,4BAA4B;YAClD,KAAK,CAAC,CAAC,SAAS,kBAAkB;YAClC,KAAK,CAAC,CAAC,aAAa,4BAA4B;YAChD,KAAK,CAAC,CAAC,gBAAgB,4BAA4B;YACnD,uBAAuB,CAAC,CAAC,eAAe,cAAc,CAAC,CAAC,WAAW,UAAU,CAAC,CAAC,aAAa,YAAY,CAAC,CAAC,UAAU,MAAM;YAC1H,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG;KACN,CAAC;AACJ,CAAC;AAED,6BAA6B;AAC7B,SAAgB,oBAAoB,CAAC,CAAgB;IACnD,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,oBAAoB;IACpB,IAAI,CAAC,CAAC,gBAAgB,GAAG,KAAK;QAAE,KAAK,IAAI,EAAE,CAAC;SACvC,IAAI,CAAC,CAAC,gBAAgB,GAAG,IAAI;QAAE,KAAK,IAAI,EAAE,CAAC;SAC3C,IAAI,CAAC,CAAC,gBAAgB,GAAG,IAAI;QAAE,KAAK,IAAI,EAAE,CAAC;SAC3C,IAAI,CAAC,CAAC,gBAAgB,GAAG,IAAI;QAAE,KAAK,IAAI,CAAC,CAAC;IAE/C,IAAI,CAAC,CAAC,iBAAiB,GAAG,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;SACrC,IAAI,CAAC,CAAC,iBAAiB,GAAG,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;SAC1C,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC,CAAC,eAAe,GAAG,GAAG;QAAE,KAAK,IAAI,EAAE,CAAC;SACpC,IAAI,CAAC,CAAC,eAAe,GAAG,GAAG;QAAE,KAAK,IAAI,CAAC,CAAC;IAE7C,uBAAuB;IACvB,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,KAAK,GAAG,EAAE;gBAAE,KAAK,IAAI,EAAE,CAAC;iBACvB,IAAI,KAAK,GAAG,EAAE;gBAAE,KAAK,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,CAAC,WAAW,GAAG,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,CAAC,WAAW,GAAG,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC;IAEnC,qDAAqD;IACrD,IAAI,CAAC,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC7D,IAAI,QAAQ,GAAG,GAAG;YAAE,KAAK,IAAI,EAAE,CAAC;aAC3B,IAAI,QAAQ,GAAG,IAAI;YAAE,KAAK,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,GAAG,IAAI;QAAE,KAAK,IAAI,CAAC,CAAC;IAE/D,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACrB,OAAO,EAAE;YACP,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;SACvC;QACD,OAAO,EACL,GAAG,CAAC,CAAC,WAAW,wBAAwB,CAAC,CAAC,WAAW,cAAc;YACnE,KAAK,CAAC,CAAC,WAAW,0BAA0B,CAAC,CAAC,MAAM,SAAS;YAC7D,mBAAmB,CAAC,CAAC,gBAAgB,QAAQ;YAC7C,KAAK,CAAC,CAAC,iBAAiB,uBAAuB;YAC/C,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,4BAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG;KACN,CAAC;AACJ,CAAC;AAED,kCAAkC;AAClC,SAAgB,wBAAwB,CAAC,CAAgB;IACvD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC,iBAAiB,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,CAAC,oBAAoB,GAAG,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,CAAC,cAAc;QAAE,KAAK,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,CAAC,gBAAgB;QAAE,KAAK,IAAI,EAAE,CAAC;IAEpC,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SACnC,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;SACxC,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,CAAC,kBAAkB;QAAE,KAAK,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,CAAC,WAAW,GAAG,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,eAAe;QAAE,KAAK,IAAI,CAAC,CAAC;IAElC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACrB,OAAO,EAAE;YACP,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;YAC5C,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;YACxC,eAAe,EAAE,CAAC,CAAC,eAAe;SACnC;QACD,OAAO,EACL,eAAe,CAAC,CAAC,aAAa,EAAE;YAChC,aAAa,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YACrD,uBAAuB,CAAC,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YAClE,eAAe,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YAChD,mBAAmB,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YACtD,kBAAkB,CAAC,CAAC,eAAe,EAAE;YACrC,GAAG;KACN,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,SAAgB,cAAc,CAAC,UAO9B;IACC,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,GAAG;QACZ,aAAa,EAAE,GAAG;QAClB,QAAQ,EAAE,GAAG;QACb,eAAe,EAAE,GAAG;QACpB,mBAAmB,EAAE,IAAI;KAC1B,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC7B,UAAU,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO;QACxC,UAAU,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO;QAC1C,UAAU,CAAC,aAAa,CAAC,KAAK,GAAG,OAAO,CAAC,aAAa;QACtD,UAAU,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ;QAC5C,UAAU,CAAC,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC,eAAe;QAC1D,UAAU,CAAC,mBAAmB,CAAC,KAAK,GAAG,OAAO,CAAC,mBAAmB,CACrE,CAAC;IAEF,IAAI,KAAkC,CAAC;IACvC,IAAI,YAAY,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SAC/B,IAAI,YAAY,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SACpC,IAAI,YAAY,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SACpC,IAAI,YAAY,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;;QACpC,KAAK,GAAG,GAAG,CAAC;IAEjB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { RemediationAction } from '../remediation';
2
+ import { SecurityReport } from './types';
3
+ import { SecurityCounts } from './scoring';
4
+ /** Project a SecurityReport into the counts shape used for scoring. */
5
+ export declare function countsFromReport(report: SecurityReport): SecurityCounts;
6
+ export declare function buildSecurityActions(report: SecurityReport): RemediationAction<SecurityCounts>[];
7
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/analyzers/security/actions.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAA6B,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAavE;AAyCD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAwDhG"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.countsFromReport = countsFromReport;
4
+ exports.buildSecurityActions = buildSecurityActions;
5
+ /** Project a SecurityReport into the counts shape used for scoring. */
6
+ function countsFromReport(report) {
7
+ const s = report.summary.findings;
8
+ const d = report.summary.dependencies;
9
+ return {
10
+ critical: s.critical,
11
+ high: s.high,
12
+ medium: s.medium,
13
+ low: s.low,
14
+ depCritical: d.critical,
15
+ depHigh: d.high,
16
+ depMedium: d.medium,
17
+ depLow: d.low,
18
+ };
19
+ }
20
+ /** Deduct N findings of the given severity from counts, clamped to 0. */
21
+ function deductSeverity(counts, severity, n, depsOnly = false) {
22
+ const key = depsOnly
23
+ ? ('dep' + severity[0].toUpperCase() + severity.slice(1))
24
+ : severity;
25
+ return { ...counts, [key]: Math.max(0, counts[key] - n) };
26
+ }
27
+ /** Convert a finding into generic evidence. */
28
+ function findingToEvidence(f) {
29
+ return {
30
+ file: f.file,
31
+ line: f.line,
32
+ rule: f.rule,
33
+ tool: f.tool,
34
+ message: `${f.severity.toUpperCase()}: ${f.title}${f.cwe ? ` (${f.cwe})` : ''}`,
35
+ };
36
+ }
37
+ /** Group findings by rule id; sorted within-group by severity then file. */
38
+ function groupByRule(findings) {
39
+ const groups = new Map();
40
+ const order = { critical: 0, high: 1, medium: 2, low: 3 };
41
+ for (const f of findings) {
42
+ const arr = groups.get(f.rule) || [];
43
+ arr.push(f);
44
+ groups.set(f.rule, arr);
45
+ }
46
+ for (const arr of groups.values()) {
47
+ arr.sort((a, b) => order[a.severity] - order[b.severity] || a.file.localeCompare(b.file));
48
+ }
49
+ return groups;
50
+ }
51
+ function buildSecurityActions(report) {
52
+ const actions = [];
53
+ const groups = groupByRule(report.findings);
54
+ // One action per rule group — fix ALL findings matching that rule.
55
+ for (const [rule, findings] of groups) {
56
+ const topSeverity = findings[0].severity;
57
+ const counts = {
58
+ critical: findings.filter((f) => f.severity === 'critical').length,
59
+ high: findings.filter((f) => f.severity === 'high').length,
60
+ medium: findings.filter((f) => f.severity === 'medium').length,
61
+ low: findings.filter((f) => f.severity === 'low').length,
62
+ };
63
+ actions.push({
64
+ id: `security.fix-${rule}`,
65
+ title: `Fix ${findings.length} ${rule} finding${findings.length === 1 ? '' : 's'} (${topSeverity.toUpperCase()})`,
66
+ rationale: `Rule ${rule} (${findings[0].tool}). ${findings[0].cwe || 'No CWE tag'}.`,
67
+ evidence: findings.slice(0, 50).map(findingToEvidence),
68
+ patch: (c) => {
69
+ let next = c;
70
+ next = deductSeverity(next, 'critical', counts.critical);
71
+ next = deductSeverity(next, 'high', counts.high);
72
+ next = deductSeverity(next, 'medium', counts.medium);
73
+ next = deductSeverity(next, 'low', counts.low);
74
+ return next;
75
+ },
76
+ });
77
+ }
78
+ // Dependency updates — one action covering all dep vulns.
79
+ const d = report.summary.dependencies;
80
+ if (d.total > 0 && d.tool) {
81
+ actions.push({
82
+ id: 'security.update-vulnerable-deps',
83
+ title: `Update ${d.total} vulnerable dependenc${d.total === 1 ? 'y' : 'ies'} (${d.critical}C ${d.high}H ${d.medium}M ${d.low}L)`,
84
+ rationale: `Run \`${d.tool} fix\` or bump affected packages. Most CVEs are fixed in newer minor versions.`,
85
+ evidence: [
86
+ {
87
+ file: d.tool === 'npm-audit' ? 'package-lock.json' : 'requirements.txt',
88
+ rule: 'dep-vuln',
89
+ tool: d.tool,
90
+ message: `${d.total} vulnerable dependencies`,
91
+ },
92
+ ],
93
+ patch: (c) => ({
94
+ ...c,
95
+ depCritical: 0,
96
+ depHigh: 0,
97
+ depMedium: 0,
98
+ depLow: 0,
99
+ }),
100
+ });
101
+ }
102
+ return actions;
103
+ }
104
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/analyzers/security/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Detailed security report — JSON schema + markdown formatter.
3
+ */
4
+ import { SecurityReport } from './types';
5
+ import { RankedAction } from '../remediation';
6
+ import { SecurityCounts } from './scoring';
7
+ export interface SecurityDetailedReport extends SecurityReport {
8
+ schemaVersion: string;
9
+ securityScore: number;
10
+ actions: Array<RankedAction<SecurityCounts>>;
11
+ }
12
+ export declare function buildSecurityDetailed(report: SecurityReport): SecurityDetailedReport;
13
+ export declare function formatSecurityDetailedMarkdown(detailed: SecurityDetailedReport, elapsed: string): string;
14
+ //# sourceMappingURL=detailed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detailed.d.ts","sourceRoot":"","sources":["../../../src/analyzers/security/detailed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAA6B,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,YAAY,EAAQ,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAuB,MAAM,WAAW,CAAC;AAEhE,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;CAC9C;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,sBAAsB,CASpF;AAID,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,sBAAsB,EAChC,OAAO,EAAE,MAAM,GACd,MAAM,CAmHR"}