@kevinrabun/judges 3.43.0 → 3.45.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/burndown.d.ts +27 -0
  6. package/dist/commands/burndown.d.ts.map +1 -0
  7. package/dist/commands/burndown.js +180 -0
  8. package/dist/commands/burndown.js.map +1 -0
  9. package/dist/commands/compare-runs.d.ts +38 -0
  10. package/dist/commands/compare-runs.d.ts.map +1 -0
  11. package/dist/commands/compare-runs.js +229 -0
  12. package/dist/commands/compare-runs.js.map +1 -0
  13. package/dist/commands/correlate.d.ts +28 -0
  14. package/dist/commands/correlate.d.ts.map +1 -0
  15. package/dist/commands/correlate.js +242 -0
  16. package/dist/commands/correlate.js.map +1 -0
  17. package/dist/commands/digest.d.ts +20 -0
  18. package/dist/commands/digest.d.ts.map +1 -0
  19. package/dist/commands/digest.js +222 -0
  20. package/dist/commands/digest.js.map +1 -0
  21. package/dist/commands/explain-finding.d.ts +8 -0
  22. package/dist/commands/explain-finding.d.ts.map +1 -0
  23. package/dist/commands/explain-finding.js +279 -0
  24. package/dist/commands/explain-finding.js.map +1 -0
  25. package/dist/commands/judge-reputation.d.ts +29 -0
  26. package/dist/commands/judge-reputation.d.ts.map +1 -0
  27. package/dist/commands/judge-reputation.js +199 -0
  28. package/dist/commands/judge-reputation.js.map +1 -0
  29. package/dist/commands/kb.d.ts +41 -0
  30. package/dist/commands/kb.d.ts.map +1 -0
  31. package/dist/commands/kb.js +231 -0
  32. package/dist/commands/kb.js.map +1 -0
  33. package/dist/commands/noise-advisor.d.ts +30 -0
  34. package/dist/commands/noise-advisor.d.ts.map +1 -0
  35. package/dist/commands/noise-advisor.js +171 -0
  36. package/dist/commands/noise-advisor.js.map +1 -0
  37. package/dist/commands/query.d.ts +20 -0
  38. package/dist/commands/query.d.ts.map +1 -0
  39. package/dist/commands/query.js +230 -0
  40. package/dist/commands/query.js.map +1 -0
  41. package/dist/commands/recommend.d.ts +21 -0
  42. package/dist/commands/recommend.d.ts.map +1 -0
  43. package/dist/commands/recommend.js +283 -0
  44. package/dist/commands/recommend.js.map +1 -0
  45. package/dist/commands/report-template.d.ts +17 -0
  46. package/dist/commands/report-template.d.ts.map +1 -0
  47. package/dist/commands/report-template.js +291 -0
  48. package/dist/commands/report-template.js.map +1 -0
  49. package/dist/commands/review-queue.d.ts +34 -0
  50. package/dist/commands/review-queue.d.ts.map +1 -0
  51. package/dist/commands/review-queue.js +226 -0
  52. package/dist/commands/review-queue.js.map +1 -0
  53. package/dist/commands/rule-owner.d.ts +31 -0
  54. package/dist/commands/rule-owner.d.ts.map +1 -0
  55. package/dist/commands/rule-owner.js +182 -0
  56. package/dist/commands/rule-owner.js.map +1 -0
  57. package/dist/commands/rule-share.d.ts +35 -0
  58. package/dist/commands/rule-share.d.ts.map +1 -0
  59. package/dist/commands/rule-share.js +203 -0
  60. package/dist/commands/rule-share.js.map +1 -0
  61. package/dist/commands/suppress.d.ts +40 -0
  62. package/dist/commands/suppress.d.ts.map +1 -0
  63. package/dist/commands/suppress.js +209 -0
  64. package/dist/commands/suppress.js.map +1 -0
  65. package/dist/commands/vote.d.ts +32 -0
  66. package/dist/commands/vote.d.ts.map +1 -0
  67. package/dist/commands/vote.js +201 -0
  68. package/dist/commands/vote.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Batch false-positive suppression — suppress findings by glob, rule
