@kevinrabun/judges 3.81.0 → 3.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +63 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-age-tracker.d.ts +8 -0
  6. package/dist/commands/finding-age-tracker.d.ts.map +1 -0
  7. package/dist/commands/finding-age-tracker.js +153 -0
  8. package/dist/commands/finding-age-tracker.js.map +1 -0
  9. package/dist/commands/finding-duplicate-rule.d.ts +5 -0
  10. package/dist/commands/finding-duplicate-rule.d.ts.map +1 -0
  11. package/dist/commands/finding-duplicate-rule.js +104 -0
  12. package/dist/commands/finding-duplicate-rule.js.map +1 -0
  13. package/dist/commands/finding-line-blame.d.ts +8 -0
  14. package/dist/commands/finding-line-blame.d.ts.map +1 -0
  15. package/dist/commands/finding-line-blame.js +133 -0
  16. package/dist/commands/finding-line-blame.js.map +1 -0
  17. package/dist/commands/finding-summary-digest.d.ts +8 -0
  18. package/dist/commands/finding-summary-digest.d.ts.map +1 -0
  19. package/dist/commands/finding-summary-digest.js +146 -0
  20. package/dist/commands/finding-summary-digest.js.map +1 -0
  21. package/dist/commands/review-code-owner.d.ts +8 -0
  22. package/dist/commands/review-code-owner.d.ts.map +1 -0
  23. package/dist/commands/review-code-owner.js +165 -0
  24. package/dist/commands/review-code-owner.js.map +1 -0
  25. package/dist/commands/review-export-pdf.d.ts +8 -0
  26. package/dist/commands/review-export-pdf.d.ts.map +1 -0
  27. package/dist/commands/review-export-pdf.js +132 -0
  28. package/dist/commands/review-export-pdf.js.map +1 -0
  29. package/dist/commands/review-parallel-files.d.ts +8 -0
  30. package/dist/commands/review-parallel-files.d.ts.map +1 -0
  31. package/dist/commands/review-parallel-files.js +135 -0
  32. package/dist/commands/review-parallel-files.js.map +1 -0
  33. package/dist/commands/review-scope-lock.d.ts +8 -0
  34. package/dist/commands/review-scope-lock.d.ts.map +1 -0
  35. package/dist/commands/review-scope-lock.js +139 -0
  36. package/dist/commands/review-scope-lock.js.map +1 -0
  37. package/dist/commands/review-watch-mode.d.ts +8 -0
  38. package/dist/commands/review-watch-mode.d.ts.map +1 -0
  39. package/dist/commands/review-watch-mode.js +133 -0
  40. package/dist/commands/review-watch-mode.js.map +1 -0
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Review-code-owner — Map findings to CODEOWNERS entries.
3
+ *
4
+ * Cross-references findings with CODEOWNERS file to identify
5
+ * responsible teams/individuals for each finding.
6
+ */
7
+ import { readFileSync, existsSync } from "fs";
8
+ import { join } from "path";
9
+ // ─── Helpers ────────────────────────────────────────────────────────────────
10
+ function parseCodeowners(content) {
11
+ const rules = [];
12
+ for (const line of content.split("\n")) {
13
+ const trimmed = line.trim();
14
+ if (!trimmed || trimmed.startsWith("#"))
15
+ continue;
16
+ const parts = trimmed.split(/\s+/);
17
+ if (parts.length >= 2) {
18
+ rules.push({ pattern: parts[0], owners: parts.slice(1) });
19
+ }
20
+ }
21
+ return rules;
22
+ }
23
+ function findCodeownersFile() {
24
+ const candidates = [
25
+ join(process.cwd(), "CODEOWNERS"),
26
+ join(process.cwd(), ".github", "CODEOWNERS"),
27
+ join(process.cwd(), "docs", "CODEOWNERS"),
28
+ ];
29
+ for (const c of candidates) {
30
+ if (existsSync(c))
31
+ return c;
32
+ }
33
+ return null;
34
+ }
35
+ function matchPattern(filePath, pattern) {
36
+ if (pattern === "*")
37
+ return true;
38
+ if (pattern.endsWith("/"))
39
+ return filePath.startsWith(pattern) || filePath.includes("/" + pattern);
40
+ if (pattern.startsWith("*."))
41
+ return filePath.endsWith(pattern.slice(1));
42
+ if (pattern.includes("*")) {
43
+ const prefix = pattern.split("*")[0];
44
+ return filePath.startsWith(prefix) || filePath.includes(prefix);
45
+ }
46
+ return filePath.includes(pattern);
47
+ }
48
+ function inferFilePath(title) {
49
+ const match = title.match(/in\s+[`']?(\S+\.\w{1,5})[`']?/i);
50
+ return match ? match[1] : "";
51
+ }
52
+ // ─── CLI ────────────────────────────────────────────────────────────────────
53
+ export function runReviewCodeOwner(argv) {
54
+ const verdictIdx = argv.indexOf("--verdict");
55
+ const ownersIdx = argv.indexOf("--owners");
56
+ const formatIdx = argv.indexOf("--format");
57
+ const verdictPath = verdictIdx >= 0 ? argv[verdictIdx + 1] : undefined;
58
+ const ownersPath = ownersIdx >= 0 ? argv[ownersIdx + 1] : findCodeownersFile();
59
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
60
+ if (argv.includes("--help") || argv.includes("-h")) {
61
+ console.log(`
62
+ judges review-code-owner — Map findings to CODEOWNERS
63
+
64
+ Usage:
65
+ judges review-code-owner --verdict <verdict.json> [--owners <CODEOWNERS>]
66
+ [--format table|json]
67
+
68
+ Options:
69
+ --verdict <path> Path to verdict JSON file (required)
70
+ --owners <path> Path to CODEOWNERS file (auto-detected)
71
+ --format <fmt> Output format: table (default), json
72
+ --help, -h Show this help
73
+ `);
74
+ return;
75
+ }
76
+ if (!verdictPath) {
77
+ console.error("Error: --verdict required");
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ if (!existsSync(verdictPath)) {
82
+ console.error(`Error: verdict not found: ${verdictPath}`);
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ if (!ownersPath) {
87
+ console.error("Error: CODEOWNERS file not found. Use --owners to specify.");
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ if (!existsSync(ownersPath)) {
92
+ console.error(`Error: CODEOWNERS not found: ${ownersPath}`);
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ let verdict;
97
+ try {
98
+ verdict = JSON.parse(readFileSync(verdictPath, "utf-8"));
99
+ }
100
+ catch {
101
+ console.error("Error: invalid verdict JSON");
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ const rules = parseCodeowners(readFileSync(ownersPath, "utf-8"));
106
+ const results = [];
107
+ for (const f of verdict.findings) {
108
+ const filePath = inferFilePath(f.title);
109
+ let matched = false;
110
+ // Match against CODEOWNERS rules (last match wins, per GitHub convention)
111
+ for (let i = rules.length - 1; i >= 0; i--) {
112
+ if (filePath && matchPattern(filePath, rules[i].pattern)) {
113
+ results.push({
114
+ ruleId: f.ruleId,
115
+ title: f.title,
116
+ severity: f.severity || "medium",
117
+ owners: rules[i].owners,
118
+ matchedPattern: rules[i].pattern,
119
+ });
120
+ matched = true;
121
+ break;
122
+ }
123
+ }
124
+ if (!matched) {
125
+ // Check for wildcard default owner
126
+ const defaultRule = rules.find((r) => r.pattern === "*");
127
+ results.push({
128
+ ruleId: f.ruleId,
129
+ title: f.title,
130
+ severity: f.severity || "medium",
131
+ owners: defaultRule ? defaultRule.owners : ["unassigned"],
132
+ matchedPattern: defaultRule ? "*" : "none",
133
+ });
134
+ }
135
+ }
136
+ if (format === "json") {
137
+ console.log(JSON.stringify(results, null, 2));
138
+ return;
139
+ }
140
+ console.log(`\nFinding Ownership (${results.length} findings)`);
141
+ console.log("═".repeat(70));
142
+ console.log(`${"Owner(s)".padEnd(25)} ${"Severity".padEnd(10)} Title`);
143
+ console.log("─".repeat(70));
144
+ for (const r of results) {
145
+ const owners = r.owners.join(", ");
146
+ const ownerStr = owners.length > 23 ? owners.slice(0, 23) + "…" : owners;
147
+ const sev = (r.severity || "medium").padEnd(10);
148
+ const title = r.title.length > 30 ? r.title.slice(0, 30) + "…" : r.title;
149
+ console.log(`${ownerStr.padEnd(25)} ${sev} ${title}`);
150
+ }
151
+ // Owner summary
152
+ const ownerCounts = new Map();
153
+ for (const r of results) {
154
+ for (const o of r.owners) {
155
+ ownerCounts.set(o, (ownerCounts.get(o) || 0) + 1);
156
+ }
157
+ }
158
+ console.log("\n" + "─".repeat(70));
159
+ console.log("Owner Summary:");
160
+ for (const [owner, count] of [...ownerCounts.entries()].sort((a, b) => b[1] - a[1])) {
161
+ console.log(` ${owner}: ${count} finding(s)`);
162
+ }
163
+ console.log("═".repeat(70));
164
+ }
165
+ //# sourceMappingURL=review-code-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-code-owner.js","sourceRoot":"","sources":["../../src/commands/review-code-owner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Review-export-pdf — Export review results to PDF-ready markdown.
3
+ *
4
+ * Generates a structured markdown document suitable for PDF conversion
5
+ * via external tools (pandoc, md-to-pdf, etc.).
6
+ */
7
+ export declare function runReviewExportPdf(argv: string[]): void;
8
+ //# sourceMappingURL=review-export-pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-export-pdf.d.ts","sourceRoot":"","sources":["../../src/commands/review-export-pdf.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmFH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2DvD"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Review-export-pdf — Export review results to PDF-ready markdown.
3
+ *
4
+ * Generates a structured markdown document suitable for PDF conversion
5
+ * via external tools (pandoc, md-to-pdf, etc.).
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { dirname } from "path";
9
+ // ─── Helpers ────────────────────────────────────────────────────────────────
10
+ function verdictToMarkdown(verdict, title) {
11
+ const lines = [];
12
+ lines.push(`# ${title}`);
13
+ lines.push("");
14
+ lines.push(`**Generated:** ${new Date().toISOString()}`);
15
+ lines.push(`**Verdict:** ${verdict.overallVerdict} (Score: ${verdict.overallScore})`);
16
+ lines.push(`**Findings:** ${verdict.findings.length} total`);
17
+ lines.push("");
18
+ // Summary
19
+ lines.push("## Summary");
20
+ lines.push("");
21
+ lines.push(verdict.summary);
22
+ lines.push("");
23
+ // Severity breakdown
24
+ lines.push("## Severity Breakdown");
25
+ lines.push("");
26
+ lines.push("| Severity | Count |");
27
+ lines.push("|----------|-------|");
28
+ lines.push(`| Critical | ${verdict.criticalCount} |`);
29
+ lines.push(`| High | ${verdict.highCount} |`);
30
+ const medCount = verdict.findings.filter((f) => (f.severity || "medium").toLowerCase() === "medium").length;
31
+ const lowCount = verdict.findings.filter((f) => (f.severity || "medium").toLowerCase() === "low").length;
32
+ lines.push(`| Medium | ${medCount} |`);
33
+ lines.push(`| Low | ${lowCount} |`);
34
+ lines.push("");
35
+ // Findings
36
+ lines.push("## Findings");
37
+ lines.push("");
38
+ for (let i = 0; i < verdict.findings.length; i++) {
39
+ const f = verdict.findings[i];
40
+ lines.push(`### ${i + 1}. ${f.title}`);
41
+ lines.push("");
42
+ lines.push(`- **Rule:** ${f.ruleId}`);
43
+ lines.push(`- **Severity:** ${f.severity || "medium"}`);
44
+ if (f.confidence !== undefined && f.confidence !== null) {
45
+ lines.push(`- **Confidence:** ${(f.confidence * 100).toFixed(0)}%`);
46
+ }
47
+ if (f.lineNumbers && f.lineNumbers.length > 0) {
48
+ lines.push(`- **Lines:** ${f.lineNumbers.join(", ")}`);
49
+ }
50
+ lines.push("");
51
+ lines.push(f.description);
52
+ lines.push("");
53
+ if (f.recommendation) {
54
+ lines.push(`**Recommendation:** ${f.recommendation}`);
55
+ lines.push("");
56
+ }
57
+ }
58
+ // Judge evaluations
59
+ if (verdict.evaluations && verdict.evaluations.length > 0) {
60
+ lines.push("## Judge Evaluations");
61
+ lines.push("");
62
+ lines.push("| Judge | Verdict | Score | Findings |");
63
+ lines.push("|-------|---------|-------|----------|");
64
+ for (const e of verdict.evaluations) {
65
+ lines.push(`| ${e.judgeId} | ${e.verdict} | ${e.score} | ${e.findings.length} |`);
66
+ }
67
+ lines.push("");
68
+ }
69
+ lines.push("---");
70
+ lines.push("*Report generated by Judges Panel*");
71
+ return lines.join("\n");
72
+ }
73
+ // ─── CLI ────────────────────────────────────────────────────────────────────
74
+ export function runReviewExportPdf(argv) {
75
+ const fileIdx = argv.indexOf("--file");
76
+ const outputIdx = argv.indexOf("--output");
77
+ const titleIdx = argv.indexOf("--title");
78
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
79
+ const outputPath = outputIdx >= 0 ? argv[outputIdx + 1] : undefined;
80
+ const title = titleIdx >= 0 ? argv[titleIdx + 1] : "Code Review Report";
81
+ if (argv.includes("--help") || argv.includes("-h")) {
82
+ console.log(`
83
+ judges review-export-pdf — Export review results as PDF-ready markdown
84
+
85
+ Usage:
86
+ judges review-export-pdf --file <verdict.json> [--output <report.md>]
87
+ [--title <title>]
88
+
89
+ Options:
90
+ --file <path> Path to verdict JSON file (required)
91
+ --output <path> Output markdown file (default: stdout)
92
+ --title <text> Report title (default: "Code Review Report")
93
+ --help, -h Show this help
94
+
95
+ Convert to PDF:
96
+ pandoc report.md -o report.pdf
97
+ npx md-to-pdf report.md
98
+ `);
99
+ return;
100
+ }
101
+ if (!filePath) {
102
+ console.error("Error: --file required");
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ if (!existsSync(filePath)) {
107
+ console.error(`Error: file not found: ${filePath}`);
108
+ process.exitCode = 1;
109
+ return;
110
+ }
111
+ let verdict;
112
+ try {
113
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
114
+ }
115
+ catch {
116
+ console.error("Error: invalid JSON");
117
+ process.exitCode = 1;
118
+ return;
119
+ }
120
+ const markdown = verdictToMarkdown(verdict, title);
121
+ if (outputPath) {
122
+ const d = dirname(outputPath);
123
+ if (!existsSync(d))
124
+ mkdirSync(d, { recursive: true });
125
+ writeFileSync(outputPath, markdown);
126
+ console.log(`Report written to: ${outputPath}`);
127
+ }
128
+ else {
129
+ console.log(markdown);
130
+ }
131
+ }
132
+ //# sourceMappingURL=review-export-pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-export-pdf.js","sourceRoot":"","sources":["../../src/commands/review-export-pdf.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,OAAwB,EAAE,KAAa;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,cAAc,YAAY,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC;IACtF,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,qBAAqB;IACrB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC5G,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IACzG,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,IAAI,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,WAAW;IACX,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QACpF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAEjD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAExE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;CAgBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEnD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Review-parallel-files — Review multiple files in parallel batches.
3
+ *
4
+ * Divides files into batches for concurrent review processing,
5
+ * tracking progress and aggregating results.
6
+ */
7
+ export declare function runReviewParallelFiles(argv: string[]): void;
8
+ //# sourceMappingURL=review-parallel-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-parallel-files.d.ts","sourceRoot":"","sources":["../../src/commands/review-parallel-files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsEH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgF3D"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Review-parallel-files — Review multiple files in parallel batches.
3
+ *
4
+ * Divides files into batches for concurrent review processing,
5
+ * tracking progress and aggregating results.
6
+ */
7
+ import { existsSync, readdirSync, statSync } from "fs";
8
+ import { join, extname } from "path";
9
+ // ─── Helpers ────────────────────────────────────────────────────────────────
10
+ const CODE_EXTENSIONS = new Set([
11
+ ".ts",
12
+ ".js",
13
+ ".tsx",
14
+ ".jsx",
15
+ ".py",
16
+ ".java",
17
+ ".go",
18
+ ".rs",
19
+ ".cs",
20
+ ".cpp",
21
+ ".c",
22
+ ".rb",
23
+ ".php",
24
+ ".swift",
25
+ ".kt",
26
+ ]);
27
+ function collectCodeFiles(dir, extensions) {
28
+ const results = [];
29
+ if (!existsSync(dir))
30
+ return results;
31
+ function walk(d) {
32
+ const entries = readdirSync(d);
33
+ for (const entry of entries) {
34
+ const full = join(d, String(entry));
35
+ if (String(entry).startsWith(".") || String(entry) === "node_modules")
36
+ continue;
37
+ try {
38
+ const st = statSync(full);
39
+ if (st.isDirectory())
40
+ walk(full);
41
+ else if (extensions.has(extname(String(entry))))
42
+ results.push(full);
43
+ }
44
+ catch {
45
+ /* skip */
46
+ }
47
+ }
48
+ }
49
+ walk(dir);
50
+ return results;
51
+ }
52
+ function createBatches(files, batchSize) {
53
+ const batches = [];
54
+ for (let i = 0; i < files.length; i += batchSize) {
55
+ batches.push({
56
+ batchId: batches.length + 1,
57
+ files: files.slice(i, i + batchSize),
58
+ status: "pending",
59
+ });
60
+ }
61
+ return batches;
62
+ }
63
+ // ─── CLI ────────────────────────────────────────────────────────────────────
64
+ export function runReviewParallelFiles(argv) {
65
+ const dirIdx = argv.indexOf("--dir");
66
+ const batchIdx = argv.indexOf("--batch-size");
67
+ const extIdx = argv.indexOf("--ext");
68
+ const formatIdx = argv.indexOf("--format");
69
+ const listIdx = argv.indexOf("--list");
70
+ const dir = dirIdx >= 0 ? argv[dirIdx + 1] : process.cwd();
71
+ const batchSize = batchIdx >= 0 ? parseInt(argv[batchIdx + 1], 10) : 5;
72
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
73
+ const extFilter = extIdx >= 0 ? new Set(argv[extIdx + 1].split(",").map((e) => (e.startsWith(".") ? e : `.${e}`))) : CODE_EXTENSIONS;
74
+ if (argv.includes("--help") || argv.includes("-h")) {
75
+ console.log(`
76
+ judges review-parallel-files — Batch files for parallel review
77
+
78
+ Usage:
79
+ judges review-parallel-files [--dir <path>] [--batch-size <n>]
80
+ [--ext <exts>] [--format table|json] [--list]
81
+
82
+ Options:
83
+ --dir <path> Directory to scan (default: current directory)
84
+ --batch-size <n> Files per batch (default: 5)
85
+ --ext <exts> Comma-separated extensions to include
86
+ --format <fmt> Output format: table (default), json
87
+ --list List files per batch
88
+ --help, -h Show this help
89
+ `);
90
+ return;
91
+ }
92
+ if (!existsSync(dir)) {
93
+ console.error(`Error: directory not found: ${dir}`);
94
+ process.exitCode = 1;
95
+ return;
96
+ }
97
+ const files = collectCodeFiles(dir, extFilter);
98
+ if (files.length === 0) {
99
+ console.log("No code files found.");
100
+ return;
101
+ }
102
+ const batches = createBatches(files, batchSize);
103
+ if (format === "json") {
104
+ console.log(JSON.stringify({ totalFiles: files.length, batchSize, batches }, null, 2));
105
+ return;
106
+ }
107
+ console.log(`\nParallel Review Plan`);
108
+ console.log("═".repeat(60));
109
+ console.log(`Directory: ${dir}`);
110
+ console.log(`Files: ${files.length}`);
111
+ console.log(`Batch size: ${batchSize}`);
112
+ console.log(`Batches: ${batches.length}`);
113
+ console.log("─".repeat(60));
114
+ for (const b of batches) {
115
+ console.log(`\nBatch ${b.batchId} (${b.files.length} files)`);
116
+ if (listIdx >= 0) {
117
+ for (const f of b.files)
118
+ console.log(` ${f}`);
119
+ }
120
+ }
121
+ // Extension breakdown
122
+ const extCounts = new Map();
123
+ for (const f of files) {
124
+ const ext = extname(f);
125
+ extCounts.set(ext, (extCounts.get(ext) || 0) + 1);
126
+ }
127
+ console.log("\n" + "─".repeat(60));
128
+ console.log("File types:");
129
+ for (const [ext, count] of [...extCounts.entries()].sort((a, b) => b[1] - a[1])) {
130
+ console.log(` ${ext}: ${count}`);
131
+ }
132
+ console.log("═".repeat(60));
133
+ console.log(`\nTo review: judges eval --file <path> for each file`);
134
+ }
135
+ //# sourceMappingURL=review-parallel-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-parallel-files.js","sourceRoot":"","sources":["../../src/commands/review-parallel-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Review-scope-lock — Lock review scope to specific files or directories.
3
+ *
4
+ * Prevents accidental review of out-of-scope code by maintaining
5
+ * a local scope configuration.
6
+ */
7
+ export declare function runReviewScopeLock(argv: string[]): void;
8
+ //# sourceMappingURL=review-scope-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-scope-lock.d.ts","sourceRoot":"","sources":["../../src/commands/review-scope-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4CH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6FvD"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Review-scope-lock — Lock review scope to specific files or directories.
3
+ *
4
+ * Prevents accidental review of out-of-scope code by maintaining
5
+ * a local scope configuration.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { dirname, join } from "path";
9
+ // ─── Helpers ────────────────────────────────────────────────────────────────
10
+ function scopeFile() {
11
+ return join(process.cwd(), ".judges", "scope-lock.json");
12
+ }
13
+ function loadScope() {
14
+ const f = scopeFile();
15
+ if (!existsSync(f))
16
+ return { includes: [], excludes: [], lockedAt: "" };
17
+ try {
18
+ return JSON.parse(readFileSync(f, "utf-8"));
19
+ }
20
+ catch {
21
+ return { includes: [], excludes: [], lockedAt: "" };
22
+ }
23
+ }
24
+ function saveScope(scope) {
25
+ const f = scopeFile();
26
+ const d = dirname(f);
27
+ if (!existsSync(d))
28
+ mkdirSync(d, { recursive: true });
29
+ writeFileSync(f, JSON.stringify(scope, null, 2));
30
+ }
31
+ function fileInScope(filePath, scope) {
32
+ if (scope.excludes.some((e) => filePath.startsWith(e) || filePath.includes(e)))
33
+ return false;
34
+ if (scope.includes.length === 0)
35
+ return true;
36
+ return scope.includes.some((inc) => filePath.startsWith(inc) || filePath.includes(inc));
37
+ }
38
+ // ─── CLI ────────────────────────────────────────────────────────────────────
39
+ export function runReviewScopeLock(argv) {
40
+ const sub = argv[0];
41
+ if (!sub || sub === "--help" || sub === "-h") {
42
+ console.log(`
43
+ judges review-scope-lock — Lock review scope
44
+
45
+ Usage:
46
+ judges review-scope-lock show
47
+ judges review-scope-lock add-include <path>
48
+ judges review-scope-lock add-exclude <path>
49
+ judges review-scope-lock remove <path>
50
+ judges review-scope-lock test <file>
51
+ judges review-scope-lock clear
52
+
53
+ Options:
54
+ --help, -h Show this help
55
+ `);
56
+ return;
57
+ }
58
+ const scope = loadScope();
59
+ if (sub === "show") {
60
+ if (scope.includes.length === 0 && scope.excludes.length === 0) {
61
+ console.log("No scope lock configured. All files are in scope.");
62
+ return;
63
+ }
64
+ console.log("\nScope Lock Configuration");
65
+ console.log("═".repeat(50));
66
+ if (scope.includes.length > 0) {
67
+ console.log("Includes:");
68
+ for (const p of scope.includes)
69
+ console.log(` + ${p}`);
70
+ }
71
+ if (scope.excludes.length > 0) {
72
+ console.log("Excludes:");
73
+ for (const p of scope.excludes)
74
+ console.log(` - ${p}`);
75
+ }
76
+ if (scope.lockedAt)
77
+ console.log(`\nLocked at: ${scope.lockedAt}`);
78
+ console.log("═".repeat(50));
79
+ }
80
+ else if (sub === "add-include") {
81
+ const path = argv[1];
82
+ if (!path) {
83
+ console.error("Error: path required");
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ if (!scope.includes.includes(path)) {
88
+ scope.includes.push(path);
89
+ scope.lockedAt = new Date().toISOString();
90
+ saveScope(scope);
91
+ }
92
+ console.log(`Added include: ${path}`);
93
+ }
94
+ else if (sub === "add-exclude") {
95
+ const path = argv[1];
96
+ if (!path) {
97
+ console.error("Error: path required");
98
+ process.exitCode = 1;
99
+ return;
100
+ }
101
+ if (!scope.excludes.includes(path)) {
102
+ scope.excludes.push(path);
103
+ scope.lockedAt = new Date().toISOString();
104
+ saveScope(scope);
105
+ }
106
+ console.log(`Added exclude: ${path}`);
107
+ }
108
+ else if (sub === "remove") {
109
+ const path = argv[1];
110
+ if (!path) {
111
+ console.error("Error: path required");
112
+ process.exitCode = 1;
113
+ return;
114
+ }
115
+ scope.includes = scope.includes.filter((p) => p !== path);
116
+ scope.excludes = scope.excludes.filter((p) => p !== path);
117
+ saveScope(scope);
118
+ console.log(`Removed: ${path}`);
119
+ }
120
+ else if (sub === "test") {
121
+ const file = argv[1];
122
+ if (!file) {
123
+ console.error("Error: file path required");
124
+ process.exitCode = 1;
125
+ return;
126
+ }
127
+ const inScope = fileInScope(file, scope);
128
+ console.log(`${file}: ${inScope ? "IN SCOPE" : "OUT OF SCOPE"}`);
129
+ }
130
+ else if (sub === "clear") {
131
+ saveScope({ includes: [], excludes: [], lockedAt: "" });
132
+ console.log("Scope lock cleared.");
133
+ }
134
+ else {
135
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
136
+ process.exitCode = 1;
137
+ }
138
+ }
139
+ //# sourceMappingURL=review-scope-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-scope-lock.js","sourceRoot":"","sources":["../../src/commands/review-scope-lock.ts"],"names":[],"mappings":"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"}