@kevinrabun/judges 3.80.0 → 3.81.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 (42) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +63 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-cwe-map.d.ts +5 -0
  6. package/dist/commands/finding-cwe-map.d.ts.map +1 -0
  7. package/dist/commands/finding-cwe-map.js +134 -0
  8. package/dist/commands/finding-cwe-map.js.map +1 -0
  9. package/dist/commands/finding-false-neg-check.d.ts +9 -0
  10. package/dist/commands/finding-false-neg-check.d.ts.map +1 -0
  11. package/dist/commands/finding-false-neg-check.js +140 -0
  12. package/dist/commands/finding-false-neg-check.js.map +1 -0
  13. package/dist/commands/finding-pattern-match.d.ts +5 -0
  14. package/dist/commands/finding-pattern-match.d.ts.map +1 -0
  15. package/dist/commands/finding-pattern-match.js +166 -0
  16. package/dist/commands/finding-pattern-match.js.map +1 -0
  17. package/dist/commands/finding-risk-matrix.d.ts +5 -0
  18. package/dist/commands/finding-risk-matrix.d.ts.map +1 -0
  19. package/dist/commands/finding-risk-matrix.js +127 -0
  20. package/dist/commands/finding-risk-matrix.js.map +1 -0
  21. package/dist/commands/review-dependency-graph.d.ts +5 -0
  22. package/dist/commands/review-dependency-graph.d.ts.map +1 -0
  23. package/dist/commands/review-dependency-graph.js +95 -0
  24. package/dist/commands/review-dependency-graph.js.map +1 -0
  25. package/dist/commands/review-diff-stats.d.ts +5 -0
  26. package/dist/commands/review-diff-stats.d.ts.map +1 -0
  27. package/dist/commands/review-diff-stats.js +91 -0
  28. package/dist/commands/review-diff-stats.js.map +1 -0
  29. package/dist/commands/review-exclude-vendor.d.ts +5 -0
  30. package/dist/commands/review-exclude-vendor.d.ts.map +1 -0
  31. package/dist/commands/review-exclude-vendor.js +159 -0
  32. package/dist/commands/review-exclude-vendor.js.map +1 -0
  33. package/dist/commands/review-file-stats.d.ts +5 -0
  34. package/dist/commands/review-file-stats.d.ts.map +1 -0
  35. package/dist/commands/review-file-stats.js +131 -0
  36. package/dist/commands/review-file-stats.js.map +1 -0
  37. package/dist/commands/review-rule-filter.d.ts +5 -0
  38. package/dist/commands/review-rule-filter.d.ts.map +1 -0
  39. package/dist/commands/review-rule-filter.js +117 -0
  40. package/dist/commands/review-rule-filter.js.map +1 -0
  41. package/package.json +1 -1
  42. package/server.json +2 -2
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Review-rule-filter — Filter review results by rule criteria.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ const SEVERITY_ORDER = { critical: 4, high: 3, medium: 2, low: 1, info: 0 };
7
+ function matchesFilter(finding, criteria) {
8
+ if (criteria.includeRules && criteria.includeRules.length > 0) {
9
+ if (!criteria.includeRules.includes(finding.ruleId))
10
+ return false;
11
+ }
12
+ if (criteria.excludeRules && criteria.excludeRules.length > 0) {
13
+ if (criteria.excludeRules.includes(finding.ruleId))
14
+ return false;
15
+ }
16
+ if (criteria.minSeverity) {
17
+ const threshold = SEVERITY_ORDER[criteria.minSeverity.toLowerCase()] ?? 0;
18
+ const findingSev = SEVERITY_ORDER[(finding.severity || "medium").toLowerCase()] ?? 2;
19
+ if (findingSev < threshold)
20
+ return false;
21
+ }
22
+ if (criteria.rulePrefix) {
23
+ if (!finding.ruleId.startsWith(criteria.rulePrefix))
24
+ return false;
25
+ }
26
+ if (criteria.titleContains) {
27
+ if (!finding.title.toLowerCase().includes(criteria.titleContains.toLowerCase()))
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ // ─── CLI ────────────────────────────────────────────────────────────────────
33
+ export function runReviewRuleFilter(argv) {
34
+ const fileIdx = argv.indexOf("--file");
35
+ const includeIdx = argv.indexOf("--include");
36
+ const excludeIdx = argv.indexOf("--exclude");
37
+ const sevIdx = argv.indexOf("--min-severity");
38
+ const prefixIdx = argv.indexOf("--prefix");
39
+ const titleIdx = argv.indexOf("--title");
40
+ const formatIdx = argv.indexOf("--format");
41
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
42
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
43
+ if (argv.includes("--help") || argv.includes("-h")) {
44
+ console.log(`
45
+ judges review-rule-filter — Filter review results by rule criteria
46
+
47
+ Usage:
48
+ judges review-rule-filter --file <verdict.json> [options]
49
+
50
+ Options:
51
+ --file <path> Path to verdict JSON file (required)
52
+ --include <rules> Comma-separated list of rule IDs to include
53
+ --exclude <rules> Comma-separated list of rule IDs to exclude
54
+ --min-severity <sev> Minimum severity: critical, high, medium, low, info
55
+ --prefix <prefix> Filter by rule ID prefix
56
+ --title <text> Filter by title containing text
57
+ --format <fmt> Output format: table (default), json
58
+ --help, -h Show this help
59
+ `);
60
+ return;
61
+ }
62
+ if (!filePath) {
63
+ console.error("Error: --file required");
64
+ process.exitCode = 1;
65
+ return;
66
+ }
67
+ if (!existsSync(filePath)) {
68
+ console.error(`Error: file not found: ${filePath}`);
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ let verdict;
73
+ try {
74
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
75
+ }
76
+ catch {
77
+ console.error("Error: invalid JSON");
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ const criteria = {};
82
+ if (includeIdx >= 0)
83
+ criteria.includeRules = argv[includeIdx + 1].split(",");
84
+ if (excludeIdx >= 0)
85
+ criteria.excludeRules = argv[excludeIdx + 1].split(",");
86
+ if (sevIdx >= 0)
87
+ criteria.minSeverity = argv[sevIdx + 1];
88
+ if (prefixIdx >= 0)
89
+ criteria.rulePrefix = argv[prefixIdx + 1];
90
+ if (titleIdx >= 0)
91
+ criteria.titleContains = argv[titleIdx + 1];
92
+ const filtered = verdict.findings.filter((f) => matchesFilter(f, criteria));
93
+ const excluded = verdict.findings.length - filtered.length;
94
+ if (format === "json") {
95
+ console.log(JSON.stringify({ total: verdict.findings.length, filtered: filtered.length, excluded, findings: filtered }, null, 2));
96
+ return;
97
+ }
98
+ console.log(`\nFiltered Findings (${filtered.length} of ${verdict.findings.length})`);
99
+ console.log("═".repeat(70));
100
+ if (filtered.length === 0) {
101
+ console.log("No findings match the filter criteria.");
102
+ }
103
+ else {
104
+ console.log(`${"Rule".padEnd(30)} ${"Severity".padEnd(10)} Title`);
105
+ console.log("─".repeat(70));
106
+ for (const f of filtered) {
107
+ const rule = f.ruleId.length > 28 ? f.ruleId.slice(0, 28) + "…" : f.ruleId;
108
+ const sev = (f.severity || "medium").padEnd(10);
109
+ const title = f.title.length > 28 ? f.title.slice(0, 28) + "…" : f.title;
110
+ console.log(`${rule.padEnd(30)} ${sev} ${title}`);
111
+ }
112
+ }
113
+ console.log("─".repeat(70));
114
+ console.log(`${excluded} findings excluded by filters`);
115
+ console.log("═".repeat(70));
116
+ }
117
+ //# sourceMappingURL=review-rule-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rule-filter.js","sourceRoot":"","sources":["../../src/commands/review-rule-filter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.80.0",
3
+ "version": "3.81.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.80.0",
10
+ "version": "3.81.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.80.0",
15
+ "version": "3.81.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }