@kevinrabun/judges 3.109.0 → 3.111.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 (78) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +126 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-auto-priority.d.ts +2 -0
  6. package/dist/commands/finding-auto-priority.d.ts.map +1 -0
  7. package/dist/commands/finding-auto-priority.js +101 -0
  8. package/dist/commands/finding-auto-priority.js.map +1 -0
  9. package/dist/commands/finding-cluster-summary.d.ts +2 -0
  10. package/dist/commands/finding-cluster-summary.d.ts.map +1 -0
  11. package/dist/commands/finding-cluster-summary.js +86 -0
  12. package/dist/commands/finding-cluster-summary.js.map +1 -0
  13. package/dist/commands/finding-context-link.d.ts +2 -0
  14. package/dist/commands/finding-context-link.d.ts.map +1 -0
  15. package/dist/commands/finding-context-link.js +95 -0
  16. package/dist/commands/finding-context-link.js.map +1 -0
  17. package/dist/commands/finding-dependency-impact.d.ts +2 -0
  18. package/dist/commands/finding-dependency-impact.d.ts.map +1 -0
  19. package/dist/commands/finding-dependency-impact.js +98 -0
  20. package/dist/commands/finding-dependency-impact.js.map +1 -0
  21. package/dist/commands/finding-effort-rank.d.ts +2 -0
  22. package/dist/commands/finding-effort-rank.d.ts.map +1 -0
  23. package/dist/commands/finding-effort-rank.js +94 -0
  24. package/dist/commands/finding-effort-rank.js.map +1 -0
  25. package/dist/commands/finding-fix-chain.d.ts +2 -0
  26. package/dist/commands/finding-fix-chain.d.ts.map +1 -0
  27. package/dist/commands/finding-fix-chain.js +79 -0
  28. package/dist/commands/finding-fix-chain.js.map +1 -0
  29. package/dist/commands/finding-owner-notify.d.ts +2 -0
  30. package/dist/commands/finding-owner-notify.d.ts.map +1 -0
  31. package/dist/commands/finding-owner-notify.js +122 -0
  32. package/dist/commands/finding-owner-notify.js.map +1 -0
  33. package/dist/commands/finding-patch-chain.d.ts +2 -0
  34. package/dist/commands/finding-patch-chain.d.ts.map +1 -0
  35. package/dist/commands/finding-patch-chain.js +91 -0
  36. package/dist/commands/finding-patch-chain.js.map +1 -0
  37. package/dist/commands/finding-resolution-workflow.d.ts +2 -0
  38. package/dist/commands/finding-resolution-workflow.d.ts.map +1 -0
  39. package/dist/commands/finding-resolution-workflow.js +92 -0
  40. package/dist/commands/finding-resolution-workflow.js.map +1 -0
  41. package/dist/commands/finding-risk-label.d.ts +2 -0
  42. package/dist/commands/finding-risk-label.d.ts.map +1 -0
  43. package/dist/commands/finding-risk-label.js +73 -0
  44. package/dist/commands/finding-risk-label.js.map +1 -0
  45. package/dist/commands/review-config-health.d.ts +2 -0
  46. package/dist/commands/review-config-health.d.ts.map +1 -0
  47. package/dist/commands/review-config-health.js +173 -0
  48. package/dist/commands/review-config-health.js.map +1 -0
  49. package/dist/commands/review-engagement-score.d.ts +2 -0
  50. package/dist/commands/review-engagement-score.d.ts.map +1 -0
  51. package/dist/commands/review-engagement-score.js +112 -0
  52. package/dist/commands/review-engagement-score.js.map +1 -0
  53. package/dist/commands/review-feedback-summary.d.ts +2 -0
  54. package/dist/commands/review-feedback-summary.d.ts.map +1 -0
  55. package/dist/commands/review-feedback-summary.js +131 -0
  56. package/dist/commands/review-feedback-summary.js.map +1 -0
  57. package/dist/commands/review-mentor-suggest.d.ts +2 -0
  58. package/dist/commands/review-mentor-suggest.d.ts.map +1 -0
  59. package/dist/commands/review-mentor-suggest.js +113 -0
  60. package/dist/commands/review-mentor-suggest.js.map +1 -0
  61. package/dist/commands/review-progress-report.d.ts +2 -0
  62. package/dist/commands/review-progress-report.d.ts.map +1 -0
  63. package/dist/commands/review-progress-report.js +96 -0
  64. package/dist/commands/review-progress-report.js.map +1 -0
  65. package/dist/commands/review-quality-baseline.d.ts +2 -0
  66. package/dist/commands/review-quality-baseline.d.ts.map +1 -0
  67. package/dist/commands/review-quality-baseline.js +135 -0
  68. package/dist/commands/review-quality-baseline.js.map +1 -0
  69. package/dist/commands/review-retrospective.d.ts +2 -0
  70. package/dist/commands/review-retrospective.d.ts.map +1 -0
  71. package/dist/commands/review-retrospective.js +119 -0
  72. package/dist/commands/review-retrospective.js.map +1 -0
  73. package/dist/commands/review-team-velocity.d.ts +2 -0
  74. package/dist/commands/review-team-velocity.d.ts.map +1 -0
  75. package/dist/commands/review-team-velocity.js +104 -0
  76. package/dist/commands/review-team-velocity.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config-health.js","sourceRoot":"","sources":["../../src/commands/review-config-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewEngagementScore(argv: string[]): void;
