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,110 @@
1
+ export interface ScanResult {
2
+ rootPath: string;
3
+ totalFiles: number;
4
+ totalDirectories: number;
5
+ files: FileEntry[];
6
+ directoryTree: DirectoryNode;
7
+ scanDurationMs: number;
8
+ }
9
+ export interface FileEntry {
10
+ relativePath: string;
11
+ absolutePath: string;
12
+ extension: string;
13
+ sizeBytes: number;
14
+ directory: string;
15
+ }
16
+ export interface DirectoryNode {
17
+ name: string;
18
+ path: string;
19
+ children: DirectoryNode[];
20
+ fileCount: number;
21
+ totalFileCount: number;
22
+ }
23
+ export interface LanguageBreakdown {
24
+ primary: string;
25
+ languages: Record<string, LanguageStat>;
26
+ }
27
+ export interface LanguageStat {
28
+ name: string;
29
+ fileCount: number;
30
+ percentage: number;
31
+ extensions: string[];
32
+ }
33
+ export interface FrameworkResult {
34
+ frameworks: DetectedFramework[];
35
+ buildTools: string[];
36
+ packageManager: 'npm' | 'yarn' | 'pnpm' | 'unknown';
37
+ }
38
+ export interface DetectedFramework {
39
+ name: string;
40
+ version?: string;
41
+ category: 'frontend' | 'backend' | 'testing' | 'bundler' | 'css' | 'other';
42
+ confidence: 'high' | 'medium' | 'low';
43
+ }
44
+ export interface DependencyReport {
45
+ totalDependencies: number;
46
+ totalDevDependencies: number;
47
+ dependencies: Record<string, string>;
48
+ devDependencies: Record<string, string>;
49
+ risks: DependencyRisk[];
50
+ }
51
+ export interface DependencyRisk {
52
+ name: string;
53
+ reason: string;
54
+ severity: 'low' | 'medium' | 'high';
55
+ }
56
+ export type IssueSeverity = 'info' | 'warning' | 'error';
57
+ export interface Issue {
58
+ id: string;
59
+ title: string;
60
+ description: string;
61
+ severity: IssueSeverity;
62
+ category: string;
63
+ fixAvailable: boolean;
64
+ fixId?: string;
65
+ }
66
+ export interface Fix {
67
+ id: string;
68
+ title: string;
69
+ description: string;
70
+ issueId: string;
71
+ apply: (rootPath: string) => Promise<void>;
72
+ }
73
+ export interface FixResult {
74
+ fix: Fix;
75
+ success: boolean;
76
+ error?: string;
77
+ }
78
+ export interface FileExplanation {
79
+ filePath: string;
80
+ purpose: string;
81
+ imports: ImportInfo[];
82
+ exports: ExportInfo[];
83
+ potentialIssues: string[];
84
+ lineCount: number;
85
+ }
86
+ export interface ImportInfo {
87
+ source: string;
88
+ specifiers: string[];
89
+ isRelative: boolean;
90
+ }
91
+ export interface ExportInfo {
92
+ name: string;
93
+ type: 'function' | 'class' | 'variable' | 'type' | 'interface' | 'default' | 'unknown';
94
+ }
95
+ export interface ArchitectureLayer {
96
+ name: string;
97
+ technologies: string[];
98
+ directories: string[];
99
+ }
100
+ export interface AnalysisReport {
101
+ projectName: string;
102
+ rootPath: string;
103
+ scan: ScanResult;
104
+ languages: LanguageBreakdown;
105
+ frameworks: FrameworkResult;
106
+ dependencies: DependencyReport | null;
107
+ issues: Issue[];
108
+ timestamp: string;
109
+ }
110
+ export type ReportFormat = 'console' | 'json' | 'markdown';
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // === Scanning Results ===
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2BAA2B"}
@@ -0,0 +1,3 @@
1
+ export declare function cacheGet<T>(key: string): Promise<T | null>;
2
+ export declare function cacheSet<T>(key: string, data: T, ttlMs?: number): Promise<void>;
3
+ export declare function cacheInvalidate(key: string): Promise<void>;
@@ -0,0 +1,51 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import crypto from 'node:crypto';
5
+ const CACHE_DIR = path.join(os.tmpdir(), 'projscan-cache');
6
+ const DEFAULT_TTL_MS = 60_000; // 1 minute
7
+ async function ensureCacheDir() {
8
+ await fs.mkdir(CACHE_DIR, { recursive: true });
9
+ }
10
+ function getCacheFilePath(key) {
11
+ const hash = crypto.createHash('sha256').update(key).digest('hex').slice(0, 16);
12
+ return path.join(CACHE_DIR, `${hash}.json`);
13
+ }
14
+ export async function cacheGet(key) {
15
+ try {
16
+ const filePath = getCacheFilePath(key);
17
+ const raw = await fs.readFile(filePath, 'utf-8');
18
+ const entry = JSON.parse(raw);
19
+ if (Date.now() > entry.expiresAt) {
20
+ await fs.unlink(filePath).catch(() => { });
21
+ return null;
22
+ }
23
+ return entry.data;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ export async function cacheSet(key, data, ttlMs = DEFAULT_TTL_MS) {
30
+ try {
31
+ await ensureCacheDir();
32
+ const filePath = getCacheFilePath(key);
33
+ const entry = {
34
+ data,
35
+ expiresAt: Date.now() + ttlMs,
36
+ };
37
+ await fs.writeFile(filePath, JSON.stringify(entry), 'utf-8');
38
+ }
39
+ catch {
40
+ // Cache write failure is non-critical
41
+ }
42
+ }
43
+ export async function cacheInvalidate(key) {
44
+ try {
45
+ await fs.unlink(getCacheFilePath(key));
46
+ }
47
+ catch {
48
+ // Ignore
49
+ }
50
+ }
51
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC3D,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,WAAW;AAE1C,KAAK,UAAU,cAAc;IAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC9C,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,GAAW;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,KAAK,GAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,GAAW,EAAE,IAAO,EAAE,KAAK,GAAG,cAAc;IAC5E,IAAI,CAAC;QACH,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAkB;YAC3B,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC9B,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { FileEntry } from '../types.js';
2
+ export interface WalkOptions {
3
+ ignore?: string[];
4
+ extensions?: string[];
5
+ }
6
+ export declare function walkFiles(rootPath: string, options?: WalkOptions): Promise<FileEntry[]>;
7
+ export declare function getDefaultIgnorePatterns(): string[];
@@ -0,0 +1,45 @@
1
+ import fg from 'fast-glob';
2
+ import path from 'node:path';
3
+ const DEFAULT_IGNORE = [
4
+ '**/node_modules/**',
5
+ '**/.git/**',
6
+ '**/dist/**',
7
+ '**/build/**',
8
+ '**/coverage/**',
9
+ '**/.next/**',
10
+ '**/.nuxt/**',
11
+ '**/.cache/**',
12
+ '**/.turbo/**',
13
+ '**/.output/**',
14
+ ];
15
+ export async function walkFiles(rootPath, options) {
16
+ const ignore = options?.ignore ?? DEFAULT_IGNORE;
17
+ let pattern = '**/*';
18
+ if (options?.extensions?.length) {
19
+ const exts = options.extensions.map((e) => e.replace(/^\./, ''));
20
+ pattern = exts.length === 1 ? `**/*.${exts[0]}` : `**/*.{${exts.join(',')}}`;
21
+ }
22
+ const entries = await fg(pattern, {
23
+ cwd: rootPath,
24
+ absolute: false,
25
+ dot: true,
26
+ ignore,
27
+ stats: true,
28
+ onlyFiles: true,
29
+ });
30
+ return entries.map((entry) => {
31
+ const relativePath = typeof entry === 'string' ? entry : entry.path;
32
+ const stats = typeof entry === 'string' ? undefined : entry.stats;
33
+ return {
34
+ relativePath,
35
+ absolutePath: path.resolve(rootPath, relativePath),
36
+ extension: path.extname(relativePath).toLowerCase(),
37
+ sizeBytes: stats?.size ?? 0,
38
+ directory: path.dirname(relativePath),
39
+ };
40
+ });
41
+ }
42
+ export function getDefaultIgnorePatterns() {
43
+ return [...DEFAULT_IGNORE];
44
+ }
45
+ //# sourceMappingURL=fileWalker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileWalker.js","sourceRoot":"","sources":["../../src/utils/fileWalker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,cAAc,GAAG;IACrB,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAqB;IACrE,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,cAAc,CAAC;IAEjD,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE;QAChC,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,KAAK;QACf,GAAG,EAAE,IAAI;QACT,MAAM;QACN,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACpE,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAElE,OAAO;YACL,YAAY;YACZ,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC;YAClD,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE;YACnD,SAAS,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;YAC3B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;SACtC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'quiet';
2
+ export declare function setLogLevel(level: LogLevel): void;
3
+ export declare function getLogLevel(): LogLevel;
4
+ export declare const logger: {
5
+ debug(message: string, ...args: unknown[]): void;
6
+ info(message: string, ...args: unknown[]): void;
7
+ warn(message: string, ...args: unknown[]): void;
8
+ error(message: string, ...args: unknown[]): void;
9
+ };
@@ -0,0 +1,41 @@
1
+ import chalk from 'chalk';
2
+ const LOG_LEVELS = {
3
+ debug: 0,
4
+ info: 1,
5
+ warn: 2,
6
+ error: 3,
7
+ quiet: 4,
8
+ };
9
+ let currentLevel = 'info';
10
+ export function setLogLevel(level) {
11
+ currentLevel = level;
12
+ }
13
+ export function getLogLevel() {
14
+ return currentLevel;
15
+ }
16
+ function shouldLog(level) {
17
+ return LOG_LEVELS[level] >= LOG_LEVELS[currentLevel];
18
+ }
19
+ export const logger = {
20
+ debug(message, ...args) {
21
+ if (shouldLog('debug')) {
22
+ console.log(chalk.gray(`[debug] ${message}`), ...args);
23
+ }
24
+ },
25
+ info(message, ...args) {
26
+ if (shouldLog('info')) {
27
+ console.log(message, ...args);
28
+ }
29
+ },
30
+ warn(message, ...args) {
31
+ if (shouldLog('warn')) {
32
+ console.warn(chalk.yellow(`⚠ ${message}`), ...args);
33
+ }
34
+ },
35
+ error(message, ...args) {
36
+ if (shouldLog('error')) {
37
+ console.error(chalk.red(`✗ ${message}`), ...args);
38
+ }
39
+ },
40
+ };
41
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAa,MAAM,CAAC;AAEpC,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "projscan",
3
+ "version": "0.1.0",
4
+ "description": "Instant codebase insights — doctor, x-ray, and architecture map for any repository",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "projscan": "./dist/cli/index.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
19
+ "lint": "eslint src/",
20
+ "format": "prettier --write .",
21
+ "prepare": "npm run build"
22
+ },
23
+ "keywords": [
24
+ "cli",
25
+ "developer-tools",
26
+ "codebase-analysis",
27
+ "project-health",
28
+ "architecture",
29
+ "linting",
30
+ "devtools"
31
+ ],
32
+ "author": "",
33
+ "license": "MIT",
34
+ "engines": {
35
+ "node": ">=18"
36
+ },
37
+ "dependencies": {
38
+ "chalk": "^5.3.0",
39
+ "commander": "^12.1.0",
40
+ "fast-glob": "^3.3.2",
41
+ "ora": "^8.1.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^22.0.0",
45
+ "typescript": "^5.6.0",
46
+ "vitest": "^2.1.0"
47
+ }
48
+ }