@kevinrabun/judges 3.70.0 → 3.72.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 +24 -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-auto-fix.d.ts +5 -0
  6. package/dist/commands/finding-auto-fix.d.ts.map +1 -0
  7. package/dist/commands/finding-auto-fix.js +189 -0
  8. package/dist/commands/finding-auto-fix.js.map +1 -0
  9. package/dist/commands/finding-context.d.ts +5 -0
  10. package/dist/commands/finding-context.d.ts.map +1 -0
  11. package/dist/commands/finding-context.js +141 -0
  12. package/dist/commands/finding-context.js.map +1 -0
  13. package/dist/commands/finding-deduplicate.d.ts +5 -0
  14. package/dist/commands/finding-deduplicate.d.ts.map +1 -0
  15. package/dist/commands/finding-deduplicate.js +142 -0
  16. package/dist/commands/finding-deduplicate.js.map +1 -0
  17. package/dist/commands/finding-severity-override.d.ts +5 -0
  18. package/dist/commands/finding-severity-override.d.ts.map +1 -0
  19. package/dist/commands/finding-severity-override.js +132 -0
  20. package/dist/commands/finding-severity-override.js.map +1 -0
  21. package/dist/commands/review-approval.d.ts +5 -0
  22. package/dist/commands/review-approval.d.ts.map +1 -0
  23. package/dist/commands/review-approval.js +134 -0
  24. package/dist/commands/review-approval.js.map +1 -0
  25. package/dist/commands/review-config-export.d.ts +5 -0
  26. package/dist/commands/review-config-export.d.ts.map +1 -0
  27. package/dist/commands/review-config-export.js +125 -0
  28. package/dist/commands/review-config-export.js.map +1 -0
  29. package/dist/commands/review-coverage-map.d.ts +5 -0
  30. package/dist/commands/review-coverage-map.d.ts.map +1 -0
  31. package/dist/commands/review-coverage-map.js +195 -0
  32. package/dist/commands/review-coverage-map.js.map +1 -0
  33. package/dist/commands/review-feedback.d.ts +5 -0
  34. package/dist/commands/review-feedback.d.ts.map +1 -0
  35. package/dist/commands/review-feedback.js +146 -0
  36. package/dist/commands/review-feedback.js.map +1 -0
  37. package/dist/commands/review-history-search.d.ts +5 -0
  38. package/dist/commands/review-history-search.d.ts.map +1 -0
  39. package/dist/commands/review-history-search.js +215 -0
  40. package/dist/commands/review-history-search.js.map +1 -0
  41. package/dist/commands/review-ignore-path.d.ts +5 -0
  42. package/dist/commands/review-ignore-path.d.ts.map +1 -0
  43. package/dist/commands/review-ignore-path.js +148 -0
  44. package/dist/commands/review-ignore-path.js.map +1 -0
  45. package/dist/commands/review-language-stats.d.ts +5 -0
  46. package/dist/commands/review-language-stats.d.ts.map +1 -0
  47. package/dist/commands/review-language-stats.js +153 -0
  48. package/dist/commands/review-language-stats.js.map +1 -0
  49. package/dist/commands/review-onboard.d.ts +5 -0
  50. package/dist/commands/review-onboard.d.ts.map +1 -0
  51. package/dist/commands/review-onboard.js +155 -0
  52. package/dist/commands/review-onboard.js.map +1 -0
  53. package/dist/commands/review-parallel.d.ts +5 -0
  54. package/dist/commands/review-parallel.d.ts.map +1 -0
  55. package/dist/commands/review-parallel.js +183 -0
  56. package/dist/commands/review-parallel.js.map +1 -0
  57. package/dist/commands/review-pr-comment.d.ts +5 -0
  58. package/dist/commands/review-pr-comment.d.ts.map +1 -0
  59. package/dist/commands/review-pr-comment.js +107 -0
  60. package/dist/commands/review-pr-comment.js.map +1 -0
  61. package/dist/commands/review-rollback.d.ts +5 -0
  62. package/dist/commands/review-rollback.d.ts.map +1 -0
  63. package/dist/commands/review-rollback.js +172 -0
  64. package/dist/commands/review-rollback.js.map +1 -0
  65. package/dist/commands/review-score-history.d.ts +5 -0
  66. package/dist/commands/review-score-history.d.ts.map +1 -0
  67. package/dist/commands/review-score-history.js +138 -0
  68. package/dist/commands/review-score-history.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Review-pr-comment — Generate PR comment summaries from review results.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Generator ──────────────────────────────────────────────────────────────
