@kevinrabun/judges 3.71.0 → 3.73.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-deduplicate.d.ts +5 -0
  6. package/dist/commands/finding-deduplicate.d.ts.map +1 -0
  7. package/dist/commands/finding-deduplicate.js +142 -0
  8. package/dist/commands/finding-deduplicate.js.map +1 -0
  9. package/dist/commands/finding-false-positive.d.ts +5 -0
  10. package/dist/commands/finding-false-positive.d.ts.map +1 -0
  11. package/dist/commands/finding-false-positive.js +135 -0
  12. package/dist/commands/finding-false-positive.js.map +1 -0
  13. package/dist/commands/finding-link.d.ts +5 -0
  14. package/dist/commands/finding-link.d.ts.map +1 -0
  15. package/dist/commands/finding-link.js +129 -0
  16. package/dist/commands/finding-link.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-bulk-action.d.ts +5 -0
  26. package/dist/commands/review-bulk-action.d.ts.map +1 -0
  27. package/dist/commands/review-bulk-action.js +110 -0
  28. package/dist/commands/review-bulk-action.js.map +1 -0
  29. package/dist/commands/review-compare-version.d.ts +5 -0
  30. package/dist/commands/review-compare-version.d.ts.map +1 -0
  31. package/dist/commands/review-compare-version.js +109 -0
  32. package/dist/commands/review-compare-version.js.map +1 -0
  33. package/dist/commands/review-config-export.d.ts +5 -0
  34. package/dist/commands/review-config-export.d.ts.map +1 -0
  35. package/dist/commands/review-config-export.js +125 -0
  36. package/dist/commands/review-config-export.js.map +1 -0
  37. package/dist/commands/review-depth.d.ts +5 -0
  38. package/dist/commands/review-depth.d.ts.map +1 -0
  39. package/dist/commands/review-depth.js +143 -0
  40. package/dist/commands/review-depth.js.map +1 -0
  41. package/dist/commands/review-feedback.d.ts +5 -0
  42. package/dist/commands/review-feedback.d.ts.map +1 -0
  43. package/dist/commands/review-feedback.js +146 -0
  44. package/dist/commands/review-feedback.js.map +1 -0
  45. package/dist/commands/review-ignore-path.d.ts +5 -0
  46. package/dist/commands/review-ignore-path.d.ts.map +1 -0
  47. package/dist/commands/review-ignore-path.js +148 -0
  48. package/dist/commands/review-ignore-path.js.map +1 -0
  49. package/dist/commands/review-pr-comment.d.ts +5 -0
  50. package/dist/commands/review-pr-comment.d.ts.map +1 -0
  51. package/dist/commands/review-pr-comment.js +107 -0
  52. package/dist/commands/review-pr-comment.js.map +1 -0
  53. package/dist/commands/review-retry.d.ts +5 -0
  54. package/dist/commands/review-retry.d.ts.map +1 -0
  55. package/dist/commands/review-retry.js +92 -0
  56. package/dist/commands/review-retry.js.map +1 -0
  57. package/dist/commands/review-score-history.d.ts +5 -0
  58. package/dist/commands/review-score-history.d.ts.map +1 -0
  59. package/dist/commands/review-score-history.js +138 -0
  60. package/dist/commands/review-score-history.js.map +1 -0
  61. package/dist/commands/review-session.d.ts +5 -0
  62. package/dist/commands/review-session.d.ts.map +1 -0
  63. package/dist/commands/review-session.js +151 -0
  64. package/dist/commands/review-session.js.map +1 -0
  65. package/dist/commands/review-summary-email.d.ts +5 -0
  66. package/dist/commands/review-summary-email.d.ts.map +1 -0
  67. package/dist/commands/review-summary-email.js +103 -0
  68. package/dist/commands/review-summary-email.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Finding-deduplicate — Detect and deduplicate similar findings.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Dedup Logic ────────────────────────────────────────────────────────────
