@kevinrabun/judges 3.44.0 → 3.46.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/audit-bundle.d.ts +29 -0
  6. package/dist/commands/audit-bundle.d.ts.map +1 -0
  7. package/dist/commands/audit-bundle.js +235 -0
  8. package/dist/commands/audit-bundle.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/config-drift.d.ts +25 -0
  14. package/dist/commands/config-drift.d.ts.map +1 -0
  15. package/dist/commands/config-drift.js +214 -0
  16. package/dist/commands/config-drift.js.map +1 -0
  17. package/dist/commands/correlate.d.ts +28 -0
  18. package/dist/commands/correlate.d.ts.map +1 -0
  19. package/dist/commands/correlate.js +242 -0
  20. package/dist/commands/correlate.js.map +1 -0
  21. package/dist/commands/dev-score.d.ts +37 -0
  22. package/dist/commands/dev-score.d.ts.map +1 -0
  23. package/dist/commands/dev-score.js +204 -0
  24. package/dist/commands/dev-score.js.map +1 -0
  25. package/dist/commands/digest.d.ts +20 -0
  26. package/dist/commands/digest.d.ts.map +1 -0
  27. package/dist/commands/digest.js +222 -0
  28. package/dist/commands/digest.js.map +1 -0
  29. package/dist/commands/explain-finding.d.ts +8 -0
  30. package/dist/commands/explain-finding.d.ts.map +1 -0
  31. package/dist/commands/explain-finding.js +279 -0
  32. package/dist/commands/explain-finding.js.map +1 -0
  33. package/dist/commands/generate.d.ts +8 -0
  34. package/dist/commands/generate.d.ts.map +1 -0
  35. package/dist/commands/generate.js +404 -0
  36. package/dist/commands/generate.js.map +1 -0
  37. package/dist/commands/judge-reputation.d.ts +29 -0
  38. package/dist/commands/judge-reputation.d.ts.map +1 -0
  39. package/dist/commands/judge-reputation.js +199 -0
  40. package/dist/commands/judge-reputation.js.map +1 -0
  41. package/dist/commands/learn.d.ts +27 -0
  42. package/dist/commands/learn.d.ts.map +1 -0
  43. package/dist/commands/learn.js +289 -0
  44. package/dist/commands/learn.js.map +1 -0
  45. package/dist/commands/model-risk.d.ts +28 -0
  46. package/dist/commands/model-risk.d.ts.map +1 -0
  47. package/dist/commands/model-risk.js +221 -0
  48. package/dist/commands/model-risk.js.map +1 -0
  49. package/dist/commands/query.d.ts +20 -0
  50. package/dist/commands/query.d.ts.map +1 -0
  51. package/dist/commands/query.js +230 -0
  52. package/dist/commands/query.js.map +1 -0
  53. package/dist/commands/reg-watch.d.ts +21 -0
  54. package/dist/commands/reg-watch.d.ts.map +1 -0
  55. package/dist/commands/reg-watch.js +220 -0
  56. package/dist/commands/reg-watch.js.map +1 -0
  57. package/dist/commands/retro.d.ts +23 -0
  58. package/dist/commands/retro.d.ts.map +1 -0
  59. package/dist/commands/retro.js +217 -0
  60. package/dist/commands/retro.js.map +1 -0
  61. package/dist/commands/rule-share.d.ts +35 -0
  62. package/dist/commands/rule-share.d.ts.map +1 -0
  63. package/dist/commands/rule-share.js +203 -0
  64. package/dist/commands/rule-share.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,217 @@
