mcp-react-toolkit 1.0.0 → 1.2.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 (235) hide show
  1. package/README.md +146 -42
  2. package/package.json +13 -5
  3. package/server.json +20 -0
  4. package/tools/accessibility-checker/build/index.js +9 -5
  5. package/tools/accessibility-checker/build/index.js.map +1 -1
  6. package/tools/accessibility-checker/build/rules.d.ts.map +1 -1
  7. package/tools/accessibility-checker/build/rules.js +325 -94
  8. package/tools/accessibility-checker/build/rules.js.map +1 -1
  9. package/tools/code-modernizer/build/tools/01-convert-to-typescript.d.ts.map +1 -1
  10. package/tools/code-modernizer/build/tools/01-convert-to-typescript.js +65 -50
  11. package/tools/code-modernizer/build/tools/01-convert-to-typescript.js.map +1 -1
  12. package/tools/code-modernizer/build/types.d.ts +1 -0
  13. package/tools/code-modernizer/build/types.d.ts.map +1 -1
  14. package/tools/code-modernizer/build/utils/ast-parser.d.ts.map +1 -1
  15. package/tools/code-modernizer/build/utils/ast-parser.js +30 -14
  16. package/tools/code-modernizer/build/utils/ast-parser.js.map +1 -1
  17. package/tools/code-modernizer/build/utils/type-generator.d.ts +1 -1
  18. package/tools/code-modernizer/build/utils/type-generator.d.ts.map +1 -1
  19. package/tools/code-modernizer/build/utils/type-generator.js +72 -23
  20. package/tools/code-modernizer/build/utils/type-generator.js.map +1 -1
  21. package/tools/component-factory/build/index.js +59 -7
  22. package/tools/component-factory/build/index.js.map +1 -1
  23. package/tools/component-fixer/README.md +44 -0
  24. package/tools/component-fixer/build/index.d.ts +3 -0
  25. package/tools/component-fixer/build/index.d.ts.map +1 -0
  26. package/tools/component-fixer/build/index.js +647 -0
  27. package/tools/component-fixer/build/index.js.map +1 -0
  28. package/tools/component-fixer/build/index.test.d.ts +2 -0
  29. package/tools/component-fixer/build/index.test.d.ts.map +1 -0
  30. package/tools/component-fixer/build/index.test.js.map +1 -0
  31. package/tools/component-fixer/package.json +20 -0
  32. package/tools/component-reviewer/README.md +54 -0
  33. package/tools/component-reviewer/build/index.d.ts +39 -0
  34. package/tools/component-reviewer/build/index.d.ts.map +1 -0
  35. package/tools/component-reviewer/build/index.js +946 -0
  36. package/tools/component-reviewer/build/index.js.map +1 -0
  37. package/tools/component-reviewer/build/index.test.d.ts +2 -0
  38. package/tools/component-reviewer/build/index.test.d.ts.map +1 -0
  39. package/tools/component-reviewer/build/index.test.js.map +1 -0
  40. package/tools/component-reviewer/package.json +20 -0
  41. package/tools/dep-auditor/build/index.d.ts +1 -0
  42. package/tools/dep-auditor/build/index.d.ts.map +1 -1
  43. package/tools/dep-auditor/build/index.js +71 -16
  44. package/tools/dep-auditor/build/index.js.map +1 -1
  45. package/tools/generate-tests/build/analyzer.d.ts +14 -0
  46. package/tools/generate-tests/build/analyzer.d.ts.map +1 -1
  47. package/tools/generate-tests/build/analyzer.js +96 -42
  48. package/tools/generate-tests/build/analyzer.js.map +1 -1
  49. package/tools/generate-tests/build/generators.d.ts.map +1 -1
  50. package/tools/generate-tests/build/generators.js +304 -79
  51. package/tools/generate-tests/build/generators.js.map +1 -1
  52. package/tools/generate-tests/build/index.js +29 -10
  53. package/tools/generate-tests/build/index.js.map +1 -1
  54. package/tools/json-viewer/build/index.js +29 -6
  55. package/tools/json-viewer/build/index.js.map +1 -1
  56. package/tools/legacy-analyzer/README.md +66 -0
  57. package/tools/legacy-analyzer/build/index.d.ts +3 -0
  58. package/tools/legacy-analyzer/build/index.d.ts.map +1 -0
  59. package/tools/legacy-analyzer/build/index.js +209 -0
  60. package/tools/legacy-analyzer/build/index.js.map +1 -0
  61. package/tools/legacy-analyzer/build/index.test.d.ts +2 -0
  62. package/tools/legacy-analyzer/build/index.test.d.ts.map +1 -0
  63. package/tools/legacy-analyzer/build/index.test.js.map +1 -0
  64. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts +3 -0
  65. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts.map +1 -0
  66. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js +115 -0
  67. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js.map +1 -0
  68. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts +3 -0
  69. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts.map +1 -0
  70. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js +85 -0
  71. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js.map +1 -0
  72. package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts +3 -0
  73. package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts.map +1 -0
  74. package/tools/legacy-analyzer/build/tools/03-analyze-components.js +87 -0
  75. package/tools/legacy-analyzer/build/tools/03-analyze-components.js.map +1 -0
  76. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts +3 -0
  77. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts.map +1 -0
  78. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js +133 -0
  79. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js.map +1 -0
  80. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts +3 -0
  81. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts.map +1 -0
  82. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js +160 -0
  83. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js.map +1 -0
  84. package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts +3 -0
  85. package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts.map +1 -0
  86. package/tools/legacy-analyzer/build/tools/06-analyze-routing.js +150 -0
  87. package/tools/legacy-analyzer/build/tools/06-analyze-routing.js.map +1 -0
  88. package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts +3 -0
  89. package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts.map +1 -0
  90. package/tools/legacy-analyzer/build/tools/07-analyze-styling.js +131 -0
  91. package/tools/legacy-analyzer/build/tools/07-analyze-styling.js.map +1 -0
  92. package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts +3 -0
  93. package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts.map +1 -0
  94. package/tools/legacy-analyzer/build/tools/08-analyze-assets.js +85 -0
  95. package/tools/legacy-analyzer/build/tools/08-analyze-assets.js.map +1 -0
  96. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts +3 -0
  97. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts.map +1 -0
  98. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js +329 -0
  99. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js.map +1 -0
  100. package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts +3 -0
  101. package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts.map +1 -0
  102. package/tools/legacy-analyzer/build/tools/10-detect-duplication.js +192 -0
  103. package/tools/legacy-analyzer/build/tools/10-detect-duplication.js.map +1 -0
  104. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts +3 -0
  105. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts.map +1 -0
  106. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js +232 -0
  107. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js.map +1 -0
  108. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts +3 -0
  109. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts.map +1 -0
  110. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js +247 -0
  111. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js.map +1 -0
  112. package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts +3 -0
  113. package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts.map +1 -0
  114. package/tools/legacy-analyzer/build/tools/13-detect-features.js +141 -0
  115. package/tools/legacy-analyzer/build/tools/13-detect-features.js.map +1 -0
  116. package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts +3 -0
  117. package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts.map +1 -0
  118. package/tools/legacy-analyzer/build/tools/14-classify-files.js +76 -0
  119. package/tools/legacy-analyzer/build/tools/14-classify-files.js.map +1 -0
  120. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts +3 -0
  121. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts.map +1 -0
  122. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js +70 -0
  123. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js.map +1 -0
  124. package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts +3 -0
  125. package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts.map +1 -0
  126. package/tools/legacy-analyzer/build/tools/16-design-target-structure.js +26 -0
  127. package/tools/legacy-analyzer/build/tools/16-design-target-structure.js.map +1 -0
  128. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts +3 -0
  129. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts.map +1 -0
  130. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js +108 -0
  131. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js.map +1 -0
  132. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts +3 -0
  133. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts.map +1 -0
  134. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js +137 -0
  135. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js.map +1 -0
  136. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts +3 -0
  137. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts.map +1 -0
  138. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js +160 -0
  139. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js.map +1 -0
  140. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts +3 -0
  141. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts.map +1 -0
  142. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js +162 -0
  143. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js.map +1 -0
  144. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts +3 -0
  145. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts.map +1 -0
  146. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js +108 -0
  147. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js.map +1 -0
  148. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts +3 -0
  149. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts.map +1 -0
  150. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js +98 -0
  151. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js.map +1 -0
  152. package/tools/legacy-analyzer/build/types.d.ts +413 -0
  153. package/tools/legacy-analyzer/build/types.d.ts.map +1 -0
  154. package/tools/legacy-analyzer/build/types.js +12 -0
  155. package/tools/legacy-analyzer/build/types.js.map +1 -0
  156. package/tools/legacy-analyzer/build/utils/ast-parser.d.ts +34 -0
  157. package/tools/legacy-analyzer/build/utils/ast-parser.d.ts.map +1 -0
  158. package/tools/legacy-analyzer/build/utils/ast-parser.js +394 -0
  159. package/tools/legacy-analyzer/build/utils/ast-parser.js.map +1 -0
  160. package/tools/legacy-analyzer/build/utils/file-scanner.d.ts +51 -0
  161. package/tools/legacy-analyzer/build/utils/file-scanner.d.ts.map +1 -0
  162. package/tools/legacy-analyzer/build/utils/file-scanner.js +174 -0
  163. package/tools/legacy-analyzer/build/utils/file-scanner.js.map +1 -0
  164. package/tools/legacy-analyzer/build/utils/import-tracker.d.ts +38 -0
  165. package/tools/legacy-analyzer/build/utils/import-tracker.d.ts.map +1 -0
  166. package/tools/legacy-analyzer/build/utils/import-tracker.js +194 -0
  167. package/tools/legacy-analyzer/build/utils/import-tracker.js.map +1 -0
  168. package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts +88 -0
  169. package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts.map +1 -0
  170. package/tools/legacy-analyzer/build/utils/refactor-helpers.js +538 -0
  171. package/tools/legacy-analyzer/build/utils/refactor-helpers.js.map +1 -0
  172. package/tools/legacy-analyzer/package.json +20 -0
  173. package/tools/lighthouse-runner/README.md +45 -0
  174. package/tools/lighthouse-runner/build/index.d.ts +6 -0
  175. package/tools/lighthouse-runner/build/index.d.ts.map +1 -0
  176. package/tools/lighthouse-runner/build/index.js +295 -0
  177. package/tools/lighthouse-runner/build/index.js.map +1 -0
  178. package/tools/lighthouse-runner/build/index.test.d.ts +2 -0
  179. package/tools/lighthouse-runner/build/index.test.d.ts.map +1 -0
  180. package/tools/lighthouse-runner/build/index.test.js.map +1 -0
  181. package/tools/lighthouse-runner/package.json +20 -0
  182. package/tools/monorepo-manager/build/utils.d.ts.map +1 -1
  183. package/tools/monorepo-manager/build/utils.js +12 -9
  184. package/tools/monorepo-manager/build/utils.js.map +1 -1
  185. package/tools/performance-audit/README.md +37 -0
  186. package/tools/performance-audit/build/index.d.ts +13 -0
  187. package/tools/performance-audit/build/index.d.ts.map +1 -0
  188. package/tools/performance-audit/build/index.js +311 -0
  189. package/tools/performance-audit/build/index.js.map +1 -0
  190. package/tools/performance-audit/build/index.test.d.ts +2 -0
  191. package/tools/performance-audit/build/index.test.d.ts.map +1 -0
  192. package/tools/performance-audit/build/index.test.js.map +1 -0
  193. package/tools/performance-audit/package.json +20 -0
  194. package/tools/quality-pipeline/build/index.js +55 -15
  195. package/tools/quality-pipeline/build/index.js.map +1 -1
  196. package/tools/render-analyzer/README.md +43 -0
  197. package/tools/render-analyzer/build/index.d.ts +25 -0
  198. package/tools/render-analyzer/build/index.d.ts.map +1 -0
  199. package/tools/render-analyzer/build/index.js +342 -0
  200. package/tools/render-analyzer/build/index.js.map +1 -0
  201. package/tools/render-analyzer/build/index.test.d.ts +2 -0
  202. package/tools/render-analyzer/build/index.test.d.ts.map +1 -0
  203. package/tools/render-analyzer/build/index.test.js.map +1 -0
  204. package/tools/render-analyzer/package.json +20 -0
  205. package/tools/shared/build/fs.d.ts +8 -0
  206. package/tools/shared/build/fs.d.ts.map +1 -0
  207. package/tools/shared/build/fs.js +45 -0
  208. package/tools/shared/build/fs.js.map +1 -0
  209. package/tools/shared/build/index.d.ts +1 -0
  210. package/tools/shared/build/index.d.ts.map +1 -1
  211. package/tools/shared/build/index.js +1 -0
  212. package/tools/shared/build/index.js.map +1 -1
  213. package/tools/storybook-generator/README.md +39 -0
  214. package/tools/storybook-generator/build/index.d.ts +13 -0
  215. package/tools/storybook-generator/build/index.d.ts.map +1 -0
  216. package/tools/storybook-generator/build/index.js +478 -0
  217. package/tools/storybook-generator/build/index.js.map +1 -0
  218. package/tools/storybook-generator/build/index.test.d.ts +2 -0
  219. package/tools/storybook-generator/build/index.test.d.ts.map +1 -0
  220. package/tools/storybook-generator/build/index.test.js.map +1 -0
  221. package/tools/storybook-generator/package.json +20 -0
  222. package/tools/test-gap-analyzer/README.md +41 -0
  223. package/tools/test-gap-analyzer/build/index.d.ts +20 -0
  224. package/tools/test-gap-analyzer/build/index.d.ts.map +1 -0
  225. package/tools/test-gap-analyzer/build/index.js +371 -0
  226. package/tools/test-gap-analyzer/build/index.js.map +1 -0
  227. package/tools/test-gap-analyzer/build/index.test.d.ts +2 -0
  228. package/tools/test-gap-analyzer/build/index.test.d.ts.map +1 -0
  229. package/tools/test-gap-analyzer/build/index.test.js.map +1 -0
  230. package/tools/test-gap-analyzer/package.json +20 -0
  231. package/tools/typescript-enforcer/build/scanner.d.ts.map +1 -1
  232. package/tools/typescript-enforcer/build/scanner.js +13 -1
  233. package/tools/typescript-enforcer/build/scanner.js.map +1 -1
  234. package/tools/typescript-enforcer/build/types.d.ts +1 -0
  235. package/tools/typescript-enforcer/build/types.d.ts.map +1 -1
