mcp-react-toolkit 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -42
- package/package.json +13 -5
- package/server.json +20 -0
- package/tools/accessibility-checker/build/index.js +9 -5
- package/tools/accessibility-checker/build/index.js.map +1 -1
- package/tools/accessibility-checker/build/rules.d.ts.map +1 -1
- package/tools/accessibility-checker/build/rules.js +325 -94
- package/tools/accessibility-checker/build/rules.js.map +1 -1
- package/tools/code-modernizer/build/tools/01-convert-to-typescript.d.ts.map +1 -1
- package/tools/code-modernizer/build/tools/01-convert-to-typescript.js +65 -50
- package/tools/code-modernizer/build/tools/01-convert-to-typescript.js.map +1 -1
- package/tools/code-modernizer/build/types.d.ts +1 -0
- package/tools/code-modernizer/build/types.d.ts.map +1 -1
- package/tools/code-modernizer/build/utils/ast-parser.d.ts.map +1 -1
- package/tools/code-modernizer/build/utils/ast-parser.js +30 -14
- package/tools/code-modernizer/build/utils/ast-parser.js.map +1 -1
- package/tools/code-modernizer/build/utils/type-generator.d.ts +1 -1
- package/tools/code-modernizer/build/utils/type-generator.d.ts.map +1 -1
- package/tools/code-modernizer/build/utils/type-generator.js +72 -23
- package/tools/code-modernizer/build/utils/type-generator.js.map +1 -1
- package/tools/component-factory/build/index.js +59 -7
- package/tools/component-factory/build/index.js.map +1 -1
- package/tools/component-fixer/README.md +44 -0
- package/tools/component-fixer/build/index.d.ts +3 -0
- package/tools/component-fixer/build/index.d.ts.map +1 -0
- package/tools/component-fixer/build/index.js +647 -0
- package/tools/component-fixer/build/index.js.map +1 -0
- package/tools/component-fixer/build/index.test.d.ts +2 -0
- package/tools/component-fixer/build/index.test.d.ts.map +1 -0
- package/tools/component-fixer/build/index.test.js.map +1 -0
- package/tools/component-fixer/package.json +20 -0
- package/tools/component-reviewer/README.md +54 -0
- package/tools/component-reviewer/build/index.d.ts +39 -0
- package/tools/component-reviewer/build/index.d.ts.map +1 -0
- package/tools/component-reviewer/build/index.js +946 -0
- package/tools/component-reviewer/build/index.js.map +1 -0
- package/tools/component-reviewer/build/index.test.d.ts +2 -0
- package/tools/component-reviewer/build/index.test.d.ts.map +1 -0
- package/tools/component-reviewer/build/index.test.js.map +1 -0
- package/tools/component-reviewer/package.json +20 -0
- package/tools/dep-auditor/build/index.d.ts +1 -0
- package/tools/dep-auditor/build/index.d.ts.map +1 -1
- package/tools/dep-auditor/build/index.js +71 -16
- package/tools/dep-auditor/build/index.js.map +1 -1
- package/tools/generate-tests/build/analyzer.d.ts +14 -0
- package/tools/generate-tests/build/analyzer.d.ts.map +1 -1
- package/tools/generate-tests/build/analyzer.js +96 -42
- package/tools/generate-tests/build/analyzer.js.map +1 -1
- package/tools/generate-tests/build/generators.d.ts.map +1 -1
- package/tools/generate-tests/build/generators.js +304 -79
- package/tools/generate-tests/build/generators.js.map +1 -1
- package/tools/generate-tests/build/index.js +29 -10
- package/tools/generate-tests/build/index.js.map +1 -1
- package/tools/json-viewer/build/index.js +29 -6
- package/tools/json-viewer/build/index.js.map +1 -1
- package/tools/legacy-analyzer/README.md +66 -0
- package/tools/legacy-analyzer/build/index.d.ts +3 -0
- package/tools/legacy-analyzer/build/index.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/index.js +209 -0
- package/tools/legacy-analyzer/build/index.js.map +1 -0
- package/tools/legacy-analyzer/build/index.test.d.ts +2 -0
- package/tools/legacy-analyzer/build/index.test.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/index.test.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js +115 -0
- package/tools/legacy-analyzer/build/tools/01-detect-project-tech.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js +85 -0
- package/tools/legacy-analyzer/build/tools/02-analyze-folder-structure.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.js +87 -0
- package/tools/legacy-analyzer/build/tools/03-analyze-components.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js +133 -0
- package/tools/legacy-analyzer/build/tools/04-analyze-state-management.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js +160 -0
- package/tools/legacy-analyzer/build/tools/05-analyze-api-layer.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.js +150 -0
- package/tools/legacy-analyzer/build/tools/06-analyze-routing.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.js +131 -0
- package/tools/legacy-analyzer/build/tools/07-analyze-styling.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.js +85 -0
- package/tools/legacy-analyzer/build/tools/08-analyze-assets.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js +329 -0
- package/tools/legacy-analyzer/build/tools/09-detect-anti-patterns.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.js +192 -0
- package/tools/legacy-analyzer/build/tools/10-detect-duplication.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js +232 -0
- package/tools/legacy-analyzer/build/tools/11-analyze-dependencies-usage.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js +247 -0
- package/tools/legacy-analyzer/build/tools/12-analyze-legacy-app.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.js +141 -0
- package/tools/legacy-analyzer/build/tools/13-detect-features.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.js +76 -0
- package/tools/legacy-analyzer/build/tools/14-classify-files.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js +70 -0
- package/tools/legacy-analyzer/build/tools/15-detect-shared-modules.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.js +26 -0
- package/tools/legacy-analyzer/build/tools/16-design-target-structure.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js +108 -0
- package/tools/legacy-analyzer/build/tools/17-map-files-to-target.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js +137 -0
- package/tools/legacy-analyzer/build/tools/18-detect-boundary-violations.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js +160 -0
- package/tools/legacy-analyzer/build/tools/19-suggest-module-splitting.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js +162 -0
- package/tools/legacy-analyzer/build/tools/20-naming-standardizer.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js +108 -0
- package/tools/legacy-analyzer/build/tools/21-generate-refactor-plan.js.map +1 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts +3 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js +98 -0
- package/tools/legacy-analyzer/build/tools/22-refactor-folder-structure.js.map +1 -0
- package/tools/legacy-analyzer/build/types.d.ts +413 -0
- package/tools/legacy-analyzer/build/types.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/types.js +12 -0
- package/tools/legacy-analyzer/build/types.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.d.ts +34 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.js +394 -0
- package/tools/legacy-analyzer/build/utils/ast-parser.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.d.ts +51 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.js +174 -0
- package/tools/legacy-analyzer/build/utils/file-scanner.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.d.ts +38 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.js +194 -0
- package/tools/legacy-analyzer/build/utils/import-tracker.js.map +1 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts +88 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.d.ts.map +1 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.js +538 -0
- package/tools/legacy-analyzer/build/utils/refactor-helpers.js.map +1 -0
- package/tools/legacy-analyzer/package.json +20 -0
- package/tools/lighthouse-runner/README.md +45 -0
- package/tools/lighthouse-runner/build/index.d.ts +6 -0
- package/tools/lighthouse-runner/build/index.d.ts.map +1 -0
- package/tools/lighthouse-runner/build/index.js +295 -0
- package/tools/lighthouse-runner/build/index.js.map +1 -0
- package/tools/lighthouse-runner/build/index.test.d.ts +2 -0
- package/tools/lighthouse-runner/build/index.test.d.ts.map +1 -0
- package/tools/lighthouse-runner/build/index.test.js.map +1 -0
- package/tools/lighthouse-runner/package.json +20 -0
- package/tools/monorepo-manager/build/utils.d.ts.map +1 -1
- package/tools/monorepo-manager/build/utils.js +12 -9
- package/tools/monorepo-manager/build/utils.js.map +1 -1
- package/tools/performance-audit/README.md +37 -0
- package/tools/performance-audit/build/index.d.ts +13 -0
- package/tools/performance-audit/build/index.d.ts.map +1 -0
- package/tools/performance-audit/build/index.js +311 -0
- package/tools/performance-audit/build/index.js.map +1 -0
- package/tools/performance-audit/build/index.test.d.ts +2 -0
- package/tools/performance-audit/build/index.test.d.ts.map +1 -0
- package/tools/performance-audit/build/index.test.js.map +1 -0
- package/tools/performance-audit/package.json +20 -0
- package/tools/quality-pipeline/build/index.js +55 -15
- package/tools/quality-pipeline/build/index.js.map +1 -1
- package/tools/render-analyzer/README.md +43 -0
- package/tools/render-analyzer/build/index.d.ts +25 -0
- package/tools/render-analyzer/build/index.d.ts.map +1 -0
- package/tools/render-analyzer/build/index.js +342 -0
- package/tools/render-analyzer/build/index.js.map +1 -0
- package/tools/render-analyzer/build/index.test.d.ts +2 -0
- package/tools/render-analyzer/build/index.test.d.ts.map +1 -0
- package/tools/render-analyzer/build/index.test.js.map +1 -0
- package/tools/render-analyzer/package.json +20 -0
- package/tools/shared/build/fs.d.ts +8 -0
- package/tools/shared/build/fs.d.ts.map +1 -0
- package/tools/shared/build/fs.js +45 -0
- package/tools/shared/build/fs.js.map +1 -0
- package/tools/shared/build/index.d.ts +1 -0
- package/tools/shared/build/index.d.ts.map +1 -1
- package/tools/shared/build/index.js +1 -0
- package/tools/shared/build/index.js.map +1 -1
- package/tools/storybook-generator/README.md +39 -0
- package/tools/storybook-generator/build/index.d.ts +13 -0
- package/tools/storybook-generator/build/index.d.ts.map +1 -0
- package/tools/storybook-generator/build/index.js +478 -0
- package/tools/storybook-generator/build/index.js.map +1 -0
- package/tools/storybook-generator/build/index.test.d.ts +2 -0
- package/tools/storybook-generator/build/index.test.d.ts.map +1 -0
- package/tools/storybook-generator/build/index.test.js.map +1 -0
- package/tools/storybook-generator/package.json +20 -0
- package/tools/test-gap-analyzer/README.md +41 -0
- package/tools/test-gap-analyzer/build/index.d.ts +20 -0
- package/tools/test-gap-analyzer/build/index.d.ts.map +1 -0
- package/tools/test-gap-analyzer/build/index.js +371 -0
- package/tools/test-gap-analyzer/build/index.js.map +1 -0
- package/tools/test-gap-analyzer/build/index.test.d.ts +2 -0
- package/tools/test-gap-analyzer/build/index.test.d.ts.map +1 -0
- package/tools/test-gap-analyzer/build/index.test.js.map +1 -0
- package/tools/test-gap-analyzer/package.json +20 -0
- package/tools/typescript-enforcer/build/scanner.d.ts.map +1 -1
- package/tools/typescript-enforcer/build/scanner.js +13 -1
- package/tools/typescript-enforcer/build/scanner.js.map +1 -1
- package/tools/typescript-enforcer/build/types.d.ts +1 -0
- package/tools/typescript-enforcer/build/types.d.ts.map +1 -1
|
@@ -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":"AAAA,+EAA+E;AAC/E,qCAAqC;AACrC,sDAAsD;AACtD,+EAA+E;AAE/E,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;AACrD,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,MAAgC;IAEhC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG;QACnB,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,GAAG;KAC9C,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAE7C,2DAA2D;QAC3D,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5D,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CACtC,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,UAAU,QAAQ,UAAU,eAAe,CAAC,MAAM,0BAA0B;oBACxF,MAAM,EAAE,0BAA0B,eAAe,CAAC,MAAM,yBAAyB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACpI,aAAa;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,SAAS,GAAG,YAAY,CAAC,cAAc,IAAI,QAAQ,GAAG,0BAA0B,EAAE,CAAC;YACrF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAI,OAAO,CAAC,MAAM,IAAI,sBAAsB,EAAE,CAAC;oBAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC/C,iCAAiC;oBACjC,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;oBACjD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBACvB,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CACpC,CAAC;wBACF,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,OAAO;4BACb,UAAU,EAAE,qBAAqB,SAAS,WAAW,OAAO,CAAC,MAAM,+BAA+B;4BAClG,MAAM,EAAE,sBAAsB,SAAS,gBAAgB,OAAO,CAAC,MAAM,qBAAqB,MAAM,CAAC,MAAM,UAAU;4BACjH,aAAa;yBACd,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,MAAM,IAAI,sBAAsB,GAAG,CAAC,EAAE,CAAC;gBACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChE,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACvB,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CACpC,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,OAAO;wBACb,UAAU,EAAE,SAAS,OAAO,CAAC,MAAM,iBAAiB,MAAM,CAAC,MAAM,kBAAkB;wBACnF,MAAM,EAAE,qBAAqB,OAAO,CAAC,MAAM,0CAA0C;wBACrF,aAAa;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,QAAQ,KAAK,OAAO,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,OAAO;wBACb,UAAU,EAAE,wDAAwD;wBACpE,MAAM,EAAE,oBAAoB,OAAO,CAAC,MAAM,6DAA6D;wBACvG,aAAa,EAAE,EAAE;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACvC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,WAAqB;IACjD,MAAM,OAAO,GAA6B;QACxC,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,EAAE;KACV,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5G,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5F,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpK,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/K,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9L,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/K,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACvM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"21-generate-refactor-plan.d.ts","sourceRoot":"","sources":["../../src/tools/21-generate-refactor-plan.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,0BAA0B,EAAgB,cAAc,EAAE,MAAM,aAAa,CAAC;AAE5F,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAsHrC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// TOOL #21: generate-refactor-plan
|
|
3
|
+
// Combines all outputs from tools 13-20 into a single unified refactor plan
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { detectFeatures } from './13-detect-features.js';
|
|
6
|
+
import { classifyFiles } from './14-classify-files.js';
|
|
7
|
+
import { detectSharedModules } from './15-detect-shared-modules.js';
|
|
8
|
+
import { designTargetStructure } from './16-design-target-structure.js';
|
|
9
|
+
import { mapFilesToTarget } from './17-map-files-to-target.js';
|
|
10
|
+
import { detectBoundaryViolations } from './18-detect-boundary-violations.js';
|
|
11
|
+
import { suggestModuleSplitting } from './19-suggest-module-splitting.js';
|
|
12
|
+
import { namingStandardizer } from './20-naming-standardizer.js';
|
|
13
|
+
export async function generateRefactorPlan(appPath, config) {
|
|
14
|
+
// Run all tools in parallel where possible
|
|
15
|
+
const [featuresResult, classificationResult, sharedResult, violationsResult, splitsResult, namingResult,] = await Promise.all([
|
|
16
|
+
detectFeatures(appPath, config),
|
|
17
|
+
classifyFiles(appPath, config),
|
|
18
|
+
detectSharedModules(appPath, config),
|
|
19
|
+
detectBoundaryViolations(appPath, config),
|
|
20
|
+
suggestModuleSplitting(appPath, config),
|
|
21
|
+
namingStandardizer(appPath, config),
|
|
22
|
+
]);
|
|
23
|
+
// Design target structure based on detected features
|
|
24
|
+
const structureResult = await designTargetStructure(appPath, config, featuresResult.features);
|
|
25
|
+
// Map files to target structure
|
|
26
|
+
const mappingResult = await mapFilesToTarget(appPath, config);
|
|
27
|
+
// Generate ordered refactor steps
|
|
28
|
+
const steps = [];
|
|
29
|
+
let order = 1;
|
|
30
|
+
// Step 1: Fix boundary violations first (prerequisite for clean moves)
|
|
31
|
+
if (violationsResult.violations.length > 0) {
|
|
32
|
+
steps.push({
|
|
33
|
+
order: order++,
|
|
34
|
+
action: 'fix-boundary-violations',
|
|
35
|
+
description: `Fix ${violationsResult.violations.length} boundary violations (cross-feature imports, circular deps, etc.)`,
|
|
36
|
+
affectedFiles: [
|
|
37
|
+
...new Set(violationsResult.violations.flatMap((v) => [v.from, v.to])),
|
|
38
|
+
],
|
|
39
|
+
priority: 'high',
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Step 2: Split large/generic modules
|
|
43
|
+
if (splitsResult.splits.length > 0) {
|
|
44
|
+
steps.push({
|
|
45
|
+
order: order++,
|
|
46
|
+
action: 'split-modules',
|
|
47
|
+
description: `Split ${splitsResult.splits.length} large/generic files into focused modules`,
|
|
48
|
+
affectedFiles: splitsResult.splits.map((s) => s.file),
|
|
49
|
+
priority: 'high',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Step 3: Create target folder structure
|
|
53
|
+
steps.push({
|
|
54
|
+
order: order++,
|
|
55
|
+
action: 'create-structure',
|
|
56
|
+
description: `Create feature-based folder structure with ${featuresResult.features.length} features`,
|
|
57
|
+
affectedFiles: [],
|
|
58
|
+
priority: 'medium',
|
|
59
|
+
});
|
|
60
|
+
// Step 4: Move files to target locations
|
|
61
|
+
if (mappingResult.moves.length > 0) {
|
|
62
|
+
steps.push({
|
|
63
|
+
order: order++,
|
|
64
|
+
action: 'move-files',
|
|
65
|
+
description: `Move ${mappingResult.moves.length} files to their target locations`,
|
|
66
|
+
affectedFiles: mappingResult.moves.map((m) => m.from),
|
|
67
|
+
priority: 'medium',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Step 5: Rename files for consistency
|
|
71
|
+
if (namingResult.renames.length > 0) {
|
|
72
|
+
steps.push({
|
|
73
|
+
order: order++,
|
|
74
|
+
action: 'rename-files',
|
|
75
|
+
description: `Rename ${namingResult.renames.length} files/folders for consistent naming`,
|
|
76
|
+
affectedFiles: namingResult.renames.map((r) => r.from),
|
|
77
|
+
priority: 'low',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// Step 6: Update imports
|
|
81
|
+
if (mappingResult.moves.length > 0) {
|
|
82
|
+
steps.push({
|
|
83
|
+
order: order++,
|
|
84
|
+
action: 'update-imports',
|
|
85
|
+
description: `Update import paths after file moves`,
|
|
86
|
+
affectedFiles: mappingResult.moves.map((m) => m.to),
|
|
87
|
+
priority: 'medium',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Calculate estimated effort
|
|
91
|
+
const estimatedEffort = {
|
|
92
|
+
filesToMove: mappingResult.moves.length,
|
|
93
|
+
filesToSplit: splitsResult.splits.length,
|
|
94
|
+
filesToRename: namingResult.renames.filter((r) => r.from !== r.to).length,
|
|
95
|
+
violationsToFix: violationsResult.violations.filter((v) => v.severity === 'error').length,
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
features: featuresResult.features,
|
|
99
|
+
targetStructure: structureResult.structure,
|
|
100
|
+
fileMoves: mappingResult.moves,
|
|
101
|
+
splits: splitsResult.splits,
|
|
102
|
+
renames: namingResult.renames,
|
|
103
|
+
violations: violationsResult.violations,
|
|
104
|
+
steps,
|
|
105
|
+
estimatedEffort,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=21-generate-refactor-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"21-generate-refactor-plan.js","sourceRoot":"","sources":["../../src/tools/21-generate-refactor-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { RefactorFolderStructureOutput, AnalyzerConfig } from '../types.js';
|
|
2
|
+
export declare function refactorFolderStructure(appPath: string, config?: Partial<AnalyzerConfig>): Promise<RefactorFolderStructureOutput>;
|
|
3
|
+
//# sourceMappingURL=22-refactor-folder-structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"22-refactor-folder-structure.d.ts","sourceRoot":"","sources":["../../src/tools/22-refactor-folder-structure.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjF,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CA4HxC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// TOOL #22: refactor-folder-structure (AGGREGATOR)
|
|
3
|
+
// Top-level tool that calls all refactor tools + existing analysis tools
|
|
4
|
+
// and produces a comprehensive structured plan
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { detectFeatures } from './13-detect-features.js';
|
|
7
|
+
import { detectSharedModules } from './15-detect-shared-modules.js';
|
|
8
|
+
import { generateRefactorPlan } from './21-generate-refactor-plan.js';
|
|
9
|
+
export async function refactorFolderStructure(appPath, config) {
|
|
10
|
+
// Run the comprehensive refactor plan (which calls tools 13-20 internally)
|
|
11
|
+
const plan = await generateRefactorPlan(appPath, config);
|
|
12
|
+
// Also run individual tools for detailed output
|
|
13
|
+
const [featuresResult, sharedResult] = await Promise.all([
|
|
14
|
+
detectFeatures(appPath, config),
|
|
15
|
+
detectSharedModules(appPath, config),
|
|
16
|
+
]);
|
|
17
|
+
// Calculate overall complexity
|
|
18
|
+
const totalMoves = plan.fileMoves.length;
|
|
19
|
+
const totalSplits = plan.splits.length;
|
|
20
|
+
const totalViolations = plan.violations.length;
|
|
21
|
+
const errorViolations = plan.violations.filter((v) => v.severity === 'error').length;
|
|
22
|
+
let overallComplexity;
|
|
23
|
+
if (totalMoves < 10 && totalSplits < 3 && errorViolations === 0) {
|
|
24
|
+
overallComplexity = 'low';
|
|
25
|
+
}
|
|
26
|
+
else if (totalMoves < 50 && totalSplits < 10 && errorViolations < 5) {
|
|
27
|
+
overallComplexity = 'medium';
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
overallComplexity = 'high';
|
|
31
|
+
}
|
|
32
|
+
// Generate improvements list
|
|
33
|
+
const improvements = [];
|
|
34
|
+
if (plan.features.length > 0) {
|
|
35
|
+
improvements.push(`Organize code into ${plan.features.length} feature modules: ${plan.features.join(', ')}`);
|
|
36
|
+
}
|
|
37
|
+
if (totalMoves > 0) {
|
|
38
|
+
improvements.push(`Move ${totalMoves} files to feature-based structure for better discoverability`);
|
|
39
|
+
}
|
|
40
|
+
if (sharedResult.shared.length > 0) {
|
|
41
|
+
improvements.push(`Extract ${sharedResult.shared.length} shared modules to prevent code duplication`);
|
|
42
|
+
}
|
|
43
|
+
if (totalSplits > 0) {
|
|
44
|
+
improvements.push(`Split ${totalSplits} large/generic files into focused, single-responsibility modules`);
|
|
45
|
+
}
|
|
46
|
+
if (plan.renames.length > 0) {
|
|
47
|
+
improvements.push(`Standardize naming for ${plan.renames.length} files/folders for consistency`);
|
|
48
|
+
}
|
|
49
|
+
if (totalViolations === 0) {
|
|
50
|
+
improvements.push('No architectural boundary violations detected');
|
|
51
|
+
}
|
|
52
|
+
// Generate warnings
|
|
53
|
+
const warnings = [];
|
|
54
|
+
if (errorViolations > 0) {
|
|
55
|
+
warnings.push(`${errorViolations} critical boundary violations must be fixed before refactoring`);
|
|
56
|
+
}
|
|
57
|
+
if (plan.violations.some((v) => v.type === 'circular-dependency')) {
|
|
58
|
+
warnings.push('Circular dependencies detected - these must be resolved before moving files');
|
|
59
|
+
}
|
|
60
|
+
if (totalMoves > 100) {
|
|
61
|
+
warnings.push(`Large number of file moves (${totalMoves}) - consider incremental migration`);
|
|
62
|
+
}
|
|
63
|
+
if (plan.features.length === 0) {
|
|
64
|
+
warnings.push('No clear features detected - file may need manual feature assignment');
|
|
65
|
+
}
|
|
66
|
+
const unmapped = plan.fileMoves.filter(() => false); // unmapped handled in map-files-to-target
|
|
67
|
+
if (plan.fileMoves.length === 0 && plan.features.length > 0) {
|
|
68
|
+
warnings.push('Files may already be well-organized or need manual review');
|
|
69
|
+
}
|
|
70
|
+
// Build feature details
|
|
71
|
+
const featureDetails = {};
|
|
72
|
+
for (const feature of plan.features) {
|
|
73
|
+
featureDetails[feature] = featuresResult.featureMap[feature] || [];
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
summary: {
|
|
77
|
+
appPath,
|
|
78
|
+
analysisDate: new Date().toISOString(),
|
|
79
|
+
featuresDetected: plan.features.length,
|
|
80
|
+
filesToMove: totalMoves,
|
|
81
|
+
filesToSplit: totalSplits,
|
|
82
|
+
violationsFound: totalViolations,
|
|
83
|
+
overallComplexity,
|
|
84
|
+
},
|
|
85
|
+
features: plan.features,
|
|
86
|
+
featureDetails,
|
|
87
|
+
structure: plan.targetStructure,
|
|
88
|
+
moves: plan.fileMoves,
|
|
89
|
+
splits: plan.splits,
|
|
90
|
+
renames: plan.renames,
|
|
91
|
+
sharedModules: sharedResult.shared,
|
|
92
|
+
violations: plan.violations,
|
|
93
|
+
refactorSteps: plan.steps,
|
|
94
|
+
improvements,
|
|
95
|
+
warnings,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=22-refactor-folder-structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"22-refactor-folder-structure.js","sourceRoot":"","sources":["../../src/tools/22-refactor-folder-structure.ts"],"names":[],"mappings":"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"}
|