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.
- package/LICENSE +21 -0
- package/README.md +357 -0
- package/bin/lamps-review.js +7 -0
- package/dist/cli/commands/review.d.ts +9 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +149 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +41 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/analyzer/ai/index.d.ts +28 -0
- package/dist/core/analyzer/ai/index.d.ts.map +1 -0
- package/dist/core/analyzer/ai/index.js +171 -0
- package/dist/core/analyzer/ai/index.js.map +1 -0
- package/dist/core/analyzer/ai/openrouter.d.ts +26 -0
- package/dist/core/analyzer/ai/openrouter.d.ts.map +1 -0
- package/dist/core/analyzer/ai/openrouter.js +77 -0
- package/dist/core/analyzer/ai/openrouter.js.map +1 -0
- package/dist/core/analyzer/ai/prompts.d.ts +32 -0
- package/dist/core/analyzer/ai/prompts.d.ts.map +1 -0
- package/dist/core/analyzer/ai/prompts.js +171 -0
- package/dist/core/analyzer/ai/prompts.js.map +1 -0
- package/dist/core/analyzer/index.d.ts +67 -0
- package/dist/core/analyzer/index.d.ts.map +1 -0
- package/dist/core/analyzer/index.js +224 -0
- package/dist/core/analyzer/index.js.map +1 -0
- package/dist/core/analyzer/static/index.d.ts +21 -0
- package/dist/core/analyzer/static/index.d.ts.map +1 -0
- package/dist/core/analyzer/static/index.js +69 -0
- package/dist/core/analyzer/static/index.js.map +1 -0
- package/dist/core/analyzer/types.d.ts +70 -0
- package/dist/core/analyzer/types.d.ts.map +1 -0
- package/dist/core/analyzer/types.js +27 -0
- package/dist/core/analyzer/types.js.map +1 -0
- package/dist/core/config/index.d.ts +28 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +109 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/detector/index.d.ts +10 -0
- package/dist/core/detector/index.d.ts.map +1 -0
- package/dist/core/detector/index.js +306 -0
- package/dist/core/detector/index.js.map +1 -0
- package/dist/core/reporter/formats/json.d.ts +13 -0
- package/dist/core/reporter/formats/json.d.ts.map +1 -0
- package/dist/core/reporter/formats/json.js +23 -0
- package/dist/core/reporter/formats/json.js.map +1 -0
- package/dist/core/reporter/index.d.ts +15 -0
- package/dist/core/reporter/index.d.ts.map +1 -0
- package/dist/core/reporter/index.js +183 -0
- package/dist/core/reporter/index.js.map +1 -0
- package/dist/core/scanner/ignore-rules.d.ts +13 -0
- package/dist/core/scanner/ignore-rules.d.ts.map +1 -0
- package/dist/core/scanner/ignore-rules.js +162 -0
- package/dist/core/scanner/ignore-rules.js.map +1 -0
- package/dist/core/scanner/index.d.ts +16 -0
- package/dist/core/scanner/index.d.ts.map +1 -0
- package/dist/core/scanner/index.js +191 -0
- package/dist/core/scanner/index.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +126 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +188 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +54 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +159 -0
- package/dist/utils/index.js.map +1 -0
- 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"}
|