projscan 0.1.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -0
  3. package/dist/analyzers/architectureCheck.d.ts +2 -0
  4. package/dist/analyzers/architectureCheck.js +91 -0
  5. package/dist/analyzers/architectureCheck.js.map +1 -0
  6. package/dist/analyzers/dependencyRiskCheck.d.ts +2 -0
  7. package/dist/analyzers/dependencyRiskCheck.js +17 -0
  8. package/dist/analyzers/dependencyRiskCheck.js.map +1 -0
  9. package/dist/analyzers/eslintCheck.d.ts +2 -0
  10. package/dist/analyzers/eslintCheck.js +49 -0
  11. package/dist/analyzers/eslintCheck.js.map +1 -0
  12. package/dist/analyzers/prettierCheck.d.ts +2 -0
  13. package/dist/analyzers/prettierCheck.js +53 -0
  14. package/dist/analyzers/prettierCheck.js.map +1 -0
  15. package/dist/analyzers/testCheck.d.ts +2 -0
  16. package/dist/analyzers/testCheck.js +52 -0
  17. package/dist/analyzers/testCheck.js.map +1 -0
  18. package/dist/cli/index.d.ts +2 -0
  19. package/dist/cli/index.js +558 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/core/dependencyAnalyzer.d.ts +2 -0
  22. package/dist/core/dependencyAnalyzer.js +96 -0
  23. package/dist/core/dependencyAnalyzer.js.map +1 -0
  24. package/dist/core/frameworkDetector.d.ts +2 -0
  25. package/dist/core/frameworkDetector.js +152 -0
  26. package/dist/core/frameworkDetector.js.map +1 -0
  27. package/dist/core/issueEngine.d.ts +2 -0
  28. package/dist/core/issueEngine.js +21 -0
  29. package/dist/core/issueEngine.js.map +1 -0
  30. package/dist/core/languageDetector.d.ts +2 -0
  31. package/dist/core/languageDetector.js +107 -0
  32. package/dist/core/languageDetector.js.map +1 -0
  33. package/dist/core/repositoryScanner.d.ts +2 -0
  34. package/dist/core/repositoryScanner.js +79 -0
  35. package/dist/core/repositoryScanner.js.map +1 -0
  36. package/dist/fixes/editorconfigFix.d.ts +2 -0
  37. package/dist/fixes/editorconfigFix.js +28 -0
  38. package/dist/fixes/editorconfigFix.js.map +1 -0
  39. package/dist/fixes/eslintFix.d.ts +2 -0
  40. package/dist/fixes/eslintFix.js +46 -0
  41. package/dist/fixes/eslintFix.js.map +1 -0
  42. package/dist/fixes/fixRegistry.d.ts +3 -0
  43. package/dist/fixes/fixRegistry.js +24 -0
  44. package/dist/fixes/fixRegistry.js.map +1 -0
  45. package/dist/fixes/prettierFix.d.ts +2 -0
  46. package/dist/fixes/prettierFix.js +39 -0
  47. package/dist/fixes/prettierFix.js.map +1 -0
  48. package/dist/fixes/testFix.d.ts +2 -0
  49. package/dist/fixes/testFix.js +61 -0
  50. package/dist/fixes/testFix.js.map +1 -0
  51. package/dist/index.d.ts +7 -0
  52. package/dist/index.js +7 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/reporters/consoleReporter.d.ts +9 -0
  55. package/dist/reporters/consoleReporter.js +240 -0
  56. package/dist/reporters/consoleReporter.js.map +1 -0
  57. package/dist/reporters/jsonReporter.d.ts +7 -0
  58. package/dist/reporters/jsonReporter.js +27 -0
  59. package/dist/reporters/jsonReporter.js.map +1 -0
  60. package/dist/reporters/markdownReporter.d.ts +7 -0
  61. package/dist/reporters/markdownReporter.js +129 -0
  62. package/dist/reporters/markdownReporter.js.map +1 -0
  63. package/dist/types.d.ts +110 -0
  64. package/dist/types.js +3 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/utils/cache.d.ts +3 -0
  67. package/dist/utils/cache.js +51 -0
  68. package/dist/utils/cache.js.map +1 -0
  69. package/dist/utils/fileWalker.d.ts +7 -0
  70. package/dist/utils/fileWalker.js +45 -0
  71. package/dist/utils/fileWalker.js.map +1 -0
  72. package/dist/utils/logger.d.ts +9 -0
  73. package/dist/utils/logger.js +41 -0
  74. package/dist/utils/logger.js.map +1 -0
  75. package/package.json +48 -0
