lamps-code-review 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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +357 -0
  3. package/bin/lamps-review.js +7 -0
  4. package/dist/cli/commands/review.d.ts +9 -0
  5. package/dist/cli/commands/review.d.ts.map +1 -0
  6. package/dist/cli/commands/review.js +149 -0
  7. package/dist/cli/commands/review.js.map +1 -0
  8. package/dist/cli/index.d.ts +7 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +41 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/core/analyzer/ai/index.d.ts +28 -0
  13. package/dist/core/analyzer/ai/index.d.ts.map +1 -0
  14. package/dist/core/analyzer/ai/index.js +171 -0
  15. package/dist/core/analyzer/ai/index.js.map +1 -0
  16. package/dist/core/analyzer/ai/openrouter.d.ts +26 -0
  17. package/dist/core/analyzer/ai/openrouter.d.ts.map +1 -0
  18. package/dist/core/analyzer/ai/openrouter.js +77 -0
  19. package/dist/core/analyzer/ai/openrouter.js.map +1 -0
  20. package/dist/core/analyzer/ai/prompts.d.ts +32 -0
  21. package/dist/core/analyzer/ai/prompts.d.ts.map +1 -0
  22. package/dist/core/analyzer/ai/prompts.js +171 -0
  23. package/dist/core/analyzer/ai/prompts.js.map +1 -0
  24. package/dist/core/analyzer/index.d.ts +67 -0
  25. package/dist/core/analyzer/index.d.ts.map +1 -0
  26. package/dist/core/analyzer/index.js +224 -0
  27. package/dist/core/analyzer/index.js.map +1 -0
  28. package/dist/core/analyzer/static/index.d.ts +21 -0
  29. package/dist/core/analyzer/static/index.d.ts.map +1 -0
  30. package/dist/core/analyzer/static/index.js +69 -0
  31. package/dist/core/analyzer/static/index.js.map +1 -0
  32. package/dist/core/analyzer/types.d.ts +70 -0
  33. package/dist/core/analyzer/types.d.ts.map +1 -0
  34. package/dist/core/analyzer/types.js +27 -0
  35. package/dist/core/analyzer/types.js.map +1 -0
  36. package/dist/core/config/index.d.ts +28 -0
  37. package/dist/core/config/index.d.ts.map +1 -0
  38. package/dist/core/config/index.js +109 -0
  39. package/dist/core/config/index.js.map +1 -0
  40. package/dist/core/detector/index.d.ts +10 -0
  41. package/dist/core/detector/index.d.ts.map +1 -0
  42. package/dist/core/detector/index.js +306 -0
  43. package/dist/core/detector/index.js.map +1 -0
  44. package/dist/core/reporter/formats/json.d.ts +13 -0
  45. package/dist/core/reporter/formats/json.d.ts.map +1 -0
  46. package/dist/core/reporter/formats/json.js +23 -0
  47. package/dist/core/reporter/formats/json.js.map +1 -0
  48. package/dist/core/reporter/index.d.ts +15 -0
  49. package/dist/core/reporter/index.d.ts.map +1 -0
  50. package/dist/core/reporter/index.js +183 -0
  51. package/dist/core/reporter/index.js.map +1 -0
  52. package/dist/core/scanner/ignore-rules.d.ts +13 -0
  53. package/dist/core/scanner/ignore-rules.d.ts.map +1 -0
  54. package/dist/core/scanner/ignore-rules.js +162 -0
  55. package/dist/core/scanner/ignore-rules.js.map +1 -0
  56. package/dist/core/scanner/index.d.ts +16 -0
  57. package/dist/core/scanner/index.d.ts.map +1 -0
  58. package/dist/core/scanner/index.js +191 -0
  59. package/dist/core/scanner/index.js.map +1 -0
  60. package/dist/index.d.ts +51 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +126 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/types/index.d.ts +188 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +13 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/utils/index.d.ts +54 -0
  69. package/dist/utils/index.d.ts.map +1 -0
  70. package/dist/utils/index.js +159 -0
  71. package/dist/utils/index.js.map +1 -0
  72. package/package.json +61 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Core type definitions for LampsCodeReview SDK
