@kevinrabun/judges 3.75.0 → 3.76.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-report.d.ts +5 -0
  6. package/dist/commands/finding-age-report.d.ts.map +1 -0
  7. package/dist/commands/finding-age-report.js +155 -0
  8. package/dist/commands/finding-age-report.js.map +1 -0
  9. package/dist/commands/finding-batch-resolve.d.ts +5 -0
  10. package/dist/commands/finding-batch-resolve.d.ts.map +1 -0
  11. package/dist/commands/finding-batch-resolve.js +166 -0
  12. package/dist/commands/finding-batch-resolve.js.map +1 -0
  13. package/dist/commands/finding-snippet.d.ts +5 -0
  14. package/dist/commands/finding-snippet.d.ts.map +1 -0
  15. package/dist/commands/finding-snippet.js +103 -0
  16. package/dist/commands/finding-snippet.js.map +1 -0
  17. package/dist/commands/finding-trend.d.ts +5 -0
  18. package/dist/commands/finding-trend.d.ts.map +1 -0
  19. package/dist/commands/finding-trend.js +119 -0
  20. package/dist/commands/finding-trend.js.map +1 -0
  21. package/dist/commands/review-env-check.d.ts +5 -0
  22. package/dist/commands/review-env-check.d.ts.map +1 -0
  23. package/dist/commands/review-env-check.js +116 -0
  24. package/dist/commands/review-env-check.js.map +1 -0
  25. package/dist/commands/review-health-check.d.ts +5 -0
  26. package/dist/commands/review-health-check.d.ts.map +1 -0
  27. package/dist/commands/review-health-check.js +149 -0
  28. package/dist/commands/review-health-check.js.map +1 -0
  29. package/dist/commands/review-integration-test.d.ts +5 -0
  30. package/dist/commands/review-integration-test.d.ts.map +1 -0
  31. package/dist/commands/review-integration-test.js +146 -0
  32. package/dist/commands/review-integration-test.js.map +1 -0
  33. package/dist/commands/review-parallel-diff.d.ts +5 -0
  34. package/dist/commands/review-parallel-diff.d.ts.map +1 -0
  35. package/dist/commands/review-parallel-diff.js +147 -0
  36. package/dist/commands/review-parallel-diff.js.map +1 -0
  37. package/dist/commands/review-rule-stats.d.ts +5 -0
  38. package/dist/commands/review-rule-stats.d.ts.map +1 -0
  39. package/dist/commands/review-rule-stats.js +162 -0
  40. package/dist/commands/review-rule-stats.js.map +1 -0
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Review-env-check — Verify review environment prerequisites.
3
+ */
4
+ import { existsSync } from "fs";
5
+ import { execSync } from "child_process";
6
+ function checkNode() {
7
+ try {
8
+ const ver = process.version;
9
+ const major = parseInt(ver.slice(1).split(".")[0], 10);
10
+ if (major >= 18)
11
+ return { name: "Node.js", status: "pass", message: `${ver} (>= 18 required)` };
12
+ return { name: "Node.js", status: "fail", message: `${ver} — upgrade to >= 18` };
13
+ }
14
+ catch {
15
+ return { name: "Node.js", status: "fail", message: "Not found" };
16
+ }
17
+ }
18
+ function checkGit() {
19
+ try {
20
+ const ver = execSync("git --version", { encoding: "utf-8", timeout: 5000 }).trim();
21
+ return { name: "Git", status: "pass", message: ver };
22
+ }
23
+ catch {
24
+ return { name: "Git", status: "warn", message: "Not found (optional for diff features)" };
25
+ }
26
+ }
27
+ function checkConfigFile() {
28
+ const candidates = [".judgesrc", ".judgesrc.json", ".judgesrc.yaml", "judgesrc.config.js"];
29
+ for (const c of candidates) {
30
+ if (existsSync(c))
31
+ return { name: "Config file", status: "pass", message: c };
32
+ }
33
+ return { name: "Config file", status: "warn", message: "No config found (using defaults)" };
34
+ }
35
+ function checkCacheDir() {
36
+ if (existsSync(".judges"))
37
+ return { name: "Cache directory", status: "pass", message: ".judges/ exists" };
38
+ return { name: "Cache directory", status: "warn", message: ".judges/ not found (will be created on first run)" };
39
+ }
40
+ function checkDiskSpace() {
41
+ try {
42
+ const os = process.platform;
43
+ if (os === "win32") {
44
+ const out = execSync("wmic logicaldisk get freespace", { encoding: "utf-8", timeout: 5000 });
45
+ const lines = out
46
+ .trim()
47
+ .split("\n")
48
+ .filter((l) => l.trim().length > 0);
49
+ if (lines.length > 1) {
50
+ const free = parseInt(lines[1].trim(), 10);
51
+ const mb = Math.round(free / 1024 / 1024);
52
+ if (mb > 100)
53
+ return { name: "Disk space", status: "pass", message: `${mb} MB free` };
54
+ return { name: "Disk space", status: "warn", message: `${mb} MB free (low)` };
55
+ }
56
+ }
57
+ return { name: "Disk space", status: "pass", message: "Check skipped" };
58
+ }
59
+ catch {
60
+ return { name: "Disk space", status: "pass", message: "Check skipped" };
61
+ }
62
+ }
63
+ function checkPackageJson() {
64
+ if (existsSync("package.json"))
65
+ return { name: "package.json", status: "pass", message: "Found" };
66
+ return { name: "package.json", status: "warn", message: "Not found" };
67
+ }
68
+ // ─── CLI ────────────────────────────────────────────────────────────────────
69
+ export function runReviewEnvCheck(argv) {
70
+ if (argv.includes("--help") || argv.includes("-h")) {
71
+ console.log(`
72
+ judges review-env-check — Verify review environment prerequisites
73
+
74
+ Usage:
75
+ judges review-env-check [options]
76
+
77
+ Options:
78
+ --strict Fail on warnings too
79
+ --format json JSON output
80
+ --help, -h Show this help
81
+
82
+ Checks: Node.js version, Git, config file, cache dir, disk space, package.json.
83
+ `);
84
+ return;
85
+ }
86
+ const strict = argv.includes("--strict");
87
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
88
+ const checks = [
89
+ checkNode(),
90
+ checkGit(),
91
+ checkConfigFile(),
92
+ checkCacheDir(),
93
+ checkDiskSpace(),
94
+ checkPackageJson(),
95
+ ];
96
+ const failures = checks.filter((c) => c.status === "fail");
97
+ const warnings = checks.filter((c) => c.status === "warn");
98
+ const ok = failures.length === 0 && (!strict || warnings.length === 0);
99
+ if (format === "json") {
100
+ console.log(JSON.stringify({ checks, ok, failures: failures.length, warnings: warnings.length }, null, 2));
101
+ if (!ok)
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ console.log("\nEnvironment Check:");
106
+ console.log("═".repeat(55));
107
+ for (const c of checks) {
108
+ const icon = c.status === "pass" ? "PASS" : c.status === "warn" ? "WARN" : "FAIL";
109
+ console.log(` [${icon}] ${c.name.padEnd(18)} ${c.message}`);
110
+ }
111
+ console.log("═".repeat(55));
112
+ console.log(` Result: ${ok ? "Environment ready" : "Issues found"} (${failures.length} failures, ${warnings.length} warnings)`);
113
+ if (!ok)
114
+ process.exitCode = 1;
115
+ }
116
+ //# sourceMappingURL=review-env-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-env-check.js","sourceRoot":"","sources":["../../src/commands/review-env-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-health-check — Diagnose review system health and readiness.
3
+ */
4
+ export declare function runReviewHealthCheck(argv: string[]): void;
5
+ //# sourceMappingURL=review-health-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-health-check.d.ts","sourceRoot":"","sources":["../../src/commands/review-health-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiHH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgDzD"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Review-health-check — Diagnose review system health and readiness.
3
+ */
4
+ import { existsSync, readFileSync, statSync, readdirSync } from "fs";
5
+ // ─── Checks ─────────────────────────────────────────────────────────────────
6
+ function checkCacheHealth() {
7
+ if (!existsSync(".judges")) {
8
+ return { component: "Cache", status: "healthy", message: "No cache dir (will be created)" };
9
+ }
10
+ try {
11
+ const files = readdirSync(".judges");
12
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
13
+ const totalSize = jsonFiles.reduce((sum, f) => {
14
+ try {
15
+ return sum + statSync(`.judges/${f}`).size;
16
+ }
17
+ catch {
18
+ return sum;
19
+ }
20
+ }, 0);
21
+ const mb = (totalSize / 1024 / 1024).toFixed(1);
22
+ if (totalSize > 100 * 1024 * 1024) {
23
+ return { component: "Cache", status: "degraded", message: `${mb} MB — consider cleanup` };
24
+ }
25
+ return { component: "Cache", status: "healthy", message: `${jsonFiles.length} files, ${mb} MB` };
26
+ }
27
+ catch {
28
+ return { component: "Cache", status: "unhealthy", message: "Cannot read .judges/" };
29
+ }
30
+ }
31
+ function checkConfigHealth() {
32
+ const candidates = [".judgesrc", ".judgesrc.json", ".judgesrc.yaml"];
33
+ for (const c of candidates) {
34
+ if (existsSync(c)) {
35
+ try {
36
+ const content = readFileSync(c, "utf-8");
37
+ if (c.endsWith(".json") || c === ".judgesrc") {
38
+ JSON.parse(content);
39
+ }
40
+ return { component: "Config", status: "healthy", message: `Valid config: ${c}` };
41
+ }
42
+ catch {
43
+ return { component: "Config", status: "unhealthy", message: `Invalid config: ${c}` };
44
+ }
45
+ }
46
+ }
47
+ return { component: "Config", status: "healthy", message: "Using defaults (no config file)" };
48
+ }
49
+ function checkRuntimeHealth() {
50
+ const memUsage = process.memoryUsage();
51
+ const heapMb = Math.round(memUsage.heapUsed / 1024 / 1024);
52
+ if (heapMb > 500) {
53
+ return { component: "Runtime", status: "degraded", message: `Heap: ${heapMb} MB (high)` };
54
+ }
55
+ return { component: "Runtime", status: "healthy", message: `Node ${process.version}, heap: ${heapMb} MB` };
56
+ }
57
+ function checkDependenciesHealth() {
58
+ if (!existsSync("node_modules")) {
59
+ return { component: "Dependencies", status: "unhealthy", message: "node_modules not found" };
60
+ }
61
+ if (existsSync("package-lock.json") && existsSync("package.json")) {
62
+ try {
63
+ const pkg = JSON.parse(readFileSync("package.json", "utf-8"));
64
+ const lockContent = readFileSync("package-lock.json", "utf-8");
65
+ const lock = JSON.parse(lockContent);
66
+ if (pkg.version !== lock.version) {
67
+ return { component: "Dependencies", status: "degraded", message: "Lock file version mismatch" };
68
+ }
69
+ }
70
+ catch {
71
+ /* ignore parse errors */
72
+ }
73
+ }
74
+ return { component: "Dependencies", status: "healthy", message: "node_modules present" };
75
+ }
76
+ function checkRecentResults() {
77
+ const resultPaths = [".judges/last-results.json", "results.json", ".judges/results.json"];
78
+ for (const p of resultPaths) {
79
+ if (existsSync(p)) {
80
+ try {
81
+ const stat = statSync(p);
82
+ const ageHours = (Date.now() - stat.mtimeMs) / 1000 / 60 / 60;
83
+ if (ageHours > 168) {
84
+ return {
85
+ component: "Results",
86
+ status: "degraded",
87
+ message: `Last results ${Math.round(ageHours / 24)} days old`,
88
+ };
89
+ }
90
+ return {
91
+ component: "Results",
92
+ status: "healthy",
93
+ message: `Last run: ${stat.mtime.toISOString().slice(0, 19)}`,
94
+ };
95
+ }
96
+ catch {
97
+ /* ignore */
98
+ }
99
+ }
100
+ }
101
+ return { component: "Results", status: "healthy", message: "No previous results found" };
102
+ }
103
+ // ─── CLI ────────────────────────────────────────────────────────────────────
104
+ export function runReviewHealthCheck(argv) {
105
+ if (argv.includes("--help") || argv.includes("-h")) {
106
+ console.log(`
107
+ judges review-health-check — Diagnose review system health
108
+
109
+ Usage:
110
+ judges review-health-check [options]
111
+
112
+ Options:
113
+ --format json JSON output
114
+ --help, -h Show this help
115
+
116
+ Checks: cache, config, runtime, dependencies, recent results.
117
+ `);
118
+ return;
119
+ }
120
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
121
+ const checks = [
122
+ checkCacheHealth(),
123
+ checkConfigHealth(),
124
+ checkRuntimeHealth(),
125
+ checkDependenciesHealth(),
126
+ checkRecentResults(),
127
+ ];
128
+ const healthy = checks.filter((c) => c.status === "healthy").length;
129
+ const degraded = checks.filter((c) => c.status === "degraded").length;
130
+ const unhealthy = checks.filter((c) => c.status === "unhealthy").length;
131
+ const overall = unhealthy > 0 ? "unhealthy" : degraded > 0 ? "degraded" : "healthy";
132
+ if (format === "json") {
133
+ console.log(JSON.stringify({ overall, checks, healthy, degraded, unhealthy }, null, 2));
134
+ if (overall === "unhealthy")
135
+ process.exitCode = 1;
136
+ return;
137
+ }
138
+ console.log("\nSystem Health Check:");
139
+ console.log("═".repeat(60));
140
+ for (const c of checks) {
141
+ const icon = c.status === "healthy" ? " OK " : c.status === "degraded" ? "WARN" : "FAIL";
142
+ console.log(` [${icon}] ${c.component.padEnd(16)} ${c.message}`);
143
+ }
144
+ console.log("═".repeat(60));
145
+ console.log(` Overall: ${overall.toUpperCase()} (${healthy} ok, ${degraded} degraded, ${unhealthy} unhealthy)`);
146
+ if (overall === "unhealthy")
147
+ process.exitCode = 1;
148
+ }
149
+ //# sourceMappingURL=review-health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-health-check.js","sourceRoot":"","sources":["../../src/commands/review-health-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-integration-test — Validate review integration with CI/CD pipelines.
3
+ */
4
+ export declare function runReviewIntegrationTest(argv: string[]): void;
5
+ //# sourceMappingURL=review-integration-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-integration-test.d.ts","sourceRoot":"","sources":["../../src/commands/review-integration-test.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4GH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2D7D"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Review-integration-test — Validate review integration with CI/CD pipelines.
3
+ */
4
+ import { existsSync, readFileSync } from "fs";
5
+ // ─── Checks ─────────────────────────────────────────────────────────────────
6
+ function checkGitHubActions() {
7
+ const paths = [".github/workflows", ".github/workflows/judges.yml", ".github/workflows/judges.yaml"];
8
+ for (const p of paths) {
9
+ if (existsSync(p)) {
10
+ if (p.endsWith(".yml") || p.endsWith(".yaml")) {
11
+ try {
12
+ const content = readFileSync(p, "utf-8");
13
+ if (content.includes("judges")) {
14
+ return { name: "GitHub Actions", status: "pass", detail: `Found judges integration in ${p}` };
15
+ }
16
+ }
17
+ catch {
18
+ /* ignore */
19
+ }
20
+ }
21
+ return { name: "GitHub Actions", status: "warn", detail: `Workflows dir exists but no judges step found` };
22
+ }
23
+ }
24
+ return { name: "GitHub Actions", status: "warn", detail: "No GitHub Actions workflow found" };
25
+ }
26
+ function checkGitLabCI() {
27
+ if (existsSync(".gitlab-ci.yml")) {
28
+ try {
29
+ const content = readFileSync(".gitlab-ci.yml", "utf-8");
30
+ if (content.includes("judges")) {
31
+ return { name: "GitLab CI", status: "pass", detail: "Found judges integration" };
32
+ }
33
+ return { name: "GitLab CI", status: "warn", detail: ".gitlab-ci.yml exists but no judges step" };
34
+ }
35
+ catch {
36
+ /* ignore */
37
+ }
38
+ }
39
+ return { name: "GitLab CI", status: "warn", detail: "No .gitlab-ci.yml found" };
40
+ }
41
+ function checkPreCommit() {
42
+ const hooks = [".husky/pre-commit", ".git/hooks/pre-commit"];
43
+ for (const h of hooks) {
44
+ if (existsSync(h)) {
45
+ try {
46
+ const content = readFileSync(h, "utf-8");
47
+ if (content.includes("judges")) {
48
+ return { name: "Pre-commit hook", status: "pass", detail: `Found judges in ${h}` };
49
+ }
50
+ return { name: "Pre-commit hook", status: "warn", detail: `Hook exists at ${h} but no judges integration` };
51
+ }
52
+ catch {
53
+ /* ignore */
54
+ }
55
+ }
56
+ }
57
+ return { name: "Pre-commit hook", status: "warn", detail: "No pre-commit hook found" };
58
+ }
59
+ function checkPackageScripts() {
60
+ if (!existsSync("package.json")) {
61
+ return { name: "npm scripts", status: "warn", detail: "No package.json found" };
62
+ }
63
+ try {
64
+ const pkg = JSON.parse(readFileSync("package.json", "utf-8"));
65
+ const scripts = pkg.scripts || {};
66
+ const judgesScripts = Object.entries(scripts).filter(([, v]) => String(v).includes("judges"));
67
+ if (judgesScripts.length > 0) {
68
+ return { name: "npm scripts", status: "pass", detail: `Found: ${judgesScripts.map(([k]) => k).join(", ")}` };
69
+ }
70
+ return { name: "npm scripts", status: "warn", detail: "No judges-related npm scripts" };
71
+ }
72
+ catch {
73
+ return { name: "npm scripts", status: "warn", detail: "Could not parse package.json" };
74
+ }
75
+ }
76
+ function checkOutputFormats() {
77
+ const sarifFiles = ["results.sarif", "results.sarif.json", ".judges/results.sarif"];
78
+ for (const f of sarifFiles) {
79
+ if (existsSync(f)) {
80
+ return { name: "SARIF output", status: "pass", detail: `Found ${f}` };
81
+ }
82
+ }
83
+ return {
84
+ name: "SARIF output",
85
+ status: "warn",
86
+ detail: "No SARIF output found (use --format sarif for GitHub code scanning)",
87
+ };
88
+ }
89
+ function checkBaselineFile() {
90
+ const candidates = [".judges-baseline.json", ".judges/baseline.json", "judges-baseline.json"];
91
+ for (const c of candidates) {
92
+ if (existsSync(c))
93
+ return { name: "Baseline file", status: "pass", detail: c };
94
+ }
95
+ return { name: "Baseline file", status: "warn", detail: "No baseline file (use 'judges baseline' to set one)" };
96
+ }
97
+ // ─── CLI ────────────────────────────────────────────────────────────────────
98
+ export function runReviewIntegrationTest(argv) {
99
+ if (argv.includes("--help") || argv.includes("-h")) {
100
+ console.log(`
101
+ judges review-integration-test — Validate CI/CD integration
102
+
103
+ Usage:
104
+ judges review-integration-test [options]
105
+
106
+ Options:
107
+ --strict Fail on warnings
108
+ --format json JSON output
109
+ --help, -h Show this help
110
+
111
+ Checks: GitHub Actions, GitLab CI, pre-commit hooks, npm scripts, SARIF output, baseline.
112
+ `);
113
+ return;
114
+ }
115
+ const strict = argv.includes("--strict");
116
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
117
+ const checks = [
118
+ checkGitHubActions(),
119
+ checkGitLabCI(),
120
+ checkPreCommit(),
121
+ checkPackageScripts(),
122
+ checkOutputFormats(),
123
+ checkBaselineFile(),
124
+ ];
125
+ const failures = checks.filter((c) => c.status === "fail");
126
+ const warnings = checks.filter((c) => c.status === "warn");
127
+ const passes = checks.filter((c) => c.status === "pass");
128
+ const ok = failures.length === 0 && (!strict || warnings.length === 0);
129
+ if (format === "json") {
130
+ console.log(JSON.stringify({ checks, ok, passes: passes.length, warnings: warnings.length, failures: failures.length }, null, 2));
131
+ if (!ok)
132
+ process.exitCode = 1;
133
+ return;
134
+ }
135
+ console.log("\nCI/CD Integration Check:");
136
+ console.log("═".repeat(65));
137
+ for (const c of checks) {
138
+ const icon = c.status === "pass" ? "PASS" : c.status === "warn" ? "WARN" : "FAIL";
139
+ console.log(` [${icon}] ${c.name.padEnd(20)} ${c.detail}`);
140
+ }
141
+ console.log("═".repeat(65));
142
+ console.log(` ${passes.length} pass, ${warnings.length} warn, ${failures.length} fail — ${ok ? "Ready" : "Issues found"}`);
143
+ if (!ok)
144
+ process.exitCode = 1;
145
+ }
146
+ //# sourceMappingURL=review-integration-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-integration-test.js","sourceRoot":"","sources":["../../src/commands/review-integration-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-parallel-diff — Run reviews on multiple diff hunks in parallel.
3
+ */
4
+ export declare function runReviewParallelDiff(argv: string[]): void;
5
+ //# sourceMappingURL=review-parallel-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-parallel-diff.d.ts","sourceRoot":"","sources":["../../src/commands/review-parallel-diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+FH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8F1D"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Review-parallel-diff — Run reviews on multiple diff hunks in parallel.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Parser ─────────────────────────────────────────────────────────────────
6
+ function parseDiff(diffContent) {
7
+ const hunks = [];
8
+ const lines = diffContent.split("\n");
9
+ let currentFile = "";
10
+ let hunkStart = 0;
11
+ let hunkLines = [];
12
+ for (const line of lines) {
13
+ if (line.startsWith("+++ b/")) {
14
+ if (hunkLines.length > 0 && currentFile) {
15
+ hunks.push({
16
+ file: currentFile,
17
+ startLine: hunkStart,
18
+ endLine: hunkStart + hunkLines.length - 1,
19
+ content: hunkLines.join("\n"),
20
+ });
21
+ hunkLines = [];
22
+ }
23
+ currentFile = line.slice(6);
24
+ }
25
+ else if (line.startsWith("@@ ")) {
26
+ if (hunkLines.length > 0 && currentFile) {
27
+ hunks.push({
28
+ file: currentFile,
29
+ startLine: hunkStart,
30
+ endLine: hunkStart + hunkLines.length - 1,
31
+ content: hunkLines.join("\n"),
32
+ });
33
+ hunkLines = [];
34
+ }
35
+ const match = line.match(/@@ -\d+(?:,\d+)? \+(\d+)/);
36
+ hunkStart = match ? parseInt(match[1], 10) : 0;
37
+ }
38
+ else if (currentFile && !line.startsWith("---") && !line.startsWith("diff ")) {
39
+ hunkLines.push(line);
40
+ }
41
+ }
42
+ if (hunkLines.length > 0 && currentFile) {
43
+ hunks.push({
44
+ file: currentFile,
45
+ startLine: hunkStart,
46
+ endLine: hunkStart + hunkLines.length - 1,
47
+ content: hunkLines.join("\n"),
48
+ });
49
+ }
50
+ return hunks;
51
+ }
52
+ function analyzeHunk(hunk, results) {
53
+ const hunkFindings = results.filter((f) => {
54
+ const lines = f.lineNumbers || [];
55
+ return lines.some((l) => l >= hunk.startLine && l <= hunk.endLine);
56
+ });
57
+ return {
58
+ file: hunk.file,
59
+ startLine: hunk.startLine,
60
+ endLine: hunk.endLine,
61
+ findingCount: hunkFindings.length,
62
+ findings: hunkFindings.map((f) => ({
63
+ ruleId: f.ruleId || "unknown",
64
+ severity: f.severity || "medium",
65
+ title: f.title || "",
66
+ })),
67
+ };
68
+ }
69
+ // ─── CLI ────────────────────────────────────────────────────────────────────
70
+ export function runReviewParallelDiff(argv) {
71
+ if (argv.includes("--help") || argv.includes("-h")) {
72
+ console.log(`
73
+ judges review-parallel-diff — Review multiple diff hunks
74
+
75
+ Usage:
76
+ judges review-parallel-diff --diff <file> --results <file> [options]
77
+
78
+ Options:
79
+ --diff <path> Diff file (unified format)
80
+ --results <path> Results file with findings
81
+ --min-severity <s> Filter by minimum severity
82
+ --format json JSON output
83
+ --help, -h Show this help
84
+
85
+ Parses diff hunks and maps findings to specific changed regions.
86
+ `);
87
+ return;
88
+ }
89
+ const diffFile = argv.find((_a, i) => argv[i - 1] === "--diff");
90
+ const resultsFile = argv.find((_a, i) => argv[i - 1] === "--results");
91
+ if (!diffFile || !resultsFile) {
92
+ console.error("Error: --diff and --results required");
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ if (!existsSync(diffFile)) {
97
+ console.error(`Error: diff file not found: ${diffFile}`);
98
+ process.exitCode = 1;
99
+ return;
100
+ }
101
+ if (!existsSync(resultsFile)) {
102
+ console.error(`Error: results file not found: ${resultsFile}`);
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
107
+ const minSeverity = argv.find((_a, i) => argv[i - 1] === "--min-severity");
108
+ const sevOrder = { critical: 4, high: 3, medium: 2, low: 1, info: 0 };
109
+ const minSevLevel = minSeverity ? sevOrder[minSeverity.toLowerCase()] || 0 : 0;
110
+ const diffContent = readFileSync(diffFile, "utf-8");
111
+ const hunks = parseDiff(diffContent);
112
+ let results;
113
+ try {
114
+ const data = JSON.parse(readFileSync(resultsFile, "utf-8"));
115
+ results = Array.isArray(data) ? data : data.findings || [];
116
+ }
117
+ catch {
118
+ console.error("Error: could not parse results file");
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ if (minSeverity) {
123
+ results = results.filter((f) => (sevOrder[(f.severity || "medium").toLowerCase()] || 0) >= minSevLevel);
124
+ }
125
+ const hunkResults = hunks.map((h) => analyzeHunk(h, results));
126
+ const withFindings = hunkResults.filter((h) => h.findingCount > 0);
127
+ const totalFindings = withFindings.reduce((sum, h) => sum + h.findingCount, 0);
128
+ if (format === "json") {
129
+ console.log(JSON.stringify({ totalHunks: hunks.length, hunksWithFindings: withFindings.length, totalFindings, hunkResults }, null, 2));
130
+ return;
131
+ }
132
+ console.log(`\nParallel Diff Review: ${hunks.length} hunks, ${totalFindings} findings in ${withFindings.length} hunks`);
133
+ console.log("═".repeat(70));
134
+ for (const hr of hunkResults) {
135
+ if (hr.findingCount === 0)
136
+ continue;
137
+ console.log(`\n ${hr.file} (lines ${hr.startLine}-${hr.endLine}): ${hr.findingCount} finding(s)`);
138
+ for (const f of hr.findings) {
139
+ console.log(` [${f.severity.toUpperCase()}] ${f.ruleId}: ${f.title}`);
140
+ }
141
+ }
142
+ if (withFindings.length === 0) {
143
+ console.log(" No findings in changed regions.");
144
+ }
145
+ console.log("═".repeat(70));
146
+ }
147
+ //# sourceMappingURL=review-parallel-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-parallel-diff.js","sourceRoot":"","sources":["../../src/commands/review-parallel-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-rule-stats — Show per-rule statistics across reviews.
3
+ */
4
+ export declare function runReviewRuleStats(argv: string[]): void;
5
+ //# sourceMappingURL=review-rule-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rule-stats.d.ts","sourceRoot":"","sources":["../../src/commands/review-rule-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4JvD"}