@kevinrabun/judges 3.83.0 → 3.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +63 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-cluster-analysis.d.ts +5 -0
  6. package/dist/commands/finding-cluster-analysis.d.ts.map +1 -0
  7. package/dist/commands/finding-cluster-analysis.js +134 -0
  8. package/dist/commands/finding-cluster-analysis.js.map +1 -0
  9. package/dist/commands/finding-evidence-chain.d.ts +5 -0
  10. package/dist/commands/finding-evidence-chain.d.ts.map +1 -0
  11. package/dist/commands/finding-evidence-chain.js +148 -0
  12. package/dist/commands/finding-evidence-chain.js.map +1 -0
  13. package/dist/commands/finding-fix-priority.d.ts +5 -0
  14. package/dist/commands/finding-fix-priority.d.ts.map +1 -0
  15. package/dist/commands/finding-fix-priority.js +99 -0
  16. package/dist/commands/finding-fix-priority.js.map +1 -0
  17. package/dist/commands/finding-noise-filter.d.ts +8 -0
  18. package/dist/commands/finding-noise-filter.d.ts.map +1 -0
  19. package/dist/commands/finding-noise-filter.js +141 -0
  20. package/dist/commands/finding-noise-filter.js.map +1 -0
  21. package/dist/commands/finding-trend-report.d.ts +5 -0
  22. package/dist/commands/finding-trend-report.d.ts.map +1 -0
  23. package/dist/commands/finding-trend-report.js +108 -0
  24. package/dist/commands/finding-trend-report.js.map +1 -0
  25. package/dist/commands/review-commit-hook.d.ts +8 -0
  26. package/dist/commands/review-commit-hook.d.ts.map +1 -0
  27. package/dist/commands/review-commit-hook.js +135 -0
  28. package/dist/commands/review-commit-hook.js.map +1 -0
  29. package/dist/commands/review-file-complexity.d.ts +5 -0
  30. package/dist/commands/review-file-complexity.d.ts.map +1 -0
  31. package/dist/commands/review-file-complexity.js +138 -0
  32. package/dist/commands/review-file-complexity.js.map +1 -0
  33. package/dist/commands/review-quota-check.d.ts +5 -0
  34. package/dist/commands/review-quota-check.d.ts.map +1 -0
  35. package/dist/commands/review-quota-check.js +98 -0
  36. package/dist/commands/review-quota-check.js.map +1 -0
  37. package/dist/commands/review-session-save.d.ts +5 -0
  38. package/dist/commands/review-session-save.d.ts.map +1 -0
  39. package/dist/commands/review-session-save.js +174 -0
  40. package/dist/commands/review-session-save.js.map +1 -0
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Review-session-save — Save and restore review sessions.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ function sessionDir() {
7
+ return ".judges/sessions";
8
+ }
9
+ function sessionPath(id) {
10
+ return `${sessionDir()}/${id}.json`;
11
+ }
12
+ function generateId() {
13
+ const now = new Date();
14
+ return `session-${now.toISOString().slice(0, 10)}-${now.getTime().toString(36)}`;
15
+ }
16
+ function loadSession(id) {
17
+ const p = sessionPath(id);
18
+ if (!existsSync(p))
19
+ return null;
20
+ try {
21
+ return JSON.parse(readFileSync(p, "utf-8"));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function saveSession(session) {
28
+ const dir = sessionDir();
29
+ if (!existsSync(dir))
30
+ mkdirSync(dir, { recursive: true });
31
+ session.updatedAt = new Date().toISOString();
32
+ writeFileSync(sessionPath(session.id), JSON.stringify(session, null, 2));
33
+ }
34
+ // ─── CLI ────────────────────────────────────────────────────────────────────
35
+ export function runReviewSessionSave(argv) {
36
+ const sub = argv[0];
37
+ if (argv.includes("--help") || argv.includes("-h") || !sub) {
38
+ console.log(`
39
+ judges review-session-save — Save and restore review sessions
40
+
41
+ Usage:
42
+ judges review-session-save create [--note <text>]
43
+ judges review-session-save add --id <session-id> --file <verdict.json>
44
+ judges review-session-save show --id <session-id> [--format table|json]
45
+ judges review-session-save complete --id <session-id>
46
+ judges review-session-save pause --id <session-id>
47
+ judges review-session-save resume --id <session-id>
48
+
49
+ Subcommands:
50
+ create Create a new review session
51
+ add Add a verdict file to a session
52
+ show Show session details
53
+ complete Mark session as completed
54
+ pause Mark session as paused
55
+ resume Resume a paused session
56
+
57
+ Options:
58
+ --id <id> Session ID
59
+ --file <path> Verdict file to add
60
+ --note <text> Session note
61
+ --format <fmt> Output format: table (default), json
62
+ --help, -h Show this help
63
+ `);
64
+ return;
65
+ }
66
+ const idIdx = argv.indexOf("--id");
67
+ const fileIdx = argv.indexOf("--file");
68
+ const noteIdx = argv.indexOf("--note");
69
+ const formatIdx = argv.indexOf("--format");
70
+ const id = idIdx >= 0 ? argv[idIdx + 1] : undefined;
71
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
72
+ const note = noteIdx >= 0 ? argv[noteIdx + 1] : "";
73
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
74
+ if (sub === "create") {
75
+ const session = {
76
+ id: generateId(),
77
+ createdAt: new Date().toISOString(),
78
+ updatedAt: new Date().toISOString(),
79
+ files: [],
80
+ verdictPaths: [],
81
+ notes: note,
82
+ status: "in-progress",
83
+ };
84
+ saveSession(session);
85
+ console.log(`Created session: ${session.id}`);
86
+ return;
87
+ }
88
+ if (!id) {
89
+ console.error("Error: --id required");
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ if (sub === "add") {
94
+ if (!filePath) {
95
+ console.error("Error: --file required");
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ if (!existsSync(filePath)) {
100
+ console.error(`Error: not found: ${filePath}`);
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ const session = loadSession(id);
105
+ if (!session) {
106
+ console.error(`Error: session not found: ${id}`);
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ let verdict;
111
+ try {
112
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
113
+ }
114
+ catch {
115
+ console.error("Error: invalid JSON");
116
+ process.exitCode = 1;
117
+ return;
118
+ }
119
+ session.verdictPaths.push(filePath);
120
+ session.files.push(`${filePath} (${verdict.findings.length} findings)`);
121
+ saveSession(session);
122
+ console.log(`Added ${filePath} to session ${id}`);
123
+ return;
124
+ }
125
+ if (sub === "show") {
126
+ const session = loadSession(id);
127
+ if (!session) {
128
+ console.error(`Error: session not found: ${id}`);
129
+ process.exitCode = 1;
130
+ return;
131
+ }
132
+ if (format === "json") {
133
+ console.log(JSON.stringify(session, null, 2));
134
+ return;
135
+ }
136
+ console.log(`\nReview Session: ${session.id}`);
137
+ console.log("═".repeat(50));
138
+ console.log(` Status: ${session.status}`);
139
+ console.log(` Created: ${session.createdAt}`);
140
+ console.log(` Updated: ${session.updatedAt}`);
141
+ console.log(` Verdicts: ${session.verdictPaths.length}`);
142
+ if (session.notes)
143
+ console.log(` Notes: ${session.notes}`);
144
+ console.log("═".repeat(50));
145
+ if (session.files.length > 0) {
146
+ console.log("\nFiles:");
147
+ for (const f of session.files) {
148
+ console.log(` - ${f}`);
149
+ }
150
+ }
151
+ return;
152
+ }
153
+ const statusMap = {
154
+ complete: "completed",
155
+ pause: "paused",
156
+ resume: "in-progress",
157
+ };
158
+ const newStatus = statusMap[sub];
159
+ if (newStatus) {
160
+ const session = loadSession(id);
161
+ if (!session) {
162
+ console.error(`Error: session not found: ${id}`);
163
+ process.exitCode = 1;
164
+ return;
165
+ }
166
+ session.status = newStatus;
167
+ saveSession(session);
168
+ console.log(`Session ${id} marked as ${newStatus}`);
169
+ return;
170
+ }
171
+ console.error(`Error: unknown subcommand: ${sub}`);
172
+ process.exitCode = 1;
173
+ }
174
+ //# sourceMappingURL=review-session-save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-session-save.js","sourceRoot":"","sources":["../../src/commands/review-session-save.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAexE,+EAA+E;AAE/E,SAAS,UAAU;IACjB,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;AACtC,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO,WAAW,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAAsB;IACzC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9D,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,OAAO,GAAkB;YAC7B,EAAE,EAAE,UAAU,EAAE;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,aAAa;SACtB,CAAC;QACF,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,OAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;QACxE,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,eAAe,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5B,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAA2D;QACxE,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,aAAa;KACtB,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,SAAS,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.83.0",
3
+ "version": "3.84.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.83.0",
10
+ "version": "3.84.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.83.0",
15
+ "version": "3.84.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }