mcp-react-toolkit 1.0.1 → 1.3.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 (275) hide show
  1. package/README.md +194 -44
  2. package/bin/cli.mjs +59 -0
  3. package/node_modules/@mcp-showcase/shared/build/McpServerBase.d.ts +18 -0
  4. package/node_modules/@mcp-showcase/shared/build/McpServerBase.d.ts.map +1 -0
  5. package/node_modules/@mcp-showcase/shared/build/McpServerBase.js +74 -0
  6. package/node_modules/@mcp-showcase/shared/build/McpServerBase.js.map +1 -0
  7. package/node_modules/@mcp-showcase/shared/build/ToolRegistry.d.ts +9 -0
  8. package/node_modules/@mcp-showcase/shared/build/ToolRegistry.d.ts.map +1 -0
  9. package/node_modules/@mcp-showcase/shared/build/ToolRegistry.js +22 -0
  10. package/node_modules/@mcp-showcase/shared/build/ToolRegistry.js.map +1 -0
  11. package/node_modules/@mcp-showcase/shared/build/fs.d.ts +8 -0
  12. package/node_modules/@mcp-showcase/shared/build/fs.d.ts.map +1 -0
  13. package/node_modules/@mcp-showcase/shared/build/fs.js +45 -0
  14. package/node_modules/@mcp-showcase/shared/build/fs.js.map +1 -0
  15. package/node_modules/@mcp-showcase/shared/build/index.d.ts +5 -0
  16. package/node_modules/@mcp-showcase/shared/build/index.d.ts.map +1 -0
  17. package/node_modules/@mcp-showcase/shared/build/index.js +5 -0
  18. package/node_modules/@mcp-showcase/shared/build/index.js.map +1 -0
  19. package/node_modules/@mcp-showcase/shared/build/types.d.ts +36 -0
  20. package/node_modules/@mcp-showcase/shared/build/types.d.ts.map +1 -0
  21. package/node_modules/@mcp-showcase/shared/build/types.js +5 -0
  22. package/node_modules/@mcp-showcase/shared/build/types.js.map +1 -0
  23. package/node_modules/@mcp-showcase/shared/package.json +24 -0
  24. package/node_modules/@mcp-showcase/shared/src/McpServerBase.ts +100 -0
  25. package/node_modules/@mcp-showcase/shared/src/ToolRegistry.ts +38 -0
  26. package/node_modules/@mcp-showcase/shared/src/fs.ts +49 -0
  27. package/node_modules/@mcp-showcase/shared/src/index.ts +12 -0
  28. package/node_modules/@mcp-showcase/shared/src/types.ts +44 -0
  29. package/node_modules/@mcp-showcase/shared/tsconfig.json +8 -0
  30. package/package.json +38 -4
  31. package/tools/accessibility-checker/build/index.js +9 -5
  32. package/tools/accessibility-checker/build/index.js.map +1 -1
  33. package/tools/accessibility-checker/build/rules.d.ts.map +1 -1
  34. package/tools/accessibility-checker/build/rules.js +325 -94
  35. package/tools/accessibility-checker/build/rules.js.map +1 -1
  36. package/tools/code-modernizer/build/tools/01-convert-to-typescript.d.ts.map +1 -1
  37. package/tools/code-modernizer/build/tools/01-convert-to-typescript.js +65 -50
  38. package/tools/code-modernizer/build/tools/01-convert-to-typescript.js.map +1 -1
  39. package/tools/code-modernizer/build/types.d.ts +1 -0
  40. package/tools/code-modernizer/build/types.d.ts.map +1 -1
  41. package/tools/code-modernizer/build/utils/ast-parser.d.ts.map +1 -1
  42. package/tools/code-modernizer/build/utils/ast-parser.js +30 -14
  43. package/tools/code-modernizer/build/utils/ast-parser.js.map +1 -1
  44. package/tools/code-modernizer/build/utils/type-generator.d.ts +1 -1
  45. package/tools/code-modernizer/build/utils/type-generator.d.ts.map +1 -1
  46. package/tools/code-modernizer/build/utils/type-generator.js +72 -23
  47. package/tools/code-modernizer/build/utils/type-generator.js.map +1 -1
  48. package/tools/component-factory/build/index.js +59 -7
  49. package/tools/component-factory/build/index.js.map +1 -1
  50. package/tools/component-fixer/README.md +44 -0
  51. package/tools/component-fixer/build/index.d.ts +3 -0
  52. package/tools/component-fixer/build/index.d.ts.map +1 -0
  53. package/tools/component-fixer/build/index.js +647 -0
  54. package/tools/component-fixer/build/index.js.map +1 -0
  55. package/tools/component-fixer/package.json +20 -0
  56. package/tools/component-reviewer/README.md +54 -0
  57. package/tools/component-reviewer/build/index.d.ts +39 -0
  58. package/tools/component-reviewer/build/index.d.ts.map +1 -0
  59. package/tools/component-reviewer/build/index.js +946 -0
  60. package/tools/component-reviewer/build/index.js.map +1 -0
  61. package/tools/component-reviewer/package.json +20 -0
  62. package/tools/dep-auditor/build/index.d.ts +1 -0
  63. package/tools/dep-auditor/build/index.d.ts.map +1 -1
  64. package/tools/dep-auditor/build/index.js +71 -16
  65. package/tools/dep-auditor/build/index.js.map +1 -1
  66. package/tools/generate-tests/build/analyzer.d.ts +14 -0
  67. package/tools/generate-tests/build/analyzer.d.ts.map +1 -1
  68. package/tools/generate-tests/build/analyzer.js +96 -42
  69. package/tools/generate-tests/build/analyzer.js.map +1 -1
  70. package/tools/generate-tests/build/generators.d.ts.map +1 -1
  71. package/tools/generate-tests/build/generators.js +304 -79
  72. package/tools/generate-tests/build/generators.js.map +1 -1
  73. package/tools/generate-tests/build/index.js +29 -10
  74. package/tools/generate-tests/build/index.js.map +1 -1
  75. package/tools/json-viewer/build/index.js +29 -6
  76. package/tools/json-viewer/build/index.js.map +1 -1
  77. package/tools/legacy-analyzer/README.md +66 -0
  78. package/tools/legacy-analyzer/build/index.d.ts +3 -0
  79. package/tools/legacy-analyzer/build/index.d.ts.map +1 -0
  80. package/tools/legacy-analyzer/build/index.js +209 -0
  81. package/tools/legacy-analyzer/build/index.js.map +1 -0
  82. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts +3 -0
  83. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts.map +1 -0
  84. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js +115 -0
  85. package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js.map +1 -0
  86. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts +3 -0
  87. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts.map +1 -0
  88. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js +85 -0
  89. package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js.map +1 -0
  90. package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts +3 -0
  91. package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts.map +1 -0
  92. package/tools/legacy-analyzer/build/tools/03-analyze-components.js +87 -0
  93. package/tools/legacy-analyzer/build/tools/03-analyze-components.js.map +1 -0
  94. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts +3 -0
  95. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts.map +1 -0
  96. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js +133 -0
  97. package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js.map +1 -0
  98. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts +3 -0
  99. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts.map +1 -0
  100. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js +160 -0
  101. package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js.map +1 -0
  102. package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts +3 -0
  103. package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts.map +1 -0
  104. package/tools/legacy-analyzer/build/tools/06-analyze-routing.js +150 -0
  105. package/tools/legacy-analyzer/build/tools/06-analyze-routing.js.map +1 -0
  106. package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts +3 -0
  107. package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts.map +1 -0
  108. package/tools/legacy-analyzer/build/tools/07-analyze-styling.js +131 -0
  109. package/tools/legacy-analyzer/build/tools/07-analyze-styling.js.map +1 -0
  110. package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts +3 -0
  111. package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts.map +1 -0
  112. package/tools/legacy-analyzer/build/tools/08-analyze-assets.js +85 -0
  113. package/tools/legacy-analyzer/build/tools/08-analyze-assets.js.map +1 -0
  114. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts +3 -0
  115. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts.map +1 -0
  116. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js +329 -0
  117. package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js.map +1 -0
  118. package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts +3 -0
  119. package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts.map +1 -0
  120. package/tools/legacy-analyzer/build/tools/10-detect-duplication.js +192 -0
  121. package/tools/legacy-analyzer/build/tools/10-detect-duplication.js.map +1 -0
  122. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts +3 -0
  123. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts.map +1 -0
  124. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js +232 -0
  125. package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js.map +1 -0
  126. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts +3 -0
  127. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts.map +1 -0
  128. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js +247 -0
  129. package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js.map +1 -0
  130. package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts +3 -0
  131. package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts.map +1 -0
  132. package/tools/legacy-analyzer/build/tools/13-detect-features.js +141 -0
  133. package/tools/legacy-analyzer/build/tools/13-detect-features.js.map +1 -0
  134. package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts +3 -0
  135. package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts.map +1 -0
  136. package/tools/legacy-analyzer/build/tools/14-classify-files.js +76 -0
  137. package/tools/legacy-analyzer/build/tools/14-classify-files.js.map +1 -0
  138. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts +3 -0
  139. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts.map +1 -0
  140. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js +70 -0
  141. package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js.map +1 -0
  142. package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts +3 -0
  143. package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts.map +1 -0
  144. package/tools/legacy-analyzer/build/tools/16-design-target-structure.js +26 -0
  145. package/tools/legacy-analyzer/build/tools/16-design-target-structure.js.map +1 -0
  146. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts +3 -0
  147. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts.map +1 -0
  148. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js +108 -0
  149. package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js.map +1 -0
  150. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts +3 -0
  151. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts.map +1 -0
  152. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js +137 -0
  153. package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js.map +1 -0
  154. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts +3 -0
  155. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts.map +1 -0
  156. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js +160 -0
  157. package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js.map +1 -0
  158. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts +3 -0
  159. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts.map +1 -0
  160. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js +162 -0
  161. package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js.map +1 -0
  162. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts +3 -0
  163. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts.map +1 -0
  164. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js +108 -0
  165. package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js.map +1 -0
  166. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts +3 -0
  167. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts.map +1 -0
  168. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js +98 -0
  169. package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js.map +1 -0
  170. package/tools/legacy-analyzer/build/types.d.ts +413 -0
  171. package/tools/legacy-analyzer/build/types.d.ts.map +1 -0
  172. package/tools/legacy-analyzer/build/types.js +12 -0
  173. package/tools/legacy-analyzer/build/types.js.map +1 -0
  174. package/tools/legacy-analyzer/build/utils/ast-parser.d.ts +34 -0
  175. package/tools/legacy-analyzer/build/utils/ast-parser.d.ts.map +1 -0
  176. package/tools/legacy-analyzer/build/utils/ast-parser.js +394 -0
  177. package/tools/legacy-analyzer/build/utils/ast-parser.js.map +1 -0
  178. package/tools/legacy-analyzer/build/utils/file-scanner.d.ts +51 -0
  179. package/tools/legacy-analyzer/build/utils/file-scanner.d.ts.map +1 -0
  180. package/tools/legacy-analyzer/build/utils/file-scanner.js +174 -0
  181. package/tools/legacy-analyzer/build/utils/file-scanner.js.map +1 -0
  182. package/tools/legacy-analyzer/build/utils/import-tracker.d.ts +38 -0
  183. package/tools/legacy-analyzer/build/utils/import-tracker.d.ts.map +1 -0
  184. package/tools/legacy-analyzer/build/utils/import-tracker.js +194 -0
  185. package/tools/legacy-analyzer/build/utils/import-tracker.js.map +1 -0
  186. package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts +88 -0
  187. package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts.map +1 -0
  188. package/tools/legacy-analyzer/build/utils/refactor-helpers.js +538 -0
  189. package/tools/legacy-analyzer/build/utils/refactor-helpers.js.map +1 -0
  190. package/tools/legacy-analyzer/package.json +20 -0
  191. package/tools/lighthouse-runner/README.md +45 -0
  192. package/tools/lighthouse-runner/build/index.d.ts +6 -0
  193. package/tools/lighthouse-runner/build/index.d.ts.map +1 -0
  194. package/tools/lighthouse-runner/build/index.js +295 -0
  195. package/tools/lighthouse-runner/build/index.js.map +1 -0
  196. package/tools/lighthouse-runner/package.json +20 -0
  197. package/tools/monorepo-manager/build/utils.d.ts.map +1 -1
  198. package/tools/monorepo-manager/build/utils.js +12 -9
  199. package/tools/monorepo-manager/build/utils.js.map +1 -1
  200. package/tools/performance-audit/README.md +37 -0
  201. package/tools/performance-audit/build/index.d.ts +13 -0
  202. package/tools/performance-audit/build/index.d.ts.map +1 -0
  203. package/tools/performance-audit/build/index.js +311 -0
  204. package/tools/performance-audit/build/index.js.map +1 -0
  205. package/tools/performance-audit/package.json +20 -0
  206. package/tools/quality-pipeline/build/index.js +55 -15
  207. package/tools/quality-pipeline/build/index.js.map +1 -1
  208. package/tools/render-analyzer/README.md +43 -0
  209. package/tools/render-analyzer/build/index.d.ts +25 -0
  210. package/tools/render-analyzer/build/index.d.ts.map +1 -0
  211. package/tools/render-analyzer/build/index.js +342 -0
  212. package/tools/render-analyzer/build/index.js.map +1 -0
  213. package/tools/render-analyzer/package.json +20 -0
  214. package/tools/shared/build/fs.d.ts +8 -0
  215. package/tools/shared/build/fs.d.ts.map +1 -0
  216. package/tools/shared/build/fs.js +45 -0
  217. package/tools/shared/build/fs.js.map +1 -0
  218. package/tools/shared/build/index.d.ts +1 -0
  219. package/tools/shared/build/index.d.ts.map +1 -1
  220. package/tools/shared/build/index.js +1 -0
  221. package/tools/shared/build/index.js.map +1 -1
  222. package/tools/shared/package.json +2 -1
  223. package/tools/storybook-generator/README.md +39 -0
  224. package/tools/storybook-generator/build/index.d.ts +13 -0
  225. package/tools/storybook-generator/build/index.d.ts.map +1 -0
  226. package/tools/storybook-generator/build/index.js +478 -0
  227. package/tools/storybook-generator/build/index.js.map +1 -0
  228. package/tools/storybook-generator/package.json +20 -0
  229. package/tools/test-gap-analyzer/README.md +41 -0
  230. package/tools/test-gap-analyzer/build/index.d.ts +20 -0
  231. package/tools/test-gap-analyzer/build/index.d.ts.map +1 -0
  232. package/tools/test-gap-analyzer/build/index.js +371 -0
  233. package/tools/test-gap-analyzer/build/index.js.map +1 -0
  234. package/tools/test-gap-analyzer/package.json +20 -0
  235. package/tools/typescript-enforcer/build/scanner.d.ts.map +1 -1
  236. package/tools/typescript-enforcer/build/scanner.js +13 -1
  237. package/tools/typescript-enforcer/build/scanner.js.map +1 -1
  238. package/tools/typescript-enforcer/build/types.d.ts +1 -0
  239. package/tools/typescript-enforcer/build/types.d.ts.map +1 -1
  240. package/CONTRIBUTING.md +0 -157
  241. package/demo/legacy-app/src/App.jsx +0 -12
  242. package/demo/legacy-app/src/components/Dashboard.jsx +0 -51
  243. package/demo/legacy-app/src/components/UserCard.jsx +0 -32
  244. package/demo/legacy-app/src/hooks/useUsers.js +0 -38
  245. package/demo/legacy-app/src/utils/api.js +0 -30
  246. package/glama.json +0 -4
  247. package/mcp-publisher +0 -0
  248. package/server.json +0 -20
  249. package/tools/accessibility-checker/build/rules.test.d.ts +0 -2
  250. package/tools/accessibility-checker/build/rules.test.d.ts.map +0 -1
  251. package/tools/accessibility-checker/build/rules.test.js.map +0 -1
  252. package/tools/code-modernizer/build/utils/file-ops.test.d.ts +0 -2
  253. package/tools/code-modernizer/build/utils/file-ops.test.d.ts.map +0 -1
  254. package/tools/code-modernizer/build/utils/file-ops.test.js.map +0 -1
  255. package/tools/component-factory/build/utils.test.d.ts +0 -2
  256. package/tools/component-factory/build/utils.test.d.ts.map +0 -1
  257. package/tools/component-factory/build/utils.test.js.map +0 -1
  258. package/tools/dep-auditor/build/index.test.d.ts +0 -2
  259. package/tools/dep-auditor/build/index.test.d.ts.map +0 -1
  260. package/tools/dep-auditor/build/index.test.js.map +0 -1
  261. package/tools/generate-tests/build/analyzer.test.d.ts +0 -2
  262. package/tools/generate-tests/build/analyzer.test.d.ts.map +0 -1
  263. package/tools/generate-tests/build/analyzer.test.js.map +0 -1
  264. package/tools/json-viewer/build/utils.test.d.ts +0 -2
  265. package/tools/json-viewer/build/utils.test.d.ts.map +0 -1
  266. package/tools/json-viewer/build/utils.test.js.map +0 -1
  267. package/tools/monorepo-manager/build/utils.test.d.ts +0 -2
  268. package/tools/monorepo-manager/build/utils.test.d.ts.map +0 -1
  269. package/tools/monorepo-manager/build/utils.test.js.map +0 -1
  270. package/tools/quality-pipeline/build/utils.test.d.ts +0 -2
  271. package/tools/quality-pipeline/build/utils.test.d.ts.map +0 -1
  272. package/tools/quality-pipeline/build/utils.test.js.map +0 -1
  273. package/tools/typescript-enforcer/build/scanner.test.d.ts +0 -2
  274. package/tools/typescript-enforcer/build/scanner.test.d.ts.map +0 -1
  275. package/tools/typescript-enforcer/build/scanner.test.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { McpServerBase } from '@mcp-showcase/shared';
