@kevinrabun/judges 3.67.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 (70) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-cluster.d.ts +5 -0
  6. package/dist/commands/finding-cluster.d.ts.map +1 -0
  7. package/dist/commands/finding-cluster.js +158 -0
  8. package/dist/commands/finding-cluster.js.map +1 -0
  9. package/dist/commands/finding-fix-rate.d.ts +5 -0
  10. package/dist/commands/finding-fix-rate.d.ts.map +1 -0
  11. package/dist/commands/finding-fix-rate.js +142 -0
  12. package/dist/commands/finding-fix-rate.js.map +1 -0
  13. package/dist/commands/finding-hotspot.d.ts +5 -0
  14. package/dist/commands/finding-hotspot.d.ts.map +1 -0
  15. package/dist/commands/finding-hotspot.js +116 -0
  16. package/dist/commands/finding-hotspot.js.map +1 -0
  17. package/dist/commands/finding-recurrence.d.ts +5 -0
  18. package/dist/commands/finding-recurrence.d.ts.map +1 -0
  19. package/dist/commands/finding-recurrence.js +136 -0
  20. package/dist/commands/finding-recurrence.js.map +1 -0
  21. package/dist/commands/review-ab-test.d.ts +5 -0
  22. package/dist/commands/review-ab-test.d.ts.map +1 -0
  23. package/dist/commands/review-ab-test.js +225 -0
  24. package/dist/commands/review-ab-test.js.map +1 -0
  25. package/dist/commands/review-audit-log.d.ts +5 -0
  26. package/dist/commands/review-audit-log.d.ts.map +1 -0
  27. package/dist/commands/review-audit-log.js +140 -0
  28. package/dist/commands/review-audit-log.js.map +1 -0
  29. package/dist/commands/review-badge.d.ts +5 -0
  30. package/dist/commands/review-badge.d.ts.map +1 -0
  31. package/dist/commands/review-badge.js +153 -0
  32. package/dist/commands/review-badge.js.map +1 -0
  33. package/dist/commands/review-benchmark-self.d.ts +5 -0
  34. package/dist/commands/review-benchmark-self.d.ts.map +1 -0
  35. package/dist/commands/review-benchmark-self.js +141 -0
  36. package/dist/commands/review-benchmark-self.js.map +1 -0
  37. package/dist/commands/review-changelog-gen.d.ts +5 -0
  38. package/dist/commands/review-changelog-gen.d.ts.map +1 -0
  39. package/dist/commands/review-changelog-gen.js +118 -0
  40. package/dist/commands/review-changelog-gen.js.map +1 -0
  41. package/dist/commands/review-integration.d.ts +5 -0
  42. package/dist/commands/review-integration.d.ts.map +1 -0
  43. package/dist/commands/review-integration.js +237 -0
  44. package/dist/commands/review-integration.js.map +1 -0
  45. package/dist/commands/review-milestone.d.ts +5 -0
  46. package/dist/commands/review-milestone.d.ts.map +1 -0
  47. package/dist/commands/review-milestone.js +137 -0
  48. package/dist/commands/review-milestone.js.map +1 -0
  49. package/dist/commands/review-report-pdf.d.ts +5 -0
  50. package/dist/commands/review-report-pdf.d.ts.map +1 -0
  51. package/dist/commands/review-report-pdf.js +164 -0
  52. package/dist/commands/review-report-pdf.js.map +1 -0
  53. package/dist/commands/review-risk-score.d.ts +5 -0
  54. package/dist/commands/review-risk-score.d.ts.map +1 -0
  55. package/dist/commands/review-risk-score.js +157 -0
  56. package/dist/commands/review-risk-score.js.map +1 -0
  57. package/dist/commands/review-sandbox.d.ts +5 -0
  58. package/dist/commands/review-sandbox.d.ts.map +1 -0
  59. package/dist/commands/review-sandbox.js +192 -0
  60. package/dist/commands/review-sandbox.js.map +1 -0
  61. package/dist/commands/review-standup.d.ts +5 -0
  62. package/dist/commands/review-standup.d.ts.map +1 -0
  63. package/dist/commands/review-standup.js +96 -0
  64. package/dist/commands/review-standup.js.map +1 -0
  65. package/dist/commands/review-streak.d.ts +5 -0
  66. package/dist/commands/review-streak.d.ts.map +1 -0
  67. package/dist/commands/review-streak.js +151 -0
  68. package/dist/commands/review-streak.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Review-ab-test — A/B test review configurations to find optimal settings.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const AB_FILE = join(".judges", "ab-tests.json");