@@ -0,0 +1,538 @@
1
+ // ============================================================================
2
+ // REFACTOR HELPERS - Shared utilities for folder structure refactoring tools
3
+ // ============================================================================
4
+ import * as path from 'path';
5
+ import { findSourceFiles, readFileContent } from './file-scanner.js';
6
+ import { buildImportGraph, resolveImportPath } from './import-tracker.js';
7
+ // ============================================================================
8
+ // FEATURE DETECTION
9
+ // ============================================================================
10
+ /**
11
+ * Common feature name patterns extracted from file/folder names
12
+ */
13
+ const FEATURE_NAME_PATTERNS = {
14
+ // Auth
15
+ login: 'auth',
16
+ logout: 'auth',
17
+ signin: 'auth',
18
+ signup: 'auth',
19
+ register: 'auth',
20
+ auth: 'auth',
21
+ authentication: 'auth',
22
+ oauth: 'auth',
23
+ forgotpassword: 'auth',
24
+ resetpassword: 'auth',
25
+ passwordreset: 'auth',
26
+ mfa: 'auth',
27
+ twoFactor: 'auth',
28
+ // User
29
+ user: 'user',
30
+ profile: 'user',
31
+ account: 'user',
32
+ settings: 'user',
33
+ preferences: 'user',
34
+ avatar: 'user',
35
+ // Dashboard
36
+ dashboard: 'dashboard',
37
+ home: 'dashboard',
38
+ overview: 'dashboard',
39
+ main: 'dashboard',
40
+ landing: 'dashboard',
41
+ // Admin
42
+ admin: 'admin',
43
+ management: 'admin',
44
+ moderation: 'admin',
45
+ // Notifications
46
+ notification: 'notifications',
47
+ alert: 'notifications',
48
+ toast: 'notifications',
49
+ message: 'notifications',
50
+ // Search
51
+ search: 'search',
52
+ filter: 'search',
53
+ results: 'search',
54
+ // Products/Catalog
55
+ product: 'catalog',
56
+ catalog: 'catalog',
57
+ item: 'catalog',
58
+ inventory: 'catalog',
59
+ listing: 'catalog',
60
+ // Cart/Checkout
61
+ cart: 'checkout',
62
+ checkout: 'checkout',
63
+ payment: 'checkout',
64
+ order: 'checkout',
65
+ purchase: 'checkout',
66
+ billing: 'checkout',
67
+ // Reports
68
+ report: 'reports',
69
+ analytics: 'reports',
70
+ chart: 'reports',
71
+ graph: 'reports',
72
+ stats: 'reports',
73
+ // Chat/Messaging
74
+ chat: 'messaging',
75
+ conversation: 'messaging',
76
+ inbox: 'messaging',
77
+ // Forms
78
+ form: 'forms',
79
+ wizard: 'forms',
80
+ stepper: 'forms',
81
+ // Layout
82
+ header: 'layout',
83
+ footer: 'layout',
84
+ sidebar: 'layout',
85
+ navbar: 'layout',
86
+ nav: 'layout',
87
+ menu: 'layout',
88
+ layout: 'layout',
89
+ // Error
90
+ error: 'error',
91
+ notfound: 'error',
92
+ forbidden: 'error',
93
+ unauthorized: 'error',
94
+ boundary: 'error',
95
+ fallback: 'error',
96
+ };
97
+ /**
98
+ * Route path to feature mapping
99
+ */
100
+ const ROUTE_FEATURE_MAP = {
101
+ '/login': 'auth',
102
+ '/logout': 'auth',
103
+ '/signin': 'auth',
104
+ '/signup': 'auth',
105
+ '/register': 'auth',
106
+ '/auth': 'auth',
107
+ '/forgot-password': 'auth',
108
+ '/reset-password': 'auth',
109
+ '/profile': 'user',
110
+ '/account': 'user',
111
+ '/settings': 'user',
112
+ '/dashboard': 'dashboard',
113
+ '/home': 'dashboard',
114
+ '/admin': 'admin',
115
+ '/notifications': 'notifications',
116
+ '/search': 'search',
117
+ '/products': 'catalog',
118
+ '/catalog': 'catalog',
119
+ '/cart': 'checkout',
120
+ '/checkout': 'checkout',
121
+ '/orders': 'checkout',
122
+ '/reports': 'reports',
123
+ '/analytics': 'reports',
124
+ '/chat': 'messaging',
125
+ '/messages': 'messaging',
126
+ '/error': 'error',
127
+ '/404': 'error',
128
+ '/500': 'error',
129
+ };
130
+ /**
131
+ * Detect feature name from a file path
132
+ */
133
+ export function detectFeatureFromPath(filePath, rootDir) {
134
+ const relPath = path.relative(rootDir, filePath).toLowerCase();
135
+ const parts = relPath.split(path.sep);
136
+ // Check if already in a feature folder
137
+ for (const part of parts) {
138
+ if (FEATURE_NAME_PATTERNS[part]) {
139
+ return FEATURE_NAME_PATTERNS[part];
140
+ }
141
+ }
142
+ // Check filename
143
+ const basename = path.basename(filePath, path.extname(filePath)).toLowerCase();
144
+ if (FEATURE_NAME_PATTERNS[basename]) {
145
+ return FEATURE_NAME_PATTERNS[basename];
146
+ }
147
+ // Check for compound names (e.g., LoginPage -> login -> auth)
148
+ for (const [pattern, feature] of Object.entries(FEATURE_NAME_PATTERNS)) {
149
+ if (basename.includes(pattern)) {
150
+ return feature;
151
+ }
152
+ }
153
+ return null;
154
+ }
155
+ /**
156
+ * Detect feature from route path
157
+ */
158
+ export function detectFeatureFromRoute(routePath) {
159
+ const normalized = routePath.toLowerCase().split(':')[0].replace(/\/$/, '');
160
+ for (const [route, feature] of Object.entries(ROUTE_FEATURE_MAP)) {
161
+ if (normalized === route || normalized.startsWith(route + '/')) {
162
+ return feature;
163
+ }
164
+ }
165
+ return null;
166
+ }
167
+ /**
168
+ * Cluster files by their import relationships to detect features
169
+ */
170
+ export async function detectFeaturesByImportClustering(rootDir) {
171
+ const srcPath = path.join(rootDir, 'src');
172
+ const files = await findSourceFiles(srcPath);
173
+ const graph = await buildImportGraph(srcPath);
174
+ const features = {};
175
+ const visited = new Set();
176
+ for (const file of files) {
177
+ if (visited.has(file))
178
+ continue;
179
+ const feature = detectFeatureFromPath(file, srcPath);
180
+ if (!feature)
181
+ continue;
182
+ if (!features[feature]) {
183
+ features[feature] = [];
184
+ }
185
+ // Add file and its closely related files (direct imports)
186
+ features[feature].push(file);
187
+ visited.add(file);
188
+ const imports = graph[file]?.imports || [];
189
+ for (const imp of imports) {
190
+ const resolved = resolveImportPath(file, imp.source, srcPath, files);
191
+ if (resolved && !visited.has(resolved)) {
192
+ const relResolved = path.relative(srcPath, resolved);
193
+ // Only add if it's a component or page (not utils/config)
194
+ const basename = path.basename(resolved, path.extname(resolved));
195
+ if (/^[A-Z]/.test(basename) || basename.includes('page') || basename.includes('Page')) {
196
+ features[feature].push(resolved);
197
+ visited.add(resolved);
198
+ }
199
+ }
200
+ }
201
+ }
202
+ return features;
203
+ }
204
+ /**
205
+ * Extract route paths from routing files
206
+ */
207
+ export async function extractRoutePaths(rootDir) {
208
+ const srcPath = path.join(rootDir, 'src');
209
+ const files = await findSourceFiles(srcPath);
210
+ const routes = [];
211
+ for (const file of files) {
212
+ const content = readFileContent(file);
213
+ if (!content)
214
+ continue;
215
+ // Match Route path="..." patterns
216
+ const routeMatches = content.matchAll(/<Route\s+[^>]*path\s*=\s*["']([^"']+)["'][^>]*>/g);
217
+ for (const match of routeMatches) {
218
+ const routePath = match[1];
219
+ // Try to extract component name
220
+ const componentMatch = match[0].match(/component\s*=\s*\{?(\w+)\}?/);
221
+ const elementMatch = match[0].match(/element\s*=\s*\{<(\w+)/);
222
+ const component = componentMatch?.[1] || elementMatch?.[1] || 'Unknown';
223
+ routes.push({ path: routePath, component });
224
+ }
225
+ // Also match createBrowserRouter patterns
226
+ const createRouteMatches = content.matchAll(/path:\s*["']([^"']+)["']/g);
227
+ for (const match of createRouteMatches) {
228
+ routes.push({ path: match[1], component: 'Route' });
229
+ }
230
+ }
231
+ return routes;
232
+ }
233
+ // ============================================================================
234
+ // FILE CLASSIFICATION
235
+ // ============================================================================
236
+ /**
237
+ * Classify a file type based on its path and content
238
+ */
239
+ export function classifyFileType(filePath, rootDir) {
240
+ const relPath = path.relative(rootDir, filePath).toLowerCase();
241
+ const basename = path.basename(filePath).toLowerCase();
242
+ const ext = path.extname(filePath).toLowerCase();
243
+ // Config files
244
+ if (basename.includes('config') ||
245
+ basename.includes('.env') ||
246
+ basename === 'constants.ts' ||
247
+ basename === 'constants.js' ||
248
+ basename === 'types.ts' ||
249
+ basename === 'types.js' ||
250
+ relPath.includes('/config/') ||
251
+ relPath.includes('/constants/') ||
252
+ relPath.includes('/types/')) {
253
+ return 'config';
254
+ }
255
+ // Utility files
256
+ if (basename.includes('util') ||
257
+ basename.includes('helper') ||
258
+ basename.includes('common') ||
259
+ basename.includes('lib') ||
260
+ basename.includes('service') ||
261
+ basename.includes('api') ||
262
+ relPath.includes('/utils/') ||
263
+ relPath.includes('/util/') ||
264
+ relPath.includes('/helpers/') ||
265
+ relPath.includes('/lib/') ||
266
+ relPath.includes('/services/') ||
267
+ relPath.includes('/api/')) {
268
+ return 'utility';
269
+ }
270
+ // Shared components (in root src/components or similar)
271
+ const pathParts = relPath.split('/');
272
+ if ((pathParts.includes('components') && pathParts.length <= 3) ||
273
+ (pathParts.includes('ui') && pathParts.length <= 3) ||
274
+ (pathParts.includes('shared') && pathParts.length <= 3) ||
275
+ (pathParts.includes('common') && pathParts.length <= 3)) {
276
+ return 'shared';
277
+ }
278
+ // Everything else in a feature-like folder is feature-specific
279
+ return 'feature';
280
+ }
281
+ // ============================================================================
282
+ // STRUCTURE DESIGN
283
+ // ============================================================================
284
+ /**
285
+ * Standard subdirectories for each feature
286
+ */
287
+ export const FEATURE_SUBDIRS = ['components', 'hooks', 'api', 'pages', 'types', 'utils'];
288
+ /**
289
+ * Standard shared layer directories
290
+ */
291
+ export const SHARED_DIRS = ['components', 'hooks', 'utils', 'types', 'lib', 'styles'];
292
+ /**
293
+ * Standard app-level directories
294
+ */
295
+ export const APP_DIRS = ['router', 'store', 'providers'];
296
+ /**
297
+ * Generate target path for a file based on its classification
298
+ */
299
+ export function generateTargetPath(filePath, rootDir, features, featureMap) {
300
+ const relPath = path.relative(rootDir, filePath);
301
+ const basename = path.basename(filePath);
302
+ const dirname = path.dirname(relPath);
303
+ // Determine classification
304
+ const feature = detectFeatureFromPath(filePath, rootDir);
305
+ if (feature && features.includes(feature)) {
306
+ // Feature-specific file
307
+ const subdir = getFeatureSubdir(filePath);
308
+ return path.join('src', 'features', feature, subdir, basename);
309
+ }
310
+ // Check if it's a utility
311
+ if (classifyFileType(filePath, rootDir) === 'utility') {
312
+ return path.join('src', 'shared', 'utils', basename);
313
+ }
314
+ // Check if it's config
315
+ if (classifyFileType(filePath, rootDir) === 'config') {
316
+ return path.join('src', 'shared', 'types', basename);
317
+ }
318
+ // Shared component
319
+ if (classifyFileType(filePath, rootDir) === 'shared') {
320
+ return path.join('src', 'shared', 'components', basename);
321
+ }
322
+ // Default to shared/components
323
+ return path.join('src', 'shared', 'components', basename);
324
+ }
325
+ /**
326
+ * Determine which feature subdirectory a file belongs to
327
+ */
328
+ function getFeatureSubdir(filePath) {
329
+ const basename = path.basename(filePath, path.extname(filePath)).toLowerCase();
330
+ const dirname = path.dirname(filePath).toLowerCase();
331
+ if (basename.includes('hook') || /^use[A-Z]/.test(basename)) {
332
+ return 'hooks';
333
+ }
334
+ if (basename.includes('api') || basename.includes('service') || dirname.includes('/api/')) {
335
+ return 'api';
336
+ }
337
+ if (basename.includes('page') || basename.includes('view') || basename.includes('screen')) {
338
+ return 'pages';
339
+ }
340
+ if (basename.includes('type') || dirname.includes('/types/')) {
341
+ return 'types';
342
+ }
343
+ return 'components';
344
+ }
345
+ // ============================================================================
346
+ // NAMING CONVENTIONS
347
+ // ============================================================================
348
+ /**
349
+ * Convert string to kebab-case
350
+ */
351
+ export function toKebabCase(str) {
352
+ return str
353
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
354
+ .replace(/[\s_]+/g, '-')
355
+ .toLowerCase();
356
+ }
357
+ /**
358
+ * Convert string to PascalCase
359
+ */
360
+ export function toPascalCase(str) {
361
+ return str
362
+ .replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))
363
+ .replace(/^(.)/, (_, c) => c.toUpperCase());
364
+ }
365
+ /**
366
+ * Convert string to camelCase
367
+ */
368
+ export function toCamelCase(str) {
369
+ const pascal = toPascalCase(str);
370
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
371
+ }
372
+ /**
373
+ * Detect current naming convention of a file
374
+ */
375
+ export function detectNamingConvention(filePath) {
376
+ const basename = path.basename(filePath, path.extname(filePath));
377
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(basename))
378
+ return 'PascalCase';
379
+ if (/^[a-z][a-zA-Z0-9]*$/.test(basename))
380
+ return 'camelCase';
381
+ if (/^[A-Z_][A-Z0-9_]*$/.test(basename))
382
+ return 'SCREAMING_SNAKE';
383
+ if (basename.includes('_') && /^[a-z]/.test(basename))
384
+ return 'snake_case';
385
+ if (basename.includes('-'))
386
+ return 'kebab-case';
387
+ return 'camelCase';
388
+ }
389
+ /**
390
+ * Suggest better name for a file based on its content and context
391
+ */
392
+ export function suggestFileName(filePath, content) {
393
+ const basename = path.basename(filePath, path.extname(filePath));
394
+ const ext = path.extname(filePath);
395
+ // Generic names that should be renamed
396
+ const genericNames = ['index', 'utils', 'helpers', 'common', 'lib', 'misc', 'stuff', 'temp', 'untitled', 'test'];
397
+ if (!genericNames.includes(basename.toLowerCase())) {
398
+ return null; // Name is already specific
399
+ }
400
+ // Try to extract a meaningful name from exports
401
+ const exportMatch = content.match(/export\s+(default\s+)?(function|const|class)\s+(\w+)/);
402
+ if (exportMatch) {
403
+ return exportMatch[3] + ext;
404
+ }
405
+ // Try from default export
406
+ const defaultExportMatch = content.match(/export\s+default\s+(\w+)/);
407
+ if (defaultExportMatch) {
408
+ return defaultExportMatch[1] + ext;
409
+ }
410
+ return null;
411
+ }
412
+ // ============================================================================
413
+ // BOUNDARY DETECTION
414
+ // ============================================================================
415
+ /**
416
+ * Get the feature a file belongs to based on its path
417
+ */
418
+ export function getFileFeature(filePath, rootDir) {
419
+ const relPath = path.relative(rootDir, filePath);
420
+ const parts = relPath.split(path.sep);
421
+ // Check if it's in a features folder
422
+ const featuresIdx = parts.indexOf('features');
423
+ if (featuresIdx !== -1 && parts.length > featuresIdx + 1) {
424
+ return parts[featuresIdx + 1];
425
+ }
426
+ // Check top-level folder as feature
427
+ if (parts.length >= 2) {
428
+ const topFolder = parts[1].toLowerCase();
429
+ if (FEATURE_NAME_PATTERNS[topFolder]) {
430
+ return FEATURE_NAME_PATTERNS[topFolder];
431
+ }
432
+ }
433
+ return null;
434
+ }
435
+ /**
436
+ * Check if an import crosses feature boundaries
437
+ */
438
+ export function isCrossFeatureImport(fromFile, importSource, rootDir, allFiles) {
439
+ const fromFeature = getFileFeature(fromFile, rootDir);
440
+ if (!fromFeature)
441
+ return false;
442
+ const resolved = resolveImportPath(fromFile, importSource, rootDir, allFiles);
443
+ if (!resolved)
444
+ return false;
445
+ const toFeature = getFileFeature(resolved, rootDir);
446
+ if (!toFeature)
447
+ return false;
448
+ return fromFeature !== toFeature;
449
+ }
450
+ /**
451
+ * Calculate import depth (number of ../ traversals)
452
+ */
453
+ export function getImportDepth(importSource) {
454
+ if (!importSource.startsWith('.'))
455
+ return 0;
456
+ return (importSource.match(/\.\.\//g) || []).length;
457
+ }
458
+ /**
459
+ * Check if files are tightly coupled (mutual imports with many connections)
460
+ */
461
+ export function areTightlyCoupled(graph, fileA, fileB, threshold = 3) {
462
+ const aImportsB = graph[fileA]?.imports.some((imp) => imp.source.includes(path.basename(fileB, path.extname(fileB))));
463
+ const bImportsA = graph[fileB]?.imports.some((imp) => imp.source.includes(path.basename(fileA, path.extname(fileA))));
464
+ if (!aImportsB && !bImportsA)
465
+ return false;
466
+ // Count total imports for each
467
+ const aImportCount = graph[fileA]?.imports.length || 0;
468
+ const bImportCount = graph[fileB]?.imports.length || 0;
469
+ // If they import each other and have few other imports, they're tightly coupled
470
+ return aImportsB && bImportsA && (aImportCount <= threshold || bImportCount <= threshold);
471
+ }
472
+ // ============================================================================
473
+ // MODULE SPLITTING
474
+ // ============================================================================
475
+ /**
476
+ * Detect if a file is a "kitchen sink" utility file
477
+ */
478
+ export function isKitchenSinkFile(filePath) {
479
+ const basename = path.basename(filePath, path.extname(filePath)).toLowerCase();
480
+ const genericNames = ['utils', 'helpers', 'common', 'lib', 'misc', 'index', 'util', 'helper'];
481
+ return genericNames.includes(basename);
482
+ }
483
+ /**
484
+ * Suggest splits for a utility file based on exported functions
485
+ */
486
+ export function suggestUtilitySplits(filePath, content) {
487
+ const categories = {
488
+ date: [],
489
+ string: [],
490
+ validation: [],
491
+ formatting: [],
492
+ array: [],
493
+ object: [],
494
+ network: [],
495
+ storage: [],
496
+ dom: [],
497
+ other: [],
498
+ };
499
+ // Extract exported function names
500
+ const exportMatches = content.matchAll(/export\s+(const|function)\s+(\w+)/g);
501
+ for (const match of exportMatches) {
502
+ const name = match[2].toLowerCase();
503
+ if (name.includes('date') || name.includes('time') || name.includes('format') && name.includes('date')) {
504
+ categories.date.push(match[2]);
505
+ }
506
+ else if (name.includes('format') || name.includes('parse') || name.includes('convert')) {
507
+ categories.formatting.push(match[2]);
508
+ }
509
+ else if (name.includes('valid') || name.includes('check') || name.includes('verify') || name.includes('is')) {
510
+ categories.validation.push(match[2]);
511
+ }
512
+ else if (name.includes('trim') || name.includes('capitalize') || name.includes('slug') || name.includes('string') || name.includes('text')) {
513
+ categories.string.push(match[2]);
514
+ }
515
+ else if (name.includes('sort') || name.includes('filter') || name.includes('map') || name.includes('reduce') || name.includes('group') || name.includes('unique')) {
516
+ categories.array.push(match[2]);
517
+ }
518
+ else if (name.includes('merge') || name.includes('clone') || name.includes('pick') || name.includes('omit') || name.includes('get') || name.includes('set')) {
519
+ categories.object.push(match[2]);
520
+ }
521
+ else if (name.includes('fetch') || name.includes('request') || name.includes('api') || name.includes('http')) {
522
+ categories.network.push(match[2]);
523
+ }
524
+ else if (name.includes('store') || name.includes('cache') || name.includes('local') || name.includes('session') || name.includes('cookie')) {
525
+ categories.storage.push(match[2]);
526
+ }
527
+ else if (name.includes('dom') || name.includes('element') || name.includes('scroll') || name.includes('resize') || name.includes('event')) {
528
+ categories.dom.push(match[2]);
529
+ }
530
+ else {
531
+ categories.other.push(match[2]);
532
+ }
533
+ }
534
+ return Object.entries(categories)
535
+ .filter(([, funcs]) => funcs.length > 0)
536
+ .map(([category, funcs]) => ({ category, functions: funcs }));
537
+ }
538
+ //# sourceMappingURL=refactor-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-helpers.js","sourceRoot":"","sources":["../../src/utils/refactor-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@mcp-showcase/legacy-analyzer",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./build/index.js",
6
+ "scripts": {
7
+ "build": "tsc && chmod +x build/index.js",
8
+ "dev": "tsc --watch",
9
+ "test": "vitest run"
10
+ },
11
+ "dependencies": {
12
+ "@mcp-showcase/shared": "*",
13
+ "@modelcontextprotocol/sdk": "^1.12.0"
14
+ },
15
+ "devDependencies": {
16
+ "@types/node": "^20.0.0",
17
+ "typescript": "^5.0.0",
18
+ "vitest": "^2.0.0"
19
+ }
20
+ }
@@ -0,0 +1,45 @@
1
+ # lighthouse-runner
2
+
3
+ MCP server for web performance and SEO auditing — static HTML analysis plus Lighthouse CLI integration.
4
+
5
+ ## Tools
6
+
7
+ | Tool | What it does |
8
+ |---|---|
9
+ | `static_audit` | Score an HTML file: title, viewport, meta description, OG tags, canonical, JSON-LD, a11y landmarks |
10
+ | `run_lighthouse` | Run Lighthouse CLI against a live URL (requires Lighthouse installed globally) |
11
+ | `collect_metrics` | Extract Core Web Vitals from a Lighthouse JSON report |
12
+ | `compare_audits` | Diff two Lighthouse runs to track score changes |
13
+
14
+ ## Static audit checks
15
+
16
+ | Check | Deduction |
17
+ |---|---|
18
+ | Missing `<title>` | -10 |
19
+ | Missing `name="viewport"` | -10 |
20
+ | Missing `name="description"` | -5 |
21
+ | Missing `lang` attribute | -5 |
22
+ | Images without `alt` | -5 each |
23
+ | Render-blocking `<script>` (no defer/async) | -10 |
24
+ | Missing canonical URL | -3 |
25
+ | Missing Open Graph tags | -3 |
26
+ | Missing Twitter Card tags | -2 |
27
+ | Missing charset | -3 |
28
+ | No semantic landmarks | -5 |
29
+ | No JSON-LD structured data | -2 |
30
+ | Missing `theme-color` | -1 |
31
+
32
+ ## Usage
33
+
34
+ ```sh
35
+ # Audit a local HTML file
36
+ echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"static_audit","arguments":{"path":"/path/to/index.html"}}}' \
37
+ | node build/index.js
38
+ ```
39
+
40
+ ## Build & test
41
+
42
+ ```sh
43
+ npm run build
44
+ npm test
45
+ ```
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ export declare function analyzeHtmlFile(filePath: string): {
3
+ score: number;
4
+ issues: string[];
5
+ };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AA2FA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAyFrF"}