@theihtisham/agent-shadow-brain 2.1.0 → 3.0.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 (56) hide show
  1. package/dist/brain/accessibility-checker.d.ts +10 -0
  2. package/dist/brain/accessibility-checker.d.ts.map +1 -0
  3. package/dist/brain/accessibility-checker.js +379 -0
  4. package/dist/brain/accessibility-checker.js.map +1 -0
  5. package/dist/brain/api-contract-analyzer.d.ts +19 -0
  6. package/dist/brain/api-contract-analyzer.d.ts.map +1 -0
  7. package/dist/brain/api-contract-analyzer.js +251 -0
  8. package/dist/brain/api-contract-analyzer.js.map +1 -0
  9. package/dist/brain/ast-analyzer.d.ts +23 -0
  10. package/dist/brain/ast-analyzer.d.ts.map +1 -0
  11. package/dist/brain/ast-analyzer.js +462 -0
  12. package/dist/brain/ast-analyzer.js.map +1 -0
  13. package/dist/brain/code-age-analyzer.d.ts +11 -0
  14. package/dist/brain/code-age-analyzer.d.ts.map +1 -0
  15. package/dist/brain/code-age-analyzer.js +152 -0
  16. package/dist/brain/code-age-analyzer.js.map +1 -0
  17. package/dist/brain/config-drift-detector.d.ts +13 -0
  18. package/dist/brain/config-drift-detector.d.ts.map +1 -0
  19. package/dist/brain/config-drift-detector.js +198 -0
  20. package/dist/brain/config-drift-detector.js.map +1 -0
  21. package/dist/brain/dead-code-eliminator.d.ts +16 -0
  22. package/dist/brain/dead-code-eliminator.d.ts.map +1 -0
  23. package/dist/brain/dead-code-eliminator.js +359 -0
  24. package/dist/brain/dead-code-eliminator.js.map +1 -0
  25. package/dist/brain/env-analyzer.d.ts +13 -0
  26. package/dist/brain/env-analyzer.d.ts.map +1 -0
  27. package/dist/brain/env-analyzer.js +277 -0
  28. package/dist/brain/env-analyzer.js.map +1 -0
  29. package/dist/brain/i18n-detector.d.ts +12 -0
  30. package/dist/brain/i18n-detector.d.ts.map +1 -0
  31. package/dist/brain/i18n-detector.js +242 -0
  32. package/dist/brain/i18n-detector.js.map +1 -0
  33. package/dist/brain/license-compliance.d.ts +13 -0
  34. package/dist/brain/license-compliance.d.ts.map +1 -0
  35. package/dist/brain/license-compliance.js +213 -0
  36. package/dist/brain/license-compliance.js.map +1 -0
  37. package/dist/brain/llm-client.d.ts.map +1 -1
  38. package/dist/brain/llm-client.js +3 -0
  39. package/dist/brain/llm-client.js.map +1 -1
  40. package/dist/brain/mutation-advisor.d.ts +11 -0
  41. package/dist/brain/mutation-advisor.d.ts.map +1 -0
  42. package/dist/brain/mutation-advisor.js +154 -0
  43. package/dist/brain/mutation-advisor.js.map +1 -0
  44. package/dist/brain/orchestrator.d.ts +48 -1
  45. package/dist/brain/orchestrator.d.ts.map +1 -1
  46. package/dist/brain/orchestrator.js +178 -2
  47. package/dist/brain/orchestrator.js.map +1 -1
  48. package/dist/cli.js +408 -3
  49. package/dist/cli.js.map +1 -1
  50. package/dist/index.d.ts +11 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +12 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/types.d.ts +151 -2
  55. package/dist/types.d.ts.map +1 -1
  56. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-age-analyzer.js","sourceRoot":"","sources":["../../src/brain/code-age-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { BrainInsight } from '../types.js';