7
+ function generatePRComment(verdict, title) {
8
+ const findings = verdict.findings || [];
9
+ const criticalCount = verdict.criticalCount || findings.filter((f) => f.severity === "critical").length;
10
+ const highCount = verdict.highCount || findings.filter((f) => f.severity === "high").length;
11
+ const mediumCount = findings.filter((f) => f.severity === "medium").length;
12
+ const lowCount = findings.filter((f) => f.severity === "low").length;
13
+ const scoreEmoji = verdict.overallScore >= 8 ? "🟢" : verdict.overallScore >= 5 ? "🟡" : "🔴";
14
+ const verdictText = verdict.overallVerdict || (verdict.overallScore >= 7 ? "pass" : "fail");
15
+ let body = `## ${scoreEmoji} Judges Panel Review\n\n`;
16
+ body += `**Verdict:** ${verdictText.toUpperCase()} | **Score:** ${verdict.overallScore}/10\n\n`;
17
+ if (findings.length === 0) {
18
+ body += "✨ No findings — code looks good!\n";
19
+ }
20
+ else {
21
+ body += `### Findings Summary\n\n`;
22
+ body += `| Severity | Count |\n|----------|-------|\n`;
23
+ if (criticalCount > 0)
24
+ body += `| 🔴 Critical | ${criticalCount} |\n`;
25
+ if (highCount > 0)
26
+ body += `| 🟠 High | ${highCount} |\n`;
27
+ if (mediumCount > 0)
28
+ body += `| 🟡 Medium | ${mediumCount} |\n`;
29
+ if (lowCount > 0)
30
+ body += `| 🟢 Low | ${lowCount} |\n`;
31
+ body += `\n**Total:** ${findings.length} finding(s)\n\n`;
32
+ // Top findings
33
+ const top = findings.slice(0, 5);
34
+ if (top.length > 0) {
35
+ body += `### Top Findings\n\n`;
36
+ for (const f of top) {
37
+ const sev = (f.severity || "medium").toUpperCase();
38
+ body += `- **[${sev}]** ${f.ruleId}: ${f.title}\n`;
39
+ if (f.recommendation)
40
+ body += ` - Fix: ${f.recommendation}\n`;
41
+ }
42
+ }
43
+ }
44
+ body += `\n---\n*Generated by [Judges Panel](https://github.com/KevinRabun/judges)*\n`;
45
+ return {
46
+ title,
47
+ body,
48
+ verdict: verdictText,
49
+ score: verdict.overallScore,
50
+ findingCount: findings.length,
51
+ criticalCount,
52
+ highCount,
53
+ };
54
+ }
55
+ // ─── CLI ────────────────────────────────────────────────────────────────────
56
+ export function runReviewPrComment(argv) {
57
+ if (argv.includes("--help") || argv.includes("-h")) {
58
+ console.log(`
59
+ judges review-pr-comment — Generate PR comment summaries
60
+
61
+ Usage:
62
+ judges review-pr-comment --file report.json
63
+ judges review-pr-comment --file report.json --out pr-comment.md
64
+ judges review-pr-comment --file report.json --format json
65
+
66
+ Options:
67
+ --file <path> Path to a tribunal verdict JSON file
68
+ --out <path> Output path for the comment (default: stdout)
69
+ --title <text> Comment title
70
+ --format json JSON output
71
+ --help, -h Show this help
72
+
73
+ Generates a formatted markdown comment suitable for GitHub/GitLab PRs.
74
+ Output saved to .judges/pr-comment.md.
75
+ `);
76
+ return;
77
+ }
78
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file");
79
+ const outPath = argv.find((_a, i) => argv[i - 1] === "--out");
80
+ const title = argv.find((_a, i) => argv[i - 1] === "--title") || "Code Review";
81
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
82
+ if (!filePath || !existsSync(filePath)) {
83
+ console.error("Error: --file is required and must exist.");
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ let verdict;
88
+ try {
89
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
90
+ }
91
+ catch {
92
+ console.error("Error: Could not parse verdict file.");
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ const comment = generatePRComment(verdict, title);
97
+ if (format === "json") {
98
+ console.log(JSON.stringify(comment, null, 2));
99
+ return;
100
+ }
101
+ const defaultOut = outPath || join(".judges", "pr-comment.md");
102
+ mkdirSync(dirname(defaultOut), { recursive: true });
103
+ writeFileSync(defaultOut, comment.body, "utf-8");
104
+ console.log(comment.body);
105
+ console.log(`\nComment saved to ${defaultOut}`);
106
+ }
107
+ //# sourceMappingURL=review-pr-comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-pr-comment.js","sourceRoot":"","sources":["../../src/commands/review-pr-comment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAerC,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,OAAwB,EAAE,KAAa;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IACxG,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAC5F,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IAErE,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE5F,IAAI,IAAI,GAAG,MAAM,UAAU,0BAA0B,CAAC;IACtD,IAAI,IAAI,gBAAgB,WAAW,CAAC,WAAW,EAAE,iBAAiB,OAAO,CAAC,YAAY,SAAS,CAAC;IAEhG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,IAAI,oCAAoC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,0BAA0B,CAAC;QACnC,IAAI,IAAI,8CAA8C,CAAC;QACvD,IAAI,aAAa,GAAG,CAAC;YAAE,IAAI,IAAI,mBAAmB,aAAa,MAAM,CAAC;QACtE,IAAI,SAAS,GAAG,CAAC;YAAE,IAAI,IAAI,eAAe,SAAS,MAAM,CAAC;QAC1D,IAAI,WAAW,GAAG,CAAC;YAAE,IAAI,IAAI,iBAAiB,WAAW,MAAM,CAAC;QAChE,IAAI,QAAQ,GAAG,CAAC;YAAE,IAAI,IAAI,cAAc,QAAQ,MAAM,CAAC;QACvD,IAAI,IAAI,gBAAgB,QAAQ,CAAC,MAAM,iBAAiB,CAAC;QAEzD,eAAe;QACf,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,IAAI,sBAAsB,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnD,IAAI,IAAI,QAAQ,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC;gBACnD,IAAI,CAAC,CAAC,cAAc;oBAAE,IAAI,IAAI,YAAY,CAAC,CAAC,cAAc,IAAI,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,8EAA8E,CAAC;IAEvF,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,OAAO,CAAC,YAAY;QAC3B,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,aAAa;QACb,SAAS;KACV,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,aAAa,CAAC;IAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAE1F,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAoB,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAElD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/D,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-rollback — Roll back review configuration to a previous state.
3
+ */
4
+ export declare function runReviewRollback(argv: string[]): void;
5
+ //# sourceMappingURL=review-rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rollback.d.ts","sourceRoot":"","sources":["../../src/commands/review-rollback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqJtD"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Review-rollback — Roll back review configuration to a previous state.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const ROLLBACK_DIR = join(".judges", "rollback");
8
+ const INDEX_FILE = join(ROLLBACK_DIR, "index.json");
9
+ function loadIndex() {
10
+ if (!existsSync(INDEX_FILE))
11
+ return { version: "1.0.0", snapshots: [] };
12
+ try {
13
+ return JSON.parse(readFileSync(INDEX_FILE, "utf-8"));
14
+ }
15
+ catch {
16
+ return { version: "1.0.0", snapshots: [] };
17
+ }
18
+ }
19
+ function saveIndex(store) {
20
+ mkdirSync(ROLLBACK_DIR, { recursive: true });
21
+ writeFileSync(INDEX_FILE, JSON.stringify(store, null, 2), "utf-8");
22
+ }
23
+ function generateId() {
24
+ return `snap-${Date.now().toString(36)}`;
25
+ }
26
+ // ─── Config Discovery ───────────────────────────────────────────────────────
27
+ const CONFIG_FILES = [".judgesrc", ".judgesrc.json", "judgesrc.json", ".judges/config.json"];
28
+ function findConfigFile() {
29
+ for (const f of CONFIG_FILES) {
30
+ if (existsSync(f))
31
+ return f;
32
+ }
33
+ return null;
34
+ }
35
+ // ─── CLI ────────────────────────────────────────────────────────────────────
36
+ export function runReviewRollback(argv) {
37
+ if (argv.includes("--help") || argv.includes("-h")) {
38
+ console.log(`
39
+ judges review-rollback — Roll back review config to a previous state
40
+
41
+ Usage:
42
+ judges review-rollback save --label "before refactor"
43
+ judges review-rollback list
44
+ judges review-rollback restore --id snap-abc123
45
+ judges review-rollback diff --id snap-abc123
46
+ judges review-rollback clear
47
+
48
+ Subcommands:
49
+ save Save a config snapshot
50
+ list List saved snapshots
51
+ restore Restore a snapshot
52
+ diff Compare snapshot with current config
53
+ clear Clear all snapshots
54
+
55
+ Options:
56
+ --label <text> Label for the snapshot
57
+ --id <id> Snapshot ID
58
+ --config <path> Config file path (auto-detected)
59
+ --format json JSON output
60
+ --help, -h Show this help
61
+
62
+ Snapshots stored in .judges/rollback/.
63
+ `);
64
+ return;
65
+ }
66
+ const subcommand = argv.find((a) => ["save", "list", "restore", "diff", "clear"].includes(a)) || "list";
67
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
68
+ const store = loadIndex();
69
+ if (subcommand === "save") {
70
+ const label = argv.find((_a, i) => argv[i - 1] === "--label") || "";
71
+ const configArg = argv.find((_a, i) => argv[i - 1] === "--config");
72
+ const configFile = configArg || findConfigFile();
73
+ if (!configFile || !existsSync(configFile)) {
74
+ console.error("Error: No config file found. Use --config to specify.");
75
+ process.exitCode = 1;
76
+ return;
77
+ }
78
+ const id = generateId();
79
+ const snapshotFile = join(ROLLBACK_DIR, `${id}.json`);
80
+ mkdirSync(ROLLBACK_DIR, { recursive: true });
81
+ copyFileSync(configFile, snapshotFile);
82
+ store.snapshots.push({ id, timestamp: new Date().toISOString(), label, configFile, snapshotFile });
83
+ saveIndex(store);
84
+ console.log(`Saved snapshot ${id}${label ? ` (${label})` : ""} from "${configFile}".`);
85
+ return;
86
+ }
87
+ if (subcommand === "restore") {
88
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
89
+ if (!id) {
90
+ console.error("Error: --id is required.");
91
+ process.exitCode = 1;
92
+ return;
93
+ }
94
+ const snapshot = store.snapshots.find((s) => s.id === id);
95
+ if (!snapshot) {
96
+ console.error(`Error: Snapshot "${id}" not found.`);
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ if (!existsSync(snapshot.snapshotFile)) {
101
+ console.error(`Error: Snapshot file missing from disk.`);
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ mkdirSync(dirname(snapshot.configFile), { recursive: true });
106
+ copyFileSync(snapshot.snapshotFile, snapshot.configFile);
107
+ console.log(`Restored snapshot ${id} to "${snapshot.configFile}".`);
108
+ return;
109
+ }
110
+ if (subcommand === "diff") {
111
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
112
+ if (!id) {
113
+ console.error("Error: --id is required.");
114
+ process.exitCode = 1;
115
+ return;
116
+ }
117
+ const snapshot = store.snapshots.find((s) => s.id === id);
118
+ if (!snapshot) {
119
+ console.error(`Error: Snapshot "${id}" not found.`);
120
+ process.exitCode = 1;
121
+ return;
122
+ }
123
+ if (!existsSync(snapshot.snapshotFile)) {
124
+ console.error("Error: Snapshot file missing.");
125
+ process.exitCode = 1;
126
+ return;
127
+ }
128
+ const configFile = findConfigFile();
129
+ if (!configFile || !existsSync(configFile)) {
130
+ console.error("Error: No current config file found.");
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ const snapshotContent = readFileSync(snapshot.snapshotFile, "utf-8");
135
+ const currentContent = readFileSync(configFile, "utf-8");
136
+ if (snapshotContent === currentContent) {
137
+ console.log("No differences between snapshot and current config.");
138
+ return;
139
+ }
140
+ console.log(`\nDiff: snapshot ${id} vs current config`);
141
+ console.log("─".repeat(60));
142
+ console.log("Snapshot:");
143
+ console.log(snapshotContent.slice(0, 500));
144
+ console.log("\nCurrent:");
145
+ console.log(currentContent.slice(0, 500));
146
+ console.log("─".repeat(60));
147
+ return;
148
+ }
149
+ if (subcommand === "clear") {
150
+ saveIndex({ version: "1.0.0", snapshots: [] });
151
+ console.log("Rollback snapshots cleared.");
152
+ return;
153
+ }
154
+ // list
155
+ if (store.snapshots.length === 0) {
156
+ console.log("No snapshots saved. Use 'judges review-rollback save' to create one.");
157
+ return;
158
+ }
159
+ if (format === "json") {
160
+ console.log(JSON.stringify(store.snapshots, null, 2));
161
+ return;
162
+ }
163
+ console.log("\nConfig Snapshots:");
164
+ console.log("─".repeat(70));
165
+ for (const s of store.snapshots) {
166
+ console.log(` ${s.id} ${s.timestamp.slice(0, 19)} ${s.label || "(no label)"}`);
167
+ console.log(` Config: ${s.configFile}`);
168
+ }
169
+ console.log("─".repeat(70));
170
+ console.log(` Total: ${store.snapshots.length} snapshot(s)`);
171
+ }
172
+ //# sourceMappingURL=review-rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rollback.js","sourceRoot":"","sources":["../../src/commands/review-rollback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-score-history — Track review scores over time.
3
+ */
4
+ export declare function runReviewScoreHistory(argv: string[]): void;
5
+ //# sourceMappingURL=review-score-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-score-history.d.ts","sourceRoot":"","sources":["../../src/commands/review-score-history.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+EH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoG1D"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Review-score-history — Track review scores over time.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const SCORE_FILE = join(".judges", "score-history.json");
8
+ function loadStore() {
9
+ if (!existsSync(SCORE_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(SCORE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(SCORE_FILE), { recursive: true });
20
+ writeFileSync(SCORE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── Trend Calculation ──────────────────────────────────────────────────────
23
+ function calculateTrend(entries) {
24
+ if (entries.length === 0) {
25
+ return { direction: "stable", avgScore: 0, minScore: 0, maxScore: 0, recentAvg: 0, totalEntries: 0 };
26
+ }
27
+ const scores = entries.map((e) => e.score);
28
+ const avgScore = scores.reduce((a, b) => a + b, 0) / scores.length;
29
+ const minScore = Math.min(...scores);
30
+ const maxScore = Math.max(...scores);
31
+ const recentCount = Math.min(5, entries.length);
32
+ const recentScores = entries.slice(-recentCount).map((e) => e.score);
33
+ const recentAvg = recentScores.reduce((a, b) => a + b, 0) / recentScores.length;
34
+ let direction = "stable";
35
+ if (entries.length >= 3) {
36
+ const oldAvg = entries.slice(0, Math.floor(entries.length / 2)).reduce((s, e) => s + e.score, 0) /
37
+ Math.floor(entries.length / 2);
38
+ const newAvg = entries.slice(Math.floor(entries.length / 2)).reduce((s, e) => s + e.score, 0) /
39
+ (entries.length - Math.floor(entries.length / 2));
40
+ if (newAvg - oldAvg > 0.5)
41
+ direction = "improving";
42
+ else if (oldAvg - newAvg > 0.5)
43
+ direction = "declining";
44
+ }
45
+ return { direction, avgScore, minScore, maxScore, recentAvg, totalEntries: entries.length };
46
+ }
47
+ // ─── CLI ────────────────────────────────────────────────────────────────────
48
+ export function runReviewScoreHistory(argv) {
49
+ if (argv.includes("--help") || argv.includes("-h")) {
50
+ console.log(`
51
+ judges review-score-history — Track review scores over time
52
+
53
+ Usage:
54
+ judges review-score-history Show score trend
55
+ judges review-score-history add --score 8.5 --source "sprint-42"
56
+ judges review-score-history list
57
+ judges review-score-history clear
58
+
59
+ Subcommands:
60
+ (default) Show score trend analysis
61
+ add Add a score entry
62
+ list List all entries
63
+ clear Clear score history
64
+
65
+ Options:
66
+ --score <n> Review score
67
+ --source <text> Source description
68
+ --findings <n> Number of findings
69
+ --format json JSON output
70
+ --help, -h Show this help
71
+
72
+ Score history stored in .judges/score-history.json.
73
+ `);
74
+ return;
75
+ }
76
+ const subcommand = argv.find((a) => ["add", "list", "clear"].includes(a));
77
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
78
+ const store = loadStore();
79
+ if (subcommand === "add") {
80
+ const score = parseFloat(argv.find((_a, i) => argv[i - 1] === "--score") || "0");
81
+ const source = argv.find((_a, i) => argv[i - 1] === "--source") || "";
82
+ const findings = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0", 10);
83
+ store.entries.push({ date: new Date().toISOString(), score, findingCount: findings, source });
84
+ saveStore(store);
85
+ console.log(`Added score ${score.toFixed(1)} to history.`);
86
+ return;
87
+ }
88
+ if (subcommand === "clear") {
89
+ saveStore({ version: "1.0.0", entries: [] });
90
+ console.log("Score history cleared.");
91
+ return;
92
+ }
93
+ if (subcommand === "list") {
94
+ if (store.entries.length === 0) {
95
+ console.log("No score entries.");
96
+ return;
97
+ }
98
+ if (format === "json") {
99
+ console.log(JSON.stringify(store.entries, null, 2));
100
+ return;
101
+ }
102
+ console.log("\nScore History:");
103
+ console.log("─".repeat(60));
104
+ for (const e of store.entries) {
105
+ console.log(` ${e.date.slice(0, 10)} score=${e.score.toFixed(1)} findings=${e.findingCount} ${e.source}`);
106
+ }
107
+ console.log("─".repeat(60));
108
+ return;
109
+ }
110
+ // Default: show trend
111
+ if (store.entries.length === 0) {
112
+ console.log("No score data. Use 'judges review-score-history add' to start tracking.");
113
+ return;
114
+ }
115
+ const trend = calculateTrend(store.entries);
116
+ if (format === "json") {
117
+ console.log(JSON.stringify(trend, null, 2));
118
+ return;
119
+ }
120
+ const directionIcon = trend.direction === "improving" ? "↗" : trend.direction === "declining" ? "↘" : "→";
121
+ console.log("\nScore Trend Analysis:");
122
+ console.log("═".repeat(50));
123
+ console.log(` Direction: ${trend.direction} ${directionIcon}`);
124
+ console.log(` Avg Score: ${trend.avgScore.toFixed(1)} Recent Avg: ${trend.recentAvg.toFixed(1)}`);
125
+ console.log(` Min: ${trend.minScore.toFixed(1)} Max: ${trend.maxScore.toFixed(1)}`);
126
+ console.log(` Total entries: ${trend.totalEntries}`);
127
+ console.log("═".repeat(50));
128
+ // Simple sparkline
129
+ const last10 = store.entries.slice(-10);
130
+ if (last10.length > 1) {
131
+ console.log("\n Recent scores:");
132
+ for (const e of last10) {
133
+ const bar = "█".repeat(Math.round(e.score));
134
+ console.log(` ${e.date.slice(0, 10)} ${bar} ${e.score.toFixed(1)}`);
135
+ }
136
+ }
137
+ }
138
+ //# sourceMappingURL=review-score-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-score-history.js","sourceRoot":"","sources":["../../src/commands/review-score-history.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.70.0",
3
+ "version": "3.72.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",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.70.0",
10
+ "version": "3.72.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.70.0",
15
+ "version": "3.72.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }