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,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":"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"}
@@ -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":"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"}
@@ -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"}