@kevinrabun/judges 3.76.0 → 3.78.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-auto-label.d.ts +5 -0
  6. package/dist/commands/finding-auto-label.d.ts.map +1 -0
  7. package/dist/commands/finding-auto-label.js +221 -0
  8. package/dist/commands/finding-auto-label.js.map +1 -0
  9. package/dist/commands/finding-correlate.d.ts +5 -0
  10. package/dist/commands/finding-correlate.d.ts.map +1 -0
  11. package/dist/commands/finding-correlate.js +89 -0
  12. package/dist/commands/finding-correlate.js.map +1 -0
  13. package/dist/commands/finding-dedup-cross-file.d.ts +5 -0
  14. package/dist/commands/finding-dedup-cross-file.d.ts.map +1 -0
  15. package/dist/commands/finding-dedup-cross-file.js +96 -0
  16. package/dist/commands/finding-dedup-cross-file.js.map +1 -0
  17. package/dist/commands/finding-dependency-check.d.ts +5 -0
  18. package/dist/commands/finding-dependency-check.d.ts.map +1 -0
  19. package/dist/commands/finding-dependency-check.js +120 -0
  20. package/dist/commands/finding-dependency-check.js.map +1 -0
  21. package/dist/commands/finding-impact-score.d.ts +5 -0
  22. package/dist/commands/finding-impact-score.d.ts.map +1 -0
  23. package/dist/commands/finding-impact-score.js +124 -0
  24. package/dist/commands/finding-impact-score.js.map +1 -0
  25. package/dist/commands/finding-root-cause.d.ts +5 -0
  26. package/dist/commands/finding-root-cause.d.ts.map +1 -0
  27. package/dist/commands/finding-root-cause.js +185 -0
  28. package/dist/commands/finding-root-cause.js.map +1 -0
  29. package/dist/commands/finding-severity-histogram.d.ts +5 -0
  30. package/dist/commands/finding-severity-histogram.d.ts.map +1 -0
  31. package/dist/commands/finding-severity-histogram.js +67 -0
  32. package/dist/commands/finding-severity-histogram.js.map +1 -0
  33. package/dist/commands/finding-suppress-pattern.d.ts +5 -0
  34. package/dist/commands/finding-suppress-pattern.d.ts.map +1 -0
  35. package/dist/commands/finding-suppress-pattern.js +149 -0
  36. package/dist/commands/finding-suppress-pattern.js.map +1 -0
  37. package/dist/commands/review-auto-merge.d.ts +5 -0
  38. package/dist/commands/review-auto-merge.d.ts.map +1 -0
  39. package/dist/commands/review-auto-merge.js +176 -0
  40. package/dist/commands/review-auto-merge.js.map +1 -0
  41. package/dist/commands/review-cache-clear.d.ts +5 -0
  42. package/dist/commands/review-cache-clear.d.ts.map +1 -0
  43. package/dist/commands/review-cache-clear.js +161 -0
  44. package/dist/commands/review-cache-clear.js.map +1 -0
  45. package/dist/commands/review-compliance-check.d.ts +5 -0
  46. package/dist/commands/review-compliance-check.d.ts.map +1 -0
  47. package/dist/commands/review-compliance-check.js +203 -0
  48. package/dist/commands/review-compliance-check.js.map +1 -0
  49. package/dist/commands/review-dry-run.d.ts +5 -0
  50. package/dist/commands/review-dry-run.d.ts.map +1 -0
  51. package/dist/commands/review-dry-run.js +121 -0
  52. package/dist/commands/review-dry-run.js.map +1 -0
  53. package/dist/commands/review-file-filter.d.ts +5 -0
  54. package/dist/commands/review-file-filter.d.ts.map +1 -0
  55. package/dist/commands/review-file-filter.js +122 -0
  56. package/dist/commands/review-file-filter.js.map +1 -0
  57. package/dist/commands/review-incremental.d.ts +5 -0
  58. package/dist/commands/review-incremental.d.ts.map +1 -0
  59. package/dist/commands/review-incremental.js +129 -0
  60. package/dist/commands/review-incremental.js.map +1 -0
  61. package/dist/commands/review-plugin-manage.d.ts +5 -0
  62. package/dist/commands/review-plugin-manage.d.ts.map +1 -0
  63. package/dist/commands/review-plugin-manage.js +138 -0
  64. package/dist/commands/review-plugin-manage.js.map +1 -0
  65. package/dist/commands/review-progress-bar.d.ts +5 -0
  66. package/dist/commands/review-progress-bar.d.ts.map +1 -0
  67. package/dist/commands/review-progress-bar.js +158 -0
  68. package/dist/commands/review-progress-bar.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Finding-impact-score — Score findings by estimated impact.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ function scoreFinding(finding) {
6
+ let score = 0;
7
+ const factors = [];
8
+ // Severity weight
9
+ const sevWeights = { critical: 40, high: 30, medium: 20, low: 10, info: 5 };
10
+ const sev = (finding.severity || "medium").toLowerCase();
11
+ score += sevWeights[sev] || 15;
12
+ factors.push(`severity:${sev}`);
13
+ // Confidence boost
14
+ if (finding.confidence !== undefined && finding.confidence !== null) {
15
+ const confBonus = Math.round(finding.confidence * 20);
16
+ score += confBonus;
17
+ factors.push(`confidence:${finding.confidence}`);
18
+ }
19
+ // Multiple affected lines
20
+ const lineCount = (finding.lineNumbers || []).length;
21
+ if (lineCount > 5) {
22
+ score += 15;
23
+ factors.push("wide-spread");
24
+ }
25
+ else if (lineCount > 1) {
26
+ score += 5;
27
+ factors.push("multi-line");
28
+ }
29
+ // Security-related keywords
30
+ const desc = ((finding.description || "") + " " + (finding.title || "")).toLowerCase();
31
+ if (desc.includes("injection") || desc.includes("xss") || desc.includes("sql")) {
32
+ score += 20;
33
+ factors.push("injection-risk");
34
+ }
35
+ if (desc.includes("authentication") || desc.includes("auth")) {
36
+ score += 15;
37
+ factors.push("auth-related");
38
+ }
39
+ if (desc.includes("sensitive") || desc.includes("credential") || desc.includes("secret")) {
40
+ score += 15;
41
+ factors.push("data-exposure");
42
+ }
43
+ if (desc.includes("denial") || desc.includes("dos")) {
44
+ score += 10;
45
+ factors.push("availability-risk");
46
+ }
47
+ return {
48
+ ruleId: finding.ruleId || "unknown",
49
+ title: finding.title || "",
50
+ severity: sev,
51
+ impactScore: Math.min(100, score),
52
+ factors,
53
+ };
54
+ }
55
+ // ─── CLI ────────────────────────────────────────────────────────────────────
56
+ export function runFindingImpactScore(argv) {
57
+ if (argv.includes("--help") || argv.includes("-h")) {
58
+ console.log(`
59
+ judges finding-impact-score — Score findings by estimated impact
60
+
61
+ Usage:
62
+ judges finding-impact-score --file <results> [options]
63
+
64
+ Options:
65
+ --file <path> Results file with findings (required)
66
+ --min-score <n> Show only findings with score >= N
67
+ --top <n> Show top N highest-impact findings (default: 10)
68
+ --format json JSON output
69
+ --help, -h Show this help
70
+
71
+ Factors: severity, confidence, affected lines, security keywords.
72
+ `);
73
+ return;
74
+ }
75
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
76
+ if (!file) {
77
+ console.error("Error: --file required");
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ if (!existsSync(file)) {
82
+ console.error(`Error: file not found: ${file}`);
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ const minScore = parseInt(argv.find((_a, i) => argv[i - 1] === "--min-score") || "0", 10);
87
+ const topN = parseInt(argv.find((_a, i) => argv[i - 1] === "--top") || "10", 10);
88
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
89
+ let findings;
90
+ try {
91
+ const data = JSON.parse(readFileSync(file, "utf-8"));
92
+ findings = Array.isArray(data) ? data : data.findings || [];
93
+ }
94
+ catch {
95
+ console.error("Error: could not parse results file");
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+ let scored = findings
100
+ .map(scoreFinding)
101
+ .filter((s) => s.impactScore >= minScore)
102
+ .sort((a, b) => b.impactScore - a.impactScore);
103
+ scored = scored.slice(0, topN);
104
+ if (scored.length === 0) {
105
+ console.log("No findings meet the criteria.");
106
+ return;
107
+ }
108
+ if (format === "json") {
109
+ console.log(JSON.stringify(scored, null, 2));
110
+ return;
111
+ }
112
+ console.log(`\nImpact Scores (top ${topN}):`);
113
+ console.log("═".repeat(70));
114
+ console.log(" Score Severity Rule ID Factors");
115
+ console.log("─".repeat(70));
116
+ for (const s of scored) {
117
+ const ruleDisplay = s.ruleId.length > 22 ? s.ruleId.slice(0, 19) + "..." : s.ruleId;
118
+ console.log(` ${String(s.impactScore).padStart(5)} ${s.severity.padEnd(10)} ${ruleDisplay.padEnd(22)} ${s.factors.join(", ")}`);
119
+ }
120
+ console.log("═".repeat(70));
121
+ const avg = scored.reduce((sum, s) => sum + s.impactScore, 0) / scored.length;
122
+ console.log(` Average impact: ${avg.toFixed(1)}`);
123
+ }
124
+ //# sourceMappingURL=finding-impact-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-impact-score.js","sourceRoot":"","sources":["../../src/commands/finding-impact-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-root-cause — Identify root causes of recurring findings.
3
+ */
4
+ export declare function runFindingRootCause(argv: string[]): void;
5
+ //# sourceMappingURL=finding-root-cause.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-root-cause.d.ts","sourceRoot":"","sources":["../../src/commands/finding-root-cause.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+IxD"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Finding-root-cause — Identify root causes of recurring findings.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const STORE_FILE = ".judges/root-causes.json";
8
+ function loadStore() {
9
+ if (!existsSync(STORE_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(STORE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(STORE_FILE), { recursive: true });
20
+ writeFileSync(STORE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── Analysis ───────────────────────────────────────────────────────────────
23
+ function inferRootCause(ruleId, description) {
24
+ const text = `${ruleId} ${description}`.toLowerCase();
25
+ if (text.includes("inject") || text.includes("sql") || text.includes("xss")) {
26
+ return { cause: "Unsanitized user input", recommendation: "Implement input validation and parameterized queries" };
27
+ }
28
+ if (text.includes("auth") || text.includes("credential") || text.includes("password")) {
29
+ return {
30
+ cause: "Missing or weak authentication",
31
+ recommendation: "Review authentication flow and enforce strong auth",
32
+ };
33
+ }
34
+ if (text.includes("hardcod") || text.includes("secret") || text.includes("api.key")) {
35
+ return { cause: "Hardcoded secrets", recommendation: "Use environment variables or secret managers" };
36
+ }
37
+ if (text.includes("error") || text.includes("exception") || text.includes("catch")) {
38
+ return { cause: "Insufficient error handling", recommendation: "Add structured error handling and logging" };
39
+ }
40
+ if (text.includes("log") || text.includes("sensitive") || text.includes("pii")) {
41
+ return { cause: "Sensitive data in logs", recommendation: "Sanitize log output and mask sensitive fields" };
42
+ }
43
+ if (text.includes("race") || text.includes("concurrent") || text.includes("async")) {
44
+ return { cause: "Concurrency issues", recommendation: "Add proper synchronization or use atomic operations" };
45
+ }
46
+ if (text.includes("deprecat") || text.includes("version") || text.includes("outdated")) {
47
+ return { cause: "Outdated dependencies", recommendation: "Update dependencies and review breaking changes" };
48
+ }
49
+ return { cause: "Code quality issue", recommendation: "Review coding standards and add linting rules" };
50
+ }
51
+ // ─── CLI ────────────────────────────────────────────────────────────────────
52
+ export function runFindingRootCause(argv) {
53
+ if (argv.includes("--help") || argv.includes("-h")) {
54
+ console.log(`
55
+ judges finding-root-cause — Identify root causes of recurring findings
56
+
57
+ Usage:
58
+ judges finding-root-cause analyze --file <results> Analyze findings for root causes
59
+ judges finding-root-cause list List known root causes
60
+ judges finding-root-cause set --rule <id> --cause <text> --recommendation <text>
61
+ judges finding-root-cause clear Clear root cause data
62
+
63
+ Options:
64
+ --file <path> Results file
65
+ --rule <ruleId> Rule ID
66
+ --cause <text> Root cause description
67
+ --recommendation <text> Recommended fix
68
+ --min-occurrences <n> Min occurrences to report (default: 2)
69
+ --format json JSON output
70
+ --help, -h Show this help
71
+ `);
72
+ return;
73
+ }
74
+ const subcommand = argv.find((a) => ["analyze", "list", "set", "clear"].includes(a));
75
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
76
+ const store = loadStore();
77
+ if (subcommand === "analyze") {
78
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
79
+ if (!file) {
80
+ console.error("Error: --file required");
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ if (!existsSync(file)) {
85
+ console.error(`Error: file not found: ${file}`);
86
+ process.exitCode = 1;
87
+ return;
88
+ }
89
+ const minOccurrences = parseInt(argv.find((_a, i) => argv[i - 1] === "--min-occurrences") || "2", 10);
90
+ let findings;
91
+ try {
92
+ const data = JSON.parse(readFileSync(file, "utf-8"));
93
+ findings = Array.isArray(data) ? data : data.findings || [];
94
+ }
95
+ catch {
96
+ console.error("Error: could not parse results file");
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ // Group by rule
101
+ const ruleCounts = new Map();
102
+ for (const f of findings) {
103
+ const rid = f.ruleId || "unknown";
104
+ const existing = ruleCounts.get(rid);
105
+ if (existing) {
106
+ existing.count++;
107
+ }
108
+ else {
109
+ ruleCounts.set(rid, { count: 1, description: f.description || f.title || "" });
110
+ }
111
+ }
112
+ // Analyze recurring rules
113
+ const now = new Date().toISOString();
114
+ let analyzed = 0;
115
+ for (const [ruleId, info] of ruleCounts) {
116
+ if (info.count < minOccurrences)
117
+ continue;
118
+ const existing = store.entries.find((e) => e.ruleId === ruleId);
119
+ const { cause, recommendation } = inferRootCause(ruleId, info.description);
120
+ if (existing) {
121
+ existing.occurrences = info.count;
122
+ existing.lastUpdated = now;
123
+ }
124
+ else {
125
+ store.entries.push({ ruleId, occurrences: info.count, rootCause: cause, recommendation, lastUpdated: now });
126
+ }
127
+ analyzed++;
128
+ }
129
+ saveStore(store);
130
+ console.log(`Analyzed ${findings.length} findings, identified ${analyzed} recurring patterns.`);
131
+ return;
132
+ }
133
+ if (subcommand === "set") {
134
+ const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule");
135
+ const cause = argv.find((_a, i) => argv[i - 1] === "--cause");
136
+ const recommendation = argv.find((_a, i) => argv[i - 1] === "--recommendation");
137
+ if (!ruleId || !cause) {
138
+ console.error("Error: --rule and --cause required");
139
+ process.exitCode = 1;
140
+ return;
141
+ }
142
+ const existing = store.entries.find((e) => e.ruleId === ruleId);
143
+ if (existing) {
144
+ existing.rootCause = cause;
145
+ existing.recommendation = recommendation || existing.recommendation;
146
+ existing.lastUpdated = new Date().toISOString();
147
+ }
148
+ else {
149
+ store.entries.push({
150
+ ruleId,
151
+ occurrences: 0,
152
+ rootCause: cause,
153
+ recommendation: recommendation || "",
154
+ lastUpdated: new Date().toISOString(),
155
+ });
156
+ }
157
+ saveStore(store);
158
+ console.log(`Root cause set for '${ruleId}'.`);
159
+ return;
160
+ }
161
+ if (subcommand === "clear") {
162
+ saveStore({ version: "1.0.0", entries: [] });
163
+ console.log("Root cause data cleared.");
164
+ return;
165
+ }
166
+ // Default: list
167
+ if (store.entries.length === 0) {
168
+ console.log("No root causes tracked. Use 'judges finding-root-cause analyze --file <f>'.");
169
+ return;
170
+ }
171
+ if (format === "json") {
172
+ console.log(JSON.stringify(store.entries, null, 2));
173
+ return;
174
+ }
175
+ const sorted = [...store.entries].sort((a, b) => b.occurrences - a.occurrences);
176
+ console.log(`\nRoot Cause Analysis (${sorted.length} patterns):`);
177
+ console.log("═".repeat(70));
178
+ for (const e of sorted) {
179
+ console.log(`\n ${e.ruleId} (${e.occurrences} occurrences)`);
180
+ console.log(` Root cause: ${e.rootCause}`);
181
+ console.log(` Recommendation: ${e.recommendation}`);
182
+ }
183
+ console.log("\n" + "═".repeat(70));
184
+ }
185
+ //# sourceMappingURL=finding-root-cause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-root-cause.js","sourceRoot":"","sources":["../../src/commands/finding-root-cause.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-severity-histogram — Visualize finding severity distribution.
3
+ */
4
+ export declare function runFindingSeverityHistogram(argv: string[]): void;
5
+ //# sourceMappingURL=finding-severity-histogram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-histogram.d.ts","sourceRoot":"","sources":["../../src/commands/finding-severity-histogram.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoEhE"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Finding-severity-histogram — Visualize finding severity distribution.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingSeverityHistogram(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h")) {
8
+ console.log(`
9
+ judges finding-severity-histogram — Visualize severity distribution
10
+
11
+ Usage:
12
+ judges finding-severity-histogram --file <results> [options]
13
+
14
+ Options:
15
+ --file <path> Results file with findings (required)
16
+ --width <n> Bar width in characters (default: 40)
17
+ --format json JSON output
18
+ --help, -h Show this help
19
+ `);
20
+ return;
21
+ }
22
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
23
+ if (!file) {
24
+ console.error("Error: --file required");
25
+ process.exitCode = 1;
26
+ return;
27
+ }
28
+ if (!existsSync(file)) {
29
+ console.error(`Error: file not found: ${file}`);
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const barWidth = parseInt(argv.find((_a, i) => argv[i - 1] === "--width") || "40", 10);
34
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
35
+ let findings;
36
+ try {
37
+ const data = JSON.parse(readFileSync(file, "utf-8"));
38
+ findings = Array.isArray(data) ? data : data.findings || [];
39
+ }
40
+ catch {
41
+ console.error("Error: could not parse results file");
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ const counts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
46
+ for (const f of findings) {
47
+ const sev = (f.severity || "medium").toLowerCase();
48
+ counts[sev] = (counts[sev] || 0) + 1;
49
+ }
50
+ const maxCount = Math.max(...Object.values(counts), 1);
51
+ if (format === "json") {
52
+ console.log(JSON.stringify({ total: findings.length, distribution: counts }, null, 2));
53
+ return;
54
+ }
55
+ console.log(`\nSeverity Histogram (${findings.length} findings):`);
56
+ console.log("═".repeat(barWidth + 25));
57
+ const order = ["critical", "high", "medium", "low", "info"];
58
+ for (const sev of order) {
59
+ const count = counts[sev] || 0;
60
+ const barLen = Math.round((count / maxCount) * barWidth);
61
+ const bar = "#".repeat(barLen);
62
+ const pct = findings.length > 0 ? ((count / findings.length) * 100).toFixed(1) : "0.0";
63
+ console.log(` ${sev.padEnd(10)} ${bar.padEnd(barWidth)} ${String(count).padStart(5)} (${pct}%)`);
64
+ }
65
+ console.log("═".repeat(barWidth + 25));
66
+ }
67
+ //# sourceMappingURL=finding-severity-histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-severity-histogram.js","sourceRoot":"","sources":["../../src/commands/finding-severity-histogram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-suppress-pattern — Suppress findings matching glob patterns.
3
+ */
4
+ export declare function runFindingSuppressPattern(argv: string[]): void;
5
+ //# sourceMappingURL=finding-suppress-pattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-suppress-pattern.d.ts","sourceRoot":"","sources":["../../src/commands/finding-suppress-pattern.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+H9D"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Finding-suppress-pattern — Suppress findings matching glob patterns.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const STORE_FILE = ".judges/suppress-patterns.json";
8
+ function loadStore() {
9
+ if (!existsSync(STORE_FILE))
10
+ return { version: "1.0.0", patterns: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(STORE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", patterns: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(STORE_FILE), { recursive: true });
20
+ writeFileSync(STORE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function globToRegex(glob) {
23
+ const escaped = glob
24
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
25
+ .replace(/\*/g, ".*")
26
+ .replace(/\?/g, ".");
27
+ return new RegExp(`^${escaped}$`, "i");
28
+ }
29
+ // ─── CLI ────────────────────────────────────────────────────────────────────
30
+ export function runFindingSuppressPattern(argv) {
31
+ if (argv.includes("--help") || argv.includes("-h")) {
32
+ console.log(`
33
+ judges finding-suppress-pattern — Suppress findings by pattern
34
+
35
+ Usage:
36
+ judges finding-suppress-pattern add --pattern <glob> --field <field> --reason <text>
37
+ judges finding-suppress-pattern list
38
+ judges finding-suppress-pattern test --file <results>
39
+ judges finding-suppress-pattern remove --pattern <glob>
40
+ judges finding-suppress-pattern clear
41
+
42
+ Options:
43
+ --pattern <glob> Glob pattern to match (e.g., "SEC-*", "*injection*")
44
+ --field <field> Field to match: ruleId, title, severity (default: ruleId)
45
+ --reason <text> Reason for suppression
46
+ --file <path> Results file to test patterns against
47
+ --format json JSON output
48
+ --help, -h Show this help
49
+ `);
50
+ return;
51
+ }
52
+ const subcommand = argv.find((a) => ["add", "list", "test", "remove", "clear"].includes(a));
53
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
54
+ const store = loadStore();
55
+ if (subcommand === "add") {
56
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern");
57
+ const field = (argv.find((_a, i) => argv[i - 1] === "--field") ||
58
+ "ruleId");
59
+ const reason = argv.find((_a, i) => argv[i - 1] === "--reason") || "";
60
+ if (!pattern) {
61
+ console.error("Error: --pattern required");
62
+ process.exitCode = 1;
63
+ return;
64
+ }
65
+ store.patterns.push({ pattern, field, reason, addedAt: new Date().toISOString() });
66
+ saveStore(store);
67
+ console.log(`Added suppress pattern: ${field} ~ '${pattern}'`);
68
+ return;
69
+ }
70
+ if (subcommand === "remove") {
71
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern");
72
+ if (!pattern) {
73
+ console.error("Error: --pattern required");
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ const before = store.patterns.length;
78
+ store.patterns = store.patterns.filter((p) => p.pattern !== pattern);
79
+ saveStore(store);
80
+ console.log(`Removed ${before - store.patterns.length} pattern(s).`);
81
+ return;
82
+ }
83
+ if (subcommand === "clear") {
84
+ saveStore({ version: "1.0.0", patterns: [] });
85
+ console.log("All suppress patterns cleared.");
86
+ return;
87
+ }
88
+ if (subcommand === "test") {
89
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
90
+ if (!file) {
91
+ console.error("Error: --file required");
92
+ process.exitCode = 1;
93
+ return;
94
+ }
95
+ if (!existsSync(file)) {
96
+ console.error(`Error: file not found: ${file}`);
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ let findings;
101
+ try {
102
+ const data = JSON.parse(readFileSync(file, "utf-8"));
103
+ findings = Array.isArray(data) ? data : data.findings || [];
104
+ }
105
+ catch {
106
+ console.error("Error: could not parse results file");
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ let suppressed = 0;
111
+ let kept = 0;
112
+ for (const f of findings) {
113
+ let isSuppressed = false;
114
+ for (const p of store.patterns) {
115
+ const value = f[p.field] || "";
116
+ if (globToRegex(p.pattern).test(value)) {
117
+ isSuppressed = true;
118
+ break;
119
+ }
120
+ }
121
+ if (isSuppressed)
122
+ suppressed++;
123
+ else
124
+ kept++;
125
+ }
126
+ if (format === "json") {
127
+ console.log(JSON.stringify({ total: findings.length, suppressed, kept }, null, 2));
128
+ return;
129
+ }
130
+ console.log(`Test results: ${suppressed} suppressed, ${kept} kept (${findings.length} total)`);
131
+ return;
132
+ }
133
+ // Default: list
134
+ if (store.patterns.length === 0) {
135
+ console.log("No suppress patterns defined.");
136
+ return;
137
+ }
138
+ if (format === "json") {
139
+ console.log(JSON.stringify(store.patterns, null, 2));
140
+ return;
141
+ }
142
+ console.log(`\nSuppress Patterns (${store.patterns.length}):`);
143
+ console.log("═".repeat(60));
144
+ for (const p of store.patterns) {
145
+ console.log(` ${p.field.padEnd(10)} ~ '${p.pattern}'${p.reason ? ` — ${p.reason}` : ""}`);
146
+ }
147
+ console.log("═".repeat(60));
148
+ }
149
+ //# sourceMappingURL=finding-suppress-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-suppress-pattern.js","sourceRoot":"","sources":["../../src/commands/finding-suppress-pattern.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;AAgB/B,+EAA+E;AAE/E,MAAM,UAAU,GAAG,gCAAgC,CAAC;AAEpD,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACvE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAkB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAoB;IACrC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvB,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,yBAAyB,CAAC,IAAc;IACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,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,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;QAClF,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC;YAC5E,QAAQ,CAA6B,CAAC;QACxC,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,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnF,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,OAAO,OAAO,GAAG,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;QAClF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACrE,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,QAAuE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACrD,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvC,YAAY,GAAG,IAAI,CAAC;oBACpB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,YAAY;gBAAE,UAAU,EAAE,CAAC;;gBAC1B,IAAI,EAAE,CAAC;QACd,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,gBAAgB,IAAI,UAAU,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-auto-merge — Auto-merge reviews that pass all checks.
3
+ */
4
+ export declare function runReviewAutoMerge(argv: string[]): void;
5
+ //# sourceMappingURL=review-auto-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-auto-merge.d.ts","sourceRoot":"","sources":["../../src/commands/review-auto-merge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmDH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiJvD"}