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
@@ -0,0 +1,131 @@
1
+ // ============================================================================
2
+ // TOOL #7: analyze-styling
3
+ // Detects CSS/SCSS/Tailwind/styled-components, inline styles, hardcoded values
4
+ // ============================================================================
5
+ import { findSourceFiles, readFileContent, findStyleFiles, resolveSourceDir } from '../utils/file-scanner.js';
6
+ import { parseFile, extractImports } from '../utils/ast-parser.js';
7
+ const HEX_COLOR_REGEX = /#[0-9a-fA-F]{3,8}\b/g;
8
+ const RGB_REGEX = /rgba?\s*\([^)]+\)/g;
9
+ const INLINE_STYLE_REGEX = /style\s*=\s*\{\{/g;
10
+ const CLASSNAME_REGEX = /className\s*=\s*[{"'`]/g;
11
+ const STYLING_LIBS = [
12
+ 'styled-components',
13
+ '@emotion/react',
14
+ '@emotion/styled',
15
+ 'tailwindcss',
16
+ '@stitches/react',
17
+ 'linaria',
18
+ 'twin.macro',
19
+ ];
20
+ export async function analyzeStyling(appPath, config) {
21
+ const srcPath = resolveSourceDir(appPath);
22
+ const files = await findSourceFiles(srcPath);
23
+ const styleFiles = await findStyleFiles(appPath);
24
+ const stylingType = new Set();
25
+ const issues = [];
26
+ let inlineStylesCount = 0;
27
+ const hardcodedColors = new Set();
28
+ const classNameCounts = new Map();
29
+ // Check for CSS/SCSS files
30
+ if (styleFiles.length > 0) {
31
+ const hasCSS = styleFiles.some((f) => f.endsWith('.css'));
32
+ const hasSCSS = styleFiles.some((f) => f.endsWith('.scss') || f.endsWith('.sass') || f.endsWith('.less'));
33
+ const hasModules = styleFiles.some((f) => f.includes('.module.'));
34
+ if (hasCSS)
35
+ stylingType.add('CSS');
36
+ if (hasSCSS)
37
+ stylingType.add('SCSS/Less');
38
+ if (hasModules)
39
+ stylingType.add('CSS Modules');
40
+ }
41
+ // Analyze source files for styling patterns
42
+ for (const file of files) {
43
+ const content = readFileContent(file);
44
+ if (!content)
45
+ continue;
46
+ const parsed = parseFile(file);
47
+ if (!parsed)
48
+ continue;
49
+ const imports = extractImports(parsed.ast);
50
+ const importSources = imports.map((i) => i.source);
51
+ // Detect styling libraries
52
+ for (const lib of STYLING_LIBS) {
53
+ if (importSources.some((s) => s.includes(lib))) {
54
+ if (lib.includes('styled'))
55
+ stylingType.add('styled-components');
56
+ else if (lib.includes('emotion'))
57
+ stylingType.add('Emotion');
58
+ else if (lib.includes('tailwind'))
59
+ stylingType.add('Tailwind');
60
+ else if (lib.includes('stitches'))
61
+ stylingType.add('Stitches');
62
+ else if (lib.includes('linaria'))
63
+ stylingType.add('Linaria');
64
+ else
65
+ stylingType.add(lib);
66
+ }
67
+ }
68
+ // Count inline styles
69
+ const inlineMatches = content.match(INLINE_STYLE_REGEX);
70
+ if (inlineMatches) {
71
+ inlineStylesCount += inlineMatches.length;
72
+ }
73
+ // Extract hardcoded colors
74
+ const hexMatches = content.match(HEX_COLOR_REGEX);
75
+ if (hexMatches) {
76
+ for (const color of hexMatches) {
77
+ hardcodedColors.add(color.toLowerCase());
78
+ }
79
+ }
80
+ const rgbMatches = content.match(RGB_REGEX);
81
+ if (rgbMatches) {
82
+ for (const color of rgbMatches) {
83
+ hardcodedColors.add(color);
84
+ }
85
+ }
86
+ // Count className usage for duplicate detection
87
+ const classNameMatches = content.match(/className\s*=\s*["'`]([^"'`]+)["'`]/g);
88
+ if (classNameMatches) {
89
+ for (const match of classNameMatches) {
90
+ const classes = match.replace(/className\s*=\s*["'`]/, '').replace(/["'`]$/, '');
91
+ const classList = classes.split(/\s+/);
92
+ for (const cls of classList) {
93
+ if (cls.trim()) {
94
+ classNameCounts.set(cls, (classNameCounts.get(cls) || 0) + 1);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ // Find duplicate classes (used in many files)
101
+ const duplicateClasses = [];
102
+ for (const [cls, count] of classNameCounts) {
103
+ if (count > 10) {
104
+ duplicateClasses.push(cls);
105
+ }
106
+ }
107
+ // Issues
108
+ if (stylingType.size === 0) {
109
+ issues.push('No styling solution detected. May be using inline styles only or a custom solution.');
110
+ }
111
+ if (stylingType.size > 2) {
112
+ issues.push(`Multiple styling solutions detected (${Array.from(stylingType).join(', ')}). Consider standardizing.`);
113
+ }
114
+ if (inlineStylesCount > 20) {
115
+ issues.push(`High inline styles usage (${inlineStylesCount} instances). Consider using CSS classes or styled-components.`);
116
+ }
117
+ if (hardcodedColors.size > 10) {
118
+ issues.push(`${hardcodedColors.size} hardcoded colors found. Consider using CSS variables or a theme system.`);
119
+ }
120
+ if (duplicateClasses.length > 0) {
121
+ issues.push(`Potential duplicate class definitions detected: ${duplicateClasses.slice(0, 5).join(', ')}${duplicateClasses.length > 5 ? '...' : ''}`);
122
+ }
123
+ return {
124
+ stylingType: Array.from(stylingType),
125
+ inlineStylesCount,
126
+ hardcodedColors: Array.from(hardcodedColors).slice(0, 20), // Limit output
127
+ duplicateClasses: duplicateClasses.slice(0, 10),
128
+ issues,
129
+ };
130
+ }
131
+ //# sourceMappingURL=07-analyze-styling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"07-analyze-styling.js","sourceRoot":"","sources":["../../src/tools/07-analyze-styling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AnalyzeAssetsOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function analyzeAssets(appPath: string, config?: Partial<AnalyzerConfig>): Promise<AnalyzeAssetsOutput>;
3
+ //# sourceMappingURL=08-analyze-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"08-analyze-assets.d.ts","sourceRoot":"","sources":["../../src/tools/08-analyze-assets.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAa,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlF,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkFnH"}
@@ -0,0 +1,85 @@
1
+ // ============================================================================
2
+ // TOOL #8: analyze-assets
3
+ // Detects large images/videos, assets inside src, unused assets
4
+ // ============================================================================
5
+ import * as path from 'path';
6
+ import { findAssetFiles, getFileSize, findSourceFiles, readFileContent } from '../utils/file-scanner.js';
7
+ import { DEFAULT_CONFIG } from '../types.js';
8
+ const IMAGE_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.bmp'];
9
+ const VIDEO_EXTENSIONS = ['.mp4', '.webm', '.ogg', '.avi', '.mov'];
10
+ export async function analyzeAssets(appPath, config) {
11
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
12
+ const assetFiles = await findAssetFiles(appPath);
13
+ const sourceFiles = await findSourceFiles(appPath);
14
+ const largeAssets = [];
15
+ const assetIssues = [];
16
+ const referencedAssets = new Set();
17
+ // Analyze each asset
18
+ for (const asset of assetFiles) {
19
+ const sizeBytes = getFileSize(asset);
20
+ const sizeKB = sizeBytes / 1024;
21
+ const ext = path.extname(asset).toLowerCase();
22
+ const relPath = path.relative(appPath, asset);
23
+ let type = 'unknown';
24
+ if (IMAGE_EXTENSIONS.includes(ext))
25
+ type = 'image';
26
+ else if (VIDEO_EXTENSIONS.includes(ext))
27
+ type = 'video';
28
+ else
29
+ type = 'font';
30
+ // Check if large
31
+ if (type === 'image' && sizeKB > mergedConfig.largeAssetImageKB) {
32
+ largeAssets.push({ file: relPath, sizeKB: Math.round(sizeKB * 10) / 10, type });
33
+ }
34
+ else if (type === 'video' && sizeKB > mergedConfig.largeAssetVideoMB * 1024) {
35
+ largeAssets.push({ file: relPath, sizeKB: Math.round(sizeKB * 10) / 10, type });
36
+ }
37
+ }
38
+ // Check which assets are referenced in source files
39
+ for (const sourceFile of sourceFiles) {
40
+ const content = readFileContent(sourceFile);
41
+ if (!content)
42
+ continue;
43
+ for (const asset of assetFiles) {
44
+ const basename = path.basename(asset);
45
+ // Check if asset filename appears in source
46
+ if (content.includes(basename)) {
47
+ referencedAssets.add(asset);
48
+ }
49
+ }
50
+ }
51
+ // Find unused assets
52
+ const unusedAssets = [];
53
+ for (const asset of assetFiles) {
54
+ if (!referencedAssets.has(asset)) {
55
+ unusedAssets.push(path.relative(appPath, asset));
56
+ }
57
+ }
58
+ // Check for assets inside src/
59
+ const srcAssets = assetFiles.filter((f) => {
60
+ const rel = path.relative(appPath, f);
61
+ return rel.startsWith('src' + path.sep);
62
+ });
63
+ if (srcAssets.length > 0) {
64
+ assetIssues.push(`${srcAssets.length} assets found inside src/. Consider moving to public/ for better caching.`);
65
+ }
66
+ // Issues
67
+ if (largeAssets.length > 0) {
68
+ assetIssues.push(`${largeAssets.length} large assets detected. Consider optimizing or using CDN.`);
69
+ }
70
+ if (unusedAssets.length > 0) {
71
+ assetIssues.push(`${unusedAssets.length} potentially unused assets detected.`);
72
+ }
73
+ // Check for non-optimized formats
74
+ const pngAssets = assetFiles.filter((f) => f.endsWith('.png'));
75
+ if (pngAssets.length > 5) {
76
+ assetIssues.push(`${pngAssets.length} PNG files found. Consider converting to WebP for better performance.`);
77
+ }
78
+ return {
79
+ totalAssets: assetFiles.length,
80
+ largeAssets: largeAssets.sort((a, b) => b.sizeKB - a.sizeKB),
81
+ unusedAssets: unusedAssets.slice(0, 20), // Limit output
82
+ assetIssues,
83
+ };
84
+ }
85
+ //# sourceMappingURL=08-analyze-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"08-analyze-assets.js","sourceRoot":"","sources":["../../src/tools/08-analyze-assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DetectAntiPatternsOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function detectAntiPatterns(appPath: string, config?: Partial<AnalyzerConfig>): Promise<DetectAntiPatternsOutput>;
3
+ //# sourceMappingURL=09-detect-anti-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"09-detect-anti-patterns.d.ts","sourceRoot":"","sources":["../../src/tools/09-detect-anti-patterns.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,wBAAwB,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAEzF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAmU7H"}
@@ -0,0 +1,329 @@
1
+ // ============================================================================
2
+ // TOOL #9: detect-anti-patterns
3
+ // Detects prop drilling, tight coupling, duplicated logic, large utility files,
4
+ // god components, inline JSX callbacks, a11y violations, bad fetch patterns
5
+ // ============================================================================
6
+ import * as path from 'path';
7
+ import { findSourceFiles, readFileContent, resolveSourceDir } from '../utils/file-scanner.js';
8
+ import { analyzeComponent, parseFile, extractFunctions } from '../utils/ast-parser.js';
9
+ import { buildImportGraph, calculateCoupling } from '../utils/import-tracker.js';
10
+ import { DEFAULT_CONFIG } from '../types.js';
11
+ export async function detectAntiPatterns(appPath, config) {
12
+ const mergedConfig = { ...DEFAULT_CONFIG, ...config };
13
+ const srcPath = resolveSourceDir(appPath);
14
+ const files = await findSourceFiles(srcPath);
15
+ const graph = await buildImportGraph(appPath);
16
+ const antiPatterns = [];
17
+ // ── 1. Prop drilling ─────────────────────────────────────────────────────
18
+ const propDrillingFiles = [];
19
+ for (const file of files) {
20
+ const analysis = analyzeComponent(file);
21
+ if (!analysis)
22
+ continue;
23
+ if (analysis.props.length > 5) {
24
+ const content = readFileContent(file);
25
+ if (!content)
26
+ continue;
27
+ const spreadProps = content.match(/\.\.\.\w+Props/g) || [];
28
+ const passingProps = content.match(/<[A-Z]\w+[^>]*\w+=\{[^}]+\}/g) || [];
29
+ if (spreadProps.length > 0 && passingProps.length > 3) {
30
+ propDrillingFiles.push(path.relative(appPath, file));
31
+ }
32
+ }
33
+ }
34
+ if (propDrillingFiles.length > 0) {
35
+ antiPatterns.push({
36
+ type: 'prop-drilling',
37
+ description: `Components passing props through multiple levels (${propDrillingFiles.length} files). Consider using Context or state management.`,
38
+ files: propDrillingFiles.slice(0, 10),
39
+ });
40
+ }
41
+ // ── 2. Tight coupling ────────────────────────────────────────────────────
42
+ const tightCouplingPairs = [];
43
+ const processedPairs = new Set();
44
+ for (const fileA of files) {
45
+ for (const fileB of files) {
46
+ if (fileA === fileB)
47
+ continue;
48
+ const pairKey = [fileA, fileB].sort().join('|');
49
+ if (processedPairs.has(pairKey))
50
+ continue;
51
+ processedPairs.add(pairKey);
52
+ const coupling = calculateCoupling(graph, fileA, fileB);
53
+ if (coupling >= 3) {
54
+ tightCouplingPairs.push(`${path.relative(appPath, fileA)} <-> ${path.relative(appPath, fileB)} (coupling: ${coupling})`);
55
+ }
56
+ }
57
+ }
58
+ if (tightCouplingPairs.length > 0) {
59
+ antiPatterns.push({
60
+ type: 'tight-coupling',
61
+ description: 'Tightly coupled components detected. Consider extracting shared logic or using dependency injection.',
62
+ files: tightCouplingPairs.slice(0, 10),
63
+ });
64
+ }
65
+ // ── 3. Large utility files ───────────────────────────────────────────────
66
+ const utilFiles = files.filter((f) => {
67
+ const lower = f.toLowerCase();
68
+ return lower.includes('/util') || lower.includes('/helper') || lower.includes('/utils.');
69
+ });
70
+ for (const utilFile of utilFiles) {
71
+ const content = readFileContent(utilFile);
72
+ if (!content)
73
+ continue;
74
+ const lines = content.split('\n').length;
75
+ if (lines > mergedConfig.largeUtilLines) {
76
+ const parsed = parseFile(utilFile);
77
+ if (!parsed)
78
+ continue;
79
+ const functions = extractFunctions(parsed.ast);
80
+ antiPatterns.push({
81
+ type: 'large-utility-file',
82
+ description: `Utility file has ${lines} lines with ${functions.length} functions. Consider splitting into smaller modules.`,
83
+ files: [path.relative(appPath, utilFile)],
84
+ });
85
+ }
86
+ }
87
+ // ── 4. Duplicated logic patterns ─────────────────────────────────────────
88
+ const functionBodies = new Map();
89
+ for (const file of files) {
90
+ const content = readFileContent(file);
91
+ if (!content)
92
+ continue;
93
+ const patterns = [
94
+ { name: 'date-formatting', regex: /formatDate|dateFormat|toLocaleDateString|moment\(|dayjs\(/g },
95
+ { name: 'currency-formatting', regex: /formatCurrency|currencyFormat|Intl\.NumberFormat.*style.*currency/g },
96
+ { name: 'validation', regex: /validate\w+|isValid\w+|checkValid/g },
97
+ { name: 'api-error-handling', regex: /catch\s*\([^)]*\)\s*\{[^}]*error/g },
98
+ ];
99
+ for (const pattern of patterns) {
100
+ const matches = content.match(pattern.regex);
101
+ if (matches && matches.length > 0) {
102
+ if (!functionBodies.has(pattern.name))
103
+ functionBodies.set(pattern.name, []);
104
+ functionBodies.get(pattern.name).push(path.relative(appPath, file));
105
+ }
106
+ }
107
+ }
108
+ for (const [pattern, fileList] of functionBodies) {
109
+ if (fileList.length > 3) {
110
+ antiPatterns.push({
111
+ type: 'duplicated-logic',
112
+ description: `Repeated "${pattern}" pattern found in ${fileList.length} files. Consider extracting to a shared utility.`,
113
+ files: fileList.slice(0, 10),
114
+ });
115
+ }
116
+ }
117
+ // ── 5. God components ────────────────────────────────────────────────────
118
+ const godComponentFiles = [];
119
+ for (const file of files) {
120
+ const content = readFileContent(file);
121
+ if (!content)
122
+ continue;
123
+ const analysis = analyzeComponent(file);
124
+ const relPath = path.relative(appPath, file);
125
+ const responsibilities = new Set();
126
+ // Detect state via both AST (if available) and regex (for namespace style)
127
+ const hasUseState = analysis?.hooks.some((h) => h.name === 'useState') ||
128
+ /\buseState\s*\(|React\.useState\s*\(/.test(content);
129
+ const hasUseEffect = analysis?.hooks.some((h) => h.name === 'useEffect') ||
130
+ /\buseEffect\s*\(|React\.useEffect\s*\(/.test(content);
131
+ const hasUseReducer = analysis?.hooks.some((h) => h.name === 'useReducer') ||
132
+ /\buseReducer\s*\(|React\.useReducer\s*\(/.test(content);
133
+ if (hasUseState || hasUseReducer)
134
+ responsibilities.add('state');
135
+ if (hasUseEffect)
136
+ responsibilities.add('effects');
137
+ // API calls
138
+ if (content.includes('fetch(') || content.includes('axios.') || content.includes('.get(') || content.includes('.post(')) {
139
+ responsibilities.add('api-calls');
140
+ }
141
+ // Routing
142
+ const importSources = analysis?.imports.map((i) => i.source.toLowerCase()) || [];
143
+ if (importSources.some((s) => s.includes('router') || s.includes('navigate')))
144
+ responsibilities.add('routing');
145
+ // Store
146
+ if (importSources.some((s) => s.includes('redux') || s.includes('store') || s.includes('zustand')))
147
+ responsibilities.add('store');
148
+ // Form handling
149
+ if (content.includes('onSubmit') || content.includes('FormData') || content.includes('handleSubmit')) {
150
+ responsibilities.add('form-handling');
151
+ }
152
+ // Heavy rendering
153
+ const jsxElements = analysis?.jsxElements.length || (content.match(/<[A-Z][a-zA-Z]*/g) || []).length;
154
+ if (jsxElements > 15)
155
+ responsibilities.add('heavy-rendering');
156
+ // Count state variables
157
+ const stateVarCount = (content.match(/\buseState\s*\(/g) || []).length +
158
+ (content.match(/React\.useState\s*\(/g) || []).length;
159
+ const lines = content.split('\n').length;
160
+ // Lower thresholds: a 100-line component with 3+ responsibilities IS a god component
161
+ if (responsibilities.size >= 3 && (lines > 80 || stateVarCount >= 3)) {
162
+ const detail = `${lines} lines, ${responsibilities.size} responsibilities (${Array.from(responsibilities).join(', ')}), ${stateVarCount} state vars`;
163
+ godComponentFiles.push(`${relPath} — ${detail}`);
164
+ }
165
+ }
166
+ if (godComponentFiles.length > 0) {
167
+ antiPatterns.push({
168
+ type: 'god-component',
169
+ description: `God component(s) detected — too many responsibilities in a single file. Break into feature-specific sub-components.`,
170
+ files: godComponentFiles.slice(0, 10),
171
+ });
172
+ }
173
+ // ── 6. Inline JSX callbacks ───────────────────────────────────────────────
174
+ const inlineCallbackFiles = [];
175
+ for (const file of files) {
176
+ const content = readFileContent(file);
177
+ if (!content)
178
+ continue;
179
+ // Detect onClick/onChange/onSubmit/onBlur etc with inline arrow functions
180
+ const matches = [...content.matchAll(/on[A-Z]\w*=\{(?:\([^)]*\)|[a-z_]\w*)\s*=>/g)];
181
+ if (matches.length >= 2) {
182
+ inlineCallbackFiles.push({
183
+ file: path.relative(appPath, file),
184
+ count: matches.length,
185
+ examples: matches.slice(0, 2).map((m) => m[0].slice(0, 60)),
186
+ });
187
+ }
188
+ }
189
+ if (inlineCallbackFiles.length > 0) {
190
+ const total = inlineCallbackFiles.reduce((s, f) => s + f.count, 0);
191
+ antiPatterns.push({
192
+ type: 'inline-callbacks',
193
+ description: `${total} inline arrow function callbacks in JSX across ${inlineCallbackFiles.length} file(s). Each creates a new function reference on every render — extract to useCallback or named handlers.`,
194
+ files: inlineCallbackFiles.map((f) => `${f.file} (${f.count} callbacks)`).slice(0, 10),
195
+ });
196
+ }
197
+ // ── 7. Fetch/async without error handling ─────────────────────────────────
198
+ const noErrorHandlingFiles = [];
199
+ for (const file of files) {
200
+ const content = readFileContent(file);
201
+ if (!content)
202
+ continue;
203
+ const hasFetch = content.includes('fetch(') || content.includes('axios.');
204
+ if (!hasFetch)
205
+ continue;
206
+ const hasCatch = content.includes('.catch(') || content.includes('try {') || content.includes('try{');
207
+ if (!hasCatch) {
208
+ noErrorHandlingFiles.push(path.relative(appPath, file));
209
+ }
210
+ }
211
+ if (noErrorHandlingFiles.length > 0) {
212
+ antiPatterns.push({
213
+ type: 'missing-error-handling',
214
+ description: `${noErrorHandlingFiles.length} file(s) make API calls without try/catch or .catch(). Unhandled rejections will silently fail in production.`,
215
+ files: noErrorHandlingFiles.slice(0, 10),
216
+ });
217
+ }
218
+ // ── 8. React namespace style (React.useState instead of imported) ─────────
219
+ const namespacedReactFiles = [];
220
+ for (const file of files) {
221
+ const content = readFileContent(file);
222
+ if (!content)
223
+ continue;
224
+ const namespacedHooks = (content.match(/React\.(useState|useEffect|useCallback|useMemo|useRef|useContext|useReducer)\s*\(/g) || []);
225
+ if (namespacedHooks.length >= 2) {
226
+ namespacedReactFiles.push(`${path.relative(appPath, file)} (${namespacedHooks.length} namespace calls)`);
227
+ }
228
+ }
229
+ if (namespacedReactFiles.length > 0) {
230
+ antiPatterns.push({
231
+ type: 'react-namespace-style',
232
+ description: `Files use React.useState/useEffect/etc instead of named imports. Prefer: import { useState, useEffect } from 'react'`,
233
+ files: namespacedReactFiles.slice(0, 10),
234
+ });
235
+ }
236
+ // ── 9. Images without alt text ────────────────────────────────────────────
237
+ const noAltFiles = [];
238
+ for (const file of files) {
239
+ const content = readFileContent(file);
240
+ if (!content)
241
+ continue;
242
+ // Find <img> tags that don't have alt=
243
+ const imgMatches = [...content.matchAll(/<img\b([^>]*)>/g)];
244
+ const noAltCount = imgMatches.filter((m) => !m[1].includes('alt=')).length;
245
+ if (noAltCount > 0) {
246
+ noAltFiles.push({ file: path.relative(appPath, file), count: noAltCount });
247
+ }
248
+ }
249
+ if (noAltFiles.length > 0) {
250
+ const total = noAltFiles.reduce((s, f) => s + f.count, 0);
251
+ antiPatterns.push({
252
+ type: 'missing-alt-text',
253
+ description: `${total} <img> element(s) missing alt attribute across ${noAltFiles.length} file(s). Required for accessibility (WCAG 2.1 1.1.1).`,
254
+ files: noAltFiles.map((f) => `${f.file} (${f.count} images)`).slice(0, 10),
255
+ });
256
+ }
257
+ // ── 10. Non-semantic HTML structure ──────────────────────────────────────
258
+ const nonSemanticFiles = [];
259
+ const semanticDivPatterns = [
260
+ /className=["'`]header["'`]/,
261
+ /className=["'`]footer["'`]/,
262
+ /className=["'`]main["'`]/,
263
+ /className=["'`]nav["'`]/,
264
+ /className=["'`]navigation["'`]/,
265
+ /className=["'`]sidebar["'`]/,
266
+ /className=["'`]article["'`]/,
267
+ /className=["'`]section["'`]/,
268
+ ];
269
+ for (const file of files) {
270
+ const content = readFileContent(file);
271
+ if (!content)
272
+ continue;
273
+ const hasNonSemantic = semanticDivPatterns.some((p) => p.test(content));
274
+ if (hasNonSemantic) {
275
+ // Confirm it's using div, not the semantic element itself
276
+ const hasDivHeader = content.match(/<div\b[^>]*className=["'`](?:header|footer|main|nav|sidebar|article|section)["'`]/);
277
+ if (hasDivHeader) {
278
+ nonSemanticFiles.push(path.relative(appPath, file));
279
+ }
280
+ }
281
+ }
282
+ if (nonSemanticFiles.length > 0) {
283
+ antiPatterns.push({
284
+ type: 'non-semantic-html',
285
+ description: `${nonSemanticFiles.length} file(s) use <div className="header/footer/main/nav"> instead of semantic HTML elements (<header>, <footer>, <main>, <nav>). Hurts SEO and accessibility.`,
286
+ files: nonSemanticFiles.slice(0, 10),
287
+ });
288
+ }
289
+ // ── 11. Form inputs without labels ───────────────────────────────────────
290
+ const noLabelFiles = [];
291
+ for (const file of files) {
292
+ const content = readFileContent(file);
293
+ if (!content)
294
+ continue;
295
+ const inputs = [...content.matchAll(/<input\b([^>]*)>/g)];
296
+ const hasLabel = content.includes('<label') || content.includes('htmlFor') || content.includes('aria-label');
297
+ if (inputs.length > 0 && !hasLabel) {
298
+ noLabelFiles.push(path.relative(appPath, file));
299
+ }
300
+ }
301
+ if (noLabelFiles.length > 0) {
302
+ antiPatterns.push({
303
+ type: 'unlabeled-inputs',
304
+ description: `${noLabelFiles.length} file(s) have form <input> elements without associated <label> or aria-label. Screen readers cannot identify these fields (WCAG 2.1 1.3.1).`,
305
+ files: noLabelFiles.slice(0, 10),
306
+ });
307
+ }
308
+ // ── 12. Placeholder/external images in production code ───────────────────
309
+ const placeholderImageFiles = [];
310
+ for (const file of files) {
311
+ const content = readFileContent(file);
312
+ if (!content)
313
+ continue;
314
+ if (content.includes('via.placeholder.com') || content.includes('placeholder.com') || content.includes('placehold.it') || content.includes('dummyimage.com')) {
315
+ placeholderImageFiles.push(path.relative(appPath, file));
316
+ }
317
+ }
318
+ if (placeholderImageFiles.length > 0) {
319
+ antiPatterns.push({
320
+ type: 'placeholder-images',
321
+ description: `${placeholderImageFiles.length} file(s) use external placeholder image services. Replace with real assets before production.`,
322
+ files: placeholderImageFiles.slice(0, 10),
323
+ });
324
+ }
325
+ return {
326
+ antiPatterns,
327
+ };
328
+ }
329
+ //# sourceMappingURL=09-detect-anti-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"09-detect-anti-patterns.js","sourceRoot":"","sources":["../../src/tools/09-detect-anti-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DetectDuplicationOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function detectDuplication(appPath: string, config?: Partial<AnalyzerConfig>): Promise<DetectDuplicationOutput>;
3
+ //# sourceMappingURL=10-detect-duplication.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"10-detect-duplication.d.ts","sourceRoot":"","sources":["../../src/tools/10-detect-duplication.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAiB,cAAc,EAAE,MAAM,aAAa,CAAC;AAiD1F,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAwJ3H"}