2
+ //# sourceMappingURL=review-engagement-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-engagement-score.d.ts","sourceRoot":"","sources":["../../src/commands/review-engagement-score.ts"],"names":[],"mappings":"AAyGA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmC7D"}
@@ -0,0 +1,112 @@
1
+ import { readFileSync, existsSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ function computeEngagement(historyDir) {
4
+ const defaults = {
5
+ reviewFrequency: 0,
6
+ avgScore: 0,
7
+ scoreImprovement: 0,
8
+ findingResolutionRate: 0,
9
+ consistencyScore: 0,
10
+ overallEngagement: 0,
11
+ grade: "F",
12
+ };
13
+ if (!existsSync(historyDir))
14
+ return defaults;
15
+ const files = readdirSync(historyDir)
16
+ .filter((f) => typeof f === "string" && f.endsWith(".json"))
17
+ .sort();
18
+ if (files.length === 0)
19
+ return defaults;
20
+ const verdicts = [];
21
+ for (const file of files) {
22
+ try {
23
+ verdicts.push(JSON.parse(readFileSync(join(historyDir, file), "utf-8")));
24
+ }
25
+ catch {
26
+ // Skip
27
+ }
28
+ }
29
+ if (verdicts.length === 0)
30
+ return defaults;
31
+ // Review frequency: reviews per time span (normalized to per-week)
32
+ const reviewFrequency = Math.min(verdicts.length, 100);
33
+ // Average score
34
+ const scores = verdicts.map((v) => v.overallScore ?? 0);
35
+ const avgScore = Math.round(scores.reduce((a, b) => a + b, 0) / scores.length);
36
+ // Score improvement (first half vs second half)
37
+ const mid = Math.floor(scores.length / 2) || 1;
38
+ const firstHalf = scores.slice(0, mid);
39
+ const secondHalf = scores.slice(mid);
40
+ const firstAvg = firstHalf.reduce((a, b) => a + b, 0) / firstHalf.length;
41
+ const secondAvg = secondHalf.reduce((a, b) => a + b, 0) / secondHalf.length;
42
+ const scoreImprovement = Math.round(secondAvg - firstAvg);
43
+ // Finding resolution: decreasing finding counts over time
44
+ const findingCounts = verdicts.map((v) => (v.findings ?? []).length);
45
+ const firstFindings = findingCounts.slice(0, mid);
46
+ const secondFindings = findingCounts.slice(mid);
47
+ const firstFindingAvg = firstFindings.reduce((a, b) => a + b, 0) / firstFindings.length;
48
+ const secondFindingAvg = secondFindings.reduce((a, b) => a + b, 0) / secondFindings.length;
49
+ const resolutionRate = firstFindingAvg > 0 ? Math.round(((firstFindingAvg - secondFindingAvg) / firstFindingAvg) * 100) : 0;
50
+ // Consistency: standard deviation of scores (lower is more consistent)
51
+ const mean = avgScore;
52
+ const variance = scores.reduce((sum, s) => sum + (s - mean) ** 2, 0) / scores.length;
53
+ const stdDev = Math.sqrt(variance);
54
+ const consistencyScore = Math.max(0, Math.round(100 - stdDev * 2));
55
+ // Overall engagement: weighted composite
56
+ const freqPoints = Math.min(reviewFrequency * 2, 25);
57
+ const scorePoints = Math.min(Math.round(avgScore / 4), 25);
58
+ const improvementPoints = Math.min(Math.max(scoreImprovement + 10, 0), 25);
59
+ const consistPoints = Math.min(Math.round(consistencyScore / 4), 25);
60
+ const overall = freqPoints + scorePoints + improvementPoints + consistPoints;
61
+ let grade;
62
+ if (overall >= 85)
63
+ grade = "A";
64
+ else if (overall >= 70)
65
+ grade = "B";
66
+ else if (overall >= 55)
67
+ grade = "C";
68
+ else if (overall >= 40)
69
+ grade = "D";
70
+ else
71
+ grade = "F";
72
+ return {
73
+ reviewFrequency,
74
+ avgScore,
75
+ scoreImprovement,
76
+ findingResolutionRate: Math.max(resolutionRate, 0),
77
+ consistencyScore,
78
+ overallEngagement: overall,
79
+ grade,
80
+ };
81
+ }
82
+ export function runReviewEngagementScore(argv) {
83
+ if (argv.includes("--help") || argv.includes("-h")) {
84
+ console.log(`Usage: judges review-engagement-score [options]
85
+
86
+ Score team engagement with code reviews.
87
+
88
+ Options:
89
+ --history <path> Path to review history directory
90
+ --format <fmt> Output format: table (default) or json
91
+ -h, --help Show this help message`);
92
+ return;
93
+ }
94
+ const formatIdx = argv.indexOf("--format");
95
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
96
+ const histIdx = argv.indexOf("--history");
97
+ const historyDir = histIdx !== -1 && argv[histIdx + 1]
98
+ ? join(process.cwd(), argv[histIdx + 1])
99
+ : join(process.cwd(), ".judges", "history");
100
+ const metrics = computeEngagement(historyDir);
101
+ if (format === "json") {
102
+ console.log(JSON.stringify(metrics, null, 2));
103
+ return;
104
+ }
105
+ console.log(`\n=== Engagement Score: ${metrics.overallEngagement}/100 (Grade: ${metrics.grade}) ===\n`);
106
+ console.log(` Review Frequency: ${metrics.reviewFrequency} reviews`);
107
+ console.log(` Average Score: ${metrics.avgScore}/100`);
108
+ console.log(` Score Improvement: ${metrics.scoreImprovement >= 0 ? "+" : ""}${metrics.scoreImprovement} points`);
109
+ console.log(` Finding Resolution: ${metrics.findingResolutionRate}%`);
110
+ console.log(` Consistency: ${metrics.consistencyScore}/100`);
111
+ }
112
+ //# sourceMappingURL=review-engagement-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-engagement-score.js","sourceRoot":"","sources":["../../src/commands/review-engagement-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewFeedbackSummary(argv: string[]): void;
2
+ //# sourceMappingURL=review-feedback-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-feedback-summary.d.ts","sourceRoot":"","sources":["../../src/commands/review-feedback-summary.ts"],"names":[],"mappings":"AAmHA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkD7D"}
@@ -0,0 +1,131 @@
1
+ import { readFileSync, existsSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ function severityRank(sev) {
4
+ const ranks = { critical: 5, high: 4, medium: 3, low: 2, info: 1 };
5
+ return ranks[sev] ?? 0;
6
+ }
7
+ function rankToSeverity(rank) {
8
+ if (rank >= 4.5)
9
+ return "critical";
10
+ if (rank >= 3.5)
11
+ return "high";
12
+ if (rank >= 2.5)
13
+ return "medium";
14
+ if (rank >= 1.5)
15
+ return "low";
16
+ return "info";
17
+ }
18
+ function buildSummary(historyDir) {
19
+ const ruleMap = new Map();
20
+ let totalFindings = 0;
21
+ let totalReviews = 0;
22
+ const scores = [];
23
+ const verdictDist = {};
24
+ if (!existsSync(historyDir)) {
25
+ return {
26
+ totalReviews: 0,
27
+ totalFindings: 0,
28
+ avgFindingsPerReview: 0,
29
+ avgScore: 0,
30
+ topRules: [],
31
+ verdictDistribution: {},
32
+ };
33
+ }
34
+ const files = readdirSync(historyDir)
35
+ .filter((f) => typeof f === "string" && f.endsWith(".json"))
36
+ .sort();
37
+ for (const file of files) {
38
+ try {
39
+ const data = JSON.parse(readFileSync(join(historyDir, file), "utf-8"));
40
+ totalReviews++;
41
+ scores.push(data.overallScore ?? 0);
42
+ verdictDist[data.overallVerdict] = (verdictDist[data.overallVerdict] ?? 0) + 1;
43
+ const date = data.timestamp ?? file.replace(".json", "");
44
+ for (const f of data.findings ?? []) {
45
+ totalFindings++;
46
+ const entry = ruleMap.get(f.ruleId) ?? { title: f.title, severities: [], dates: [] };
47
+ entry.severities.push(severityRank(f.severity));
48
+ entry.dates.push(date);
49
+ ruleMap.set(f.ruleId, entry);
50
+ }
51
+ }
52
+ catch {
53
+ // Skip malformed
54
+ }
55
+ }
56
+ const topRules = [];
57
+ for (const [ruleId, data] of ruleMap) {
58
+ const avgRank = data.severities.reduce((a, b) => a + b, 0) / data.severities.length;
59
+ const uniqueDates = [...new Set(data.dates)];
60
+ let trend;
61
+ if (uniqueDates.length >= 5)
62
+ trend = "persistent";
63
+ else if (uniqueDates.length >= 3)
64
+ trend = "recurring";
65
+ else if (uniqueDates.length >= 2)
66
+ trend = "occasional";
67
+ else
68
+ trend = "isolated";
69
+ topRules.push({
70
+ ruleId,
71
+ title: data.title,
72
+ frequency: uniqueDates.length,
73
+ avgSeverity: rankToSeverity(avgRank),
74
+ trend,
75
+ });
76
+ }
77
+ topRules.sort((a, b) => b.frequency - a.frequency);
78
+ const avgScore = scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0;
79
+ return {
80
+ totalReviews,
81
+ totalFindings,
82
+ avgFindingsPerReview: totalReviews > 0 ? Math.round(totalFindings / totalReviews) : 0,
83
+ avgScore,
84
+ topRules: topRules.slice(0, 15),
85
+ verdictDistribution: verdictDist,
86
+ };
87
+ }
88
+ export function runReviewFeedbackSummary(argv) {
89
+ if (argv.includes("--help") || argv.includes("-h")) {
90
+ console.log(`Usage: judges review-feedback-summary [options]
91
+
92
+ Summarize reviewer feedback trends from history.
93
+
94
+ Options:
95
+ --history <path> Path to review history directory
96
+ --format <fmt> Output format: table (default) or json
97
+ -h, --help Show this help message`);
98
+ return;
99
+ }
100
+ const formatIdx = argv.indexOf("--format");
101
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
102
+ const histIdx = argv.indexOf("--history");
103
+ const historyDir = histIdx !== -1 && argv[histIdx + 1]
104
+ ? join(process.cwd(), argv[histIdx + 1])
105
+ : join(process.cwd(), ".judges", "history");
106
+ const summary = buildSummary(historyDir);
107
+ if (format === "json") {
108
+ console.log(JSON.stringify(summary, null, 2));
109
+ return;
110
+ }
111
+ console.log(`\n=== Feedback Summary ===\n`);
112
+ console.log(` Total Reviews: ${summary.totalReviews}`);
113
+ console.log(` Total Findings: ${summary.totalFindings}`);
114
+ console.log(` Avg/Review: ${summary.avgFindingsPerReview}`);
115
+ console.log(` Avg Score: ${summary.avgScore}/100`);
116
+ if (Object.keys(summary.verdictDistribution).length > 0) {
117
+ console.log(`\n Verdict Distribution:`);
118
+ for (const [verdict, count] of Object.entries(summary.verdictDistribution)) {
119
+ console.log(` ${verdict}: ${count}`);
120
+ }
121
+ }
122
+ if (summary.topRules.length > 0) {
123
+ console.log(`\n Top Rules:\n`);
124
+ console.log(" " + "Rule ID".padEnd(30) + "Freq".padEnd(6) + "Severity".padEnd(10) + "Trend");
125
+ console.log(" " + "-".repeat(60));
126
+ for (const r of summary.topRules) {
127
+ console.log(" " + r.ruleId.padEnd(30) + String(r.frequency).padEnd(6) + r.avgSeverity.padEnd(10) + r.trend);
128
+ }
129
+ }
130
+ }
131
+ //# sourceMappingURL=review-feedback-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-feedback-summary.js","sourceRoot":"","sources":["../../src/commands/review-feedback-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewMentorSuggest(argv: string[]): void;
2
+ //# sourceMappingURL=review-mentor-suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-mentor-suggest.d.ts","sourceRoot":"","sources":["../../src/commands/review-mentor-suggest.ts"],"names":[],"mappings":"AA2GA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgD3D"}
@@ -0,0 +1,113 @@
1
+ import { readFileSync, existsSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ function extractDomain(ruleId) {
4
+ const parts = ruleId.split("/");
5
+ return parts.length > 1 ? parts[0] : "general";
6
+ }
7
+ function buildProfiles(historyDir) {
8
+ if (!existsSync(historyDir))
9
+ return [];
10
+ const files = readdirSync(historyDir);
11
+ const jsonFiles = files.filter((f) => String(f).endsWith(".json"));
12
+ const domainScores = {};
13
+ for (const file of jsonFiles) {
14
+ const raw = readFileSync(join(historyDir, String(file)), "utf-8");
15
+ let verdict;
16
+ try {
17
+ verdict = JSON.parse(raw);
18
+ }
19
+ catch {
20
+ continue;
21
+ }
22
+ const reviewer = String(file)
23
+ .replace(/\.json$/, "")
24
+ .replace(/[-_]\d+$/, "");
25
+ if (!domainScores[reviewer])
26
+ domainScores[reviewer] = {};
27
+ const domainCounts = {};
28
+ for (const f of verdict.findings ?? []) {
29
+ const domain = extractDomain(f.ruleId);
30
+ domainCounts[domain] = (domainCounts[domain] ?? 0) + 1;
31
+ }
32
+ for (const domain of Object.keys(domainCounts)) {
33
+ if (!domainScores[reviewer][domain]) {
34
+ domainScores[reviewer][domain] = { total: 0, findings: 0 };
35
+ }
36
+ domainScores[reviewer][domain].total += 1;
37
+ domainScores[reviewer][domain].findings += domainCounts[domain];
38
+ }
39
+ }
40
+ const profiles = [];
41
+ for (const [reviewer, domains] of Object.entries(domainScores)) {
42
+ const strengths = [];
43
+ const weaknesses = [];
44
+ for (const [domain, stats] of Object.entries(domains)) {
45
+ const avgFindings = stats.findings / stats.total;
46
+ if (avgFindings <= 1) {
47
+ strengths.push(domain);
48
+ }
49
+ else if (avgFindings >= 3) {
50
+ weaknesses.push(domain);
51
+ }
52
+ }
53
+ profiles.push({ reviewer, strengths, weaknesses });
54
+ }
55
+ return profiles;
56
+ }
57
+ function suggestPairings(profiles) {
58
+ const pairings = [];
59
+ for (const mentee of profiles) {
60
+ for (const weakness of mentee.weaknesses) {
61
+ const mentor = profiles.find((p) => p.reviewer !== mentee.reviewer && p.strengths.includes(weakness));
62
+ if (mentor) {
63
+ pairings.push({
64
+ mentee: mentee.reviewer,
65
+ mentor: mentor.reviewer,
66
+ domain: weakness,
67
+ reason: `${mentor.reviewer} shows strength in "${weakness}" where ${mentee.reviewer} has frequent findings`,
68
+ });
69
+ }
70
+ }
71
+ }
72
+ return pairings;
73
+ }
74
+ export function runReviewMentorSuggest(argv) {
75
+ if (argv.includes("--help") || argv.includes("-h")) {
76
+ console.log(`Usage: judges review-mentor-suggest [options]
77
+
78
+ Suggest mentor pairings based on expertise gaps in review history.
79
+
80
+ Options:
81
+ --history <dir> Directory with verdict JSON files (default: .judges/history)
82
+ --format <fmt> Output format: table (default) or json
83
+ -h, --help Show this help message`);
84
+ return;
85
+ }
86
+ const formatIdx = argv.indexOf("--format");
87
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
88
+ const histIdx = argv.indexOf("--history");
89
+ const historyDir = histIdx !== -1 && argv[histIdx + 1]
90
+ ? join(process.cwd(), argv[histIdx + 1])
91
+ : join(process.cwd(), ".judges", "history");
92
+ const profiles = buildProfiles(historyDir);
93
+ if (profiles.length === 0) {
94
+ console.log("No reviewer profiles found. Run some reviews first.");
95
+ return;
96
+ }
97
+ const pairings = suggestPairings(profiles);
98
+ if (format === "json") {
99
+ console.log(JSON.stringify({ profiles, pairings }, null, 2));
100
+ return;
101
+ }
102
+ console.log(`\n=== Mentor Suggestions (${pairings.length} pairings) ===\n`);
103
+ if (pairings.length === 0) {
104
+ console.log("No clear mentor pairings identified — team expertise is well-distributed.");
105
+ return;
106
+ }
107
+ for (const p of pairings) {
108
+ console.log(` ${p.mentee} <-- ${p.mentor} (domain: ${p.domain})`);
109
+ console.log(` ${p.reason}`);
110
+ console.log();
111
+ }
112
+ }
113
+ //# sourceMappingURL=review-mentor-suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-mentor-suggest.js","sourceRoot":"","sources":["../../src/commands/review-mentor-suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewProgressReport(argv: string[]): void;
2
+ //# sourceMappingURL=review-progress-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-progress-report.d.ts","sourceRoot":"","sources":["../../src/commands/review-progress-report.ts"],"names":[],"mappings":"AAgFA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4D5D"}
@@ -0,0 +1,96 @@
1
+ import { readFileSync, existsSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ function buildProgress(historyDir) {
4
+ if (!existsSync(historyDir))
5
+ return undefined;
6
+ const files = readdirSync(historyDir)
7
+ .filter((f) => typeof f === "string" && f.endsWith(".json"))
8
+ .sort();
9
+ if (files.length === 0)
10
+ return undefined;
11
+ const verdicts = [];
12
+ for (const file of files) {
13
+ try {
14
+ verdicts.push(JSON.parse(readFileSync(join(historyDir, file), "utf-8")));
15
+ }
16
+ catch {
17
+ // Skip
18
+ }
19
+ }
20
+ if (verdicts.length === 0)
21
+ return undefined;
22
+ const midpoint = Math.floor(verdicts.length / 2);
23
+ const olderSet = verdicts.slice(0, midpoint || 1);
24
+ const recentSet = verdicts.slice(midpoint || 1);
25
+ function toPeriod(label, set) {
26
+ const scores = set.map((v) => v.overallScore ?? 0);
27
+ const findingCounts = set.map((v) => (v.findings ?? []).length);
28
+ const passes = set.filter((v) => v.overallVerdict === "pass").length;
29
+ return {
30
+ label,
31
+ reviews: set.length,
32
+ avgScore: scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0,
33
+ avgFindings: findingCounts.length > 0 ? Math.round(findingCounts.reduce((a, b) => a + b, 0) / findingCounts.length) : 0,
34
+ passRate: set.length > 0 ? Math.round((passes / set.length) * 100) : 0,
35
+ };
36
+ }
37
+ const overall = toPeriod("Overall", verdicts);
38
+ const recent = toPeriod("Recent", recentSet);
39
+ const older = toPeriod("Older", olderSet);
40
+ return {
41
+ overall,
42
+ recent,
43
+ older,
44
+ improving: recent.avgScore >= older.avgScore,
45
+ scoreChange: recent.avgScore - older.avgScore,
46
+ findingChange: recent.avgFindings - older.avgFindings,
47
+ };
48
+ }
49
+ export function runReviewProgressReport(argv) {
50
+ if (argv.includes("--help") || argv.includes("-h")) {
51
+ console.log(`Usage: judges review-progress-report [options]
52
+
53
+ Generate a progress report from review history.
54
+
55
+ Options:
56
+ --history <path> Path to review history directory
57
+ --format <fmt> Output format: table (default) or json
58
+ -h, --help Show this help message`);
59
+ return;
60
+ }
61
+ const formatIdx = argv.indexOf("--format");
62
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
63
+ const histIdx = argv.indexOf("--history");
64
+ const historyDir = histIdx !== -1 && argv[histIdx + 1]
65
+ ? join(process.cwd(), argv[histIdx + 1])
66
+ : join(process.cwd(), ".judges", "history");
67
+ const report = buildProgress(historyDir);
68
+ if (report === undefined) {
69
+ console.log("No review history found. Run reviews to build history.");
70
+ return;
71
+ }
72
+ if (format === "json") {
73
+ console.log(JSON.stringify(report, null, 2));
74
+ return;
75
+ }
76
+ const trend = report.improving ? "↑ Improving" : "↓ Declining";
77
+ console.log(`\n=== Progress Report (${trend}) ===\n`);
78
+ console.log(" " +
79
+ "Period".padEnd(12) +
80
+ "Reviews".padEnd(10) +
81
+ "Avg Score".padEnd(12) +
82
+ "Avg Findings".padEnd(14) +
83
+ "Pass Rate");
84
+ console.log(" " + "-".repeat(55));
85
+ for (const period of [report.older, report.recent, report.overall]) {
86
+ console.log(" " +
87
+ period.label.padEnd(12) +
88
+ String(period.reviews).padEnd(10) +
89
+ String(period.avgScore).padEnd(12) +
90
+ String(period.avgFindings).padEnd(14) +
91
+ `${period.passRate}%`);
92
+ }
93
+ console.log(`\n Score change: ${report.scoreChange >= 0 ? "+" : ""}${report.scoreChange}`);
94
+ console.log(` Finding change: ${report.findingChange >= 0 ? "+" : ""}${report.findingChange}`);
95
+ }
96
+ //# sourceMappingURL=review-progress-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-progress-report.js","sourceRoot":"","sources":["../../src/commands/review-progress-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewQualityBaseline(argv: string[]): void;
2
+ //# sourceMappingURL=review-quality-baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-quality-baseline.d.ts","sourceRoot":"","sources":["../../src/commands/review-quality-baseline.ts"],"names":[],"mappings":"AAoHA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkE7D"}