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,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Framework detection module
|
|
4
|
+
* Analyzes files to detect frameworks, libraries, and languages
|
|
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.detectFrameworks = detectFrameworks;
|
|
41
|
+
const fs = __importStar(require("node:fs"));
|
|
42
|
+
const path = __importStar(require("node:path"));
|
|
43
|
+
/**
|
|
44
|
+
* Detect frameworks and languages in a codebase
|
|
45
|
+
*/
|
|
46
|
+
async function detectFrameworks(files, rootPath) {
|
|
47
|
+
const detections = [];
|
|
48
|
+
const languages = new Set();
|
|
49
|
+
// Analyze file extensions for language detection
|
|
50
|
+
for (const file of files) {
|
|
51
|
+
const lang = extensionToLanguage(file.extension);
|
|
52
|
+
if (lang) {
|
|
53
|
+
languages.add(lang);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Try to read package.json for Node.js projects
|
|
57
|
+
const packageJsonPath = path.join(rootPath, 'package.json');
|
|
58
|
+
const packageJson = await tryReadJson(packageJsonPath);
|
|
59
|
+
if (packageJson) {
|
|
60
|
+
const npmDetections = detectFromPackageJson(packageJson);
|
|
61
|
+
detections.push(...npmDetections);
|
|
62
|
+
}
|
|
63
|
+
// Try to read requirements.txt or pyproject.toml for Python projects
|
|
64
|
+
const requirementsPath = path.join(rootPath, 'requirements.txt');
|
|
65
|
+
const pyprojectPath = path.join(rootPath, 'pyproject.toml');
|
|
66
|
+
if (await fileExists(requirementsPath)) {
|
|
67
|
+
const content = await fs.promises.readFile(requirementsPath, 'utf-8');
|
|
68
|
+
const pythonDetections = detectFromRequirements(content);
|
|
69
|
+
detections.push(...pythonDetections);
|
|
70
|
+
}
|
|
71
|
+
if (await fileExists(pyprojectPath)) {
|
|
72
|
+
const content = await fs.promises.readFile(pyprojectPath, 'utf-8');
|
|
73
|
+
const pythonDetections = detectFromPyproject(content);
|
|
74
|
+
detections.push(...pythonDetections);
|
|
75
|
+
}
|
|
76
|
+
// Detect from file patterns
|
|
77
|
+
const patternDetections = detectFromFilePatterns(files);
|
|
78
|
+
detections.push(...patternDetections);
|
|
79
|
+
// Merge duplicate detections and pick highest confidence
|
|
80
|
+
const mergedDetections = mergeDetections(detections);
|
|
81
|
+
// Sort by confidence (descending)
|
|
82
|
+
mergedDetections.sort((a, b) => b.confidence - a.confidence);
|
|
83
|
+
return {
|
|
84
|
+
frameworks: mergedDetections,
|
|
85
|
+
primary: mergedDetections.length > 0 ? mergedDetections[0].framework : null,
|
|
86
|
+
languages: Array.from(languages),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Detect frameworks from package.json
|
|
91
|
+
*/
|
|
92
|
+
function detectFromPackageJson(packageJson) {
|
|
93
|
+
const detections = [];
|
|
94
|
+
const deps = {
|
|
95
|
+
...packageJson.dependencies,
|
|
96
|
+
...packageJson.devDependencies,
|
|
97
|
+
};
|
|
98
|
+
// Next.js detection
|
|
99
|
+
if (deps['next']) {
|
|
100
|
+
detections.push({
|
|
101
|
+
framework: 'nextjs',
|
|
102
|
+
confidence: 0.95,
|
|
103
|
+
evidence: ['next package in dependencies'],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// React detection
|
|
107
|
+
if (deps['react']) {
|
|
108
|
+
detections.push({
|
|
109
|
+
framework: 'react',
|
|
110
|
+
confidence: deps['next'] ? 0.7 : 0.9, // Lower if Next.js is present
|
|
111
|
+
evidence: ['react package in dependencies'],
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Express detection
|
|
115
|
+
if (deps['express']) {
|
|
116
|
+
detections.push({
|
|
117
|
+
framework: 'express',
|
|
118
|
+
confidence: 0.9,
|
|
119
|
+
evidence: ['express package in dependencies'],
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// TypeScript detection
|
|
123
|
+
if (deps['typescript'] || packageJson.devDependencies?.['typescript']) {
|
|
124
|
+
detections.push({
|
|
125
|
+
framework: 'typescript',
|
|
126
|
+
confidence: 0.95,
|
|
127
|
+
evidence: ['typescript package in dependencies'],
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
// TODO(detector): Add Vue.js detection
|
|
131
|
+
// TODO(detector): Add Svelte detection
|
|
132
|
+
// TODO(detector): Add Angular detection
|
|
133
|
+
return detections;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Detect Python frameworks from requirements.txt
|
|
137
|
+
*/
|
|
138
|
+
function detectFromRequirements(content) {
|
|
139
|
+
const detections = [];
|
|
140
|
+
const lines = content.toLowerCase().split('\n');
|
|
141
|
+
// FastAPI detection
|
|
142
|
+
if (lines.some((line) => line.startsWith('fastapi'))) {
|
|
143
|
+
detections.push({
|
|
144
|
+
framework: 'fastapi',
|
|
145
|
+
confidence: 0.9,
|
|
146
|
+
evidence: ['fastapi in requirements.txt'],
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Django detection
|
|
150
|
+
if (lines.some((line) => line.startsWith('django'))) {
|
|
151
|
+
detections.push({
|
|
152
|
+
framework: 'django',
|
|
153
|
+
confidence: 0.9,
|
|
154
|
+
evidence: ['django in requirements.txt'],
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// Python detection (always present if requirements.txt exists)
|
|
158
|
+
detections.push({
|
|
159
|
+
framework: 'python',
|
|
160
|
+
confidence: 0.95,
|
|
161
|
+
evidence: ['requirements.txt exists'],
|
|
162
|
+
});
|
|
163
|
+
return detections;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Detect Python frameworks from pyproject.toml
|
|
167
|
+
*/
|
|
168
|
+
function detectFromPyproject(content) {
|
|
169
|
+
const detections = [];
|
|
170
|
+
const lowerContent = content.toLowerCase();
|
|
171
|
+
// FastAPI detection
|
|
172
|
+
if (lowerContent.includes('fastapi')) {
|
|
173
|
+
detections.push({
|
|
174
|
+
framework: 'fastapi',
|
|
175
|
+
confidence: 0.9,
|
|
176
|
+
evidence: ['fastapi in pyproject.toml'],
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Django detection
|
|
180
|
+
if (lowerContent.includes('django')) {
|
|
181
|
+
detections.push({
|
|
182
|
+
framework: 'django',
|
|
183
|
+
confidence: 0.9,
|
|
184
|
+
evidence: ['django in pyproject.toml'],
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
// Python detection
|
|
188
|
+
detections.push({
|
|
189
|
+
framework: 'python',
|
|
190
|
+
confidence: 0.95,
|
|
191
|
+
evidence: ['pyproject.toml exists'],
|
|
192
|
+
});
|
|
193
|
+
return detections;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Detect frameworks from file patterns
|
|
197
|
+
*/
|
|
198
|
+
function detectFromFilePatterns(files) {
|
|
199
|
+
const detections = [];
|
|
200
|
+
const paths = files.map((f) => f.relativePath);
|
|
201
|
+
// Next.js detection via file patterns
|
|
202
|
+
if (paths.some((p) => p.startsWith('pages/') || p.startsWith('app/')) &&
|
|
203
|
+
paths.some((p) => p === 'next.config.js' || p === 'next.config.mjs' || p === 'next.config.ts')) {
|
|
204
|
+
detections.push({
|
|
205
|
+
framework: 'nextjs',
|
|
206
|
+
confidence: 0.85,
|
|
207
|
+
evidence: ['Next.js file structure detected (pages/ or app/ with next.config)'],
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// TypeScript detection via tsconfig
|
|
211
|
+
if (paths.some((p) => p === 'tsconfig.json')) {
|
|
212
|
+
detections.push({
|
|
213
|
+
framework: 'typescript',
|
|
214
|
+
confidence: 0.9,
|
|
215
|
+
evidence: ['tsconfig.json found'],
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// JavaScript detection
|
|
219
|
+
const hasJsFiles = files.some((f) => ['.js', '.jsx', '.mjs', '.cjs'].includes(f.extension));
|
|
220
|
+
if (hasJsFiles) {
|
|
221
|
+
detections.push({
|
|
222
|
+
framework: 'javascript',
|
|
223
|
+
confidence: 0.8,
|
|
224
|
+
evidence: ['JavaScript files found'],
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Python detection
|
|
228
|
+
const hasPyFiles = files.some((f) => f.extension === '.py');
|
|
229
|
+
if (hasPyFiles) {
|
|
230
|
+
detections.push({
|
|
231
|
+
framework: 'python',
|
|
232
|
+
confidence: 0.85,
|
|
233
|
+
evidence: ['Python files found'],
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
return detections;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Merge duplicate framework detections, keeping highest confidence
|
|
240
|
+
*/
|
|
241
|
+
function mergeDetections(detections) {
|
|
242
|
+
const byFramework = new Map();
|
|
243
|
+
for (const detection of detections) {
|
|
244
|
+
const existing = byFramework.get(detection.framework);
|
|
245
|
+
if (!existing || detection.confidence > existing.confidence) {
|
|
246
|
+
byFramework.set(detection.framework, {
|
|
247
|
+
...detection,
|
|
248
|
+
evidence: existing
|
|
249
|
+
? [...existing.evidence, ...detection.evidence]
|
|
250
|
+
: detection.evidence,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else if (existing) {
|
|
254
|
+
// Merge evidence
|
|
255
|
+
existing.evidence.push(...detection.evidence);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return Array.from(byFramework.values());
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Map file extension to language name
|
|
262
|
+
*/
|
|
263
|
+
function extensionToLanguage(ext) {
|
|
264
|
+
const map = {
|
|
265
|
+
'.ts': 'TypeScript',
|
|
266
|
+
'.tsx': 'TypeScript',
|
|
267
|
+
'.js': 'JavaScript',
|
|
268
|
+
'.jsx': 'JavaScript',
|
|
269
|
+
'.mjs': 'JavaScript',
|
|
270
|
+
'.cjs': 'JavaScript',
|
|
271
|
+
'.py': 'Python',
|
|
272
|
+
'.json': 'JSON',
|
|
273
|
+
'.md': 'Markdown',
|
|
274
|
+
'.css': 'CSS',
|
|
275
|
+
'.scss': 'SCSS',
|
|
276
|
+
'.html': 'HTML',
|
|
277
|
+
'.yaml': 'YAML',
|
|
278
|
+
'.yml': 'YAML',
|
|
279
|
+
};
|
|
280
|
+
return map[ext] || null;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Try to read and parse a JSON file
|
|
284
|
+
*/
|
|
285
|
+
async function tryReadJson(filePath) {
|
|
286
|
+
try {
|
|
287
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
288
|
+
return JSON.parse(content);
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check if a file exists
|
|
296
|
+
*/
|
|
297
|
+
async function fileExists(filePath) {
|
|
298
|
+
try {
|
|
299
|
+
await fs.promises.access(filePath);
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/detector/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcH,4CAuDC;AAnED,4CAA8B;AAC9B,gDAAkC;AAQlC;;GAEG;AACI,KAAK,UAAU,gBAAgB,CACpC,KAAiB,EACjB,QAAgB;IAEhB,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,iDAAiD;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC;IAEvD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACzD,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IACpC,CAAC;IAED,qEAAqE;IACrE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,MAAM,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACzD,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACvC,CAAC;IAED,4BAA4B;IAC5B,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACxD,UAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAEtC,yDAAyD;IACzD,MAAM,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAErD,kCAAkC;IAClC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAE7D,OAAO;QACL,UAAU,EAAE,gBAAgB;QAC5B,OAAO,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAC3E,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,WAAwB;IACrD,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG;QACX,GAAG,WAAW,CAAC,YAAY;QAC3B,GAAG,WAAW,CAAC,eAAe;KAC/B,CAAC;IAEF,oBAAoB;IACpB,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,CAAC,8BAA8B,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,OAAO;YAClB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,8BAA8B;YACpE,QAAQ,EAAE,CAAC,+BAA+B,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,iCAAiC,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;QACtE,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,CAAC,oCAAoC,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,uCAAuC;IACvC,uCAAuC;IACvC,wCAAwC;IAExC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhD,oBAAoB;IACpB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACrD,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,6BAA6B,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACpD,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,4BAA4B,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,UAAU,CAAC,IAAI,CAAC;QACd,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,CAAC,yBAAyB,CAAC;KACtC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,oBAAoB;IACpB,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,2BAA2B,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,0BAA0B,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,UAAU,CAAC,IAAI,CAAC;QACd,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,CAAC,uBAAuB,CAAC;KACpC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,KAAiB;IAC/C,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAE/C,sCAAsC;IACtC,IACE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,gBAAgB,IAAI,CAAC,KAAK,iBAAiB,IAAI,CAAC,KAAK,gBAAgB,CAAC,EAC9F,CAAC;QACD,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,CAAC,mEAAmE,CAAC;SAChF,CAAC,CAAC;IACL,CAAC;IAED,oCAAoC;IACpC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,EAAE,CAAC;QAC7C,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,qBAAqB,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAClC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CACtD,CAAC;IACF,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,wBAAwB,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;IAC5D,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,CAAC,oBAAoB,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,UAAgC;IACvD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiC,CAAC;IAE7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5D,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE;gBACnC,GAAG,SAAS;gBACZ,QAAQ,EAAE,QAAQ;oBAChB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC;oBAC/C,CAAC,CAAC,SAAS,CAAC,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,iBAAiB;YACjB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,MAAM,GAAG,GAA2B;QAClC,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,MAAM;KACf,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON report formatter
|
|
3
|
+
*/
|
|
4
|
+
import type { ReviewReport } from '../../../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Format a report as JSON string
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatJson(report: ReviewReport, pretty?: boolean): string;
|
|
9
|
+
/**
|
|
10
|
+
* Parse a JSON report string back to a ReviewReport object
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseJsonReport(json: string): ReviewReport;
|
|
13
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../../src/core/reporter/formats/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,OAAc,GAAG,MAAM,CAK/E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAE1D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JSON report formatter
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.formatJson = formatJson;
|
|
7
|
+
exports.parseJsonReport = parseJsonReport;
|
|
8
|
+
/**
|
|
9
|
+
* Format a report as JSON string
|
|
10
|
+
*/
|
|
11
|
+
function formatJson(report, pretty = true) {
|
|
12
|
+
if (pretty) {
|
|
13
|
+
return JSON.stringify(report, null, 2);
|
|
14
|
+
}
|
|
15
|
+
return JSON.stringify(report);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse a JSON report string back to a ReviewReport object
|
|
19
|
+
*/
|
|
20
|
+
function parseJsonReport(json) {
|
|
21
|
+
return JSON.parse(json);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../../src/core/reporter/formats/json.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAOH,gCAKC;AAKD,0CAEC;AAfD;;GAEG;AACH,SAAgB,UAAU,CAAC,MAAoB,EAAE,SAAkB,IAAI;IACrE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report generation module
|
|
3
|
+
* Transforms analysis results into structured output
|
|
4
|
+
*/
|
|
5
|
+
import type { AnalysisResult, DetectionResult, ReportFormat, ReviewReport } from '../../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate a review report from analysis results
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateReport(rootPath: string, filesAnalyzed: number, frameworks: DetectionResult, analyzerResults: AnalysisResult[]): ReviewReport;
|
|
10
|
+
/**
|
|
11
|
+
* Format a report to a specific output format
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatReport(report: ReviewReport, format: ReportFormat): string;
|
|
14
|
+
export { formatJson, parseJsonReport } from './formats/json.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/reporter/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,YAAY,EAEZ,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,eAAe,EAC3B,eAAe,EAAE,cAAc,EAAE,GAChC,YAAY,CAsBd;AAkED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,MAAM,CAgBR;AAiFD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Report generation module
|
|
4
|
+
* Transforms analysis results into structured output
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.parseJsonReport = exports.formatJson = void 0;
|
|
8
|
+
exports.generateReport = generateReport;
|
|
9
|
+
exports.formatReport = formatReport;
|
|
10
|
+
const json_js_1 = require("./formats/json.js");
|
|
11
|
+
/** Current report version */
|
|
12
|
+
const REPORT_VERSION = '1.0.0';
|
|
13
|
+
/**
|
|
14
|
+
* Generate a review report from analysis results
|
|
15
|
+
*/
|
|
16
|
+
function generateReport(rootPath, filesAnalyzed, frameworks, analyzerResults) {
|
|
17
|
+
// Collect all findings from all analyzers
|
|
18
|
+
const allFindings = [];
|
|
19
|
+
for (const result of analyzerResults) {
|
|
20
|
+
allFindings.push(...result.findings);
|
|
21
|
+
}
|
|
22
|
+
// Generate summary
|
|
23
|
+
const summary = generateSummary(allFindings, analyzerResults);
|
|
24
|
+
return {
|
|
25
|
+
version: REPORT_VERSION,
|
|
26
|
+
timestamp: new Date().toISOString(),
|
|
27
|
+
repository: {
|
|
28
|
+
path: rootPath,
|
|
29
|
+
filesAnalyzed,
|
|
30
|
+
},
|
|
31
|
+
frameworks,
|
|
32
|
+
summary,
|
|
33
|
+
findings: allFindings,
|
|
34
|
+
analyzerResults,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate summary statistics from findings
|
|
39
|
+
*/
|
|
40
|
+
function generateSummary(findings, analyzerResults) {
|
|
41
|
+
// Count by severity
|
|
42
|
+
const bySeverity = {
|
|
43
|
+
error: 0,
|
|
44
|
+
warning: 0,
|
|
45
|
+
info: 0,
|
|
46
|
+
hint: 0,
|
|
47
|
+
};
|
|
48
|
+
for (const finding of findings) {
|
|
49
|
+
bySeverity[finding.severity]++;
|
|
50
|
+
}
|
|
51
|
+
// Count by analyzer
|
|
52
|
+
const byAnalyzer = {};
|
|
53
|
+
for (const result of analyzerResults) {
|
|
54
|
+
byAnalyzer[result.analyzerName] = result.findings.length;
|
|
55
|
+
}
|
|
56
|
+
// Calculate health score (simple algorithm)
|
|
57
|
+
const healthScore = calculateHealthScore(findings);
|
|
58
|
+
return {
|
|
59
|
+
totalFindings: findings.length,
|
|
60
|
+
bySeverity,
|
|
61
|
+
byAnalyzer,
|
|
62
|
+
healthScore,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Calculate a health score from 0-100
|
|
67
|
+
* Higher score = healthier codebase
|
|
68
|
+
*/
|
|
69
|
+
function calculateHealthScore(findings) {
|
|
70
|
+
if (findings.length === 0) {
|
|
71
|
+
return 100;
|
|
72
|
+
}
|
|
73
|
+
// Weight by severity
|
|
74
|
+
const weights = {
|
|
75
|
+
error: 10,
|
|
76
|
+
warning: 5,
|
|
77
|
+
info: 2,
|
|
78
|
+
hint: 1,
|
|
79
|
+
};
|
|
80
|
+
let totalWeight = 0;
|
|
81
|
+
for (const finding of findings) {
|
|
82
|
+
totalWeight += weights[finding.severity];
|
|
83
|
+
}
|
|
84
|
+
// Score decreases with more/worse findings
|
|
85
|
+
// Max penalty is 100 points
|
|
86
|
+
const penalty = Math.min(totalWeight, 100);
|
|
87
|
+
return Math.max(0, 100 - penalty);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format a report to a specific output format
|
|
91
|
+
*/
|
|
92
|
+
function formatReport(report, format) {
|
|
93
|
+
switch (format) {
|
|
94
|
+
case 'json':
|
|
95
|
+
return (0, json_js_1.formatJson)(report);
|
|
96
|
+
case 'markdown':
|
|
97
|
+
// TODO(feature): Implement Markdown formatter
|
|
98
|
+
return formatMarkdownPlaceholder(report);
|
|
99
|
+
case 'html':
|
|
100
|
+
// TODO(feature): Implement HTML formatter
|
|
101
|
+
return formatHtmlPlaceholder(report);
|
|
102
|
+
default:
|
|
103
|
+
return (0, json_js_1.formatJson)(report);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Placeholder Markdown formatter
|
|
108
|
+
*/
|
|
109
|
+
function formatMarkdownPlaceholder(report) {
|
|
110
|
+
const lines = [
|
|
111
|
+
'# Code Review Report',
|
|
112
|
+
'',
|
|
113
|
+
`**Generated:** ${report.timestamp}`,
|
|
114
|
+
`**Repository:** ${report.repository.path}`,
|
|
115
|
+
`**Files Analyzed:** ${report.repository.filesAnalyzed}`,
|
|
116
|
+
'',
|
|
117
|
+
'## Summary',
|
|
118
|
+
'',
|
|
119
|
+
`- **Health Score:** ${report.summary.healthScore}/100`,
|
|
120
|
+
`- **Total Findings:** ${report.summary.totalFindings}`,
|
|
121
|
+
` - Errors: ${report.summary.bySeverity.error}`,
|
|
122
|
+
` - Warnings: ${report.summary.bySeverity.warning}`,
|
|
123
|
+
` - Info: ${report.summary.bySeverity.info}`,
|
|
124
|
+
` - Hints: ${report.summary.bySeverity.hint}`,
|
|
125
|
+
'',
|
|
126
|
+
'## Frameworks Detected',
|
|
127
|
+
'',
|
|
128
|
+
];
|
|
129
|
+
for (const fw of report.frameworks.frameworks) {
|
|
130
|
+
lines.push(`- **${fw.framework}** (${Math.round(fw.confidence * 100)}% confidence)`);
|
|
131
|
+
}
|
|
132
|
+
if (report.findings.length > 0) {
|
|
133
|
+
lines.push('', '## Findings', '');
|
|
134
|
+
for (const finding of report.findings) {
|
|
135
|
+
lines.push(`### ${finding.severity.toUpperCase()}: ${finding.ruleId}`);
|
|
136
|
+
lines.push(`- **File:** ${finding.file}${finding.line ? `:${finding.line}` : ''}`);
|
|
137
|
+
lines.push(`- **Message:** ${finding.message}`);
|
|
138
|
+
lines.push('');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return lines.join('\n');
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Placeholder HTML formatter
|
|
145
|
+
*/
|
|
146
|
+
function formatHtmlPlaceholder(report) {
|
|
147
|
+
// TODO(feature): Implement proper HTML template
|
|
148
|
+
return `<!DOCTYPE html>
|
|
149
|
+
<html>
|
|
150
|
+
<head>
|
|
151
|
+
<title>Code Review Report</title>
|
|
152
|
+
<style>
|
|
153
|
+
body { font-family: system-ui, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
|
|
154
|
+
.score { font-size: 2em; font-weight: bold; }
|
|
155
|
+
.error { color: red; }
|
|
156
|
+
.warning { color: orange; }
|
|
157
|
+
.info { color: blue; }
|
|
158
|
+
.hint { color: gray; }
|
|
159
|
+
</style>
|
|
160
|
+
</head>
|
|
161
|
+
<body>
|
|
162
|
+
<h1>Code Review Report</h1>
|
|
163
|
+
<p>Generated: ${report.timestamp}</p>
|
|
164
|
+
<p>Repository: ${report.repository.path}</p>
|
|
165
|
+
<p class="score">Health Score: ${report.summary.healthScore}/100</p>
|
|
166
|
+
<h2>Summary</h2>
|
|
167
|
+
<ul>
|
|
168
|
+
<li>Total Findings: ${report.summary.totalFindings}</li>
|
|
169
|
+
<li class="error">Errors: ${report.summary.bySeverity.error}</li>
|
|
170
|
+
<li class="warning">Warnings: ${report.summary.bySeverity.warning}</li>
|
|
171
|
+
<li class="info">Info: ${report.summary.bySeverity.info}</li>
|
|
172
|
+
<li class="hint">Hints: ${report.summary.bySeverity.hint}</li>
|
|
173
|
+
</ul>
|
|
174
|
+
<h2>Findings</h2>
|
|
175
|
+
<pre>${JSON.stringify(report.findings, null, 2)}</pre>
|
|
176
|
+
</body>
|
|
177
|
+
</html>`;
|
|
178
|
+
}
|
|
179
|
+
// Re-export formatters
|
|
180
|
+
var json_js_2 = require("./formats/json.js");
|
|
181
|
+
Object.defineProperty(exports, "formatJson", { enumerable: true, get: function () { return json_js_2.formatJson; } });
|
|
182
|
+
Object.defineProperty(exports, "parseJsonReport", { enumerable: true, get: function () { return json_js_2.parseJsonReport; } });
|
|
183
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/reporter/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmBH,wCA2BC;AAqED,oCAmBC;AA3HD,+CAA+C;AAE/C,6BAA6B;AAC7B,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B;;GAEG;AACH,SAAgB,cAAc,CAC5B,QAAgB,EAChB,aAAqB,EACrB,UAA2B,EAC3B,eAAiC;IAEjC,0CAA0C;IAC1C,MAAM,WAAW,GAAc,EAAE,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,mBAAmB;IACnB,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAE9D,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,aAAa;SACd;QACD,UAAU;QACV,OAAO;QACP,QAAQ,EAAE,WAAW;QACrB,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,QAAmB,EACnB,eAAiC;IAEjC,oBAAoB;IACpB,MAAM,UAAU,GAA6B;QAC3C,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;KACR,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjC,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,4CAA4C;IAC5C,MAAM,WAAW,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAEnD,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,UAAU;QACV,UAAU;QACV,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,QAAmB;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAA6B;QACxC,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;KACR,CAAC;IAEF,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,2CAA2C;IAC3C,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,MAAoB,EACpB,MAAoB;IAEpB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC;QAE5B,KAAK,UAAU;YACb,8CAA8C;YAC9C,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAE3C,KAAK,MAAM;YACT,0CAA0C;YAC1C,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAEvC;YACE,OAAO,IAAA,oBAAU,EAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAAC,MAAoB;IACrD,MAAM,KAAK,GAAa;QACtB,sBAAsB;QACtB,EAAE;QACF,kBAAkB,MAAM,CAAC,SAAS,EAAE;QACpC,mBAAmB,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;QAC3C,uBAAuB,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE;QACxD,EAAE;QACF,YAAY;QACZ,EAAE;QACF,uBAAuB,MAAM,CAAC,OAAO,CAAC,WAAW,MAAM;QACvD,yBAAyB,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE;QACvD,eAAe,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE;QAChD,iBAAiB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;QACpD,aAAa,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;QAC7C,cAAc,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE;QAC9C,EAAE;QACF,wBAAwB;QACxB,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnF,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAoB;IACjD,gDAAgD;IAChD,OAAO;;;;;;;;;;;;;;;kBAeS,MAAM,CAAC,SAAS;mBACf,MAAM,CAAC,UAAU,CAAC,IAAI;mCACN,MAAM,CAAC,OAAO,CAAC,WAAW;;;0BAGnC,MAAM,CAAC,OAAO,CAAC,aAAa;gCACtB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK;oCAC3B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO;6BACxC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;8BAC7B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;;;SAGnD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;;QAEzC,CAAC;AACT,CAAC;AAED,uBAAuB;AACvB,6CAAgE;AAAvD,qGAAA,UAAU,OAAA;AAAE,0GAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ignore rules handling for repository scanning
|
|
3
|
+
* Parses .gitignore files and custom ignore patterns
|
|
4
|
+
*/
|
|
5
|
+
export interface IgnoreRules {
|
|
6
|
+
patterns: string[];
|
|
7
|
+
isIgnored: (filePath: string) => boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Load ignore rules from .gitignore and combine with custom patterns
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadIgnoreRules(rootPath: string, customPatterns?: string[]): Promise<IgnoreRules>;
|
|
13
|
+
//# sourceMappingURL=ignore-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore-rules.d.ts","sourceRoot":"","sources":["../../../src/core/scanner/ignore-rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1C;AAsBD;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,MAAM,EAAO,GAC5B,OAAO,CAAC,WAAW,CAAC,CAoBtB"}
|