@mohantn/gate-keeper 2.1.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 (272) hide show
  1. package/.github/instructions/dotnet-api-integration.instructions.md +416 -0
  2. package/.github/instructions/dotnet-development.instructions.md +353 -0
  3. package/.github/instructions/dotnet-testing.instructions.md +406 -0
  4. package/.github/instructions/gate-keeper.instructions.md +91 -0
  5. package/.github/instructions/react-development.instructions.md +315 -0
  6. package/.github/instructions/react-testing-optimization.instructions.md +373 -0
  7. package/.github/instructions/uiux.instructions.md +261 -0
  8. package/LICENSE +21 -0
  9. package/README.md +181 -0
  10. package/dist/analyzer/coverage-analyzer.d.ts +126 -0
  11. package/dist/analyzer/coverage-analyzer.d.ts.map +1 -0
  12. package/dist/analyzer/coverage-analyzer.js +633 -0
  13. package/dist/analyzer/coverage-analyzer.js.map +1 -0
  14. package/dist/analyzer/csharp-analyzer.d.ts +28 -0
  15. package/dist/analyzer/csharp-analyzer.d.ts.map +1 -0
  16. package/dist/analyzer/csharp-analyzer.js +437 -0
  17. package/dist/analyzer/csharp-analyzer.js.map +1 -0
  18. package/dist/analyzer/pattern-detector.d.ts +5 -0
  19. package/dist/analyzer/pattern-detector.d.ts.map +1 -0
  20. package/dist/analyzer/pattern-detector.js +74 -0
  21. package/dist/analyzer/pattern-detector.js.map +1 -0
  22. package/dist/analyzer/refactoring-advisor.d.ts +7 -0
  23. package/dist/analyzer/refactoring-advisor.d.ts.map +1 -0
  24. package/dist/analyzer/refactoring-advisor.js +280 -0
  25. package/dist/analyzer/refactoring-advisor.js.map +1 -0
  26. package/dist/analyzer/sonar-eslint-runner.d.ts +3 -0
  27. package/dist/analyzer/sonar-eslint-runner.d.ts.map +1 -0
  28. package/dist/analyzer/sonar-eslint-runner.js +136 -0
  29. package/dist/analyzer/sonar-eslint-runner.js.map +1 -0
  30. package/dist/analyzer/sonar-rule-map.d.ts +19 -0
  31. package/dist/analyzer/sonar-rule-map.d.ts.map +1 -0
  32. package/dist/analyzer/sonar-rule-map.js +67 -0
  33. package/dist/analyzer/sonar-rule-map.js.map +1 -0
  34. package/dist/analyzer/string-analyzer.d.ts +27 -0
  35. package/dist/analyzer/string-analyzer.d.ts.map +1 -0
  36. package/dist/analyzer/string-analyzer.js +274 -0
  37. package/dist/analyzer/string-analyzer.js.map +1 -0
  38. package/dist/analyzer/typescript-analyzer.d.ts +27 -0
  39. package/dist/analyzer/typescript-analyzer.d.ts.map +1 -0
  40. package/dist/analyzer/typescript-analyzer.js +437 -0
  41. package/dist/analyzer/typescript-analyzer.js.map +1 -0
  42. package/dist/analyzer/universal-analyzer.d.ts +10 -0
  43. package/dist/analyzer/universal-analyzer.d.ts.map +1 -0
  44. package/dist/analyzer/universal-analyzer.js +155 -0
  45. package/dist/analyzer/universal-analyzer.js.map +1 -0
  46. package/dist/cache/quality-cache.d.ts +119 -0
  47. package/dist/cache/quality-cache.d.ts.map +1 -0
  48. package/dist/cache/quality-cache.js +130 -0
  49. package/dist/cache/quality-cache.js.map +1 -0
  50. package/dist/cache/sqlite-cache.d.ts +43 -0
  51. package/dist/cache/sqlite-cache.d.ts.map +1 -0
  52. package/dist/cache/sqlite-cache.js +346 -0
  53. package/dist/cache/sqlite-cache.js.map +1 -0
  54. package/dist/cli/query-repl.d.ts +37 -0
  55. package/dist/cli/query-repl.d.ts.map +1 -0
  56. package/dist/cli/query-repl.js +298 -0
  57. package/dist/cli/query-repl.js.map +1 -0
  58. package/dist/cli/repl-algorithms.d.ts +49 -0
  59. package/dist/cli/repl-algorithms.d.ts.map +1 -0
  60. package/dist/cli/repl-algorithms.js +147 -0
  61. package/dist/cli/repl-algorithms.js.map +1 -0
  62. package/dist/cli/setup-core.d.ts +38 -0
  63. package/dist/cli/setup-core.d.ts.map +1 -0
  64. package/dist/cli/setup-core.js +427 -0
  65. package/dist/cli/setup-core.js.map +1 -0
  66. package/dist/cli/setup.d.ts +25 -0
  67. package/dist/cli/setup.d.ts.map +1 -0
  68. package/dist/cli/setup.js +159 -0
  69. package/dist/cli/setup.js.map +1 -0
  70. package/dist/cli-entry.d.ts +19 -0
  71. package/dist/cli-entry.d.ts.map +1 -0
  72. package/dist/cli-entry.js +178 -0
  73. package/dist/cli-entry.js.map +1 -0
  74. package/dist/daemon/watch-mode.d.ts +41 -0
  75. package/dist/daemon/watch-mode.d.ts.map +1 -0
  76. package/dist/daemon/watch-mode.js +163 -0
  77. package/dist/daemon/watch-mode.js.map +1 -0
  78. package/dist/daemon.d.ts +24 -0
  79. package/dist/daemon.d.ts.map +1 -0
  80. package/dist/daemon.js +357 -0
  81. package/dist/daemon.js.map +1 -0
  82. package/dist/github/app.d.ts +34 -0
  83. package/dist/github/app.d.ts.map +1 -0
  84. package/dist/github/app.js +261 -0
  85. package/dist/github/app.js.map +1 -0
  86. package/dist/github/commenter.d.ts +67 -0
  87. package/dist/github/commenter.d.ts.map +1 -0
  88. package/dist/github/commenter.js +155 -0
  89. package/dist/github/commenter.js.map +1 -0
  90. package/dist/graph/dependency-graph.d.ts +28 -0
  91. package/dist/graph/dependency-graph.d.ts.map +1 -0
  92. package/dist/graph/dependency-graph.js +198 -0
  93. package/dist/graph/dependency-graph.js.map +1 -0
  94. package/dist/graph/global-graph.d.ts +65 -0
  95. package/dist/graph/global-graph.d.ts.map +1 -0
  96. package/dist/graph/global-graph.js +153 -0
  97. package/dist/graph/global-graph.js.map +1 -0
  98. package/dist/graph/graph-algorithms.d.ts +90 -0
  99. package/dist/graph/graph-algorithms.d.ts.map +1 -0
  100. package/dist/graph/graph-algorithms.js +180 -0
  101. package/dist/graph/graph-algorithms.js.map +1 -0
  102. package/dist/graph/graph-export.d.ts +68 -0
  103. package/dist/graph/graph-export.d.ts.map +1 -0
  104. package/dist/graph/graph-export.js +264 -0
  105. package/dist/graph/graph-export.js.map +1 -0
  106. package/dist/graph/graph-report.d.ts +34 -0
  107. package/dist/graph/graph-report.d.ts.map +1 -0
  108. package/dist/graph/graph-report.js +136 -0
  109. package/dist/graph/graph-report.js.map +1 -0
  110. package/dist/graph/graph-summary.d.ts +68 -0
  111. package/dist/graph/graph-summary.d.ts.map +1 -0
  112. package/dist/graph/graph-summary.js +213 -0
  113. package/dist/graph/graph-summary.js.map +1 -0
  114. package/dist/graph/graphify-ignore.d.ts +32 -0
  115. package/dist/graph/graphify-ignore.d.ts.map +1 -0
  116. package/dist/graph/graphify-ignore.js +124 -0
  117. package/dist/graph/graphify-ignore.js.map +1 -0
  118. package/dist/graph/question-suggester.d.ts +30 -0
  119. package/dist/graph/question-suggester.d.ts.map +1 -0
  120. package/dist/graph/question-suggester.js +113 -0
  121. package/dist/graph/question-suggester.js.map +1 -0
  122. package/dist/graph/relationship-extractor.d.ts +40 -0
  123. package/dist/graph/relationship-extractor.d.ts.map +1 -0
  124. package/dist/graph/relationship-extractor.js +254 -0
  125. package/dist/graph/relationship-extractor.js.map +1 -0
  126. package/dist/graph/relationship-types.d.ts +24 -0
  127. package/dist/graph/relationship-types.d.ts.map +1 -0
  128. package/dist/graph/relationship-types.js +21 -0
  129. package/dist/graph/relationship-types.js.map +1 -0
  130. package/dist/graph/surprising-connections.d.ts +39 -0
  131. package/dist/graph/surprising-connections.d.ts.map +1 -0
  132. package/dist/graph/surprising-connections.js +127 -0
  133. package/dist/graph/surprising-connections.js.map +1 -0
  134. package/dist/hook-pre-tool-use.d.ts +14 -0
  135. package/dist/hook-pre-tool-use.d.ts.map +1 -0
  136. package/dist/hook-pre-tool-use.js +167 -0
  137. package/dist/hook-pre-tool-use.js.map +1 -0
  138. package/dist/hook-receiver.d.ts +29 -0
  139. package/dist/hook-receiver.d.ts.map +1 -0
  140. package/dist/hook-receiver.js +327 -0
  141. package/dist/hook-receiver.js.map +1 -0
  142. package/dist/hooks/git-hooks.d.ts +30 -0
  143. package/dist/hooks/git-hooks.d.ts.map +1 -0
  144. package/dist/hooks/git-hooks.js +179 -0
  145. package/dist/hooks/git-hooks.js.map +1 -0
  146. package/dist/mcp/cache-preload.d.ts +29 -0
  147. package/dist/mcp/cache-preload.d.ts.map +1 -0
  148. package/dist/mcp/cache-preload.js +103 -0
  149. package/dist/mcp/cache-preload.js.map +1 -0
  150. package/dist/mcp/handlers/analysis.d.ts +4 -0
  151. package/dist/mcp/handlers/analysis.d.ts.map +1 -0
  152. package/dist/mcp/handlers/analysis.js +196 -0
  153. package/dist/mcp/handlers/analysis.js.map +1 -0
  154. package/dist/mcp/handlers/context.d.ts +25 -0
  155. package/dist/mcp/handlers/context.d.ts.map +1 -0
  156. package/dist/mcp/handlers/context.js +382 -0
  157. package/dist/mcp/handlers/context.js.map +1 -0
  158. package/dist/mcp/handlers/graph-intelligence.d.ts +26 -0
  159. package/dist/mcp/handlers/graph-intelligence.d.ts.map +1 -0
  160. package/dist/mcp/handlers/graph-intelligence.js +371 -0
  161. package/dist/mcp/handlers/graph-intelligence.js.map +1 -0
  162. package/dist/mcp/handlers/graph-query.d.ts +25 -0
  163. package/dist/mcp/handlers/graph-query.d.ts.map +1 -0
  164. package/dist/mcp/handlers/graph-query.js +410 -0
  165. package/dist/mcp/handlers/graph-query.js.map +1 -0
  166. package/dist/mcp/handlers/graph.d.ts +5 -0
  167. package/dist/mcp/handlers/graph.d.ts.map +1 -0
  168. package/dist/mcp/handlers/graph.js +283 -0
  169. package/dist/mcp/handlers/graph.js.map +1 -0
  170. package/dist/mcp/handlers/impact-format.d.ts +9 -0
  171. package/dist/mcp/handlers/impact-format.d.ts.map +1 -0
  172. package/dist/mcp/handlers/impact-format.js +189 -0
  173. package/dist/mcp/handlers/impact-format.js.map +1 -0
  174. package/dist/mcp/handlers/impact.d.ts +4 -0
  175. package/dist/mcp/handlers/impact.d.ts.map +1 -0
  176. package/dist/mcp/handlers/impact.js +139 -0
  177. package/dist/mcp/handlers/impact.js.map +1 -0
  178. package/dist/mcp/handlers/improvement.d.ts +4 -0
  179. package/dist/mcp/handlers/improvement.d.ts.map +1 -0
  180. package/dist/mcp/handlers/improvement.js +136 -0
  181. package/dist/mcp/handlers/improvement.js.map +1 -0
  182. package/dist/mcp/handlers/index.d.ts +14 -0
  183. package/dist/mcp/handlers/index.d.ts.map +1 -0
  184. package/dist/mcp/handlers/index.js +36 -0
  185. package/dist/mcp/handlers/index.js.map +1 -0
  186. package/dist/mcp/handlers/platform-installer.d.ts +10 -0
  187. package/dist/mcp/handlers/platform-installer.d.ts.map +1 -0
  188. package/dist/mcp/handlers/platform-installer.js +168 -0
  189. package/dist/mcp/handlers/platform-installer.js.map +1 -0
  190. package/dist/mcp/handlers/pr-review.d.ts +33 -0
  191. package/dist/mcp/handlers/pr-review.d.ts.map +1 -0
  192. package/dist/mcp/handlers/pr-review.js +170 -0
  193. package/dist/mcp/handlers/pr-review.js.map +1 -0
  194. package/dist/mcp/handlers/shared.d.ts +20 -0
  195. package/dist/mcp/handlers/shared.d.ts.map +1 -0
  196. package/dist/mcp/handlers/shared.js +27 -0
  197. package/dist/mcp/handlers/shared.js.map +1 -0
  198. package/dist/mcp/handlers/types.d.ts +46 -0
  199. package/dist/mcp/handlers/types.d.ts.map +1 -0
  200. package/dist/mcp/handlers/types.js +3 -0
  201. package/dist/mcp/handlers/types.js.map +1 -0
  202. package/dist/mcp/helpers.d.ts +36 -0
  203. package/dist/mcp/helpers.d.ts.map +1 -0
  204. package/dist/mcp/helpers.js +199 -0
  205. package/dist/mcp/helpers.js.map +1 -0
  206. package/dist/mcp/installer.d.ts +22 -0
  207. package/dist/mcp/installer.d.ts.map +1 -0
  208. package/dist/mcp/installer.js +341 -0
  209. package/dist/mcp/installer.js.map +1 -0
  210. package/dist/mcp/server.d.ts +111 -0
  211. package/dist/mcp/server.d.ts.map +1 -0
  212. package/dist/mcp/server.js +216 -0
  213. package/dist/mcp/server.js.map +1 -0
  214. package/dist/mcp/token-tracker.d.ts +47 -0
  215. package/dist/mcp/token-tracker.d.ts.map +1 -0
  216. package/dist/mcp/token-tracker.js +93 -0
  217. package/dist/mcp/token-tracker.js.map +1 -0
  218. package/dist/quality-loop/file-lock.d.ts +12 -0
  219. package/dist/quality-loop/file-lock.d.ts.map +1 -0
  220. package/dist/quality-loop/file-lock.js +38 -0
  221. package/dist/quality-loop/file-lock.js.map +1 -0
  222. package/dist/quality-loop/fix-worker.d.ts +44 -0
  223. package/dist/quality-loop/fix-worker.d.ts.map +1 -0
  224. package/dist/quality-loop/fix-worker.js +414 -0
  225. package/dist/quality-loop/fix-worker.js.map +1 -0
  226. package/dist/quality-loop/orchestrator.d.ts +137 -0
  227. package/dist/quality-loop/orchestrator.d.ts.map +1 -0
  228. package/dist/quality-loop/orchestrator.js +894 -0
  229. package/dist/quality-loop/orchestrator.js.map +1 -0
  230. package/dist/quality-loop/queue-manager.d.ts +45 -0
  231. package/dist/quality-loop/queue-manager.d.ts.map +1 -0
  232. package/dist/quality-loop/queue-manager.js +173 -0
  233. package/dist/quality-loop/queue-manager.js.map +1 -0
  234. package/dist/rating/rating-calculator.d.ts +15 -0
  235. package/dist/rating/rating-calculator.d.ts.map +1 -0
  236. package/dist/rating/rating-calculator.js +136 -0
  237. package/dist/rating/rating-calculator.js.map +1 -0
  238. package/dist/types/agent.d.ts +49 -0
  239. package/dist/types/agent.d.ts.map +1 -0
  240. package/dist/types/agent.js +7 -0
  241. package/dist/types/agent.js.map +1 -0
  242. package/dist/types.d.ts +156 -0
  243. package/dist/types.d.ts.map +1 -0
  244. package/dist/types.js +3 -0
  245. package/dist/types.js.map +1 -0
  246. package/dist/util/fix-text.d.ts +7 -0
  247. package/dist/util/fix-text.d.ts.map +1 -0
  248. package/dist/util/fix-text.js +13 -0
  249. package/dist/util/fix-text.js.map +1 -0
  250. package/dist/viz/graph-viz.d.ts +40 -0
  251. package/dist/viz/graph-viz.d.ts.map +1 -0
  252. package/dist/viz/graph-viz.js +332 -0
  253. package/dist/viz/graph-viz.js.map +1 -0
  254. package/dist/viz/viz-helpers.d.ts +13 -0
  255. package/dist/viz/viz-helpers.d.ts.map +1 -0
  256. package/dist/viz/viz-helpers.js +134 -0
  257. package/dist/viz/viz-helpers.js.map +1 -0
  258. package/dist/viz/viz-routes.d.ts +28 -0
  259. package/dist/viz/viz-routes.d.ts.map +1 -0
  260. package/dist/viz/viz-routes.js +333 -0
  261. package/dist/viz/viz-routes.js.map +1 -0
  262. package/dist/viz/viz-scanner.d.ts +20 -0
  263. package/dist/viz/viz-scanner.d.ts.map +1 -0
  264. package/dist/viz/viz-scanner.js +241 -0
  265. package/dist/viz/viz-scanner.js.map +1 -0
  266. package/dist/viz/viz-server.d.ts +38 -0
  267. package/dist/viz/viz-server.d.ts.map +1 -0
  268. package/dist/viz/viz-server.js +240 -0
  269. package/dist/viz/viz-server.js.map +1 -0
  270. package/package.json +89 -0
  271. package/scripts/postinstall.js +28 -0
  272. package/scripts/setup.sh +113 -0
@@ -0,0 +1,437 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TypeScriptAnalyzer = void 0;
37
+ const ts = __importStar(require("typescript"));
38
+ const path = __importStar(require("path"));
39
+ const fs = __importStar(require("fs"));
40
+ const sonar_eslint_runner_1 = require("./sonar-eslint-runner");
41
+ const RULE_ID_MAP = {
42
+ any_type: 'ts/no-any',
43
+ console_log: 'ts/no-console',
44
+ missing_key: 'react/jsx-key',
45
+ inline_handler: 'react/no-inline-handler',
46
+ hook_overload: 'react/hook-count',
47
+ duplicate_hooks: 'react/no-duplicate-hooks',
48
+ todo_placeholder: 'ts/no-todo',
49
+ tech_debt_marker: 'ts/tech-debt',
50
+ unimplemented_stub: 'ts/no-stub',
51
+ };
52
+ function spanOf(node, sf) {
53
+ const start = sf.getLineAndCharacterOfPosition(node.getStart());
54
+ const end = sf.getLineAndCharacterOfPosition(node.getEnd());
55
+ return {
56
+ line: start.line + 1, column: start.character + 1,
57
+ endLine: end.line + 1, endColumn: end.character + 1,
58
+ offset: node.getStart(), length: node.getEnd() - node.getStart(),
59
+ };
60
+ }
61
+ function lineSpan(line, column, length) {
62
+ return { line, column, endLine: line, endColumn: column + length };
63
+ }
64
+ class TypeScriptAnalyzer {
65
+ analyze(filePath) {
66
+ const content = fs.readFileSync(filePath, 'utf8');
67
+ const isReact = filePath.endsWith('.tsx') || filePath.endsWith('.jsx');
68
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
69
+ const dependencies = this.extractDependencies(sourceFile, filePath);
70
+ const metrics = this.calculateMetrics(sourceFile, content);
71
+ const violations = isReact
72
+ ? this.detectReactViolations(sourceFile)
73
+ : this.detectTypeScriptViolations(sourceFile);
74
+ violations.push(...this.detectTodoPlaceholders(content));
75
+ const seen = new Set(violations.map(v => `${v.line ?? 0}:${v.ruleId ?? v.type}`));
76
+ for (const v of (0, sonar_eslint_runner_1.runSonarJS)(filePath, content)) {
77
+ const key = `${v.line ?? 0}:${v.ruleId ?? v.type}`;
78
+ if (!seen.has(key)) {
79
+ violations.push(v);
80
+ seen.add(key);
81
+ }
82
+ }
83
+ return { dependencies, metrics, violations };
84
+ }
85
+ extractDependencies(sourceFile, filePath) {
86
+ const deps = [];
87
+ const dir = path.dirname(filePath);
88
+ const visit = (node) => {
89
+ if (ts.isImportDeclaration(node)) {
90
+ const specifier = node.moduleSpecifier.text;
91
+ const resolved = this.resolveModulePath(specifier, dir);
92
+ deps.push({
93
+ source: filePath,
94
+ target: resolved ?? specifier,
95
+ type: 'import',
96
+ weight: 1
97
+ });
98
+ }
99
+ if (ts.isCallExpression(node) &&
100
+ ts.isIdentifier(node.expression) &&
101
+ node.expression.text === 'require' &&
102
+ node.arguments[0] &&
103
+ ts.isStringLiteral(node.arguments[0])) {
104
+ const specifier = node.arguments[0].text;
105
+ const resolved = this.resolveModulePath(specifier, dir);
106
+ deps.push({
107
+ source: filePath,
108
+ target: resolved ?? specifier,
109
+ type: 'import',
110
+ weight: 1
111
+ });
112
+ }
113
+ ts.forEachChild(node, visit);
114
+ };
115
+ visit(sourceFile);
116
+ return deps;
117
+ }
118
+ resolveModulePath(specifier, fromDir) {
119
+ if (!specifier.startsWith('.'))
120
+ return null;
121
+ const base = path.resolve(fromDir, specifier);
122
+ const exts = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];
123
+ for (const ext of exts) {
124
+ if (fs.existsSync(base + ext))
125
+ return base + ext;
126
+ }
127
+ return base;
128
+ }
129
+ calculateMetrics(sourceFile, content) {
130
+ let methodCount = 0;
131
+ let classCount = 0;
132
+ let complexity = 1;
133
+ const visit = (node) => {
134
+ if (ts.isFunctionDeclaration(node) ||
135
+ ts.isArrowFunction(node) ||
136
+ ts.isMethodDeclaration(node) ||
137
+ ts.isFunctionExpression(node)) {
138
+ methodCount++;
139
+ }
140
+ if (ts.isClassDeclaration(node))
141
+ classCount++;
142
+ if (ts.isIfStatement(node) ||
143
+ ts.isWhileStatement(node) ||
144
+ ts.isForStatement(node) ||
145
+ ts.isForInStatement(node) ||
146
+ ts.isForOfStatement(node) ||
147
+ ts.isCaseClause(node) ||
148
+ ts.isConditionalExpression(node) ||
149
+ ts.isCatchClause(node)) {
150
+ complexity++;
151
+ }
152
+ ts.forEachChild(node, visit);
153
+ };
154
+ visit(sourceFile);
155
+ return {
156
+ linesOfCode: content.split('\n').length,
157
+ cyclomaticComplexity: complexity,
158
+ numberOfMethods: methodCount,
159
+ numberOfClasses: classCount,
160
+ importCount: sourceFile.statements.filter(ts.isImportDeclaration).length
161
+ };
162
+ }
163
+ detectReactViolations(sourceFile) {
164
+ const violations = [];
165
+ const components = this.extractComponents(sourceFile);
166
+ components.forEach(comp => {
167
+ if (comp.hooks.length > 7) {
168
+ violations.push({
169
+ type: 'hook_overload',
170
+ ruleId: RULE_ID_MAP.hook_overload,
171
+ severity: 'warning',
172
+ message: `${comp.name} has ${comp.hooks.length} hooks — split into custom hooks or smaller components`,
173
+ line: comp.line,
174
+ span: lineSpan(comp.line, 1, comp.name.length),
175
+ fix: 'Extract groups of related hooks into a custom hook'
176
+ });
177
+ }
178
+ const duplicateHooks = comp.hooks.filter((h, i, arr) => arr.indexOf(h) !== i && arr.lastIndexOf(h) === i);
179
+ if (duplicateHooks.length > 0) {
180
+ violations.push({
181
+ type: 'duplicate_hooks',
182
+ ruleId: RULE_ID_MAP.duplicate_hooks,
183
+ severity: 'warning',
184
+ message: `${comp.name} calls ${duplicateHooks.join(', ')} more than once`,
185
+ line: comp.line,
186
+ span: lineSpan(comp.line, 1, comp.name.length),
187
+ fix: 'Merge duplicate hook calls into a single call'
188
+ });
189
+ }
190
+ });
191
+ this.detectMissingListKeys(sourceFile, violations);
192
+ this.detectInlineHandlers(sourceFile, violations);
193
+ this.detectTypeScriptViolations(sourceFile).forEach(v => violations.push(v));
194
+ return violations;
195
+ }
196
+ extractComponents(sourceFile) {
197
+ const components = [];
198
+ const visit = (node) => {
199
+ // const Foo = () => ... or const Foo = function() ...
200
+ if (ts.isVariableStatement(node)) {
201
+ for (const decl of node.declarationList.declarations) {
202
+ if (ts.isIdentifier(decl.name) &&
203
+ this.startsWithUpperCase(decl.name.text) &&
204
+ decl.initializer &&
205
+ (ts.isArrowFunction(decl.initializer) ||
206
+ ts.isFunctionExpression(decl.initializer)) &&
207
+ this.nodeContainsJSX(decl.initializer)) {
208
+ const hooks = this.extractHooks(decl.initializer);
209
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
210
+ components.push({ name: decl.name.text, type: 'functional', hooks, line: pos.line + 1 });
211
+ }
212
+ }
213
+ }
214
+ // function Foo() { ... }
215
+ if (ts.isFunctionDeclaration(node) &&
216
+ node.name &&
217
+ this.startsWithUpperCase(node.name.text) &&
218
+ this.nodeContainsJSX(node)) {
219
+ const hooks = this.extractHooks(node);
220
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
221
+ components.push({ name: node.name.text, type: 'functional', hooks, line: pos.line + 1 });
222
+ }
223
+ // class Foo extends React.Component
224
+ if (ts.isClassDeclaration(node) && node.name) {
225
+ const extendsReact = node.heritageClauses?.some(h => h.types.some(t => t.expression.getText().includes('Component') ||
226
+ t.expression.getText().includes('PureComponent')));
227
+ if (extendsReact) {
228
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart());
229
+ components.push({ name: node.name.text, type: 'class', hooks: [], line: pos.line + 1 });
230
+ }
231
+ }
232
+ ts.forEachChild(node, visit);
233
+ };
234
+ visit(sourceFile);
235
+ return components;
236
+ }
237
+ extractHooks(fnNode) {
238
+ const hooks = [];
239
+ const visit = (node) => {
240
+ if (ts.isCallExpression(node) &&
241
+ ts.isIdentifier(node.expression) &&
242
+ /^use[A-Z]/.test(node.expression.text)) {
243
+ hooks.push(node.expression.text);
244
+ }
245
+ ts.forEachChild(node, visit);
246
+ };
247
+ visit(fnNode);
248
+ return hooks;
249
+ }
250
+ nodeContainsJSX(node) {
251
+ let found = false;
252
+ const visit = (n) => {
253
+ if (found)
254
+ return;
255
+ if (ts.isJsxElement(n) || ts.isJsxSelfClosingElement(n) || ts.isJsxFragment(n)) {
256
+ found = true;
257
+ return;
258
+ }
259
+ ts.forEachChild(n, visit);
260
+ };
261
+ visit(node);
262
+ return found;
263
+ }
264
+ detectMissingListKeys(sourceFile, violations) {
265
+ const visit = (node) => {
266
+ if (ts.isCallExpression(node) &&
267
+ ts.isPropertyAccessExpression(node.expression) &&
268
+ node.expression.name.text === 'map' &&
269
+ node.arguments.length > 0) {
270
+ const callback = node.arguments[0];
271
+ if (this.nodeContainsJSX(callback) && !this.callbackHasKeyProp(callback)) {
272
+ const sp = spanOf(node, sourceFile);
273
+ violations.push({
274
+ type: 'missing_key',
275
+ ruleId: RULE_ID_MAP.missing_key,
276
+ severity: 'error',
277
+ message: 'JSX elements inside .map() are missing the required "key" prop',
278
+ line: sp.line,
279
+ span: sp,
280
+ fix: 'Add a unique key prop to each JSX element returned from .map()'
281
+ });
282
+ }
283
+ }
284
+ ts.forEachChild(node, visit);
285
+ };
286
+ visit(sourceFile);
287
+ }
288
+ callbackHasKeyProp(node) {
289
+ let found = false;
290
+ const visit = (n) => {
291
+ if (found)
292
+ return;
293
+ if (ts.isJsxAttribute(n) && ts.isIdentifier(n.name) && n.name.text === 'key') {
294
+ found = true;
295
+ return;
296
+ }
297
+ ts.forEachChild(n, visit);
298
+ };
299
+ visit(node);
300
+ return found;
301
+ }
302
+ detectInlineHandlers(sourceFile, violations) {
303
+ const visit = (node) => {
304
+ if (ts.isJsxAttribute(node)) {
305
+ const name = node.name.getText();
306
+ if (name.startsWith('on') && node.initializer) {
307
+ const val = node.initializer;
308
+ if (ts.isJsxExpression(val) &&
309
+ val.expression &&
310
+ (ts.isArrowFunction(val.expression) || ts.isFunctionExpression(val.expression))) {
311
+ const sp = spanOf(node, sourceFile);
312
+ violations.push({
313
+ type: 'inline_handler',
314
+ ruleId: RULE_ID_MAP.inline_handler,
315
+ severity: 'info',
316
+ message: `Inline function for "${name}" creates a new reference on every render`,
317
+ line: sp.line,
318
+ span: sp,
319
+ fix: 'Extract to a useCallback or a named function outside JSX'
320
+ });
321
+ }
322
+ }
323
+ }
324
+ ts.forEachChild(node, visit);
325
+ };
326
+ visit(sourceFile);
327
+ }
328
+ detectTypeScriptViolations(sourceFile) {
329
+ const violations = [];
330
+ const visit = (node) => {
331
+ // Explicit `any` usage
332
+ if (node.kind === ts.SyntaxKind.AnyKeyword) {
333
+ const sp = spanOf(node, sourceFile);
334
+ const fix = {
335
+ description: 'Replace "any" with "unknown" and narrow the type at use sites',
336
+ replacement: 'unknown',
337
+ replaceSpan: sp,
338
+ confidence: 'deterministic',
339
+ };
340
+ violations.push({
341
+ type: 'any_type',
342
+ ruleId: RULE_ID_MAP.any_type,
343
+ severity: 'warning',
344
+ message: 'Avoid the "any" type — use explicit typing or "unknown"',
345
+ line: sp.line,
346
+ span: sp,
347
+ fix,
348
+ });
349
+ }
350
+ // console.log usage
351
+ if (ts.isCallExpression(node) &&
352
+ ts.isPropertyAccessExpression(node.expression) &&
353
+ ts.isIdentifier(node.expression.expression) &&
354
+ node.expression.expression.text === 'console' &&
355
+ node.expression.name.text === 'log') {
356
+ const sp = spanOf(node.expression, sourceFile);
357
+ const fix = {
358
+ description: 'Replace console.log with a structured logger call',
359
+ replacement: 'logger.debug',
360
+ replaceSpan: sp,
361
+ confidence: 'deterministic',
362
+ };
363
+ violations.push({
364
+ type: 'console_log',
365
+ ruleId: RULE_ID_MAP.console_log,
366
+ severity: 'info',
367
+ message: 'console.log left in code — remove before merging',
368
+ line: sp.line,
369
+ span: sp,
370
+ fix,
371
+ });
372
+ }
373
+ ts.forEachChild(node, visit);
374
+ };
375
+ visit(sourceFile);
376
+ return violations;
377
+ }
378
+ startsWithUpperCase(name) {
379
+ return name.length > 0 && name[0] >= 'A' && name[0] <= 'Z';
380
+ }
381
+ /**
382
+ * Scans raw source text for TODO/FIXME/PLACEHOLDER markers and unimplemented
383
+ * throw stubs. These represent incomplete work that should not pass quality gates.
384
+ */
385
+ detectTodoPlaceholders(content) {
386
+ const violations = [];
387
+ const lines = content.split('\n');
388
+ const incompletePattern = /(?:\/\/|\/\*)\s*(TODO|FIXME|PLACEHOLDER|STUB)\b/i;
389
+ const debtPattern = /(?:\/\/|\/\*)\s*(HACK|WORKAROUND|KLUDGE|XXX)\b/i;
390
+ const notImplPattern = /throw\s+new\s+(?:Error|TypeError|RangeError)\s*\(\s*['"`](?:not\s+implemented|todo|placeholder|stub)/i;
391
+ for (let i = 0; i < lines.length; i++) {
392
+ const line = lines[i];
393
+ const lineNum = i + 1;
394
+ const incompleteMatch = incompletePattern.exec(line);
395
+ if (incompleteMatch) {
396
+ violations.push({
397
+ type: 'todo_placeholder',
398
+ ruleId: RULE_ID_MAP.todo_placeholder,
399
+ severity: 'warning',
400
+ message: `${incompleteMatch[1].toUpperCase()} marker at line ${lineNum} — resolve before merging`,
401
+ line: lineNum,
402
+ span: lineSpan(lineNum, (incompleteMatch.index ?? 0) + 1, incompleteMatch[0].length),
403
+ fix: 'Replace with the actual implementation'
404
+ });
405
+ continue;
406
+ }
407
+ const debtMatch = debtPattern.exec(line);
408
+ if (debtMatch) {
409
+ violations.push({
410
+ type: 'tech_debt_marker',
411
+ ruleId: RULE_ID_MAP.tech_debt_marker,
412
+ severity: 'info',
413
+ message: `${debtMatch[1].toUpperCase()} marker at line ${lineNum} — track in your issue tracker`,
414
+ line: lineNum,
415
+ span: lineSpan(lineNum, (debtMatch.index ?? 0) + 1, debtMatch[0].length),
416
+ fix: 'Create a tracking issue and replace with a proper solution'
417
+ });
418
+ continue;
419
+ }
420
+ const stubMatch = notImplPattern.exec(line);
421
+ if (stubMatch) {
422
+ violations.push({
423
+ type: 'unimplemented_stub',
424
+ ruleId: RULE_ID_MAP.unimplemented_stub,
425
+ severity: 'error',
426
+ message: `Unimplemented stub at line ${lineNum} — will throw at runtime`,
427
+ line: lineNum,
428
+ span: lineSpan(lineNum, (stubMatch.index ?? 0) + 1, stubMatch[0].length),
429
+ fix: 'Implement the required functionality'
430
+ });
431
+ }
432
+ }
433
+ return violations;
434
+ }
435
+ }
436
+ exports.TypeScriptAnalyzer = TypeScriptAnalyzer;
437
+ //# sourceMappingURL=typescript-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/typescript-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FileAnalysis } from '../types';
2
+ export declare class UniversalAnalyzer {
3
+ private tsAnalyzer;
4
+ private csAnalyzer;
5
+ private coverageAnalyzer;
6
+ private ratingCalc;
7
+ isSupportedFile(filePath: string): boolean;
8
+ analyze(filePath: string): Promise<FileAnalysis | null>;
9
+ }
10
+ //# sourceMappingURL=universal-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/universal-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAuB,MAAM,UAAU,CAAC;AA6C7D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,UAAU,CAA0B;IAE5C,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CA2E9D"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.UniversalAnalyzer = void 0;
37
+ const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs"));
39
+ const crypto = __importStar(require("crypto"));
40
+ const typescript_analyzer_1 = require("./typescript-analyzer");
41
+ const csharp_analyzer_1 = require("./csharp-analyzer");
42
+ const coverage_analyzer_1 = require("./coverage-analyzer");
43
+ const rating_calculator_1 = require("../rating/rating-calculator");
44
+ const ANALYZER_VERSION = '2.0';
45
+ const SEVERITY_WEIGHT = {
46
+ error: 1.5,
47
+ warning: 0.5,
48
+ info: 0.1,
49
+ };
50
+ function priorityFor(v) {
51
+ const weight = SEVERITY_WEIGHT[v.severity] ?? 0.1;
52
+ const isDeterministic = typeof v.fix === 'object' && v.fix?.confidence === 'deterministic';
53
+ return weight / (isDeterministic ? 1 : 3);
54
+ }
55
+ const SUPPORTED_EXTENSIONS = {
56
+ '.ts': 'typescript',
57
+ '.tsx': 'tsx',
58
+ '.jsx': 'jsx',
59
+ '.js': 'typescript',
60
+ '.cs': 'csharp'
61
+ };
62
+ function enrichCodeSnippets(violations, filePath) {
63
+ const withSpans = violations.some(v => v.span);
64
+ if (!withSpans)
65
+ return;
66
+ let lines;
67
+ try {
68
+ lines = fs.readFileSync(filePath, 'utf8').split('\n');
69
+ }
70
+ catch {
71
+ return;
72
+ }
73
+ for (const v of violations) {
74
+ if (!v.span || v.codeSnippet)
75
+ continue;
76
+ const start = Math.max(0, v.span.line - 2);
77
+ const end = Math.min(lines.length, v.span.endLine + 1);
78
+ v.codeSnippet = lines.slice(start, end).join('\n');
79
+ }
80
+ }
81
+ class UniversalAnalyzer {
82
+ tsAnalyzer = new typescript_analyzer_1.TypeScriptAnalyzer();
83
+ csAnalyzer = new csharp_analyzer_1.CSharpAnalyzer();
84
+ coverageAnalyzer = new coverage_analyzer_1.CoverageAnalyzer();
85
+ ratingCalc = new rating_calculator_1.RatingCalculator();
86
+ isSupportedFile(filePath) {
87
+ return path.extname(filePath) in SUPPORTED_EXTENSIONS;
88
+ }
89
+ async analyze(filePath) {
90
+ const ext = path.extname(filePath);
91
+ const language = SUPPORTED_EXTENSIONS[ext];
92
+ if (!language)
93
+ return null;
94
+ try {
95
+ const result = language === 'csharp'
96
+ ? this.csAnalyzer.analyze(filePath)
97
+ : this.tsAnalyzer.analyze(filePath);
98
+ // Check test coverage and merge violations
99
+ const coverageResult = await this.coverageAnalyzer.checkCoverage(filePath);
100
+ if (coverageResult) {
101
+ result.violations.push(...coverageResult.violations);
102
+ // Only set coveragePercent when it was actually measured — undefined means
103
+ // no test file exists, so the metric-based coverage penalty is skipped and
104
+ // the violation-based penalty (no_test_file / hollow_test_file) applies instead.
105
+ if (coverageResult.coveragePercent !== undefined) {
106
+ result.metrics.coveragePercent = coverageResult.coveragePercent;
107
+ }
108
+ }
109
+ enrichCodeSnippets(result.violations, filePath);
110
+ for (const v of result.violations) {
111
+ v.priorityScore = priorityFor(v);
112
+ }
113
+ result.violations.sort((a, b) => (b.priorityScore ?? 0) - (a.priorityScore ?? 0));
114
+ const { rating, breakdown } = this.ratingCalc.calculateWithBreakdown(result.violations, result.metrics, result.dependencies);
115
+ let fileHash;
116
+ try {
117
+ fileHash = crypto.createHash('sha1').update(fs.readFileSync(filePath)).digest('hex');
118
+ }
119
+ catch {
120
+ fileHash = undefined;
121
+ }
122
+ const analysis = {
123
+ path: filePath,
124
+ language,
125
+ dependencies: result.dependencies,
126
+ metrics: result.metrics,
127
+ violations: result.violations,
128
+ rating,
129
+ analyzedAt: Date.now(),
130
+ ratingBreakdown: breakdown,
131
+ fileHash,
132
+ analyzerVersion: ANALYZER_VERSION,
133
+ };
134
+ // Attach defined types for C# files (used for cross-file dependency resolution)
135
+ if (language === 'csharp' && 'definedTypes' in result) {
136
+ analysis.definedTypes = result.definedTypes;
137
+ }
138
+ return analysis;
139
+ }
140
+ catch (err) {
141
+ const message = err instanceof Error ? err.message : String(err);
142
+ return {
143
+ path: filePath,
144
+ language,
145
+ dependencies: [],
146
+ metrics: { linesOfCode: 0, cyclomaticComplexity: 0, numberOfMethods: 0, numberOfClasses: 0, importCount: 0 },
147
+ violations: [{ type: 'analysis_error', severity: 'error', message: `Analysis failed: ${message}` }],
148
+ rating: 5,
149
+ analyzedAt: Date.now()
150
+ };
151
+ }
152
+ }
153
+ }
154
+ exports.UniversalAnalyzer = UniversalAnalyzer;
155
+ //# sourceMappingURL=universal-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/universal-analyzer.ts"],"names":[],"mappings":"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"}