@kevinrabun/judges 3.62.0 → 3.64.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/CHANGELOG.md +14 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-approve.d.ts +5 -0
- package/dist/commands/auto-approve.d.ts.map +1 -0
- package/dist/commands/auto-approve.js +189 -0
- package/dist/commands/auto-approve.js.map +1 -0
- package/dist/commands/diff-explain.d.ts +5 -0
- package/dist/commands/diff-explain.d.ts.map +1 -0
- package/dist/commands/diff-explain.js +143 -0
- package/dist/commands/diff-explain.js.map +1 -0
- package/dist/commands/finding-group.d.ts +16 -0
- package/dist/commands/finding-group.d.ts.map +1 -0
- package/dist/commands/finding-group.js +165 -0
- package/dist/commands/finding-group.js.map +1 -0
- package/dist/commands/fix-suggest.d.ts +5 -0
- package/dist/commands/fix-suggest.d.ts.map +1 -0
- package/dist/commands/fix-suggest.js +172 -0
- package/dist/commands/fix-suggest.js.map +1 -0
- package/dist/commands/ignore-list.d.ts +19 -0
- package/dist/commands/ignore-list.d.ts.map +1 -0
- package/dist/commands/ignore-list.js +166 -0
- package/dist/commands/ignore-list.js.map +1 -0
- package/dist/commands/incremental-review.d.ts +5 -0
- package/dist/commands/incremental-review.d.ts.map +1 -0
- package/dist/commands/incremental-review.js +240 -0
- package/dist/commands/incremental-review.js.map +1 -0
- package/dist/commands/multi-lang-review.d.ts +5 -0
- package/dist/commands/multi-lang-review.d.ts.map +1 -0
- package/dist/commands/multi-lang-review.js +231 -0
- package/dist/commands/multi-lang-review.js.map +1 -0
- package/dist/commands/review-cache.d.ts +23 -0
- package/dist/commands/review-cache.d.ts.map +1 -0
- package/dist/commands/review-cache.js +135 -0
- package/dist/commands/review-cache.js.map +1 -0
- package/dist/commands/review-log.d.ts +23 -0
- package/dist/commands/review-log.d.ts.map +1 -0
- package/dist/commands/review-log.js +165 -0
- package/dist/commands/review-log.js.map +1 -0
- package/dist/commands/review-priority.d.ts +5 -0
- package/dist/commands/review-priority.d.ts.map +1 -0
- package/dist/commands/review-priority.js +158 -0
- package/dist/commands/review-priority.js.map +1 -0
- package/dist/commands/review-profile.d.ts +5 -0
- package/dist/commands/review-profile.d.ts.map +1 -0
- package/dist/commands/review-profile.js +169 -0
- package/dist/commands/review-profile.js.map +1 -0
- package/dist/commands/review-stats.d.ts +5 -0
- package/dist/commands/review-stats.d.ts.map +1 -0
- package/dist/commands/review-stats.js +176 -0
- package/dist/commands/review-stats.js.map +1 -0
- package/dist/commands/review-summary.d.ts +5 -0
- package/dist/commands/review-summary.d.ts.map +1 -0
- package/dist/commands/review-summary.js +175 -0
- package/dist/commands/review-summary.js.map +1 -0
- package/dist/commands/review-template.d.ts +5 -0
- package/dist/commands/review-template.d.ts.map +1 -0
- package/dist/commands/review-template.js +213 -0
- package/dist/commands/review-template.js.map +1 -0
- package/dist/commands/rule-test.d.ts +5 -0
- package/dist/commands/rule-test.d.ts.map +1 -0
- package/dist/commands/rule-test.js +216 -0
- package/dist/commands/rule-test.js.map +1 -0
- package/dist/commands/team-config.d.ts +5 -0
- package/dist/commands/team-config.d.ts.map +1 -0
- package/dist/commands/team-config.js +235 -0
- package/dist/commands/team-config.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-lang-review — Cross-language consistency checking.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync, readdirSync, statSync } from "fs";
|
|
5
|
+
import { join, extname } from "path";
|
|
6
|
+
// ─── Language detection ─────────────────────────────────────────────────────
|
|
7
|
+
const EXT_MAP = {
|
|
8
|
+
".ts": "typescript",
|
|
9
|
+
".tsx": "typescript",
|
|
10
|
+
".js": "javascript",
|
|
11
|
+
".jsx": "javascript",
|
|
12
|
+
".py": "python",
|
|
13
|
+
".go": "go",
|
|
14
|
+
".rs": "rust",
|
|
15
|
+
".java": "java",
|
|
16
|
+
".cs": "csharp",
|
|
17
|
+
".cpp": "cpp",
|
|
18
|
+
".c": "c",
|
|
19
|
+
".rb": "ruby",
|
|
20
|
+
".php": "php",
|
|
21
|
+
".swift": "swift",
|
|
22
|
+
".kt": "kotlin",
|
|
23
|
+
".scala": "scala",
|
|
24
|
+
};
|
|
25
|
+
// ─── File collection ────────────────────────────────────────────────────────
|
|
26
|
+
const SKIP_DIRS = new Set([
|
|
27
|
+
"node_modules",
|
|
28
|
+
"dist",
|
|
29
|
+
"build",
|
|
30
|
+
".git",
|
|
31
|
+
"__pycache__",
|
|
32
|
+
"vendor",
|
|
33
|
+
"target",
|
|
34
|
+
".next",
|
|
35
|
+
"coverage",
|
|
36
|
+
]);
|
|
37
|
+
function collectSourceFiles(dir, maxDepth = 5, depth = 0) {
|
|
38
|
+
if (depth > maxDepth || !existsSync(dir))
|
|
39
|
+
return [];
|
|
40
|
+
const results = [];
|
|
41
|
+
const entries = readdirSync(dir);
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
if (entry.startsWith("."))
|
|
44
|
+
continue;
|
|
45
|
+
const fullPath = join(dir, entry);
|
|
46
|
+
try {
|
|
47
|
+
const st = statSync(fullPath);
|
|
48
|
+
if (st.isDirectory()) {
|
|
49
|
+
if (!SKIP_DIRS.has(entry)) {
|
|
50
|
+
results.push(...collectSourceFiles(fullPath, maxDepth, depth + 1));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const ext = extname(entry).toLowerCase();
|
|
55
|
+
const lang = EXT_MAP[ext];
|
|
56
|
+
if (lang) {
|
|
57
|
+
const content = readFileSync(fullPath, "utf-8");
|
|
58
|
+
results.push({ path: fullPath, language: lang, lineCount: content.split("\n").length });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Skip inaccessible
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return results;
|
|
67
|
+
}
|
|
68
|
+
// ─── Cross-language analysis ────────────────────────────────────────────────
|
|
69
|
+
function analyzeConsistency(files) {
|
|
70
|
+
const issues = [];
|
|
71
|
+
const langGroups = new Map();
|
|
72
|
+
for (const f of files) {
|
|
73
|
+
const existing = langGroups.get(f.language) || [];
|
|
74
|
+
existing.push(f);
|
|
75
|
+
langGroups.set(f.language, existing);
|
|
76
|
+
}
|
|
77
|
+
const languages = [...langGroups.keys()];
|
|
78
|
+
// Check for mixed JS/TS (common issue)
|
|
79
|
+
if (langGroups.has("javascript") && langGroups.has("typescript")) {
|
|
80
|
+
const jsFiles = langGroups.get("javascript") || [];
|
|
81
|
+
const tsFiles = langGroups.get("typescript") || [];
|
|
82
|
+
if (jsFiles.length > 0 && tsFiles.length > 0) {
|
|
83
|
+
issues.push({
|
|
84
|
+
type: "mixed-js-ts",
|
|
85
|
+
severity: "medium",
|
|
86
|
+
description: `Project mixes JavaScript (${jsFiles.length} files) and TypeScript (${tsFiles.length} files)`,
|
|
87
|
+
files: [...jsFiles.slice(0, 3).map((f) => f.path), ...tsFiles.slice(0, 3).map((f) => f.path)],
|
|
88
|
+
recommendation: "Consider migrating all JavaScript files to TypeScript for consistent type safety",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Check for API contract consistency (frontend + backend languages)
|
|
93
|
+
const frontendLangs = new Set(["javascript", "typescript"]);
|
|
94
|
+
const backendLangs = new Set(["python", "go", "java", "csharp", "ruby", "php", "rust"]);
|
|
95
|
+
const hasFrontend = languages.some((l) => frontendLangs.has(l));
|
|
96
|
+
const hasBackend = languages.some((l) => backendLangs.has(l));
|
|
97
|
+
if (hasFrontend && hasBackend) {
|
|
98
|
+
issues.push({
|
|
99
|
+
type: "api-contract-risk",
|
|
100
|
+
severity: "high",
|
|
101
|
+
description: "Multi-tier project detected. Frontend and backend languages present — API contract mismatches are common",
|
|
102
|
+
files: [],
|
|
103
|
+
recommendation: "Use OpenAPI/Swagger specs or shared schema definitions to maintain API consistency across tiers",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Check for multiple backend languages
|
|
107
|
+
const backendFound = languages.filter((l) => backendLangs.has(l));
|
|
108
|
+
if (backendFound.length > 1) {
|
|
109
|
+
issues.push({
|
|
110
|
+
type: "polyglot-backend",
|
|
111
|
+
severity: "low",
|
|
112
|
+
description: `Multiple backend languages detected: ${backendFound.join(", ")}. This increases operational complexity`,
|
|
113
|
+
files: [],
|
|
114
|
+
recommendation: "Ensure each language has consistent error handling, logging, and security patterns",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Pattern: look for common security patterns across languages
|
|
118
|
+
for (const [lang, langFiles] of langGroups) {
|
|
119
|
+
let hasEnvAccess = false;
|
|
120
|
+
let hasHardcodedStrings = false;
|
|
121
|
+
for (const lf of langFiles.slice(0, 50)) {
|
|
122
|
+
try {
|
|
123
|
+
const content = readFileSync(lf.path, "utf-8");
|
|
124
|
+
if (/process\.env|os\.environ|os\.Getenv|System\.getenv|ENV\[/i.test(content)) {
|
|
125
|
+
hasEnvAccess = true;
|
|
126
|
+
}
|
|
127
|
+
if (/["'](sk-|api[_-]?key|password|secret)[a-z0-9]{8,}/i.test(content)) {
|
|
128
|
+
hasHardcodedStrings = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// skip
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (hasHardcodedStrings) {
|
|
136
|
+
issues.push({
|
|
137
|
+
type: "hardcoded-secrets",
|
|
138
|
+
severity: "critical",
|
|
139
|
+
description: `Potential hardcoded secrets detected in ${lang} files`,
|
|
140
|
+
files: langFiles.slice(0, 3).map((f) => f.path),
|
|
141
|
+
recommendation: "Use environment variables or a secrets manager consistently across all languages",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (!hasEnvAccess && langFiles.length > 5) {
|
|
145
|
+
issues.push({
|
|
146
|
+
type: "no-env-config",
|
|
147
|
+
severity: "low",
|
|
148
|
+
description: `No environment variable usage detected in ${lang} files — configuration may be hardcoded`,
|
|
149
|
+
files: [],
|
|
150
|
+
recommendation: "Use environment variables for configuration to support different deployment environments",
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return issues;
|
|
155
|
+
}
|
|
156
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
157
|
+
export function runMultiLangReview(argv) {
|
|
158
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
159
|
+
console.log(`
|
|
160
|
+
judges multi-lang-review — Cross-language consistency checking
|
|
161
|
+
|
|
162
|
+
Usage:
|
|
163
|
+
judges multi-lang-review Analyze current directory
|
|
164
|
+
judges multi-lang-review --dir ./my-project Analyze specific directory
|
|
165
|
+
judges multi-lang-review --format json JSON output
|
|
166
|
+
|
|
167
|
+
Options:
|
|
168
|
+
--dir <path> Directory to analyze (default: current directory)
|
|
169
|
+
--depth <n> Max directory depth to scan (default: 5)
|
|
170
|
+
--format json JSON output
|
|
171
|
+
--help, -h Show this help
|
|
172
|
+
|
|
173
|
+
Detects cross-language issues: mixed JS/TS, API contract risks,
|
|
174
|
+
polyglot backend complexity, and inconsistent security patterns.
|
|
175
|
+
`);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const dir = argv.find((_a, i) => argv[i - 1] === "--dir") || ".";
|
|
179
|
+
const depthStr = argv.find((_a, i) => argv[i - 1] === "--depth");
|
|
180
|
+
const maxDepth = depthStr ? parseInt(depthStr, 10) : 5;
|
|
181
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
182
|
+
const files = collectSourceFiles(dir, maxDepth);
|
|
183
|
+
if (files.length === 0) {
|
|
184
|
+
console.log("No source files found.");
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// Build language stats
|
|
188
|
+
const langStats = new Map();
|
|
189
|
+
for (const f of files) {
|
|
190
|
+
const existing = langStats.get(f.language) || { files: 0, lines: 0 };
|
|
191
|
+
existing.files++;
|
|
192
|
+
existing.lines += f.lineCount;
|
|
193
|
+
langStats.set(f.language, existing);
|
|
194
|
+
}
|
|
195
|
+
const projectLanguages = [...langStats.entries()]
|
|
196
|
+
.map(([language, stats]) => ({ language, ...stats }))
|
|
197
|
+
.sort((a, b) => b.lines - a.lines);
|
|
198
|
+
const issues = analyzeConsistency(files);
|
|
199
|
+
const report = {
|
|
200
|
+
projectLanguages,
|
|
201
|
+
totalFiles: files.length,
|
|
202
|
+
totalLanguages: projectLanguages.length,
|
|
203
|
+
issues,
|
|
204
|
+
};
|
|
205
|
+
if (format === "json") {
|
|
206
|
+
console.log(JSON.stringify(report, null, 2));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
console.log(`\n Multi-Language Review\n ─────────────────────────────`);
|
|
210
|
+
console.log(` Languages: ${report.totalLanguages}`);
|
|
211
|
+
console.log(` Files: ${report.totalFiles}\n`);
|
|
212
|
+
for (const lang of projectLanguages) {
|
|
213
|
+
const bar = "█".repeat(Math.min(30, Math.ceil((lang.files / files.length) * 30)));
|
|
214
|
+
console.log(` ${lang.language.padEnd(15)} ${String(lang.files).padStart(5)} files ${String(lang.lines).padStart(8)} lines ${bar}`);
|
|
215
|
+
}
|
|
216
|
+
if (issues.length > 0) {
|
|
217
|
+
console.log(`\n Cross-Language Issues (${issues.length}):`);
|
|
218
|
+
for (const issue of issues) {
|
|
219
|
+
const sevIcon = { critical: "🔴", high: "🟠", medium: "🟡", low: "🔵" };
|
|
220
|
+
const icon = sevIcon[issue.severity] || "⬜";
|
|
221
|
+
console.log(`\n ${icon} [${issue.severity}] ${issue.type}`);
|
|
222
|
+
console.log(` ${issue.description}`);
|
|
223
|
+
console.log(` Fix: ${issue.recommendation}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
console.log(`\n ✅ No cross-language issues detected.`);
|
|
228
|
+
}
|
|
229
|
+
console.log();
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=multi-lang-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-lang-review.js","sourceRoot":"","sources":["../../src/commands/multi-lang-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-cache — Cache review results to avoid re-analyzing unchanged files.
|
|
3
|
+
*/
|
|
4
|
+
interface CachedResult {
|
|
5
|
+
fileHash: string;
|
|
6
|
+
timestamp: string;
|
|
7
|
+
findingCount: number;
|
|
8
|
+
findings: {
|
|
9
|
+
pattern: string;
|
|
10
|
+
severity: string;
|
|
11
|
+
line: number;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
declare function hashFile(content: string): string;
|
|
15
|
+
declare function getCached(filePath: string, content: string): CachedResult | null;
|
|
16
|
+
declare function setCached(filePath: string, content: string, findings: {
|
|
17
|
+
pattern: string;
|
|
18
|
+
severity: string;
|
|
19
|
+
line: number;
|
|
20
|
+
}[]): void;
|
|
21
|
+
export declare function runReviewCache(argv: string[]): void;
|
|
22
|
+
export { getCached, setCached, hashFile };
|
|
23
|
+
//# sourceMappingURL=review-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-cache.d.ts","sourceRoot":"","sources":["../../src/commands/review-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjE;AAiBD,iBAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzC;AAMD,iBAAS,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAezE;AAED,iBAAS,SAAS,CAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAC9D,IAAI,CAaN;AA2CD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgDnD;AAGD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-cache — Cache review results to avoid re-analyzing unchanged files.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, unlinkSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { createHash } from "crypto";
|
|
7
|
+
// ─── Cache operations ──────────────────────────────────────────────────────
|
|
8
|
+
function getCacheDir() {
|
|
9
|
+
return join(".", ".judges", "review-cache");
|
|
10
|
+
}
|
|
11
|
+
function hashFile(content) {
|
|
12
|
+
return createHash("sha256").update(content).digest("hex").slice(0, 16);
|
|
13
|
+
}
|
|
14
|
+
function cacheKey(filePath) {
|
|
15
|
+
return createHash("sha256").update(filePath).digest("hex").slice(0, 16);
|
|
16
|
+
}
|
|
17
|
+
function getCached(filePath, content) {
|
|
18
|
+
const dir = getCacheDir();
|
|
19
|
+
const key = cacheKey(filePath);
|
|
20
|
+
const cachePath = join(dir, `${key}.json`);
|
|
21
|
+
if (!existsSync(cachePath))
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
const cached = JSON.parse(readFileSync(cachePath, "utf-8"));
|
|
25
|
+
const currentHash = hashFile(content);
|
|
26
|
+
if (cached.fileHash === currentHash)
|
|
27
|
+
return cached;
|
|
28
|
+
return null; // File changed, cache invalid
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function setCached(filePath, content, findings) {
|
|
35
|
+
const dir = getCacheDir();
|
|
36
|
+
if (!existsSync(dir))
|
|
37
|
+
mkdirSync(dir, { recursive: true });
|
|
38
|
+
const key = cacheKey(filePath);
|
|
39
|
+
const result = {
|
|
40
|
+
fileHash: hashFile(content),
|
|
41
|
+
timestamp: new Date().toISOString(),
|
|
42
|
+
findingCount: findings.length,
|
|
43
|
+
findings,
|
|
44
|
+
};
|
|
45
|
+
writeFileSync(join(dir, `${key}.json`), JSON.stringify(result), "utf-8");
|
|
46
|
+
}
|
|
47
|
+
function getCacheStats() {
|
|
48
|
+
const dir = getCacheDir();
|
|
49
|
+
if (!existsSync(dir))
|
|
50
|
+
return { entries: 0, hits: 0, misses: 0, sizeBytes: 0, oldestEntry: "", newestEntry: "" };
|
|
51
|
+
const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
|
|
52
|
+
let totalSize = 0;
|
|
53
|
+
let oldest = "";
|
|
54
|
+
let newest = "";
|
|
55
|
+
for (const f of files) {
|
|
56
|
+
try {
|
|
57
|
+
const content = readFileSync(join(dir, f), "utf-8");
|
|
58
|
+
totalSize += content.length;
|
|
59
|
+
const parsed = JSON.parse(content);
|
|
60
|
+
if (!oldest || parsed.timestamp < oldest)
|
|
61
|
+
oldest = parsed.timestamp;
|
|
62
|
+
if (!newest || parsed.timestamp > newest)
|
|
63
|
+
newest = parsed.timestamp;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// skip
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { entries: files.length, hits: 0, misses: 0, sizeBytes: totalSize, oldestEntry: oldest, newestEntry: newest };
|
|
70
|
+
}
|
|
71
|
+
function clearCache() {
|
|
72
|
+
const dir = getCacheDir();
|
|
73
|
+
if (!existsSync(dir))
|
|
74
|
+
return 0;
|
|
75
|
+
const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
|
|
76
|
+
for (const f of files) {
|
|
77
|
+
try {
|
|
78
|
+
unlinkSync(join(dir, f));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// skip
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return files.length;
|
|
85
|
+
}
|
|
86
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
87
|
+
export function runReviewCache(argv) {
|
|
88
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
89
|
+
console.log(`
|
|
90
|
+
judges review-cache — Manage review result cache
|
|
91
|
+
|
|
92
|
+
Usage:
|
|
93
|
+
judges review-cache stats Show cache statistics
|
|
94
|
+
judges review-cache clear Clear all cached results
|
|
95
|
+
judges review-cache --format json JSON output
|
|
96
|
+
|
|
97
|
+
Subcommands:
|
|
98
|
+
stats Show cache statistics
|
|
99
|
+
clear Clear all cached results
|
|
100
|
+
|
|
101
|
+
Options:
|
|
102
|
+
--format json JSON output
|
|
103
|
+
--help, -h Show this help
|
|
104
|
+
|
|
105
|
+
Review results are cached in .judges/review-cache/ based on file content
|
|
106
|
+
hashes. When a file hasn't changed, cached results are reused for faster
|
|
107
|
+
subsequent reviews.
|
|
108
|
+
`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
112
|
+
const subcommand = argv.find((a) => !a.startsWith("-") && a !== "review-cache") || "stats";
|
|
113
|
+
if (subcommand === "clear") {
|
|
114
|
+
const count = clearCache();
|
|
115
|
+
console.log(`Cleared ${count} cached review result(s).`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Stats
|
|
119
|
+
const stats = getCacheStats();
|
|
120
|
+
if (format === "json") {
|
|
121
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
console.log(`\n Review Cache\n ─────────────────────────────`);
|
|
125
|
+
console.log(` Entries: ${stats.entries}`);
|
|
126
|
+
console.log(` Size: ${Math.round(stats.sizeBytes / 1024)} KB`);
|
|
127
|
+
if (stats.oldestEntry)
|
|
128
|
+
console.log(` Oldest: ${stats.oldestEntry.slice(0, 10)}`);
|
|
129
|
+
if (stats.newestEntry)
|
|
130
|
+
console.log(` Newest: ${stats.newestEntry.slice(0, 10)}`);
|
|
131
|
+
console.log();
|
|
132
|
+
}
|
|
133
|
+
// Export helpers for use by other commands
|
|
134
|
+
export { getCached, setCached, hashFile };
|
|
135
|
+
//# sourceMappingURL=review-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-cache.js","sourceRoot":"","sources":["../../src/commands/review-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-log — Structured audit log of all review actions for compliance.
|
|
3
|
+
*/
|
|
4
|
+
interface ReviewLogEntry {
|
|
5
|
+
timestamp: string;
|
|
6
|
+
action: string;
|
|
7
|
+
command: string;
|
|
8
|
+
filesReviewed: number;
|
|
9
|
+
findingsCount: number;
|
|
10
|
+
severity: {
|
|
11
|
+
critical: number;
|
|
12
|
+
high: number;
|
|
13
|
+
medium: number;
|
|
14
|
+
low: number;
|
|
15
|
+
};
|
|
16
|
+
duration: number;
|
|
17
|
+
user: string;
|
|
18
|
+
commit: string;
|
|
19
|
+
}
|
|
20
|
+
declare function appendLog(entry: ReviewLogEntry): void;
|
|
21
|
+
export declare function runReviewLog(argv: string[]): void;
|
|
22
|
+
export { appendLog, ReviewLogEntry };
|
|
23
|
+
//# sourceMappingURL=review-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-log.d.ts","sourceRoot":"","sources":["../../src/commands/review-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD,iBAAS,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAK9C;AA2DD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuGjD;AAGD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-log — Structured audit log of all review actions for compliance.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync, mkdirSync, appendFileSync, readdirSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
7
|
+
function getLogDir() {
|
|
8
|
+
return join(".", ".judges", "logs");
|
|
9
|
+
}
|
|
10
|
+
function getLogFile() {
|
|
11
|
+
const dir = getLogDir();
|
|
12
|
+
const date = new Date().toISOString().slice(0, 7); // YYYY-MM
|
|
13
|
+
return join(dir, `review-log-${date}.jsonl`);
|
|
14
|
+
}
|
|
15
|
+
function appendLog(entry) {
|
|
16
|
+
const dir = getLogDir();
|
|
17
|
+
if (!existsSync(dir))
|
|
18
|
+
mkdirSync(dir, { recursive: true });
|
|
19
|
+
const logFile = getLogFile();
|
|
20
|
+
appendFileSync(logFile, JSON.stringify(entry) + "\n", "utf-8");
|
|
21
|
+
}
|
|
22
|
+
function readAllLogs() {
|
|
23
|
+
const dir = getLogDir();
|
|
24
|
+
if (!existsSync(dir))
|
|
25
|
+
return [];
|
|
26
|
+
const entries = [];
|
|
27
|
+
const files = readdirSync(dir).filter((f) => f.endsWith(".jsonl")).sort();
|
|
28
|
+
for (const f of files) {
|
|
29
|
+
try {
|
|
30
|
+
const content = readFileSync(join(dir, f), "utf-8");
|
|
31
|
+
const lines = content.split("\n").filter((l) => l.trim());
|
|
32
|
+
for (const line of lines) {
|
|
33
|
+
try {
|
|
34
|
+
entries.push(JSON.parse(line));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// skip invalid lines
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// skip unreadable files
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return entries;
|
|
46
|
+
}
|
|
47
|
+
function summarizeLogs(entries) {
|
|
48
|
+
if (entries.length === 0) {
|
|
49
|
+
return {
|
|
50
|
+
totalEntries: 0,
|
|
51
|
+
recentEntries: [],
|
|
52
|
+
totalFilesReviewed: 0,
|
|
53
|
+
totalFindings: 0,
|
|
54
|
+
averageDuration: 0,
|
|
55
|
+
firstEntry: "",
|
|
56
|
+
lastEntry: "",
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const sorted = [...entries].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
60
|
+
const totalFiles = entries.reduce((s, e) => s + e.filesReviewed, 0);
|
|
61
|
+
const totalFindings = entries.reduce((s, e) => s + e.findingsCount, 0);
|
|
62
|
+
const totalDuration = entries.reduce((s, e) => s + e.duration, 0);
|
|
63
|
+
return {
|
|
64
|
+
totalEntries: entries.length,
|
|
65
|
+
recentEntries: sorted.slice(-10),
|
|
66
|
+
totalFilesReviewed: totalFiles,
|
|
67
|
+
totalFindings,
|
|
68
|
+
averageDuration: Math.round(totalDuration / entries.length),
|
|
69
|
+
firstEntry: sorted[0].timestamp,
|
|
70
|
+
lastEntry: sorted[sorted.length - 1].timestamp,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
74
|
+
export function runReviewLog(argv) {
|
|
75
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
76
|
+
console.log(`
|
|
77
|
+
judges review-log — Structured audit log of review actions
|
|
78
|
+
|
|
79
|
+
Usage:
|
|
80
|
+
judges review-log show Show log summary
|
|
81
|
+
judges review-log record --command eval --files 10 --findings 5
|
|
82
|
+
judges review-log export Export all logs as JSON
|
|
83
|
+
judges review-log --format json JSON output
|
|
84
|
+
|
|
85
|
+
Subcommands:
|
|
86
|
+
show Show log summary and recent entries
|
|
87
|
+
record Record a review action to the log
|
|
88
|
+
export Export complete log as JSON
|
|
89
|
+
|
|
90
|
+
Record Options:
|
|
91
|
+
--command <name> Command that was run
|
|
92
|
+
--files <n> Number of files reviewed
|
|
93
|
+
--findings <n> Number of findings
|
|
94
|
+
--critical <n> Critical findings count
|
|
95
|
+
--high <n> High findings count
|
|
96
|
+
--medium <n> Medium findings count
|
|
97
|
+
--low <n> Low findings count
|
|
98
|
+
--duration <ms> Duration in milliseconds
|
|
99
|
+
--commit <hash> Associated commit
|
|
100
|
+
|
|
101
|
+
Logs are stored locally in .judges/logs/ as monthly JSONL files.
|
|
102
|
+
`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
106
|
+
const subcommand = argv.find((a) => !a.startsWith("-") && a !== "review-log") || "show";
|
|
107
|
+
if (subcommand === "record") {
|
|
108
|
+
const getNum = (flag) => {
|
|
109
|
+
const val = argv.find((_a, i) => argv[i - 1] === flag);
|
|
110
|
+
return val ? parseInt(val, 10) : 0;
|
|
111
|
+
};
|
|
112
|
+
const getStr = (flag) => {
|
|
113
|
+
return argv.find((_a, i) => argv[i - 1] === flag) || "";
|
|
114
|
+
};
|
|
115
|
+
const entry = {
|
|
116
|
+
timestamp: new Date().toISOString(),
|
|
117
|
+
action: "review",
|
|
118
|
+
command: getStr("--command") || "unknown",
|
|
119
|
+
filesReviewed: getNum("--files"),
|
|
120
|
+
findingsCount: getNum("--findings"),
|
|
121
|
+
severity: {
|
|
122
|
+
critical: getNum("--critical"),
|
|
123
|
+
high: getNum("--high"),
|
|
124
|
+
medium: getNum("--medium"),
|
|
125
|
+
low: getNum("--low"),
|
|
126
|
+
},
|
|
127
|
+
duration: getNum("--duration"),
|
|
128
|
+
user: process.env.USER || process.env.USERNAME || "unknown",
|
|
129
|
+
commit: getStr("--commit"),
|
|
130
|
+
};
|
|
131
|
+
appendLog(entry);
|
|
132
|
+
console.log(`Logged review action: ${entry.command} (${entry.findingsCount} findings, ${entry.filesReviewed} files).`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (subcommand === "export") {
|
|
136
|
+
const entries = readAllLogs();
|
|
137
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Show
|
|
141
|
+
const entries = readAllLogs();
|
|
142
|
+
const summary = summarizeLogs(entries);
|
|
143
|
+
if (format === "json") {
|
|
144
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
console.log(`\n Review Log\n ─────────────────────────────`);
|
|
148
|
+
console.log(` Total entries: ${summary.totalEntries}`);
|
|
149
|
+
console.log(` Total files reviewed: ${summary.totalFilesReviewed}`);
|
|
150
|
+
console.log(` Total findings: ${summary.totalFindings}`);
|
|
151
|
+
console.log(` Average duration: ${summary.averageDuration}ms`);
|
|
152
|
+
if (summary.firstEntry) {
|
|
153
|
+
console.log(` Period: ${summary.firstEntry.slice(0, 10)} to ${summary.lastEntry.slice(0, 10)}`);
|
|
154
|
+
}
|
|
155
|
+
if (summary.recentEntries.length > 0) {
|
|
156
|
+
console.log("\n Recent entries:");
|
|
157
|
+
for (const e of summary.recentEntries) {
|
|
158
|
+
console.log(` ${e.timestamp.slice(0, 19)} ${e.command} — ${e.findingsCount} findings, ${e.filesReviewed} files, ${e.duration}ms`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
console.log();
|
|
162
|
+
}
|
|
163
|
+
// Export for use by other commands
|
|
164
|
+
export { appendLog };
|
|
165
|
+
//# sourceMappingURL=review-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-log.js","sourceRoot":"","sources":["../../src/commands/review-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-priority.d.ts","sourceRoot":"","sources":["../../src/commands/review-priority.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqFH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoGtD"}
|