@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,28 @@
1
+ import { Dependency, Metrics, Violation } from '../types';
2
+ export interface CSharpAnalysisResult {
3
+ dependencies: Dependency[];
4
+ metrics: Metrics;
5
+ violations: Violation[];
6
+ definedTypes: string[];
7
+ }
8
+ export declare class CSharpAnalyzer {
9
+ private dotnetAvailable;
10
+ analyze(filePath: string): CSharpAnalysisResult;
11
+ private isDotNetAvailable;
12
+ private analyzeWithRoslyn;
13
+ private analyzeWithText;
14
+ private extractUsings;
15
+ /** Extract class/interface/struct/enum/record names defined in this file */
16
+ private extractDefinedTypes;
17
+ /** Extract type names referenced (used) in this file — for cross-file edges */
18
+ private extractTypeReferences;
19
+ private calculateMetrics;
20
+ private detectViolations;
21
+ private detectTodoPlaceholders;
22
+ private detectGodClass;
23
+ private detectLongMethods;
24
+ private detectTightCoupling;
25
+ private detectMagicNumbers;
26
+ private detectEmptyCatch;
27
+ }
28
+ //# sourceMappingURL=csharp-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csharp-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/csharp-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAQ,SAAS,EAAE,MAAM,UAAU,CAAC;AA+BhE,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAAwB;IAE/C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IAY/C,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,aAAa;IA4BrB,4EAA4E;IAC5E,OAAO,CAAC,mBAAmB;IAW3B,+EAA+E;IAC/E,OAAO,CAAC,qBAAqB;IAiF7B,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,sBAAsB;IAoD9B,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,iBAAiB;IA6CzB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,gBAAgB;CAiBzB"}
@@ -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.CSharpAnalyzer = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process_1 = require("child_process");
40
+ const RULE_ID_MAP = {
41
+ god_class: 'cs/god-class',
42
+ long_method: 'cs/long-method',
43
+ tight_coupling: 'cs/tight-coupling',
44
+ magic_number: 'cs/magic-number',
45
+ empty_catch: 'cs/empty-catch',
46
+ todo_placeholder: 'cs/no-todo',
47
+ tech_debt_marker: 'cs/tech-debt',
48
+ unimplemented_stub: 'cs/no-stub',
49
+ };
50
+ function offsetToSpan(content, offset, length) {
51
+ const before = content.substring(0, offset);
52
+ const linesBefore = before.split('\n');
53
+ const line = linesBefore.length;
54
+ const column = linesBefore[linesBefore.length - 1].length + 1;
55
+ const matchText = content.substring(offset, offset + length);
56
+ const matchLines = matchText.split('\n');
57
+ const endLine = line + matchLines.length - 1;
58
+ const endColumn = matchLines.length === 1
59
+ ? column + length
60
+ : matchLines[matchLines.length - 1].length + 1;
61
+ return { line, column, endLine, endColumn, offset, length };
62
+ }
63
+ function lineSpan(line, column, length) {
64
+ return { line, column, endLine: line, endColumn: column + length };
65
+ }
66
+ class CSharpAnalyzer {
67
+ dotnetAvailable = null;
68
+ analyze(filePath) {
69
+ // Try Roslyn CLI analyzer first (if dotnet is available)
70
+ if (this.isDotNetAvailable()) {
71
+ try {
72
+ return this.analyzeWithRoslyn(filePath);
73
+ }
74
+ catch {
75
+ // Fall through to text-based analysis
76
+ }
77
+ }
78
+ return this.analyzeWithText(filePath);
79
+ }
80
+ isDotNetAvailable() {
81
+ if (this.dotnetAvailable !== null)
82
+ return this.dotnetAvailable;
83
+ try {
84
+ (0, child_process_1.execSync)('dotnet --version', { stdio: 'ignore' });
85
+ this.dotnetAvailable = true;
86
+ }
87
+ catch {
88
+ this.dotnetAvailable = false;
89
+ }
90
+ return this.dotnetAvailable;
91
+ }
92
+ analyzeWithRoslyn(filePath) {
93
+ const dllPath = path.join(__dirname, '../../CSharpAnalyzer/bin/Release/net8.0/CSharpAnalyzer.dll');
94
+ if (!fs.existsSync(dllPath)) {
95
+ throw new Error('Roslyn analyzer not built — run: dotnet build CSharpAnalyzer -c Release');
96
+ }
97
+ const result = (0, child_process_1.execSync)(`dotnet "${dllPath}" --file "${filePath}"`, {
98
+ encoding: 'utf8',
99
+ timeout: 10000
100
+ });
101
+ return JSON.parse(result);
102
+ }
103
+ analyzeWithText(filePath) {
104
+ const content = fs.readFileSync(filePath, 'utf8');
105
+ const lines = content.split('\n');
106
+ return {
107
+ dependencies: this.extractUsings(content, filePath),
108
+ metrics: this.calculateMetrics(content, lines),
109
+ violations: this.detectViolations(content, lines),
110
+ definedTypes: this.extractDefinedTypes(content),
111
+ };
112
+ }
113
+ extractUsings(content, filePath) {
114
+ const deps = [];
115
+ const usingRegex = /^using\s+([\w.]+);/gm;
116
+ let match;
117
+ while ((match = usingRegex.exec(content)) !== null) {
118
+ deps.push({
119
+ source: filePath,
120
+ target: match[1],
121
+ type: 'import',
122
+ weight: 1
123
+ });
124
+ }
125
+ // Extract type references: base classes, interfaces, field types, parameter types, generic args
126
+ const typeRefs = this.extractTypeReferences(content);
127
+ for (const typeName of typeRefs) {
128
+ deps.push({
129
+ source: filePath,
130
+ target: `__type__:${typeName}`,
131
+ type: 'usage',
132
+ weight: 1
133
+ });
134
+ }
135
+ return deps;
136
+ }
137
+ /** Extract class/interface/struct/enum/record names defined in this file */
138
+ extractDefinedTypes(content) {
139
+ const types = [];
140
+ // Match: [access] [partial] class/interface/struct/enum/record Name<T>
141
+ const typeDefRegex = /\b(?:public|internal|private|protected)?\s*(?:static\s+)?(?:partial\s+)?(?:abstract\s+)?(?:sealed\s+)?(?:class|interface|struct|enum|record)\s+(\w+)/g;
142
+ let match;
143
+ while ((match = typeDefRegex.exec(content)) !== null) {
144
+ types.push(match[1]);
145
+ }
146
+ return [...new Set(types)];
147
+ }
148
+ /** Extract type names referenced (used) in this file — for cross-file edges */
149
+ extractTypeReferences(content) {
150
+ const refs = new Set();
151
+ // Strip comments and strings for cleaner matching
152
+ const cleaned = content
153
+ .replace(/\/\/.*$/gm, '')
154
+ .replace(/\/\*[\s\S]*?\*\//g, '')
155
+ .replace(/"(?:[^"\\]|\\.)*"/g, '""')
156
+ .replace(/'(?:[^'\\]|\\.)*'/g, "''");
157
+ // 1. Inheritance / interface implementation: class Foo : Bar, IBaz
158
+ const inheritRegex = /\b(?:class|struct|record)\s+\w+(?:<[^>]+>)?\s*:\s*([^{]+)/g;
159
+ let match;
160
+ while ((match = inheritRegex.exec(cleaned)) !== null) {
161
+ const bases = match[1].split(',').map(s => s.trim().replace(/<.*>$/, ''));
162
+ for (const base of bases) {
163
+ const name = base.split('.').pop()?.replace(/\s+where\s+.*/, '').trim();
164
+ if (name && /^[A-Z]\w{1,}$/.test(name))
165
+ refs.add(name);
166
+ }
167
+ }
168
+ // 2. Field / property / variable declarations: TypeName varName
169
+ const fieldRegex = /\b(?:public|private|protected|internal|static|readonly|virtual|override|abstract|async)\s+(?:static\s+|readonly\s+|virtual\s+|override\s+|abstract\s+|async\s+)*([A-Z]\w+(?:<[^>]+>)?)\s+\w+\s*[{;=,)]/g;
170
+ while ((match = fieldRegex.exec(cleaned)) !== null) {
171
+ const typeName = match[1].replace(/<.*>$/, '').trim();
172
+ if (typeName && /^[A-Z]\w{1,}$/.test(typeName) && !isBuiltinType(typeName)) {
173
+ refs.add(typeName);
174
+ }
175
+ // Also capture generic type args
176
+ const generics = match[1].match(/<(.+)>/);
177
+ if (generics) {
178
+ for (const g of generics[1].split(',')) {
179
+ const gName = g.trim().replace(/<.*>$/, '');
180
+ if (/^[A-Z]\w{1,}$/.test(gName) && !isBuiltinType(gName))
181
+ refs.add(gName);
182
+ }
183
+ }
184
+ }
185
+ // 3. Method parameters and return types
186
+ const methodSigRegex = /\b(?:public|private|protected|internal|static|virtual|override|abstract|async)\s+(?:static\s+|virtual\s+|override\s+|abstract\s+|async\s+)*([A-Z]\w+(?:<[^>]+>)?)\s+\w+\s*\(([^)]*)\)/g;
187
+ while ((match = methodSigRegex.exec(cleaned)) !== null) {
188
+ // Return type
189
+ const retType = match[1].replace(/<.*>$/, '').trim();
190
+ if (/^[A-Z]\w{1,}$/.test(retType) && !isBuiltinType(retType))
191
+ refs.add(retType);
192
+ // Parameter types
193
+ const params = match[2];
194
+ if (params) {
195
+ const paramTypeRegex = /([A-Z]\w+(?:<[^>]+>)?)\s+\w+/g;
196
+ let pm;
197
+ while ((pm = paramTypeRegex.exec(params)) !== null) {
198
+ const pType = pm[1].replace(/<.*>$/, '').trim();
199
+ if (/^[A-Z]\w{1,}$/.test(pType) && !isBuiltinType(pType))
200
+ refs.add(pType);
201
+ }
202
+ }
203
+ }
204
+ // 4. new TypeName(...)
205
+ const newRegex = /new\s+([A-Z]\w+)\s*[(<{]/g;
206
+ while ((match = newRegex.exec(cleaned)) !== null) {
207
+ if (!isBuiltinType(match[1]))
208
+ refs.add(match[1]);
209
+ }
210
+ // 5. typeof(TypeName), nameof(TypeName), as TypeName, is TypeName
211
+ const castRegex = /\b(?:typeof|nameof|as|is)\s*\(?\s*([A-Z]\w+)/g;
212
+ while ((match = castRegex.exec(cleaned)) !== null) {
213
+ if (!isBuiltinType(match[1]))
214
+ refs.add(match[1]);
215
+ }
216
+ // 6. Attribute usage: [AttributeName] or [AttributeName(...)]
217
+ const attrRegex = /\[\s*([A-Z]\w+)\s*(?:\(|])/g;
218
+ while ((match = attrRegex.exec(cleaned)) !== null) {
219
+ if (!isBuiltinType(match[1]))
220
+ refs.add(match[1]);
221
+ }
222
+ // Remove types defined in this same file
223
+ const definedHere = this.extractDefinedTypes(content);
224
+ for (const d of definedHere)
225
+ refs.delete(d);
226
+ return [...refs];
227
+ }
228
+ calculateMetrics(content, lines) {
229
+ const methodRegex = /\b(public|private|protected|internal|static)\s+[\w<>\[\]?]+\s+\w+\s*\(/g;
230
+ const classRegex = /\b(class|interface|struct|record)\s+\w+/g;
231
+ const complexityRegex = /\b(if|else if|while|for|foreach|case|catch|\?)\b/g;
232
+ const methods = (content.match(methodRegex) || []).length;
233
+ const classes = (content.match(classRegex) || []).length;
234
+ const complexity = 1 + (content.match(complexityRegex) || []).length;
235
+ const usingCount = (content.match(/^using\s+/gm) || []).length;
236
+ return {
237
+ linesOfCode: lines.length,
238
+ cyclomaticComplexity: complexity,
239
+ numberOfMethods: methods,
240
+ numberOfClasses: classes,
241
+ importCount: usingCount
242
+ };
243
+ }
244
+ detectViolations(content, lines) {
245
+ const violations = [];
246
+ this.detectGodClass(content, lines, violations);
247
+ this.detectLongMethods(content, lines, violations);
248
+ this.detectTightCoupling(content, lines, violations);
249
+ this.detectMagicNumbers(content, lines, violations);
250
+ this.detectEmptyCatch(content, lines, violations);
251
+ this.detectTodoPlaceholders(lines, violations);
252
+ return violations;
253
+ }
254
+ detectTodoPlaceholders(lines, violations) {
255
+ const incompletePattern = /(?:\/\/|\/\*)\s*(TODO|FIXME|PLACEHOLDER|STUB)\b/i;
256
+ const debtPattern = /(?:\/\/|\/\*)\s*(HACK|WORKAROUND|KLUDGE|XXX)\b/i;
257
+ const notImplPattern = /throw\s+new\s+NotImplementedException\s*\(/;
258
+ for (let i = 0; i < lines.length; i++) {
259
+ const line = lines[i];
260
+ const lineNum = i + 1;
261
+ const incompleteMatch = incompletePattern.exec(line);
262
+ if (incompleteMatch) {
263
+ violations.push({
264
+ type: 'todo_placeholder',
265
+ ruleId: RULE_ID_MAP.todo_placeholder,
266
+ severity: 'warning',
267
+ message: `${incompleteMatch[1].toUpperCase()} marker at line ${lineNum} — resolve before merging`,
268
+ line: lineNum,
269
+ span: lineSpan(lineNum, (incompleteMatch.index ?? 0) + 1, incompleteMatch[0].length),
270
+ fix: 'Replace with the actual implementation'
271
+ });
272
+ continue;
273
+ }
274
+ const debtMatch = debtPattern.exec(line);
275
+ if (debtMatch) {
276
+ violations.push({
277
+ type: 'tech_debt_marker',
278
+ ruleId: RULE_ID_MAP.tech_debt_marker,
279
+ severity: 'info',
280
+ message: `${debtMatch[1].toUpperCase()} marker at line ${lineNum} — track in your issue tracker`,
281
+ line: lineNum,
282
+ span: lineSpan(lineNum, (debtMatch.index ?? 0) + 1, debtMatch[0].length),
283
+ fix: 'Create a tracking issue and replace with a proper solution'
284
+ });
285
+ continue;
286
+ }
287
+ const stubMatch = notImplPattern.exec(line);
288
+ if (stubMatch) {
289
+ violations.push({
290
+ type: 'unimplemented_stub',
291
+ ruleId: RULE_ID_MAP.unimplemented_stub,
292
+ severity: 'error',
293
+ message: `Unimplemented stub at line ${lineNum} — NotImplementedException will throw at runtime`,
294
+ line: lineNum,
295
+ span: lineSpan(lineNum, (stubMatch.index ?? 0) + 1, stubMatch[0].length),
296
+ fix: 'Implement the required functionality'
297
+ });
298
+ }
299
+ }
300
+ }
301
+ detectGodClass(content, lines, violations) {
302
+ const methodMatches = content.match(/\b(public|private|protected)\s+[\w<>\[\]?]+\s+\w+\s*\(/g) || [];
303
+ if (methodMatches.length > 20) {
304
+ // Anchor at the first class/struct/record/interface declaration; fall back to file start.
305
+ const declMatch = /\b(class|struct|record|interface)\s+\w+/.exec(content);
306
+ const span = declMatch
307
+ ? offsetToSpan(content, declMatch.index, declMatch[0].length)
308
+ : lineSpan(1, 1, 1);
309
+ violations.push({
310
+ type: 'god_class',
311
+ ruleId: RULE_ID_MAP.god_class,
312
+ severity: 'warning',
313
+ message: `Class has ${methodMatches.length} methods — consider splitting responsibilities (Single Responsibility Principle)`,
314
+ line: span.line,
315
+ span,
316
+ fix: 'Extract related methods into separate focused classes (structural — review whole class)'
317
+ });
318
+ }
319
+ }
320
+ detectLongMethods(content, lines, violations) {
321
+ // Find method boundaries using brace counting
322
+ let methodStart = -1;
323
+ let braceDepth = 0;
324
+ let inMethod = false;
325
+ for (let i = 0; i < lines.length; i++) {
326
+ const line = lines[i];
327
+ const methodMatch = line.match(/\b(public|private|protected|internal)\s+[\w<>\[\]?]+\s+\w+\s*\(/);
328
+ if (methodMatch && !inMethod) {
329
+ methodStart = i;
330
+ inMethod = true;
331
+ braceDepth = 0;
332
+ }
333
+ if (inMethod) {
334
+ braceDepth += (line.match(/{/g) || []).length;
335
+ braceDepth -= (line.match(/}/g) || []).length;
336
+ if (braceDepth === 0 && i > methodStart) {
337
+ const methodLength = i - methodStart;
338
+ if (methodLength > 50) {
339
+ const startCol = lines[methodStart].search(/\S/) + 1 || 1;
340
+ violations.push({
341
+ type: 'long_method',
342
+ ruleId: RULE_ID_MAP.long_method,
343
+ severity: 'warning',
344
+ message: `Method starting at line ${methodStart + 1} is ${methodLength} lines long — extract logic into smaller methods`,
345
+ line: methodStart + 1,
346
+ span: {
347
+ line: methodStart + 1,
348
+ column: startCol,
349
+ endLine: i + 1,
350
+ endColumn: (lines[i]?.length ?? 0) + 1,
351
+ },
352
+ fix: 'Extract cohesive logic blocks into private helper methods'
353
+ });
354
+ }
355
+ inMethod = false;
356
+ }
357
+ }
358
+ }
359
+ }
360
+ detectTightCoupling(content, lines, violations) {
361
+ // Detect constructors with too many parameters (indicates tight coupling)
362
+ const ctorRegex = /public\s+\w+\s*\(([^)]+)\)/g;
363
+ let match;
364
+ while ((match = ctorRegex.exec(content)) !== null) {
365
+ const params = match[1].split(',').filter(p => p.trim().length > 0);
366
+ if (params.length > 5) {
367
+ const span = offsetToSpan(content, match.index, match[0].length);
368
+ violations.push({
369
+ type: 'tight_coupling',
370
+ ruleId: RULE_ID_MAP.tight_coupling,
371
+ severity: 'warning',
372
+ message: `Constructor has ${params.length} parameters — consider using a configuration object or DI container`,
373
+ line: span.line,
374
+ span,
375
+ fix: 'Group related parameters into a settings/options class or use the Builder pattern'
376
+ });
377
+ }
378
+ }
379
+ }
380
+ detectMagicNumbers(content, lines, violations) {
381
+ const magicNumberRegex = /[^.a-zA-Z_"'](\b(?!0\b|1\b)\d{2,}\b)/g;
382
+ let match;
383
+ while ((match = magicNumberRegex.exec(content)) !== null) {
384
+ // Magic number capture is match[1]; locate it relative to match.index.
385
+ const numberOffset = match.index + match[0].indexOf(match[1]);
386
+ const span = offsetToSpan(content, numberOffset, match[1].length);
387
+ violations.push({
388
+ type: 'magic_number',
389
+ ruleId: RULE_ID_MAP.magic_number,
390
+ severity: 'info',
391
+ message: `Magic number ${match[1]} — extract to a named constant`,
392
+ line: span.line,
393
+ span,
394
+ fix: 'Replace with a descriptive constant: const int MaxRetries = ...'
395
+ });
396
+ }
397
+ }
398
+ detectEmptyCatch(content, lines, violations) {
399
+ const emptyCatchRegex = /catch\s*\([^)]*\)\s*\{\s*\}/g;
400
+ let match;
401
+ while ((match = emptyCatchRegex.exec(content)) !== null) {
402
+ const span = offsetToSpan(content, match.index, match[0].length);
403
+ violations.push({
404
+ type: 'empty_catch',
405
+ ruleId: RULE_ID_MAP.empty_catch,
406
+ severity: 'error',
407
+ message: 'Empty catch block silently swallows exceptions',
408
+ line: span.line,
409
+ span,
410
+ fix: 'At minimum, log the exception; consider rethrowing or handling appropriately'
411
+ });
412
+ }
413
+ }
414
+ }
415
+ exports.CSharpAnalyzer = CSharpAnalyzer;
416
+ /** Common C# / .NET built-in type names to exclude from dependency detection */
417
+ function isBuiltinType(name) {
418
+ const builtins = new Set([
419
+ 'String', 'Int32', 'Int64', 'Boolean', 'Byte', 'Char', 'Decimal', 'Double', 'Float',
420
+ 'Single', 'Object', 'Void', 'DateTime', 'DateTimeOffset', 'TimeSpan', 'Guid',
421
+ 'Task', 'ValueTask', 'List', 'Dictionary', 'HashSet', 'IEnumerable', 'IList',
422
+ 'IDictionary', 'ICollection', 'IQueryable', 'ILogger', 'IConfiguration',
423
+ 'CancellationToken', 'Exception', 'ArgumentException', 'ArgumentNullException',
424
+ 'InvalidOperationException', 'NotImplementedException', 'NotSupportedException',
425
+ 'Action', 'Func', 'Predicate', 'EventHandler', 'Nullable', 'Lazy',
426
+ 'Console', 'Math', 'Convert', 'Enumerable', 'StringBuilder', 'Regex',
427
+ 'File', 'Path', 'Directory', 'Stream', 'StreamReader', 'StreamWriter',
428
+ 'HttpClient', 'HttpContext', 'HttpRequest', 'HttpResponse',
429
+ 'JsonSerializer', 'JsonConvert', 'JObject', 'JArray', 'JToken',
430
+ 'IServiceProvider', 'IServiceCollection', 'IHostEnvironment', 'IWebHostEnvironment',
431
+ 'Assert', 'Fact', 'Theory', 'Test', 'TestFixture', 'SetUp', 'TearDown',
432
+ 'Migration', 'MigrationBuilder', 'OperationBuilder', 'ColumnBuilder', 'CreateTableBuilder',
433
+ 'DbContext', 'DbSet', 'ModelBuilder', 'EntityTypeBuilder',
434
+ ]);
435
+ return builtins.has(name);
436
+ }
437
+ //# sourceMappingURL=csharp-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csharp-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/csharp-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { FileAnalysis, PatternReport } from '../types';
2
+ export declare class PatternDetector {
3
+ detect(analyses: FileAnalysis[]): PatternReport[];
4
+ }
5
+ //# sourceMappingURL=pattern-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-detector.d.ts","sourceRoot":"","sources":["../../src/analyzer/pattern-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA4BvD,qBAAa,eAAe;IAC1B,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;CAwDlD"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PatternDetector = void 0;
4
+ const MODULE_SUGGESTIONS = {
5
+ god_class: 'Audit all large classes; schedule a refactoring sprint to apply Extract Class.',
6
+ hook_overload: 'Create a `/hooks` directory; extract custom hooks project-wide.',
7
+ duplicate_hooks: 'Search-and-merge duplicate hook calls across all components.',
8
+ tight_coupling: 'Introduce constructor DI or a parameter object pattern across all services.',
9
+ any_type: 'Enable `noImplicitAny` in tsconfig.json to catch new occurrences at compile time.',
10
+ any_usage: 'Enable `noImplicitAny` in tsconfig.json to catch new occurrences at compile time.',
11
+ console_log: 'Install eslint-plugin-no-console and enable as error in CI.',
12
+ missing_key: 'Add eslint-plugin-react `react/jsx-key` rule as error.',
13
+ inline_handler: 'Add eslint rule `react/jsx-no-bind` to catch new occurrences.',
14
+ long_method: 'Adopt a team rule: methods >40 lines require a PR comment.',
15
+ empty_catch: 'Add a linting rule for empty catch blocks (e.g. `no-empty` in ESLint).',
16
+ todo_placeholder: 'Set up a pre-commit hook that blocks TODO/FIXME markers without a ticket number.',
17
+ unimplemented_stub: 'Add a test that calls every exported function — stubs will throw and fail CI.',
18
+ tech_debt_marker: 'Create a "tech-debt" label in your issue tracker; link each HACK comment.',
19
+ magic_number: 'Create a shared `constants.ts` module; add a lint rule against literal numbers.',
20
+ no_test_coverage: 'Enforce a minimum Jest coverage threshold in jest.config.js.',
21
+ no_test_file: 'Enforce a minimum Jest coverage threshold in jest.config.js.',
22
+ low_test_coverage: 'Set `coverageThreshold` to 50 in jest.config.js; increase to 80 over time.',
23
+ moderate_test_coverage: 'Add branch coverage reporting; target 80% for all core modules.',
24
+ uncovered_lines: 'Focus test additions on the specific uncovered lines listed in the lcov report.',
25
+ hollow_test_file: 'Audit all test files for empty describe/it blocks; add real assertions.',
26
+ analysis_error: 'Investigate analysis failures; they may indicate syntax errors or encoding issues.',
27
+ high_import_count: 'Introduce barrel files or feature modules to reduce per-file import counts.',
28
+ };
29
+ class PatternDetector {
30
+ detect(analyses) {
31
+ if (analyses.length === 0)
32
+ return [];
33
+ const patterns = new Map();
34
+ for (const analysis of analyses) {
35
+ for (const violation of analysis.violations) {
36
+ const acc = patterns.get(violation.type) ?? {
37
+ severity: violation.severity,
38
+ files: new Set(),
39
+ totalOccurrences: 0,
40
+ };
41
+ acc.files.add(analysis.path);
42
+ acc.totalOccurrences++;
43
+ // Severity: take the highest severity seen for this type
44
+ if (violation.severity === 'error')
45
+ acc.severity = 'error';
46
+ else if (violation.severity === 'warning' && acc.severity !== 'error')
47
+ acc.severity = 'warning';
48
+ patterns.set(violation.type, acc);
49
+ }
50
+ }
51
+ // ── Compute estimatedRatingGain ──────────────────────────
52
+ const DEDUCTIONS = { error: 1.5, warning: 0.5, info: 0.1 };
53
+ const reports = [];
54
+ for (const [violationType, acc] of patterns) {
55
+ const deductionPerInstance = DEDUCTIONS[acc.severity] ?? 0.1;
56
+ const estimatedRatingGain = Math.round(acc.totalOccurrences * deductionPerInstance * 10) / 10;
57
+ reports.push({
58
+ violationType,
59
+ severity: acc.severity,
60
+ fileCount: acc.files.size,
61
+ totalOccurrences: acc.totalOccurrences,
62
+ affectedFiles: [...acc.files].slice(0, 10),
63
+ estimatedRatingGain,
64
+ moduleSuggestion: MODULE_SUGGESTIONS[violationType] ?? `Fix all ${violationType} occurrences codebase-wide.`,
65
+ });
66
+ }
67
+ // ── Sort: by estimatedRatingGain desc, then fileCount desc ──
68
+ reports.sort((a, b) => b.estimatedRatingGain - a.estimatedRatingGain ||
69
+ b.fileCount - a.fileCount);
70
+ return reports;
71
+ }
72
+ }
73
+ exports.PatternDetector = PatternDetector;
74
+ //# sourceMappingURL=pattern-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-detector.js","sourceRoot":"","sources":["../../src/analyzer/pattern-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { FileAnalysis, RefactoringHint } from '../types';
2
+ import { CycleInfo } from '../graph/dependency-graph';
3
+ export declare class RefactoringAdvisor {
4
+ suggest(analysis: FileAnalysis, cycles: CycleInfo[]): RefactoringHint[];
5
+ private gainForViolations;
6
+ }
7
+ //# sourceMappingURL=refactoring-advisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactoring-advisor.d.ts","sourceRoot":"","sources":["../../src/analyzer/refactoring-advisor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAa,eAAe,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAwNtD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE;IAsEvE,OAAO,CAAC,iBAAiB;CAK1B"}