3
+ */
4
+ export interface FileInfo {
5
+ /** Absolute path to the file */
6
+ path: string;
7
+ /** Relative path from repository root */
8
+ relativePath: string;
9
+ /** File extension (e.g., '.ts', '.py') */
10
+ extension: string;
11
+ /** File size in bytes */
12
+ size: number;
13
+ /** File content (loaded on demand) */
14
+ content?: string;
15
+ }
16
+ export interface ScanResult {
17
+ /** List of scanned files */
18
+ files: FileInfo[];
19
+ /** Scan statistics */
20
+ stats: ScanStats;
21
+ /** Root path that was scanned */
22
+ rootPath: string;
23
+ }
24
+ export interface ScanStats {
25
+ /** Total number of files scanned */
26
+ totalFiles: number;
27
+ /** Total size of all files in bytes */
28
+ totalSize: number;
29
+ /** Number of files skipped due to ignore rules */
30
+ skippedFiles: number;
31
+ /** Breakdown by file extension */
32
+ byExtension: Record<string, number>;
33
+ }
34
+ export interface ScanConfig {
35
+ /** Additional patterns to ignore (glob format) */
36
+ ignorePatterns?: string[];
37
+ /** Whether to respect .gitignore files */
38
+ useGitignore?: boolean;
39
+ /** Maximum file size to include (in bytes) */
40
+ maxFileSize?: number;
41
+ /** File extensions to include (e.g., ['.ts', '.js']) */
42
+ includeExtensions?: string[];
43
+ }
44
+ export type Framework = 'nextjs' | 'react' | 'python' | 'typescript' | 'javascript' | 'express' | 'fastapi' | 'django';
45
+ export interface FrameworkDetection {
46
+ /** Detected framework */
47
+ framework: Framework;
48
+ /** Confidence score (0-1) */
49
+ confidence: number;
50
+ /** Evidence that led to this detection */
51
+ evidence: string[];
52
+ }
53
+ export interface DetectionResult {
54
+ /** All detected frameworks */
55
+ frameworks: FrameworkDetection[];
56
+ /** Primary/main framework (highest confidence) */
57
+ primary: Framework | null;
58
+ /** Programming languages detected */
59
+ languages: string[];
60
+ }
61
+ export type AnalyzerPhase = 'static' | 'ai' | 'post';
62
+ export type Severity = 'error' | 'warning' | 'info' | 'hint';
63
+ export interface Finding {
64
+ /** Unique identifier for this finding type */
65
+ ruleId: string;
66
+ /** Human-readable message */
67
+ message: string;
68
+ /** Severity level */
69
+ severity: Severity;
70
+ /** File where the finding was detected */
71
+ file: string;
72
+ /** Line number (1-based) */
73
+ line?: number;
74
+ /** Column number (1-based) */
75
+ column?: number;
76
+ /** Code snippet for context */
77
+ snippet?: string;
78
+ /** Suggested fix (if available) */
79
+ suggestion?: string;
80
+ }
81
+ export interface AnalysisContext {
82
+ /** Scanned files */
83
+ files: FileInfo[];
84
+ /** Detected frameworks */
85
+ frameworks: DetectionResult;
86
+ /** User configuration */
87
+ config: ReviewConfig;
88
+ /** Repository root path */
89
+ rootPath: string;
90
+ }
91
+ export interface AnalysisResult {
92
+ /** Analyzer that produced this result */
93
+ analyzerName: string;
94
+ /** Phase this analyzer ran in */
95
+ phase: AnalyzerPhase;
96
+ /** Findings from this analyzer */
97
+ findings: Finding[];
98
+ /** Execution time in milliseconds */
99
+ duration: number;
100
+ /** Any metadata from the analyzer */
101
+ metadata?: Record<string, unknown>;
102
+ }
103
+ export interface Analyzer {
104
+ /** Unique name for this analyzer */
105
+ name: string;
106
+ /** Execution phase */
107
+ phase: AnalyzerPhase;
108
+ /** Human-readable description */
109
+ description: string;
110
+ /** Run the analysis */
111
+ analyze(context: AnalysisContext): Promise<AnalysisResult>;
112
+ }
113
+ export type ReportFormat = 'json' | 'markdown' | 'html';
114
+ export interface ReviewReport {
115
+ /** Report version for compatibility */
116
+ version: string;
117
+ /** When the review was generated */
118
+ timestamp: string;
119
+ /** Repository that was reviewed */
120
+ repository: {
121
+ path: string;
122
+ filesAnalyzed: number;
123
+ };
124
+ /** Detected frameworks */
125
+ frameworks: DetectionResult;
126
+ /** Summary statistics */
127
+ summary: ReportSummary;
128
+ /** All findings grouped by file */
129
+ findings: Finding[];
130
+ /** Results from each analyzer */
131
+ analyzerResults: AnalysisResult[];
132
+ }
133
+ export interface ReportSummary {
134
+ /** Total number of findings */
135
+ totalFindings: number;
136
+ /** Findings by severity */
137
+ bySeverity: Record<Severity, number>;
138
+ /** Findings by analyzer */
139
+ byAnalyzer: Record<string, number>;
140
+ /** Overall health score (0-100) */
141
+ healthScore: number;
142
+ }
143
+ export interface AIConfig {
144
+ /** OpenRouter model ID (e.g., 'anthropic/claude-sonnet-4') */
145
+ model: string;
146
+ /** Custom review prompt (overrides default) */
147
+ customPrompt?: string;
148
+ /** Maximum tokens for AI response */
149
+ maxTokens: number;
150
+ /** Temperature for AI response (0-1, lower = more focused) */
151
+ temperature: number;
152
+ }
153
+ /** Default AI configuration */
154
+ export declare const DEFAULT_AI_CONFIG: AIConfig;
155
+ export interface ReviewConfig {
156
+ /** Scanning configuration */
157
+ scan?: ScanConfig;
158
+ /** AI configuration */
159
+ ai?: Partial<AIConfig>;
160
+ /** Output format */
161
+ format?: ReportFormat;
162
+ /** Output file path (if writing to file) */
163
+ output?: string;
164
+ /** Analyzers to enable (by name) */
165
+ enabledAnalyzers?: string[];
166
+ /** Analyzers to disable (by name) */
167
+ disabledAnalyzers?: string[];
168
+ /** Verbose logging */
169
+ verbose?: boolean;
170
+ }
171
+ /** Full configuration file structure (lamps.config.json) */
172
+ export interface LampsConfig extends ReviewConfig {
173
+ /** Config file version */
174
+ version?: string;
175
+ }
176
+ export interface CLIOptions {
177
+ /** Output file path */
178
+ output?: string;
179
+ /** Output format */
180
+ format?: ReportFormat;
181
+ /** Verbose output */
182
+ verbose?: boolean;
183
+ /** Config file path */
184
+ config?: string;
185
+ /** Override AI model */
186
+ model?: string;
187
+ }
188
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * Core type definitions for LampsCodeReview SDK
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_AI_CONFIG = void 0;
7
+ /** Default AI configuration */
8
+ exports.DEFAULT_AI_CONFIG = {
9
+ model: 'minimax/minimax-m2.1',
10
+ maxTokens: 150000,
11
+ temperature: 0.3,
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAoMH,+BAA+B;AAClB,QAAA,iBAAiB,GAAa;IACzC,KAAK,EAAE,sBAAsB;IAC7B,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,GAAG;CACjB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Utility functions for LampsCodeReview SDK
3
+ */
4
+ /**
5
+ * Get file extension from a path (normalized to lowercase with leading dot)
6
+ */
7
+ export declare function getExtension(filePath: string): string;
8
+ /**
9
+ * Check if a path exists and is a directory
10
+ */
11
+ export declare function isDirectory(targetPath: string): Promise<boolean>;
12
+ /**
13
+ * Check if a path exists and is a file
14
+ */
15
+ export declare function isFile(targetPath: string): Promise<boolean>;
16
+ /**
17
+ * Read file content as string
18
+ */
19
+ export declare function readFileContent(filePath: string): Promise<string>;
20
+ /**
21
+ * Get file size in bytes
22
+ */
23
+ export declare function getFileSize(filePath: string): Promise<number>;
24
+ /**
25
+ * Normalize a path to use forward slashes and resolve to absolute
26
+ */
27
+ export declare function normalizePath(inputPath: string): string;
28
+ /**
29
+ * Get relative path from root, normalized with forward slashes
30
+ */
31
+ export declare function getRelativePath(rootPath: string, filePath: string): string;
32
+ /**
33
+ * Simple pattern matching for glob-like patterns
34
+ * Supports: * (any chars), ** (any path segments)
35
+ */
36
+ export declare function matchesPattern(filePath: string, pattern: string): boolean;
37
+ /**
38
+ * Format bytes to human readable string
39
+ */
40
+ export declare function formatBytes(bytes: number): string;
41
+ /**
42
+ * Format duration in milliseconds to human readable string
43
+ */
44
+ export declare function formatDuration(ms: number): string;
45
+ /**
46
+ * Create a simple logger with optional verbose mode
47
+ */
48
+ export declare function createLogger(verbose?: boolean): {
49
+ info: (message: string) => void;
50
+ error: (message: string) => void;
51
+ debug: (message: string) => void;
52
+ warn: (message: string) => void;
53
+ };
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOtE;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAczE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,OAAe;oBAEjC,MAAM;qBACL,MAAM;qBACN,MAAM;oBAGP,MAAM;EAEzB"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * Utility functions for LampsCodeReview SDK
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getExtension = getExtension;
40
+ exports.isDirectory = isDirectory;
41
+ exports.isFile = isFile;
42
+ exports.readFileContent = readFileContent;
43
+ exports.getFileSize = getFileSize;
44
+ exports.normalizePath = normalizePath;
45
+ exports.getRelativePath = getRelativePath;
46
+ exports.matchesPattern = matchesPattern;
47
+ exports.formatBytes = formatBytes;
48
+ exports.formatDuration = formatDuration;
49
+ exports.createLogger = createLogger;
50
+ const fs = __importStar(require("node:fs"));
51
+ const path = __importStar(require("node:path"));
52
+ /**
53
+ * Get file extension from a path (normalized to lowercase with leading dot)
54
+ */
55
+ function getExtension(filePath) {
56
+ const ext = path.extname(filePath).toLowerCase();
57
+ return ext || '';
58
+ }
59
+ /**
60
+ * Check if a path exists and is a directory
61
+ */
62
+ async function isDirectory(targetPath) {
63
+ try {
64
+ const stats = await fs.promises.stat(targetPath);
65
+ return stats.isDirectory();
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ /**
72
+ * Check if a path exists and is a file
73
+ */
74
+ async function isFile(targetPath) {
75
+ try {
76
+ const stats = await fs.promises.stat(targetPath);
77
+ return stats.isFile();
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ /**
84
+ * Read file content as string
85
+ */
86
+ async function readFileContent(filePath) {
87
+ return fs.promises.readFile(filePath, 'utf-8');
88
+ }
89
+ /**
90
+ * Get file size in bytes
91
+ */
92
+ async function getFileSize(filePath) {
93
+ const stats = await fs.promises.stat(filePath);
94
+ return stats.size;
95
+ }
96
+ /**
97
+ * Normalize a path to use forward slashes and resolve to absolute
98
+ */
99
+ function normalizePath(inputPath) {
100
+ return path.resolve(inputPath).replace(/\\/g, '/');
101
+ }
102
+ /**
103
+ * Get relative path from root, normalized with forward slashes
104
+ */
105
+ function getRelativePath(rootPath, filePath) {
106
+ return path.relative(rootPath, filePath).replace(/\\/g, '/');
107
+ }
108
+ /**
109
+ * Simple pattern matching for glob-like patterns
110
+ * Supports: * (any chars), ** (any path segments)
111
+ */
112
+ function matchesPattern(filePath, pattern) {
113
+ // Normalize both paths
114
+ const normalizedPath = filePath.replace(/\\/g, '/');
115
+ const normalizedPattern = pattern.replace(/\\/g, '/');
116
+ // Convert glob pattern to regex
117
+ const regexPattern = normalizedPattern
118
+ .replace(/\./g, '\\.')
119
+ .replace(/\*\*/g, '{{DOUBLE_STAR}}')
120
+ .replace(/\*/g, '[^/]*')
121
+ .replace(/\{\{DOUBLE_STAR\}\}/g, '.*');
122
+ const regex = new RegExp(`^${regexPattern}$`);
123
+ return regex.test(normalizedPath);
124
+ }
125
+ /**
126
+ * Format bytes to human readable string
127
+ */
128
+ function formatBytes(bytes) {
129
+ if (bytes === 0)
130
+ return '0 B';
131
+ const units = ['B', 'KB', 'MB', 'GB'];
132
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
133
+ return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${units[i]}`;
134
+ }
135
+ /**
136
+ * Format duration in milliseconds to human readable string
137
+ */
138
+ function formatDuration(ms) {
139
+ if (ms < 1000)
140
+ return `${ms}ms`;
141
+ if (ms < 60000)
142
+ return `${(ms / 1000).toFixed(2)}s`;
143
+ return `${(ms / 60000).toFixed(2)}m`;
144
+ }
145
+ /**
146
+ * Create a simple logger with optional verbose mode
147
+ */
148
+ function createLogger(verbose = false) {
149
+ return {
150
+ info: (message) => console.log(message),
151
+ error: (message) => console.error(message),
152
+ debug: (message) => {
153
+ if (verbose)
154
+ console.log(`[DEBUG] ${message}`);
155
+ },
156
+ warn: (message) => console.warn(`[WARN] ${message}`),
157
+ };
158
+ }
159
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "lamps-code-review",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered code review SDK and CLI for modern web codebases",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "lamps-review": "./bin/lamps-review.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "require": "./dist/index.js",
14
+ "import": "./dist/index.mjs",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "bin"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsc --watch",
25
+ "test": "vitest",
26
+ "test:run": "vitest run",
27
+ "lint": "tsc --noEmit",
28
+ "prepublishOnly": "npm run build"
29
+ },
30
+ "keywords": [
31
+ "code-review",
32
+ "static-analysis",
33
+ "ai",
34
+ "typescript",
35
+ "react",
36
+ "nextjs",
37
+ "python",
38
+ "cli"
39
+ ],
40
+ "author": "Lamps <https://x.com/lamps_apple>",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/AppleLamps/lamps-code-review"
44
+ },
45
+ "homepage": "https://github.com/AppleLamps/lamps-code-review#readme",
46
+ "bugs": {
47
+ "url": "https://github.com/AppleLamps/lamps-code-review/issues"
48
+ },
49
+ "license": "MIT",
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ },
53
+ "dependencies": {
54
+ "commander": "^12.1.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^20.10.0",
58
+ "typescript": "^5.3.0",
59
+ "vitest": "^2.0.0"
60
+ }
61
+ }