@kevinrabun/judges 3.82.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 (78) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +126 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-category-stats.d.ts +5 -0
  6. package/dist/commands/finding-category-stats.d.ts.map +1 -0
  7. package/dist/commands/finding-category-stats.js +105 -0
  8. package/dist/commands/finding-category-stats.js.map +1 -0
  9. package/dist/commands/finding-cluster-analysis.d.ts +5 -0
  10. package/dist/commands/finding-cluster-analysis.d.ts.map +1 -0
  11. package/dist/commands/finding-cluster-analysis.js +134 -0
  12. package/dist/commands/finding-cluster-analysis.js.map +1 -0
  13. package/dist/commands/finding-compare-runs.d.ts +5 -0
  14. package/dist/commands/finding-compare-runs.d.ts.map +1 -0
  15. package/dist/commands/finding-compare-runs.js +106 -0
  16. package/dist/commands/finding-compare-runs.js.map +1 -0
  17. package/dist/commands/finding-evidence-chain.d.ts +5 -0
  18. package/dist/commands/finding-evidence-chain.d.ts.map +1 -0
  19. package/dist/commands/finding-evidence-chain.js +148 -0
  20. package/dist/commands/finding-evidence-chain.js.map +1 -0
  21. package/dist/commands/finding-fix-priority.d.ts +5 -0
  22. package/dist/commands/finding-fix-priority.d.ts.map +1 -0
  23. package/dist/commands/finding-fix-priority.js +99 -0
  24. package/dist/commands/finding-fix-priority.js.map +1 -0
  25. package/dist/commands/finding-hotfix-suggest.d.ts +8 -0
  26. package/dist/commands/finding-hotfix-suggest.d.ts.map +1 -0
  27. package/dist/commands/finding-hotfix-suggest.js +171 -0
  28. package/dist/commands/finding-hotfix-suggest.js.map +1 -0
  29. package/dist/commands/finding-noise-filter.d.ts +8 -0
  30. package/dist/commands/finding-noise-filter.d.ts.map +1 -0
  31. package/dist/commands/finding-noise-filter.js +141 -0
  32. package/dist/commands/finding-noise-filter.js.map +1 -0
  33. package/dist/commands/finding-trend-report.d.ts +5 -0
  34. package/dist/commands/finding-trend-report.d.ts.map +1 -0
  35. package/dist/commands/finding-trend-report.js +108 -0
  36. package/dist/commands/finding-trend-report.js.map +1 -0
  37. package/dist/commands/review-approval-gate.d.ts +8 -0
  38. package/dist/commands/review-approval-gate.d.ts.map +1 -0
  39. package/dist/commands/review-approval-gate.js +191 -0
  40. package/dist/commands/review-approval-gate.js.map +1 -0
  41. package/dist/commands/review-branch-compare.d.ts +5 -0
  42. package/dist/commands/review-branch-compare.d.ts.map +1 -0
  43. package/dist/commands/review-branch-compare.js +114 -0
  44. package/dist/commands/review-branch-compare.js.map +1 -0
  45. package/dist/commands/review-changelog-entry.d.ts +8 -0
  46. package/dist/commands/review-changelog-entry.d.ts.map +1 -0
  47. package/dist/commands/review-changelog-entry.js +110 -0
  48. package/dist/commands/review-changelog-entry.js.map +1 -0
  49. package/dist/commands/review-commit-hook.d.ts +8 -0
  50. package/dist/commands/review-commit-hook.d.ts.map +1 -0
  51. package/dist/commands/review-commit-hook.js +135 -0
  52. package/dist/commands/review-commit-hook.js.map +1 -0
  53. package/dist/commands/review-file-complexity.d.ts +5 -0
  54. package/dist/commands/review-file-complexity.d.ts.map +1 -0
  55. package/dist/commands/review-file-complexity.js +138 -0
  56. package/dist/commands/review-file-complexity.js.map +1 -0
  57. package/dist/commands/review-finding-link.d.ts +8 -0
  58. package/dist/commands/review-finding-link.d.ts.map +1 -0
  59. package/dist/commands/review-finding-link.js +116 -0
  60. package/dist/commands/review-finding-link.js.map +1 -0
  61. package/dist/commands/review-quota-check.d.ts +5 -0
  62. package/dist/commands/review-quota-check.d.ts.map +1 -0
  63. package/dist/commands/review-quota-check.js +98 -0
  64. package/dist/commands/review-quota-check.js.map +1 -0
  65. package/dist/commands/review-session-save.d.ts +5 -0
  66. package/dist/commands/review-session-save.d.ts.map +1 -0
  67. package/dist/commands/review-session-save.js +174 -0
  68. package/dist/commands/review-session-save.js.map +1 -0
  69. package/dist/commands/review-skip-list.d.ts +5 -0
  70. package/dist/commands/review-skip-list.d.ts.map +1 -0
  71. package/dist/commands/review-skip-list.js +136 -0
  72. package/dist/commands/review-skip-list.js.map +1 -0
  73. package/dist/commands/review-team-assign.d.ts +8 -0
  74. package/dist/commands/review-team-assign.d.ts.map +1 -0
  75. package/dist/commands/review-team-assign.js +212 -0
  76. package/dist/commands/review-team-assign.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Review-skip-list — Manage a list of files to skip during review.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname, join } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function skipFile() {
8
+ return join(process.cwd(), ".judges", "skip-list.json");
9
+ }
10
+ function loadSkipList() {
11
+ const f = skipFile();
12
+ if (!existsSync(f))
13
+ return [];
14
+ try {
15
+ return JSON.parse(readFileSync(f, "utf-8"));
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ }
21
+ function saveSkipList(list) {
22
+ const f = skipFile();
23
+ const d = dirname(f);
24
+ if (!existsSync(d))
25
+ mkdirSync(d, { recursive: true });
26
+ writeFileSync(f, JSON.stringify(list, null, 2));
27
+ }
28
+ function shouldSkip(filePath, list) {
29
+ for (const entry of list) {
30
+ if (entry.pattern.startsWith("*.") && filePath.endsWith(entry.pattern.slice(1)))
31
+ return entry;
32
+ if (filePath.includes(entry.pattern))
33
+ return entry;
34
+ if (filePath === entry.pattern)
35
+ return entry;
36
+ }
37
+ return null;
38
+ }
39
+ // ─── CLI ────────────────────────────────────────────────────────────────────
40
+ export function runReviewSkipList(argv) {
41
+ const sub = argv[0];
42
+ if (!sub || sub === "--help" || sub === "-h") {
43
+ console.log(`
44
+ judges review-skip-list — Manage skip list for reviews
45
+
46
+ Usage:
47
+ judges review-skip-list list
48
+ judges review-skip-list add --pattern <glob> [--reason <text>]
49
+ judges review-skip-list remove --pattern <glob>
50
+ judges review-skip-list test --file <path>
51
+ judges review-skip-list clear
52
+
53
+ Options:
54
+ --pattern <glob> File pattern to skip
55
+ --reason <text> Reason for skipping
56
+ --file <path> Test if a file would be skipped
57
+ --help, -h Show this help
58
+ `);
59
+ return;
60
+ }
61
+ const args = argv.slice(1);
62
+ const list = loadSkipList();
63
+ if (sub === "list") {
64
+ if (list.length === 0) {
65
+ console.log("Skip list is empty.");
66
+ return;
67
+ }
68
+ console.log(`\nSkip List (${list.length} entries)`);
69
+ console.log("═".repeat(60));
70
+ for (const e of list) {
71
+ const reason = e.reason ? ` — ${e.reason}` : "";
72
+ console.log(` ${e.pattern}${reason}`);
73
+ }
74
+ console.log("═".repeat(60));
75
+ }
76
+ else if (sub === "add") {
77
+ const patIdx = args.indexOf("--pattern");
78
+ const reasonIdx = args.indexOf("--reason");
79
+ const pattern = patIdx >= 0 ? args[patIdx + 1] : undefined;
80
+ if (!pattern) {
81
+ console.error("Error: --pattern required");
82
+ process.exitCode = 1;
83
+ return;
84
+ }
85
+ if (list.some((e) => e.pattern === pattern)) {
86
+ console.log(`Already in skip list: ${pattern}`);
87
+ return;
88
+ }
89
+ const reason = reasonIdx >= 0 ? args[reasonIdx + 1] : "";
90
+ list.push({ pattern, reason, addedAt: new Date().toISOString() });
91
+ saveSkipList(list);
92
+ console.log(`Added to skip list: ${pattern}`);
93
+ }
94
+ else if (sub === "remove") {
95
+ const patIdx = args.indexOf("--pattern");
96
+ const pattern = patIdx >= 0 ? args[patIdx + 1] : undefined;
97
+ if (!pattern) {
98
+ console.error("Error: --pattern required");
99
+ process.exitCode = 1;
100
+ return;
101
+ }
102
+ const filtered = list.filter((e) => e.pattern !== pattern);
103
+ if (filtered.length === list.length) {
104
+ console.error(`Not found: ${pattern}`);
105
+ process.exitCode = 1;
106
+ return;
107
+ }
108
+ saveSkipList(filtered);
109
+ console.log(`Removed: ${pattern}`);
110
+ }
111
+ else if (sub === "test") {
112
+ const fileIdx = args.indexOf("--file");
113
+ const filePath = fileIdx >= 0 ? args[fileIdx + 1] : undefined;
114
+ if (!filePath) {
115
+ console.error("Error: --file required");
116
+ process.exitCode = 1;
117
+ return;
118
+ }
119
+ const match = shouldSkip(filePath, list);
120
+ if (match) {
121
+ console.log(`SKIPPED: ${filePath} matches "${match.pattern}"${match.reason ? ` (${match.reason})` : ""}`);
122
+ }
123
+ else {
124
+ console.log(`NOT SKIPPED: ${filePath}`);
125
+ }
126
+ }
127
+ else if (sub === "clear") {
128
+ saveSkipList([]);
129
+ console.log("Skip list cleared.");
130
+ }
131
+ else {
132
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
133
+ process.exitCode = 1;
134
+ }
135
+ }
136
+ //# sourceMappingURL=review-skip-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-skip-list.js","sourceRoot":"","sources":["../../src/commands/review-skip-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Review-team-assign — Assign findings to team members.
3
+ *
4
+ * Manages team member assignments for findings based on
5
+ * expertise areas, load balancing, or manual assignment.
6
+ */
7
+ export declare function runReviewTeamAssign(argv: string[]): void;
8
+ //# sourceMappingURL=review-team-assign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-team-assign.d.ts","sourceRoot":"","sources":["../../src/commands/review-team-assign.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkFH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmJxD"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Review-team-assign — Assign findings to team members.
3
+ *
4
+ * Manages team member assignments for findings based on
5
+ * expertise areas, load balancing, or manual assignment.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { dirname, join } from "path";
9
+ // ─── Helpers ────────────────────────────────────────────────────────────────
10
+ function teamFile() {
11
+ return join(process.cwd(), ".judges", "team-config.json");
12
+ }
13
+ function assignmentFile() {
14
+ return join(process.cwd(), ".judges", "team-assignments.json");
15
+ }
16
+ function loadTeam() {
17
+ const f = teamFile();
18
+ if (!existsSync(f))
19
+ return [];
20
+ try {
21
+ return JSON.parse(readFileSync(f, "utf-8"));
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ function saveTeam(team) {
28
+ const f = teamFile();
29
+ const d = dirname(f);
30
+ if (!existsSync(d))
31
+ mkdirSync(d, { recursive: true });
32
+ writeFileSync(f, JSON.stringify(team, null, 2));
33
+ }
34
+ function loadAssignments() {
35
+ const f = assignmentFile();
36
+ if (!existsSync(f))
37
+ return [];
38
+ try {
39
+ return JSON.parse(readFileSync(f, "utf-8"));
40
+ }
41
+ catch {
42
+ return [];
43
+ }
44
+ }
45
+ function saveAssignments(assignments) {
46
+ const f = assignmentFile();
47
+ const d = dirname(f);
48
+ if (!existsSync(d))
49
+ mkdirSync(d, { recursive: true });
50
+ writeFileSync(f, JSON.stringify(assignments, null, 2));
51
+ }
52
+ function assignByExpertise(team, ruleId) {
53
+ const rulePrefix = ruleId.split("/")[0].toLowerCase();
54
+ // Find member with matching expertise (prefer least loaded)
55
+ const candidates = team
56
+ .filter((m) => m.expertise.some((e) => rulePrefix.includes(e.toLowerCase()) || e.toLowerCase().includes(rulePrefix)))
57
+ .sort((a, b) => a.assignedCount - b.assignedCount);
58
+ if (candidates.length > 0)
59
+ return candidates[0];
60
+ // Fall back to least loaded member
61
+ const sorted = [...team].sort((a, b) => a.assignedCount - b.assignedCount);
62
+ return sorted.length > 0 ? sorted[0] : null;
63
+ }
64
+ // ─── CLI ────────────────────────────────────────────────────────────────────
65
+ export function runReviewTeamAssign(argv) {
66
+ const sub = argv[0];
67
+ if (!sub || sub === "--help" || sub === "-h") {
68
+ console.log(`
69
+ judges review-team-assign — Assign findings to team members
70
+
71
+ Usage:
72
+ judges review-team-assign add-member --name <name> [--expertise <areas>]
73
+ judges review-team-assign remove-member --name <name>
74
+ judges review-team-assign list-team
75
+ judges review-team-assign auto-assign --file <verdict.json>
76
+ judges review-team-assign show-assignments [--format table|json]
77
+ judges review-team-assign clear
78
+
79
+ Options:
80
+ --name <name> Team member name
81
+ --expertise <areas> Comma-separated expertise areas
82
+ --file <path> Verdict JSON file for auto-assignment
83
+ --format <fmt> Output format: table (default), json
84
+ --help, -h Show this help
85
+ `);
86
+ return;
87
+ }
88
+ const args = argv.slice(1);
89
+ if (sub === "add-member") {
90
+ const nameIdx = args.indexOf("--name");
91
+ const expIdx = args.indexOf("--expertise");
92
+ const name = nameIdx >= 0 ? args[nameIdx + 1] : undefined;
93
+ if (!name) {
94
+ console.error("Error: --name required");
95
+ process.exitCode = 1;
96
+ return;
97
+ }
98
+ const expertise = expIdx >= 0 ? args[expIdx + 1].split(",") : [];
99
+ const team = loadTeam();
100
+ if (team.some((m) => m.name === name)) {
101
+ console.log(`Member already exists: ${name}`);
102
+ return;
103
+ }
104
+ team.push({ name, expertise, assignedCount: 0 });
105
+ saveTeam(team);
106
+ console.log(`Added team member: ${name} (expertise: ${expertise.join(", ") || "general"})`);
107
+ }
108
+ else if (sub === "remove-member") {
109
+ const nameIdx = args.indexOf("--name");
110
+ const name = nameIdx >= 0 ? args[nameIdx + 1] : undefined;
111
+ if (!name) {
112
+ console.error("Error: --name required");
113
+ process.exitCode = 1;
114
+ return;
115
+ }
116
+ const team = loadTeam().filter((m) => m.name !== name);
117
+ saveTeam(team);
118
+ console.log(`Removed: ${name}`);
119
+ }
120
+ else if (sub === "list-team") {
121
+ const team = loadTeam();
122
+ if (team.length === 0) {
123
+ console.log("No team members configured.");
124
+ return;
125
+ }
126
+ console.log(`\nTeam (${team.length} members)`);
127
+ console.log("═".repeat(50));
128
+ for (const m of team) {
129
+ console.log(` ${m.name} — expertise: ${m.expertise.join(", ") || "general"} (${m.assignedCount} assigned)`);
130
+ }
131
+ console.log("═".repeat(50));
132
+ }
133
+ else if (sub === "auto-assign") {
134
+ const fileIdx = args.indexOf("--file");
135
+ const filePath = fileIdx >= 0 ? args[fileIdx + 1] : undefined;
136
+ if (!filePath) {
137
+ console.error("Error: --file required");
138
+ process.exitCode = 1;
139
+ return;
140
+ }
141
+ if (!existsSync(filePath)) {
142
+ console.error(`Error: not found: ${filePath}`);
143
+ process.exitCode = 1;
144
+ return;
145
+ }
146
+ const team = loadTeam();
147
+ if (team.length === 0) {
148
+ console.error("Error: no team members. Use add-member first.");
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ let verdict;
153
+ try {
154
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
155
+ }
156
+ catch {
157
+ console.error("Error: invalid JSON");
158
+ process.exitCode = 1;
159
+ return;
160
+ }
161
+ const assignments = loadAssignments();
162
+ let newCount = 0;
163
+ for (const f of verdict.findings) {
164
+ const member = assignByExpertise(team, f.ruleId);
165
+ if (member) {
166
+ assignments.push({
167
+ ruleId: f.ruleId,
168
+ title: f.title,
169
+ severity: f.severity || "medium",
170
+ assignee: member.name,
171
+ assignedAt: new Date().toISOString(),
172
+ });
173
+ member.assignedCount++;
174
+ newCount++;
175
+ }
176
+ }
177
+ saveAssignments(assignments);
178
+ saveTeam(team);
179
+ console.log(`Auto-assigned ${newCount} findings to ${team.length} team members.`);
180
+ }
181
+ else if (sub === "show-assignments") {
182
+ const formatIdx = args.indexOf("--format");
183
+ const format = formatIdx >= 0 ? args[formatIdx + 1] : "table";
184
+ const assignments = loadAssignments();
185
+ if (assignments.length === 0) {
186
+ console.log("No assignments.");
187
+ return;
188
+ }
189
+ if (format === "json") {
190
+ console.log(JSON.stringify(assignments, null, 2));
191
+ return;
192
+ }
193
+ console.log(`\nAssignments (${assignments.length})`);
194
+ console.log("═".repeat(70));
195
+ console.log(`${"Assignee".padEnd(20)} ${"Severity".padEnd(10)} Title`);
196
+ console.log("─".repeat(70));
197
+ for (const a of assignments) {
198
+ const title = a.title.length > 35 ? a.title.slice(0, 35) + "…" : a.title;
199
+ console.log(`${a.assignee.padEnd(20)} ${a.severity.padEnd(10)} ${title}`);
200
+ }
201
+ console.log("═".repeat(70));
202
+ }
203
+ else if (sub === "clear") {
204
+ saveAssignments([]);
205
+ console.log("Assignments cleared.");
206
+ }
207
+ else {
208
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
209
+ process.exitCode = 1;
210
+ }
211
+ }
212
+ //# sourceMappingURL=review-team-assign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-team-assign.js","sourceRoot":"","sources":["../../src/commands/review-team-assign.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.82.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.82.0",
10
+ "version": "3.84.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.82.0",
15
+ "version": "3.84.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }