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,3 @@
1
+ import type { MapFilesToTargetOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function mapFilesToTarget(appPath: string, config?: Partial<AnalyzerConfig>): Promise<MapFilesToTargetOutput>;
3
+ //# sourceMappingURL=17-map-files-to-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"17-map-files-to-target.d.ts","sourceRoot":"","sources":["../../src/tools/17-map-files-to-target.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAY,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpF,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAsHjC"}
@@ -0,0 +1,108 @@
1
+ // ============================================================================
2
+ // TOOL #17: map-files-to-target
3
+ // Maps existing files to new target structure
4
+ // ============================================================================
5
+ import * as path from 'path';
6
+ import { findSourceFiles, resolveSourceDir } from '../utils/file-scanner.js';
7
+ import { detectFeatures } from './13-detect-features.js';
8
+ import { classifyFiles } from './14-classify-files.js';
9
+ import { detectFeatureFromPath, generateTargetPath, } from '../utils/refactor-helpers.js';
10
+ export async function mapFilesToTarget(appPath, config) {
11
+ const srcPath = resolveSourceDir(appPath);
12
+ const files = await findSourceFiles(srcPath);
13
+ if (files.length === 0) {
14
+ return { moves: [], unmapped: [] };
15
+ }
16
+ // Get features and classifications
17
+ const { features, featureMap } = await detectFeatures(appPath, config);
18
+ const { files: classifications } = await classifyFiles(appPath, config);
19
+ // Create classification lookup
20
+ const classificationMap = new Map(classifications.map((c) => [c.path, c]));
21
+ const moves = [];
22
+ const unmapped = [];
23
+ for (const file of files) {
24
+ const relPath = path.relative(srcPath, file);
25
+ const classification = classificationMap.get(relPath);
26
+ // Skip entry point files (index.js/tsx, App.js/tsx, etc.)
27
+ const basename = path.basename(file);
28
+ if (basename === 'index.tsx' ||
29
+ basename === 'index.ts' ||
30
+ basename === 'index.jsx' ||
31
+ basename === 'index.js' ||
32
+ basename === 'App.tsx' ||
33
+ basename === 'App.ts' ||
34
+ basename === 'App.jsx' ||
35
+ basename === 'App.js' ||
36
+ basename === 'index.css' ||
37
+ basename === 'index.scss' ||
38
+ basename === 'react-app-env.d.ts' ||
39
+ basename === 'reportWebVitals.ts' ||
40
+ basename === 'reportWebVitals.js' ||
41
+ basename === 'setupTests.ts' ||
42
+ basename === 'setupTests.js') {
43
+ continue;
44
+ }
45
+ // Determine target path
46
+ const targetPath = generateTargetPath(file, srcPath, features, featureMap);
47
+ // Check if file is already in the right place
48
+ const currentNormalized = relPath.replace(/\\/g, '/');
49
+ const targetNormalized = targetPath.replace(/\\/g, '/');
50
+ if (currentNormalized === targetNormalized) {
51
+ continue; // File is already in the right place
52
+ }
53
+ // Determine reason for the move
54
+ let reason = '';
55
+ if (classification) {
56
+ switch (classification.type) {
57
+ case 'feature':
58
+ reason = `Feature-specific file for "${classification.feature}" feature`;
59
+ break;
60
+ case 'shared':
61
+ reason = 'Shared module used across multiple features';
62
+ break;
63
+ case 'utility':
64
+ reason = 'Utility function should be in shared/utils';
65
+ break;
66
+ case 'config':
67
+ reason = 'Configuration file should be in shared/types';
68
+ break;
69
+ }
70
+ }
71
+ else {
72
+ reason = 'Reorganize to target structure';
73
+ }
74
+ moves.push({
75
+ from: relPath,
76
+ to: targetPath,
77
+ reason,
78
+ });
79
+ }
80
+ // Files that couldn't be cleanly mapped
81
+ for (const file of files) {
82
+ const relPath = path.relative(srcPath, file);
83
+ const inMoves = moves.some((m) => m.from === relPath);
84
+ const basename = path.basename(file);
85
+ // Skip entry points
86
+ if (basename === 'index.tsx' ||
87
+ basename === 'index.ts' ||
88
+ basename === 'index.jsx' ||
89
+ basename === 'index.js' ||
90
+ basename === 'App.tsx' ||
91
+ basename === 'App.ts' ||
92
+ basename === 'App.jsx' ||
93
+ basename === 'App.js') {
94
+ continue;
95
+ }
96
+ if (!inMoves) {
97
+ const feature = detectFeatureFromPath(file, srcPath);
98
+ if (!feature) {
99
+ unmapped.push(relPath);
100
+ }
101
+ }
102
+ }
103
+ // Sort moves by target path
104
+ moves.sort((a, b) => a.to.localeCompare(b.to));
105
+ unmapped.sort();
106
+ return { moves, unmapped };
107
+ }
108
+ //# sourceMappingURL=17-map-files-to-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"17-map-files-to-target.js","sourceRoot":"","sources":["../../src/tools/17-map-files-to-target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DetectBoundaryViolationsOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function detectBoundaryViolations(appPath: string, config?: Partial<AnalyzerConfig>): Promise<DetectBoundaryViolationsOutput>;
3
+ //# sourceMappingURL=18-detect-boundary-violations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"18-detect-boundary-violations.d.ts","sourceRoot":"","sources":["../../src/tools/18-detect-boundary-violations.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,8BAA8B,EAAqB,cAAc,EAAE,MAAM,aAAa,CAAC;AAErG,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,8BAA8B,CAAC,CA4IzC"}
@@ -0,0 +1,137 @@
1
+ // ============================================================================
2
+ // TOOL #18: detect-boundary-violations
3
+ // Identifies cross-feature imports, deep relative imports, and tight coupling
4
+ // ============================================================================
5
+ import * as path from 'path';
6
+ import { findSourceFiles, resolveSourceDir } from '../utils/file-scanner.js';
7
+ import { buildImportGraph, resolveImportPath, findDeepImports, findCrossFeatureImports } from '../utils/import-tracker.js';
8
+ import { areTightlyCoupled, } from '../utils/refactor-helpers.js';
9
+ export async function detectBoundaryViolations(appPath, config) {
10
+ const srcPath = resolveSourceDir(appPath);
11
+ const files = await findSourceFiles(srcPath);
12
+ if (files.length === 0) {
13
+ return {
14
+ violations: [],
15
+ summary: {
16
+ crossFeatureImports: 0,
17
+ deepRelativeImports: 0,
18
+ circularDependencies: 0,
19
+ tightCoupling: 0,
20
+ },
21
+ };
22
+ }
23
+ const graph = await buildImportGraph(srcPath);
24
+ const violations = [];
25
+ // 1. Cross-feature imports
26
+ const crossFeatureImports = findCrossFeatureImports(graph, appPath);
27
+ for (const imp of crossFeatureImports) {
28
+ const fromRel = path.relative(srcPath, imp.from);
29
+ const toRel = path.relative(srcPath, imp.to);
30
+ violations.push({
31
+ type: 'cross-feature-import',
32
+ from: fromRel,
33
+ to: toRel,
34
+ description: `File imports across feature boundary: "${imp.importPath}"`,
35
+ severity: 'error',
36
+ });
37
+ }
38
+ // 2. Deep relative imports (../../../ pattern)
39
+ const deepImports = findDeepImports(graph);
40
+ for (const di of deepImports) {
41
+ const fileRel = path.relative(srcPath, di.file);
42
+ violations.push({
43
+ type: 'deep-relative-import',
44
+ from: fileRel,
45
+ to: di.import,
46
+ description: `Deep relative import (${di.depth} levels): "${di.import}"`,
47
+ severity: di.depth >= 3 ? 'error' : 'warning',
48
+ });
49
+ }
50
+ // 3. Circular dependencies
51
+ const visited = new Set();
52
+ const recursionStack = new Set();
53
+ const cycles = [];
54
+ function detectCycles(file, path_) {
55
+ if (recursionStack.has(file)) {
56
+ const cycleStart = path_.indexOf(file);
57
+ if (cycleStart !== -1) {
58
+ cycles.push([...path_.slice(cycleStart), file]);
59
+ }
60
+ return;
61
+ }
62
+ if (visited.has(file))
63
+ return;
64
+ visited.add(file);
65
+ recursionStack.add(file);
66
+ path_.push(file);
67
+ const imports = graph[file]?.imports || [];
68
+ for (const imp of imports) {
69
+ const resolved = resolveImportPath(file, imp.source, srcPath, files);
70
+ if (resolved) {
71
+ detectCycles(resolved, [...path_]);
72
+ }
73
+ }
74
+ path_.pop();
75
+ recursionStack.delete(file);
76
+ }
77
+ for (const file of files) {
78
+ if (!visited.has(file)) {
79
+ detectCycles(file, []);
80
+ }
81
+ }
82
+ for (const cycle of cycles) {
83
+ const relPaths = cycle.map((f) => path.relative(srcPath, f));
84
+ violations.push({
85
+ type: 'circular-dependency',
86
+ from: relPaths[0],
87
+ to: relPaths[1] || relPaths[0],
88
+ description: `Circular dependency: ${relPaths.join(' → ')}`,
89
+ severity: 'error',
90
+ });
91
+ }
92
+ // 4. Tight coupling (mutual imports)
93
+ const coupledPairs = new Set();
94
+ for (let i = 0; i < files.length; i++) {
95
+ for (let j = i + 1; j < files.length; j++) {
96
+ const pairKey = [files[i], files[j]].sort().join('::');
97
+ if (coupledPairs.has(pairKey))
98
+ continue;
99
+ if (areTightlyCoupled(graph, files[i], files[j])) {
100
+ coupledPairs.add(pairKey);
101
+ const fromRel = path.relative(srcPath, files[i]);
102
+ const toRel = path.relative(srcPath, files[j]);
103
+ violations.push({
104
+ type: 'tight-coupling',
105
+ from: fromRel,
106
+ to: toRel,
107
+ description: `Tight coupling: mutual imports between files`,
108
+ severity: 'warning',
109
+ });
110
+ }
111
+ }
112
+ }
113
+ // Deduplicate violations
114
+ const seen = new Set();
115
+ const uniqueViolations = violations.filter((v) => {
116
+ const key = `${v.type}:${v.from}:${v.to}`;
117
+ if (seen.has(key))
118
+ return false;
119
+ seen.add(key);
120
+ return true;
121
+ });
122
+ // Calculate summary
123
+ const summary = {
124
+ crossFeatureImports: uniqueViolations.filter((v) => v.type === 'cross-feature-import').length,
125
+ deepRelativeImports: uniqueViolations.filter((v) => v.type === 'deep-relative-import').length,
126
+ circularDependencies: uniqueViolations.filter((v) => v.type === 'circular-dependency').length,
127
+ tightCoupling: uniqueViolations.filter((v) => v.type === 'tight-coupling').length,
128
+ };
129
+ // Sort by severity (errors first)
130
+ uniqueViolations.sort((a, b) => {
131
+ if (a.severity === b.severity)
132
+ return a.type.localeCompare(b.type);
133
+ return a.severity === 'error' ? -1 : 1;
134
+ });
135
+ return { violations: uniqueViolations, summary };
136
+ }
137
+ //# sourceMappingURL=18-detect-boundary-violations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"18-detect-boundary-violations.js","sourceRoot":"","sources":["../../src/tools/18-detect-boundary-violations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SuggestModuleSplittingOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function suggestModuleSplitting(appPath: string, config?: Partial<AnalyzerConfig>): Promise<SuggestModuleSplittingOutput>;
3
+ //# sourceMappingURL=19-suggest-module-splitting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"19-suggest-module-splitting.d.ts","sourceRoot":"","sources":["../../src/tools/19-suggest-module-splitting.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,4BAA4B,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAM7F,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,4BAA4B,CAAC,CA4GvC"}
@@ -0,0 +1,160 @@
1
+ // ============================================================================
2
+ // TOOL #19: suggest-module-splitting
3
+ // Detects large or generic files that should be split
4
+ // ============================================================================
5
+ import * as path from 'path';
6
+ import { findSourceFiles, readFileContent, getFileSize, resolveSourceDir } from '../utils/file-scanner.js';
7
+ import { parseFile, extractExports } from '../utils/ast-parser.js';
8
+ import { isKitchenSinkFile, suggestUtilitySplits, } from '../utils/refactor-helpers.js';
9
+ const LARGE_FILE_THRESHOLD_BYTES = 10 * 1024; // 10KB
10
+ const LARGE_LINE_THRESHOLD = 200;
11
+ const MANY_EXPORTS_THRESHOLD = 10;
12
+ export async function suggestModuleSplitting(appPath, config) {
13
+ const srcPath = resolveSourceDir(appPath);
14
+ const files = await findSourceFiles(srcPath);
15
+ const mergedConfig = {
16
+ largeUtilLines: config?.largeUtilLines ?? 200,
17
+ };
18
+ if (files.length === 0) {
19
+ return { splits: [] };
20
+ }
21
+ const splits = [];
22
+ for (const file of files) {
23
+ const content = readFileContent(file);
24
+ if (!content)
25
+ continue;
26
+ const basename = path.basename(file, path.extname(file));
27
+ const relPath = path.relative(srcPath, file);
28
+ const fileSize = getFileSize(file);
29
+ const lineCount = content.split('\n').length;
30
+ // Check 1: Kitchen sink files (utils.js, helpers.js, etc.)
31
+ if (isKitchenSinkFile(file)) {
32
+ const suggestedSplits = suggestUtilitySplits(file, content);
33
+ if (suggestedSplits.length >= 2) {
34
+ const proposedFiles = suggestedSplits.map((s) => `${basename}/${s.category}.ts`);
35
+ splits.push({
36
+ file: relPath,
37
+ suggestion: `Split "${basename}" into ${suggestedSplits.length} domain-specific modules`,
38
+ reason: `Kitchen sink file with ${suggestedSplits.length} distinct categories: ${suggestedSplits.map((s) => s.category).join(', ')}`,
39
+ proposedFiles,
40
+ });
41
+ }
42
+ }
43
+ // Check 2: Large files
44
+ if (lineCount > mergedConfig.largeUtilLines || fileSize > LARGE_FILE_THRESHOLD_BYTES) {
45
+ const parsed = parseFile(file);
46
+ if (parsed) {
47
+ const exports = extractExports(parsed.ast);
48
+ if (exports.length >= MANY_EXPORTS_THRESHOLD) {
49
+ const exportNames = exports.map((e) => e.name);
50
+ // Group exports by likely domain
51
+ const groups = groupExportsByDomain(exportNames);
52
+ if (groups.length >= 2) {
53
+ const proposedFiles = groups.map((g) => `${basename}/${g.domain}.ts`);
54
+ splits.push({
55
+ file: relPath,
56
+ suggestion: `Split large file (${lineCount} lines, ${exports.length} exports) into domain modules`,
57
+ reason: `File is too large (${lineCount} lines) with ${exports.length} exports spanning ${groups.length} domains`,
58
+ proposedFiles,
59
+ });
60
+ }
61
+ }
62
+ }
63
+ }
64
+ // Check 3: Files with many exports (even if not large)
65
+ const parsed = parseFile(file);
66
+ if (parsed) {
67
+ const exports = extractExports(parsed.ast);
68
+ if (exports.length >= MANY_EXPORTS_THRESHOLD * 2) {
69
+ const groups = groupExportsByDomain(exports.map((e) => e.name));
70
+ if (groups.length >= 3) {
71
+ const proposedFiles = groups.map((g) => `${basename}/${g.domain}.ts`);
72
+ splits.push({
73
+ file: relPath,
74
+ suggestion: `Split ${exports.length} exports into ${groups.length} focused modules`,
75
+ reason: `Too many exports (${exports.length}) - consider splitting by responsibility`,
76
+ proposedFiles,
77
+ });
78
+ }
79
+ }
80
+ }
81
+ // Check 4: Generic barrel/index files that re-export everything
82
+ if (basename === 'index' && lineCount > 50) {
83
+ const parsed = parseFile(file);
84
+ if (parsed) {
85
+ const exports = extractExports(parsed.ast);
86
+ if (exports.length > 5) {
87
+ splits.push({
88
+ file: relPath,
89
+ suggestion: 'Consider removing barrel file and using direct imports',
90
+ reason: `Barrel file with ${exports.length} re-exports can cause circular dependencies and slow builds`,
91
+ proposedFiles: [],
92
+ });
93
+ }
94
+ }
95
+ }
96
+ }
97
+ // Deduplicate by file path
98
+ const seen = new Set();
99
+ const uniqueSplits = splits.filter((s) => {
100
+ if (seen.has(s.file))
101
+ return false;
102
+ seen.add(s.file);
103
+ return true;
104
+ });
105
+ return { splits: uniqueSplits };
106
+ }
107
+ /**
108
+ * Group export names by likely domain/category
109
+ */
110
+ function groupExportsByDomain(exportNames) {
111
+ const domains = {
112
+ date: [],
113
+ string: [],
114
+ validation: [],
115
+ formatting: [],
116
+ array: [],
117
+ object: [],
118
+ network: [],
119
+ storage: [],
120
+ dom: [],
121
+ other: [],
122
+ };
123
+ for (const name of exportNames) {
124
+ const lower = name.toLowerCase();
125
+ if (lower.includes('date') || lower.includes('time') || lower.includes('moment') || lower.includes('dayjs')) {
126
+ domains.date.push(name);
127
+ }
128
+ else if (lower.includes('format') || lower.includes('parse') || lower.includes('convert')) {
129
+ domains.formatting.push(name);
130
+ }
131
+ else if (lower.includes('valid') || lower.includes('check') || lower.includes('verify') || lower.includes('is') || lower.includes('has') || lower.includes('can')) {
132
+ domains.validation.push(name);
133
+ }
134
+ else if (lower.includes('trim') || lower.includes('capitalize') || lower.includes('slug') || lower.includes('text') || lower.includes('string') || lower.includes('replace')) {
135
+ domains.string.push(name);
136
+ }
137
+ else if (lower.includes('sort') || lower.includes('filter') || lower.includes('map') || lower.includes('reduce') || lower.includes('group') || lower.includes('unique') || lower.includes('flatten') || lower.includes('chunk')) {
138
+ domains.array.push(name);
139
+ }
140
+ else if (lower.includes('merge') || lower.includes('clone') || lower.includes('pick') || lower.includes('omit') || lower.includes('get') || lower.includes('set') || lower.includes('deep')) {
141
+ domains.object.push(name);
142
+ }
143
+ else if (lower.includes('fetch') || lower.includes('request') || lower.includes('api') || lower.includes('http') || lower.includes('axios') || lower.includes('xhr')) {
144
+ domains.network.push(name);
145
+ }
146
+ else if (lower.includes('store') || lower.includes('cache') || lower.includes('local') || lower.includes('session') || lower.includes('cookie') || lower.includes('storage')) {
147
+ domains.storage.push(name);
148
+ }
149
+ else if (lower.includes('dom') || lower.includes('element') || lower.includes('scroll') || lower.includes('resize') || lower.includes('event') || lower.includes('click') || lower.includes('focus')) {
150
+ domains.dom.push(name);
151
+ }
152
+ else {
153
+ domains.other.push(name);
154
+ }
155
+ }
156
+ return Object.entries(domains)
157
+ .filter(([, names]) => names.length > 0)
158
+ .map(([domain, names]) => ({ domain, names }));
159
+ }
160
+ //# sourceMappingURL=19-suggest-module-splitting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"19-suggest-module-splitting.js","sourceRoot":"","sources":["../../src/tools/19-suggest-module-splitting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { NamingStandardizerOutput, AnalyzerConfig } from '../types.js';
2
+ export declare function namingStandardizer(appPath: string, config?: Partial<AnalyzerConfig>): Promise<NamingStandardizerOutput>;
3
+ //# sourceMappingURL=20-naming-standardizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20-naming-standardizer.d.ts","sourceRoot":"","sources":["../../src/tools/20-naming-standardizer.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,wBAAwB,EAAc,cAAc,EAAE,MAAM,aAAa,CAAC;AAyCxF,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,wBAAwB,CAAC,CA8HnC"}
@@ -0,0 +1,162 @@
1
+ // ============================================================================
2
+ // TOOL #20: naming-standardizer
3
+ // Suggests better file/folder naming conventions
4
+ // ============================================================================
5
+ import * as path from 'path';
6
+ import { findSourceFiles, getDirectoriesAtDepth, resolveSourceDir } from '../utils/file-scanner.js';
7
+ import { toKebabCase, toCamelCase, toPascalCase, } from '../utils/refactor-helpers.js';
8
+ // Recommended conventions
9
+ const FILE_CONVENTION = 'camelCase'; // React convention: camelCase for files
10
+ const FOLDER_CONVENTION = 'kebab-case'; // Folders in kebab-case
11
+ // Files that should stay PascalCase (React components)
12
+ const PASCALCASE_EXCEPTIONS = [
13
+ /\.tsx?$/,
14
+ /\.jsx?$/,
15
+ ];
16
+ // Folder names that should NOT be renamed (standard conventions)
17
+ const PRESERVED_FOLDERS = new Set([
18
+ 'node_modules',
19
+ '.git',
20
+ 'build',
21
+ 'dist',
22
+ 'public',
23
+ 'src',
24
+ 'assets',
25
+ 'components',
26
+ 'hooks',
27
+ 'utils',
28
+ 'lib',
29
+ 'types',
30
+ 'config',
31
+ 'constants',
32
+ 'api',
33
+ 'services',
34
+ 'pages',
35
+ 'views',
36
+ 'features',
37
+ 'shared',
38
+ 'store',
39
+ 'context',
40
+ 'styles',
41
+ 'pages',
42
+ 'layouts',
43
+ ]);
44
+ export async function namingStandardizer(appPath, config) {
45
+ const srcPath = resolveSourceDir(appPath);
46
+ const files = await findSourceFiles(srcPath);
47
+ const renames = [];
48
+ // Analyze file naming
49
+ for (const file of files) {
50
+ const basename = path.basename(file);
51
+ const ext = path.extname(file);
52
+ const nameWithoutExt = basename.replace(ext, '');
53
+ const relPath = path.relative(srcPath, file);
54
+ const dirname = path.dirname(relPath);
55
+ // Skip node_modules, build, etc.
56
+ if (relPath.includes('node_modules') || relPath.includes('build'))
57
+ continue;
58
+ // Check if this is a React component file (should be PascalCase)
59
+ const isComponent = /^[A-Z]/.test(nameWithoutExt) && PASCALCASE_EXCEPTIONS.some((re) => re.test(basename));
60
+ if (isComponent) {
61
+ // Components should be PascalCase
62
+ const pascal = toPascalCase(nameWithoutExt);
63
+ if (nameWithoutExt !== pascal) {
64
+ renames.push({
65
+ from: relPath,
66
+ to: path.join(dirname, pascal + ext),
67
+ reason: `Component file should use PascalCase: "${pascal}${ext}"`,
68
+ });
69
+ }
70
+ }
71
+ else {
72
+ // Non-component files should be camelCase
73
+ const camel = toCamelCase(nameWithoutExt);
74
+ if (nameWithoutExt !== camel) {
75
+ renames.push({
76
+ from: relPath,
77
+ to: path.join(dirname, camel + ext),
78
+ reason: `Non-component file should use camelCase: "${camel}${ext}"`,
79
+ });
80
+ }
81
+ }
82
+ // Check for generic names
83
+ const genericNames = ['index', 'utils', 'helpers', 'common', 'lib', 'misc', 'temp', 'untitled'];
84
+ if (genericNames.includes(nameWithoutExt.toLowerCase()) && ext !== '.css' && ext !== '.scss') {
85
+ renames.push({
86
+ from: relPath,
87
+ to: relPath, // Don't suggest a specific rename, just flag it
88
+ reason: `Generic filename "${basename}" - consider a more descriptive name`,
89
+ });
90
+ }
91
+ // Check for inconsistent separators
92
+ if (nameWithoutExt.includes('_') && !nameWithoutExt.includes('-')) {
93
+ const kebab = toKebabCase(nameWithoutExt);
94
+ if (nameWithoutExt !== kebab) {
95
+ renames.push({
96
+ from: relPath,
97
+ to: path.join(dirname, kebab + ext),
98
+ reason: `Inconsistent naming: use "${kebab}${ext}" instead of "${basename}"`,
99
+ });
100
+ }
101
+ }
102
+ // Check for SCREAMING_SNAKE_CASE in non-config files
103
+ if (/^[A-Z][A-Z0-9_]+$/.test(nameWithoutExt) && !relPath.includes('config') && !relPath.includes('constants')) {
104
+ const camel = toCamelCase(nameWithoutExt);
105
+ renames.push({
106
+ from: relPath,
107
+ to: path.join(dirname, camel + ext),
108
+ reason: `SCREAMING_SNAKE_CASE is only for constants/config: use "${camel}${ext}"`,
109
+ });
110
+ }
111
+ // Check for spaces in filenames
112
+ if (basename.includes(' ')) {
113
+ const kebab = toKebabCase(nameWithoutExt);
114
+ renames.push({
115
+ from: relPath,
116
+ to: path.join(dirname, kebab + ext),
117
+ reason: `Filename contains spaces: use "${kebab}${ext}"`,
118
+ });
119
+ }
120
+ }
121
+ // Analyze folder naming
122
+ const dirs = getDirectoriesAtDepth(srcPath, 5);
123
+ for (const dir of dirs) {
124
+ const parts = dir.split(path.sep);
125
+ const lastPart = parts[parts.length - 1];
126
+ if (PRESERVED_FOLDERS.has(lastPart))
127
+ continue;
128
+ // Folder names should be kebab-case
129
+ const kebab = toKebabCase(lastPart);
130
+ if (lastPart !== kebab && lastPart !== toCamelCase(lastPart)) {
131
+ renames.push({
132
+ from: dir,
133
+ to: path.join(...parts.slice(0, -1), kebab),
134
+ reason: `Folder should use kebab-case: "${kebab}"`,
135
+ });
136
+ }
137
+ }
138
+ // Deduplicate renames
139
+ const seen = new Set();
140
+ const uniqueRenames = renames.filter((r) => {
141
+ // Don't include renames where from === to (just warnings)
142
+ if (r.from === r.to && r.reason.includes('Generic filename')) {
143
+ // Keep these as warnings
144
+ }
145
+ else if (r.from === r.to) {
146
+ return false;
147
+ }
148
+ const key = r.from;
149
+ if (seen.has(key))
150
+ return false;
151
+ seen.add(key);
152
+ return true;
153
+ });
154
+ return {
155
+ renames: uniqueRenames,
156
+ conventions: {
157
+ files: FILE_CONVENTION,
158
+ folders: FOLDER_CONVENTION,
159
+ },
160
+ };
161
+ }
162
+ //# sourceMappingURL=20-naming-standardizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20-naming-standardizer.js","sourceRoot":"","sources":["../../src/tools/20-naming-standardizer.ts"],"names":[],"mappings":"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"}