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,224 @@
1
+ "use strict";
2
+ /**
3
+ * Analyzer pipeline module
4
+ * Orchestrates running multiple analyzers in phases
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.createAIAnalyzer = exports.createStaticAnalyzer = exports.AnalyzerPipeline = void 0;
22
+ const index_js_1 = require("./static/index.js");
23
+ const index_js_2 = require("./ai/index.js");
24
+ /** Execution order for phases */
25
+ const PHASE_ORDER = ['static', 'ai', 'post'];
26
+ /**
27
+ * Analyzer pipeline - orchestrates running analyzers in phases
28
+ */
29
+ class AnalyzerPipeline {
30
+ constructor(options = {}, aiConfig) {
31
+ this.analyzers = new Map();
32
+ this.listeners = [];
33
+ this.options = {
34
+ failFast: false,
35
+ parallel: false,
36
+ timeout: 120000, // 2 minutes per analyzer (AI may take longer)
37
+ ...options,
38
+ };
39
+ // Register built-in analyzers
40
+ this.registerAnalyzer((0, index_js_1.createStaticAnalyzer)());
41
+ // Register AI analyzer if config provided
42
+ if (aiConfig) {
43
+ this.registerAnalyzer((0, index_js_2.createAIAnalyzer)(aiConfig));
44
+ }
45
+ }
46
+ /**
47
+ * Register an analyzer
48
+ */
49
+ registerAnalyzer(analyzer) {
50
+ if (this.analyzers.has(analyzer.name)) {
51
+ throw new Error(`Analyzer "${analyzer.name}" is already registered`);
52
+ }
53
+ this.analyzers.set(analyzer.name, analyzer);
54
+ }
55
+ /**
56
+ * Unregister an analyzer by name
57
+ */
58
+ unregisterAnalyzer(name) {
59
+ return this.analyzers.delete(name);
60
+ }
61
+ /**
62
+ * Get all registered analyzers
63
+ */
64
+ getAnalyzers() {
65
+ return Array.from(this.analyzers.values());
66
+ }
67
+ /**
68
+ * Get analyzers for a specific phase
69
+ */
70
+ getAnalyzersForPhase(phase) {
71
+ return this.getAnalyzers().filter((a) => a.phase === phase);
72
+ }
73
+ /**
74
+ * Add an event listener
75
+ */
76
+ addEventListener(listener) {
77
+ this.listeners.push(listener);
78
+ }
79
+ /**
80
+ * Remove an event listener
81
+ */
82
+ removeEventListener(listener) {
83
+ const index = this.listeners.indexOf(listener);
84
+ if (index !== -1) {
85
+ this.listeners.splice(index, 1);
86
+ }
87
+ }
88
+ /**
89
+ * Emit an event to all listeners
90
+ */
91
+ emit(event) {
92
+ for (const listener of this.listeners) {
93
+ try {
94
+ listener(event);
95
+ }
96
+ catch {
97
+ // Ignore listener errors
98
+ }
99
+ }
100
+ }
101
+ /**
102
+ * Run the analysis pipeline
103
+ */
104
+ async run(context) {
105
+ const startTime = Date.now();
106
+ const allResults = [];
107
+ const errors = [];
108
+ // Filter analyzers based on config
109
+ const enabledAnalyzers = this.getEnabledAnalyzers(context);
110
+ // Run each phase in order
111
+ for (const phase of PHASE_ORDER) {
112
+ const phaseAnalyzers = enabledAnalyzers.filter((a) => a.phase === phase);
113
+ if (phaseAnalyzers.length === 0) {
114
+ continue;
115
+ }
116
+ this.emit({ type: 'phase-start', phase });
117
+ const phaseResults = [];
118
+ if (this.options.parallel) {
119
+ // Run analyzers in parallel
120
+ const promises = phaseAnalyzers.map((analyzer) => this.runAnalyzer(analyzer, context));
121
+ const results = await Promise.allSettled(promises);
122
+ for (let i = 0; i < results.length; i++) {
123
+ const result = results[i];
124
+ const analyzer = phaseAnalyzers[i];
125
+ if (result.status === 'fulfilled') {
126
+ phaseResults.push(result.value);
127
+ }
128
+ else {
129
+ errors.push(`${analyzer.name}: ${result.reason}`);
130
+ this.emit({
131
+ type: 'analyzer-error',
132
+ analyzer: analyzer.name,
133
+ error: result.reason,
134
+ });
135
+ if (this.options.failFast) {
136
+ return this.createResult(allResults, startTime, errors);
137
+ }
138
+ }
139
+ }
140
+ }
141
+ else {
142
+ // Run analyzers sequentially
143
+ for (const analyzer of phaseAnalyzers) {
144
+ try {
145
+ const result = await this.runAnalyzer(analyzer, context);
146
+ phaseResults.push(result);
147
+ }
148
+ catch (error) {
149
+ const errorMessage = error instanceof Error ? error.message : String(error);
150
+ errors.push(`${analyzer.name}: ${errorMessage}`);
151
+ this.emit({
152
+ type: 'analyzer-error',
153
+ analyzer: analyzer.name,
154
+ error: error instanceof Error ? error : new Error(errorMessage),
155
+ });
156
+ if (this.options.failFast) {
157
+ return this.createResult(allResults, startTime, errors);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ allResults.push(...phaseResults);
163
+ this.emit({ type: 'phase-end', phase, results: phaseResults });
164
+ }
165
+ return this.createResult(allResults, startTime, errors);
166
+ }
167
+ /**
168
+ * Run a single analyzer with timeout
169
+ */
170
+ async runAnalyzer(analyzer, context) {
171
+ this.emit({ type: 'analyzer-start', analyzer: analyzer.name });
172
+ const result = await Promise.race([
173
+ analyzer.analyze(context),
174
+ this.timeout(analyzer.name),
175
+ ]);
176
+ this.emit({ type: 'analyzer-end', analyzer: analyzer.name, result });
177
+ return result;
178
+ }
179
+ /**
180
+ * Create a timeout promise
181
+ */
182
+ timeout(analyzerName) {
183
+ return new Promise((_, reject) => {
184
+ setTimeout(() => {
185
+ reject(new Error(`Analyzer "${analyzerName}" timed out`));
186
+ }, this.options.timeout);
187
+ });
188
+ }
189
+ /**
190
+ * Get enabled analyzers based on config
191
+ */
192
+ getEnabledAnalyzers(context) {
193
+ const { enabledAnalyzers, disabledAnalyzers } = context.config;
194
+ let analyzers = this.getAnalyzers();
195
+ if (enabledAnalyzers && enabledAnalyzers.length > 0) {
196
+ // Only use explicitly enabled analyzers
197
+ analyzers = analyzers.filter((a) => enabledAnalyzers.includes(a.name));
198
+ }
199
+ if (disabledAnalyzers && disabledAnalyzers.length > 0) {
200
+ // Remove disabled analyzers
201
+ analyzers = analyzers.filter((a) => !disabledAnalyzers.includes(a.name));
202
+ }
203
+ return analyzers;
204
+ }
205
+ /**
206
+ * Create the final pipeline result
207
+ */
208
+ createResult(results, startTime, errors) {
209
+ return {
210
+ results,
211
+ duration: Date.now() - startTime,
212
+ hasErrors: errors.length > 0,
213
+ errors,
214
+ };
215
+ }
216
+ }
217
+ exports.AnalyzerPipeline = AnalyzerPipeline;
218
+ // Re-export types
219
+ __exportStar(require("./types.js"), exports);
220
+ var index_js_3 = require("./static/index.js");
221
+ Object.defineProperty(exports, "createStaticAnalyzer", { enumerable: true, get: function () { return index_js_3.createStaticAnalyzer; } });
222
+ var index_js_4 = require("./ai/index.js");
223
+ Object.defineProperty(exports, "createAIAnalyzer", { enumerable: true, get: function () { return index_js_4.createAIAnalyzer; } });
224
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/analyzer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Static analyzer placeholder
3
+ * Will contain built-in static analysis rules
4
+ */
5
+ import type { AnalysisContext, AnalysisResult } from '../../../types/index.js';
6
+ import { BaseAnalyzer } from '../types.js';
7
+ /**
8
+ * Placeholder static analyzer
9
+ * This will be expanded with actual static analysis rules
10
+ */
11
+ export declare class StaticAnalyzer extends BaseAnalyzer {
12
+ readonly name = "static";
13
+ readonly phase: "static";
14
+ readonly description = "Built-in static analysis rules";
15
+ analyze(context: AnalysisContext): Promise<AnalysisResult>;
16
+ }
17
+ /**
18
+ * Create the default static analyzer instance
19
+ */
20
+ export declare function createStaticAnalyzer(): StaticAnalyzer;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/static/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAW,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAG,QAAQ,CAAU;IACnC,QAAQ,CAAC,WAAW,oCAAoC;IAElD,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CA+CjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * Static analyzer placeholder
4
+ * Will contain built-in static analysis rules
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.StaticAnalyzer = void 0;
8
+ exports.createStaticAnalyzer = createStaticAnalyzer;
9
+ const types_js_1 = require("../types.js");
10
+ /**
11
+ * Placeholder static analyzer
12
+ * This will be expanded with actual static analysis rules
13
+ */
14
+ class StaticAnalyzer extends types_js_1.BaseAnalyzer {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.name = 'static';
18
+ this.phase = 'static';
19
+ this.description = 'Built-in static analysis rules';
20
+ }
21
+ async analyze(context) {
22
+ const startTime = Date.now();
23
+ const findings = [];
24
+ // TODO(analyzer): Add file size warnings
25
+ // TODO(analyzer): Add complexity analysis
26
+ // TODO(analyzer): Add import cycle detection
27
+ // TODO(analyzer): Add security pattern detection
28
+ // TODO(analyzer): Add dead code detection
29
+ // Example: Check for very large files
30
+ for (const file of context.files) {
31
+ if (file.size > 500 * 1024) {
32
+ // Files over 500KB
33
+ findings.push({
34
+ ruleId: 'static/large-file',
35
+ message: `File is very large (${Math.round(file.size / 1024)}KB). Consider splitting it.`,
36
+ severity: 'warning',
37
+ file: file.relativePath,
38
+ });
39
+ }
40
+ }
41
+ // Example: Check for common anti-patterns in file names
42
+ for (const file of context.files) {
43
+ const fileName = file.relativePath.split('/').pop() || '';
44
+ // Check for test files in src (not in test directories)
45
+ if (fileName.includes('.test.') &&
46
+ !file.relativePath.includes('__tests__') &&
47
+ !file.relativePath.includes('/test/') &&
48
+ !file.relativePath.includes('/tests/')) {
49
+ findings.push({
50
+ ruleId: 'static/misplaced-test',
51
+ message: 'Test file found outside of test directory',
52
+ severity: 'hint',
53
+ file: file.relativePath,
54
+ });
55
+ }
56
+ }
57
+ return this.createResult(findings, startTime, {
58
+ filesAnalyzed: context.files.length,
59
+ });
60
+ }
61
+ }
62
+ exports.StaticAnalyzer = StaticAnalyzer;
63
+ /**
64
+ * Create the default static analyzer instance
65
+ */
66
+ function createStaticAnalyzer() {
67
+ return new StaticAnalyzer();
68
+ }
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/analyzer/static/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkEH,oDAEC;AAjED,0CAA2C;AAE3C;;;GAGG;AACH,MAAa,cAAe,SAAQ,uBAAY;IAAhD;;QACW,SAAI,GAAG,QAAQ,CAAC;QAChB,UAAK,GAAG,QAAiB,CAAC;QAC1B,gBAAW,GAAG,gCAAgC,CAAC;IAiD1D,CAAC;IA/CC,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,yCAAyC;QACzC,0CAA0C;QAC1C,6CAA6C;QAC7C,iDAAiD;QACjD,0CAA0C;QAE1C,sCAAsC;QACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;gBAC3B,mBAAmB;gBACnB,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,mBAAmB;oBAC3B,OAAO,EAAE,uBAAuB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,6BAA6B;oBACzF,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,IAAI,CAAC,YAAY;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE1D,wDAAwD;YACxD,IACE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC3B,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACxC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtC,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,uBAAuB;oBAC/B,OAAO,EAAE,2CAA2C;oBACpD,QAAQ,EAAE,MAAM;oBAChB,IAAI,EAAE,IAAI,CAAC,YAAY;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE;YAC5C,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;SACpC,CAAC,CAAC;IACL,CAAC;CACF;AApDD,wCAoDC;AAED;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,IAAI,cAAc,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Analyzer-specific types
3
+ * Extends the base types with analyzer implementation details
4
+ */
5
+ import type { Analyzer, AnalyzerPhase, AnalysisResult, AnalysisContext } from '../../types/index.js';
6
+ /**
7
+ * Base class for creating analyzers
8
+ * Provides common functionality and enforces the Analyzer interface
9
+ */
10
+ export declare abstract class BaseAnalyzer implements Analyzer {
11
+ abstract readonly name: string;
12
+ abstract readonly phase: AnalyzerPhase;
13
+ abstract readonly description: string;
14
+ abstract analyze(context: AnalysisContext): Promise<AnalysisResult>;
15
+ /**
16
+ * Helper to create a result object with timing
17
+ */
18
+ protected createResult(findings: AnalysisResult['findings'], startTime: number, metadata?: Record<string, unknown>): AnalysisResult;
19
+ }
20
+ /**
21
+ * Options for the analyzer pipeline
22
+ */
23
+ export interface PipelineOptions {
24
+ /** Stop on first error */
25
+ failFast?: boolean;
26
+ /** Run analyzers in parallel within each phase */
27
+ parallel?: boolean;
28
+ /** Timeout per analyzer in milliseconds */
29
+ timeout?: number;
30
+ }
31
+ /**
32
+ * Result from running the full pipeline
33
+ */
34
+ export interface PipelineResult {
35
+ /** All analysis results */
36
+ results: AnalysisResult[];
37
+ /** Total execution time */
38
+ duration: number;
39
+ /** Whether any analyzer failed */
40
+ hasErrors: boolean;
41
+ /** Error messages if any */
42
+ errors: string[];
43
+ }
44
+ /**
45
+ * Event types for pipeline hooks
46
+ */
47
+ export type PipelineEvent = {
48
+ type: 'phase-start';
49
+ phase: AnalyzerPhase;
50
+ } | {
51
+ type: 'phase-end';
52
+ phase: AnalyzerPhase;
53
+ results: AnalysisResult[];
54
+ } | {
55
+ type: 'analyzer-start';
56
+ analyzer: string;
57
+ } | {
58
+ type: 'analyzer-end';
59
+ analyzer: string;
60
+ result: AnalysisResult;
61
+ } | {
62
+ type: 'analyzer-error';
63
+ analyzer: string;
64
+ error: Error;
65
+ };
66
+ /**
67
+ * Listener for pipeline events
68
+ */
69
+ export type PipelineEventListener = (event: PipelineEvent) => void;
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAErG;;;GAGG;AACH,8BAAsB,YAAa,YAAW,QAAQ;IACpD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEtC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAEnE;;OAEG;IACH,SAAS,CAAC,YAAY,CACpB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,EACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,cAAc;CASlB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Analyzer-specific types
4
+ * Extends the base types with analyzer implementation details
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BaseAnalyzer = void 0;
8
+ /**
9
+ * Base class for creating analyzers
10
+ * Provides common functionality and enforces the Analyzer interface
11
+ */
12
+ class BaseAnalyzer {
13
+ /**
14
+ * Helper to create a result object with timing
15
+ */
16
+ createResult(findings, startTime, metadata) {
17
+ return {
18
+ analyzerName: this.name,
19
+ phase: this.phase,
20
+ findings,
21
+ duration: Date.now() - startTime,
22
+ metadata,
23
+ };
24
+ }
25
+ }
26
+ exports.BaseAnalyzer = BaseAnalyzer;
27
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/analyzer/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH;;;GAGG;AACH,MAAsB,YAAY;IAOhC;;OAEG;IACO,YAAY,CACpB,QAAoC,EACpC,SAAiB,EACjB,QAAkC;QAElC,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,QAAQ;SACT,CAAC;IACJ,CAAC;CACF;AAvBD,oCAuBC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Configuration loader module
3
+ * Loads and merges configuration from lamps.config.json
4
+ */
5
+ import type { LampsConfig, AIConfig } from '../../types/index.js';
6
+ /**
7
+ * Load configuration from lamps.config.json in the target directory
8
+ * Falls back to defaults if no config file exists
9
+ */
10
+ export declare function loadConfig(rootPath: string): Promise<LampsConfig>;
11
+ /**
12
+ * Merge user AI config with defaults
13
+ */
14
+ export declare function mergeAIConfig(userConfig?: Partial<AIConfig>): AIConfig;
15
+ /**
16
+ * Check if OpenRouter API key is available
17
+ */
18
+ export declare function hasOpenRouterKey(): boolean;
19
+ /**
20
+ * Get OpenRouter API key from environment
21
+ * @throws Error if key is not set
22
+ */
23
+ export declare function getOpenRouterKey(): string;
24
+ /**
25
+ * Validate AI configuration
26
+ */
27
+ export declare function validateAIConfig(config: AIConfig): string[];
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMlE;;;GAGG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAWvE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAKtE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,CAgB3D"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration loader module
4
+ * Loads and merges configuration from lamps.config.json
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.loadConfig = loadConfig;
41
+ exports.mergeAIConfig = mergeAIConfig;
42
+ exports.hasOpenRouterKey = hasOpenRouterKey;
43
+ exports.getOpenRouterKey = getOpenRouterKey;
44
+ exports.validateAIConfig = validateAIConfig;
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const index_js_1 = require("../../types/index.js");
48
+ /** Config file name */
49
+ const CONFIG_FILE_NAME = 'lamps.config.json';
50
+ /**
51
+ * Load configuration from lamps.config.json in the target directory
52
+ * Falls back to defaults if no config file exists
53
+ */
54
+ async function loadConfig(rootPath) {
55
+ const configPath = path.join(rootPath, CONFIG_FILE_NAME);
56
+ try {
57
+ const content = await fs.promises.readFile(configPath, 'utf-8');
58
+ const config = JSON.parse(content);
59
+ return config;
60
+ }
61
+ catch {
62
+ // No config file or invalid JSON - return empty config (will use defaults)
63
+ return {};
64
+ }
65
+ }
66
+ /**
67
+ * Merge user AI config with defaults
68
+ */
69
+ function mergeAIConfig(userConfig) {
70
+ return {
71
+ ...index_js_1.DEFAULT_AI_CONFIG,
72
+ ...userConfig,
73
+ };
74
+ }
75
+ /**
76
+ * Check if OpenRouter API key is available
77
+ */
78
+ function hasOpenRouterKey() {
79
+ return !!process.env.OPENROUTER_API_KEY;
80
+ }
81
+ /**
82
+ * Get OpenRouter API key from environment
83
+ * @throws Error if key is not set
84
+ */
85
+ function getOpenRouterKey() {
86
+ const key = process.env.OPENROUTER_API_KEY;
87
+ if (!key) {
88
+ throw new Error('OPENROUTER_API_KEY environment variable is not set. ' +
89
+ 'Set it to enable AI-powered code review.');
90
+ }
91
+ return key;
92
+ }
93
+ /**
94
+ * Validate AI configuration
95
+ */
96
+ function validateAIConfig(config) {
97
+ const errors = [];
98
+ if (!config.model || typeof config.model !== 'string') {
99
+ errors.push('AI model must be a non-empty string');
100
+ }
101
+ if (config.maxTokens < 1 || config.maxTokens > 100000) {
102
+ errors.push('maxTokens must be between 1 and 100000');
103
+ }
104
+ if (config.temperature < 0 || config.temperature > 2) {
105
+ errors.push('temperature must be between 0 and 2');
106
+ }
107
+ return errors;
108
+ }
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/config/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcH,gCAWC;AAKD,sCAKC;AAKD,4CAEC;AAMD,4CASC;AAKD,4CAgBC;AA5ED,4CAA8B;AAC9B,gDAAkC;AAElC,mDAAyD;AAEzD,uBAAuB;AACvB,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C;;;GAGG;AACI,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;QAClD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,UAA8B;IAC1D,OAAO;QACL,GAAG,4BAAiB;QACpB,GAAG,UAAU;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAgB;IAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Framework detection module
3
+ * Analyzes files to detect frameworks, libraries, and languages
4
+ */
5
+ import type { DetectionResult, FileInfo } from '../../types/index.js';
6
+ /**
7
+ * Detect frameworks and languages in a codebase
8
+ */
9
+ export declare function detectFrameworks(files: FileInfo[], rootPath: string): Promise<DetectionResult>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/detector/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EAGT,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAoD1B"}