@kevinrabun/judges 3.68.0 → 3.69.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 (38) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-fix-rate.d.ts +5 -0
  6. package/dist/commands/finding-fix-rate.d.ts.map +1 -0
  7. package/dist/commands/finding-fix-rate.js +142 -0
  8. package/dist/commands/finding-fix-rate.js.map +1 -0
  9. package/dist/commands/finding-recurrence.d.ts +5 -0
  10. package/dist/commands/finding-recurrence.d.ts.map +1 -0
  11. package/dist/commands/finding-recurrence.js +136 -0
  12. package/dist/commands/finding-recurrence.js.map +1 -0
  13. package/dist/commands/review-benchmark-self.d.ts +5 -0
  14. package/dist/commands/review-benchmark-self.d.ts.map +1 -0
  15. package/dist/commands/review-benchmark-self.js +141 -0
  16. package/dist/commands/review-benchmark-self.js.map +1 -0
  17. package/dist/commands/review-changelog-gen.d.ts +5 -0
  18. package/dist/commands/review-changelog-gen.d.ts.map +1 -0
  19. package/dist/commands/review-changelog-gen.js +118 -0
  20. package/dist/commands/review-changelog-gen.js.map +1 -0
  21. package/dist/commands/review-milestone.d.ts +5 -0
  22. package/dist/commands/review-milestone.d.ts.map +1 -0
  23. package/dist/commands/review-milestone.js +137 -0
  24. package/dist/commands/review-milestone.js.map +1 -0
  25. package/dist/commands/review-report-pdf.d.ts +5 -0
  26. package/dist/commands/review-report-pdf.d.ts.map +1 -0
  27. package/dist/commands/review-report-pdf.js +164 -0
  28. package/dist/commands/review-report-pdf.js.map +1 -0
  29. package/dist/commands/review-risk-score.d.ts +5 -0
  30. package/dist/commands/review-risk-score.d.ts.map +1 -0
  31. package/dist/commands/review-risk-score.js +157 -0
  32. package/dist/commands/review-risk-score.js.map +1 -0
  33. package/dist/commands/review-standup.d.ts +5 -0
  34. package/dist/commands/review-standup.d.ts.map +1 -0
  35. package/dist/commands/review-standup.js +96 -0
  36. package/dist/commands/review-standup.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Review-milestone — Track and celebrate review milestones.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const MILESTONE_FILE = join(".judges", "milestones.json");