2
+ export declare class ConfigDriftDetector {
3
+ private projectDir;
4
+ constructor(projectDir: string);
5
+ analyzeProject(): Promise<BrainInsight[]>;
6
+ private detectMissingConfigs;
7
+ private detectTsconfigDrift;
8
+ private detectGitignoreDrift;
9
+ private detectPackageJsonDrift;
10
+ private detectEditorConfigDrift;
11
+ private driftToInsight;
12
+ }
13
+ //# sourceMappingURL=config-drift-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-drift-detector.d.ts","sourceRoot":"","sources":["../../src/brain/config-drift-detector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AA0BxD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAIxB,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAqB/C,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,sBAAsB;IAgC9B,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,cAAc;CAkBvB"}
@@ -0,0 +1,198 @@
1
+ // src/brain/config-drift-detector.ts — Configuration drift detection
2
+ // v3.0.0 — Detects drift between expected and actual config across environments
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ const TEMPLATES = [
6
+ { path: 'tsconfig.json', required: true },
7
+ { path: '.eslintrc.json', required: false },
8
+ { path: '.eslintrc.js', required: false },
9
+ { path: '.prettierrc', required: false },
10
+ { path: '.prettierrc.json', required: false },
11
+ { path: 'jest.config.js', required: false },
12
+ { path: 'jest.config.ts', required: false },
13
+ { path: '.gitignore', required: true },
14
+ { path: '.editorconfig', required: false },
15
+ { path: '.npmrc', required: false },
16
+ { path: '.nvmrc', required: false },
17
+ { path: 'docker-compose.yml', required: false },
18
+ { path: 'Dockerfile', required: false },
19
+ ];
20
+ export class ConfigDriftDetector {
21
+ constructor(projectDir) {
22
+ this.projectDir = projectDir;
23
+ }
24
+ async analyzeProject() {
25
+ const drifts = [];
26
+ // Phase 1: Missing required config files
27
+ drifts.push(...this.detectMissingConfigs());
28
+ // Phase 2: tsconfig.json drift
29
+ drifts.push(...this.detectTsconfigDrift());
30
+ // Phase 3: .gitignore drift
31
+ drifts.push(...this.detectGitignoreDrift());
32
+ // Phase 4: package.json consistency
33
+ drifts.push(...this.detectPackageJsonDrift());
34
+ // Phase 5: Editor config consistency
35
+ drifts.push(...this.detectEditorConfigDrift());
36
+ return drifts.map(d => this.driftToInsight(d));
37
+ }
38
+ detectMissingConfigs() {
39
+ const drifts = [];
40
+ for (const template of TEMPLATES) {
41
+ const fullPath = path.join(this.projectDir, template.path);
42
+ const exists = fs.existsSync(fullPath);
43
+ if (template.required && !exists) {
44
+ drifts.push({
45
+ file: template.path,
46
+ expected: 'File should exist',
47
+ actual: 'File is missing',
48
+ severity: 'high',
49
+ description: `Required config file ${template.path} is missing. This may cause inconsistent behavior across environments.`,
50
+ autoFixable: true,
51
+ });
52
+ }
53
+ }
54
+ return drifts;
55
+ }
56
+ detectTsconfigDrift() {
57
+ const drifts = [];
58
+ const tsconfigPath = path.join(this.projectDir, 'tsconfig.json');
59
+ let tsconfig;
60
+ try {
61
+ tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, 'utf-8'));
62
+ }
63
+ catch {
64
+ return drifts; // missing tsconfig handled above
65
+ }
66
+ const compilerOptions = (tsconfig.compilerOptions || {});
67
+ // Check for recommended settings
68
+ const recommended = {
69
+ 'strict': { value: true, reason: 'Strict mode catches many common bugs' },
70
+ 'esModuleInterop': { value: true, reason: 'Enables proper interop between CJS and ESM' },
71
+ 'skipLibCheck': { value: true, reason: 'Speeds up compilation by skipping type checking of .d.ts files' },
72
+ 'forceConsistentCasingInFileNames': { value: true, reason: 'Ensures consistent file references across OS' },
73
+ 'resolveJsonModule': { value: true, reason: 'Allows importing JSON files' },
74
+ 'declaration': { value: true, reason: 'Generates .d.ts files for library consumers' },
75
+ 'declarationMap': { value: true, reason: 'Enables source maps for declarations' },
76
+ 'sourceMap': { value: true, reason: 'Enables debugging with source maps' },
77
+ };
78
+ for (const [key, { value, reason }] of Object.entries(recommended)) {
79
+ if (compilerOptions[key] === undefined) {
80
+ drifts.push({
81
+ file: 'tsconfig.json',
82
+ expected: `compilerOptions.${key}: ${JSON.stringify(value)}`,
83
+ actual: `${key} is not set`,
84
+ severity: 'medium',
85
+ description: `Missing recommended tsconfig option: ${key}. ${reason}.`,
86
+ autoFixable: true,
87
+ });
88
+ }
89
+ else if (compilerOptions[key] !== value) {
90
+ drifts.push({
91
+ file: 'tsconfig.json',
92
+ expected: `compilerOptions.${key}: ${JSON.stringify(value)}`,
93
+ actual: `compilerOptions.${key}: ${JSON.stringify(compilerOptions[key])}`,
94
+ severity: 'low',
95
+ description: `tsconfig option ${key} is ${JSON.stringify(compilerOptions[key])}, recommended: ${JSON.stringify(value)}. ${reason}.`,
96
+ autoFixable: true,
97
+ });
98
+ }
99
+ }
100
+ return drifts;
101
+ }
102
+ detectGitignoreDrift() {
103
+ const drifts = [];
104
+ const gitignorePath = path.join(this.projectDir, '.gitignore');
105
+ let content;
106
+ try {
107
+ content = fs.readFileSync(gitignorePath, 'utf-8');
108
+ }
109
+ catch {
110
+ return drifts;
111
+ }
112
+ const entries = new Set(content.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#')));
113
+ // Recommended gitignore entries
114
+ const recommended = [
115
+ 'node_modules', 'dist', 'build', '.env', '.env.local',
116
+ '*.log', 'coverage', '.DS_Store', 'thumbs.db',
117
+ ];
118
+ for (const entry of recommended) {
119
+ if (!entries.has(entry) && !entries.has(entry.replace('*', ''))) {
120
+ drifts.push({
121
+ file: '.gitignore',
122
+ expected: `${entry} should be ignored`,
123
+ actual: `${entry} is not in .gitignore`,
124
+ severity: entry === '.env' || entry === '.env.local' ? 'high' : 'medium',
125
+ description: `${entry} is missing from .gitignore. This may result in committing sensitive or generated files.`,
126
+ autoFixable: true,
127
+ });
128
+ }
129
+ }
130
+ return drifts;
131
+ }
132
+ detectPackageJsonDrift() {
133
+ const drifts = [];
134
+ const pkgPath = path.join(this.projectDir, 'package.json');
135
+ let pkg;
136
+ try {
137
+ pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
138
+ }
139
+ catch {
140
+ return drifts;
141
+ }
142
+ // Check for missing recommended fields
143
+ const recommendedFields = {
144
+ 'license': { expected: 'MIT or appropriate license', reason: 'Required for npm publishing and legal clarity' },
145
+ 'repository': { expected: '{ type: "git", url: "..." }', reason: 'Helps users find the source code' },
146
+ 'description': { expected: 'Short project description', reason: 'Improves discoverability on npm' },
147
+ 'keywords': { expected: 'Array of keywords', reason: 'Improves npm search results' },
148
+ 'engines': { expected: '{ node: ">=18" }', reason: 'Specifies compatible Node.js versions' },
149
+ };
150
+ for (const [field, { expected, reason }] of Object.entries(recommendedFields)) {
151
+ if (!pkg[field]) {
152
+ drifts.push({
153
+ file: 'package.json',
154
+ expected: `${field}: ${expected}`,
155
+ actual: `${field} is missing`,
156
+ severity: 'low',
157
+ description: `Missing package.json field: ${field}. ${reason}.`,
158
+ autoFixable: true,
159
+ });
160
+ }
161
+ }
162
+ return drifts;
163
+ }
164
+ detectEditorConfigDrift() {
165
+ const drifts = [];
166
+ const editorConfigPath = path.join(this.projectDir, '.editorconfig');
167
+ if (!fs.existsSync(editorConfigPath)) {
168
+ // Not critical, but worth noting
169
+ drifts.push({
170
+ file: '.editorconfig',
171
+ expected: 'Editor config file for consistent formatting',
172
+ actual: 'No .editorconfig file found',
173
+ severity: 'low',
174
+ description: 'Missing .editorconfig. Team members may use different editor settings (indentation, line endings, etc.).',
175
+ autoFixable: true,
176
+ });
177
+ }
178
+ return drifts;
179
+ }
180
+ driftToInsight(drift) {
181
+ return {
182
+ type: 'config-drift',
183
+ priority: drift.severity === 'high' ? 'high' : drift.severity === 'medium' ? 'medium' : 'low',
184
+ title: `[config-drift] ${drift.file}: ${drift.description.slice(0, 60)}`,
185
+ content: `Configuration drift in ${drift.file}\n` +
186
+ ` Expected: ${drift.expected}\n` +
187
+ ` Actual: ${drift.actual}\n` +
188
+ ` Severity: ${drift.severity}\n` +
189
+ ` ${drift.autoFixable ? 'This can be auto-fixed.' : 'Manual review required.'}\n` +
190
+ ` Description: ${drift.description}`,
191
+ files: [drift.file],
192
+ timestamp: new Date(),
193
+ confidence: 0.9,
194
+ metadata: { autoFixable: drift.autoFixable, severity: drift.severity },
195
+ };
196
+ }
197
+ }
198
+ //# sourceMappingURL=config-drift-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-drift-detector.js","sourceRoot":"","sources":["../../src/brain/config-drift-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { BrainInsight } from '../types.js';
2
+ export declare class DeadCodeEliminator {
3
+ private projectDir;
4
+ private exportedSymbols;
5
+ private importedSymbols;
6
+ constructor(projectDir: string);
7
+ analyzeProject(maxFiles?: number): Promise<BrainInsight[]>;
8
+ private collectExportsImports;
9
+ private detectUnreachableCode;
10
+ private detectUnusedExports;
11
+ private detectUnusedVariables;
12
+ private detectUnusedImports;
13
+ private detectDeadBranches;
14
+ private collectFiles;
15
+ }
16
+ //# sourceMappingURL=dead-code-eliminator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-code-eliminator.d.ts","sourceRoot":"","sources":["../../src/brain/dead-code-eliminator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAU3D,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAA0E;IACjG,OAAO,CAAC,eAAe,CAA0B;gBAErC,UAAU,EAAE,MAAM;IAIxB,cAAc,CAAC,QAAQ,GAAE,MAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA+BrE,OAAO,CAAC,qBAAqB;IAmE7B,OAAO,CAAC,qBAAqB;IA4C7B,OAAO,CAAC,mBAAmB;IA8C3B,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,mBAAmB;IA8C3B,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,YAAY;CAqBrB"}
@@ -0,0 +1,359 @@
1
+ // src/brain/dead-code-eliminator.ts — Dead code path detection
2
+ // v3.0.0 — Identifies unreachable code, unused exports, unused variables, dead branches
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ const IGNORE_DIRS = new Set([
6
+ 'node_modules', '.git', 'dist', 'build', 'out', 'coverage', '.next', '.nuxt', '.cache',
7
+ ]);
8
+ const CODE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.py', '.rs', '.go', '.java']);
9
+ export class DeadCodeEliminator {
10
+ constructor(projectDir) {
11
+ this.exportedSymbols = new Map();
12
+ this.importedSymbols = new Set();
13
+ this.projectDir = projectDir;
14
+ }
15
+ async analyzeProject(maxFiles = 200) {
16
+ const files = this.collectFiles(this.projectDir, maxFiles);
17
+ const insights = [];
18
+ // Phase 1: Collect all exports and imports
19
+ this.collectExportsImports(files);
20
+ // Phase 2: Per-file analysis
21
+ for (const filePath of files) {
22
+ const relPath = path.relative(this.projectDir, filePath);
23
+ const ext = path.extname(filePath);
24
+ // Dead code after return/throw
25
+ insights.push(...this.detectUnreachableCode(filePath, relPath));
26
+ // Unused exports
27
+ insights.push(...this.detectUnusedExports(filePath, relPath));
28
+ // Unused variables
29
+ if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {
30
+ insights.push(...this.detectUnusedVariables(filePath, relPath));
31
+ insights.push(...this.detectUnusedImports(filePath, relPath));
32
+ }
33
+ // Dead branches (always true/false conditions)
34
+ insights.push(...this.detectDeadBranches(filePath, relPath));
35
+ }
36
+ return insights;
37
+ }
38
+ collectExportsImports(files) {
39
+ this.exportedSymbols.clear();
40
+ this.importedSymbols.clear();
41
+ for (const filePath of files) {
42
+ let content;
43
+ try {
44
+ content = fs.readFileSync(filePath, 'utf-8');
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ const relPath = path.relative(this.projectDir, filePath);
50
+ const lines = content.split('\n');
51
+ // Collect exports
52
+ const exportPatterns = [
53
+ /export\s+(?:default\s+)?(?:function|class|const|let|var|interface|type|enum)\s+(\w+)/g,
54
+ /export\s+\{\s*([^}]+)\s*\}/g,
55
+ ];
56
+ for (const pattern of exportPatterns) {
57
+ let match;
58
+ pattern.lastIndex = 0;
59
+ while ((match = pattern.exec(content)) !== null) {
60
+ const line = content.substring(0, match.index).split('\n').length;
61
+ if (pattern.source.includes('\\{')) {
62
+ // Named exports: export { foo, bar }
63
+ const names = match[1].split(',').map(n => n.trim().split(/\s+as\s+/).pop()?.trim()).filter(Boolean);
64
+ for (const name of names) {
65
+ if (!this.exportedSymbols.has(name))
66
+ this.exportedSymbols.set(name, []);
67
+ this.exportedSymbols.get(name).push({ file: relPath, line, name });
68
+ }
69
+ }
70
+ else {
71
+ const name = match[1];
72
+ if (!this.exportedSymbols.has(name))
73
+ this.exportedSymbols.set(name, []);
74
+ this.exportedSymbols.get(name).push({ file: relPath, line, name });
75
+ }
76
+ }
77
+ }
78
+ // Collect imports
79
+ const importPatterns = [
80
+ /import\s+(?:\{([^}]+)\}|(\w+))\s+from/g,
81
+ /import\s*\(\s*['"][^'"]+['"]\s*\)/g, // dynamic imports
82
+ ];
83
+ for (let pi = 0; pi < importPatterns.length; pi++) {
84
+ const pattern = importPatterns[pi];
85
+ pattern.lastIndex = 0;
86
+ let match;
87
+ while ((match = pattern.exec(content)) !== null) {
88
+ if (pi === 0) {
89
+ const namedImports = match[1]; // { foo, bar }
90
+ const defaultImport = match[2]; // foo
91
+ if (namedImports) {
92
+ const names = namedImports.split(',').map(n => {
93
+ const trimmed = n.trim();
94
+ const asParts = trimmed.split(/\s+as\s+/);
95
+ return asParts[0].trim();
96
+ });
97
+ for (const name of names) {
98
+ if (name)
99
+ this.importedSymbols.add(name);
100
+ }
101
+ }
102
+ if (defaultImport)
103
+ this.importedSymbols.add(defaultImport);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ detectUnreachableCode(filePath, relPath) {
110
+ let content;
111
+ try {
112
+ content = fs.readFileSync(filePath, 'utf-8');
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ const insights = [];
118
+ const lines = content.split('\n');
119
+ for (let i = 0; i < lines.length - 1; i++) {
120
+ const line = lines[i].trim();
121
+ // After return, throw, continue, break in same block
122
+ if (/^\s*(return\s|return;|throw\s|continue;|break;|break\s)/.test(line) && !line.startsWith('//')) {
123
+ // Check if next non-empty line is in the same block
124
+ for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) {
125
+ const nextLine = lines[j].trim();
126
+ if (nextLine === '' || nextLine.startsWith('//'))
127
+ continue;
128
+ if (nextLine === '}' || nextLine.startsWith('}'))
129
+ break;
130
+ // Check if this is actually unreachable (same block level)
131
+ if (nextLine.length > 0 && !nextLine.startsWith('case ') && !nextLine.startsWith('default:')) {
132
+ insights.push({
133
+ type: 'dead-code',
134
+ priority: 'high',
135
+ title: `[dead-code] Unreachable code after ${line.split(/\s/)[0]} in ${relPath}`,
136
+ content: `Unreachable code detected in ${relPath}:${j + 1}\n` +
137
+ ` After: ${line}\n` +
138
+ ` Unreachable: ${nextLine}\n` +
139
+ ` Code after return/throw/break/continue will never execute.\n` +
140
+ ` Remove or refactor the dead code.`,
141
+ files: [relPath],
142
+ timestamp: new Date(),
143
+ confidence: 0.92,
144
+ metadata: { line: j + 1, deadCodeType: 'unreachable' },
145
+ });
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ return insights;
152
+ }
153
+ detectUnusedExports(filePath, relPath) {
154
+ const insights = [];
155
+ const ext = path.extname(filePath);
156
+ if (!['.ts', '.tsx', '.js', '.jsx'].includes(ext))
157
+ return insights;
158
+ // Check for index.ts barrel exports — skip these
159
+ if (path.basename(filePath) === 'index.ts' || path.basename(filePath) === 'index.tsx')
160
+ return insights;
161
+ let content;
162
+ try {
163
+ content = fs.readFileSync(filePath, 'utf-8');
164
+ }
165
+ catch {
166
+ return [];
167
+ }
168
+ const exportPattern = /export\s+(?:default\s+)?(?:function|class|const|let|var|interface|type|enum)\s+(\w+)/g;
169
+ let match;
170
+ while ((match = exportPattern.exec(content)) !== null) {
171
+ const name = match[1];
172
+ const line = content.substring(0, match.index).split('\n').length;
173
+ // Check if this export is imported anywhere
174
+ if (!this.importedSymbols.has(name)) {
175
+ // Exclude common patterns that might be used externally
176
+ const commonExports = ['config', 'default', 'App', 'app', 'main', 'handler', 'middleware', 'plugin'];
177
+ if (commonExports.includes(name))
178
+ continue;
179
+ // Skip if it's a type that might be used in declarations
180
+ const isType = /export\s+(?:interface|type)\s+/.test(match[0]);
181
+ if (isType)
182
+ continue; // types might be used implicitly
183
+ insights.push({
184
+ type: 'dead-code',
185
+ priority: 'medium',
186
+ title: `[dead-code] Unused export "${name}" in ${relPath}`,
187
+ content: `Exported symbol \`${name}\` in ${relPath}:${line} is not imported by any other file.\n` +
188
+ ` This could be dead code or an external API. Verify before removing.\n` +
189
+ ` If unused internally, consider removing the export or marking as @internal.`,
190
+ files: [relPath],
191
+ timestamp: new Date(),
192
+ confidence: 0.7, // lower confidence — might be external API
193
+ metadata: { symbol: name, line, deadCodeType: 'unused-export' },
194
+ });
195
+ }
196
+ }
197
+ return insights;
198
+ }
199
+ detectUnusedVariables(filePath, relPath) {
200
+ let content;
201
+ try {
202
+ content = fs.readFileSync(filePath, 'utf-8');
203
+ }
204
+ catch {
205
+ return [];
206
+ }
207
+ const insights = [];
208
+ const lines = content.split('\n');
209
+ // Find variable declarations
210
+ const varPattern = /(?:const|let|var)\s+(\w+)\s*=/g;
211
+ let match;
212
+ while ((match = varPattern.exec(content)) !== null) {
213
+ const name = match[1];
214
+ const line = content.substring(0, match.index).split('\n').length;
215
+ // Skip common patterns
216
+ const skipNames = new Set(['_', 'err', 'error', 'e', 'req', 'res', 'next', 'ctx', 'config', 'options']);
217
+ if (skipNames.has(name))
218
+ continue;
219
+ if (name.startsWith('_'))
220
+ continue; // convention for intentionally unused
221
+ // Count usages (excluding the declaration itself)
222
+ const usagePattern = new RegExp(`\\b${name}\\b`, 'g');
223
+ const usages = content.match(usagePattern);
224
+ if (usages && usages.length <= 1) {
225
+ insights.push({
226
+ type: 'dead-code',
227
+ priority: 'low',
228
+ title: `[dead-code] Unused variable "${name}" in ${relPath}:${line}`,
229
+ content: `Variable \`${name}\` declared in ${relPath}:${line} appears to be unused.\n` +
230
+ ` Consider removing it or prefixing with \`_\` if intentionally unused.`,
231
+ files: [relPath],
232
+ timestamp: new Date(),
233
+ confidence: 0.75,
234
+ metadata: { variable: name, line, deadCodeType: 'unused-variable' },
235
+ });
236
+ }
237
+ }
238
+ return insights;
239
+ }
240
+ detectUnusedImports(filePath, relPath) {
241
+ let content;
242
+ try {
243
+ content = fs.readFileSync(filePath, 'utf-8');
244
+ }
245
+ catch {
246
+ return [];
247
+ }
248
+ const insights = [];
249
+ // Match import statements
250
+ const importRegex = /import\s+\{([^}]+)\}\s+from\s+['"][^'"]+['"]/g;
251
+ let match;
252
+ while ((match = importRegex.exec(content)) !== null) {
253
+ const imports = match[1].split(',').map(s => {
254
+ const parts = s.trim().split(/\s+as\s+/);
255
+ return parts[parts.length - 1].trim();
256
+ });
257
+ for (const name of imports) {
258
+ if (!name)
259
+ continue;
260
+ // Skip type-only imports
261
+ if (content.includes(`import type { ${name}`))
262
+ continue;
263
+ // Count usage in the rest of the file
264
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
265
+ const usageRegex = new RegExp(`\\b${escaped}\\b`, 'g');
266
+ const usages = content.match(usageRegex);
267
+ if (usages && usages.length <= 1) {
268
+ const line = content.substring(0, match.index).split('\n').length;
269
+ insights.push({
270
+ type: 'dead-code',
271
+ priority: 'low',
272
+ title: `[dead-code] Unused import "${name}" in ${relPath}:${line}`,
273
+ content: `Import \`${name}\` in ${relPath}:${line} is not used in the file.\n` +
274
+ ` Remove unused imports to keep the codebase clean.`,
275
+ files: [relPath],
276
+ timestamp: new Date(),
277
+ confidence: 0.9,
278
+ metadata: { import: name, line, deadCodeType: 'unused-import' },
279
+ });
280
+ }
281
+ }
282
+ }
283
+ return insights;
284
+ }
285
+ detectDeadBranches(filePath, relPath) {
286
+ let content;
287
+ try {
288
+ content = fs.readFileSync(filePath, 'utf-8');
289
+ }
290
+ catch {
291
+ return [];
292
+ }
293
+ const insights = [];
294
+ const lines = content.split('\n');
295
+ // Detect always-true/false conditions
296
+ const deadConditions = [
297
+ { regex: /\bif\s*\(\s*(true|!\s*false)\s*\)/g, branch: 'always-true' },
298
+ { regex: /\bif\s*\(\s*(false|!\s*true)\s*\)/g, branch: 'always-false' },
299
+ { regex: /\bif\s*\(\s*0\s*\)/g, branch: 'always-false' },
300
+ { regex: /\bif\s*\(\s*1\s*\)/g, branch: 'always-true' },
301
+ { regex: /\bif\s*\(\s*["'][^"']+["']\s*\)/g, branch: 'always-true' },
302
+ { regex: /process\.env\.NODE_ENV\s*===\s*["']test["']/g, branch: 'environmental' },
303
+ ];
304
+ for (let i = 0; i < lines.length; i++) {
305
+ const line = lines[i];
306
+ for (const { regex, branch } of deadConditions) {
307
+ regex.lastIndex = 0;
308
+ if (regex.test(line) && !line.trim().startsWith('//')) {
309
+ insights.push({
310
+ type: 'dead-code',
311
+ priority: branch === 'environmental' ? 'low' : 'high',
312
+ title: `[dead-code] ${branch === 'always-true' ? 'Always-true' : 'Always-false'} branch in ${relPath}:${i + 1}`,
313
+ content: `Condition in ${relPath}:${i + 1} is always ${branch === 'always-true' ? 'true' : 'false'}.\n` +
314
+ ` Line: ${line.trim()}\n` +
315
+ ` ${branch === 'always-true' ? 'The else branch will never execute.' : 'The if branch will never execute.'}\n` +
316
+ ` Consider removing the dead branch or fixing the condition.`,
317
+ files: [relPath],
318
+ timestamp: new Date(),
319
+ confidence: 0.95,
320
+ metadata: { line: i + 1, branchType: branch, deadCodeType: 'dead-branch' },
321
+ });
322
+ }
323
+ }
324
+ }
325
+ return insights;
326
+ }
327
+ collectFiles(dir, maxFiles) {
328
+ const results = [];
329
+ const walk = (currentDir, depth) => {
330
+ if (results.length >= maxFiles || depth > 10)
331
+ return;
332
+ let entries;
333
+ try {
334
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
335
+ }
336
+ catch {
337
+ return;
338
+ }
339
+ for (const entry of entries) {
340
+ if (results.length >= maxFiles)
341
+ return;
342
+ if (entry.name.startsWith('.'))
343
+ continue;
344
+ const fullPath = path.join(currentDir, entry.name);
345
+ if (entry.isDirectory()) {
346
+ if (IGNORE_DIRS.has(entry.name))
347
+ continue;
348
+ walk(fullPath, depth + 1);
349
+ }
350
+ else if (entry.isFile() && CODE_EXTENSIONS.has(path.extname(entry.name))) {
351
+ results.push(fullPath);
352
+ }
353
+ }
354
+ };
355
+ walk(dir, 0);
356
+ return results;
357
+ }
358
+ }
359
+ //# sourceMappingURL=dead-code-eliminator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead-code-eliminator.js","sourceRoot":"","sources":["../../src/brain/dead-code-eliminator.ts"],"names":[],"mappings":"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"}