@kevinrabun/judges 3.64.0 → 3.66.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 +15 -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/code-health.d.ts +5 -0
  6. package/dist/commands/code-health.d.ts.map +1 -0
  7. package/dist/commands/code-health.js +196 -0
  8. package/dist/commands/code-health.js.map +1 -0
  9. package/dist/commands/finding-suppress.d.ts +5 -0
  10. package/dist/commands/finding-suppress.d.ts.map +1 -0
  11. package/dist/commands/finding-suppress.js +165 -0
  12. package/dist/commands/finding-suppress.js.map +1 -0
  13. package/dist/commands/finding-timeline.d.ts +5 -0
  14. package/dist/commands/finding-timeline.d.ts.map +1 -0
  15. package/dist/commands/finding-timeline.js +144 -0
  16. package/dist/commands/finding-timeline.js.map +1 -0
  17. package/dist/commands/fix-verify.d.ts +5 -0
  18. package/dist/commands/fix-verify.d.ts.map +1 -0
  19. package/dist/commands/fix-verify.js +124 -0
  20. package/dist/commands/fix-verify.js.map +1 -0
  21. package/dist/commands/judge-config.d.ts +5 -0
  22. package/dist/commands/judge-config.d.ts.map +1 -0
  23. package/dist/commands/judge-config.js +152 -0
  24. package/dist/commands/judge-config.js.map +1 -0
  25. package/dist/commands/review-annotate.d.ts +5 -0
  26. package/dist/commands/review-annotate.d.ts.map +1 -0
  27. package/dist/commands/review-annotate.js +123 -0
  28. package/dist/commands/review-annotate.js.map +1 -0
  29. package/dist/commands/review-checkpoint.d.ts +5 -0
  30. package/dist/commands/review-checkpoint.d.ts.map +1 -0
  31. package/dist/commands/review-checkpoint.js +164 -0
  32. package/dist/commands/review-checkpoint.js.map +1 -0
  33. package/dist/commands/review-comment.d.ts +5 -0
  34. package/dist/commands/review-comment.d.ts.map +1 -0
  35. package/dist/commands/review-comment.js +166 -0
  36. package/dist/commands/review-comment.js.map +1 -0
  37. package/dist/commands/review-export.d.ts +5 -0
  38. package/dist/commands/review-export.d.ts.map +1 -0
  39. package/dist/commands/review-export.js +180 -0
  40. package/dist/commands/review-export.js.map +1 -0
  41. package/dist/commands/review-filter.d.ts +5 -0
  42. package/dist/commands/review-filter.d.ts.map +1 -0
  43. package/dist/commands/review-filter.js +166 -0
  44. package/dist/commands/review-filter.js.map +1 -0
  45. package/dist/commands/review-merge.d.ts +5 -0
  46. package/dist/commands/review-merge.d.ts.map +1 -0
  47. package/dist/commands/review-merge.js +146 -0
  48. package/dist/commands/review-merge.js.map +1 -0
  49. package/dist/commands/review-schedule.d.ts +5 -0
  50. package/dist/commands/review-schedule.d.ts.map +1 -0
  51. package/dist/commands/review-schedule.js +170 -0
  52. package/dist/commands/review-schedule.js.map +1 -0
  53. package/dist/commands/review-scope.d.ts +5 -0
  54. package/dist/commands/review-scope.d.ts.map +1 -0
  55. package/dist/commands/review-scope.js +198 -0
  56. package/dist/commands/review-scope.js.map +1 -0
  57. package/dist/commands/review-webhook.d.ts +5 -0
  58. package/dist/commands/review-webhook.d.ts.map +1 -0
  59. package/dist/commands/review-webhook.js +141 -0
  60. package/dist/commands/review-webhook.js.map +1 -0
  61. package/dist/commands/rule-catalog.d.ts +5 -0
  62. package/dist/commands/rule-catalog.d.ts.map +1 -0
  63. package/dist/commands/rule-catalog.js +129 -0
  64. package/dist/commands/rule-catalog.js.map +1 -0
  65. package/dist/commands/setup-wizard.d.ts +5 -0
  66. package/dist/commands/setup-wizard.d.ts.map +1 -0
  67. package/dist/commands/setup-wizard.js +175 -0
  68. package/dist/commands/setup-wizard.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-comment.d.ts","sourceRoot":"","sources":["../../src/commands/review-comment.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8EH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwHrD"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Review-comment — Generate inline source code comments from review findings.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ const COMMENT_STYLES = {
