@kevinrabun/judges 3.23.5 → 3.23.7
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 +27 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +37 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/benchmark.d.ts.map +1 -1
- package/dist/commands/benchmark.js +556 -0
- package/dist/commands/benchmark.js.map +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +17 -1
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/review.d.ts +37 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +539 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/tune.d.ts +25 -0
- package/dist/commands/tune.d.ts.map +1 -0
- package/dist/commands/tune.js +408 -0
- package/dist/commands/tune.js.map +1 -0
- package/dist/evaluators/accessibility.d.ts.map +1 -1
- package/dist/evaluators/accessibility.js +5 -1
- package/dist/evaluators/accessibility.js.map +1 -1
- package/dist/evaluators/ai-code-safety.d.ts.map +1 -1
- package/dist/evaluators/ai-code-safety.js +6 -1
- package/dist/evaluators/ai-code-safety.js.map +1 -1
- package/dist/evaluators/authentication.d.ts.map +1 -1
- package/dist/evaluators/authentication.js +5 -1
- package/dist/evaluators/authentication.js.map +1 -1
- package/dist/evaluators/ci-cd.d.ts.map +1 -1
- package/dist/evaluators/ci-cd.js +6 -2
- package/dist/evaluators/ci-cd.js.map +1 -1
- package/dist/evaluators/cloud-readiness.d.ts.map +1 -1
- package/dist/evaluators/cloud-readiness.js +12 -3
- package/dist/evaluators/cloud-readiness.js.map +1 -1
- package/dist/evaluators/compliance.d.ts.map +1 -1
- package/dist/evaluators/compliance.js +5 -1
- package/dist/evaluators/compliance.js.map +1 -1
- package/dist/evaluators/configuration-management.d.ts.map +1 -1
- package/dist/evaluators/configuration-management.js +5 -1
- package/dist/evaluators/configuration-management.js.map +1 -1
- package/dist/evaluators/cost-effectiveness.d.ts.map +1 -1
- package/dist/evaluators/cost-effectiveness.js +5 -3
- package/dist/evaluators/cost-effectiveness.js.map +1 -1
- package/dist/evaluators/cybersecurity.d.ts.map +1 -1
- package/dist/evaluators/cybersecurity.js +5 -1
- package/dist/evaluators/cybersecurity.js.map +1 -1
- package/dist/evaluators/data-security.d.ts.map +1 -1
- package/dist/evaluators/data-security.js +12 -1
- package/dist/evaluators/data-security.js.map +1 -1
- package/dist/evaluators/data-sovereignty.d.ts.map +1 -1
- package/dist/evaluators/data-sovereignty.js +5 -1
- package/dist/evaluators/data-sovereignty.js.map +1 -1
- package/dist/evaluators/database.d.ts.map +1 -1
- package/dist/evaluators/database.js +11 -1
- package/dist/evaluators/database.js.map +1 -1
- package/dist/evaluators/error-handling.d.ts.map +1 -1
- package/dist/evaluators/error-handling.js +2 -2
- package/dist/evaluators/error-handling.js.map +1 -1
- package/dist/evaluators/ethics-bias.d.ts.map +1 -1
- package/dist/evaluators/ethics-bias.js +5 -1
- package/dist/evaluators/ethics-bias.js.map +1 -1
- package/dist/evaluators/false-positive-review.js +4 -4
- package/dist/evaluators/false-positive-review.js.map +1 -1
- package/dist/evaluators/iac-security.d.ts.map +1 -1
- package/dist/evaluators/iac-security.js +14 -2
- package/dist/evaluators/iac-security.js.map +1 -1
- package/dist/evaluators/internationalization.d.ts.map +1 -1
- package/dist/evaluators/internationalization.js +5 -1
- package/dist/evaluators/internationalization.js.map +1 -1
- package/dist/evaluators/logging-privacy.d.ts.map +1 -1
- package/dist/evaluators/logging-privacy.js +8 -4
- package/dist/evaluators/logging-privacy.js.map +1 -1
- package/dist/evaluators/maintainability.d.ts.map +1 -1
- package/dist/evaluators/maintainability.js +37 -28
- package/dist/evaluators/maintainability.js.map +1 -1
- package/dist/evaluators/observability.js +2 -2
- package/dist/evaluators/observability.js.map +1 -1
- package/dist/evaluators/performance.d.ts.map +1 -1
- package/dist/evaluators/performance.js +9 -5
- package/dist/evaluators/performance.js.map +1 -1
- package/dist/evaluators/portability.d.ts.map +1 -1
- package/dist/evaluators/portability.js +33 -11
- package/dist/evaluators/portability.js.map +1 -1
- package/dist/evaluators/reliability.js +2 -2
- package/dist/evaluators/reliability.js.map +1 -1
- package/dist/evaluators/scalability.d.ts.map +1 -1
- package/dist/evaluators/scalability.js +5 -3
- package/dist/evaluators/scalability.js.map +1 -1
- package/dist/evaluators/shared.d.ts +34 -0
- package/dist/evaluators/shared.d.ts.map +1 -1
- package/dist/evaluators/shared.js +60 -0
- package/dist/evaluators/shared.js.map +1 -1
- package/dist/evaluators/software-practices.js +2 -2
- package/dist/evaluators/software-practices.js.map +1 -1
- package/dist/finding-lifecycle.d.ts +93 -0
- package/dist/finding-lifecycle.d.ts.map +1 -0
- package/dist/finding-lifecycle.js +214 -0
- package/dist/finding-lifecycle.js.map +1 -0
- package/dist/patches/index.d.ts.map +1 -1
- package/dist/patches/index.js +127 -0
- package/dist/patches/index.js.map +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +103 -0
- package/dist/presets.js.map +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges review` — Post inline review comments on a GitHub pull request.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates changed files in a PR and posts findings as inline review comments.
|
|
5
|
+
* Designed to be the primary (or only) code reviewer for AI-generated code.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* judges review --pr 42 # Review PR #42 in current repo
|
|
9
|
+
* judges review --pr 42 --repo owner/repo # Review PR in specific repo
|
|
10
|
+
* judges review --pr 42 --approve # Auto-approve if no critical/high
|
|
11
|
+
* judges review --pr 42 --dry-run # Preview comments without posting
|
|
12
|
+
* judges review --pr 42 --min-severity high # Only post high+ findings
|
|
13
|
+
*
|
|
14
|
+
* Requires: GITHUB_TOKEN environment variable (or gh CLI authenticated).
|
|
15
|
+
*/
|
|
16
|
+
import { execSync } from "child_process";
|
|
17
|
+
import { writeFileSync } from "fs";
|
|
18
|
+
import { resolve, extname } from "path";
|
|
19
|
+
import { evaluateDiff } from "../evaluators/index.js";
|
|
20
|
+
// ─── Language Detection ─────────────────────────────────────────────────────
|
|
21
|
+
const EXT_TO_LANG = {
|
|
22
|
+
".ts": "typescript",
|
|
23
|
+
".tsx": "typescript",
|
|
24
|
+
".js": "javascript",
|
|
25
|
+
".jsx": "javascript",
|
|
26
|
+
".mjs": "javascript",
|
|
27
|
+
".cjs": "javascript",
|
|
28
|
+
".py": "python",
|
|
29
|
+
".rs": "rust",
|
|
30
|
+
".go": "go",
|
|
31
|
+
".java": "java",
|
|
32
|
+
".cs": "csharp",
|
|
33
|
+
".rb": "ruby",
|
|
34
|
+
".php": "php",
|
|
35
|
+
".swift": "swift",
|
|
36
|
+
".kt": "kotlin",
|
|
37
|
+
".tf": "terraform",
|
|
38
|
+
".hcl": "terraform",
|
|
39
|
+
".bicep": "bicep",
|
|
40
|
+
".sh": "bash",
|
|
41
|
+
".ps1": "powershell",
|
|
42
|
+
".c": "c",
|
|
43
|
+
".cpp": "cpp",
|
|
44
|
+
".h": "c",
|
|
45
|
+
".hpp": "cpp",
|
|
46
|
+
};
|
|
47
|
+
function detectLanguage(filePath) {
|
|
48
|
+
const ext = extname(filePath.toLowerCase());
|
|
49
|
+
if (filePath.toLowerCase().includes("dockerfile"))
|
|
50
|
+
return "dockerfile";
|
|
51
|
+
return EXT_TO_LANG[ext];
|
|
52
|
+
}
|
|
53
|
+
// ─── Severity Helpers ───────────────────────────────────────────────────────
|
|
54
|
+
const SEVERITY_ORDER = ["critical", "high", "medium", "low", "info"];
|
|
55
|
+
function severityRank(s) {
|
|
56
|
+
return SEVERITY_ORDER.indexOf(s);
|
|
57
|
+
}
|
|
58
|
+
function meetsSeverityThreshold(severity, min) {
|
|
59
|
+
return severityRank(severity) <= severityRank(min);
|
|
60
|
+
}
|
|
61
|
+
// ─── Diff Parser (reused from diff.ts logic) ───────────────────────────────
|
|
62
|
+
export function parsePatchToHunk(filePath, patch) {
|
|
63
|
+
const lines = patch.split("\n");
|
|
64
|
+
const newLines = [];
|
|
65
|
+
const changedLineNumbers = [];
|
|
66
|
+
let newLineNum = 0;
|
|
67
|
+
for (const line of lines) {
|
|
68
|
+
// Hunk header: @@ -10,5 +20,8 @@
|
|
69
|
+
const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
70
|
+
if (hunkMatch) {
|
|
71
|
+
newLineNum = parseInt(hunkMatch[1], 10) - 1;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Context line
|
|
75
|
+
if (line.startsWith(" ") || (line === "" && newLineNum > 0)) {
|
|
76
|
+
newLineNum++;
|
|
77
|
+
newLines.push(line.startsWith(" ") ? line.slice(1) : line);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Added line
|
|
81
|
+
if (line.startsWith("+")) {
|
|
82
|
+
newLineNum++;
|
|
83
|
+
changedLineNumbers.push(newLineNum);
|
|
84
|
+
newLines.push(line.slice(1));
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Removed line — skip
|
|
88
|
+
if (line.startsWith("-"))
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
filePath,
|
|
93
|
+
newContent: newLines.join("\n"),
|
|
94
|
+
changedLines: changedLineNumbers,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// ─── GitHub API Helpers ─────────────────────────────────────────────────────
|
|
98
|
+
function getToken() {
|
|
99
|
+
return process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
|
|
100
|
+
}
|
|
101
|
+
function detectRepo() {
|
|
102
|
+
try {
|
|
103
|
+
const remote = execSync("git remote get-url origin", { encoding: "utf-8" }).trim();
|
|
104
|
+
// SSH: git@github.com:owner/repo.git
|
|
105
|
+
const sshMatch = remote.match(/github\.com[:/]([^/]+\/[^/.]+)/);
|
|
106
|
+
if (sshMatch)
|
|
107
|
+
return sshMatch[1];
|
|
108
|
+
// HTTPS: https://github.com/owner/repo.git
|
|
109
|
+
const httpsMatch = remote.match(/github\.com\/([^/]+\/[^/.]+)/);
|
|
110
|
+
if (httpsMatch)
|
|
111
|
+
return httpsMatch[1];
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Not a git repo or no remote
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
function ghApiRequest(method, endpoint, token, body) {
|
|
119
|
+
const url = endpoint.startsWith("https://") ? endpoint : `https://api.github.com${endpoint}`;
|
|
120
|
+
const args = [
|
|
121
|
+
"curl",
|
|
122
|
+
"-s",
|
|
123
|
+
"-X",
|
|
124
|
+
method,
|
|
125
|
+
"-H",
|
|
126
|
+
`"Authorization: Bearer ${token}"`,
|
|
127
|
+
"-H",
|
|
128
|
+
'"Accept: application/vnd.github.v3+json"',
|
|
129
|
+
"-H",
|
|
130
|
+
'"Content-Type: application/json"',
|
|
131
|
+
"-w",
|
|
132
|
+
'"\\n%{http_code}"',
|
|
133
|
+
];
|
|
134
|
+
if (body) {
|
|
135
|
+
// Write body to temp file to avoid shell escaping issues
|
|
136
|
+
const tmpFile = resolve(".judges-review-tmp.json");
|
|
137
|
+
writeFileSync(tmpFile, JSON.stringify(body), "utf-8");
|
|
138
|
+
args.push("-d", `@${tmpFile}`);
|
|
139
|
+
args.push(`"${url}"`);
|
|
140
|
+
try {
|
|
141
|
+
const output = execSync(args.join(" "), { encoding: "utf-8", shell: "cmd.exe" }).trim();
|
|
142
|
+
const lastNewline = output.lastIndexOf("\n");
|
|
143
|
+
const responseBody = lastNewline >= 0 ? output.slice(0, lastNewline) : "";
|
|
144
|
+
const statusCode = parseInt(lastNewline >= 0 ? output.slice(lastNewline + 1) : output, 10);
|
|
145
|
+
try {
|
|
146
|
+
// Clean up temp file
|
|
147
|
+
execSync(`del "${tmpFile}"`, { stdio: "ignore", shell: "cmd.exe" });
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// ignore cleanup errors
|
|
151
|
+
}
|
|
152
|
+
return { status: statusCode, data: responseBody ? JSON.parse(responseBody) : null };
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
try {
|
|
156
|
+
execSync(`del "${tmpFile}"`, { stdio: "ignore", shell: "cmd.exe" });
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// ignore
|
|
160
|
+
}
|
|
161
|
+
return { status: 0, data: null };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
args.push(`"${url}"`);
|
|
165
|
+
try {
|
|
166
|
+
const output = execSync(args.join(" "), { encoding: "utf-8", shell: "cmd.exe" }).trim();
|
|
167
|
+
const lastNewline = output.lastIndexOf("\n");
|
|
168
|
+
const responseBody = lastNewline >= 0 ? output.slice(0, lastNewline) : "";
|
|
169
|
+
const statusCode = parseInt(lastNewline >= 0 ? output.slice(lastNewline + 1) : output, 10);
|
|
170
|
+
return { status: statusCode, data: responseBody ? JSON.parse(responseBody) : null };
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return { status: 0, data: null };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Use `gh` CLI as a more reliable alternative when available.
|
|
178
|
+
*/
|
|
179
|
+
function ghCliAvailable() {
|
|
180
|
+
try {
|
|
181
|
+
execSync("gh --version", { stdio: "ignore" });
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function ghCliRequest(method, endpoint, body) {
|
|
189
|
+
const args = ["gh", "api", "-X", method, "--jq", "."];
|
|
190
|
+
if (body) {
|
|
191
|
+
const tmpFile = resolve(".judges-review-tmp.json");
|
|
192
|
+
writeFileSync(tmpFile, JSON.stringify(body), "utf-8");
|
|
193
|
+
args.push("--input", tmpFile);
|
|
194
|
+
}
|
|
195
|
+
args.push(endpoint);
|
|
196
|
+
try {
|
|
197
|
+
const output = execSync(args.join(" "), { encoding: "utf-8" }).trim();
|
|
198
|
+
if (body) {
|
|
199
|
+
try {
|
|
200
|
+
const tmpFile = resolve(".judges-review-tmp.json");
|
|
201
|
+
execSync(process.platform === "win32" ? `del "${tmpFile}"` : `rm -f "${tmpFile}"`, { stdio: "ignore" });
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// ignore
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return { status: 200, data: output ? JSON.parse(output) : null };
|
|
208
|
+
}
|
|
209
|
+
catch (e) {
|
|
210
|
+
if (body) {
|
|
211
|
+
try {
|
|
212
|
+
const tmpFile = resolve(".judges-review-tmp.json");
|
|
213
|
+
execSync(process.platform === "win32" ? `del "${tmpFile}"` : `rm -f "${tmpFile}"`, { stdio: "ignore" });
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// ignore
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { status: 0, data: null };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function apiRequest(method, endpoint, token, body) {
|
|
223
|
+
if (ghCliAvailable()) {
|
|
224
|
+
return ghCliRequest(method, endpoint, body);
|
|
225
|
+
}
|
|
226
|
+
if (token) {
|
|
227
|
+
return ghApiRequest(method, endpoint, token, body);
|
|
228
|
+
}
|
|
229
|
+
console.error("Error: No GitHub authentication found.");
|
|
230
|
+
console.error("Either install the `gh` CLI and run `gh auth login`, or set GITHUB_TOKEN env var.");
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
// ─── Finding → Review Comment ───────────────────────────────────────────────
|
|
234
|
+
const SEVERITY_EMOJI = {
|
|
235
|
+
critical: "🔴",
|
|
236
|
+
high: "🟠",
|
|
237
|
+
medium: "🟡",
|
|
238
|
+
low: "🔵",
|
|
239
|
+
info: "ℹ️",
|
|
240
|
+
};
|
|
241
|
+
export function findingToCommentBody(finding) {
|
|
242
|
+
const emoji = SEVERITY_EMOJI[finding.severity] || "⚠️";
|
|
243
|
+
const lines = [
|
|
244
|
+
`${emoji} **${finding.severity.toUpperCase()}** — ${finding.title} (\`${finding.ruleId}\`)`,
|
|
245
|
+
"",
|
|
246
|
+
finding.description,
|
|
247
|
+
"",
|
|
248
|
+
`**Recommendation:** ${finding.recommendation}`,
|
|
249
|
+
];
|
|
250
|
+
if (finding.suggestedFix) {
|
|
251
|
+
lines.push("", "**Suggested fix:**", "```", finding.suggestedFix, "```");
|
|
252
|
+
}
|
|
253
|
+
if (finding.reference) {
|
|
254
|
+
lines.push("", `📚 ${finding.reference}`);
|
|
255
|
+
}
|
|
256
|
+
lines.push("", "---", "*Reviewed by [Judges Panel](https://github.com/KevinRabun/judges)*");
|
|
257
|
+
return lines.join("\n");
|
|
258
|
+
}
|
|
259
|
+
function reviewPrFiles(files, minSeverity, maxComments) {
|
|
260
|
+
const comments = [];
|
|
261
|
+
let totalFindings = 0;
|
|
262
|
+
let criticalCount = 0;
|
|
263
|
+
let highCount = 0;
|
|
264
|
+
let mediumCount = 0;
|
|
265
|
+
let lowCount = 0;
|
|
266
|
+
let filesAnalyzed = 0;
|
|
267
|
+
for (const file of files) {
|
|
268
|
+
// Skip removed files and files without patches
|
|
269
|
+
if (file.status === "removed" || !file.patch)
|
|
270
|
+
continue;
|
|
271
|
+
// Skip non-code files
|
|
272
|
+
const lang = detectLanguage(file.filename);
|
|
273
|
+
if (!lang)
|
|
274
|
+
continue;
|
|
275
|
+
filesAnalyzed++;
|
|
276
|
+
const hunk = parsePatchToHunk(file.filename, file.patch);
|
|
277
|
+
if (hunk.changedLines.length === 0)
|
|
278
|
+
continue;
|
|
279
|
+
const verdict = evaluateDiff(hunk.newContent, lang, hunk.changedLines);
|
|
280
|
+
for (const finding of verdict.findings) {
|
|
281
|
+
totalFindings++;
|
|
282
|
+
switch (finding.severity) {
|
|
283
|
+
case "critical":
|
|
284
|
+
criticalCount++;
|
|
285
|
+
break;
|
|
286
|
+
case "high":
|
|
287
|
+
highCount++;
|
|
288
|
+
break;
|
|
289
|
+
case "medium":
|
|
290
|
+
mediumCount++;
|
|
291
|
+
break;
|
|
292
|
+
case "low":
|
|
293
|
+
lowCount++;
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
// Filter by min severity
|
|
297
|
+
if (!meetsSeverityThreshold(finding.severity, minSeverity))
|
|
298
|
+
continue;
|
|
299
|
+
// Map finding line to the diff line number
|
|
300
|
+
const line = finding.lineNumbers?.[0];
|
|
301
|
+
if (!line)
|
|
302
|
+
continue;
|
|
303
|
+
// Only comment on changed lines
|
|
304
|
+
if (!hunk.changedLines.includes(line))
|
|
305
|
+
continue;
|
|
306
|
+
comments.push({
|
|
307
|
+
path: file.filename,
|
|
308
|
+
line,
|
|
309
|
+
side: "RIGHT",
|
|
310
|
+
body: findingToCommentBody(finding),
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Sort by severity (critical first), then truncate
|
|
315
|
+
comments.sort((a, b) => {
|
|
316
|
+
const sevA = a.body.includes("CRITICAL") ? 0 : a.body.includes("HIGH") ? 1 : a.body.includes("MEDIUM") ? 2 : 3;
|
|
317
|
+
const sevB = b.body.includes("CRITICAL") ? 0 : b.body.includes("HIGH") ? 1 : b.body.includes("MEDIUM") ? 2 : 3;
|
|
318
|
+
return sevA - sevB;
|
|
319
|
+
});
|
|
320
|
+
const truncated = comments.slice(0, maxComments);
|
|
321
|
+
const hasBlockers = criticalCount > 0 || highCount > 0;
|
|
322
|
+
return {
|
|
323
|
+
filesAnalyzed,
|
|
324
|
+
totalFindings,
|
|
325
|
+
commentsPosted: truncated.length,
|
|
326
|
+
criticalCount,
|
|
327
|
+
highCount,
|
|
328
|
+
mediumCount,
|
|
329
|
+
lowCount,
|
|
330
|
+
approved: !hasBlockers,
|
|
331
|
+
comments: truncated,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function buildReviewSummary(result) {
|
|
335
|
+
const emoji = result.approved ? "✅" : "❌";
|
|
336
|
+
const lines = [
|
|
337
|
+
`## ${emoji} Judges Panel Review`,
|
|
338
|
+
"",
|
|
339
|
+
`**${result.filesAnalyzed}** files analyzed · **${result.totalFindings}** findings`,
|
|
340
|
+
"",
|
|
341
|
+
];
|
|
342
|
+
if (result.totalFindings > 0) {
|
|
343
|
+
lines.push("| Severity | Count |");
|
|
344
|
+
lines.push("|----------|-------|");
|
|
345
|
+
if (result.criticalCount > 0)
|
|
346
|
+
lines.push(`| 🔴 Critical | ${result.criticalCount} |`);
|
|
347
|
+
if (result.highCount > 0)
|
|
348
|
+
lines.push(`| 🟠 High | ${result.highCount} |`);
|
|
349
|
+
if (result.mediumCount > 0)
|
|
350
|
+
lines.push(`| 🟡 Medium | ${result.mediumCount} |`);
|
|
351
|
+
if (result.lowCount > 0)
|
|
352
|
+
lines.push(`| 🔵 Low | ${result.lowCount} |`);
|
|
353
|
+
lines.push("");
|
|
354
|
+
}
|
|
355
|
+
if (result.commentsPosted < result.totalFindings) {
|
|
356
|
+
lines.push(`> Showing top ${result.commentsPosted} of ${result.totalFindings} findings. Run \`judges eval\` locally for the full report.`);
|
|
357
|
+
lines.push("");
|
|
358
|
+
}
|
|
359
|
+
if (result.approved) {
|
|
360
|
+
lines.push("No critical or high severity issues found. Code looks good!");
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
lines.push("**Action required:** Please address the critical/high severity findings before merging.");
|
|
364
|
+
}
|
|
365
|
+
lines.push("", "---", "*Powered by [Judges Panel](https://github.com/KevinRabun/judges)*");
|
|
366
|
+
return lines.join("\n");
|
|
367
|
+
}
|
|
368
|
+
// ─── CLI Entry Point ────────────────────────────────────────────────────────
|
|
369
|
+
export function parseReviewArgs(argv) {
|
|
370
|
+
const args = {
|
|
371
|
+
pr: 0,
|
|
372
|
+
repo: undefined,
|
|
373
|
+
approve: false,
|
|
374
|
+
dryRun: false,
|
|
375
|
+
minSeverity: "medium",
|
|
376
|
+
format: "text",
|
|
377
|
+
maxComments: 25,
|
|
378
|
+
token: getToken(),
|
|
379
|
+
};
|
|
380
|
+
for (let i = 3; i < argv.length; i++) {
|
|
381
|
+
const arg = argv[i];
|
|
382
|
+
switch (arg) {
|
|
383
|
+
case "--pr":
|
|
384
|
+
case "-p":
|
|
385
|
+
args.pr = parseInt(argv[++i], 10);
|
|
386
|
+
break;
|
|
387
|
+
case "--repo":
|
|
388
|
+
case "-r":
|
|
389
|
+
args.repo = argv[++i];
|
|
390
|
+
break;
|
|
391
|
+
case "--approve":
|
|
392
|
+
args.approve = true;
|
|
393
|
+
break;
|
|
394
|
+
case "--dry-run":
|
|
395
|
+
case "-n":
|
|
396
|
+
args.dryRun = true;
|
|
397
|
+
break;
|
|
398
|
+
case "--min-severity":
|
|
399
|
+
args.minSeverity = argv[++i];
|
|
400
|
+
break;
|
|
401
|
+
case "--format":
|
|
402
|
+
args.format = argv[++i];
|
|
403
|
+
break;
|
|
404
|
+
case "--max-comments":
|
|
405
|
+
args.maxComments = parseInt(argv[++i], 10);
|
|
406
|
+
break;
|
|
407
|
+
default:
|
|
408
|
+
// Positional: treat as PR number if numeric
|
|
409
|
+
if (!arg.startsWith("-") && /^\d+$/.test(arg) && args.pr === 0) {
|
|
410
|
+
args.pr = parseInt(arg, 10);
|
|
411
|
+
}
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return args;
|
|
416
|
+
}
|
|
417
|
+
export function runReview(argv) {
|
|
418
|
+
const args = parseReviewArgs(argv);
|
|
419
|
+
if (args.pr === 0) {
|
|
420
|
+
console.log(`
|
|
421
|
+
Judges Panel — Pull Request Review
|
|
422
|
+
|
|
423
|
+
USAGE:
|
|
424
|
+
judges review --pr <number> Review a pull request
|
|
425
|
+
judges review --pr <number> --dry-run Preview without posting
|
|
426
|
+
judges review --pr 42 --approve Auto-approve if clean
|
|
427
|
+
judges review --pr 42 --repo owner/repo Review PR in specific repo
|
|
428
|
+
|
|
429
|
+
OPTIONS:
|
|
430
|
+
--pr, -p <number> PR number (required)
|
|
431
|
+
--repo, -r <owner/repo> GitHub repository (auto-detected from git remote)
|
|
432
|
+
--approve Auto-approve PR if no critical/high findings
|
|
433
|
+
--dry-run, -n Preview comments without posting to GitHub
|
|
434
|
+
--min-severity <level> Minimum severity: critical, high, medium (default), low, info
|
|
435
|
+
--max-comments <n> Maximum inline comments (default: 25)
|
|
436
|
+
--format <fmt> Output: text (default), json
|
|
437
|
+
|
|
438
|
+
AUTHENTICATION:
|
|
439
|
+
Set GITHUB_TOKEN env var, or install the \`gh\` CLI and run \`gh auth login\`.
|
|
440
|
+
`);
|
|
441
|
+
process.exit(0);
|
|
442
|
+
}
|
|
443
|
+
// Resolve repo
|
|
444
|
+
const repo = args.repo || detectRepo();
|
|
445
|
+
if (!repo) {
|
|
446
|
+
console.error("Error: Could not detect GitHub repository.");
|
|
447
|
+
console.error("Use --repo owner/repo or run from within a git repository.");
|
|
448
|
+
process.exit(1);
|
|
449
|
+
}
|
|
450
|
+
console.log("");
|
|
451
|
+
console.log("╔══════════════════════════════════════════════════════════════╗");
|
|
452
|
+
console.log("║ Judges Panel — PR Review ║");
|
|
453
|
+
console.log("╚══════════════════════════════════════════════════════════════╝");
|
|
454
|
+
console.log("");
|
|
455
|
+
console.log(` Repository : ${repo}`);
|
|
456
|
+
console.log(` PR : #${args.pr}`);
|
|
457
|
+
console.log(` Mode : ${args.dryRun ? "dry-run (preview only)" : "live (will post comments)"}`);
|
|
458
|
+
console.log("");
|
|
459
|
+
// Fetch PR files
|
|
460
|
+
const filesResp = apiRequest("GET", `/repos/${repo}/pulls/${args.pr}/files`, args.token);
|
|
461
|
+
if (!filesResp.data || !Array.isArray(filesResp.data)) {
|
|
462
|
+
console.error("Error: Failed to fetch PR files. Check your authentication and PR number.");
|
|
463
|
+
if (filesResp.status)
|
|
464
|
+
console.error(` HTTP status: ${filesResp.status}`);
|
|
465
|
+
process.exit(1);
|
|
466
|
+
}
|
|
467
|
+
const prFiles = filesResp.data.map((f) => ({
|
|
468
|
+
filename: f.filename,
|
|
469
|
+
status: f.status,
|
|
470
|
+
patch: f.patch,
|
|
471
|
+
}));
|
|
472
|
+
console.log(` Files in PR: ${prFiles.length}`);
|
|
473
|
+
// Run analysis
|
|
474
|
+
const result = reviewPrFiles(prFiles, args.minSeverity, args.maxComments);
|
|
475
|
+
if (args.format === "json") {
|
|
476
|
+
console.log(JSON.stringify(result, null, 2));
|
|
477
|
+
process.exit(result.approved ? 0 : 1);
|
|
478
|
+
}
|
|
479
|
+
// Print results
|
|
480
|
+
console.log(` Files analyzed: ${result.filesAnalyzed}`);
|
|
481
|
+
console.log(` Total findings: ${result.totalFindings}`);
|
|
482
|
+
if (result.criticalCount > 0)
|
|
483
|
+
console.log(` 🔴 Critical: ${result.criticalCount}`);
|
|
484
|
+
if (result.highCount > 0)
|
|
485
|
+
console.log(` 🟠 High: ${result.highCount}`);
|
|
486
|
+
if (result.mediumCount > 0)
|
|
487
|
+
console.log(` 🟡 Medium: ${result.mediumCount}`);
|
|
488
|
+
if (result.lowCount > 0)
|
|
489
|
+
console.log(` 🔵 Low: ${result.lowCount}`);
|
|
490
|
+
console.log("");
|
|
491
|
+
if (args.dryRun) {
|
|
492
|
+
console.log(" 📝 Dry-run mode — comments that would be posted:");
|
|
493
|
+
console.log("");
|
|
494
|
+
for (const comment of result.comments) {
|
|
495
|
+
console.log(` 📄 ${comment.path}:${comment.line}`);
|
|
496
|
+
console.log(` ${comment.body.split("\n")[0]}`);
|
|
497
|
+
}
|
|
498
|
+
console.log("");
|
|
499
|
+
console.log(` Would post ${result.comments.length} inline comment(s)`);
|
|
500
|
+
console.log(` Review event: ${result.approved && args.approve ? "APPROVE" : result.approved ? "COMMENT" : "REQUEST_CHANGES"}`);
|
|
501
|
+
console.log("");
|
|
502
|
+
process.exit(result.approved ? 0 : 1);
|
|
503
|
+
}
|
|
504
|
+
// Post review to GitHub
|
|
505
|
+
if (result.comments.length > 0 || args.approve) {
|
|
506
|
+
const reviewEvent = result.approved && args.approve ? "APPROVE" : result.approved ? "COMMENT" : "REQUEST_CHANGES";
|
|
507
|
+
const reviewBody = {
|
|
508
|
+
body: buildReviewSummary(result),
|
|
509
|
+
event: reviewEvent,
|
|
510
|
+
comments: result.comments,
|
|
511
|
+
};
|
|
512
|
+
const reviewResp = apiRequest("POST", `/repos/${repo}/pulls/${args.pr}/reviews`, args.token, reviewBody);
|
|
513
|
+
if (reviewResp.status === 200 || reviewResp.status === 422) {
|
|
514
|
+
// 422 can happen if line mapping is off — still post summary
|
|
515
|
+
console.log(` ✅ Review posted with ${result.comments.length} inline comment(s)`);
|
|
516
|
+
console.log(` 📋 Review event: ${reviewEvent}`);
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
// If inline comments fail, try posting just the summary as a plain comment
|
|
520
|
+
console.error(` ⚠️ Review with inline comments failed (status: ${reviewResp.status})`);
|
|
521
|
+
console.log(" Falling back to summary comment...");
|
|
522
|
+
const fallbackResp = apiRequest("POST", `/repos/${repo}/issues/${args.pr}/comments`, args.token, {
|
|
523
|
+
body: buildReviewSummary(result),
|
|
524
|
+
});
|
|
525
|
+
if (fallbackResp.status === 201 || fallbackResp.status === 200) {
|
|
526
|
+
console.log(" ✅ Summary comment posted");
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
console.error(" ❌ Failed to post review. Check permissions.");
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
console.log(" ✅ No findings to report — PR looks clean!");
|
|
535
|
+
}
|
|
536
|
+
console.log("");
|
|
537
|
+
process.exit(result.approved ? 0 : 1);
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges tune` — Analyze your project and suggest optimal .judgesrc.json configuration.
|
|
3
|
+
*
|
|
4
|
+
* Runs an initial evaluation on a sample of project files, then recommends:
|
|
5
|
+
* - Which preset best fits your project
|
|
6
|
+
* - Rules to disable based on consistent FP patterns
|
|
7
|
+
* - Severity overrides for noisy rules
|
|
8
|
+
* - Framework-specific settings
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* judges tune # Analyze current directory
|
|
12
|
+
* judges tune --dir ./src # Analyze specific directory
|
|
13
|
+
* judges tune --apply # Write .judgesrc.json automatically
|
|
14
|
+
* judges tune --max-files 20 # Limit sample size
|
|
15
|
+
*/
|
|
16
|
+
interface TuneArgs {
|
|
17
|
+
dir: string;
|
|
18
|
+
apply: boolean;
|
|
19
|
+
maxFiles: number;
|
|
20
|
+
verbose: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseTuneArgs(argv: string[]): TuneArgs;
|
|
23
|
+
export declare function runTune(argv: string[]): void;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=tune.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tune.d.ts","sourceRoot":"","sources":["../../src/commands/tune.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,UAAU,QAAQ;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAoQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAkCtD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkI5C"}
|