@@ -0,0 +1,558 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import ora from 'ora';
4
+ import chalk from 'chalk';
5
+ import path from 'node:path';
6
+ import fs from 'node:fs/promises';
7
+ import readline from 'node:readline';
8
+ import { scanRepository } from '../core/repositoryScanner.js';
9
+ import { detectLanguages } from '../core/languageDetector.js';
10
+ import { detectFrameworks } from '../core/frameworkDetector.js';
11
+ import { analyzeDependencies } from '../core/dependencyAnalyzer.js';
12
+ import { collectIssues } from '../core/issueEngine.js';
13
+ import { getAllAvailableFixes } from '../fixes/fixRegistry.js';
14
+ import { setLogLevel } from '../utils/logger.js';
15
+ import { reportAnalysis, reportHealth, reportDetectedIssues, reportExplanation, reportDiagram, reportStructure, reportDependencies, } from '../reporters/consoleReporter.js';
16
+ import { reportAnalysisJson, reportHealthJson, reportExplanationJson, reportDiagramJson, reportStructureJson, reportDependenciesJson, } from '../reporters/jsonReporter.js';
17
+ import { reportAnalysisMarkdown, reportHealthMarkdown, reportExplanationMarkdown, reportDiagramMarkdown, reportStructureMarkdown, reportDependenciesMarkdown, } from '../reporters/markdownReporter.js';
18
+ // ── CLI Setup ─────────────────────────────────────────────
19
+ const program = new Command();
20
+ program
21
+ .name('projscan')
22
+ .description('Instant codebase insights — doctor, x-ray, and architecture map for any repository')
23
+ .version('0.1.0')
24
+ .option('--format <type>', 'output format: console, json, markdown', 'console')
25
+ .option('--verbose', 'enable verbose output')
26
+ .option('--quiet', 'suppress non-essential output');
27
+ function getFormat() {
28
+ const opts = program.opts();
29
+ const f = opts.format;
30
+ if (f === 'json' || f === 'markdown')
31
+ return f;
32
+ return 'console';
33
+ }
34
+ function getRootPath() {
35
+ return process.cwd();
36
+ }
37
+ function setupLogLevel() {
38
+ const opts = program.opts();
39
+ if (opts.verbose)
40
+ setLogLevel('debug');
41
+ else if (opts.quiet)
42
+ setLogLevel('quiet');
43
+ }
44
+ // ── Command: analyze (default) ────────────────────────────
45
+ program
46
+ .command('analyze', { isDefault: true })
47
+ .description('Analyze repository and show project report')
48
+ .action(async () => {
49
+ setupLogLevel();
50
+ const rootPath = getRootPath();
51
+ const format = getFormat();
52
+ const spinner = format === 'console' ? ora('Scanning repository...').start() : null;
53
+ try {
54
+ const scan = await scanRepository(rootPath);
55
+ if (spinner)
56
+ spinner.text = 'Detecting languages...';
57
+ const languages = detectLanguages(scan.files);
58
+ if (spinner)
59
+ spinner.text = 'Detecting frameworks...';
60
+ const frameworks = await detectFrameworks(rootPath, scan.files);
61
+ if (spinner)
62
+ spinner.text = 'Analyzing dependencies...';
63
+ const dependencies = await analyzeDependencies(rootPath);
64
+ if (spinner)
65
+ spinner.text = 'Checking for issues...';
66
+ const issues = await collectIssues(rootPath, scan.files);
67
+ if (spinner)
68
+ spinner.stop();
69
+ const report = {
70
+ projectName: path.basename(rootPath),
71
+ rootPath,
72
+ scan,
73
+ languages,
74
+ frameworks,
75
+ dependencies,
76
+ issues,
77
+ timestamp: new Date().toISOString(),
78
+ };
79
+ switch (format) {
80
+ case 'json':
81
+ reportAnalysisJson(report);
82
+ break;
83
+ case 'markdown':
84
+ reportAnalysisMarkdown(report);
85
+ break;
86
+ default:
87
+ reportAnalysis(report);
88
+ }
89
+ }
90
+ catch (error) {
91
+ if (spinner)
92
+ spinner.fail('Analysis failed');
93
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
94
+ process.exit(1);
95
+ }
96
+ });
97
+ // ── Command: doctor ───────────────────────────────────────
98
+ program
99
+ .command('doctor')
100
+ .description('Evaluate project health and detect issues')
101
+ .action(async () => {
102
+ setupLogLevel();
103
+ const rootPath = getRootPath();
104
+ const format = getFormat();
105
+ const spinner = format === 'console' ? ora('Running health checks...').start() : null;
106
+ try {
107
+ const scan = await scanRepository(rootPath);
108
+ const issues = await collectIssues(rootPath, scan.files);
109
+ if (spinner)
110
+ spinner.stop();
111
+ switch (format) {
112
+ case 'json':
113
+ reportHealthJson(issues);
114
+ break;
115
+ case 'markdown':
116
+ reportHealthMarkdown(issues);
117
+ break;
118
+ default:
119
+ reportHealth(issues, scan.scanDurationMs);
120
+ }
121
+ }
122
+ catch (error) {
123
+ if (spinner)
124
+ spinner.fail('Health check failed');
125
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
126
+ process.exit(1);
127
+ }
128
+ });
129
+ // ── Command: fix ──────────────────────────────────────────
130
+ program
131
+ .command('fix')
132
+ .description('Auto-fix detected project issues')
133
+ .option('-y, --yes', 'apply fixes without prompting')
134
+ .action(async (cmdOpts) => {
135
+ setupLogLevel();
136
+ const rootPath = getRootPath();
137
+ const spinner = ora('Detecting issues...').start();
138
+ try {
139
+ const scan = await scanRepository(rootPath);
140
+ const issues = await collectIssues(rootPath, scan.files);
141
+ const fixes = getAllAvailableFixes(issues);
142
+ spinner.stop();
143
+ if (fixes.length === 0) {
144
+ console.log(`\n ${chalk.green('✓')} ${chalk.bold('No fixable issues found!')}\n`);
145
+ return;
146
+ }
147
+ reportDetectedIssues(issues, fixes);
148
+ // Prompt for confirmation
149
+ if (!cmdOpts.yes) {
150
+ const proceed = await promptYesNo(` Apply ${fixes.length} fix${fixes.length > 1 ? 'es' : ''}? (y/n) `);
151
+ if (!proceed) {
152
+ console.log(chalk.dim('\n Aborted.\n'));
153
+ return;
154
+ }
155
+ }
156
+ // Apply fixes
157
+ const results = [];
158
+ for (const fix of fixes) {
159
+ const fixSpinner = ora(` Applying: ${fix.title}...`).start();
160
+ try {
161
+ await fix.apply(rootPath);
162
+ fixSpinner.succeed(` ${fix.title}`);
163
+ results.push({ fix, success: true });
164
+ }
165
+ catch (error) {
166
+ const msg = error instanceof Error ? error.message : String(error);
167
+ fixSpinner.fail(` ${fix.title}`);
168
+ results.push({ fix, success: false, error: msg });
169
+ }
170
+ }
171
+ const succeeded = results.filter((r) => r.success).length;
172
+ const failed = results.filter((r) => !r.success).length;
173
+ console.log('');
174
+ if (succeeded > 0) {
175
+ console.log(` ${chalk.green('✓')} ${succeeded} fix${succeeded > 1 ? 'es' : ''} applied successfully`);
176
+ }
177
+ if (failed > 0) {
178
+ console.log(` ${chalk.red('✗')} ${failed} fix${failed > 1 ? 'es' : ''} failed`);
179
+ }
180
+ console.log('');
181
+ }
182
+ catch (error) {
183
+ spinner.fail('Fix detection failed');
184
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
185
+ process.exit(1);
186
+ }
187
+ });
188
+ // ── Command: explain ──────────────────────────────────────
189
+ program
190
+ .command('explain <file>')
191
+ .description('Explain a file — its purpose, dependencies, and exports')
192
+ .action(async (filePath) => {
193
+ setupLogLevel();
194
+ const format = getFormat();
195
+ const absolutePath = path.resolve(filePath);
196
+ try {
197
+ const content = await fs.readFile(absolutePath, 'utf-8');
198
+ const explanation = analyzeFile(absolutePath, content);
199
+ switch (format) {
200
+ case 'json':
201
+ reportExplanationJson(explanation);
202
+ break;
203
+ case 'markdown':
204
+ reportExplanationMarkdown(explanation);
205
+ break;
206
+ default:
207
+ reportExplanation(explanation);
208
+ }
209
+ }
210
+ catch (error) {
211
+ if (error.code === 'ENOENT') {
212
+ console.error(chalk.red(`File not found: ${filePath}`));
213
+ }
214
+ else {
215
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
216
+ }
217
+ process.exit(1);
218
+ }
219
+ });
220
+ // ── Command: diagram ──────────────────────────────────────
221
+ program
222
+ .command('diagram')
223
+ .description('Generate architecture overview diagram')
224
+ .action(async () => {
225
+ setupLogLevel();
226
+ const rootPath = getRootPath();
227
+ const format = getFormat();
228
+ const spinner = format === 'console' ? ora('Analyzing architecture...').start() : null;
229
+ try {
230
+ const scan = await scanRepository(rootPath);
231
+ const frameworks = await detectFrameworks(rootPath, scan.files);
232
+ const layers = buildArchitectureLayers(scan.files, frameworks.frameworks.map((f) => f.name));
233
+ if (spinner)
234
+ spinner.stop();
235
+ switch (format) {
236
+ case 'json':
237
+ reportDiagramJson(layers);
238
+ break;
239
+ case 'markdown':
240
+ reportDiagramMarkdown(layers);
241
+ break;
242
+ default:
243
+ reportDiagram(layers);
244
+ }
245
+ }
246
+ catch (error) {
247
+ if (spinner)
248
+ spinner.fail('Diagram generation failed');
249
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
250
+ process.exit(1);
251
+ }
252
+ });
253
+ // ── Command: structure ────────────────────────────────────
254
+ program
255
+ .command('structure')
256
+ .description('Show project directory structure')
257
+ .action(async () => {
258
+ setupLogLevel();
259
+ const rootPath = getRootPath();
260
+ const format = getFormat();
261
+ const spinner = format === 'console' ? ora('Scanning...').start() : null;
262
+ try {
263
+ const scan = await scanRepository(rootPath);
264
+ if (spinner)
265
+ spinner.stop();
266
+ switch (format) {
267
+ case 'json':
268
+ reportStructureJson(scan.directoryTree);
269
+ break;
270
+ case 'markdown':
271
+ reportStructureMarkdown(scan.directoryTree);
272
+ break;
273
+ default:
274
+ reportStructure(scan.directoryTree, path.basename(rootPath));
275
+ }
276
+ }
277
+ catch (error) {
278
+ if (spinner)
279
+ spinner.fail('Structure scan failed');
280
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
281
+ process.exit(1);
282
+ }
283
+ });
284
+ // ── Command: dependencies ─────────────────────────────────
285
+ program
286
+ .command('dependencies')
287
+ .description('Analyze project dependencies')
288
+ .action(async () => {
289
+ setupLogLevel();
290
+ const rootPath = getRootPath();
291
+ const format = getFormat();
292
+ const spinner = format === 'console' ? ora('Analyzing dependencies...').start() : null;
293
+ try {
294
+ const report = await analyzeDependencies(rootPath);
295
+ if (spinner)
296
+ spinner.stop();
297
+ if (!report) {
298
+ console.log(chalk.yellow('\n No package.json found in this directory.\n'));
299
+ return;
300
+ }
301
+ switch (format) {
302
+ case 'json':
303
+ reportDependenciesJson(report);
304
+ break;
305
+ case 'markdown':
306
+ reportDependenciesMarkdown(report);
307
+ break;
308
+ default:
309
+ reportDependencies(report);
310
+ }
311
+ }
312
+ catch (error) {
313
+ if (spinner)
314
+ spinner.fail('Dependency analysis failed');
315
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
316
+ process.exit(1);
317
+ }
318
+ });
319
+ // ── File Analysis (for explain command) ───────────────────
320
+ function analyzeFile(filePath, content) {
321
+ const lines = content.split('\n');
322
+ const imports = extractImports(content);
323
+ const exports = extractExports(content);
324
+ const purpose = inferPurpose(filePath, imports, exports);
325
+ const potentialIssues = detectFileIssues(content, lines.length);
326
+ return {
327
+ filePath: path.relative(process.cwd(), filePath),
328
+ purpose,
329
+ imports,
330
+ exports,
331
+ potentialIssues,
332
+ lineCount: lines.length,
333
+ };
334
+ }
335
+ function extractImports(content) {
336
+ const imports = [];
337
+ const seen = new Set();
338
+ // ES import
339
+ const esImportRegex = /import\s+(?:(?:\{[^}]*\}|[\w*]+(?:\s*,\s*\{[^}]*\})?|\*\s+as\s+\w+)\s+from\s+)?['"]([^'"]+)['"]/gm;
340
+ let match;
341
+ while ((match = esImportRegex.exec(content)) !== null) {
342
+ const source = match[1];
343
+ if (!seen.has(source)) {
344
+ seen.add(source);
345
+ imports.push({
346
+ source,
347
+ specifiers: [],
348
+ isRelative: source.startsWith('.') || source.startsWith('/'),
349
+ });
350
+ }
351
+ }
352
+ // CommonJS require
353
+ const requireRegex = /(?:const|let|var)\s+(?:\{[^}]*\}|\w+)\s*=\s*require\(\s*['"]([^'"]+)['"]\s*\)/gm;
354
+ while ((match = requireRegex.exec(content)) !== null) {
355
+ const source = match[1];
356
+ if (!seen.has(source)) {
357
+ seen.add(source);
358
+ imports.push({
359
+ source,
360
+ specifiers: [],
361
+ isRelative: source.startsWith('.') || source.startsWith('/'),
362
+ });
363
+ }
364
+ }
365
+ return imports;
366
+ }
367
+ function extractExports(content) {
368
+ const exports = [];
369
+ // export function
370
+ const funcRegex = /^export\s+(?:async\s+)?function\s+(\w+)/gm;
371
+ let match;
372
+ while ((match = funcRegex.exec(content)) !== null) {
373
+ exports.push({ name: match[1], type: 'function' });
374
+ }
375
+ // export class
376
+ const classRegex = /^export\s+class\s+(\w+)/gm;
377
+ while ((match = classRegex.exec(content)) !== null) {
378
+ exports.push({ name: match[1], type: 'class' });
379
+ }
380
+ // export const/let/var
381
+ const varRegex = /^export\s+(?:const|let|var)\s+(\w+)/gm;
382
+ while ((match = varRegex.exec(content)) !== null) {
383
+ exports.push({ name: match[1], type: 'variable' });
384
+ }
385
+ // export interface
386
+ const interfaceRegex = /^export\s+interface\s+(\w+)/gm;
387
+ while ((match = interfaceRegex.exec(content)) !== null) {
388
+ exports.push({ name: match[1], type: 'interface' });
389
+ }
390
+ // export type
391
+ const typeRegex = /^export\s+type\s+(\w+)/gm;
392
+ while ((match = typeRegex.exec(content)) !== null) {
393
+ exports.push({ name: match[1], type: 'type' });
394
+ }
395
+ // export default
396
+ if (/^export\s+default/m.test(content)) {
397
+ exports.push({ name: 'default', type: 'default' });
398
+ }
399
+ return exports;
400
+ }
401
+ function inferPurpose(filePath, imports, exports) {
402
+ const name = path.basename(filePath, path.extname(filePath)).toLowerCase();
403
+ const dir = path.dirname(filePath).toLowerCase();
404
+ if (name.includes('test') || name.includes('spec'))
405
+ return 'Test file';
406
+ if (name.includes('config') || name.includes('rc'))
407
+ return 'Configuration file';
408
+ if (name === 'index')
409
+ return 'Module entry point / barrel file';
410
+ if (name === 'main' || name === 'app')
411
+ return 'Application entry point';
412
+ if (name.includes('route') || name.includes('router'))
413
+ return 'Route definitions';
414
+ if (name.includes('middleware'))
415
+ return 'Middleware handler';
416
+ if (name.includes('controller'))
417
+ return 'Request controller';
418
+ if (name.includes('service'))
419
+ return 'Service layer logic';
420
+ if (name.includes('model') || name.includes('schema'))
421
+ return 'Data model / schema definition';
422
+ if (name.includes('util') || name.includes('helper'))
423
+ return 'Utility functions';
424
+ if (name.includes('hook'))
425
+ return 'Custom hook';
426
+ if (name.includes('context') || name.includes('provider'))
427
+ return 'Context / state provider';
428
+ if (name.includes('type') || name.includes('interface'))
429
+ return 'Type definitions';
430
+ if (name.includes('constant') || name.includes('config'))
431
+ return 'Constants / configuration';
432
+ if (name.includes('migration'))
433
+ return 'Database migration';
434
+ if (name.includes('seed'))
435
+ return 'Database seed data';
436
+ if (name.includes('auth'))
437
+ return 'Authentication logic';
438
+ if (name.includes('api'))
439
+ return 'API endpoint handler';
440
+ if (dir.includes('component') || dir.includes('pages'))
441
+ return 'UI component';
442
+ if (dir.includes('service'))
443
+ return 'Service module';
444
+ if (dir.includes('model'))
445
+ return 'Data model';
446
+ if (dir.includes('util') || dir.includes('lib'))
447
+ return 'Library / utility module';
448
+ const exportTypes = exports.map((e) => e.type);
449
+ if (exportTypes.includes('class'))
450
+ return 'Class-based module';
451
+ if (exportTypes.filter((t) => t === 'function').length > 2)
452
+ return 'Function library';
453
+ return 'Source module';
454
+ }
455
+ function detectFileIssues(content, lineCount) {
456
+ const issues = [];
457
+ if (lineCount > 500)
458
+ issues.push(`Large file (${lineCount} lines) — consider splitting`);
459
+ if (lineCount > 1000)
460
+ issues.push('Very large file — strongly consider refactoring');
461
+ if (/console\.(log|warn|error|debug)\s*\(/.test(content)) {
462
+ issues.push('Contains console.log statements — consider using a proper logger');
463
+ }
464
+ if (/TODO|FIXME|HACK|XXX/i.test(content)) {
465
+ issues.push('Contains TODO/FIXME comments');
466
+ }
467
+ if (/any\b/.test(content) && /\.tsx?$/.test(content)) {
468
+ issues.push('Uses "any" type — consider using proper types');
469
+ }
470
+ return issues;
471
+ }
472
+ // ── Architecture Layer Detection ──────────────────────────
473
+ function buildArchitectureLayers(files, frameworkNames) {
474
+ const layers = [];
475
+ const dirs = new Set(files.map((f) => f.directory.split(path.sep)[0]).filter(Boolean));
476
+ // Frontend layer
477
+ const frontendDirs = ['pages', 'components', 'views', 'layouts', 'public', 'app', 'styles'];
478
+ const frontendMatches = frontendDirs.filter((d) => dirs.has(d) || dirs.has(`src/${d}`));
479
+ const frontendFrameworks = frameworkNames.filter((f) => ['React', 'Next.js', 'Vue.js', 'Nuxt.js', 'Svelte', 'SvelteKit', 'Angular', 'Solid.js'].includes(f));
480
+ if (frontendMatches.length > 0 || frontendFrameworks.length > 0) {
481
+ layers.push({
482
+ name: 'Frontend',
483
+ technologies: frontendFrameworks.length > 0 ? frontendFrameworks : ['Static'],
484
+ directories: frontendMatches,
485
+ });
486
+ }
487
+ // API layer
488
+ const apiDirs = ['api', 'routes', 'controllers', 'endpoints'];
489
+ const apiMatches = apiDirs.filter((d) => dirs.has(d) || dirs.has(`src/${d}`));
490
+ const apiFrameworks = frameworkNames.filter((f) => ['Express', 'Fastify', 'NestJS', 'Hono', 'Koa', 'Apollo Server', 'tRPC'].includes(f));
491
+ if (apiMatches.length > 0 || apiFrameworks.length > 0) {
492
+ layers.push({
493
+ name: 'API Layer',
494
+ technologies: apiFrameworks.length > 0 ? apiFrameworks : ['HTTP'],
495
+ directories: apiMatches,
496
+ });
497
+ }
498
+ // Services layer
499
+ const serviceDirs = ['services', 'lib', 'core', 'domain', 'modules'];
500
+ const serviceMatches = serviceDirs.filter((d) => dirs.has(d) || dirs.has(`src/${d}`));
501
+ if (serviceMatches.length > 0) {
502
+ layers.push({
503
+ name: 'Services',
504
+ technologies: inferServiceTech(files, serviceMatches),
505
+ directories: serviceMatches,
506
+ });
507
+ }
508
+ // Database layer
509
+ const dbDirs = ['db', 'database', 'prisma', 'migrations', 'models', 'entities'];
510
+ const dbMatches = dbDirs.filter((d) => dirs.has(d) || dirs.has(`src/${d}`));
511
+ const dbFrameworks = frameworkNames.filter((f) => ['Prisma', 'Drizzle ORM', 'Mongoose', 'TypeORM', 'Sequelize'].includes(f));
512
+ if (dbMatches.length > 0 || dbFrameworks.length > 0) {
513
+ layers.push({
514
+ name: 'Database',
515
+ technologies: dbFrameworks.length > 0 ? dbFrameworks : ['Database'],
516
+ directories: dbMatches,
517
+ });
518
+ }
519
+ // If no layers detected, show a generic one
520
+ if (layers.length === 0) {
521
+ const topDirs = [...dirs].slice(0, 5);
522
+ layers.push({
523
+ name: 'Application',
524
+ technologies: frameworkNames.length > 0 ? frameworkNames : ['Unknown'],
525
+ directories: topDirs,
526
+ });
527
+ }
528
+ return layers;
529
+ }
530
+ function inferServiceTech(files, serviceDirs) {
531
+ const techs = [];
532
+ const serviceFiles = files.filter((f) => serviceDirs.some((d) => f.directory.startsWith(d)));
533
+ const hasTsFiles = serviceFiles.some((f) => f.extension === '.ts' || f.extension === '.tsx');
534
+ const hasJsFiles = serviceFiles.some((f) => f.extension === '.js' || f.extension === '.jsx');
535
+ if (hasTsFiles)
536
+ techs.push('TypeScript');
537
+ else if (hasJsFiles)
538
+ techs.push('JavaScript');
539
+ if (techs.length === 0)
540
+ techs.push('Mixed');
541
+ return techs;
542
+ }
543
+ // ── Helpers ───────────────────────────────────────────────
544
+ function promptYesNo(question) {
545
+ return new Promise((resolve) => {
546
+ const rl = readline.createInterface({
547
+ input: process.stdin,
548
+ output: process.stdout,
549
+ });
550
+ rl.question(question, (answer) => {
551
+ rl.close();
552
+ resolve(answer.toLowerCase().startsWith('y'));
553
+ });
554
+ });
555
+ }
556
+ // ── Run ───────────────────────────────────────────────────
557
+ program.parse();
558
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { DependencyReport } from '../types.js';
2
+ export declare function analyzeDependencies(rootPath: string): Promise<DependencyReport | null>;