6
+ javascript: { line: "//", blockStart: "/*", blockEnd: "*/" },
7
+ typescript: { line: "//", blockStart: "/*", blockEnd: "*/" },
8
+ python: { line: "#", blockStart: '"""', blockEnd: '"""' },
9
+ ruby: { line: "#", blockStart: "=begin", blockEnd: "=end" },
10
+ java: { line: "//", blockStart: "/*", blockEnd: "*/" },
11
+ csharp: { line: "//", blockStart: "/*", blockEnd: "*/" },
12
+ go: { line: "//", blockStart: "/*", blockEnd: "*/" },
13
+ rust: { line: "//", blockStart: "/*", blockEnd: "*/" },
14
+ cpp: { line: "//", blockStart: "/*", blockEnd: "*/" },
15
+ c: { line: "//", blockStart: "/*", blockEnd: "*/" },
16
+ };
17
+ function getCommentStyle(lang) {
18
+ return COMMENT_STYLES[lang.toLowerCase()] || COMMENT_STYLES["javascript"];
19
+ }
20
+ function formatComment(finding, style, commentStyle) {
21
+ const severity = (finding.severity || "info").toUpperCase();
22
+ const rule = finding.ruleId || "JUDGES";
23
+ const title = finding.title || "Finding";
24
+ if (commentStyle === "line") {
25
+ const lines = [`${style.line} JUDGES [${severity}] ${rule}: ${title}`];
26
+ if (finding.recommendation) {
27
+ lines.push(`${style.line} Fix: ${finding.recommendation}`);
28
+ }
29
+ return lines.join("\n");
30
+ }
31
+ if (commentStyle === "jsdoc") {
32
+ const lines = [`/** JUDGES [${severity}] ${rule}: ${title}`];
33
+ if (finding.recommendation) {
34
+ lines.push(` * Fix: ${finding.recommendation}`);
35
+ }
36
+ lines.push(" */");
37
+ return lines.join("\n");
38
+ }
39
+ // block
40
+ const lines = [`/* JUDGES [${severity}] ${rule}: ${title}`];
41
+ if (finding.recommendation) {
42
+ lines.push(` Fix: ${finding.recommendation}`);
43
+ }
44
+ lines.push("*/");
45
+ return lines.join("\n");
46
+ }
47
+ function generateComments(findings, lang, style) {
48
+ const cs = getCommentStyle(lang);
49
+ const blocks = [];
50
+ for (const f of findings) {
51
+ const line = f.lineNumbers && f.lineNumbers.length > 0 ? f.lineNumbers[0] : 1;
52
+ blocks.push({ line, text: formatComment(f, cs, style) });
53
+ }
54
+ // Sort by line descending so insertions don't shift subsequent lines
55
+ blocks.sort((a, b) => b.line - a.line);
56
+ return blocks;
57
+ }
58
+ // ─── CLI ────────────────────────────────────────────────────────────────────
59
+ export function runReviewComment(argv) {
60
+ if (argv.includes("--help") || argv.includes("-h")) {
61
+ console.log(`
62
+ judges review-comment — Generate inline code comments from findings
63
+
64
+ Usage:
65
+ judges review-comment --verdict verdict.json --source app.ts
66
+ judges review-comment --verdict verdict.json --source app.py --lang python
67
+ judges review-comment --verdict verdict.json --preview
68
+
69
+ Options:
70
+ --verdict <path> Verdict JSON file
71
+ --source <path> Source file to annotate (optional; preview without)
72
+ --lang <language> Language (auto-detected from extension)
73
+ --style line|block|jsdoc Comment style (default: line)
74
+ --output <path> Write annotated file to path (default: modifies in-place)
75
+ --preview Show comments without modifying files
76
+ --min-severity <sev> Only include findings at this severity or above
77
+ --format json JSON output
78
+ --help, -h Show this help
79
+
80
+ Generates inline code comments from review findings. Comments include
81
+ severity, rule ID, title, and fix recommendation.
82
+ `);
83
+ return;
84
+ }
85
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
86
+ const verdictFile = argv.find((_a, i) => argv[i - 1] === "--verdict");
87
+ const sourceFile = argv.find((_a, i) => argv[i - 1] === "--source");
88
+ const lang = argv.find((_a, i) => argv[i - 1] === "--lang") || "";
89
+ const styleArg = argv.find((_a, i) => argv[i - 1] === "--style") || "line";
90
+ const outputFile = argv.find((_a, i) => argv[i - 1] === "--output");
91
+ const preview = argv.includes("--preview");
92
+ const minSev = argv.find((_a, i) => argv[i - 1] === "--min-severity");
93
+ if (!verdictFile) {
94
+ console.error("Error: --verdict is required.");
95
+ process.exitCode = 1;
96
+ return;
97
+ }
98
+ if (!existsSync(verdictFile)) {
99
+ console.error(`Error: File not found: ${verdictFile}`);
100
+ process.exitCode = 1;
101
+ return;
102
+ }
103
+ let verdict;
104
+ try {
105
+ verdict = JSON.parse(readFileSync(verdictFile, "utf-8"));
106
+ }
107
+ catch {
108
+ console.error(`Error: Could not parse ${verdictFile}`);
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ let findings = verdict.findings || [];
113
+ // Severity filter
114
+ if (minSev) {
115
+ const sevOrder = { critical: 4, high: 3, medium: 2, low: 1, info: 0 };
116
+ const threshold = sevOrder[minSev.toLowerCase()] ?? 0;
117
+ findings = findings.filter((f) => (sevOrder[(f.severity || "").toLowerCase()] ?? 0) >= threshold);
118
+ }
119
+ // Detect language from source file extension
120
+ const detectedLang = lang || (sourceFile ? sourceFile.split(".").pop() || "ts" : "ts");
121
+ const languageMap = {
122
+ ts: "typescript",
123
+ js: "javascript",
124
+ py: "python",
125
+ rb: "ruby",
126
+ java: "java",
127
+ cs: "csharp",
128
+ go: "go",
129
+ rs: "rust",
130
+ cpp: "cpp",
131
+ c: "c",
132
+ };
133
+ const resolvedLang = languageMap[detectedLang] || detectedLang;
134
+ const commentStyle = (["line", "block", "jsdoc"].includes(styleArg) ? styleArg : "line");
135
+ const comments = generateComments(findings, resolvedLang, commentStyle);
136
+ if (format === "json") {
137
+ console.log(JSON.stringify({ language: resolvedLang, style: commentStyle, comments }, null, 2));
138
+ return;
139
+ }
140
+ if (preview || !sourceFile) {
141
+ console.log(`\n Review Comments Preview (${resolvedLang}, ${commentStyle} style)\n ─────────────────────────────`);
142
+ for (const c of [...comments].reverse()) {
143
+ console.log(`\n Line ${c.line}:`);
144
+ for (const line of c.text.split("\n")) {
145
+ console.log(` ${line}`);
146
+ }
147
+ }
148
+ console.log(`\n Total: ${comments.length} comment(s)\n`);
149
+ return;
150
+ }
151
+ // Insert comments into source file
152
+ if (!existsSync(sourceFile)) {
153
+ console.error(`Error: Source file not found: ${sourceFile}`);
154
+ process.exitCode = 1;
155
+ return;
156
+ }
157
+ const sourceLines = readFileSync(sourceFile, "utf-8").split("\n");
158
+ for (const c of comments) {
159
+ const insertAt = Math.max(0, c.line - 1);
160
+ sourceLines.splice(insertAt, 0, c.text);
161
+ }
162
+ const dest = outputFile || sourceFile;
163
+ writeFileSync(dest, sourceLines.join("\n"), "utf-8");
164
+ console.log(`Inserted ${comments.length} comment(s) into ${dest}`);
165
+ }
166
+ //# sourceMappingURL=review-comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-comment.js","sourceRoot":"","sources":["../../src/commands/review-comment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-export — Unified export of review results to multiple formats.
3
+ */
4
+ export declare function runReviewExport(argv: string[]): void;
5
+ //# sourceMappingURL=review-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-export.d.ts","sourceRoot":"","sources":["../../src/commands/review-export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwHH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6EpD"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Review-export — Unified export of review results to multiple formats.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Format helpers ─────────────────────────────────────────────────────────
7
+ function toCSV(verdict) {
8
+ const findings = verdict.findings || [];
9
+ const header = "severity,ruleId,title,recommendation,confidence,lines";
10
+ const rows = findings.map((f) => {
11
+ const sev = (f.severity || "").replace(/,/g, ";");
12
+ const rule = (f.ruleId || "").replace(/,/g, ";");
13
+ const title = (f.title || "").replace(/,/g, ";").replace(/"/g, '""');
14
+ const rec = (f.recommendation || "").replace(/,/g, ";").replace(/"/g, '""');
15
+ const conf = f.confidence ?? "";
16
+ const lines = f.lineNumbers ? f.lineNumbers.join(";") : "";
17
+ return `${sev},${rule},"${title}","${rec}",${conf},${lines}`;
18
+ });
19
+ return [header, ...rows].join("\n");
20
+ }
21
+ function toMarkdown(verdict) {
22
+ const findings = verdict.findings || [];
23
+ const lines = [];
24
+ lines.push("# Review Results");
25
+ lines.push("");
26
+ lines.push(`**Score**: ${verdict.overallScore || 0}/100`);
27
+ lines.push(`**Verdict**: ${verdict.overallVerdict || "n/a"}`);
28
+ lines.push(`**Findings**: ${findings.length}`);
29
+ lines.push(`**Timestamp**: ${verdict.timestamp || new Date().toISOString()}`);
30
+ lines.push("");
31
+ if (verdict.summary) {
32
+ lines.push("## Summary");
33
+ lines.push("");
34
+ lines.push(verdict.summary);
35
+ lines.push("");
36
+ }
37
+ if (findings.length > 0) {
38
+ lines.push("## Findings");
39
+ lines.push("");
40
+ lines.push("| Severity | Rule | Title | Lines |");
41
+ lines.push("|----------|------|-------|-------|");
42
+ for (const f of findings) {
43
+ const sev = f.severity || "unknown";
44
+ const rule = f.ruleId || "";
45
+ const title = (f.title || "").replace(/\|/g, "\\|");
46
+ const lineNums = f.lineNumbers ? f.lineNumbers.join(", ") : "";
47
+ lines.push(`| ${sev} | ${rule} | ${title} | ${lineNums} |`);
48
+ }
49
+ lines.push("");
50
+ // Details
51
+ lines.push("## Details");
52
+ lines.push("");
53
+ for (const f of findings) {
54
+ lines.push(`### [${(f.severity || "").toUpperCase()}] ${f.title || f.ruleId}`);
55
+ lines.push("");
56
+ if (f.description)
57
+ lines.push(f.description);
58
+ if (f.recommendation) {
59
+ lines.push("");
60
+ lines.push(`**Recommendation**: ${f.recommendation}`);
61
+ }
62
+ lines.push("");
63
+ }
64
+ }
65
+ return lines.join("\n");
66
+ }
67
+ function toHTML(verdict) {
68
+ const findings = verdict.findings || [];
69
+ const severityColor = {
70
+ critical: "#d32f2f",
71
+ high: "#f57c00",
72
+ medium: "#fbc02d",
73
+ low: "#388e3c",
74
+ info: "#1976d2",
75
+ };
76
+ const rows = findings
77
+ .map((f) => {
78
+ const color = severityColor[(f.severity || "").toLowerCase()] || "#666";
79
+ return `<tr>
80
+ <td style="color:${color};font-weight:bold">${(f.severity || "").toUpperCase()}</td>
81
+ <td>${f.ruleId || ""}</td>
82
+ <td>${f.title || ""}</td>
83
+ <td>${f.lineNumbers ? f.lineNumbers.join(", ") : ""}</td>
84
+ <td>${f.recommendation || ""}</td>
85
+ </tr>`;
86
+ })
87
+ .join("\n");
88
+ return `<!DOCTYPE html>
89
+ <html lang="en">
90
+ <head><meta charset="utf-8"><title>Review Results</title>
91
+ <style>body{font-family:system-ui;max-width:900px;margin:0 auto;padding:20px}
92
+ table{width:100%;border-collapse:collapse}th,td{padding:8px 12px;border:1px solid #ddd;text-align:left}
93
+ th{background:#f5f5f5}.summary{background:#f0f7ff;padding:16px;border-radius:8px;margin:16px 0}</style>
94
+ </head>
95
+ <body>
96
+ <h1>Review Results</h1>
97
+ <div class="summary">
98
+ <strong>Score:</strong> ${verdict.overallScore || 0}/100 |
99
+ <strong>Verdict:</strong> ${verdict.overallVerdict || "n/a"} |
100
+ <strong>Findings:</strong> ${findings.length}
101
+ </div>
102
+ ${verdict.summary ? `<p>${verdict.summary}</p>` : ""}
103
+ <table><thead><tr><th>Severity</th><th>Rule</th><th>Title</th><th>Lines</th><th>Recommendation</th></tr></thead>
104
+ <tbody>${rows}</tbody></table>
105
+ </body></html>`;
106
+ }
107
+ // ─── CLI ────────────────────────────────────────────────────────────────────
108
+ export function runReviewExport(argv) {
109
+ if (argv.includes("--help") || argv.includes("-h")) {
110
+ console.log(`
111
+ judges review-export — Export review results to various formats
112
+
113
+ Usage:
114
+ judges review-export --file verdict.json --to csv --output results.csv
115
+ judges review-export --file verdict.json --to markdown --output report.md
116
+ judges review-export --file verdict.json --to html --output report.html
117
+
118
+ Options:
119
+ --file <path> Verdict JSON to export
120
+ --to <format> Export format: csv, markdown, html, json
121
+ --output <path> Output file path
122
+ --stdout Print to stdout instead of file
123
+ --help, -h Show this help
124
+
125
+ Exports review verdicts to CSV, Markdown, HTML, or pretty-printed JSON.
126
+ `);
127
+ return;
128
+ }
129
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
130
+ const toFormat = argv.find((_a, i) => argv[i - 1] === "--to") || "markdown";
131
+ const outputFile = argv.find((_a, i) => argv[i - 1] === "--output");
132
+ const toStdout = argv.includes("--stdout");
133
+ if (!file) {
134
+ console.error("Error: --file is required.");
135
+ process.exitCode = 1;
136
+ return;
137
+ }
138
+ if (!existsSync(file)) {
139
+ console.error(`Error: File not found: ${file}`);
140
+ process.exitCode = 1;
141
+ return;
142
+ }
143
+ let verdict;
144
+ try {
145
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
146
+ }
147
+ catch {
148
+ console.error(`Error: Could not parse ${file}`);
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ let content;
153
+ switch (toFormat.toLowerCase()) {
154
+ case "csv":
155
+ content = toCSV(verdict);
156
+ break;
157
+ case "markdown":
158
+ case "md":
159
+ content = toMarkdown(verdict);
160
+ break;
161
+ case "html":
162
+ content = toHTML(verdict);
163
+ break;
164
+ case "json":
165
+ content = JSON.stringify(verdict, null, 2);
166
+ break;
167
+ default:
168
+ console.error(`Error: Unknown format '${toFormat}'. Supported: csv, markdown, html, json`);
169
+ process.exitCode = 1;
170
+ return;
171
+ }
172
+ if (toStdout || !outputFile) {
173
+ console.log(content);
174
+ return;
175
+ }
176
+ mkdirSync(dirname(outputFile), { recursive: true });
177
+ writeFileSync(outputFile, content, "utf-8");
178
+ console.log(`Exported ${toFormat} to ${outputFile} (${(verdict.findings || []).length} findings)`);
179
+ }
180
+ //# sourceMappingURL=review-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-export.js","sourceRoot":"","sources":["../../src/commands/review-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-filter — Advanced multi-criteria finding filter.
3
+ */
4
+ export declare function runReviewFilter(argv: string[]): void;
5
+ //# sourceMappingURL=review-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-filter.d.ts","sourceRoot":"","sources":["../../src/commands/review-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+FH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyFpD"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Review-filter — Advanced multi-criteria finding filter.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ function parseFilterCriteria(argv) {
6
+ const criteria = {
7
+ severity: [],
8
+ ruleIds: [],
9
+ minConfidence: 0,
10
+ maxConfidence: 1,
11
+ titlePattern: "",
12
+ hasRecommendation: null,
13
+ hasPatch: null,
14
+ minLine: 0,
15
+ maxLine: Number.MAX_SAFE_INTEGER,
16
+ };
17
+ const severityArg = argv.find((_a, i) => argv[i - 1] === "--severity");
18
+ if (severityArg)
19
+ criteria.severity = severityArg.split(",").map((s) => s.trim().toLowerCase());
20
+ const ruleArg = argv.find((_a, i) => argv[i - 1] === "--rule");
21
+ if (ruleArg)
22
+ criteria.ruleIds = ruleArg.split(",").map((s) => s.trim());
23
+ const minConf = argv.find((_a, i) => argv[i - 1] === "--min-confidence");
24
+ if (minConf)
25
+ criteria.minConfidence = parseFloat(minConf);
26
+ const maxConf = argv.find((_a, i) => argv[i - 1] === "--max-confidence");
27
+ if (maxConf)
28
+ criteria.maxConfidence = parseFloat(maxConf);
29
+ const title = argv.find((_a, i) => argv[i - 1] === "--title");
30
+ if (title)
31
+ criteria.titlePattern = title;
32
+ if (argv.includes("--has-recommendation"))
33
+ criteria.hasRecommendation = true;
34
+ if (argv.includes("--no-recommendation"))
35
+ criteria.hasRecommendation = false;
36
+ if (argv.includes("--has-patch"))
37
+ criteria.hasPatch = true;
38
+ if (argv.includes("--no-patch"))
39
+ criteria.hasPatch = false;
40
+ const minLine = argv.find((_a, i) => argv[i - 1] === "--min-line");
41
+ if (minLine)
42
+ criteria.minLine = parseInt(minLine, 10);
43
+ const maxLine = argv.find((_a, i) => argv[i - 1] === "--max-line");
44
+ if (maxLine)
45
+ criteria.maxLine = parseInt(maxLine, 10);
46
+ return criteria;
47
+ }
48
+ function matchesCriteria(f, c) {
49
+ if (c.severity.length > 0 && !c.severity.includes((f.severity || "").toLowerCase()))
50
+ return false;
51
+ if (c.ruleIds.length > 0 && !c.ruleIds.includes(f.ruleId || ""))
52
+ return false;
53
+ const conf = f.confidence ?? 0;
54
+ if (conf < c.minConfidence || conf > c.maxConfidence)
55
+ return false;
56
+ if (c.titlePattern) {
57
+ try {
58
+ const re = new RegExp(c.titlePattern, "i");
59
+ if (!re.test(f.title || ""))
60
+ return false;
61
+ }
62
+ catch {
63
+ if (!(f.title || "").toLowerCase().includes(c.titlePattern.toLowerCase()))
64
+ return false;
65
+ }
66
+ }
67
+ if (c.hasRecommendation === true && !f.recommendation)
68
+ return false;
69
+ if (c.hasRecommendation === false && f.recommendation)
70
+ return false;
71
+ if (c.hasPatch === true && !f.patch)
72
+ return false;
73
+ if (c.hasPatch === false && f.patch)
74
+ return false;
75
+ if (f.lineNumbers && f.lineNumbers.length > 0) {
76
+ const minL = Math.min(...f.lineNumbers);
77
+ const maxL = Math.max(...f.lineNumbers);
78
+ if (maxL < c.minLine || minL > c.maxLine)
79
+ return false;
80
+ }
81
+ return true;
82
+ }
83
+ // ─── CLI ────────────────────────────────────────────────────────────────────
84
+ export function runReviewFilter(argv) {
85
+ if (argv.includes("--help") || argv.includes("-h")) {
86
+ console.log(`
87
+ judges review-filter — Advanced multi-criteria finding filter
88
+
89
+ Usage:
90
+ judges review-filter --file verdict.json --severity critical,high
91
+ judges review-filter --file verdict.json --rule SQLI,XSS --has-patch
92
+ judges review-filter --file verdict.json --min-confidence 0.8
93
+
94
+ Options:
95
+ --file <path> Verdict JSON to filter
96
+ --severity <list> Filter by severity (comma-separated)
97
+ --rule <list> Filter by rule ID (comma-separated)
98
+ --min-confidence <n> Minimum confidence threshold (0-1)
99
+ --max-confidence <n> Maximum confidence threshold (0-1)
100
+ --title <pattern> Filter by title regex pattern
101
+ --has-recommendation Only findings with recommendations
102
+ --no-recommendation Only findings without recommendations
103
+ --has-patch Only findings with patches
104
+ --no-patch Only findings without patches
105
+ --min-line <n> Minimum line number
106
+ --max-line <n> Maximum line number
107
+ --format json JSON output
108
+ --help, -h Show this help
109
+
110
+ Multiple criteria are combined with AND logic.
111
+ `);
112
+ return;
113
+ }
114
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
115
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
116
+ if (!file) {
117
+ console.error("Error: --file is required.");
118
+ process.exitCode = 1;
119
+ return;
120
+ }
121
+ if (!existsSync(file)) {
122
+ console.error(`Error: File not found: ${file}`);
123
+ process.exitCode = 1;
124
+ return;
125
+ }
126
+ let verdict;
127
+ try {
128
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
129
+ }
130
+ catch {
131
+ console.error(`Error: Could not parse ${file}`);
132
+ process.exitCode = 1;
133
+ return;
134
+ }
135
+ const criteria = parseFilterCriteria(argv);
136
+ const allFindings = verdict.findings || [];
137
+ const matched = allFindings.filter((f) => matchesCriteria(f, criteria));
138
+ if (format === "json") {
139
+ console.log(JSON.stringify({ total: allFindings.length, matched: matched.length, criteria, findings: matched }, null, 2));
140
+ return;
141
+ }
142
+ console.log(`\n Filtered Findings\n ─────────────────────────────`);
143
+ console.log(` Total: ${allFindings.length}`);
144
+ console.log(` Matched: ${matched.length}`);
145
+ console.log(` Excluded: ${allFindings.length - matched.length}`);
146
+ console.log();
147
+ if (criteria.severity.length > 0)
148
+ console.log(` Filter — severity: ${criteria.severity.join(", ")}`);
149
+ if (criteria.ruleIds.length > 0)
150
+ console.log(` Filter — rules: ${criteria.ruleIds.join(", ")}`);
151
+ if (criteria.minConfidence > 0)
152
+ console.log(` Filter — min confidence: ${criteria.minConfidence}`);
153
+ if (criteria.titlePattern)
154
+ console.log(` Filter — title pattern: ${criteria.titlePattern}`);
155
+ console.log();
156
+ for (const f of matched) {
157
+ const sev = f.severity || "unknown";
158
+ const line = f.lineNumbers && f.lineNumbers.length > 0 ? ` (L${f.lineNumbers[0]})` : "";
159
+ console.log(` [${sev.toUpperCase()}] ${f.title || f.ruleId || "untitled"}${line}`);
160
+ }
161
+ if (matched.length === 0) {
162
+ console.log(" No findings match the specified criteria.");
163
+ }
164
+ console.log();
165
+ }
166
+ //# sourceMappingURL=review-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-filter.js","sourceRoot":"","sources":["../../src/commands/review-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-merge — Merge multiple review results into a consolidated report.
3
+ */
4
+ export declare function runReviewMerge(argv: string[]): void;
5
+ //# sourceMappingURL=review-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-merge.d.ts","sourceRoot":"","sources":["../../src/commands/review-merge.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4CH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+HnD"}