1
+ /**
2
+ * Security incident retrospective — analyze whether Judges would have
3
+ * caught a specific vulnerability by running evaluation against
4
+ * historical code state.
5
+ *
6
+ * Uses local git history and evaluation results.
7
+ */
8
+ import { readFileSync, writeFileSync, existsSync } from "fs";
9
+ import { execSync } from "child_process";
10
+ const RETRO_FILE = ".judges-retro.json";
11
+ // ─── Core ───────────────────────────────────────────────────────────────────
12
+ function getFileAtCommit(file, commit) {
13
+ try {
14
+ return execSync(`git show ${commit}:${file}`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ function checkSuppressions(findings) {
21
+ const suppressionFile = ".judges-suppressions.json";
22
+ if (!existsSync(suppressionFile))
23
+ return { suppressed: false, rules: [] };
24
+ try {
25
+ const data = JSON.parse(readFileSync(suppressionFile, "utf-8"));
26
+ const suppressedRules = [];
27
+ for (const finding of findings) {
28
+ const isSuppressed = (data.suppressions || []).some((s) => s.ruleId === finding.ruleId || (s.rulePrefix && finding.ruleId.startsWith(s.rulePrefix)));
29
+ if (isSuppressed)
30
+ suppressedRules.push(finding.ruleId);
31
+ }
32
+ return { suppressed: suppressedRules.length > 0, rules: suppressedRules };
33
+ }
34
+ catch {
35
+ return { suppressed: false, rules: [] };
36
+ }
37
+ }
38
+ function loadResultsForFile(_file) {
39
+ const resultsFile = ".judges-results.json";
40
+ if (!existsSync(resultsFile))
41
+ return [];
42
+ try {
43
+ const data = JSON.parse(readFileSync(resultsFile, "utf-8"));
44
+ const findings = Array.isArray(data) ? data : data.findings || [];
45
+ // Filter findings that might relate to the target file based on ruleId patterns
46
+ return findings;
47
+ }
48
+ catch {
49
+ return [];
50
+ }
51
+ }
52
+ export function runRetroAnalysis(file, commit, cve) {
53
+ let codeContent = null;
54
+ if (commit) {
55
+ codeContent = getFileAtCommit(file, commit);
56
+ }
57
+ else if (existsSync(file)) {
58
+ codeContent = readFileSync(file, "utf-8");
59
+ }
60
+ if (!codeContent) {
61
+ return {
62
+ file,
63
+ commit,
64
+ cve,
65
+ wouldCatch: false,
66
+ matchingFindings: [],
67
+ configWouldSuppress: false,
68
+ analysis: `Could not read file${commit ? ` at commit ${commit}` : ""}.`,
69
+ };
70
+ }
71
+ // Look for vulnerability patterns in the code
72
+ const findings = loadResultsForFile(file);
73
+ // Check for common vulnerability patterns
74
+ const patterns = [
75
+ {
76
+ pattern: /\$\{.*\}.*(?:SELECT|INSERT|UPDATE|DELETE)/i,
77
+ ruleId: "SEC001",
78
+ title: "SQL Injection via template literal",
79
+ severity: "critical",
80
+ },
81
+ { pattern: /eval\s*\(/, ruleId: "SEC002", title: "Dangerous eval() usage", severity: "critical" },
82
+ {
83
+ pattern: /(?:password|secret|key|token)\s*[:=]\s*['"][^'"]+['"]/i,
84
+ ruleId: "AUTH001",
85
+ title: "Hardcoded credentials",
86
+ severity: "critical",
87
+ },
88
+ { pattern: /\.innerHTML\s*=/, ruleId: "SEC003", title: "XSS via innerHTML", severity: "high" },
89
+ { pattern: /exec\s*\(.*\+/, ruleId: "INJECT001", title: "Command injection risk", severity: "critical" },
90
+ { pattern: /md5|sha1[^-]|DES|RC4/i, ruleId: "CRYPTO001", title: "Weak cryptographic algorithm", severity: "high" },
91
+ { pattern: /catch\s*\([^)]*\)\s*\{\s*\}/, ruleId: "ERR001", title: "Empty catch block", severity: "medium" },
92
+ { pattern: /http:\/\/(?!localhost)/, ruleId: "SEC004", title: "Insecure HTTP usage", severity: "medium" },
93
+ { pattern: /cors\(\s*\)/, ruleId: "SEC005", title: "Overly permissive CORS", severity: "high" },
94
+ {
95
+ pattern: /verify\s*[:=]\s*false|rejectUnauthorized\s*[:=]\s*false/i,
96
+ ruleId: "SEC006",
97
+ title: "TLS verification disabled",
98
+ severity: "critical",
99
+ },
100
+ ];
101
+ const detectedFindings = [];
102
+ const lines = codeContent.split("\n");
103
+ for (const p of patterns) {
104
+ for (let i = 0; i < lines.length; i++) {
105
+ if (p.pattern.test(lines[i])) {
106
+ detectedFindings.push({
107
+ ruleId: p.ruleId,
108
+ title: p.title,
109
+ severity: p.severity,
110
+ description: `Pattern detected at line ${i + 1}: ${lines[i].trim().slice(0, 80)}`,
111
+ recommendation: `Review and remediate ${p.ruleId} finding`,
112
+ lineNumbers: [i + 1],
113
+ confidence: 0.85,
114
+ });
115
+ }
116
+ }
117
+ }
118
+ const allFindings = [...findings, ...detectedFindings];
119
+ const { suppressed, rules } = checkSuppressions(allFindings);
120
+ const analysis = allFindings.length > 0
121
+ ? `Judges would detect ${allFindings.length} finding(s) in this file.${suppressed ? ` Warning: ${rules.length} finding(s) would be suppressed by current config.` : ""}`
122
+ : "Judges did not detect vulnerability patterns in this file. Consider adding a custom rule.";
123
+ const result = {
124
+ file,
125
+ commit,
126
+ cve,
127
+ wouldCatch: allFindings.length > 0 && !suppressed,
128
+ matchingFindings: allFindings,
129
+ configWouldSuppress: suppressed,
130
+ suppressedBy: suppressed ? rules : undefined,
131
+ analysis,
132
+ };
133
+ // Save retrospective
134
+ const retros = existsSync(RETRO_FILE) ? JSON.parse(readFileSync(RETRO_FILE, "utf-8")) : [];
135
+ retros.push(result);
136
+ writeFileSync(RETRO_FILE, JSON.stringify(retros, null, 2));
137
+ return result;
138
+ }
139
+ // ─── CLI ────────────────────────────────────────────────────────────────────
140
+ export function runRetro(argv) {
141
+ if (argv.includes("--help") || argv.includes("-h")) {
142
+ console.log(`
143
+ judges retro — Security incident retrospective
144
+
145
+ Usage:
146
+ judges retro --file src/handler.ts
147
+ judges retro --file src/handler.ts --commit abc123
148
+ judges retro --file src/handler.ts --cve CVE-2025-1234
149
+ judges retro --history
150
+
151
+ Options:
152
+ --file <path> File to analyze
153
+ --commit <sha> Git commit to check (reconstructs code at that point)
154
+ --cve <id> CVE identifier to tag the analysis
155
+ --history Show previous retrospectives
156
+ --format json JSON output
157
+ --help, -h Show this help
158
+ `);
159
+ return;
160
+ }
161
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
162
+ // History
163
+ if (argv.includes("--history")) {
164
+ if (!existsSync(RETRO_FILE)) {
165
+ console.log("\n No retrospectives recorded.\n");
166
+ return;
167
+ }
168
+ const retros = JSON.parse(readFileSync(RETRO_FILE, "utf-8"));
169
+ if (format === "json") {
170
+ console.log(JSON.stringify(retros, null, 2));
171
+ }
172
+ else {
173
+ console.log(`\n Retrospective History (${retros.length})\n ─────────────────────────`);
174
+ for (const r of retros) {
175
+ const icon = r.wouldCatch ? "✅" : "❌";
176
+ console.log(` ${icon} ${r.file}${r.commit ? ` @ ${r.commit.slice(0, 7)}` : ""}${r.cve ? ` (${r.cve})` : ""} — ${r.matchingFindings.length} finding(s)`);
177
+ }
178
+ console.log("");
179
+ }
180
+ return;
181
+ }
182
+ // Run retro
183
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
184
+ if (!file) {
185
+ console.error(" ❌ Provide --file. Use --help for usage.");
186
+ return;
187
+ }
188
+ const commit = argv.find((_a, i) => argv[i - 1] === "--commit");
189
+ const cve = argv.find((_a, i) => argv[i - 1] === "--cve");
190
+ const result = runRetroAnalysis(file, commit || undefined, cve || undefined);
191
+ if (format === "json") {
192
+ console.log(JSON.stringify(result, null, 2));
193
+ }
194
+ else {
195
+ const icon = result.wouldCatch ? "✅" : "❌";
196
+ console.log(`\n ${icon} Retrospective Analysis — ${result.file}`);
197
+ if (result.commit)
198
+ console.log(` Commit: ${result.commit}`);
199
+ if (result.cve)
200
+ console.log(` CVE: ${result.cve}`);
201
+ console.log(` ────────────────────────────────`);
202
+ console.log(` Would Judges catch this? ${result.wouldCatch ? "YES" : "NO"}`);
203
+ console.log(` Findings detected: ${result.matchingFindings.length}`);
204
+ if (result.configWouldSuppress) {
205
+ console.log(` ⚠️ Config would suppress: ${(result.suppressedBy || []).join(", ")}`);
206
+ }
207
+ console.log(`\n Analysis: ${result.analysis}`);
208
+ if (result.matchingFindings.length > 0) {
209
+ console.log("\n Detected Findings:");
210
+ for (const f of result.matchingFindings) {
211
+ console.log(` [${f.severity.toUpperCase()}] ${f.ruleId} — ${f.title}`);
212
+ }
213
+ }
214
+ console.log("");
215
+ }
216
+ }
217
+ //# sourceMappingURL=retro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retro.js","sourceRoot":"","sources":["../../src/commands/retro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Custom rule sharing — export/import custom rule configurations
3
+ * across teams and organizations.
4
+ *
5
+ * Stored locally in .judges-shared-rules/ directory.
6
+ */
7
+ interface SharedRuleOverride {
8
+ ruleId: string;
9
+ severity?: string;
10
+ enabled?: boolean;
11
+ threshold?: number;
12
+ notes?: string;
13
+ }
14
+ interface SharedRulePackage {
15
+ name: string;
16
+ version: string;
17
+ description: string;
18
+ author: string;
19
+ rules: SharedRuleOverride[];
20
+ disabledRules?: string[];
21
+ disabledJudges?: string[];
22
+ preset?: string;
23
+ tags?: string[];
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ }
27
+ export declare function exportRules(name: string, description: string, author: string, configFile?: string): SharedRulePackage;
28
+ export declare function importRules(packageFile: string, configFile?: string): {
29
+ applied: number;
30
+ skipped: number;
31
+ };
32
+ export declare function listPackages(): SharedRulePackage[];
33
+ export declare function runRuleShare(argv: string[]): void;
34
+ export {};
35
+ //# sourceMappingURL=rule-share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-share.d.ts","sourceRoot":"","sources":["../../src/commands/rule-share.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,UAAU,SAAc,GACvB,iBAAiB,CAmCnB;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,SAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqD/G;AAED,wBAAgB,YAAY,IAAI,iBAAiB,EAAE,CAIlD;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkGjD"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Custom rule sharing — export/import custom rule configurations
3
+ * across teams and organizations.
4
+ *
5
+ * Stored locally in .judges-shared-rules/ directory.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "fs";
8
+ import { join } from "path";
9
+ const SHARE_DIR = ".judges-shared-rules";
10
+ // ─── Core ───────────────────────────────────────────────────────────────────
11
+ function ensureDir() {
12
+ if (!existsSync(SHARE_DIR))
13
+ mkdirSync(SHARE_DIR, { recursive: true });
14
+ }
15
+ export function exportRules(name, description, author, configFile = ".judgesrc") {
16
+ let config = {};
17
+ if (existsSync(configFile)) {
18
+ config = JSON.parse(readFileSync(configFile, "utf-8"));
19
+ }
20
+ const rules = [];
21
+ if (config.ruleOverrides && typeof config.ruleOverrides === "object") {
22
+ for (const [ruleId, override] of Object.entries(config.ruleOverrides)) {
23
+ rules.push({
24
+ ruleId,
25
+ severity: override.severity,
26
+ enabled: override.enabled,
27
+ threshold: override.threshold,
28
+ });
29
+ }
30
+ }
31
+ const pkg = {
32
+ name,
33
+ version: "1.0.0",
34
+ description,
35
+ author,
36
+ rules,
37
+ disabledRules: config.disabledRules || [],
38
+ disabledJudges: config.disabledJudges || [],
39
+ preset: config.preset,
40
+ tags: [],
41
+ createdAt: new Date().toISOString(),
42
+ updatedAt: new Date().toISOString(),
43
+ };
44
+ ensureDir();
45
+ writeFileSync(join(SHARE_DIR, `${name}.json`), JSON.stringify(pkg, null, 2));
46
+ return pkg;
47
+ }
48
+ export function importRules(packageFile, configFile = ".judgesrc") {
49
+ const pkg = JSON.parse(readFileSync(packageFile, "utf-8"));
50
+ let config = {};
51
+ if (existsSync(configFile)) {
52
+ config = JSON.parse(readFileSync(configFile, "utf-8"));
53
+ }
54
+ let applied = 0;
55
+ let skipped = 0;
56
+ // Merge rule overrides
57
+ if (!config.ruleOverrides)
58
+ config.ruleOverrides = {};
59
+ const overrides = config.ruleOverrides;
60
+ for (const rule of pkg.rules) {
61
+ if (overrides[rule.ruleId]) {
62
+ skipped++;
63
+ continue;
64
+ }
65
+ overrides[rule.ruleId] = {};
66
+ if (rule.severity)
67
+ overrides[rule.ruleId].severity = rule.severity;
68
+ if (rule.enabled !== undefined)
69
+ overrides[rule.ruleId].enabled = rule.enabled;
70
+ if (rule.threshold !== undefined)
71
+ overrides[rule.ruleId].threshold = rule.threshold;
72
+ applied++;
73
+ }
74
+ // Merge disabled rules
75
+ if (pkg.disabledRules && pkg.disabledRules.length > 0) {
76
+ const existing = new Set(config.disabledRules || []);
77
+ for (const r of pkg.disabledRules) {
78
+ if (!existing.has(r)) {
79
+ existing.add(r);
80
+ applied++;
81
+ }
82
+ }
83
+ config.disabledRules = [...existing];
84
+ }
85
+ // Merge disabled judges
86
+ if (pkg.disabledJudges && pkg.disabledJudges.length > 0) {
87
+ const existing = new Set(config.disabledJudges || []);
88
+ for (const j of pkg.disabledJudges) {
89
+ if (!existing.has(j)) {
90
+ existing.add(j);
91
+ applied++;
92
+ }
93
+ }
94
+ config.disabledJudges = [...existing];
95
+ }
96
+ writeFileSync(configFile, JSON.stringify(config, null, 2));
97
+ return { applied, skipped };
98
+ }
99
+ export function listPackages() {
100
+ ensureDir();
101
+ const files = readdirSync(SHARE_DIR).filter((f) => f.endsWith(".json"));
102
+ return files.map((f) => JSON.parse(readFileSync(join(SHARE_DIR, f), "utf-8")));
103
+ }
104
+ // ─── CLI ────────────────────────────────────────────────────────────────────
105
+ export function runRuleShare(argv) {
106
+ if (argv.includes("--help") || argv.includes("-h")) {
107
+ console.log(`
108
+ judges rule-share — Export and import custom rule configurations
109
+
110
+ Usage:
111
+ judges rule-share --export "my-rules" --description "Team security rules" --author "Alice"
112
+ judges rule-share --import .judges-shared-rules/my-rules.json
113
+ judges rule-share --list
114
+ judges rule-share --inspect .judges-shared-rules/my-rules.json
115
+
116
+ Options:
117
+ --export <name> Export current config as a shareable package
118
+ --description <text> Package description
119
+ --author <name> Package author
120
+ --import <file> Import a rule package into .judgesrc
121
+ --list List available packages
122
+ --inspect <file> Show package contents
123
+ --format json JSON output
124
+ --help, -h Show this help
125
+ `);
126
+ return;
127
+ }
128
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
129
+ // Export
130
+ const exportName = argv.find((_a, i) => argv[i - 1] === "--export");
131
+ if (exportName) {
132
+ const desc = argv.find((_a, i) => argv[i - 1] === "--description") || "";
133
+ const author = argv.find((_a, i) => argv[i - 1] === "--author") || "unknown";
134
+ const pkg = exportRules(exportName, desc, author);
135
+ if (format === "json") {
136
+ console.log(JSON.stringify(pkg, null, 2));
137
+ }
138
+ else {
139
+ console.log(` ✅ Exported "${exportName}" → ${SHARE_DIR}/${exportName}.json`);
140
+ console.log(` ${pkg.rules.length} rule override(s), ${(pkg.disabledRules || []).length} disabled rule(s)`);
141
+ }
142
+ return;
143
+ }
144
+ // Import
145
+ const importFile = argv.find((_a, i) => argv[i - 1] === "--import");
146
+ if (importFile) {
147
+ if (!existsSync(importFile)) {
148
+ console.error(` ❌ File not found: ${importFile}`);
149
+ return;
150
+ }
151
+ const result = importRules(importFile);
152
+ if (format === "json") {
153
+ console.log(JSON.stringify(result, null, 2));
154
+ }
155
+ else {
156
+ console.log(` ✅ Imported: ${result.applied} applied, ${result.skipped} skipped (existing)`);
157
+ }
158
+ return;
159
+ }
160
+ // Inspect
161
+ const inspectFile = argv.find((_a, i) => argv[i - 1] === "--inspect");
162
+ if (inspectFile) {
163
+ if (!existsSync(inspectFile)) {
164
+ console.error(` ❌ File not found: ${inspectFile}`);
165
+ return;
166
+ }
167
+ const pkg = JSON.parse(readFileSync(inspectFile, "utf-8"));
168
+ if (format === "json") {
169
+ console.log(JSON.stringify(pkg, null, 2));
170
+ }
171
+ else {
172
+ console.log(`\n Package: ${pkg.name} v${pkg.version}`);
173
+ console.log(` Author: ${pkg.author}`);
174
+ console.log(` Description: ${pkg.description}`);
175
+ console.log(` ──────────────────────`);
176
+ console.log(` Rule overrides: ${pkg.rules.length}`);
177
+ for (const r of pkg.rules) {
178
+ console.log(` ${r.ruleId.padEnd(20)} sev: ${r.severity || "—"} enabled: ${r.enabled ?? "—"}`);
179
+ }
180
+ console.log(` Disabled rules: ${(pkg.disabledRules || []).length}`);
181
+ console.log(` Disabled judges: ${(pkg.disabledJudges || []).length}`);
182
+ console.log(` Preset: ${pkg.preset || "—"}\n`);
183
+ }
184
+ return;
185
+ }
186
+ // List
187
+ const packages = listPackages();
188
+ if (packages.length === 0) {
189
+ console.log("\n No shared rule packages. Use --export to create one.\n");
190
+ return;
191
+ }
192
+ if (format === "json") {
193
+ console.log(JSON.stringify(packages, null, 2));
194
+ }
195
+ else {
196
+ console.log(`\n Shared Rule Packages (${packages.length})\n ────────────────────────`);
197
+ for (const p of packages) {
198
+ console.log(` ${p.name.padEnd(20)} v${p.version.padEnd(8)} by ${p.author} (${p.rules.length} rules)`);
199
+ }
200
+ console.log("");
201
+ }
202
+ }
203
+ //# sourceMappingURL=rule-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-share.js","sourceRoot":"","sources":["../../src/commands/rule-share.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"}