@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,213 @@
1
+ "use strict";
2
+ /**
3
+ * Pre-computed analytics for the dependency graph response.
4
+ *
5
+ * Surfaces the signals AI agents otherwise have to derive with custom code:
6
+ * rating distribution, top fan-in / fan-out hotspots, worst-rated files, and
7
+ * cross-module coupling. All functions are pure and operate on the raw
8
+ * GraphResponse shape from the daemon.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.moduleOf = moduleOf;
45
+ exports.buildGraphSummary = buildGraphSummary;
46
+ exports.formatGraphSummaryMarkdown = formatGraphSummaryMarkdown;
47
+ const path = __importStar(require("path"));
48
+ const graph_algorithms_1 = require("./graph-algorithms");
49
+ const TOP_N = 10;
50
+ const MODULE_COUPLING_LIMIT = 15;
51
+ const FRAGILE_HUB_FANIN = 5;
52
+ const FRAGILE_RATING_THRESHOLD = 7.0;
53
+ /** Derive a stable module label from a file path, handling sub-projects. */
54
+ function moduleOf(filePath, repo) {
55
+ const rel = path.relative(repo, filePath);
56
+ if (!rel || rel.startsWith('..'))
57
+ return path.dirname(filePath);
58
+ const parts = rel.split(/[\\/]/);
59
+ if (parts[0] === 'src')
60
+ return parts.length >= 2 ? `src/${parts[1]}` : 'src';
61
+ if (parts.length >= 3 && parts[1] === 'src')
62
+ return `${parts[0]}/src/${parts[2]}`;
63
+ return parts.slice(0, 2).join('/');
64
+ }
65
+ function computeRatingDistribution(nodes) {
66
+ const dist = { excellent: 0, good: 0, warning: 0, critical: 0 };
67
+ for (const n of nodes) {
68
+ if (n.rating >= 8)
69
+ dist.excellent++;
70
+ else if (n.rating >= 7)
71
+ dist.good++;
72
+ else if (n.rating >= 6.5)
73
+ dist.warning++;
74
+ else
75
+ dist.critical++;
76
+ }
77
+ return dist;
78
+ }
79
+ function computeAvgRating(nodes) {
80
+ if (nodes.length === 0)
81
+ return 0;
82
+ let sum = 0;
83
+ let count = 0;
84
+ for (const n of nodes) {
85
+ if (Number.isFinite(n.rating)) {
86
+ sum += n.rating;
87
+ count++;
88
+ }
89
+ }
90
+ return count === 0 ? 0 : Math.round((sum / count) * 100) / 100;
91
+ }
92
+ function enrichHotspot(e, locByNode) {
93
+ const entry = {
94
+ path: e.path,
95
+ inDegree: e.inDegree,
96
+ outDegree: e.outDegree,
97
+ rating: e.rating,
98
+ loc: locByNode.get(e.path) ?? 0,
99
+ };
100
+ if (e.inDegree >= FRAGILE_HUB_FANIN && e.rating < FRAGILE_RATING_THRESHOLD) {
101
+ entry.fragileHub = true;
102
+ }
103
+ return entry;
104
+ }
105
+ function topHotspots(centrality, pick, locByNode) {
106
+ return [...centrality]
107
+ .filter(e => pick(e) > 0)
108
+ .sort((a, b) => pick(b) - pick(a) || a.rating - b.rating)
109
+ .slice(0, TOP_N)
110
+ .map(e => enrichHotspot(e, locByNode));
111
+ }
112
+ function topWorstFiles(nodes, violationsByNode) {
113
+ return [...nodes]
114
+ .sort((a, b) => a.rating - b.rating || b.metrics.linesOfCode - a.metrics.linesOfCode)
115
+ .slice(0, TOP_N)
116
+ .map(n => ({
117
+ path: n.id,
118
+ rating: n.rating,
119
+ loc: n.metrics.linesOfCode,
120
+ violations: violationsByNode.get(n.id) ?? 0,
121
+ }));
122
+ }
123
+ function computeModuleCoupling(edges, repo) {
124
+ const counts = new Map();
125
+ for (const e of edges) {
126
+ const from = moduleOf(e.source, repo);
127
+ const to = moduleOf(e.target, repo);
128
+ if (from === to)
129
+ continue;
130
+ let inner = counts.get(from);
131
+ if (!inner) {
132
+ inner = new Map();
133
+ counts.set(from, inner);
134
+ }
135
+ inner.set(to, (inner.get(to) ?? 0) + 1);
136
+ }
137
+ const out = [];
138
+ for (const [from, inner] of counts) {
139
+ for (const [to, count] of inner)
140
+ out.push({ from, to, count });
141
+ }
142
+ out.sort((a, b) => b.count - a.count);
143
+ return out.slice(0, MODULE_COUPLING_LIMIT);
144
+ }
145
+ function buildGraphSummary(nodes, edges, cycles, repo) {
146
+ const centrality = (0, graph_algorithms_1.computeCentrality)(nodes.map(n => ({ id: n.id, label: n.label ?? path.basename(n.id), rating: n.rating })), edges);
147
+ const locByNode = new Map(nodes.map(n => [n.id, n.metrics.linesOfCode]));
148
+ const violationsByNode = new Map(nodes.map(n => [n.id, n.violations.length]));
149
+ return {
150
+ fileCount: nodes.length,
151
+ edgeCount: edges.length,
152
+ cycleCount: cycles.length,
153
+ avgRating: computeAvgRating(nodes),
154
+ ratingDistribution: computeRatingDistribution(nodes),
155
+ mostDependedOn: topHotspots(centrality, e => e.inDegree, locByNode),
156
+ mostDependencies: topHotspots(centrality, e => e.outDegree, locByNode),
157
+ worstFiles: topWorstFiles(nodes, violationsByNode),
158
+ moduleCoupling: computeModuleCoupling(edges, repo),
159
+ };
160
+ }
161
+ /** Format the summary as compact markdown for the human-readable channel. */
162
+ function formatGraphSummaryMarkdown(summary, repo) {
163
+ const rel = (p) => {
164
+ const r = path.relative(repo, p);
165
+ return r && !r.startsWith('..') ? r : p;
166
+ };
167
+ const lines = [];
168
+ const d = summary.ratingDistribution;
169
+ lines.push('## Dependency Graph');
170
+ lines.push(`**Files:** ${summary.fileCount} | **Edges:** ${summary.edgeCount} | ` +
171
+ `**Cycles:** ${summary.cycleCount} | **Avg rating:** ${summary.avgRating}`);
172
+ lines.push('');
173
+ lines.push('### Rating Distribution');
174
+ lines.push(`- >=8 (excellent): **${d.excellent}**` +
175
+ ` | 7-8 (good): **${d.good}**` +
176
+ ` | 6.5-7 (warning): **${d.warning}**` +
177
+ ` | <6.5 (critical): **${d.critical}**`);
178
+ lines.push('');
179
+ if (summary.mostDependedOn.length > 0) {
180
+ lines.push('### Top Fan-In (most depended-on - risky to change)');
181
+ for (const h of summary.mostDependedOn.slice(0, 5)) {
182
+ const flag = h.fragileHub ? ' [fragile hub]' : '';
183
+ lines.push(`- in=${h.inDegree} | r=${h.rating} | ${h.loc} LOC | \`${rel(h.path)}\`${flag}`);
184
+ }
185
+ lines.push('');
186
+ }
187
+ if (summary.mostDependencies.length > 0) {
188
+ lines.push('### Top Fan-Out (highest afferent coupling - potential god-modules)');
189
+ for (const h of summary.mostDependencies.slice(0, 5)) {
190
+ lines.push(`- out=${h.outDegree} | r=${h.rating} | ${h.loc} LOC | \`${rel(h.path)}\``);
191
+ }
192
+ lines.push('');
193
+ }
194
+ if (summary.worstFiles.length > 0) {
195
+ lines.push('### Worst-Rated Files');
196
+ for (const w of summary.worstFiles.slice(0, 5)) {
197
+ lines.push(`- r=${w.rating} | ${w.loc} LOC | ${w.violations} viol | \`${rel(w.path)}\``);
198
+ }
199
+ lines.push('');
200
+ }
201
+ if (summary.moduleCoupling.length > 0) {
202
+ lines.push('### Top Cross-Module Edges');
203
+ for (const m of summary.moduleCoupling.slice(0, 8)) {
204
+ lines.push(`- ${m.count}x \`${m.from}\` -> \`${m.to}\``);
205
+ }
206
+ lines.push('');
207
+ }
208
+ lines.push('Full structured data in `structuredContent.data`: `nodes`, `edges`, `adjacency`, ' +
209
+ '`reverseAdjacency`, `cycles`, plus the pre-computed `summary` (rating distribution, ' +
210
+ 'hotspots, worst files, module coupling).');
211
+ return lines.join('\n');
212
+ }
213
+ //# sourceMappingURL=graph-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-summary.js","sourceRoot":"","sources":["../../src/graph/graph-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * .graphifyignore parser — gitignore-compatible file exclusion for gate-keeper scans.
3
+ *
4
+ * Supports:
5
+ * # comment lines
6
+ * ! negation (un-ignore a previously ignored path)
7
+ * * matches any character except /
8
+ * ** matches any sequence including /
9
+ * ? matches any single character except /
10
+ * Patterns without / match the basename at any depth (same as .gitignore).
11
+ * Patterns with / are anchored relative to the repo root.
12
+ *
13
+ * Usage:
14
+ * const rules = loadGraphifyIgnore(repoRoot);
15
+ * if (shouldIgnoreByGraphifyIgnore('/repo/src/gen/foo.ts', '/repo', rules)) skip();
16
+ */
17
+ export interface IgnoreRule {
18
+ pattern: string;
19
+ negate: boolean;
20
+ anchored: boolean;
21
+ regex: RegExp;
22
+ }
23
+ /** Parse the text content of a .graphifyignore file into rules. */
24
+ export declare function parseGraphifyIgnore(content: string): IgnoreRule[];
25
+ /** Load .graphifyignore from the repo root; returns empty array if file missing. */
26
+ export declare function loadGraphifyIgnore(repoRoot: string): IgnoreRule[];
27
+ /**
28
+ * Returns true if `filePath` should be excluded according to `rules`.
29
+ * Rules are evaluated in order; the last matching rule wins (gitignore semantics).
30
+ */
31
+ export declare function shouldIgnoreByGraphifyIgnore(filePath: string, repoRoot: string, rules: IgnoreRule[]): boolean;
32
+ //# sourceMappingURL=graphify-ignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphify-ignore.d.ts","sourceRoot":"","sources":["../../src/graph/graphify-ignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAiBjE;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAQjE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,EAAE,GAClB,OAAO,CAeT"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * .graphifyignore parser — gitignore-compatible file exclusion for gate-keeper scans.
4
+ *
5
+ * Supports:
6
+ * # comment lines
7
+ * ! negation (un-ignore a previously ignored path)
8
+ * * matches any character except /
9
+ * ** matches any sequence including /
10
+ * ? matches any single character except /
11
+ * Patterns without / match the basename at any depth (same as .gitignore).
12
+ * Patterns with / are anchored relative to the repo root.
13
+ *
14
+ * Usage:
15
+ * const rules = loadGraphifyIgnore(repoRoot);
16
+ * if (shouldIgnoreByGraphifyIgnore('/repo/src/gen/foo.ts', '/repo', rules)) skip();
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.parseGraphifyIgnore = parseGraphifyIgnore;
53
+ exports.loadGraphifyIgnore = loadGraphifyIgnore;
54
+ exports.shouldIgnoreByGraphifyIgnore = shouldIgnoreByGraphifyIgnore;
55
+ const fs = __importStar(require("fs"));
56
+ const path = __importStar(require("path"));
57
+ /** Parse the text content of a .graphifyignore file into rules. */
58
+ function parseGraphifyIgnore(content) {
59
+ const rules = [];
60
+ for (const rawLine of content.split('\n')) {
61
+ const line = rawLine.trim();
62
+ if (!line || line.startsWith('#'))
63
+ continue;
64
+ const negate = line.startsWith('!');
65
+ const raw = negate ? line.slice(1).trim() : line;
66
+ const isDir = raw.endsWith('/');
67
+ // Strip trailing / (directory marker — we match its contents)
68
+ const pattern = isDir ? raw.slice(0, -1) : raw;
69
+ // "anchored" = pattern originally had a / (including a trailing one)
70
+ const anchored = raw.includes('/');
71
+ rules.push({ pattern, negate, anchored, regex: buildRegex(pattern, anchored) });
72
+ }
73
+ return rules;
74
+ }
75
+ /** Load .graphifyignore from the repo root; returns empty array if file missing. */
76
+ function loadGraphifyIgnore(repoRoot) {
77
+ const ignoreFile = path.join(repoRoot, '.graphifyignore');
78
+ try {
79
+ const content = fs.readFileSync(ignoreFile, 'utf8');
80
+ return parseGraphifyIgnore(content);
81
+ }
82
+ catch {
83
+ return [];
84
+ }
85
+ }
86
+ /**
87
+ * Returns true if `filePath` should be excluded according to `rules`.
88
+ * Rules are evaluated in order; the last matching rule wins (gitignore semantics).
89
+ */
90
+ function shouldIgnoreByGraphifyIgnore(filePath, repoRoot, rules) {
91
+ if (rules.length === 0)
92
+ return false;
93
+ const rel = path.relative(repoRoot, filePath).replace(/\\/g, '/'); // normalise on Windows
94
+ const base = path.basename(rel);
95
+ let ignored = false;
96
+ for (const rule of rules) {
97
+ const subject = rule.anchored ? rel : base;
98
+ if (rule.regex.test(subject)) {
99
+ ignored = !rule.negate;
100
+ }
101
+ }
102
+ return ignored;
103
+ }
104
+ // ── Helpers ────────────────────────────────────────────────
105
+ function buildRegex(pattern, anchored) {
106
+ // Escape special regex chars except * and ?
107
+ const escaped = pattern
108
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
109
+ // Multi-level wildcard ** must be replaced before single-level *
110
+ // Use sentinel to avoid double-matching * inside **
111
+ .replace(/\*\*/g, '\x00GLOBSTAR\x00')
112
+ .replace(/\*/g, '[^/]*') // single-level wildcard
113
+ .replace(/\x00GLOBSTAR\x00/g, '.*') // multi-level wildcard
114
+ .replace(/\?/g, '[^/]'); // single char wildcard
115
+ if (anchored) {
116
+ // Anchored patterns: match from the start of the relative path
117
+ return new RegExp(`^${escaped}(?:/.*)?$`);
118
+ }
119
+ else {
120
+ // Un-anchored: match the basename only (exact or prefix for directories)
121
+ return new RegExp(`^${escaped}(?:/.*)?$`);
122
+ }
123
+ }
124
+ //# sourceMappingURL=graphify-ignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphify-ignore.js","sourceRoot":"","sources":["../../src/graph/graphify-ignore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Auto-generates suggested questions about the codebase knowledge graph.
3
+ *
4
+ * Graphify-style: identifies god nodes (highest centrality) and worst-rated
5
+ * files, then generates 4-5 questions an agent is well-positioned to answer
6
+ * using the existing graph tools.
7
+ */
8
+ interface GNode {
9
+ id: string;
10
+ label: string;
11
+ rating: number;
12
+ }
13
+ interface GEdge {
14
+ source: string;
15
+ target: string;
16
+ }
17
+ export type QuestionType = 'impact' | 'dependency' | 'path' | 'health' | 'explanation' | 'callers';
18
+ export interface SuggestedQuestion {
19
+ question: string;
20
+ type: QuestionType;
21
+ tool: string;
22
+ params: Record<string, string | number>;
23
+ }
24
+ /**
25
+ * Generate up to `maxQuestions` suggested questions from the graph topology.
26
+ * Questions are ordered by estimated usefulness.
27
+ */
28
+ export declare function suggestQuestions(nodes: ReadonlyArray<GNode>, edges: ReadonlyArray<GEdge>, repoRoot: string, maxQuestions?: number): SuggestedQuestion[];
29
+ export {};
30
+ //# sourceMappingURL=question-suggester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-suggester.d.ts","sourceRoot":"","sources":["../../src/graph/question-suggester.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,UAAU,KAAK;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC7D,UAAU,KAAK;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAElD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AAEnG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,YAAY,SAAI,GACf,iBAAiB,EAAE,CAmErB"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * Auto-generates suggested questions about the codebase knowledge graph.
4
+ *
5
+ * Graphify-style: identifies god nodes (highest centrality) and worst-rated
6
+ * files, then generates 4-5 questions an agent is well-positioned to answer
7
+ * using the existing graph tools.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.suggestQuestions = suggestQuestions;
44
+ const path = __importStar(require("path"));
45
+ const graph_algorithms_1 = require("./graph-algorithms");
46
+ const surprising_connections_1 = require("./surprising-connections");
47
+ /**
48
+ * Generate up to `maxQuestions` suggested questions from the graph topology.
49
+ * Questions are ordered by estimated usefulness.
50
+ */
51
+ function suggestQuestions(nodes, edges, repoRoot, maxQuestions = 5) {
52
+ if (nodes.length === 0)
53
+ return [];
54
+ const questions = [];
55
+ const centrality = (0, graph_algorithms_1.computeCentrality)(nodes, edges);
56
+ const godNodes = centrality.slice(0, 3);
57
+ const worstNode = [...nodes].sort((a, b) => a.rating - b.rating)[0];
58
+ const modules = new Set(nodes.map(n => (0, surprising_connections_1.getModule)(n.id, repoRoot)));
59
+ // Impact questions for god nodes
60
+ for (const god of godNodes.slice(0, 2)) {
61
+ const label = path.relative(repoRoot, god.path);
62
+ questions.push({
63
+ question: `What would break if ${label} changed?`,
64
+ type: 'impact',
65
+ tool: 'get_impact_set',
66
+ params: { file_path: god.path, depth: 3 },
67
+ });
68
+ }
69
+ // Dependency question for the most-imported node
70
+ const topByInDegree = centrality.sort((a, b) => b.inDegree - a.inDegree)[0];
71
+ if (topByInDegree) {
72
+ const label = path.relative(repoRoot, topByInDegree.path);
73
+ questions.push({
74
+ question: `What depends on ${label}?`,
75
+ type: 'dependency',
76
+ tool: 'get_impact_set',
77
+ params: { file_path: topByInDegree.path, depth: 1 },
78
+ });
79
+ }
80
+ // Path question: god node → worst rated file
81
+ if (godNodes[0] && worstNode && worstNode.id !== godNodes[0]?.path) {
82
+ const srcLabel = path.relative(repoRoot, godNodes[0].path);
83
+ const tgtLabel = path.relative(repoRoot, worstNode.id);
84
+ questions.push({
85
+ question: `How does ${srcLabel} connect to ${tgtLabel} (lowest-rated file)?`,
86
+ type: 'path',
87
+ tool: 'trace_path',
88
+ params: { source: godNodes[0].path, target: worstNode.id },
89
+ });
90
+ }
91
+ // Health question for worst-rated file
92
+ if (worstNode && worstNode.rating < 7) {
93
+ const label = path.relative(repoRoot, worstNode.id);
94
+ questions.push({
95
+ question: `How unhealthy is ${label} and what should be fixed first?`,
96
+ type: 'health',
97
+ tool: 'suggest_refactoring',
98
+ params: { file_path: worstNode.id },
99
+ });
100
+ }
101
+ // Module-level question if multiple modules exist
102
+ if (modules.size > 2 && godNodes[0]) {
103
+ const label = path.relative(repoRoot, godNodes[0].path);
104
+ questions.push({
105
+ question: `Which modules does ${label} bridge, and is that coupling intentional?`,
106
+ type: 'explanation',
107
+ tool: 'explain_node',
108
+ params: { file_path: godNodes[0].path },
109
+ });
110
+ }
111
+ return questions.slice(0, maxQuestions);
112
+ }
113
+ //# sourceMappingURL=question-suggester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-suggester.js","sourceRoot":"","sources":["../../src/graph/question-suggester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * AST-based semantic relationship extractor.
3
+ *
4
+ * Piggybacks on the TypeScript Compiler API (ts.createSourceFile) to extract
5
+ * relationships the existing import-only dependency graph misses:
6
+ *
7
+ * FUNCTION_CALL — file A calls an imported function from file B
8
+ * CLASS_EXTENDS — file A's class extends an imported class from file B
9
+ * IMPLEMENTS — file A's class implements an imported interface from file B
10
+ * COMMENTS_ABOUT — "why:", "rationale:", JSDoc summaries embedded as WhyNodes
11
+ *
12
+ * Confidence is always EXTRACTED (direct AST evidence) for calls/heritage and
13
+ * INFERRED for JSDoc (not always a hard relationship).
14
+ *
15
+ * Usage:
16
+ * const extractor = new RelationshipExtractor();
17
+ * const result = extractor.extractFromFile(filePath, knownFilesSet);
18
+ */
19
+ import { EnrichedEdge, WhyNode } from './relationship-types';
20
+ export interface ExtractionResult {
21
+ enrichedEdges: EnrichedEdge[];
22
+ whyComments: WhyNode[];
23
+ }
24
+ export declare class RelationshipExtractor {
25
+ /**
26
+ * Extract semantic relationships from a single file.
27
+ *
28
+ * @param filePath Absolute path to analyze.
29
+ * @param knownFiles Set of absolute paths already tracked in the graph.
30
+ * Only imports resolving to known files generate edges.
31
+ */
32
+ extractFromFile(filePath: string, knownFiles: ReadonlySet<string>): ExtractionResult;
33
+ private buildImportMap;
34
+ private extractFunctionCalls;
35
+ private resolveCalleeName;
36
+ private extractClassRelations;
37
+ private extractWhyComments;
38
+ private resolveModule;
39
+ }
40
+ //# sourceMappingURL=relationship-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-extractor.d.ts","sourceRoot":"","sources":["../../src/graph/relationship-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,YAAY,EAAE,OAAO,EAA0C,MAAM,sBAAsB,CAAC;AAErG,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,EAAE,OAAO,EAAE,CAAC;CACxB;AAUD,qBAAa,qBAAqB;IAChC;;;;;;OAMG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,gBAAgB;IAsBpF,OAAO,CAAC,cAAc;IA8CtB,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,kBAAkB;IA0C1B,OAAO,CAAC,aAAa;CAYtB"}