7
+ function normalizeText(text) {
8
+ return text
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9]/g, " ")
11
+ .replace(/\s+/g, " ")
12
+ .trim();
13
+ }
14
+ function areSimilar(a, b) {
15
+ // Same rule ID is a strong signal
16
+ if (a.ruleId && b.ruleId && a.ruleId === b.ruleId) {
17
+ // Check if titles are similar
18
+ const titleA = normalizeText(a.title || "");
19
+ const titleB = normalizeText(b.title || "");
20
+ if (titleA === titleB)
21
+ return true;
22
+ // Check Jaccard similarity on words
23
+ const wordsA = new Set(titleA.split(" "));
24
+ const wordsB = new Set(titleB.split(" "));
25
+ const intersection = new Set([...wordsA].filter((w) => wordsB.has(w)));
26
+ const union = new Set([...wordsA, ...wordsB]);
27
+ if (union.size > 0 && intersection.size / union.size > 0.5)
28
+ return true;
29
+ }
30
+ return false;
31
+ }
32
+ function groupFindings(findings) {
33
+ const groups = [];
34
+ const assigned = new Set();
35
+ for (let i = 0; i < findings.length; i++) {
36
+ if (assigned.has(i))
37
+ continue;
38
+ const group = {
39
+ canonical: {
40
+ ruleId: findings[i].ruleId || "unknown",
41
+ title: findings[i].title || "",
42
+ severity: findings[i].severity || "medium",
43
+ },
44
+ count: 1,
45
+ indices: [i],
46
+ };
47
+ assigned.add(i);
48
+ for (let j = i + 1; j < findings.length; j++) {
49
+ if (assigned.has(j))
50
+ continue;
51
+ if (areSimilar(findings[i], findings[j])) {
52
+ group.count++;
53
+ group.indices.push(j);
54
+ assigned.add(j);
55
+ }
56
+ }
57
+ groups.push(group);
58
+ }
59
+ return groups;
60
+ }
61
+ // ─── CLI ────────────────────────────────────────────────────────────────────
62
+ export function runFindingDeduplicate(argv) {
63
+ if (argv.includes("--help") || argv.includes("-h")) {
64
+ console.log(`
65
+ judges finding-deduplicate — Detect and deduplicate similar findings
66
+
67
+ Usage:
68
+ judges finding-deduplicate --file report.json
69
+ judges finding-deduplicate --file report.json --format json
70
+
71
+ Options:
72
+ --file <path> Path to a tribunal verdict JSON file
73
+ --format json JSON output
74
+ --help, -h Show this help
75
+
76
+ Groups similar findings together and reports duplicates.
77
+ Uses rule ID matching and title similarity (Jaccard) to detect dupes.
78
+
79
+ Report saved to .judges/dedup-report.json.
80
+ `);
81
+ return;
82
+ }
83
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file");
84
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
85
+ if (!filePath || !existsSync(filePath)) {
86
+ console.error("Error: --file is required and must exist.");
87
+ process.exitCode = 1;
88
+ return;
89
+ }
90
+ let verdict;
91
+ try {
92
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
93
+ }
94
+ catch {
95
+ console.error("Error: Could not parse verdict file.");
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ const findings = verdict.findings || [];
100
+ if (findings.length === 0) {
101
+ console.log("No findings to deduplicate.");
102
+ return;
103
+ }
104
+ const groups = groupFindings(findings);
105
+ const duplicateCount = findings.length - groups.length;
106
+ const report = {
107
+ timestamp: new Date().toISOString(),
108
+ originalCount: findings.length,
109
+ uniqueCount: groups.length,
110
+ duplicateCount,
111
+ groups,
112
+ };
113
+ const outPath = join(".judges", "dedup-report.json");
114
+ mkdirSync(dirname(outPath), { recursive: true });
115
+ writeFileSync(outPath, JSON.stringify(report, null, 2), "utf-8");
116
+ if (format === "json") {
117
+ console.log(JSON.stringify(report, null, 2));
118
+ return;
119
+ }
120
+ console.log("\nFinding Deduplication Report:");
121
+ console.log("═".repeat(60));
122
+ console.log(` Original: ${findings.length} Unique: ${groups.length} Duplicates: ${duplicateCount}`);
123
+ if (findings.length > 0) {
124
+ console.log(` Dedup ratio: ${((duplicateCount / findings.length) * 100).toFixed(1)}%`);
125
+ }
126
+ console.log("═".repeat(60));
127
+ const dupeGroups = groups.filter((g) => g.count > 1);
128
+ if (dupeGroups.length > 0) {
129
+ console.log("\n Duplicate Groups:");
130
+ for (const g of dupeGroups) {
131
+ console.log(`\n [${g.canonical.severity.toUpperCase()}] ${g.canonical.ruleId} (${g.count}x)`);
132
+ console.log(` ${g.canonical.title}`);
133
+ console.log(` Indices: ${g.indices.join(", ")}`);
134
+ }
135
+ }
136
+ else {
137
+ console.log("\n No duplicates found — all findings are unique.");
138
+ }
139
+ console.log("\n" + "═".repeat(60));
140
+ console.log(` Report saved to ${outPath}`);
141
+ }
142
+ //# sourceMappingURL=finding-deduplicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-deduplicate.js","sourceRoot":"","sources":["../../src/commands/finding-deduplicate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-false-positive — Track and manage false positive findings.
3
+ */
4
+ export declare function runFindingFalsePositive(argv: string[]): void;
5
+ //# sourceMappingURL=finding-false-positive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-false-positive.d.ts","sourceRoot":"","sources":["../../src/commands/finding-false-positive.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6CH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmH5D"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Finding-false-positive — Track and manage false positive findings.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const FP_FILE = ".judges/false-positives.json";
8
+ function loadStore() {
9
+ if (!existsSync(FP_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(FP_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(FP_FILE), { recursive: true });
20
+ writeFileSync(FP_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function generateId() {
23
+ return `fp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
24
+ }
25
+ // ─── CLI ────────────────────────────────────────────────────────────────────
26
+ export function runFindingFalsePositive(argv) {
27
+ if (argv.includes("--help") || argv.includes("-h")) {
28
+ console.log(`
29
+ judges finding-false-positive — Track and manage false positive findings
30
+
31
+ Usage:
32
+ judges finding-false-positive add --rule SEC-001 --title "Not a real XSS" --reason "sanitized upstream"
33
+ judges finding-false-positive list
34
+ judges finding-false-positive check --rule SEC-001 --file src/app.ts
35
+ judges finding-false-positive remove --id <id>
36
+ judges finding-false-positive clear
37
+ judges finding-false-positive stats
38
+
39
+ Subcommands:
40
+ add Mark a finding as false positive
41
+ list List all false positives
42
+ check Check if a rule/file combo is marked FP
43
+ remove Remove a false positive by ID
44
+ clear Clear all false positives
45
+ stats Show false positive statistics
46
+
47
+ Options:
48
+ --rule <id> Rule ID
49
+ --title <text> Finding title
50
+ --reason <text> Reason for marking as FP
51
+ --file <path> Related file path
52
+ --format json JSON output
53
+ --help, -h Show this help
54
+
55
+ Stored locally in .judges/false-positives.json.
56
+ `);
57
+ return;
58
+ }
59
+ const subcommand = argv.find((a) => ["add", "list", "check", "remove", "clear", "stats"].includes(a));
60
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
61
+ const store = loadStore();
62
+ if (subcommand === "add") {
63
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
64
+ const title = argv.find((_a, i) => argv[i - 1] === "--title") || "";
65
+ const reason = argv.find((_a, i) => argv[i - 1] === "--reason") || "";
66
+ const file = argv.find((_a, i) => argv[i - 1] === "--file") || "";
67
+ const entry = { id: generateId(), ruleId, title, reason, date: new Date().toISOString(), file };
68
+ store.entries.push(entry);
69
+ saveStore(store);
70
+ console.log(`Marked as false positive (${entry.id}): ${ruleId} — ${title}`);
71
+ return;
72
+ }
73
+ if (subcommand === "check") {
74
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
75
+ const file = argv.find((_a, i) => argv[i - 1] === "--file") || "";
76
+ const match = store.entries.find((e) => e.ruleId === ruleId && (!file || e.file === file));
77
+ if (match) {
78
+ console.log(`FP match found: ${match.id} — ${match.reason}`);
79
+ }
80
+ else {
81
+ console.log("No false positive match.");
82
+ }
83
+ return;
84
+ }
85
+ if (subcommand === "remove") {
86
+ const id = argv.find((_a, i) => argv[i - 1] === "--id") || "";
87
+ const before = store.entries.length;
88
+ store.entries = store.entries.filter((e) => e.id !== id);
89
+ saveStore(store);
90
+ console.log(before > store.entries.length ? `Removed ${id}.` : `${id} not found.`);
91
+ return;
92
+ }
93
+ if (subcommand === "clear") {
94
+ saveStore({ version: "1.0.0", entries: [] });
95
+ console.log("False positives cleared.");
96
+ return;
97
+ }
98
+ if (subcommand === "stats") {
99
+ if (store.entries.length === 0) {
100
+ console.log("No false positives recorded.");
101
+ return;
102
+ }
103
+ const byRule = new Map();
104
+ for (const e of store.entries) {
105
+ byRule.set(e.ruleId, (byRule.get(e.ruleId) || 0) + 1);
106
+ }
107
+ if (format === "json") {
108
+ console.log(JSON.stringify({ total: store.entries.length, byRule: Object.fromEntries(byRule) }, null, 2));
109
+ return;
110
+ }
111
+ console.log(`\nFalse Positive Stats: ${store.entries.length} total`);
112
+ console.log("─".repeat(40));
113
+ for (const [rule, count] of [...byRule.entries()].sort((a, b) => b[1] - a[1])) {
114
+ console.log(` ${rule}: ${count}`);
115
+ }
116
+ return;
117
+ }
118
+ // Default: list
119
+ if (store.entries.length === 0) {
120
+ console.log("No false positives. Use 'judges finding-false-positive add' to mark findings.");
121
+ return;
122
+ }
123
+ if (format === "json") {
124
+ console.log(JSON.stringify(store.entries, null, 2));
125
+ return;
126
+ }
127
+ console.log("\nFalse Positives:");
128
+ console.log("─".repeat(60));
129
+ for (const e of store.entries) {
130
+ console.log(` ${e.id} ${e.ruleId} ${e.title}`);
131
+ console.log(` reason: ${e.reason} file: ${e.file || "(any)"}`);
132
+ }
133
+ console.log("─".repeat(60));
134
+ }
135
+ //# sourceMappingURL=finding-false-positive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-false-positive.js","sourceRoot":"","sources":["../../src/commands/finding-false-positive.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAkB/B,+EAA+E;AAE/E,MAAM,OAAO,GAAG,8BAA8B,CAAC;AAE/C,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAY,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,uBAAuB,CAAC,IAAc;IACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Bf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,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;IAC1F,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACpF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QAElF,MAAM,KAAK,GAAuB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;QACpH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,EAAE,MAAM,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QAC3F,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1G,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-link — Link related findings across files.
3
+ */
4
+ export declare function runFindingLink(argv: string[]): void;
5
+ //# sourceMappingURL=finding-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-link.d.ts","sourceRoot":"","sources":["../../src/commands/finding-link.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8CH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+GnD"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Finding-link — Link related findings across files.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const LINK_FILE = ".judges/finding-links.json";
8
+ function loadStore() {
9
+ if (!existsSync(LINK_FILE))
10
+ return { version: "1.0.0", links: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(LINK_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", links: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(LINK_FILE), { recursive: true });
20
+ writeFileSync(LINK_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function generateId() {
23
+ return `lnk-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
24
+ }
25
+ // ─── CLI ────────────────────────────────────────────────────────────────────
26
+ export function runFindingLink(argv) {
27
+ if (argv.includes("--help") || argv.includes("-h")) {
28
+ console.log(`
29
+ judges finding-link — Link related findings across files
30
+
31
+ Usage:
32
+ judges finding-link add --source-rule SEC-001 --source-file a.ts --target-rule SEC-002 --target-file b.ts
33
+ judges finding-link list
34
+ judges finding-link find --rule SEC-001
35
+ judges finding-link remove --id <id>
36
+ judges finding-link clear
37
+
38
+ Subcommands:
39
+ add Create a finding link
40
+ list List all links
41
+ find Find links for a rule
42
+ remove Remove a link
43
+ clear Clear all links
44
+
45
+ Options:
46
+ --source-rule <id> Source finding rule ID
47
+ --source-file <path> Source file path
48
+ --target-rule <id> Target finding rule ID
49
+ --target-file <path> Target file path
50
+ --relationship <text> Relationship type (e.g. "root-cause", "related", "duplicate")
51
+ --rule <id> Rule to search for in find subcommand
52
+ --format json JSON output
53
+ --help, -h Show this help
54
+
55
+ Links stored in .judges/finding-links.json.
56
+ `);
57
+ return;
58
+ }
59
+ const subcommand = argv.find((a) => ["add", "list", "find", "remove", "clear"].includes(a));
60
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
61
+ const store = loadStore();
62
+ if (subcommand === "add") {
63
+ const sourceRule = argv.find((_a, i) => argv[i - 1] === "--source-rule") || "";
64
+ const sourceFile = argv.find((_a, i) => argv[i - 1] === "--source-file") || "";
65
+ const targetRule = argv.find((_a, i) => argv[i - 1] === "--target-rule") || "";
66
+ const targetFile = argv.find((_a, i) => argv[i - 1] === "--target-file") || "";
67
+ const relationship = argv.find((_a, i) => argv[i - 1] === "--relationship") || "related";
68
+ const link = {
69
+ id: generateId(),
70
+ sourceRule,
71
+ sourceFile,
72
+ targetRule,
73
+ targetFile,
74
+ relationship,
75
+ createdAt: new Date().toISOString(),
76
+ };
77
+ store.links.push(link);
78
+ saveStore(store);
79
+ console.log(`Linked ${sourceRule} (${sourceFile}) → ${targetRule} (${targetFile}) [${relationship}]`);
80
+ return;
81
+ }
82
+ if (subcommand === "find") {
83
+ const rule = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
84
+ const matches = store.links.filter((l) => l.sourceRule === rule || l.targetRule === rule);
85
+ if (matches.length === 0) {
86
+ console.log(`No links found for rule ${rule}.`);
87
+ return;
88
+ }
89
+ if (format === "json") {
90
+ console.log(JSON.stringify(matches, null, 2));
91
+ return;
92
+ }
93
+ console.log(`\nLinks for ${rule}:`);
94
+ for (const m of matches) {
95
+ console.log(` ${m.id} ${m.sourceRule}(${m.sourceFile}) → ${m.targetRule}(${m.targetFile}) [${m.relationship}]`);
96
+ }
97
+ return;
98
+ }
99
+ if (subcommand === "remove") {
100
+ const id = argv.find((_a, i) => argv[i - 1] === "--id") || "";
101
+ const before = store.links.length;
102
+ store.links = store.links.filter((l) => l.id !== id);
103
+ saveStore(store);
104
+ console.log(before > store.links.length ? `Removed ${id}.` : `${id} not found.`);
105
+ return;
106
+ }
107
+ if (subcommand === "clear") {
108
+ saveStore({ version: "1.0.0", links: [] });
109
+ console.log("Finding links cleared.");
110
+ return;
111
+ }
112
+ // Default: list
113
+ if (store.links.length === 0) {
114
+ console.log("No finding links. Use 'judges finding-link add' to create one.");
115
+ return;
116
+ }
117
+ if (format === "json") {
118
+ console.log(JSON.stringify(store.links, null, 2));
119
+ return;
120
+ }
121
+ console.log("\nFinding Links:");
122
+ console.log("─".repeat(70));
123
+ for (const l of store.links) {
124
+ console.log(` ${l.id} ${l.sourceRule}(${l.sourceFile}) → ${l.targetRule}(${l.targetFile}) [${l.relationship}]`);
125
+ }
126
+ console.log("─".repeat(70));
127
+ console.log(`${store.links.length} link(s).`);
128
+ }
129
+ //# sourceMappingURL=finding-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-link.js","sourceRoot":"","sources":["../../src/commands/finding-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-severity-override — Override finding severity per project.
3
+ */
4
+ export declare function runFindingSeverityOverride(argv: string[]): void;
5
+ //# sourceMappingURL=finding-severity-override.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-override.d.ts","sourceRoot":"","sources":["../../src/commands/finding-severity-override.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0CH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoH/D"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Finding-severity-override — Override finding severity per project.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const OVERRIDE_FILE = join(".judges", "severity-overrides.json");
8
+ function loadStore() {
9
+ if (!existsSync(OVERRIDE_FILE))
10
+ return { version: "1.0.0", overrides: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(OVERRIDE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", overrides: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(OVERRIDE_FILE), { recursive: true });
20
+ writeFileSync(OVERRIDE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ const VALID_SEVERITIES = ["critical", "high", "medium", "low", "info"];
23
+ // ─── CLI ────────────────────────────────────────────────────────────────────
24
+ export function runFindingSeverityOverride(argv) {
25
+ if (argv.includes("--help") || argv.includes("-h")) {
26
+ console.log(`
27
+ judges finding-severity-override — Override finding severity per project
28
+
29
+ Usage:
30
+ judges finding-severity-override set --rule sql-injection --severity low --reason "Internal tool only"
31
+ judges finding-severity-override list
32
+ judges finding-severity-override remove --rule sql-injection
33
+ judges finding-severity-override clear
34
+
35
+ Subcommands:
36
+ set Set a severity override
37
+ list List all overrides
38
+ remove Remove an override
39
+ clear Clear all overrides
40
+
41
+ Options:
42
+ --rule <ruleId> Rule ID to override
43
+ --severity <level> New severity (critical|high|medium|low|info)
44
+ --reason <text> Reason for the override
45
+ --format json JSON output
46
+ --help, -h Show this help
47
+
48
+ Override data stored in .judges/severity-overrides.json.
49
+ `);
50
+ return;
51
+ }
52
+ const subcommand = argv.find((a) => ["set", "list", "remove", "clear"].includes(a)) || "list";
53
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
54
+ const store = loadStore();
55
+ if (subcommand === "set") {
56
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
57
+ const severity = argv.find((_a, i) => argv[i - 1] === "--severity") || "";
58
+ const reason = argv.find((_a, i) => argv[i - 1] === "--reason") || "";
59
+ if (!ruleId || !severity) {
60
+ console.error("Error: --rule and --severity are required.");
61
+ process.exitCode = 1;
62
+ return;
63
+ }
64
+ if (!VALID_SEVERITIES.includes(severity)) {
65
+ console.error(`Error: Invalid severity. Use: ${VALID_SEVERITIES.join(", ")}`);
66
+ process.exitCode = 1;
67
+ return;
68
+ }
69
+ // Replace existing or add
70
+ const existing = store.overrides.findIndex((o) => o.ruleId === ruleId);
71
+ const entry = {
72
+ ruleId,
73
+ originalSeverity: "",
74
+ overrideSeverity: severity,
75
+ reason,
76
+ addedAt: new Date().toISOString(),
77
+ };
78
+ if (existing >= 0) {
79
+ entry.originalSeverity = store.overrides[existing].originalSeverity;
80
+ store.overrides[existing] = entry;
81
+ console.log(`Updated severity override for "${ruleId}" to ${severity}.`);
82
+ }
83
+ else {
84
+ store.overrides.push(entry);
85
+ console.log(`Set severity override for "${ruleId}" to ${severity}.`);
86
+ }
87
+ saveStore(store);
88
+ return;
89
+ }
90
+ if (subcommand === "remove") {
91
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
92
+ if (!ruleId) {
93
+ console.error("Error: --rule is required.");
94
+ process.exitCode = 1;
95
+ return;
96
+ }
97
+ const before = store.overrides.length;
98
+ store.overrides = store.overrides.filter((o) => o.ruleId !== ruleId);
99
+ if (store.overrides.length === before) {
100
+ console.error(`Error: No override found for "${ruleId}".`);
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ saveStore(store);
105
+ console.log(`Removed severity override for "${ruleId}".`);
106
+ return;
107
+ }
108
+ if (subcommand === "clear") {
109
+ saveStore({ version: "1.0.0", overrides: [] });
110
+ console.log("Severity overrides cleared.");
111
+ return;
112
+ }
113
+ // list
114
+ if (store.overrides.length === 0) {
115
+ console.log("No severity overrides. Use 'judges finding-severity-override set' to add one.");
116
+ return;
117
+ }
118
+ if (format === "json") {
119
+ console.log(JSON.stringify(store.overrides, null, 2));
120
+ return;
121
+ }
122
+ console.log("\nSeverity Overrides:");
123
+ console.log("─".repeat(70));
124
+ for (const o of store.overrides) {
125
+ console.log(` ${o.ruleId.padEnd(30)} → ${o.overrideSeverity.padEnd(10)} ${o.addedAt.slice(0, 10)}`);
126
+ if (o.reason)
127
+ console.log(` Reason: ${o.reason}`);
128
+ }
129
+ console.log("─".repeat(70));
130
+ console.log(` Total: ${store.overrides.length} override(s)`);
131
+ }
132
+ //# sourceMappingURL=finding-severity-override.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-override.js","sourceRoot":"","sources":["../../src/commands/finding-severity-override.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-approval — Approval workflows for review results.
3
+ */
4
+ export declare function runReviewApproval(argv: string[]): void;
5
+ //# sourceMappingURL=review-approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-approval.d.ts","sourceRoot":"","sources":["../../src/commands/review-approval.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8CH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmHtD"}