3
+ * prefix, severity, or pattern with a full audit trail.
4
+ *
5
+ * Suppressions stored locally in .judges-suppressions.json.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from "fs";
8
+ const SUPPRESSION_FILE = ".judges-suppressions.json";
9
+ // ─── Core ───────────────────────────────────────────────────────────────────
10
+ function loadDb(file = SUPPRESSION_FILE) {
11
+ if (!existsSync(file))
12
+ return { version: 1, rules: [] };
13
+ return JSON.parse(readFileSync(file, "utf-8"));
14
+ }
15
+ function saveDb(db, file = SUPPRESSION_FILE) {
16
+ writeFileSync(file, JSON.stringify(db, null, 2));
17
+ }
18
+ function generateId() {
19
+ return `sup-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
20
+ }
21
+ function matchesGlob(filePath, glob) {
22
+ const regex = glob
23
+ .replace(/\./g, "\\.")
24
+ .replace(/\*\*/g, "§DOUBLESTAR§")
25
+ .replace(/\*/g, "[^/]*")
26
+ .replace(/§DOUBLESTAR§/g, ".*")
27
+ .replace(/\?/g, ".");
28
+ return new RegExp(`^${regex}$`).test(filePath);
29
+ }
30
+ export function addSuppression(opts) {
31
+ const db = loadDb();
32
+ const rule = {
33
+ id: generateId(),
34
+ fileGlob: opts.fileGlob,
35
+ rulePrefix: opts.rulePrefix,
36
+ ruleIds: opts.ruleIds,
37
+ maxSeverity: opts.maxSeverity,
38
+ reason: opts.reason,
39
+ author: opts.author || process.env.USER || process.env.USERNAME || "unknown",
40
+ createdIso: new Date().toISOString(),
41
+ active: true,
42
+ };
43
+ if (opts.expiresIn) {
44
+ const exp = new Date();
45
+ exp.setDate(exp.getDate() + opts.expiresIn);
46
+ rule.expiresIso = exp.toISOString();
47
+ }
48
+ db.rules.push(rule);
49
+ saveDb(db);
50
+ return rule;
51
+ }
52
+ export function removeSuppression(id) {
53
+ const db = loadDb();
54
+ const idx = db.rules.findIndex((r) => r.id === id);
55
+ if (idx < 0)
56
+ return false;
57
+ db.rules[idx].active = false;
58
+ saveDb(db);
59
+ return true;
60
+ }
61
+ export function isFindiingSuppressed(ruleId, severity, filePath) {
62
+ const db = loadDb();
63
+ const now = Date.now();
64
+ const severityOrder = ["critical", "high", "medium", "low", "info"];
65
+ for (const rule of db.rules) {
66
+ if (!rule.active)
67
+ continue;
68
+ if (rule.expiresIso && new Date(rule.expiresIso).getTime() < now)
69
+ continue;
70
+ // Check file glob
71
+ if (rule.fileGlob && filePath && !matchesGlob(filePath, rule.fileGlob))
72
+ continue;
73
+ if (rule.fileGlob && !filePath)
74
+ continue;
75
+ // Check rule prefix
76
+ if (rule.rulePrefix && !ruleId.startsWith(rule.rulePrefix))
77
+ continue;
78
+ // Check exact rule IDs
79
+ if (rule.ruleIds && rule.ruleIds.length > 0 && !rule.ruleIds.includes(ruleId))
80
+ continue;
81
+ // Check severity
82
+ if (rule.maxSeverity) {
83
+ const maxIdx = severityOrder.indexOf(rule.maxSeverity);
84
+ const sevIdx = severityOrder.indexOf(severity);
85
+ if (maxIdx >= 0 && sevIdx >= 0 && sevIdx < maxIdx)
86
+ continue;
87
+ }
88
+ // If no criteria were specified besides reason/author, it matches nothing
89
+ if (!rule.fileGlob && !rule.rulePrefix && (!rule.ruleIds || rule.ruleIds.length === 0) && !rule.maxSeverity)
90
+ continue;
91
+ return true;
92
+ }
93
+ return false;
94
+ }
95
+ // ─── CLI ────────────────────────────────────────────────────────────────────
96
+ export function runSuppress(argv) {
97
+ if (argv.includes("--help") || argv.includes("-h")) {
98
+ console.log(`
99
+ judges suppress — Batch false-positive suppression with audit trail
100
+
101
+ Usage:
102
+ judges suppress --glob "**/*.test.ts" --rule-prefix AUTH --reason "Test files"
103
+ judges suppress --rule SEC-001,SEC-002 --reason "Not applicable to internal APIs"
104
+ judges suppress --max-severity low --reason "Low severity not actionable"
105
+ judges suppress --list Show all suppression rules
106
+ judges suppress --remove <id> Deactivate a suppression rule
107
+ judges suppress --stats Show suppression statistics
108
+
109
+ Options:
110
+ --glob <pattern> File glob pattern
111
+ --rule-prefix <pfx> Rule ID prefix (e.g., AUTH, SEC, PERF)
112
+ --rule <ids> Comma-separated rule IDs
113
+ --max-severity <sev> Suppress this severity and below
114
+ --reason <text> Reason for suppression (required for new rules)
115
+ --author <name> Who created this suppression
116
+ --expires-in <days> Auto-expire after N days
117
+ --list List suppression rules
118
+ --remove <id> Deactivate a suppression rule
119
+ --stats Show suppression statistics
120
+ --help, -h Show this help
121
+ `);
122
+ return;
123
+ }
124
+ if (argv.includes("--list")) {
125
+ const db = loadDb();
126
+ const active = db.rules.filter((r) => r.active);
127
+ const inactive = db.rules.filter((r) => !r.active);
128
+ console.log(`\n Suppression Rules (${active.length} active, ${inactive.length} inactive)\n ─────────────────`);
129
+ for (const r of active) {
130
+ const parts = [];
131
+ if (r.fileGlob)
132
+ parts.push(`glob: ${r.fileGlob}`);
133
+ if (r.rulePrefix)
134
+ parts.push(`prefix: ${r.rulePrefix}`);
135
+ if (r.ruleIds?.length)
136
+ parts.push(`rules: ${r.ruleIds.join(",")}`);
137
+ if (r.maxSeverity)
138
+ parts.push(`max-sev: ${r.maxSeverity}`);
139
+ const exp = r.expiresIso ? ` (expires ${r.expiresIso.split("T")[0]})` : "";
140
+ console.log(` ${r.id} ${parts.join(" | ")}${exp}`);
141
+ console.log(` Reason: ${r.reason} — by ${r.author} on ${r.createdIso.split("T")[0]}`);
142
+ }
143
+ console.log("");
144
+ return;
145
+ }
146
+ const removeId = argv.find((_a, i) => argv[i - 1] === "--remove");
147
+ if (removeId) {
148
+ if (removeSuppression(removeId)) {
149
+ console.log(` Deactivated: ${removeId}`);
150
+ }
151
+ else {
152
+ console.error(` Error: not found: ${removeId}`);
153
+ }
154
+ return;
155
+ }
156
+ if (argv.includes("--stats")) {
157
+ const db = loadDb();
158
+ const active = db.rules.filter((r) => r.active);
159
+ const byPrefix = {};
160
+ for (const r of active) {
161
+ const key = r.rulePrefix || r.ruleIds?.[0]?.split("-")[0] || "other";
162
+ byPrefix[key] = (byPrefix[key] || 0) + 1;
163
+ }
164
+ console.log(`\n Total rules: ${db.rules.length} (${active.length} active)`);
165
+ for (const [k, v] of Object.entries(byPrefix)) {
166
+ console.log(` ${k.padEnd(12)} ${v}`);
167
+ }
168
+ console.log("");
169
+ return;
170
+ }
171
+ // Add new suppression
172
+ const glob = argv.find((_a, i) => argv[i - 1] === "--glob");
173
+ const rulePrefix = argv.find((_a, i) => argv[i - 1] === "--rule-prefix");
174
+ const ruleStr = argv.find((_a, i) => argv[i - 1] === "--rule");
175
+ const maxSeverity = argv.find((_a, i) => argv[i - 1] === "--max-severity");
176
+ const reason = argv.find((_a, i) => argv[i - 1] === "--reason");
177
+ const author = argv.find((_a, i) => argv[i - 1] === "--author");
178
+ const expiresStr = argv.find((_a, i) => argv[i - 1] === "--expires-in");
179
+ if (!reason) {
180
+ console.error("Error: --reason is required");
181
+ process.exit(1);
182
+ }
183
+ if (!glob && !rulePrefix && !ruleStr && !maxSeverity) {
184
+ console.error("Error: At least one of --glob, --rule-prefix, --rule, or --max-severity required");
185
+ process.exit(1);
186
+ }
187
+ const rule = addSuppression({
188
+ fileGlob: glob,
189
+ rulePrefix,
190
+ ruleIds: ruleStr ? ruleStr.split(",").map((s) => s.trim()) : undefined,
191
+ maxSeverity,
192
+ reason,
193
+ author,
194
+ expiresIn: expiresStr ? parseInt(expiresStr, 10) : undefined,
195
+ });
196
+ console.log(` ✅ Suppression created: ${rule.id}`);
197
+ const parts = [];
198
+ if (rule.fileGlob)
199
+ parts.push(`glob: ${rule.fileGlob}`);
200
+ if (rule.rulePrefix)
201
+ parts.push(`prefix: ${rule.rulePrefix}`);
202
+ if (rule.ruleIds?.length)
203
+ parts.push(`rules: ${rule.ruleIds.join(",")}`);
204
+ if (rule.maxSeverity)
205
+ parts.push(`max-sev: ${rule.maxSeverity}`);
206
+ console.log(` ${parts.join(" | ")}`);
207
+ console.log(` Reason: ${rule.reason}`);
208
+ }
209
+ //# sourceMappingURL=suppress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppress.js","sourceRoot":"","sources":["../../src/commands/suppress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Consensus voting — multi-developer voting on findings.
3
+ * Aggregate team confidence in whether a finding is a true positive.
4
+ *
5
+ * Stored locally in .judges-votes.json.
6
+ */
7
+ export interface Vote {
8
+ voter: string;
9
+ verdict: "agree" | "disagree" | "unsure";
10
+ comment?: string;
11
+ timestamp: string;
12
+ }
13
+ export interface VotedFinding {
14
+ findingId: string;
15
+ ruleId: string;
16
+ title: string;
17
+ votes: Vote[];
18
+ consensus?: "true-positive" | "false-positive" | "disputed" | "pending";
19
+ consensusScore: number;
20
+ }
21
+ export declare function castVote(findingId: string, ruleId: string, title: string, voter: string, verdict: Vote["verdict"], comment?: string): VotedFinding;
22
+ export declare function getVoteStats(): {
23
+ total: number;
24
+ truePositive: number;
25
+ falsePositive: number;
26
+ disputed: number;
27
+ pending: number;
28
+ totalVotes: number;
29
+ uniqueVoters: number;
30
+ };
31
+ export declare function runVote(argv: string[]): void;
32
+ //# sourceMappingURL=vote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote.d.ts","sourceRoot":"","sources":["../../src/commands/vote.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,CAAC,EAAE,eAAe,GAAG,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAAC;IACxE,cAAc,EAAE,MAAM,CAAC;CACxB;AAgCD,wBAAgB,QAAQ,CACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,YAAY,CAwBd;AAED,wBAAgB,YAAY,IAAI;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAeA;AAID,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0I5C"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Consensus voting — multi-developer voting on findings.
3
+ * Aggregate team confidence in whether a finding is a true positive.
4
+ *
5
+ * Stored locally in .judges-votes.json.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from "fs";
8
+ const VOTE_FILE = ".judges-votes.json";
9
+ // ─── Core ───────────────────────────────────────────────────────────────────
10
+ function loadDb(file = VOTE_FILE) {
11
+ if (!existsSync(file))
12
+ return { findings: [] };
13
+ return JSON.parse(readFileSync(file, "utf-8"));
14
+ }
15
+ function saveDb(db, file = VOTE_FILE) {
16
+ writeFileSync(file, JSON.stringify(db, null, 2));
17
+ }
18
+ function computeConsensus(votes) {
19
+ if (votes.length === 0)
20
+ return { consensus: "pending", score: 0 };
21
+ const weights = { agree: 1, disagree: -1, unsure: 0 };
22
+ const totalWeight = votes.reduce((sum, v) => sum + weights[v.verdict], 0);
23
+ const score = Math.round((totalWeight / votes.length) * 100) / 100;
24
+ if (votes.length < 2)
25
+ return { consensus: "pending", score };
26
+ if (score > 0.5)
27
+ return { consensus: "true-positive", score };
28
+ if (score < -0.5)
29
+ return { consensus: "false-positive", score };
30
+ return { consensus: "disputed", score };
31
+ }
32
+ export function castVote(findingId, ruleId, title, voter, verdict, comment) {
33
+ const db = loadDb();
34
+ let finding = db.findings.find((f) => f.findingId === findingId);
35
+ if (!finding) {
36
+ finding = { findingId, ruleId, title, votes: [], consensusScore: 0 };
37
+ db.findings.push(finding);
38
+ }
39
+ // Update or add vote
40
+ const existing = finding.votes.findIndex((v) => v.voter === voter);
41
+ const vote = { voter, verdict, comment, timestamp: new Date().toISOString() };
42
+ if (existing >= 0) {
43
+ finding.votes[existing] = vote;
44
+ }
45
+ else {
46
+ finding.votes.push(vote);
47
+ }
48
+ const { consensus, score } = computeConsensus(finding.votes);
49
+ finding.consensus = consensus;
50
+ finding.consensusScore = score;
51
+ saveDb(db);
52
+ return finding;
53
+ }
54
+ export function getVoteStats() {
55
+ const db = loadDb();
56
+ const voters = new Set();
57
+ for (const f of db.findings) {
58
+ for (const v of f.votes)
59
+ voters.add(v.voter);
60
+ }
61
+ return {
62
+ total: db.findings.length,
63
+ truePositive: db.findings.filter((f) => f.consensus === "true-positive").length,
64
+ falsePositive: db.findings.filter((f) => f.consensus === "false-positive").length,
65
+ disputed: db.findings.filter((f) => f.consensus === "disputed").length,
66
+ pending: db.findings.filter((f) => f.consensus === "pending").length,
67
+ totalVotes: db.findings.reduce((s, f) => s + f.votes.length, 0),
68
+ uniqueVoters: voters.size,
69
+ };
70
+ }
71
+ // ─── CLI ────────────────────────────────────────────────────────────────────
72
+ export function runVote(argv) {
73
+ if (argv.includes("--help") || argv.includes("-h")) {
74
+ console.log(`
75
+ judges vote — Consensus voting on findings
76
+
77
+ Usage:
78
+ judges vote --finding <id> --voter "Alice" --verdict agree
79
+ judges vote --finding <id> --voter "Bob" --verdict disagree --comment "FP in test code"
80
+ judges vote --list Show all voted findings
81
+ judges vote --consensus Show findings with consensus
82
+ judges vote --disputed Show disputed findings
83
+ judges vote --stats Voting statistics
84
+
85
+ Options:
86
+ --finding <id> Finding ID (ruleId:title format)
87
+ --rule <id> Rule ID for the finding
88
+ --title <text> Finding title
89
+ --voter <name> Voter name
90
+ --verdict <v> agree | disagree | unsure
91
+ --comment <text> Optional comment
92
+ --list List all voted findings
93
+ --consensus Show findings with clear consensus
94
+ --disputed Show disputed findings
95
+ --stats Show statistics
96
+ --format json JSON output
97
+ --help, -h Show this help
98
+ `);
99
+ return;
100
+ }
101
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
102
+ // Cast vote
103
+ const findingId = argv.find((_a, i) => argv[i - 1] === "--finding");
104
+ const voter = argv.find((_a, i) => argv[i - 1] === "--voter");
105
+ const verdict = argv.find((_a, i) => argv[i - 1] === "--verdict");
106
+ if (findingId && voter && verdict) {
107
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || findingId.split(":")[0];
108
+ const title = argv.find((_a, i) => argv[i - 1] === "--title") || findingId;
109
+ const comment = argv.find((_a, i) => argv[i - 1] === "--comment");
110
+ const result = castVote(findingId, ruleId, title, voter, verdict, comment);
111
+ if (format === "json") {
112
+ console.log(JSON.stringify(result, null, 2));
113
+ }
114
+ else {
115
+ console.log(` ✅ Vote recorded: ${voter} → ${verdict} on ${findingId}`);
116
+ console.log(` Consensus: ${result.consensus} (score: ${result.consensusScore}, ${result.votes.length} vote(s))`);
117
+ }
118
+ return;
119
+ }
120
+ const db = loadDb();
121
+ // List disputed
122
+ if (argv.includes("--disputed")) {
123
+ const disputed = db.findings.filter((f) => f.consensus === "disputed");
124
+ if (format === "json") {
125
+ console.log(JSON.stringify(disputed, null, 2));
126
+ }
127
+ else if (disputed.length === 0) {
128
+ console.log("\n No disputed findings.\n");
129
+ }
130
+ else {
131
+ console.log(`\n Disputed Findings (${disputed.length})\n ──────────────────`);
132
+ for (const f of disputed) {
133
+ const agree = f.votes.filter((v) => v.verdict === "agree").length;
134
+ const disagree = f.votes.filter((v) => v.verdict === "disagree").length;
135
+ console.log(` ${f.ruleId.padEnd(12)} ${f.title.slice(0, 40)} — ${agree} agree, ${disagree} disagree`);
136
+ }
137
+ console.log("");
138
+ }
139
+ return;
140
+ }
141
+ // Consensus view
142
+ if (argv.includes("--consensus")) {
143
+ const decided = db.findings.filter((f) => f.consensus === "true-positive" || f.consensus === "false-positive");
144
+ if (format === "json") {
145
+ console.log(JSON.stringify(decided, null, 2));
146
+ }
147
+ else {
148
+ console.log(`\n Consensus Findings (${decided.length})\n ────────────────────`);
149
+ for (const f of decided) {
150
+ const icon = f.consensus === "true-positive" ? "✅" : "❌";
151
+ console.log(` ${icon} ${f.ruleId.padEnd(12)} ${f.consensus?.padEnd(16)} score: ${f.consensusScore} (${f.votes.length} votes)`);
152
+ }
153
+ console.log("");
154
+ }
155
+ return;
156
+ }
157
+ // Stats
158
+ if (argv.includes("--stats")) {
159
+ const s = getVoteStats();
160
+ if (format === "json") {
161
+ console.log(JSON.stringify(s, null, 2));
162
+ }
163
+ else {
164
+ console.log(`
165
+ Voting Statistics
166
+ ─────────────────
167
+ Findings voted on: ${s.total}
168
+ True positives: ${s.truePositive}
169
+ False positives: ${s.falsePositive}
170
+ Disputed: ${s.disputed}
171
+ Pending: ${s.pending}
172
+ Total votes cast: ${s.totalVotes}
173
+ Unique voters: ${s.uniqueVoters}
174
+ `);
175
+ }
176
+ return;
177
+ }
178
+ // Default: list all
179
+ if (db.findings.length === 0) {
180
+ console.log("\n No votes recorded. Use --finding and --voter to cast a vote.\n");
181
+ return;
182
+ }
183
+ if (format === "json") {
184
+ console.log(JSON.stringify(db.findings, null, 2));
185
+ }
186
+ else {
187
+ console.log(`\n All Voted Findings (${db.findings.length})\n ───────────────────────`);
188
+ for (const f of db.findings) {
189
+ const icon = f.consensus === "true-positive"
190
+ ? "✅"
191
+ : f.consensus === "false-positive"
192
+ ? "❌"
193
+ : f.consensus === "disputed"
194
+ ? "⚠️"
195
+ : "⏳";
196
+ console.log(` ${icon} ${f.ruleId.padEnd(12)} ${f.consensus?.padEnd(16) || "pending".padEnd(16)} ${f.votes.length} vote(s) — ${f.title.slice(0, 40)}`);
197
+ }
198
+ console.log("");
199
+ }
200
+ }
201
+ //# sourceMappingURL=vote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote.js","sourceRoot":"","sources":["../../src/commands/vote.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.43.0",
3
+ "version": "3.45.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.43.0",
10
+ "version": "3.45.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.43.0",
15
+ "version": "3.45.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }