@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.
Files changed (105) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +37 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/benchmark.d.ts.map +1 -1
  6. package/dist/commands/benchmark.js +556 -0
  7. package/dist/commands/benchmark.js.map +1 -1
  8. package/dist/commands/diff.d.ts.map +1 -1
  9. package/dist/commands/diff.js +17 -1
  10. package/dist/commands/diff.js.map +1 -1
  11. package/dist/commands/review.d.ts +37 -0
  12. package/dist/commands/review.d.ts.map +1 -0
  13. package/dist/commands/review.js +539 -0
  14. package/dist/commands/review.js.map +1 -0
  15. package/dist/commands/tune.d.ts +25 -0
  16. package/dist/commands/tune.d.ts.map +1 -0
  17. package/dist/commands/tune.js +408 -0
  18. package/dist/commands/tune.js.map +1 -0
  19. package/dist/evaluators/accessibility.d.ts.map +1 -1
  20. package/dist/evaluators/accessibility.js +5 -1
  21. package/dist/evaluators/accessibility.js.map +1 -1
  22. package/dist/evaluators/ai-code-safety.d.ts.map +1 -1
  23. package/dist/evaluators/ai-code-safety.js +6 -1
  24. package/dist/evaluators/ai-code-safety.js.map +1 -1
  25. package/dist/evaluators/authentication.d.ts.map +1 -1
  26. package/dist/evaluators/authentication.js +5 -1
  27. package/dist/evaluators/authentication.js.map +1 -1
  28. package/dist/evaluators/ci-cd.d.ts.map +1 -1
  29. package/dist/evaluators/ci-cd.js +6 -2
  30. package/dist/evaluators/ci-cd.js.map +1 -1
  31. package/dist/evaluators/cloud-readiness.d.ts.map +1 -1
  32. package/dist/evaluators/cloud-readiness.js +12 -3
  33. package/dist/evaluators/cloud-readiness.js.map +1 -1
  34. package/dist/evaluators/compliance.d.ts.map +1 -1
  35. package/dist/evaluators/compliance.js +5 -1
  36. package/dist/evaluators/compliance.js.map +1 -1
  37. package/dist/evaluators/configuration-management.d.ts.map +1 -1
  38. package/dist/evaluators/configuration-management.js +5 -1
  39. package/dist/evaluators/configuration-management.js.map +1 -1
  40. package/dist/evaluators/cost-effectiveness.d.ts.map +1 -1
  41. package/dist/evaluators/cost-effectiveness.js +5 -3
  42. package/dist/evaluators/cost-effectiveness.js.map +1 -1
  43. package/dist/evaluators/cybersecurity.d.ts.map +1 -1
  44. package/dist/evaluators/cybersecurity.js +5 -1
  45. package/dist/evaluators/cybersecurity.js.map +1 -1
  46. package/dist/evaluators/data-security.d.ts.map +1 -1
  47. package/dist/evaluators/data-security.js +12 -1
  48. package/dist/evaluators/data-security.js.map +1 -1
  49. package/dist/evaluators/data-sovereignty.d.ts.map +1 -1
  50. package/dist/evaluators/data-sovereignty.js +5 -1
  51. package/dist/evaluators/data-sovereignty.js.map +1 -1
  52. package/dist/evaluators/database.d.ts.map +1 -1
  53. package/dist/evaluators/database.js +11 -1
  54. package/dist/evaluators/database.js.map +1 -1
  55. package/dist/evaluators/error-handling.d.ts.map +1 -1
  56. package/dist/evaluators/error-handling.js +2 -2
  57. package/dist/evaluators/error-handling.js.map +1 -1
  58. package/dist/evaluators/ethics-bias.d.ts.map +1 -1
  59. package/dist/evaluators/ethics-bias.js +5 -1
  60. package/dist/evaluators/ethics-bias.js.map +1 -1
  61. package/dist/evaluators/false-positive-review.js +4 -4
  62. package/dist/evaluators/false-positive-review.js.map +1 -1
  63. package/dist/evaluators/iac-security.d.ts.map +1 -1
  64. package/dist/evaluators/iac-security.js +14 -2
  65. package/dist/evaluators/iac-security.js.map +1 -1
  66. package/dist/evaluators/internationalization.d.ts.map +1 -1
  67. package/dist/evaluators/internationalization.js +5 -1
  68. package/dist/evaluators/internationalization.js.map +1 -1
  69. package/dist/evaluators/logging-privacy.d.ts.map +1 -1
  70. package/dist/evaluators/logging-privacy.js +8 -4
  71. package/dist/evaluators/logging-privacy.js.map +1 -1
  72. package/dist/evaluators/maintainability.d.ts.map +1 -1
  73. package/dist/evaluators/maintainability.js +37 -28
  74. package/dist/evaluators/maintainability.js.map +1 -1
  75. package/dist/evaluators/observability.js +2 -2
  76. package/dist/evaluators/observability.js.map +1 -1
  77. package/dist/evaluators/performance.d.ts.map +1 -1
  78. package/dist/evaluators/performance.js +9 -5
  79. package/dist/evaluators/performance.js.map +1 -1
  80. package/dist/evaluators/portability.d.ts.map +1 -1
  81. package/dist/evaluators/portability.js +33 -11
  82. package/dist/evaluators/portability.js.map +1 -1
  83. package/dist/evaluators/reliability.js +2 -2
  84. package/dist/evaluators/reliability.js.map +1 -1
  85. package/dist/evaluators/scalability.d.ts.map +1 -1
  86. package/dist/evaluators/scalability.js +5 -3
  87. package/dist/evaluators/scalability.js.map +1 -1
  88. package/dist/evaluators/shared.d.ts +34 -0
  89. package/dist/evaluators/shared.d.ts.map +1 -1
  90. package/dist/evaluators/shared.js +60 -0
  91. package/dist/evaluators/shared.js.map +1 -1
  92. package/dist/evaluators/software-practices.js +2 -2
  93. package/dist/evaluators/software-practices.js.map +1 -1
  94. package/dist/finding-lifecycle.d.ts +93 -0
  95. package/dist/finding-lifecycle.d.ts.map +1 -0
  96. package/dist/finding-lifecycle.js +214 -0
  97. package/dist/finding-lifecycle.js.map +1 -0
  98. package/dist/patches/index.d.ts.map +1 -1
  99. package/dist/patches/index.js +127 -0
  100. package/dist/patches/index.js.map +1 -1
  101. package/dist/presets.d.ts.map +1 -1
  102. package/dist/presets.js +103 -0
  103. package/dist/presets.js.map +1 -1
  104. package/package.json +1 -1
  105. 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"}