2
+ import { McpServerBase, safeReadJson } from '@mcp-showcase/shared';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import * as os from 'os';
@@ -176,6 +176,28 @@ class JsonViewerServer extends McpServerBase {
176
176
  },
177
177
  required: ['data'],
178
178
  }, this.handleViewJson.bind(this));
179
+ this.addTool('view_json_file', 'Read a JSON file from disk and open an interactive HTML viewer — no need to paste raw JSON.', {
180
+ type: 'object',
181
+ properties: {
182
+ path: { type: 'string', description: 'Absolute or relative path to the JSON file' },
183
+ label: { type: 'string', description: 'Label for this viewer (defaults to the filename)' },
184
+ open: { type: 'boolean', description: 'Automatically open in browser (default: true)', default: true },
185
+ },
186
+ required: ['path'],
187
+ }, async (args) => {
188
+ const { path: filePath, label, open = true } = args;
189
+ try {
190
+ const resolved = path.resolve(filePath);
191
+ if (!fs.existsSync(resolved))
192
+ throw new Error(`File not found: ${resolved}`);
193
+ const raw = fs.readFileSync(resolved, 'utf-8');
194
+ const derivedLabel = label ?? path.basename(resolved);
195
+ return this.handleViewJson({ data: raw, label: derivedLabel, open });
196
+ }
197
+ catch (error) {
198
+ return this.error(error);
199
+ }
200
+ });
179
201
  this.addTool('list_responses', 'List all saved JSON responses with timestamps and metadata.', {
180
202
  type: 'object',
181
203
  properties: {
@@ -244,10 +266,9 @@ class JsonViewerServer extends McpServerBase {
244
266
  .sort().reverse().slice(0, limit);
245
267
  const responses = [];
246
268
  for (const file of files) {
247
- try {
248
- responses.push(JSON.parse(fs.readFileSync(path.join(RESPONSES_DIR, file), 'utf-8')));
249
- }
250
- catch { /* skip corrupted */ }
269
+ const entry = safeReadJson(path.join(RESPONSES_DIR, file));
270
+ if (entry)
271
+ responses.push(entry);
251
272
  }
252
273
  return this.success({ total: responses.length, responses });
253
274
  }
@@ -262,7 +283,9 @@ class JsonViewerServer extends McpServerBase {
262
283
  const metaPath = path.join(RESPONSES_DIR, `${id}.meta.json`);
263
284
  if (!fs.existsSync(metaPath))
264
285
  throw new Error(`Response not found: ${id}`);
265
- const meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
286
+ const meta = safeReadJson(metaPath);
287
+ if (!meta)
288
+ throw new Error(`Could not read metadata for: ${id}`);
266
289
  if (!fs.existsSync(meta.htmlPath))
267
290
  throw new Error(`HTML viewer not found for: ${id}`);
268
291
  const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ # legacy-analyzer
2
+
3
+ MCP server with 22 analysis sub-tools that produce a health score (0–100) and prioritized migration hints for any React-based app — CRA, Vite, Next.js (app or pages router), Remix, Gatsby.
4
+
5
+ ## Tools (22)
6
+
7
+ | Tool | What it does |
8
+ |---|---|
9
+ | `analyze-legacy-app` | Run all 22 tools and produce a unified health report |
10
+ | `detect-project-tech` | Detect React version, language, framework, major deps |
11
+ | `analyze-folder-structure` | Flat vs feature-based, standard folders, nesting depth |
12
+ | `analyze-components` | Count, large (>300L), complex (multiple responsibilities) |
13
+ | `analyze-state-management` | Redux, Context, Zustand, local state patterns |
14
+ | `analyze-api-layer` | HTTP clients, centralized vs scattered, duplicate endpoints |
15
+ | `analyze-routing` | Router library, flat vs nested, lazy loading |
16
+ | `analyze-styling` | CSS/SCSS/Tailwind, inline styles, hardcoded colors |
17
+ | `analyze-assets` | Large images/videos, assets inside src, unused assets |
18
+ | `detect-anti-patterns` | Prop drilling, tight coupling, god components, a11y |
19
+ | `detect-duplication` | Duplicate components (Jaccard similarity), duplicate utils |
20
+ | `analyze-dependencies-usage` | Import anti-patterns, UI package usage |
21
+ | `detect-features` | Identify logical domains via file names + import clustering |
22
+ | `classify-files` | Feature-specific vs shared vs utility vs config |
23
+ | `detect-shared-modules` | Files imported by multiple features |
24
+ | `design-target-structure` | Suggest scalable feature-based folder structure |
25
+ | `map-files-to-target` | Map current files to proposed structure |
26
+ | `detect-boundary-violations` | Cross-feature imports, deep relative imports |
27
+ | `suggest-module-splitting` | Split large/generic files into focused modules |
28
+ | `naming-standardizer` | Suggest consistent file and folder naming |
29
+ | `generate-refactor-plan` | Combine all outputs into a structured refactor plan |
30
+ | `refactor-folder-structure` | Aggregated restructure plan |
31
+
32
+ ## Usage
33
+
34
+ ```sh
35
+ # Full health audit
36
+ echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"analyze-legacy-app","arguments":{"path":"/path/to/your/app"}}}' \
37
+ | node build/index.js
38
+ ```
39
+
40
+ ## Output
41
+
42
+ ```json
43
+ {
44
+ "success": true,
45
+ "summary": { "healthScore": 72, "totalIssues": 18 },
46
+ "tech": { "framework": "Next.js", "reactVersion": "18", "language": "TypeScript" },
47
+ "migrationHints": [
48
+ { "priority": "high", "category": "API Layer", "description": "..." }
49
+ ]
50
+ }
51
+ ```
52
+
53
+ ## Framework support
54
+
55
+ Automatically detects the correct source directory:
56
+ - `src/` → CRA, Vite
57
+ - `app/` → Next.js App Router
58
+ - `pages/` → Next.js Pages Router
59
+ - root → bare React projects
60
+
61
+ ## Build & test
62
+
63
+ ```sh
64
+ npm run build
65
+ npm test
66
+ ```
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env node
2
+ import { McpServerBase } from '@mcp-showcase/shared';
3
+ import { detectProjectTech } from './tools/01-detect-project-tech.js';
4
+ import { analyzeFolderStructure } from './tools/02-analyze-folder-structure.js';
5
+ import { analyzeComponents } from './tools/03-analyze-components.js';
6
+ import { analyzeStateManagement } from './tools/04-analyze-state-management.js';
7
+ import { analyzeApiLayer } from './tools/05-analyze-api-layer.js';
8
+ import { analyzeRouting } from './tools/06-analyze-routing.js';
9
+ import { analyzeStyling } from './tools/07-analyze-styling.js';
10
+ import { analyzeAssets } from './tools/08-analyze-assets.js';
11
+ import { detectAntiPatterns } from './tools/09-detect-anti-patterns.js';
12
+ import { detectDuplication } from './tools/10-detect-duplication.js';
13
+ import { analyzeDependenciesUsage } from './tools/11-analyze-dependencies-usage.js';
14
+ import { analyzeLegacyApp } from './tools/12-analyze-legacy-app.js';
15
+ import { detectFeatures } from './tools/13-detect-features.js';
16
+ import { classifyFiles } from './tools/14-classify-files.js';
17
+ import { detectSharedModules } from './tools/15-detect-shared-modules.js';
18
+ import { designTargetStructure } from './tools/16-design-target-structure.js';
19
+ import { mapFilesToTarget } from './tools/17-map-files-to-target.js';
20
+ import { detectBoundaryViolations } from './tools/18-detect-boundary-violations.js';
21
+ import { suggestModuleSplitting } from './tools/19-suggest-module-splitting.js';
22
+ import { namingStandardizer } from './tools/20-naming-standardizer.js';
23
+ import { generateRefactorPlan } from './tools/21-generate-refactor-plan.js';
24
+ import { refactorFolderStructure } from './tools/22-refactor-folder-structure.js';
25
+ // ============================================================================
26
+ // TOOL DEFINITIONS
27
+ // ============================================================================
28
+ const CONFIG_SCHEMA = {
29
+ type: 'object',
30
+ description: 'Optional configuration overrides',
31
+ properties: {
32
+ largeComponentLines: { type: 'number', description: 'Line count threshold for large components (default: 300)' },
33
+ largeUtilLines: { type: 'number', description: 'Line count threshold for large utility files (default: 200)' },
34
+ largeAssetImageKB: { type: 'number', description: 'Size threshold in KB for large images (default: 100)' },
35
+ largeAssetVideoMB: { type: 'number', description: 'Size threshold in MB for large videos (default: 1)' },
36
+ propDrillingDepth: { type: 'number', description: 'Depth threshold for prop drilling detection (default: 3)' },
37
+ duplicationThreshold: { type: 'number', description: 'Similarity threshold 0-1 for duplication detection (default: 0.8)' },
38
+ },
39
+ };
40
+ const TOOLS = [
41
+ {
42
+ name: 'detect-project-tech',
43
+ description: 'Detect React version, language (JS/TS), framework (CRA/Vite/Next.js/Remix/Gatsby/React Native), and major dependencies',
44
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
45
+ },
46
+ {
47
+ name: 'analyze-folder-structure',
48
+ description: 'Analyze folder structure: flat vs feature-based, presence of standard folders, nesting depth',
49
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
50
+ },
51
+ {
52
+ name: 'analyze-components',
53
+ description: 'Scan all components: count, large components (>300 lines), complex components with multiple responsibilities',
54
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
55
+ },
56
+ {
57
+ name: 'analyze-state-management',
58
+ description: 'Detect Redux, Context API, local state patterns, normalized state, derived state, Reselect usage',
59
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
60
+ },
61
+ {
62
+ name: 'analyze-api-layer',
63
+ description: 'Detect HTTP client usage (axios/fetch/superagent/ky), Next.js API routes, centralized vs scattered pattern, endpoint duplication',
64
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
65
+ },
66
+ {
67
+ name: 'analyze-routing',
68
+ description: 'Detect react-router usage, route structure (flat vs nested), lazy loading usage',
69
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
70
+ },
71
+ {
72
+ name: 'analyze-styling',
73
+ description: 'Detect CSS/SCSS/Tailwind/styled-components, inline styles, hardcoded colors, duplicate classes',
74
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
75
+ },
76
+ {
77
+ name: 'analyze-assets',
78
+ description: 'Detect large images/videos, assets inside src, unused assets',
79
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
80
+ },
81
+ {
82
+ name: 'detect-anti-patterns',
83
+ description: 'Detect prop drilling, tight coupling, duplicated logic, large utility files, god components',
84
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
85
+ },
86
+ {
87
+ name: 'detect-duplication',
88
+ description: 'Detect duplicate components, duplicate utility functions, similar file structures',
89
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
90
+ },
91
+ {
92
+ name: 'analyze-dependencies-usage',
93
+ description: 'Deep analysis of external libraries, internal imports, UI package usage, import anti-patterns',
94
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
95
+ },
96
+ {
97
+ name: 'analyze-legacy-app',
98
+ description: 'Complete analysis for any React-based app (CRA, Vite, Next.js, Remix, Gatsby). Runs all 22 sub-tools and produces a unified health score (0-100) with prioritized migration hints.',
99
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
100
+ },
101
+ {
102
+ name: 'detect-features',
103
+ description: 'Identify logical features/domains in the app using file names, routing, folder grouping, and import clustering',
104
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
105
+ },
106
+ {
107
+ name: 'classify-files',
108
+ description: 'Classify each file into feature-specific, shared, utility, or config type',
109
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
110
+ },
111
+ {
112
+ name: 'detect-shared-modules',
113
+ description: 'Identify files used across multiple features (shared modules)',
114
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
115
+ },
116
+ {
117
+ name: 'design-target-structure',
118
+ description: 'Generate scalable folder structure suggestion based on feature-based architecture',
119
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
120
+ },
121
+ {
122
+ name: 'map-files-to-target',
123
+ description: 'Map existing files to new target structure',
124
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
125
+ },
126
+ {
127
+ name: 'detect-boundary-violations',
128
+ description: 'Detect cross-feature imports, deep relative imports, and tight coupling issues',
129
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
130
+ },
131
+ {
132
+ name: 'suggest-module-splitting',
133
+ description: 'Suggest splitting large or generic files into smaller modules',
134
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
135
+ },
136
+ {
137
+ name: 'naming-standardizer',
138
+ description: 'Suggest better file and folder naming conventions',
139
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
140
+ },
141
+ {
142
+ name: 'generate-refactor-plan',
143
+ description: 'Combine all analysis outputs into a single structured refactor plan',
144
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
145
+ },
146
+ {
147
+ name: 'refactor-folder-structure',
148
+ description: 'Aggregator: calls all refactoring suggestion tools and produces final structured plan',
149
+ inputSchema: { type: 'object', properties: { path: { type: 'string', description: 'Path to app root directory (CRA, Vite, Next.js, Remix, Gatsby, plain React)' }, config: CONFIG_SCHEMA }, required: ['path'] },
150
+ },
151
+ ];
152
+ const HANDLERS = {
153
+ 'detect-project-tech': detectProjectTech,
154
+ 'analyze-folder-structure': analyzeFolderStructure,
155
+ 'analyze-components': analyzeComponents,
156
+ 'analyze-state-management': analyzeStateManagement,
157
+ 'analyze-api-layer': analyzeApiLayer,
158
+ 'analyze-routing': analyzeRouting,
159
+ 'analyze-styling': analyzeStyling,
160
+ 'analyze-assets': analyzeAssets,
161
+ 'detect-anti-patterns': detectAntiPatterns,
162
+ 'detect-duplication': detectDuplication,
163
+ 'analyze-dependencies-usage': analyzeDependenciesUsage,
164
+ 'analyze-legacy-app': analyzeLegacyApp,
165
+ 'detect-features': detectFeatures,
166
+ 'classify-files': classifyFiles,
167
+ 'detect-shared-modules': detectSharedModules,
168
+ 'design-target-structure': designTargetStructure,
169
+ 'map-files-to-target': mapFilesToTarget,
170
+ 'detect-boundary-violations': detectBoundaryViolations,
171
+ 'suggest-module-splitting': suggestModuleSplitting,
172
+ 'naming-standardizer': namingStandardizer,
173
+ 'generate-refactor-plan': generateRefactorPlan,
174
+ 'refactor-folder-structure': refactorFolderStructure,
175
+ };
176
+ // ============================================================================
177
+ // SERVER
178
+ // ============================================================================
179
+ class LegacyAnalyzerServer extends McpServerBase {
180
+ constructor() {
181
+ super({ name: 'legacy-analyzer', version: '1.0.0' });
182
+ }
183
+ registerTools() {
184
+ for (const tool of TOOLS) {
185
+ const toolName = tool.name;
186
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
187
+ this.addTool(toolName, tool.description, tool.inputSchema, (args) => this.dispatchTool(toolName, args));
188
+ }
189
+ }
190
+ async dispatchTool(name, args) {
191
+ const { path: appPath, config } = args;
192
+ const handler = HANDLERS[name];
193
+ if (!handler) {
194
+ return this.error(new Error(`Unknown tool: ${name}`));
195
+ }
196
+ try {
197
+ const result = await handler(appPath, config);
198
+ return this.success(result);
199
+ }
200
+ catch (error) {
201
+ return this.error(error);
202
+ }
203
+ }
204
+ }
205
+ // ============================================================================
206
+ // ENTRY POINT
207
+ // ============================================================================
208
+ new LegacyAnalyzerServer().run().catch(console.error);
209
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectTechOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function detectProjectTech(appPath: string, config?: Partial<AnalyzerConfig>): Promise<ProjectTechOutput>;
3
+ //# sourceMappingURL=01-detect-project-tech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"01-detect-project-tech.d.ts","sourceRoot":"","sources":["../../src/tools/01-detect-project-tech.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAkB,MAAM,aAAa,CAAC;AAiCrF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6ErH"}
@@ -0,0 +1,115 @@
1
+ // ============================================================================
2
+ // TOOL #1: detect-project-tech
3
+ // Detects React version, language, framework (CRA/Next/Vite/Remix/Gatsby/Expo),
4
+ // and major dependencies — works for any React-based app
5
+ // ============================================================================
6
+ import { readPackageJson, hasConfigFile } from '../utils/file-scanner.js';
7
+ const MAJOR_DEPS = [
8
+ // Core
9
+ 'react', 'react-dom', 'react-scripts',
10
+ // State management
11
+ 'redux', '@reduxjs/toolkit', 'react-redux', 'zustand', 'jotai', 'recoil', 'mobx',
12
+ // Routing
13
+ 'react-router-dom', 'react-router',
14
+ // Data fetching
15
+ 'axios', 'swr', 'react-query', '@tanstack/react-query',
16
+ // Styling
17
+ 'styled-components', '@emotion/react', '@emotion/styled', 'tailwindcss',
18
+ // Forms
19
+ 'formik', 'react-hook-form',
20
+ // Validation
21
+ 'zod', 'yup',
22
+ // Utilities
23
+ 'lodash', 'ramda',
24
+ // Date
25
+ 'moment', 'dayjs', 'date-fns',
26
+ // Async/reactive
27
+ 'rxjs',
28
+ // GraphQL
29
+ 'graphql', '@apollo/client', 'urql',
30
+ // Real-time
31
+ 'socket.io-client',
32
+ // i18n
33
+ 'react-intl', 'react-i18next',
34
+ // Meta-frameworks
35
+ 'next', 'gatsby',
36
+ ];
37
+ export async function detectProjectTech(appPath, config) {
38
+ const pkg = readPackageJson(appPath);
39
+ if (!pkg) {
40
+ return {
41
+ framework: 'unknown',
42
+ reactVersion: 'unknown',
43
+ language: 'JavaScript',
44
+ hasCRAConfig: false,
45
+ majorDependencies: [],
46
+ };
47
+ }
48
+ const allDeps = {
49
+ ...pkg.dependencies,
50
+ ...pkg.devDependencies,
51
+ };
52
+ // Detect React version
53
+ let reactVersion = 'unknown';
54
+ const reactDep = allDeps['react'] || '';
55
+ const versionMatch = reactDep.match(/(\d+)\./);
56
+ if (versionMatch) {
57
+ reactVersion = versionMatch[1];
58
+ }
59
+ // Detect language
60
+ const hasTypeScript = !!(allDeps['typescript'] || allDeps['@types/react']);
61
+ const hasTSConfig = hasConfigFile(appPath, ['tsconfig.json']);
62
+ const language = (hasTypeScript || hasTSConfig) ? 'TypeScript' : 'JavaScript';
63
+ // Detect CRA
64
+ const hasReactScripts = !!allDeps['react-scripts'];
65
+ const hasCRAConfig = hasConfigFile(appPath, [
66
+ 'config-overrides',
67
+ '.env',
68
+ '.env.local',
69
+ '.env.development',
70
+ '.env.production',
71
+ ]);
72
+ const isCRA = hasReactScripts || hasCRAConfig;
73
+ // Detect framework (order matters — check specific before generic)
74
+ let framework = 'unknown';
75
+ if (allDeps['next'])
76
+ framework = 'Next.js';
77
+ else if (allDeps['@remix-run/react'] || allDeps['@remix-run/node'])
78
+ framework = 'Remix';
79
+ else if (allDeps['gatsby'])
80
+ framework = 'Gatsby';
81
+ else if (allDeps['expo'] || allDeps['react-native'])
82
+ framework = 'React Native / Expo';
83
+ else if (isCRA)
84
+ framework = 'CRA';
85
+ else if (allDeps['vite'] || allDeps['@vitejs/plugin-react'] || hasConfigFile(appPath, ['vite.config.ts', 'vite.config.js']))
86
+ framework = 'Vite';
87
+ else if (allDeps['react'])
88
+ framework = 'React';
89
+ // Next.js app router vs pages router
90
+ let routerType;
91
+ if (framework === 'Next.js') {
92
+ const hasAppDir = hasConfigFile(appPath, ['app', 'src/app']);
93
+ const hasPagesDir = hasConfigFile(appPath, ['pages', 'src/pages']);
94
+ if (hasAppDir)
95
+ routerType = 'app-router';
96
+ else if (hasPagesDir)
97
+ routerType = 'pages-router';
98
+ }
99
+ void routerType; // used by analyze-routing
100
+ // Detect major dependencies
101
+ const majorDependencies = [];
102
+ for (const dep of MAJOR_DEPS) {
103
+ if (allDeps[dep]) {
104
+ majorDependencies.push(dep);
105
+ }
106
+ }
107
+ return {
108
+ framework,
109
+ reactVersion,
110
+ language,
111
+ hasCRAConfig: isCRA,
112
+ majorDependencies,
113
+ };
114
+ }
115
+ //# sourceMappingURL=01-detect-project-tech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"01-detect-project-tech.js","sourceRoot":"","sources":["../../src/tools/01-detect-project-tech.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FolderStructureOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function analyzeFolderStructure(appPath: string, config?: Partial<AnalyzerConfig>): Promise<FolderStructureOutput>;
3
+ //# sourceMappingURL=02-analyze-folder-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"02-analyze-folder-structure.d.ts","sourceRoot":"","sources":["../../src/tools/02-analyze-folder-structure.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAiBzE,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAiF9H"}
@@ -0,0 +1,85 @@
1
+ // ============================================================================
2
+ // TOOL #2: analyze-folder-structure
3
+ // Analyzes directory structure: flat vs feature-based, folder presence, depth
4
+ // ============================================================================
5
+ import * as path from 'path';
6
+ import { getDirectoriesAtDepth, calculateMaxDepth, findSourceFiles, resolveSourceDir } from '../utils/file-scanner.js';
7
+ const COMMON_FOLDERS = [
8
+ 'components', 'component', 'ui',
9
+ 'utils', 'util', 'helpers', 'helper',
10
+ 'services', 'service', 'api',
11
+ 'hooks', 'hook', 'custom-hooks',
12
+ 'pages', 'page', 'views', 'screens',
13
+ 'store', 'stores', 'redux', 'state',
14
+ 'assets', 'static', 'public',
15
+ 'styles', 'css', 'scss',
16
+ 'constants', 'config',
17
+ 'types', 'interfaces', 'models',
18
+ 'features', 'modules',
19
+ 'contexts', 'providers',
20
+ ];
21
+ export async function analyzeFolderStructure(appPath, config) {
22
+ const srcPath = resolveSourceDir(appPath);
23
+ const allDirs = getDirectoriesAtDepth(srcPath, 5);
24
+ // Get top-level directories in src/
25
+ const topLevelDirs = allDirs.filter((d) => !d.includes(path.sep));
26
+ const secondLevelDirs = allDirs.filter((d) => d.split(path.sep).length === 2);
27
+ // Detect which common folders exist
28
+ const folders = [];
29
+ const foundFolders = new Set();
30
+ for (const dir of allDirs) {
31
+ const parts = dir.split(path.sep);
32
+ for (const part of parts) {
33
+ const lower = part.toLowerCase();
34
+ if (COMMON_FOLDERS.includes(lower) && !foundFolders.has(lower)) {
35
+ foundFolders.add(lower);
36
+ folders.push(dir);
37
+ }
38
+ }
39
+ }
40
+ // Classify structure type
41
+ let structureType;
42
+ const hasFeatures = topLevelDirs.some((d) => ['features', 'modules', 'pages', 'screens', 'views'].includes(d.toLowerCase()));
43
+ const hasFlatStructure = topLevelDirs.some((d) => ['components', 'utils', 'services', 'hooks'].includes(d.toLowerCase()));
44
+ if (hasFeatures && hasFlatStructure) {
45
+ structureType = 'mixed';
46
+ }
47
+ else if (hasFeatures) {
48
+ structureType = 'feature-based';
49
+ }
50
+ else {
51
+ structureType = 'flat';
52
+ }
53
+ // Calculate depth
54
+ const maxDepth = calculateMaxDepth(srcPath);
55
+ // Detect issues
56
+ const issues = [];
57
+ if (maxDepth > 5) {
58
+ issues.push(`Deep nesting detected (${maxDepth} levels). Consider flattening the structure.`);
59
+ }
60
+ if (!foundFolders.has('components') && !foundFolders.has('component')) {
61
+ issues.push('No dedicated components folder found.');
62
+ }
63
+ if (!foundFolders.has('utils') && !foundFolders.has('util') && !foundFolders.has('helpers')) {
64
+ issues.push('No dedicated utils/helpers folder found. Utility code may be scattered.');
65
+ }
66
+ if (structureType === 'mixed') {
67
+ issues.push('Mixed folder structure detected (both flat and feature-based). Consider standardizing.');
68
+ }
69
+ // Check for src at wrong level
70
+ const sourceFiles = await findSourceFiles(appPath);
71
+ const filesOutsideSrc = sourceFiles.filter((f) => {
72
+ const rel = path.relative(appPath, f);
73
+ return !rel.startsWith('src' + path.sep) && rel !== 'src';
74
+ });
75
+ if (filesOutsideSrc.length > 0) {
76
+ issues.push(`${filesOutsideSrc.length} source files found outside src/ directory.`);
77
+ }
78
+ return {
79
+ structureType,
80
+ folders: folders.sort(),
81
+ maxDepth,
82
+ issues,
83
+ };
84
+ }
85
+ //# sourceMappingURL=02-analyze-folder-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"02-analyze-folder-structure.js","sourceRoot":"","sources":["../../src/tools/02-analyze-folder-structure.ts"],"names":[],"mappings":"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"}