@npm7381/agent-code-review 1.0.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 +75 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +316 -0
- package/dist/index.js.map +1 -0
- package/dist/src/aiClient.d.ts +38 -0
- package/dist/src/aiClient.d.ts.map +1 -0
- package/dist/src/aiClient.js +180 -0
- package/dist/src/aiClient.js.map +1 -0
- package/dist/src/cache.d.ts +7 -0
- package/dist/src/cache.d.ts.map +1 -0
- package/dist/src/cache.js +50 -0
- package/dist/src/cache.js.map +1 -0
- package/dist/src/configLoader.d.ts +14 -0
- package/dist/src/configLoader.d.ts.map +1 -0
- package/dist/src/configLoader.js +26 -0
- package/dist/src/configLoader.js.map +1 -0
- package/dist/src/fileProcessor.d.ts +5 -0
- package/dist/src/fileProcessor.d.ts.map +1 -0
- package/dist/src/fileProcessor.js +78 -0
- package/dist/src/fileProcessor.js.map +1 -0
- package/dist/src/htmlFormatter.d.ts +12 -0
- package/dist/src/htmlFormatter.d.ts.map +1 -0
- package/dist/src/htmlFormatter.js +97 -0
- package/dist/src/htmlFormatter.js.map +1 -0
- package/dist/src/pdfFormatter.d.ts +11 -0
- package/dist/src/pdfFormatter.d.ts.map +1 -0
- package/dist/src/pdfFormatter.js +46 -0
- package/dist/src/pdfFormatter.js.map +1 -0
- package/dist/src/prompts.d.ts +3 -0
- package/dist/src/prompts.d.ts.map +1 -0
- package/dist/src/prompts.js +134 -0
- package/dist/src/prompts.js.map +1 -0
- package/dist/src/providerDetector.d.ts +20 -0
- package/dist/src/providerDetector.d.ts.map +1 -0
- package/dist/src/providerDetector.js +145 -0
- package/dist/src/providerDetector.js.map +1 -0
- package/dist/src/reviewGenerator.d.ts +8 -0
- package/dist/src/reviewGenerator.d.ts.map +1 -0
- package/dist/src/reviewGenerator.js +80 -0
- package/dist/src/reviewGenerator.js.map +1 -0
- package/dist/src/types.d.ts +34 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/aiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CacheStore } from './types.js';
|
|
2
|
+
export declare function loadCache(projectRoot: string): CacheStore;
|
|
3
|
+
export declare function saveCache(projectRoot: string, cache: CacheStore): void;
|
|
4
|
+
export declare function computeFileHash(filePath: string): string;
|
|
5
|
+
export declare function isFileCached(filePath: string, cache: CacheStore, currentHash: string): boolean;
|
|
6
|
+
export declare function updateCache(filePath: string, reviewPath: string, hash: string, cache: CacheStore, content?: string): CacheStore;
|
|
7
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAWzD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAQtE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAIT;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,CAQZ"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
const CACHE_FILE = '.review-cache.json';
|
|
5
|
+
function getCachePath(projectRoot) {
|
|
6
|
+
return path.join(projectRoot, CACHE_FILE);
|
|
7
|
+
}
|
|
8
|
+
export function loadCache(projectRoot) {
|
|
9
|
+
const cachePath = getCachePath(projectRoot);
|
|
10
|
+
try {
|
|
11
|
+
if (fs.existsSync(cachePath)) {
|
|
12
|
+
const data = fs.readFileSync(cachePath, 'utf-8');
|
|
13
|
+
return JSON.parse(data);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Corrupted cache, start fresh
|
|
18
|
+
}
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
export function saveCache(projectRoot, cache) {
|
|
22
|
+
const cachePath = getCachePath(projectRoot);
|
|
23
|
+
try {
|
|
24
|
+
fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2), 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const error = err;
|
|
28
|
+
console.warn(`[WARN] Could not save cache: ${error.message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function computeFileHash(filePath) {
|
|
32
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
33
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
34
|
+
}
|
|
35
|
+
export function isFileCached(filePath, cache, currentHash) {
|
|
36
|
+
const entry = cache[filePath];
|
|
37
|
+
if (!entry)
|
|
38
|
+
return false;
|
|
39
|
+
return entry.hash === currentHash;
|
|
40
|
+
}
|
|
41
|
+
export function updateCache(filePath, reviewPath, hash, cache, content) {
|
|
42
|
+
cache[filePath] = {
|
|
43
|
+
hash,
|
|
44
|
+
reviewPath,
|
|
45
|
+
content,
|
|
46
|
+
timestamp: Date.now(),
|
|
47
|
+
};
|
|
48
|
+
return cache;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,SAAS,YAAY,CAAC,WAAmB;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,KAAiB;IAC9D,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAY,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,KAAiB,EACjB,WAAmB;IAEnB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,UAAkB,EAClB,IAAY,EACZ,KAAiB,EACjB,OAAgB;IAEhB,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,IAAI;QACJ,UAAU;QACV,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface RCConfig {
|
|
2
|
+
provider?: string;
|
|
3
|
+
model?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
maxChars?: number;
|
|
6
|
+
extensions?: string[];
|
|
7
|
+
format?: string;
|
|
8
|
+
output?: string;
|
|
9
|
+
dryRun?: boolean;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadConfigFile(projectRoot: string): RCConfig | null;
|
|
13
|
+
export declare function mergeConfig<T>(cliValue: T | undefined, configValue: T | undefined, defaultValue: T): T;
|
|
14
|
+
//# sourceMappingURL=configLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configLoader.d.ts","sourceRoot":"","sources":["../../src/configLoader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAWnE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAItG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const CONFIG_FILE = '.aiconfig.json';
|
|
4
|
+
export function loadConfigFile(projectRoot) {
|
|
5
|
+
const configPath = path.join(projectRoot, CONFIG_FILE);
|
|
6
|
+
try {
|
|
7
|
+
if (!fs.existsSync(configPath))
|
|
8
|
+
return null;
|
|
9
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
10
|
+
const config = JSON.parse(raw);
|
|
11
|
+
if (typeof config !== 'object' || config === null)
|
|
12
|
+
return null;
|
|
13
|
+
return config;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function mergeConfig(cliValue, configValue, defaultValue) {
|
|
20
|
+
if (cliValue !== undefined)
|
|
21
|
+
return cliValue;
|
|
22
|
+
if (configValue !== undefined)
|
|
23
|
+
return configValue;
|
|
24
|
+
return defaultValue;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=configLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../src/configLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAcxB,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;QAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,QAAuB,EAAE,WAA0B,EAAE,YAAe;IACjG,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAClD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FileData } from './types.js';
|
|
2
|
+
export declare function collectFiles(targetPath: string, verbose?: boolean, extensions?: string[]): string[];
|
|
3
|
+
export declare function readFile(filePath: string): FileData | null;
|
|
4
|
+
export declare function shouldSkipContent(content: string): boolean;
|
|
5
|
+
//# sourceMappingURL=fileProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileProcessor.d.ts","sourceRoot":"","sources":["../../src/fileProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAqB1G;AAkCD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAU1D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAK1D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const DEFAULT_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.prisma']);
|
|
4
|
+
const IGNORED_DIRS = new Set([
|
|
5
|
+
'node_modules', '.next', 'dist', 'build', '.git',
|
|
6
|
+
'.cache', 'coverage', '.turbo', '__pycache__',
|
|
7
|
+
]);
|
|
8
|
+
export function collectFiles(targetPath, verbose = false, extensions) {
|
|
9
|
+
const resolvedPath = path.resolve(targetPath);
|
|
10
|
+
const stats = fs.statSync(resolvedPath);
|
|
11
|
+
const validExts = extensions ? new Set(extensions.map(e => e.startsWith('.') ? e : `.${e}`)) : DEFAULT_EXTENSIONS;
|
|
12
|
+
if (stats.isFile()) {
|
|
13
|
+
if (!isValidExtension(resolvedPath, validExts)) {
|
|
14
|
+
console.warn(`[WARN] Skipping unsupported file type: ${resolvedPath}`);
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
if (verbose)
|
|
18
|
+
console.log(`[INFO] Processing single file: ${resolvedPath}`);
|
|
19
|
+
return [resolvedPath];
|
|
20
|
+
}
|
|
21
|
+
if (stats.isDirectory()) {
|
|
22
|
+
if (verbose)
|
|
23
|
+
console.log(`[INFO] Scanning directory: ${resolvedPath}`);
|
|
24
|
+
return collectDirRecursive(resolvedPath, verbose, validExts);
|
|
25
|
+
}
|
|
26
|
+
console.error(`[ERROR] Path is neither file nor directory: ${resolvedPath}`);
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
function collectDirRecursive(dirPath, verbose, validExts) {
|
|
30
|
+
const files = [];
|
|
31
|
+
try {
|
|
32
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
35
|
+
if (entry.isDirectory()) {
|
|
36
|
+
if (IGNORED_DIRS.has(entry.name)) {
|
|
37
|
+
if (verbose)
|
|
38
|
+
console.log(`[INFO] Skipping directory: ${entry.name}`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
files.push(...collectDirRecursive(fullPath, verbose, validExts));
|
|
42
|
+
}
|
|
43
|
+
else if (entry.isFile() && isValidExtension(fullPath, validExts)) {
|
|
44
|
+
files.push(fullPath);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
const error = err;
|
|
50
|
+
console.error(`[ERROR] Cannot read directory ${dirPath}: ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
return files;
|
|
53
|
+
}
|
|
54
|
+
function isValidExtension(filePath, validExts) {
|
|
55
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
56
|
+
return validExts.has(ext);
|
|
57
|
+
}
|
|
58
|
+
export function readFile(filePath) {
|
|
59
|
+
try {
|
|
60
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
61
|
+
const relativePath = path.relative(process.cwd(), filePath);
|
|
62
|
+
return { filePath, relativePath, content };
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const error = err;
|
|
66
|
+
console.error(`[ERROR] Cannot read file ${filePath}: ${error.message}`);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function shouldSkipContent(content) {
|
|
71
|
+
const trimmed = content.trim();
|
|
72
|
+
if (!trimmed)
|
|
73
|
+
return true;
|
|
74
|
+
if (trimmed.startsWith('// @ts-nocheck') && trimmed.length < 50)
|
|
75
|
+
return true;
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=fileProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileProcessor.js","sourceRoot":"","sources":["../../src/fileProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ReviewEntry {
|
|
2
|
+
relativePath: string;
|
|
3
|
+
filePath: string;
|
|
4
|
+
results: {
|
|
5
|
+
severity: string;
|
|
6
|
+
category: string;
|
|
7
|
+
line?: number;
|
|
8
|
+
suggestion: string;
|
|
9
|
+
}[];
|
|
10
|
+
}
|
|
11
|
+
export declare function generateHtmlReport(entries: ReviewEntry[], agentName: string): string;
|
|
12
|
+
//# sourceMappingURL=htmlFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmlFormatter.d.ts","sourceRoot":"","sources":["../../src/htmlFormatter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtF;AAcD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAkFpF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
function severityClass(severity) {
|
|
2
|
+
if (severity === 'critical')
|
|
3
|
+
return 'severity-critical';
|
|
4
|
+
if (severity === 'warning')
|
|
5
|
+
return 'severity-warning';
|
|
6
|
+
return 'severity-info';
|
|
7
|
+
}
|
|
8
|
+
function severityIcon(severity) {
|
|
9
|
+
if (severity === 'critical')
|
|
10
|
+
return '🔴';
|
|
11
|
+
if (severity === 'warning')
|
|
12
|
+
return '🟡';
|
|
13
|
+
return '🟢';
|
|
14
|
+
}
|
|
15
|
+
export function generateHtmlReport(entries, agentName) {
|
|
16
|
+
const allResults = entries.flatMap(e => e.results);
|
|
17
|
+
const critical = allResults.filter(r => r.severity === 'critical');
|
|
18
|
+
const warnings = allResults.filter(r => r.severity === 'warning');
|
|
19
|
+
const info = allResults.filter(r => r.severity === 'info');
|
|
20
|
+
const filesHtml = entries.map(entry => {
|
|
21
|
+
if (entry.results.length === 0)
|
|
22
|
+
return '';
|
|
23
|
+
const resultsHtml = entry.results.map(r => {
|
|
24
|
+
const lineInfo = r.line ? `:${r.line}` : '';
|
|
25
|
+
return `<tr class="${severityClass(r.severity)}">
|
|
26
|
+
<td class="severity-col">${severityIcon(r.severity)} ${r.severity}</td>
|
|
27
|
+
<td>${r.category}${lineInfo}</td>
|
|
28
|
+
<td>${r.suggestion}</td>
|
|
29
|
+
</tr>`;
|
|
30
|
+
}).join('\n');
|
|
31
|
+
return `<div class="file-section">
|
|
32
|
+
<h2>${entry.relativePath}</h2>
|
|
33
|
+
<table>
|
|
34
|
+
<thead><tr><th>Severidad</th><th>Categoría</th><th>Sugerencia</th></tr></thead>
|
|
35
|
+
<tbody>${resultsHtml}</tbody>
|
|
36
|
+
</table>
|
|
37
|
+
</div>`;
|
|
38
|
+
}).join('\n');
|
|
39
|
+
return `<!DOCTYPE html>
|
|
40
|
+
<html lang="es">
|
|
41
|
+
<head>
|
|
42
|
+
<meta charset="UTF-8">
|
|
43
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
44
|
+
<title>${agentName} - Reporte</title>
|
|
45
|
+
<style>
|
|
46
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
47
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: #1a1a2e; background: #f5f6fa; padding: 2rem; }
|
|
48
|
+
.container { max-width: 1100px; margin: 0 auto; }
|
|
49
|
+
header { background: linear-gradient(135deg, #1a1a2e, #16213e); color: #fff; padding: 2rem; border-radius: 12px; margin-bottom: 2rem; }
|
|
50
|
+
header h1 { font-size: 1.8rem; margin-bottom: .5rem; }
|
|
51
|
+
header .meta { color: #a0aec0; font-size: .9rem; }
|
|
52
|
+
.summary { display: flex; gap: 1rem; margin-bottom: 2rem; }
|
|
53
|
+
.summary-card { flex: 1; background: #fff; padding: 1.5rem; border-radius: 10px; box-shadow: 0 2px 8px rgba(0,0,0,.06); text-align: center; }
|
|
54
|
+
.summary-card .count { font-size: 2rem; font-weight: 700; }
|
|
55
|
+
.summary-card .label { font-size: .85rem; color: #718096; margin-top: .25rem; }
|
|
56
|
+
.summary-card.critical { border-top: 4px solid #e53e3e; }
|
|
57
|
+
.summary-card.warning { border-top: 4px solid #d69e2e; }
|
|
58
|
+
.summary-card.info { border-top: 4px solid #38a169; }
|
|
59
|
+
.file-section { background: #fff; border-radius: 10px; box-shadow: 0 2px 8px rgba(0,0,0,.06); padding: 1.5rem; margin-bottom: 1.5rem; }
|
|
60
|
+
.file-section h2 { font-size: 1.1rem; color: #2d3748; margin-bottom: 1rem; padding-bottom: .5rem; border-bottom: 2px solid #edf2f7; }
|
|
61
|
+
table { width: 100%; border-collapse: collapse; }
|
|
62
|
+
th { text-align: left; padding: .75rem .5rem; font-size: .8rem; text-transform: uppercase; color: #718096; border-bottom: 2px solid #edf2f7; }
|
|
63
|
+
td { padding: .75rem .5rem; border-bottom: 1px solid #f7fafc; font-size: .9rem; }
|
|
64
|
+
.severity-col { white-space: nowrap; font-weight: 600; }
|
|
65
|
+
.severity-critical td:first-child { color: #e53e3e; }
|
|
66
|
+
.severity-warning td:first-child { color: #d69e2e; }
|
|
67
|
+
.severity-info td:first-child { color: #38a169; }
|
|
68
|
+
footer { text-align: center; color: #a0aec0; font-size: .8rem; margin-top: 2rem; }
|
|
69
|
+
</style>
|
|
70
|
+
</head>
|
|
71
|
+
<body>
|
|
72
|
+
<div class="container">
|
|
73
|
+
<header>
|
|
74
|
+
<h1>${agentName}</h1>
|
|
75
|
+
<p class="meta">Generado: ${new Date().toLocaleString('es-AR')} • Archivos revisados: ${entries.length}</p>
|
|
76
|
+
</header>
|
|
77
|
+
<div class="summary">
|
|
78
|
+
<div class="summary-card critical">
|
|
79
|
+
<div class="count">${critical.length}</div>
|
|
80
|
+
<div class="label">🔴 Críticos</div>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="summary-card warning">
|
|
83
|
+
<div class="count">${warnings.length}</div>
|
|
84
|
+
<div class="label">🟡 Advertencias</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="summary-card info">
|
|
87
|
+
<div class="count">${info.length}</div>
|
|
88
|
+
<div class="label">🟢 Info</div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
${filesHtml}
|
|
92
|
+
<footer>Generado por ${agentName} • AI Agent Toolkit</footer>
|
|
93
|
+
</div>
|
|
94
|
+
</body>
|
|
95
|
+
</html>`;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=htmlFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmlFormatter.js","sourceRoot":"","sources":["../../src/htmlFormatter.ts"],"names":[],"mappings":"AAMA,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,mBAAmB,CAAC;IACxD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,kBAAkB,CAAC;IACtD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAsB,EAAE,SAAiB;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACpC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,cAAc,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;mCACjB,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ;cAC3D,CAAC,CAAC,QAAQ,GAAG,QAAQ;cACrB,CAAC,CAAC,UAAU;YACd,CAAC;QACT,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;YACC,KAAK,CAAC,YAAY;;;iBAGb,WAAW;;WAEjB,CAAC;IACV,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;WAKE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA8BR,SAAS;kCACa,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,0BAA0B,OAAO,CAAC,MAAM;;;;6BAI/E,QAAQ,CAAC,MAAM;;;;6BAIf,QAAQ,CAAC,MAAM;;;;6BAIf,IAAI,CAAC,MAAM;;;;MAIlC,SAAS;2BACY,SAAS;;;QAG5B,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface PdfEntry {
|
|
2
|
+
relativePath: string;
|
|
3
|
+
results: {
|
|
4
|
+
severity: string;
|
|
5
|
+
category: string;
|
|
6
|
+
line?: number;
|
|
7
|
+
suggestion: string;
|
|
8
|
+
}[];
|
|
9
|
+
}
|
|
10
|
+
export declare function generatePdfReport(entries: PdfEntry[], outputPath: string, agentName: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=pdfFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfFormatter.d.ts","sourceRoot":"","sources":["../../src/pdfFormatter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CjH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import PDFDocument from 'pdfkit';
|
|
2
|
+
export async function generatePdfReport(entries, outputPath, agentName) {
|
|
3
|
+
const doc = new PDFDocument({ margin: 50, size: 'A4' });
|
|
4
|
+
const stream = require('fs').createWriteStream(outputPath);
|
|
5
|
+
doc.pipe(stream);
|
|
6
|
+
const allResults = entries.flatMap(e => e.results);
|
|
7
|
+
const critical = allResults.filter(r => r.severity === 'critical');
|
|
8
|
+
const warnings = allResults.filter(r => r.severity === 'warning');
|
|
9
|
+
const info = allResults.filter(r => r.severity === 'info');
|
|
10
|
+
doc.fontSize(22).font('Helvetica-Bold').text(agentName, { align: 'center' });
|
|
11
|
+
doc.fontSize(12).font('Helvetica').text(`Generado: ${new Date().toLocaleString('es-AR')}`, { align: 'center' });
|
|
12
|
+
doc.moveDown(1.5);
|
|
13
|
+
doc.fontSize(14).font('Helvetica-Bold').text('Resumen');
|
|
14
|
+
doc.moveDown(0.5);
|
|
15
|
+
doc.fontSize(11).font('Helvetica');
|
|
16
|
+
doc.text(`Archivos revisados: ${entries.length}`);
|
|
17
|
+
doc.text(`Críticos: ${critical.length}`);
|
|
18
|
+
doc.text(`Advertencias: ${warnings.length}`);
|
|
19
|
+
doc.text(`Info: ${info.length}`);
|
|
20
|
+
doc.moveDown(1);
|
|
21
|
+
for (const entry of entries) {
|
|
22
|
+
if (entry.results.length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
if (doc.y > 700)
|
|
25
|
+
doc.addPage();
|
|
26
|
+
doc.fontSize(13).font('Helvetica-Bold').text(entry.relativePath);
|
|
27
|
+
doc.moveDown(0.3);
|
|
28
|
+
for (const r of entry.results) {
|
|
29
|
+
if (doc.y > 720)
|
|
30
|
+
doc.addPage();
|
|
31
|
+
const lineInfo = r.line ? `:${r.line}` : '';
|
|
32
|
+
const sevMap = { critical: 'CRIT', warning: 'WARN', info: 'INFO' };
|
|
33
|
+
doc.fontSize(9).font('Helvetica-Bold').fillColor('#333').text(`[${sevMap[r.severity] || 'INFO'}] [${r.category}]${lineInfo}`);
|
|
34
|
+
doc.fontSize(9).font('Helvetica').fillColor('#555').text(r.suggestion, { indent: 12 });
|
|
35
|
+
doc.moveDown(0.3);
|
|
36
|
+
}
|
|
37
|
+
doc.moveDown(0.5);
|
|
38
|
+
}
|
|
39
|
+
doc.fontSize(9).font('Helvetica').fillColor('#999').text(`Generado por ${agentName} • AI Agent Toolkit`, { align: 'center' });
|
|
40
|
+
doc.end();
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
stream.on('finish', resolve);
|
|
43
|
+
stream.on('error', reject);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=pdfFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfFormatter.js","sourceRoot":"","sources":["../../src/pdfFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const SYSTEM_PROMPT = "You are an expert code reviewer. Your task is to analyze source code and provide actionable feedback organized by severity level.\n\n## Categories to analyze:\n- **Bugs**: Potential bugs (null references, type errors, logic errors, race conditions)\n- **Security**: Security vulnerabilities (SQL injection, XSS, secrets hardcodeados, path traversal)\n- **Performance**: Performance issues (unnecessary re-renders, N+1 queries, missing indexes, memory leaks)\n- **Dead Code**: Unused imports, unused variables, unreachable code, commented-out code\n- **TypeScript**: Bad TypeScript practices (any type, missing null checks, loose typing)\n- **Maintainability**: Code complexity, long functions, magic numbers, missing error handling\n- **Refactoring**: Suggestions for cleaner code structure, extract functions, simplify logic\n\n## Severity levels:\n- \uD83D\uDD34 **critical**: Bugs that will cause errors, security vulnerabilities, data loss risks\n- \uD83D\uDFE1 **warning**: Code smells, performance issues, potential bugs in edge cases\n- \uD83D\uDFE2 **info**: Style suggestions, minor improvements, best practices\n\n## Response format:\nReturn ONLY a JSON array of review findings. Each finding must have:\n- \"severity\": \"critical\" | \"warning\" | \"info\"\n- \"category\": one of the categories above\n- \"line\": line number (number) or null if file-level\n- \"suggestion\": clear, actionable description of the issue and how to fix it\n\nExample:\n[\n {\"severity\": \"warning\", \"category\": \"Security\", \"line\": 15, \"suggestion\": \"Use parameterized queries instead of string concatenation to prevent SQL injection\"},\n {\"severity\": \"info\", \"category\": \"TypeScript\", \"line\": 8, \"suggestion\": \"Replace 'any' type with specific type for better type safety\"}\n]\n\nReturn ONLY the JSON array. No extra text, no markdown code blocks.";
|
|
2
|
+
export declare const getFileTypePrompt: (filePath: string, content: string) => string;
|
|
3
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/prompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,k1DA6B0C,CAAC;AAErE,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,KAAG,MAiGrE,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
export const SYSTEM_PROMPT = `You are an expert code reviewer. Your task is to analyze source code and provide actionable feedback organized by severity level.
|
|
2
|
+
|
|
3
|
+
## Categories to analyze:
|
|
4
|
+
- **Bugs**: Potential bugs (null references, type errors, logic errors, race conditions)
|
|
5
|
+
- **Security**: Security vulnerabilities (SQL injection, XSS, secrets hardcodeados, path traversal)
|
|
6
|
+
- **Performance**: Performance issues (unnecessary re-renders, N+1 queries, missing indexes, memory leaks)
|
|
7
|
+
- **Dead Code**: Unused imports, unused variables, unreachable code, commented-out code
|
|
8
|
+
- **TypeScript**: Bad TypeScript practices (any type, missing null checks, loose typing)
|
|
9
|
+
- **Maintainability**: Code complexity, long functions, magic numbers, missing error handling
|
|
10
|
+
- **Refactoring**: Suggestions for cleaner code structure, extract functions, simplify logic
|
|
11
|
+
|
|
12
|
+
## Severity levels:
|
|
13
|
+
- 🔴 **critical**: Bugs that will cause errors, security vulnerabilities, data loss risks
|
|
14
|
+
- 🟡 **warning**: Code smells, performance issues, potential bugs in edge cases
|
|
15
|
+
- 🟢 **info**: Style suggestions, minor improvements, best practices
|
|
16
|
+
|
|
17
|
+
## Response format:
|
|
18
|
+
Return ONLY a JSON array of review findings. Each finding must have:
|
|
19
|
+
- "severity": "critical" | "warning" | "info"
|
|
20
|
+
- "category": one of the categories above
|
|
21
|
+
- "line": line number (number) or null if file-level
|
|
22
|
+
- "suggestion": clear, actionable description of the issue and how to fix it
|
|
23
|
+
|
|
24
|
+
Example:
|
|
25
|
+
[
|
|
26
|
+
{"severity": "warning", "category": "Security", "line": 15, "suggestion": "Use parameterized queries instead of string concatenation to prevent SQL injection"},
|
|
27
|
+
{"severity": "info", "category": "TypeScript", "line": 8, "suggestion": "Replace 'any' type with specific type for better type safety"}
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
Return ONLY the JSON array. No extra text, no markdown code blocks.`;
|
|
31
|
+
export const getFileTypePrompt = (filePath, content) => {
|
|
32
|
+
if (content.includes('@prisma/client') || filePath.includes('schema.prisma')) {
|
|
33
|
+
return createPrompt('Prisma Schema', `
|
|
34
|
+
Analyze this Prisma schema for:
|
|
35
|
+
- Missing indexes on frequently queried fields
|
|
36
|
+
- Inefficient relation definitions
|
|
37
|
+
- Missing @unique constraints where needed
|
|
38
|
+
- Field type mismatches with expected data`);
|
|
39
|
+
}
|
|
40
|
+
if (content.includes('export const') && (content.includes('z.object') || content.includes('z.string'))) {
|
|
41
|
+
return createPrompt('Zod Validation Schema', `
|
|
42
|
+
Analyze this Zod schema for:
|
|
43
|
+
- Missing validation rules (min, max, regex)
|
|
44
|
+
- Overly permissive validation
|
|
45
|
+
- Missing error messages for user-facing validation
|
|
46
|
+
- Type inference issues`);
|
|
47
|
+
}
|
|
48
|
+
if (content.includes('@tanstack/react-query') || content.includes('useQuery') || content.includes('useMutation')) {
|
|
49
|
+
return createPrompt('React Query Hook', `
|
|
50
|
+
Analyze this React Query code for:
|
|
51
|
+
- Missing error handling
|
|
52
|
+
- Cache invalidation issues
|
|
53
|
+
- Stale data problems
|
|
54
|
+
- Missing loading states
|
|
55
|
+
- Race conditions in mutations`);
|
|
56
|
+
}
|
|
57
|
+
if (content.includes('React.createContext') || content.includes('createContext') || content.includes('.Provider')) {
|
|
58
|
+
return createPrompt('React Context Provider', `
|
|
59
|
+
Analyze this React Context for:
|
|
60
|
+
- Unnecessary re-renders
|
|
61
|
+
- Missing memoization
|
|
62
|
+
- Context value stability
|
|
63
|
+
- Missing error boundaries`);
|
|
64
|
+
}
|
|
65
|
+
if (content.includes('React.FC') || content.includes('(): JSX') || (content.includes('=> {') && content.includes('<') && content.includes('/>'))) {
|
|
66
|
+
return createPrompt('React Component', `
|
|
67
|
+
Analyze this React component for:
|
|
68
|
+
- Missing key props in lists
|
|
69
|
+
- Unnecessary re-renders
|
|
70
|
+
- Missing error boundaries
|
|
71
|
+
- Inline function definitions in JSX
|
|
72
|
+
- Missing TypeScript types for props
|
|
73
|
+
- Direct DOM manipulation`);
|
|
74
|
+
}
|
|
75
|
+
if (content.includes('Request, Response') || content.includes('express.Router') || content.includes('RequestHandler')) {
|
|
76
|
+
return createPrompt('Express Route / Controller', `
|
|
77
|
+
Analyze this Express route for:
|
|
78
|
+
- Missing input validation
|
|
79
|
+
- SQL/NoSQL injection vulnerabilities
|
|
80
|
+
- Missing authentication/authorization checks
|
|
81
|
+
- Unhandled promise rejections
|
|
82
|
+
- Missing rate limiting
|
|
83
|
+
- Exposed sensitive data in responses`);
|
|
84
|
+
}
|
|
85
|
+
if (content.includes('export function') || content.includes('export const') || content.includes('export async function')) {
|
|
86
|
+
return createPrompt('Utility / Service Module', `
|
|
87
|
+
Analyze this utility module for:
|
|
88
|
+
- Missing error handling
|
|
89
|
+
- Potential null/undefined references
|
|
90
|
+
- Inefficient algorithms
|
|
91
|
+
- Missing input validation
|
|
92
|
+
- Side effects in pure functions`);
|
|
93
|
+
}
|
|
94
|
+
if (content.includes('interface ') || content.includes('type ') || filePath.includes('types/')) {
|
|
95
|
+
return createPrompt('TypeScript Types', `
|
|
96
|
+
Analyze these TypeScript types for:
|
|
97
|
+
- Overuse of 'any' type
|
|
98
|
+
- Missing optional markers
|
|
99
|
+
- Inconsistent naming conventions
|
|
100
|
+
- Missing JSDoc documentation
|
|
101
|
+
- Loose union types`);
|
|
102
|
+
}
|
|
103
|
+
if (content.includes('socket.io') || content.includes('io(') || content.includes('Server as SocketIOServer')) {
|
|
104
|
+
return createPrompt('Socket.IO Handler', `
|
|
105
|
+
Analyze this Socket.IO code for:
|
|
106
|
+
- Missing authentication on connections
|
|
107
|
+
- Missing input validation on events
|
|
108
|
+
- Memory leaks from uncleaned listeners
|
|
109
|
+
- Missing rate limiting
|
|
110
|
+
- Room management issues`);
|
|
111
|
+
}
|
|
112
|
+
return createPrompt('Generic Module', `
|
|
113
|
+
Analyze this module for:
|
|
114
|
+
- Missing error handling
|
|
115
|
+
- Potential bugs
|
|
116
|
+
- Code quality issues
|
|
117
|
+
- Performance concerns
|
|
118
|
+
- Security vulnerabilities`);
|
|
119
|
+
};
|
|
120
|
+
function createPrompt(fileType, specificInstructions) {
|
|
121
|
+
return `${SYSTEM_PROMPT}
|
|
122
|
+
|
|
123
|
+
## File Type: ${fileType}
|
|
124
|
+
|
|
125
|
+
${specificInstructions}
|
|
126
|
+
|
|
127
|
+
## Code to review:
|
|
128
|
+
\`\`\`
|
|
129
|
+
{CODE}
|
|
130
|
+
\`\`\`
|
|
131
|
+
|
|
132
|
+
Return ONLY the JSON array of review findings. No extra text.`;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ProviderConfig {
|
|
2
|
+
provider: string;
|
|
3
|
+
model: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
autoDetected: boolean;
|
|
6
|
+
detectedAt: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DetectOptions {
|
|
9
|
+
env?: Record<string, string | undefined>;
|
|
10
|
+
ollamaBaseUrl?: string;
|
|
11
|
+
projectRoot?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function detectProvider(options?: DetectOptions): Promise<ProviderConfig | null>;
|
|
14
|
+
export declare function detectOllama(baseUrl?: string): Promise<string[] | null>;
|
|
15
|
+
export declare function loadConfig(projectRoot: string): ProviderConfig | null;
|
|
16
|
+
export declare function saveConfig(projectRoot: string, config: ProviderConfig): void;
|
|
17
|
+
export declare function getDefaultModel(provider: string): string;
|
|
18
|
+
export declare function getAvailableProviders(env?: Record<string, string | undefined>): string[];
|
|
19
|
+
export declare function printDetectionResult(config: ProviderConfig | null, verbose?: boolean): void;
|
|
20
|
+
//# sourceMappingURL=providerDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerDetector.d.ts","sourceRoot":"","sources":["../../src/providerDetector.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAcD,wBAAsB,cAAc,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAyDhG;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,MAA2B,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAWjG;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAWrE;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAG5E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAYxF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI,CA8BlG"}
|