8
+ function loadStore() {
9
+ if (!existsSync(MILESTONE_FILE))
10
+ return { version: "1.0.0", totalReviews: 0, totalFindings: 0, totalFixes: 0, milestones: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(MILESTONE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", totalReviews: 0, totalFindings: 0, totalFixes: 0, milestones: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(MILESTONE_FILE), { recursive: true });
20
+ writeFileSync(MILESTONE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── Milestone Definitions ─────────────────────────────────────────────────
23
+ const REVIEW_MILESTONES = [10, 25, 50, 100, 250, 500, 1000, 2500, 5000];
24
+ const FINDING_MILESTONES = [50, 100, 250, 500, 1000, 5000];
25
+ const FIX_MILESTONES = [10, 25, 50, 100, 250, 500, 1000];
26
+ function checkMilestones(store) {
27
+ const newMilestones = [];
28
+ const achieved = new Set(store.milestones.map((m) => m.name));
29
+ for (const t of REVIEW_MILESTONES) {
30
+ const name = `${t}-reviews`;
31
+ if (store.totalReviews >= t && !achieved.has(name)) {
32
+ store.milestones.push({ name, threshold: t, achievedAt: new Date().toISOString() });
33
+ newMilestones.push(`${t} Reviews milestone achieved!`);
34
+ }
35
+ }
36
+ for (const t of FINDING_MILESTONES) {
37
+ const name = `${t}-findings`;
38
+ if (store.totalFindings >= t && !achieved.has(name)) {
39
+ store.milestones.push({ name, threshold: t, achievedAt: new Date().toISOString() });
40
+ newMilestones.push(`${t} Findings detected milestone!`);
41
+ }
42
+ }
43
+ for (const t of FIX_MILESTONES) {
44
+ const name = `${t}-fixes`;
45
+ if (store.totalFixes >= t && !achieved.has(name)) {
46
+ store.milestones.push({ name, threshold: t, achievedAt: new Date().toISOString() });
47
+ newMilestones.push(`${t} Fixes applied milestone!`);
48
+ }
49
+ }
50
+ return newMilestones;
51
+ }
52
+ // ─── CLI ────────────────────────────────────────────────────────────────────
53
+ export function runReviewMilestone(argv) {
54
+ if (argv.includes("--help") || argv.includes("-h")) {
55
+ console.log(`
56
+ judges review-milestone — Track and celebrate review milestones
57
+
58
+ Usage:
59
+ judges review-milestone show Show all milestones
60
+ judges review-milestone record --reviews 1 Increment review count
61
+ judges review-milestone record --findings 5 Increment findings count
62
+ judges review-milestone record --fixes 2 Increment fixes count
63
+ judges review-milestone reset Reset all milestone data
64
+
65
+ Options:
66
+ --reviews <n> Add N reviews to counter
67
+ --findings <n> Add N findings to counter
68
+ --fixes <n> Add N fixes to counter
69
+ --format json JSON output
70
+ --help, -h Show this help
71
+
72
+ Track progress and celebrate milestones. Data in .judges/milestones.json.
73
+ `);
74
+ return;
75
+ }
76
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
77
+ const subcommand = argv.find((a) => ["show", "record", "reset"].includes(a)) || "show";
78
+ const store = loadStore();
79
+ if (subcommand === "record") {
80
+ const reviews = parseInt(argv.find((_a, i) => argv[i - 1] === "--reviews") || "0", 10);
81
+ const findings = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0", 10);
82
+ const fixes = parseInt(argv.find((_a, i) => argv[i - 1] === "--fixes") || "0", 10);
83
+ store.totalReviews += reviews;
84
+ store.totalFindings += findings;
85
+ store.totalFixes += fixes;
86
+ const newMs = checkMilestones(store);
87
+ saveStore(store);
88
+ if (newMs.length > 0) {
89
+ console.log("\nNew Milestones Achieved!");
90
+ for (const m of newMs)
91
+ console.log(` * ${m}`);
92
+ console.log();
93
+ }
94
+ else {
95
+ console.log(`Updated: ${store.totalReviews} reviews, ${store.totalFindings} findings, ${store.totalFixes} fixes.`);
96
+ }
97
+ return;
98
+ }
99
+ if (subcommand === "reset") {
100
+ saveStore({ version: "1.0.0", totalReviews: 0, totalFindings: 0, totalFixes: 0, milestones: [] });
101
+ console.log("Milestone data reset.");
102
+ return;
103
+ }
104
+ // show
105
+ if (format === "json") {
106
+ console.log(JSON.stringify(store, null, 2));
107
+ return;
108
+ }
109
+ console.log("\nReview Milestones:");
110
+ console.log("─".repeat(50));
111
+ console.log(` Total reviews: ${store.totalReviews}`);
112
+ console.log(` Total findings: ${store.totalFindings}`);
113
+ console.log(` Total fixes: ${store.totalFixes}`);
114
+ console.log();
115
+ if (store.milestones.length > 0) {
116
+ console.log(" Achieved:");
117
+ for (const m of store.milestones) {
118
+ console.log(` * ${m.name} — ${m.achievedAt.slice(0, 10)}`);
119
+ }
120
+ }
121
+ else {
122
+ console.log(" No milestones achieved yet. Keep reviewing!");
123
+ }
124
+ // Show next milestones
125
+ const nextReview = REVIEW_MILESTONES.find((t) => t > store.totalReviews);
126
+ const nextFinding = FINDING_MILESTONES.find((t) => t > store.totalFindings);
127
+ const nextFix = FIX_MILESTONES.find((t) => t > store.totalFixes);
128
+ console.log("\n Next milestones:");
129
+ if (nextReview)
130
+ console.log(` Reviews: ${nextReview} (${nextReview - store.totalReviews} to go)`);
131
+ if (nextFinding)
132
+ console.log(` Findings: ${nextFinding} (${nextFinding - store.totalFindings} to go)`);
133
+ if (nextFix)
134
+ console.log(` Fixes: ${nextFix} (${nextFix - store.totalFixes} to go)`);
135
+ console.log("─".repeat(50));
136
+ }
137
+ //# sourceMappingURL=review-milestone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-milestone.js","sourceRoot":"","sources":["../../src/commands/review-milestone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-report-pdf — Generate printable markdown review reports.
3
+ */
4
+ export declare function runReviewReportPdf(argv: string[]): void;
5
+ //# sourceMappingURL=review-report-pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-report-pdf.d.ts","sourceRoot":"","sources":["../../src/commands/review-report-pdf.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkHH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsEvD"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Review-report-pdf — Generate printable markdown review reports.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Report Generation ─────────────────────────────────────────────────────
7
+ function generateReport(verdict, title) {
8
+ const lines = [];
9
+ const date = new Date().toISOString().slice(0, 10);
10
+ lines.push(`# ${title}`);
11
+ lines.push(`**Date:** ${date}`);
12
+ lines.push(`**Score:** ${(verdict.overallScore || 0).toFixed(1)}/10`);
13
+ lines.push(`**Verdict:** ${verdict.overallVerdict || "N/A"}`);
14
+ lines.push("");
15
+ // Summary
16
+ lines.push("## Summary");
17
+ lines.push("");
18
+ lines.push(verdict.summary || "No summary available.");
19
+ lines.push("");
20
+ // Statistics
21
+ lines.push("## Statistics");
22
+ lines.push("");
23
+ lines.push(`| Metric | Value |`);
24
+ lines.push(`|--------|-------|`);
25
+ lines.push(`| Overall Score | ${(verdict.overallScore || 0).toFixed(1)} |`);
26
+ lines.push(`| Critical Findings | ${verdict.criticalCount || 0} |`);
27
+ lines.push(`| High Findings | ${verdict.highCount || 0} |`);
28
+ lines.push(`| Total Findings | ${(verdict.findings || []).length} |`);
29
+ lines.push(`| Judges Evaluated | ${(verdict.evaluations || []).length} |`);
30
+ lines.push("");
31
+ // Findings by severity
32
+ const findings = verdict.findings || [];
33
+ if (findings.length > 0) {
34
+ lines.push("## Findings");
35
+ lines.push("");
36
+ const criticals = findings.filter((f) => f.severity === "critical");
37
+ const highs = findings.filter((f) => f.severity === "high");
38
+ const mediums = findings.filter((f) => f.severity === "medium");
39
+ const lows = findings.filter((f) => f.severity === "low");
40
+ if (criticals.length > 0) {
41
+ lines.push("### Critical");
42
+ lines.push("");
43
+ for (const f of criticals) {
44
+ lines.push(`- **[${f.ruleId || "N/A"}]** ${f.title || "Untitled"}`);
45
+ if (f.description)
46
+ lines.push(` ${f.description}`);
47
+ if (f.recommendation)
48
+ lines.push(` *Recommendation:* ${f.recommendation}`);
49
+ lines.push("");
50
+ }
51
+ }
52
+ if (highs.length > 0) {
53
+ lines.push("### High");
54
+ lines.push("");
55
+ for (const f of highs) {
56
+ lines.push(`- **[${f.ruleId || "N/A"}]** ${f.title || "Untitled"}`);
57
+ if (f.description)
58
+ lines.push(` ${f.description}`);
59
+ if (f.recommendation)
60
+ lines.push(` *Recommendation:* ${f.recommendation}`);
61
+ lines.push("");
62
+ }
63
+ }
64
+ if (mediums.length > 0) {
65
+ lines.push("### Medium");
66
+ lines.push("");
67
+ for (const f of mediums) {
68
+ lines.push(`- **[${f.ruleId || "N/A"}]** ${f.title || "Untitled"}`);
69
+ if (f.recommendation)
70
+ lines.push(` *Recommendation:* ${f.recommendation}`);
71
+ lines.push("");
72
+ }
73
+ }
74
+ if (lows.length > 0) {
75
+ lines.push("### Low");
76
+ lines.push("");
77
+ for (const f of lows) {
78
+ lines.push(`- **[${f.ruleId || "N/A"}]** ${f.title || "Untitled"}`);
79
+ lines.push("");
80
+ }
81
+ }
82
+ }
83
+ else {
84
+ lines.push("## Findings");
85
+ lines.push("");
86
+ lines.push("No findings detected. Code passes all checks.");
87
+ lines.push("");
88
+ }
89
+ // Judge evaluations
90
+ if ((verdict.evaluations || []).length > 0) {
91
+ lines.push("## Judge Evaluations");
92
+ lines.push("");
93
+ lines.push(`| Judge | Verdict | Score | Findings |`);
94
+ lines.push(`|-------|---------|-------|----------|`);
95
+ for (const e of verdict.evaluations || []) {
96
+ lines.push(`| ${e.judgeId} | ${e.verdict} | ${(e.score || 0).toFixed(1)} | ${(e.findings || []).length} |`);
97
+ }
98
+ lines.push("");
99
+ }
100
+ lines.push("---");
101
+ lines.push(`*Generated by Judges Panel on ${date}*`);
102
+ return lines.join("\n");
103
+ }
104
+ // ─── CLI ────────────────────────────────────────────────────────────────────
105
+ export function runReviewReportPdf(argv) {
106
+ if (argv.includes("--help") || argv.includes("-h")) {
107
+ console.log(`
108
+ judges review-report-pdf — Generate printable markdown review reports
109
+
110
+ Usage:
111
+ judges review-report-pdf --file verdict.json Generate report
112
+ judges review-report-pdf --file v.json --output report.md Save to file
113
+ judges review-report-pdf --file v.json --title "Sprint Review"
114
+
115
+ Options:
116
+ --file <path> Verdict JSON file
117
+ --output <path> Output file path (default: stdout)
118
+ --title <text> Report title (default: "Code Review Report")
119
+ --format json JSON output (report metadata)
120
+ --help, -h Show this help
121
+
122
+ Generates detailed markdown reports suitable for printing or sharing.
123
+ `);
124
+ return;
125
+ }
126
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
127
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
128
+ const output = argv.find((_a, i) => argv[i - 1] === "--output");
129
+ const title = argv.find((_a, i) => argv[i - 1] === "--title") || "Code Review Report";
130
+ if (!file || !existsSync(file)) {
131
+ console.error("Error: --file with valid verdict JSON is required.");
132
+ process.exitCode = 1;
133
+ return;
134
+ }
135
+ let verdict;
136
+ try {
137
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
138
+ }
139
+ catch {
140
+ console.error("Error: Failed to parse verdict file.");
141
+ process.exitCode = 1;
142
+ return;
143
+ }
144
+ if (format === "json") {
145
+ console.log(JSON.stringify({
146
+ title,
147
+ date: new Date().toISOString().slice(0, 10),
148
+ score: verdict.overallScore || 0,
149
+ verdict: verdict.overallVerdict || "N/A",
150
+ findings: (verdict.findings || []).length,
151
+ criticals: verdict.criticalCount || 0,
152
+ }, null, 2));
153
+ return;
154
+ }
155
+ const report = generateReport(verdict, title);
156
+ if (output) {
157
+ mkdirSync(dirname(output), { recursive: true });
158
+ writeFileSync(output, report, "utf-8");
159
+ console.log(`Report saved to ${output}`);
160
+ return;
161
+ }
162
+ console.log(report);
163
+ }
164
+ //# sourceMappingURL=review-report-pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-report-pdf.js","sourceRoot":"","sources":["../../src/commands/review-report-pdf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-risk-score — Calculate aggregate project risk score from recent reviews.
3
+ */
4
+ export declare function runReviewRiskScore(argv: string[]): void;
5
+ //# sourceMappingURL=review-risk-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-risk-score.d.ts","sourceRoot":"","sources":["../../src/commands/review-risk-score.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8GH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+EvD"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Review-risk-score — Calculate aggregate project risk score from recent reviews.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Risk Calculation ───────────────────────────────────────────────────────
6
+ const SEVERITY_WEIGHTS = {
7
+ critical: 10,
8
+ high: 7,
9
+ medium: 4,
10
+ low: 1,
11
+ };
12
+ function calculateRisk(verdicts) {
13
+ const breakdown = [];
14
+ const recommendations = [];
15
+ // Finding severity score (weight: 40%)
16
+ let severityScore = 0;
17
+ let totalFindings = 0;
18
+ for (const v of verdicts) {
19
+ for (const f of v.findings || []) {
20
+ totalFindings++;
21
+ severityScore += SEVERITY_WEIGHTS[String(f.severity)] || 4;
22
+ }
23
+ }
24
+ const normalizedSeverity = totalFindings > 0 ? Math.min(severityScore / totalFindings, 10) : 0;
25
+ breakdown.push({
26
+ category: "Finding Severity",
27
+ score: normalizedSeverity,
28
+ weight: 0.4,
29
+ contribution: normalizedSeverity * 0.4,
30
+ details: `${totalFindings} findings, avg severity weight: ${totalFindings > 0 ? (severityScore / totalFindings).toFixed(1) : "0"}`,
31
+ });
32
+ // Critical density (weight: 30%)
33
+ let totalCriticals = 0;
34
+ for (const v of verdicts) {
35
+ totalCriticals += v.criticalCount || 0;
36
+ }
37
+ const criticalDensity = Math.min(totalCriticals * 2, 10);
38
+ breakdown.push({
39
+ category: "Critical Density",
40
+ score: criticalDensity,
41
+ weight: 0.3,
42
+ contribution: criticalDensity * 0.3,
43
+ details: `${totalCriticals} critical findings across ${verdicts.length} review(s)`,
44
+ });
45
+ if (totalCriticals > 0) {
46
+ recommendations.push(`Address ${totalCriticals} critical finding(s) immediately`);
47
+ }
48
+ // Review score trend (weight: 20%)
49
+ const scores = verdicts.map((v) => v.overallScore || 0).filter((s) => s > 0);
50
+ const avgScore = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 5;
51
+ const scoreRisk = Math.max(0, 10 - avgScore);
52
+ breakdown.push({
53
+ category: "Score Deficit",
54
+ score: scoreRisk,
55
+ weight: 0.2,
56
+ contribution: scoreRisk * 0.2,
57
+ details: `Average score: ${avgScore.toFixed(1)}/10`,
58
+ });
59
+ if (avgScore < 7) {
60
+ recommendations.push("Improve review scores above 7.0 threshold");
61
+ }
62
+ // Finding volume (weight: 10%)
63
+ const volumeRisk = Math.min(totalFindings / 5, 10);
64
+ breakdown.push({
65
+ category: "Finding Volume",
66
+ score: volumeRisk,
67
+ weight: 0.1,
68
+ contribution: volumeRisk * 0.1,
69
+ details: `${totalFindings} total findings`,
70
+ });
71
+ const overallRisk = breakdown.reduce((s, b) => s + b.contribution, 0);
72
+ let riskLevel = "Low";
73
+ if (overallRisk >= 7)
74
+ riskLevel = "Critical";
75
+ else if (overallRisk >= 5)
76
+ riskLevel = "High";
77
+ else if (overallRisk >= 3)
78
+ riskLevel = "Medium";
79
+ if (recommendations.length === 0) {
80
+ recommendations.push("Risk levels are manageable — continue regular reviews");
81
+ }
82
+ return { overallRisk, riskLevel, breakdown, recommendations };
83
+ }
84
+ // ─── CLI ────────────────────────────────────────────────────────────────────
85
+ export function runReviewRiskScore(argv) {
86
+ if (argv.includes("--help") || argv.includes("-h")) {
87
+ console.log(`
88
+ judges review-risk-score — Calculate aggregate project risk score
89
+
90
+ Usage:
91
+ judges review-risk-score --file verdict.json Score from single verdict
92
+ judges review-risk-score --files v1.json,v2.json Score from multiple verdicts
93
+
94
+ Options:
95
+ --file <path> Single verdict JSON file
96
+ --files <paths> Comma-separated verdict files
97
+ --format json JSON output
98
+ --help, -h Show this help
99
+
100
+ Calculates a weighted risk score from review findings and scores.
101
+ `);
102
+ return;
103
+ }
104
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
105
+ const singleFile = argv.find((_a, i) => argv[i - 1] === "--file");
106
+ const multiFiles = argv.find((_a, i) => argv[i - 1] === "--files");
107
+ const files = [];
108
+ if (singleFile)
109
+ files.push(singleFile);
110
+ if (multiFiles)
111
+ files.push(...multiFiles.split(",").map((f) => f.trim()));
112
+ if (files.length === 0) {
113
+ console.error("Error: --file or --files is required.");
114
+ process.exitCode = 1;
115
+ return;
116
+ }
117
+ const verdicts = [];
118
+ for (const file of files) {
119
+ if (!existsSync(file)) {
120
+ console.error(`Warning: File not found: ${file}`);
121
+ continue;
122
+ }
123
+ try {
124
+ verdicts.push(JSON.parse(readFileSync(file, "utf-8")));
125
+ }
126
+ catch {
127
+ console.error(`Warning: Failed to parse: ${file}`);
128
+ }
129
+ }
130
+ if (verdicts.length === 0) {
131
+ console.error("Error: No valid verdict files provided.");
132
+ process.exitCode = 1;
133
+ return;
134
+ }
135
+ const report = calculateRisk(verdicts);
136
+ if (format === "json") {
137
+ console.log(JSON.stringify(report, null, 2));
138
+ return;
139
+ }
140
+ console.log("\nProject Risk Assessment:");
141
+ console.log("─".repeat(60));
142
+ console.log(` Overall Risk: ${report.overallRisk.toFixed(1)}/10 [${report.riskLevel}]`);
143
+ console.log();
144
+ console.log(" Breakdown:");
145
+ for (const b of report.breakdown) {
146
+ const bar = "█".repeat(Math.round(b.score));
147
+ console.log(` ${b.category.padEnd(18)} ${b.score.toFixed(1).padEnd(6)} (w=${(b.weight * 100).toFixed(0)}%) ${bar}`);
148
+ console.log(` ${b.details}`);
149
+ }
150
+ console.log();
151
+ console.log(" Recommendations:");
152
+ for (const r of report.recommendations) {
153
+ console.log(` - ${r}`);
154
+ }
155
+ console.log("─".repeat(60));
156
+ }
157
+ //# sourceMappingURL=review-risk-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-risk-score.js","sourceRoot":"","sources":["../../src/commands/review-risk-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-standup — Generate daily standup-ready summaries of review activity.
3
+ */
4
+ export declare function runReviewStandup(argv: string[]): void;
5
+ //# sourceMappingURL=review-standup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-standup.d.ts","sourceRoot":"","sources":["../../src/commands/review-standup.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2EH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6CrD"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Review-standup — Generate daily standup-ready summaries of review activity.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function todayStr() {
8
+ return new Date().toISOString().slice(0, 10);
9
+ }
10
+ function loadRecentActivity() {
11
+ const date = todayStr();
12
+ const summary = {
13
+ date,
14
+ reviewsRun: 0,
15
+ avgScore: 0,
16
+ totalFindings: 0,
17
+ criticalFindings: 0,
18
+ topIssues: [],
19
+ status: "No activity recorded today",
20
+ };
21
+ // Check streak data for recent activity
22
+ const streakFile = join(".judges", "review-streak.json");
23
+ if (existsSync(streakFile)) {
24
+ try {
25
+ const streakData = JSON.parse(readFileSync(streakFile, "utf-8"));
26
+ const todayEntries = streakData.entries.filter((e) => e.date === date);
27
+ if (todayEntries.length > 0) {
28
+ summary.reviewsRun = todayEntries.length;
29
+ summary.avgScore = todayEntries.reduce((s, e) => s + e.score, 0) / todayEntries.length;
30
+ summary.status = todayEntries.every((e) => e.passed) ? "All reviews passing" : "Some reviews failing";
31
+ }
32
+ }
33
+ catch {
34
+ /* ignore */
35
+ }
36
+ }
37
+ // Check quota data
38
+ const quotaFile = join(".judges", "review-quota.json");
39
+ if (existsSync(quotaFile)) {
40
+ try {
41
+ const quotaData = JSON.parse(readFileSync(quotaFile, "utf-8"));
42
+ if (quotaData.limit > 0) {
43
+ summary.status += ` | Quota: ${quotaData.used}/${quotaData.limit}`;
44
+ }
45
+ }
46
+ catch {
47
+ /* ignore */
48
+ }
49
+ }
50
+ return summary;
51
+ }
52
+ // ─── CLI ────────────────────────────────────────────────────────────────────
53
+ export function runReviewStandup(argv) {
54
+ if (argv.includes("--help") || argv.includes("-h")) {
55
+ console.log(`
56
+ judges review-standup — Daily standup-ready review summary
57
+
58
+ Usage:
59
+ judges review-standup Today's summary
60
+ judges review-standup --date 2025-01-15 Summary for specific date
61
+ judges review-standup --week Weekly summary
62
+
63
+ Options:
64
+ --date <YYYY-MM-DD> Summary for specific date
65
+ --week Show weekly summary
66
+ --format json JSON output
67
+ --help, -h Show this help
68
+
69
+ Generates concise daily/weekly review summaries for standups and reports.
70
+ Reads from local .judges/ data files.
71
+ `);
72
+ return;
73
+ }
74
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
75
+ const summary = loadRecentActivity();
76
+ if (format === "json") {
77
+ console.log(JSON.stringify(summary, null, 2));
78
+ return;
79
+ }
80
+ console.log("\nReview Standup Summary");
81
+ console.log("─".repeat(50));
82
+ console.log(` Date: ${summary.date}`);
83
+ console.log(` Reviews run: ${summary.reviewsRun}`);
84
+ console.log(` Average score: ${summary.avgScore > 0 ? summary.avgScore.toFixed(1) : "N/A"}`);
85
+ console.log(` Total findings: ${summary.totalFindings}`);
86
+ console.log(` Critical findings: ${summary.criticalFindings}`);
87
+ console.log(` Status: ${summary.status}`);
88
+ if (summary.topIssues.length > 0) {
89
+ console.log(` Top issues:`);
90
+ for (const issue of summary.topIssues) {
91
+ console.log(` - ${issue}`);
92
+ }
93
+ }
94
+ console.log("─".repeat(50));
95
+ }
96
+ //# sourceMappingURL=review-standup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-standup.js","sourceRoot":"","sources":["../../src/commands/review-standup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.68.0",
3
+ "version": "3.69.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",