8
+ function loadStore() {
9
+ if (!existsSync(AB_FILE))
10
+ return { version: "1.0.0", tests: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(AB_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", tests: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(AB_FILE), { recursive: true });
20
+ writeFileSync(AB_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── Analysis ───────────────────────────────────────────────────────────────
23
+ function avgScore(results) {
24
+ if (results.length === 0)
25
+ return 0;
26
+ return results.reduce((s, r) => s + r.score, 0) / results.length;
27
+ }
28
+ function avgFindings(results) {
29
+ if (results.length === 0)
30
+ return 0;
31
+ return results.reduce((s, r) => s + r.findingCount, 0) / results.length;
32
+ }
33
+ // ─── CLI ────────────────────────────────────────────────────────────────────
34
+ export function runReviewAbTest(argv) {
35
+ if (argv.includes("--help") || argv.includes("-h")) {
36
+ console.log(`
37
+ judges review-ab-test — A/B test review configurations
38
+
39
+ Usage:
40
+ judges review-ab-test create --name test1 --desc "Compare presets"
41
+ judges review-ab-test record --name test1 --config A --score 8.5 --findings 3
42
+ judges review-ab-test record --name test1 --config B --score 7.2 --findings 8
43
+ judges review-ab-test compare --name test1 Compare results
44
+ judges review-ab-test conclude --name test1 Mark test as concluded
45
+ judges review-ab-test list List all tests
46
+
47
+ Options:
48
+ --name <name> Test name
49
+ --desc <text> Test description
50
+ --config <A|B> Which configuration (A or B)
51
+ --score <n> Review score
52
+ --findings <n> Finding count
53
+ --criticals <n> Critical finding count
54
+ --duration <ms> Review duration in ms
55
+ --format json JSON output
56
+ --help, -h Show this help
57
+
58
+ Run the same code through different configs and compare results.
59
+ Data stored locally in .judges/ab-tests.json.
60
+ `);
61
+ return;
62
+ }
63
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
64
+ const subcommand = argv.find((a) => ["create", "record", "compare", "conclude", "list", "delete"].includes(a)) || "list";
65
+ const store = loadStore();
66
+ const name = argv.find((_a, i) => argv[i - 1] === "--name");
67
+ if (subcommand === "create") {
68
+ if (!name) {
69
+ console.error("Error: --name is required.");
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ if (store.tests.find((t) => t.name === name)) {
74
+ console.error(`Error: Test "${name}" already exists.`);
75
+ process.exitCode = 1;
76
+ return;
77
+ }
78
+ const desc = argv.find((_a, i) => argv[i - 1] === "--desc") || "";
79
+ store.tests.push({
80
+ name,
81
+ createdAt: new Date().toISOString(),
82
+ description: desc,
83
+ configA: {},
84
+ configB: {},
85
+ resultsA: [],
86
+ resultsB: [],
87
+ status: "active",
88
+ winner: "",
89
+ });
90
+ saveStore(store);
91
+ console.log(`A/B test "${name}" created. Record results with 'record --config A|B'.`);
92
+ return;
93
+ }
94
+ if (subcommand === "record") {
95
+ if (!name) {
96
+ console.error("Error: --name is required.");
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ const test = store.tests.find((t) => t.name === name);
101
+ if (!test) {
102
+ console.error(`Error: Test "${name}" not found.`);
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ const config = argv.find((_a, i) => argv[i - 1] === "--config");
107
+ if (!config || !["A", "B"].includes(config.toUpperCase())) {
108
+ console.error("Error: --config A or --config B is required.");
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ const score = parseFloat(argv.find((_a, i) => argv[i - 1] === "--score") || "0");
113
+ const findingCount = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0", 10);
114
+ const criticalCount = parseInt(argv.find((_a, i) => argv[i - 1] === "--criticals") || "0", 10);
115
+ const duration = parseInt(argv.find((_a, i) => argv[i - 1] === "--duration") || "0", 10);
116
+ const result = {
117
+ configName: config.toUpperCase(),
118
+ runAt: new Date().toISOString(),
119
+ score,
120
+ findingCount,
121
+ criticalCount,
122
+ duration,
123
+ };
124
+ if (config.toUpperCase() === "A")
125
+ test.resultsA.push(result);
126
+ else
127
+ test.resultsB.push(result);
128
+ saveStore(store);
129
+ console.log(`Recorded result for config ${config.toUpperCase()} in test "${name}".`);
130
+ return;
131
+ }
132
+ if (subcommand === "compare") {
133
+ if (!name) {
134
+ console.error("Error: --name is required.");
135
+ process.exitCode = 1;
136
+ return;
137
+ }
138
+ const test = store.tests.find((t) => t.name === name);
139
+ if (!test) {
140
+ console.error(`Error: Test "${name}" not found.`);
141
+ process.exitCode = 1;
142
+ return;
143
+ }
144
+ const scoreA = avgScore(test.resultsA);
145
+ const scoreB = avgScore(test.resultsB);
146
+ const findingsA = avgFindings(test.resultsA);
147
+ const findingsB = avgFindings(test.resultsB);
148
+ if (format === "json") {
149
+ console.log(JSON.stringify({
150
+ name: test.name,
151
+ configA: { runs: test.resultsA.length, avgScore: scoreA, avgFindings: findingsA },
152
+ configB: { runs: test.resultsB.length, avgScore: scoreB, avgFindings: findingsB },
153
+ recommendation: scoreA >= scoreB ? "A" : "B",
154
+ }, null, 2));
155
+ return;
156
+ }
157
+ console.log(`\nA/B Test: ${test.name}`);
158
+ console.log(test.description ? ` ${test.description}` : "");
159
+ console.log("─".repeat(50));
160
+ console.log(" Config A Config B");
161
+ console.log("─".repeat(50));
162
+ console.log(` Runs: ${String(test.resultsA.length).padEnd(14)}${test.resultsB.length}`);
163
+ console.log(` Avg Score: ${scoreA.toFixed(2).padEnd(14)}${scoreB.toFixed(2)}`);
164
+ console.log(` Avg Findings: ${findingsA.toFixed(1).padEnd(14)}${findingsB.toFixed(1)}`);
165
+ console.log("─".repeat(50));
166
+ const rec = scoreA >= scoreB ? "A" : "B";
167
+ console.log(` Recommendation: Config ${rec} (higher avg score)`);
168
+ console.log();
169
+ return;
170
+ }
171
+ if (subcommand === "conclude") {
172
+ if (!name) {
173
+ console.error("Error: --name is required.");
174
+ process.exitCode = 1;
175
+ return;
176
+ }
177
+ const test = store.tests.find((t) => t.name === name);
178
+ if (!test) {
179
+ console.error(`Error: Test "${name}" not found.`);
180
+ process.exitCode = 1;
181
+ return;
182
+ }
183
+ const scoreA = avgScore(test.resultsA);
184
+ const scoreB = avgScore(test.resultsB);
185
+ test.status = "concluded";
186
+ test.winner = scoreA >= scoreB ? "A" : "B";
187
+ saveStore(store);
188
+ console.log(`Test "${name}" concluded. Winner: Config ${test.winner}.`);
189
+ return;
190
+ }
191
+ if (subcommand === "delete") {
192
+ if (!name) {
193
+ console.error("Error: --name is required.");
194
+ process.exitCode = 1;
195
+ return;
196
+ }
197
+ store.tests = store.tests.filter((t) => t.name !== name);
198
+ saveStore(store);
199
+ console.log(`Test "${name}" deleted.`);
200
+ return;
201
+ }
202
+ // list
203
+ if (format === "json") {
204
+ console.log(JSON.stringify(store.tests.map((t) => ({
205
+ name: t.name,
206
+ status: t.status,
207
+ runsA: t.resultsA.length,
208
+ runsB: t.resultsB.length,
209
+ winner: t.winner,
210
+ })), null, 2));
211
+ return;
212
+ }
213
+ if (store.tests.length === 0) {
214
+ console.log("No A/B tests configured. Use 'judges review-ab-test create --name <n>' to start.");
215
+ return;
216
+ }
217
+ console.log("\nA/B Tests:");
218
+ console.log("─".repeat(60));
219
+ for (const t of store.tests) {
220
+ const status = t.status === "concluded" ? `concluded (winner: ${t.winner})` : "active";
221
+ console.log(` ${t.name.padEnd(20)} ${status.padEnd(25)} A:${t.resultsA.length} B:${t.resultsB.length}`);
222
+ }
223
+ console.log("─".repeat(60));
224
+ }
225
+ //# sourceMappingURL=review-ab-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-ab-test.js","sourceRoot":"","sources":["../../src/commands/review-ab-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-audit-log — Comprehensive local audit log for compliance tracking.
3
+ */
4
+ export declare function runReviewAuditLog(argv: string[]): void;
5
+ //# sourceMappingURL=review-audit-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-audit-log.d.ts","sourceRoot":"","sources":["../../src/commands/review-audit-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+HtD"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Review-audit-log — Comprehensive local audit log for compliance tracking.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const LOG_FILE = join(".judges", "audit-log.json");
8
+ function loadLog() {
9
+ if (!existsSync(LOG_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(LOG_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveLog(log) {
19
+ mkdirSync(dirname(LOG_FILE), { recursive: true });
20
+ writeFileSync(LOG_FILE, JSON.stringify(log, null, 2), "utf-8");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runReviewAuditLog(argv) {
24
+ if (argv.includes("--help") || argv.includes("-h")) {
25
+ console.log(`
26
+ judges review-audit-log — Comprehensive local audit log
27
+
28
+ Usage:
29
+ judges review-audit-log show Show recent audit entries
30
+ judges review-audit-log show --last 20 Show last N entries
31
+ judges review-audit-log record --action review Record an audit entry
32
+ judges review-audit-log search --action suppress Search by action
33
+ judges review-audit-log export --output log.csv Export to CSV
34
+ judges review-audit-log clear Clear audit log
35
+
36
+ Subcommands:
37
+ show Show audit entries
38
+ record Record a new entry
39
+ search Search entries
40
+ export Export log
41
+ clear Clear all entries
42
+
43
+ Options:
44
+ --action <type> Action type (review, suppress, approve, fix, configure, etc.)
45
+ --command <cmd> Command that was run
46
+ --result <text> Result description
47
+ --last <n> Show last N entries (default: 10)
48
+ --output <path> Export file path
49
+ --format json JSON output
50
+ --help, -h Show this help
51
+
52
+ Tracks all review actions locally for compliance and auditability.
53
+ Data stored in .judges/audit-log.json.
54
+ `);
55
+ return;
56
+ }
57
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
58
+ const subcommand = argv.find((a) => ["show", "record", "search", "export", "clear"].includes(a)) || "show";
59
+ const log = loadLog();
60
+ if (subcommand === "record") {
61
+ const action = argv.find((_a, i) => argv[i - 1] === "--action") || "unknown";
62
+ const command = argv.find((_a, i) => argv[i - 1] === "--command") || "";
63
+ const result = argv.find((_a, i) => argv[i - 1] === "--result") || "success";
64
+ const user = process.env.USER || process.env.USERNAME || "unknown";
65
+ const entry = {
66
+ timestamp: new Date().toISOString(),
67
+ action,
68
+ command,
69
+ user,
70
+ details: {},
71
+ result,
72
+ };
73
+ log.entries.push(entry);
74
+ saveLog(log);
75
+ console.log(`Audit entry recorded: ${action} by ${user}`);
76
+ return;
77
+ }
78
+ if (subcommand === "clear") {
79
+ saveLog({ version: "1.0.0", entries: [] });
80
+ console.log("Audit log cleared.");
81
+ return;
82
+ }
83
+ if (subcommand === "search") {
84
+ const action = argv.find((_a, i) => argv[i - 1] === "--action");
85
+ const filtered = action ? log.entries.filter((e) => e.action === action) : log.entries;
86
+ if (format === "json") {
87
+ console.log(JSON.stringify(filtered, null, 2));
88
+ return;
89
+ }
90
+ if (filtered.length === 0) {
91
+ console.log(`No entries found${action ? ` for action "${action}"` : ""}.`);
92
+ return;
93
+ }
94
+ console.log(`\nSearch Results (${filtered.length} entries):`);
95
+ console.log("─".repeat(80));
96
+ for (const e of filtered.slice(-20)) {
97
+ console.log(` ${e.timestamp} [${e.action}] ${e.command || "-"} → ${e.result} (${e.user})`);
98
+ }
99
+ console.log("─".repeat(80));
100
+ return;
101
+ }
102
+ if (subcommand === "export") {
103
+ const output = argv.find((_a, i) => argv[i - 1] === "--output");
104
+ if (!output) {
105
+ console.error("Error: --output is required for export.");
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ const header = "timestamp,action,command,user,result\n";
110
+ const rows = log.entries
111
+ .map((e) => `"${e.timestamp}","${e.action}","${e.command}","${e.user}","${e.result}"`)
112
+ .join("\n");
113
+ mkdirSync(dirname(output), { recursive: true });
114
+ writeFileSync(output, header + rows, "utf-8");
115
+ console.log(`Exported ${log.entries.length} entries to ${output}`);
116
+ return;
117
+ }
118
+ // show
119
+ const lastN = parseInt(argv.find((_a, i) => argv[i - 1] === "--last") || "10", 10);
120
+ const entries = log.entries.slice(-lastN);
121
+ if (format === "json") {
122
+ console.log(JSON.stringify(entries, null, 2));
123
+ return;
124
+ }
125
+ if (entries.length === 0) {
126
+ console.log("No audit entries recorded yet.");
127
+ return;
128
+ }
129
+ console.log(`\nAudit Log (last ${entries.length} of ${log.entries.length}):`);
130
+ console.log("─".repeat(80));
131
+ console.log(" Timestamp Action Command Result");
132
+ console.log("─".repeat(80));
133
+ for (const e of entries) {
134
+ const ts = e.timestamp.slice(0, 19).replace("T", " ");
135
+ console.log(` ${ts} ${e.action.padEnd(12)} ${(e.command || "-").padEnd(20)} ${e.result}`);
136
+ }
137
+ console.log("─".repeat(80));
138
+ console.log(` Total entries: ${log.entries.length}`);
139
+ }
140
+ //# sourceMappingURL=review-audit-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-audit-log.js","sourceRoot":"","sources":["../../src/commands/review-audit-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-badge — Generate status badges for project READMEs.
3
+ */
4
+ export declare function runReviewBadge(argv: string[]): void;
5
+ //# sourceMappingURL=review-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-badge.d.ts","sourceRoot":"","sources":["../../src/commands/review-badge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyGnD"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Review-badge — Generate status badges for project READMEs.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Badge Generation ───────────────────────────────────────────────────────
7
+ function scoreToGrade(score) {
8
+ if (score >= 9)
9
+ return "A+";
10
+ if (score >= 8)
11
+ return "A";
12
+ if (score >= 7)
13
+ return "B";
14
+ if (score >= 6)
15
+ return "C";
16
+ if (score >= 5)
17
+ return "D";
18
+ return "F";
19
+ }
20
+ function gradeColor(grade) {
21
+ if (grade.startsWith("A"))
22
+ return "brightgreen";
23
+ if (grade === "B")
24
+ return "green";
25
+ if (grade === "C")
26
+ return "yellow";
27
+ if (grade === "D")
28
+ return "orange";
29
+ return "red";
30
+ }
31
+ function generateMarkdownBadge(label, value, color) {
32
+ const encodedLabel = encodeURIComponent(label);
33
+ const encodedValue = encodeURIComponent(value);
34
+ return `![${label}](https://img.shields.io/badge/${encodedLabel}-${encodedValue}-${color})`;
35
+ }
36
+ function generateSvgBadge(label, value, color) {
37
+ const hexColors = {
38
+ brightgreen: "#4c1",
39
+ green: "#97CA00",
40
+ yellow: "#dfb317",
41
+ orange: "#fe7d37",
42
+ red: "#e05d44",
43
+ blue: "#007ec6",
44
+ lightgrey: "#9f9f9f",
45
+ };
46
+ const hex = hexColors[color] || hexColors.lightgrey;
47
+ const labelWidth = label.length * 7 + 10;
48
+ const valueWidth = value.length * 7 + 10;
49
+ const totalWidth = labelWidth + valueWidth;
50
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${totalWidth}" height="20">
51
+ <rect width="${labelWidth}" height="20" fill="#555"/>
52
+ <rect x="${labelWidth}" width="${valueWidth}" height="20" fill="${hex}"/>
53
+ <text x="${labelWidth / 2}" y="14" fill="#fff" text-anchor="middle" font-family="sans-serif" font-size="11">${label}</text>
54
+ <text x="${labelWidth + valueWidth / 2}" y="14" fill="#fff" text-anchor="middle" font-family="sans-serif" font-size="11">${value}</text>
55
+ </svg>`;
56
+ }
57
+ // ─── CLI ────────────────────────────────────────────────────────────────────
58
+ export function runReviewBadge(argv) {
59
+ if (argv.includes("--help") || argv.includes("-h")) {
60
+ console.log(`
61
+ judges review-badge — Generate status badges for project READMEs
62
+
63
+ Usage:
64
+ judges review-badge --file verdict.json Generate badge from verdict
65
+ judges review-badge --score 8.5 Generate badge from score
66
+ judges review-badge --file v.json --output badge.svg Save SVG badge
67
+ judges review-badge --file v.json --markdown Output markdown badge syntax
68
+
69
+ Options:
70
+ --file <path> Verdict JSON file
71
+ --score <n> Direct score (0-10)
72
+ --output <path> Save badge to file (SVG format)
73
+ --markdown Output markdown badge syntax
74
+ --label <text> Custom badge label (default: "Judges Score")
75
+ --format json JSON output
76
+ --help, -h Show this help
77
+
78
+ Generate badges showing review score/grade for project visibility.
79
+ `);
80
+ return;
81
+ }
82
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
83
+ const label = argv.find((_a, i) => argv[i - 1] === "--label") || "Judges Score";
84
+ const output = argv.find((_a, i) => argv[i - 1] === "--output");
85
+ const scoreArg = argv.find((_a, i) => argv[i - 1] === "--score");
86
+ let score;
87
+ let criticals = 0;
88
+ let findings = 0;
89
+ if (scoreArg) {
90
+ score = parseFloat(scoreArg);
91
+ }
92
+ else {
93
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
94
+ if (!file || !existsSync(file)) {
95
+ console.error("Error: --file or --score is required.");
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ try {
100
+ const verdict = JSON.parse(readFileSync(file, "utf-8"));
101
+ score = verdict.overallScore || 0;
102
+ criticals = verdict.criticalCount || 0;
103
+ findings = (verdict.findings || []).length;
104
+ }
105
+ catch {
106
+ console.error("Error: Failed to parse verdict file.");
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ }
111
+ const grade = scoreToGrade(score);
112
+ const color = gradeColor(grade);
113
+ const value = `${grade} (${score.toFixed(1)})`;
114
+ if (output) {
115
+ const svg = generateSvgBadge(label, value, color);
116
+ mkdirSync(dirname(output), { recursive: true });
117
+ writeFileSync(output, svg, "utf-8");
118
+ console.log(`Badge saved to ${output}`);
119
+ return;
120
+ }
121
+ if (argv.includes("--markdown")) {
122
+ const md = generateMarkdownBadge(label, value, color);
123
+ console.log(md);
124
+ if (criticals > 0) {
125
+ console.log(generateMarkdownBadge("Critical Findings", String(criticals), "red"));
126
+ }
127
+ if (findings > 0) {
128
+ console.log(generateMarkdownBadge("Total Findings", String(findings), findings > 10 ? "orange" : "blue"));
129
+ }
130
+ return;
131
+ }
132
+ if (format === "json") {
133
+ console.log(JSON.stringify({
134
+ label,
135
+ value,
136
+ grade,
137
+ score,
138
+ color,
139
+ markdown: generateMarkdownBadge(label, value, color),
140
+ criticals,
141
+ findings,
142
+ }, null, 2));
143
+ return;
144
+ }
145
+ console.log(`\nBadge: ${label} — ${value}`);
146
+ console.log(`Grade: ${grade} Color: ${color}`);
147
+ console.log(`\nMarkdown:`);
148
+ console.log(` ${generateMarkdownBadge(label, value, color)}`);
149
+ if (criticals > 0)
150
+ console.log(` ${generateMarkdownBadge("Critical Findings", String(criticals), "red")}`);
151
+ console.log();
152
+ }
153
+ //# sourceMappingURL=review-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-badge.js","sourceRoot":"","sources":["../../src/commands/review-badge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-benchmark-self — Benchmark your review metrics against your own history.
3
+ */
4
+ export declare function runReviewBenchmarkSelf(argv: string[]): void;
5
+ //# sourceMappingURL=review-benchmark-self.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-benchmark-self.d.ts","sourceRoot":"","sources":["../../src/commands/review-benchmark-self.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+I3D"}