@kevinrabun/judges 3.103.0 → 3.104.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-cross-file-link.d.ts +2 -0
  6. package/dist/commands/finding-cross-file-link.d.ts.map +1 -0
  7. package/dist/commands/finding-cross-file-link.js +102 -0
  8. package/dist/commands/finding-cross-file-link.js.map +1 -0
  9. package/dist/commands/finding-hotspot-detect.d.ts +2 -0
  10. package/dist/commands/finding-hotspot-detect.d.ts.map +1 -0
  11. package/dist/commands/finding-hotspot-detect.js +121 -0
  12. package/dist/commands/finding-hotspot-detect.js.map +1 -0
  13. package/dist/commands/finding-similar-match.d.ts +2 -0
  14. package/dist/commands/finding-similar-match.d.ts.map +1 -0
  15. package/dist/commands/finding-similar-match.js +113 -0
  16. package/dist/commands/finding-similar-match.js.map +1 -0
  17. package/dist/commands/review-code-health-score.d.ts +2 -0
  18. package/dist/commands/review-code-health-score.d.ts.map +1 -0
  19. package/dist/commands/review-code-health-score.js +101 -0
  20. package/dist/commands/review-code-health-score.js.map +1 -0
  21. package/dist/commands/review-focus-area.d.ts +2 -0
  22. package/dist/commands/review-focus-area.d.ts.map +1 -0
  23. package/dist/commands/review-focus-area.js +97 -0
  24. package/dist/commands/review-focus-area.js.map +1 -0
  25. package/dist/commands/review-pr-size-check.d.ts +2 -0
  26. package/dist/commands/review-pr-size-check.d.ts.map +1 -0
  27. package/dist/commands/review-pr-size-check.js +99 -0
  28. package/dist/commands/review-pr-size-check.js.map +1 -0
  29. package/dist/commands/review-team-analytics.d.ts +2 -0
  30. package/dist/commands/review-team-analytics.d.ts.map +1 -0
  31. package/dist/commands/review-team-analytics.js +95 -0
  32. package/dist/commands/review-team-analytics.js.map +1 -0
  33. package/dist/commands/review-template-suggest.d.ts +2 -0
  34. package/dist/commands/review-template-suggest.d.ts.map +1 -0
  35. package/dist/commands/review-template-suggest.js +120 -0
  36. package/dist/commands/review-template-suggest.js.map +1 -0
  37. package/dist/commands/review-velocity-track.d.ts +2 -0
  38. package/dist/commands/review-velocity-track.d.ts.map +1 -0
  39. package/dist/commands/review-velocity-track.js +95 -0
  40. package/dist/commands/review-velocity-track.js.map +1 -0
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -0,0 +1,2 @@
1
+ export declare function runFindingCrossFileLink(argv: string[]): void;
2
+ //# sourceMappingURL=finding-cross-file-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-cross-file-link.d.ts","sourceRoot":"","sources":["../../src/commands/finding-cross-file-link.ts"],"names":[],"mappings":"AA4EA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsD5D"}
@@ -0,0 +1,102 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ function linkCrossFile(findings) {
4
+ const links = [];
5
+ const ruleGroups = new Map();
6
+ for (const f of findings) {
7
+ const prefix = f.ruleId.split("-").slice(0, 2).join("-");
8
+ const group = ruleGroups.get(prefix);
9
+ if (group !== undefined) {
10
+ group.push(f);
11
+ }
12
+ else {
13
+ ruleGroups.set(prefix, [f]);
14
+ }
15
+ }
16
+ for (const [prefix, group] of ruleGroups) {
17
+ if (group.length < 2)
18
+ continue;
19
+ const uniqueRules = [...new Set(group.map((f) => f.ruleId))];
20
+ const severities = group.map((f) => f.severity);
21
+ const highestSeverity = severities.includes("critical")
22
+ ? "critical"
23
+ : severities.includes("high")
24
+ ? "high"
25
+ : severities.includes("medium")
26
+ ? "medium"
27
+ : "low";
28
+ let pattern;
29
+ if (uniqueRules.length === 1) {
30
+ pattern = "Same rule appearing in multiple locations";
31
+ }
32
+ else {
33
+ pattern = "Related rules from same family";
34
+ }
35
+ let recommendation;
36
+ if (group.length >= 5) {
37
+ recommendation = "Systemic issue — consider a shared utility or design pattern";
38
+ }
39
+ else if (uniqueRules.length > 1) {
40
+ recommendation = "Cross-cutting concern — review holistically";
41
+ }
42
+ else {
43
+ recommendation = "Repeated pattern — consider abstracting";
44
+ }
45
+ links.push({
46
+ ruleId: prefix,
47
+ severity: highestSeverity,
48
+ instances: group.length,
49
+ relatedRules: uniqueRules,
50
+ pattern,
51
+ recommendation,
52
+ });
53
+ }
54
+ links.sort((a, b) => b.instances - a.instances);
55
+ return links;
56
+ }
57
+ export function runFindingCrossFileLink(argv) {
58
+ if (argv.includes("--help") || argv.includes("-h")) {
59
+ console.log(`Usage: judges finding-cross-file-link [options]
60
+
61
+ Link related findings across files.
62
+
63
+ Options:
64
+ --report <path> Path to verdict JSON file
65
+ --format <fmt> Output format: table (default) or json
66
+ -h, --help Show this help message`);
67
+ return;
68
+ }
69
+ const formatIdx = argv.indexOf("--format");
70
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
71
+ const reportIdx = argv.indexOf("--report");
72
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
73
+ ? join(process.cwd(), argv[reportIdx + 1])
74
+ : join(process.cwd(), ".judges", "last-verdict.json");
75
+ if (!existsSync(reportPath)) {
76
+ console.log(`No report found at: ${reportPath}`);
77
+ console.log("Run a review first or provide --report.");
78
+ return;
79
+ }
80
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
81
+ const findings = data.findings ?? [];
82
+ if (findings.length === 0) {
83
+ console.log("No findings to link.");
84
+ return;
85
+ }
86
+ const links = linkCrossFile(findings);
87
+ if (format === "json") {
88
+ console.log(JSON.stringify(links, null, 2));
89
+ return;
90
+ }
91
+ console.log("\n=== Cross-File Finding Links ===\n");
92
+ console.log(`Findings analyzed: ${findings.length}`);
93
+ console.log(`Cross-file groups: ${links.length}\n`);
94
+ for (const link of links) {
95
+ console.log(`[${link.severity.toUpperCase()}] ${link.ruleId} — ${link.instances} instances`);
96
+ console.log(` Pattern: ${link.pattern}`);
97
+ console.log(` Rules: ${link.relatedRules.join(", ")}`);
98
+ console.log(` → ${link.recommendation}`);
99
+ console.log();
100
+ }
101
+ }
102
+ //# sourceMappingURL=finding-cross-file-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-cross-file-link.js","sourceRoot":"","sources":["../../src/commands/finding-cross-file-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runFindingHotspotDetect(argv: string[]): void;
2
+ //# sourceMappingURL=finding-hotspot-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-hotspot-detect.d.ts","sourceRoot":"","sources":["../../src/commands/finding-hotspot-detect.ts"],"names":[],"mappings":"AAoEA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqF5D"}
@@ -0,0 +1,121 @@
1
+ import { readFileSync, existsSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ function detectHotspots(allFindings) {
4
+ const ruleGroups = new Map();
5
+ for (const f of allFindings) {
6
+ const group = ruleGroups.get(f.ruleId);
7
+ if (group !== undefined) {
8
+ group.push(f);
9
+ }
10
+ else {
11
+ ruleGroups.set(f.ruleId, [f]);
12
+ }
13
+ }
14
+ const hotspots = [];
15
+ for (const [ruleId, findings] of ruleGroups) {
16
+ if (findings.length < 2)
17
+ continue;
18
+ const lines = [];
19
+ for (const f of findings) {
20
+ if (f.lineNumbers !== undefined) {
21
+ lines.push(...f.lineNumbers);
22
+ }
23
+ }
24
+ const avgConf = findings.reduce((sum, f) => sum + (f.confidence ?? 0.5), 0) / findings.length;
25
+ const uniqueLines = [...new Set(lines)].sort((a, b) => a - b);
26
+ let recommendation;
27
+ if (findings.length >= 5) {
28
+ recommendation = "Critical hotspot — prioritize refactoring";
29
+ }
30
+ else if (findings.length >= 3) {
31
+ recommendation = "Frequent issue — add targeted tests";
32
+ }
33
+ else {
34
+ recommendation = "Recurring pattern — monitor";
35
+ }
36
+ hotspots.push({
37
+ ruleId,
38
+ occurrences: findings.length,
39
+ severity: findings[0].severity,
40
+ avgConfidence: avgConf,
41
+ lineRanges: uniqueLines.slice(0, 20),
42
+ recommendation,
43
+ });
44
+ }
45
+ hotspots.sort((a, b) => b.occurrences - a.occurrences);
46
+ return hotspots;
47
+ }
48
+ export function runFindingHotspotDetect(argv) {
49
+ if (argv.includes("--help") || argv.includes("-h")) {
50
+ console.log(`Usage: judges finding-hotspot-detect [options]
51
+
52
+ Detect code hotspots with recurring findings.
53
+
54
+ Options:
55
+ --dir <path> Directory with verdict JSON files
56
+ --report <path> Single verdict JSON file
57
+ --min <n> Minimum occurrences to report (default: 2)
58
+ --format <fmt> Output format: table (default) or json
59
+ -h, --help Show this help message`);
60
+ return;
61
+ }
62
+ const formatIdx = argv.indexOf("--format");
63
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
64
+ const minIdx = argv.indexOf("--min");
65
+ const minOccurrences = minIdx !== -1 && argv[minIdx + 1] ? parseInt(argv[minIdx + 1], 10) : 2;
66
+ const allFindings = [];
67
+ const dirIdx = argv.indexOf("--dir");
68
+ const dirPath = dirIdx !== -1 && argv[dirIdx + 1]
69
+ ? join(process.cwd(), argv[dirIdx + 1])
70
+ : join(process.cwd(), ".judges", "history");
71
+ if (existsSync(dirPath)) {
72
+ const files = readdirSync(dirPath).filter((f) => f.endsWith(".json"));
73
+ for (const file of files) {
74
+ const data = JSON.parse(readFileSync(join(dirPath, file), "utf-8"));
75
+ if (data.findings !== undefined) {
76
+ allFindings.push(...data.findings);
77
+ }
78
+ }
79
+ }
80
+ const reportIdx = argv.indexOf("--report");
81
+ if (reportIdx !== -1 && argv[reportIdx + 1]) {
82
+ const rPath = join(process.cwd(), argv[reportIdx + 1]);
83
+ if (existsSync(rPath)) {
84
+ const data = JSON.parse(readFileSync(rPath, "utf-8"));
85
+ if (data.findings !== undefined) {
86
+ allFindings.push(...data.findings);
87
+ }
88
+ }
89
+ }
90
+ if (allFindings.length === 0) {
91
+ const defaultPath = join(process.cwd(), ".judges", "last-verdict.json");
92
+ if (existsSync(defaultPath)) {
93
+ const data = JSON.parse(readFileSync(defaultPath, "utf-8"));
94
+ if (data.findings !== undefined) {
95
+ allFindings.push(...data.findings);
96
+ }
97
+ }
98
+ }
99
+ if (allFindings.length === 0) {
100
+ console.log("No findings data found. Run reviews first.");
101
+ return;
102
+ }
103
+ const hotspots = detectHotspots(allFindings).filter((h) => h.occurrences >= minOccurrences);
104
+ if (format === "json") {
105
+ console.log(JSON.stringify(hotspots, null, 2));
106
+ return;
107
+ }
108
+ console.log("\n=== Code Hotspots ===\n");
109
+ console.log(`Total findings analyzed: ${allFindings.length}`);
110
+ console.log(`Hotspots found: ${hotspots.length}\n`);
111
+ for (const h of hotspots) {
112
+ console.log(`[${h.severity.toUpperCase()}] ${h.ruleId} — ${h.occurrences} occurrences`);
113
+ console.log(` Confidence: ${(h.avgConfidence * 100).toFixed(0)}%`);
114
+ if (h.lineRanges.length > 0) {
115
+ console.log(` Lines: ${h.lineRanges.join(", ")}`);
116
+ }
117
+ console.log(` → ${h.recommendation}`);
118
+ console.log();
119
+ }
120
+ }
121
+ //# sourceMappingURL=finding-hotspot-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-hotspot-detect.js","sourceRoot":"","sources":["../../src/commands/finding-hotspot-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runFindingSimilarMatch(argv: string[]): void;
2
+ //# sourceMappingURL=finding-similar-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-similar-match.d.ts","sourceRoot":"","sources":["../../src/commands/finding-similar-match.ts"],"names":[],"mappings":"AAsFA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiE3D"}
@@ -0,0 +1,113 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ function computeSimilarity(a, b) {
4
+ const wordsA = new Set(a
5
+ .toLowerCase()
6
+ .split(/\s+/)
7
+ .filter((w) => w.length > 2));
8
+ const wordsB = new Set(b
9
+ .toLowerCase()
10
+ .split(/\s+/)
11
+ .filter((w) => w.length > 2));
12
+ let overlap = 0;
13
+ for (const w of wordsA) {
14
+ if (wordsB.has(w))
15
+ overlap++;
16
+ }
17
+ const total = Math.max(wordsA.size, wordsB.size);
18
+ return total > 0 ? overlap / total : 0;
19
+ }
20
+ function findSimilar(findings, threshold) {
21
+ const groups = [];
22
+ const processed = new Set();
23
+ for (let i = 0; i < findings.length; i++) {
24
+ if (processed.has(i))
25
+ continue;
26
+ const anchor = findings[i];
27
+ const similar = [];
28
+ for (let j = i + 1; j < findings.length; j++) {
29
+ if (processed.has(j))
30
+ continue;
31
+ const other = findings[j];
32
+ const titleSim = computeSimilarity(anchor.title, other.title);
33
+ const descSim = computeSimilarity(anchor.description, other.description);
34
+ const combined = titleSim * 0.6 + descSim * 0.4;
35
+ if (combined >= threshold || anchor.ruleId === other.ruleId) {
36
+ processed.add(j);
37
+ similar.push({
38
+ ruleId: other.ruleId,
39
+ title: other.title,
40
+ similarity: Math.round(combined * 100),
41
+ });
42
+ }
43
+ }
44
+ processed.add(i);
45
+ if (similar.length > 0) {
46
+ groups.push({
47
+ anchor: anchor.ruleId,
48
+ anchorTitle: anchor.title,
49
+ severity: anchor.severity,
50
+ similarFindings: similar,
51
+ recommendation: similar.length >= 3
52
+ ? "Recurring pattern — consider a project-wide fix"
53
+ : "Similar findings found — review together",
54
+ });
55
+ }
56
+ }
57
+ return groups;
58
+ }
59
+ export function runFindingSimilarMatch(argv) {
60
+ if (argv.includes("--help") || argv.includes("-h")) {
61
+ console.log(`Usage: judges finding-similar-match [options]
62
+
63
+ Find similar findings across reviews.
64
+
65
+ Options:
66
+ --report <path> Path to verdict JSON file
67
+ --threshold <n> Similarity threshold 0-100 (default: 50)
68
+ --format <fmt> Output format: table (default) or json
69
+ -h, --help Show this help message`);
70
+ return;
71
+ }
72
+ const formatIdx = argv.indexOf("--format");
73
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
74
+ const threshIdx = argv.indexOf("--threshold");
75
+ const threshold = threshIdx !== -1 && argv[threshIdx + 1] ? parseInt(argv[threshIdx + 1], 10) / 100 : 0.5;
76
+ const reportIdx = argv.indexOf("--report");
77
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
78
+ ? join(process.cwd(), argv[reportIdx + 1])
79
+ : join(process.cwd(), ".judges", "last-verdict.json");
80
+ if (!existsSync(reportPath)) {
81
+ console.log(`No report found at: ${reportPath}`);
82
+ console.log("Run a review first or provide --report.");
83
+ return;
84
+ }
85
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
86
+ const findings = data.findings ?? [];
87
+ if (findings.length < 2) {
88
+ console.log("Need at least 2 findings for similarity analysis.");
89
+ return;
90
+ }
91
+ const groups = findSimilar(findings, threshold);
92
+ if (format === "json") {
93
+ console.log(JSON.stringify(groups, null, 2));
94
+ return;
95
+ }
96
+ console.log("\n=== Similar Findings ===\n");
97
+ console.log(`Analyzed: ${findings.length} findings`);
98
+ console.log(`Similar groups: ${groups.length}\n`);
99
+ if (groups.length === 0) {
100
+ console.log("No similar findings found at current threshold.");
101
+ return;
102
+ }
103
+ for (const g of groups) {
104
+ console.log(`[${g.severity.toUpperCase()}] ${g.anchor}: ${g.anchorTitle}`);
105
+ console.log(` Similar matches (${g.similarFindings.length}):`);
106
+ for (const s of g.similarFindings) {
107
+ console.log(` ${s.ruleId} (${s.similarity}% similar): ${s.title}`);
108
+ }
109
+ console.log(` → ${g.recommendation}`);
110
+ console.log();
111
+ }
112
+ }
113
+ //# sourceMappingURL=finding-similar-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-similar-match.js","sourceRoot":"","sources":["../../src/commands/finding-similar-match.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewCodeHealthScore(argv: string[]): void;
2
+ //# sourceMappingURL=review-code-health-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-code-health-score.d.ts","sourceRoot":"","sources":["../../src/commands/review-code-health-score.ts"],"names":[],"mappings":"AAgFA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+C7D"}
@@ -0,0 +1,101 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ function computeHealthScore(verdict) {
4
+ const findings = verdict.findings ?? [];
5
+ const total = findings.length;
6
+ const severityWeights = {
7
+ critical: 10,
8
+ high: 7,
9
+ medium: 4,
10
+ low: 2,
11
+ info: 0.5,
12
+ };
13
+ let severitySum = 0;
14
+ let confidenceSum = 0;
15
+ for (const f of findings) {
16
+ severitySum += severityWeights[f.severity] ?? 1;
17
+ confidenceSum += f.confidence ?? 0.5;
18
+ }
19
+ const maxSeverity = total * 10;
20
+ const severityScore = maxSeverity > 0 ? Math.max(0, 100 - (severitySum / maxSeverity) * 100) : 100;
21
+ const densityScore = total === 0 ? 100 : Math.max(0, 100 - total * 5);
22
+ const avgConfidence = total > 0 ? confidenceSum / total : 1;
23
+ const confidenceScore = avgConfidence * 100;
24
+ const passRateScore = verdict.overallVerdict === "pass" ? 100 : verdict.overallVerdict === "warning" ? 60 : 20;
25
+ const overall = Math.round(severityScore * 0.35 + densityScore * 0.25 + confidenceScore * 0.2 + passRateScore * 0.2);
26
+ let grade;
27
+ if (overall >= 90)
28
+ grade = "A";
29
+ else if (overall >= 80)
30
+ grade = "B";
31
+ else if (overall >= 70)
32
+ grade = "C";
33
+ else if (overall >= 60)
34
+ grade = "D";
35
+ else
36
+ grade = "F";
37
+ const recommendations = [];
38
+ if (severityScore < 50)
39
+ recommendations.push("Address critical/high severity findings urgently");
40
+ if (densityScore < 50)
41
+ recommendations.push("High finding density — consider breaking into smaller changes");
42
+ if (confidenceScore < 60)
43
+ recommendations.push("Low confidence findings — manual validation recommended");
44
+ if (passRateScore < 50)
45
+ recommendations.push("Review failing — resolve blockers before merge");
46
+ if (overall >= 90)
47
+ recommendations.push("Excellent code health — safe to proceed");
48
+ return {
49
+ overall,
50
+ grade,
51
+ breakdown: {
52
+ severityScore: Math.round(severityScore),
53
+ densityScore: Math.round(densityScore),
54
+ confidenceScore: Math.round(confidenceScore),
55
+ passRateScore: Math.round(passRateScore),
56
+ },
57
+ recommendations,
58
+ };
59
+ }
60
+ export function runReviewCodeHealthScore(argv) {
61
+ if (argv.includes("--help") || argv.includes("-h")) {
62
+ console.log(`Usage: judges review-code-health-score [options]
63
+
64
+ Compute aggregated code health score from review verdicts.
65
+
66
+ Options:
67
+ --report <path> Path to verdict JSON file
68
+ --format <fmt> Output format: table (default) or json
69
+ -h, --help Show this help message`);
70
+ return;
71
+ }
72
+ const formatIdx = argv.indexOf("--format");
73
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
74
+ const reportIdx = argv.indexOf("--report");
75
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
76
+ ? join(process.cwd(), argv[reportIdx + 1])
77
+ : join(process.cwd(), ".judges", "last-verdict.json");
78
+ if (!existsSync(reportPath)) {
79
+ console.log(`No report found at: ${reportPath}`);
80
+ console.log("Run a review first or provide --report.");
81
+ return;
82
+ }
83
+ const verdict = JSON.parse(readFileSync(reportPath, "utf-8"));
84
+ const health = computeHealthScore(verdict);
85
+ if (format === "json") {
86
+ console.log(JSON.stringify(health, null, 2));
87
+ return;
88
+ }
89
+ console.log("\n=== Code Health Score ===\n");
90
+ console.log(`Overall: ${health.overall}/100 (Grade: ${health.grade})\n`);
91
+ console.log("Breakdown:");
92
+ console.log(` Severity: ${health.breakdown.severityScore}/100`);
93
+ console.log(` Density: ${health.breakdown.densityScore}/100`);
94
+ console.log(` Confidence: ${health.breakdown.confidenceScore}/100`);
95
+ console.log(` Pass Rate: ${health.breakdown.passRateScore}/100`);
96
+ console.log("\nRecommendations:");
97
+ for (const r of health.recommendations) {
98
+ console.log(` → ${r}`);
99
+ }
100
+ }
101
+ //# sourceMappingURL=review-code-health-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-code-health-score.js","sourceRoot":"","sources":["../../src/commands/review-code-health-score.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAqB5B,SAAS,kBAAkB,CAAC,OAAwB;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE9B,MAAM,eAAe,GAA2B;QAC9C,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,GAAG;KACV,CAAC;IAEF,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,WAAW,IAAI,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,aAAa,IAAI,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC;IACvC,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,GAAG,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAEnG,MAAM,YAAY,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;IAEtE,MAAM,aAAa,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,aAAa,GAAG,GAAG,CAAC;IAE5C,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/G,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI,GAAG,eAAe,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,CAAC,CAAC;IAErH,IAAI,KAAa,CAAC;IAClB,IAAI,OAAO,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SAC1B,IAAI,OAAO,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SAC/B,IAAI,OAAO,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SAC/B,IAAI,OAAO,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;;QAC/B,KAAK,GAAG,GAAG,CAAC;IAEjB,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,aAAa,GAAG,EAAE;QAAE,eAAe,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACjG,IAAI,YAAY,GAAG,EAAE;QAAE,eAAe,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC7G,IAAI,eAAe,GAAG,EAAE;QAAE,eAAe,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAC1G,IAAI,aAAa,GAAG,EAAE;QAAE,eAAe,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC/F,IAAI,OAAO,IAAI,EAAE;QAAE,eAAe,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAEnF,OAAO;QACL,OAAO;QACP,KAAK;QACL,SAAS,EAAE;YACT,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YACxC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YACtC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;YAC5C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;SACzC;QACD,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAc;IACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;4CAO4B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEvF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GACd,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAoB,CAAC;IACjF,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,gBAAgB,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,aAAa,MAAM,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,YAAY,MAAM,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,eAAe,MAAM,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,aAAa,MAAM,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewFocusArea(argv: string[]): void;
2
+ //# sourceMappingURL=review-focus-area.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-focus-area.d.ts","sourceRoot":"","sources":["../../src/commands/review-focus-area.ts"],"names":[],"mappings":"AAyEA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqDvD"}
@@ -0,0 +1,97 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ function identifyFocusAreas(findings) {
4
+ const areas = [];
5
+ const rulesByDomain = new Map();
6
+ for (const f of findings) {
7
+ const domain = f.ruleId.split("-")[0];
8
+ const group = rulesByDomain.get(domain);
9
+ if (group !== undefined) {
10
+ group.push(f);
11
+ }
12
+ else {
13
+ rulesByDomain.set(domain, [f]);
14
+ }
15
+ }
16
+ for (const [domain, domainFindings] of rulesByDomain) {
17
+ const severities = domainFindings.map((f) => f.severity);
18
+ const hasCritical = severities.includes("critical");
19
+ const hasHigh = severities.includes("high");
20
+ let priority;
21
+ let description;
22
+ if (hasCritical) {
23
+ priority = "critical";
24
+ description = `Critical findings in ${domain} — immediate attention required`;
25
+ }
26
+ else if (hasHigh) {
27
+ priority = "high";
28
+ description = `High-severity issues in ${domain} — review carefully`;
29
+ }
30
+ else if (domainFindings.length >= 5) {
31
+ priority = "medium";
32
+ description = `Multiple ${domain} findings — pattern may indicate deeper issue`;
33
+ }
34
+ else {
35
+ priority = "low";
36
+ description = `Minor ${domain} findings — review when time permits`;
37
+ }
38
+ const topSeverity = hasCritical ? "critical" : hasHigh ? "high" : severities.includes("medium") ? "medium" : "low";
39
+ areas.push({
40
+ area: domain,
41
+ priority,
42
+ findingCount: domainFindings.length,
43
+ topSeverity,
44
+ description,
45
+ });
46
+ }
47
+ areas.sort((a, b) => {
48
+ const order = { critical: 0, high: 1, medium: 2, low: 3 };
49
+ return (order[a.priority] ?? 4) - (order[b.priority] ?? 4);
50
+ });
51
+ return areas;
52
+ }
53
+ export function runReviewFocusArea(argv) {
54
+ if (argv.includes("--help") || argv.includes("-h")) {
55
+ console.log(`Usage: judges review-focus-area [options]
56
+
57
+ Identify focus areas for reviewers.
58
+
59
+ Options:
60
+ --report <path> Path to verdict JSON file
61
+ --format <fmt> Output format: table (default) or json
62
+ -h, --help Show this help message`);
63
+ return;
64
+ }
65
+ const formatIdx = argv.indexOf("--format");
66
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
67
+ const reportIdx = argv.indexOf("--report");
68
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
69
+ ? join(process.cwd(), argv[reportIdx + 1])
70
+ : join(process.cwd(), ".judges", "last-verdict.json");
71
+ if (!existsSync(reportPath)) {
72
+ console.log(`No report found at: ${reportPath}`);
73
+ console.log("Run a review first or provide --report.");
74
+ return;
75
+ }
76
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
77
+ const findings = data.findings ?? [];
78
+ if (findings.length === 0) {
79
+ console.log("No findings — no focus areas needed.");
80
+ return;
81
+ }
82
+ const areas = identifyFocusAreas(findings);
83
+ if (format === "json") {
84
+ console.log(JSON.stringify(areas, null, 2));
85
+ return;
86
+ }
87
+ console.log("\n=== Review Focus Areas ===\n");
88
+ console.log(`Total findings: ${findings.length}`);
89
+ console.log(`Focus areas: ${areas.length}\n`);
90
+ for (const area of areas) {
91
+ console.log(`[${area.priority.toUpperCase()}] ${area.area} — ${area.findingCount} finding(s)`);
92
+ console.log(` Top severity: ${area.topSeverity}`);
93
+ console.log(` ${area.description}`);
94
+ console.log();
95
+ }
96
+ }
97
+ //# sourceMappingURL=review-focus-area.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-focus-area.js","sourceRoot":"","sources":["../../src/commands/review-focus-area.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewPrSizeCheck(argv: string[]): void;
2
+ //# sourceMappingURL=review-pr-size-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-pr-size-check.d.ts","sourceRoot":"","sources":["../../src/commands/review-pr-size-check.ts"],"names":[],"mappings":"AAyEA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmDzD"}