@kevinrabun/judges 3.80.0 → 3.82.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 (78) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +126 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-age-tracker.d.ts +8 -0
  6. package/dist/commands/finding-age-tracker.d.ts.map +1 -0
  7. package/dist/commands/finding-age-tracker.js +153 -0
  8. package/dist/commands/finding-age-tracker.js.map +1 -0
  9. package/dist/commands/finding-cwe-map.d.ts +5 -0
  10. package/dist/commands/finding-cwe-map.d.ts.map +1 -0
  11. package/dist/commands/finding-cwe-map.js +134 -0
  12. package/dist/commands/finding-cwe-map.js.map +1 -0
  13. package/dist/commands/finding-duplicate-rule.d.ts +5 -0
  14. package/dist/commands/finding-duplicate-rule.d.ts.map +1 -0
  15. package/dist/commands/finding-duplicate-rule.js +104 -0
  16. package/dist/commands/finding-duplicate-rule.js.map +1 -0
  17. package/dist/commands/finding-false-neg-check.d.ts +9 -0
  18. package/dist/commands/finding-false-neg-check.d.ts.map +1 -0
  19. package/dist/commands/finding-false-neg-check.js +140 -0
  20. package/dist/commands/finding-false-neg-check.js.map +1 -0
  21. package/dist/commands/finding-line-blame.d.ts +8 -0
  22. package/dist/commands/finding-line-blame.d.ts.map +1 -0
  23. package/dist/commands/finding-line-blame.js +133 -0
  24. package/dist/commands/finding-line-blame.js.map +1 -0
  25. package/dist/commands/finding-pattern-match.d.ts +5 -0
  26. package/dist/commands/finding-pattern-match.d.ts.map +1 -0
  27. package/dist/commands/finding-pattern-match.js +166 -0
  28. package/dist/commands/finding-pattern-match.js.map +1 -0
  29. package/dist/commands/finding-risk-matrix.d.ts +5 -0
  30. package/dist/commands/finding-risk-matrix.d.ts.map +1 -0
  31. package/dist/commands/finding-risk-matrix.js +127 -0
  32. package/dist/commands/finding-risk-matrix.js.map +1 -0
  33. package/dist/commands/finding-summary-digest.d.ts +8 -0
  34. package/dist/commands/finding-summary-digest.d.ts.map +1 -0
  35. package/dist/commands/finding-summary-digest.js +146 -0
  36. package/dist/commands/finding-summary-digest.js.map +1 -0
  37. package/dist/commands/review-code-owner.d.ts +8 -0
  38. package/dist/commands/review-code-owner.d.ts.map +1 -0
  39. package/dist/commands/review-code-owner.js +165 -0
  40. package/dist/commands/review-code-owner.js.map +1 -0
  41. package/dist/commands/review-dependency-graph.d.ts +5 -0
  42. package/dist/commands/review-dependency-graph.d.ts.map +1 -0
  43. package/dist/commands/review-dependency-graph.js +95 -0
  44. package/dist/commands/review-dependency-graph.js.map +1 -0
  45. package/dist/commands/review-diff-stats.d.ts +5 -0
  46. package/dist/commands/review-diff-stats.d.ts.map +1 -0
  47. package/dist/commands/review-diff-stats.js +91 -0
  48. package/dist/commands/review-diff-stats.js.map +1 -0
  49. package/dist/commands/review-exclude-vendor.d.ts +5 -0
  50. package/dist/commands/review-exclude-vendor.d.ts.map +1 -0
  51. package/dist/commands/review-exclude-vendor.js +159 -0
  52. package/dist/commands/review-exclude-vendor.js.map +1 -0
  53. package/dist/commands/review-export-pdf.d.ts +8 -0
  54. package/dist/commands/review-export-pdf.d.ts.map +1 -0
  55. package/dist/commands/review-export-pdf.js +132 -0
  56. package/dist/commands/review-export-pdf.js.map +1 -0
  57. package/dist/commands/review-file-stats.d.ts +5 -0
  58. package/dist/commands/review-file-stats.d.ts.map +1 -0
  59. package/dist/commands/review-file-stats.js +131 -0
  60. package/dist/commands/review-file-stats.js.map +1 -0
  61. package/dist/commands/review-parallel-files.d.ts +8 -0
  62. package/dist/commands/review-parallel-files.d.ts.map +1 -0
  63. package/dist/commands/review-parallel-files.js +135 -0
  64. package/dist/commands/review-parallel-files.js.map +1 -0
  65. package/dist/commands/review-rule-filter.d.ts +5 -0
  66. package/dist/commands/review-rule-filter.d.ts.map +1 -0
  67. package/dist/commands/review-rule-filter.js +117 -0
  68. package/dist/commands/review-rule-filter.js.map +1 -0
  69. package/dist/commands/review-scope-lock.d.ts +8 -0
  70. package/dist/commands/review-scope-lock.d.ts.map +1 -0
  71. package/dist/commands/review-scope-lock.js +139 -0
  72. package/dist/commands/review-scope-lock.js.map +1 -0
  73. package/dist/commands/review-watch-mode.d.ts +8 -0
  74. package/dist/commands/review-watch-mode.d.ts.map +1 -0
  75. package/dist/commands/review-watch-mode.js +133 -0
  76. package/dist/commands/review-watch-mode.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Review-code-owner — Map findings to CODEOWNERS entries.
3
+ *
4
+ * Cross-references findings with CODEOWNERS file to identify
5
+ * responsible teams/individuals for each finding.
6
+ */
7
+ export declare function runReviewCodeOwner(argv: string[]): void;
8
+ //# sourceMappingURL=review-code-owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-code-owner.d.ts","sourceRoot":"","sources":["../../src/commands/review-code-owner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0HvD"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Review-code-owner — Map findings to CODEOWNERS entries.
3
+ *
4
+ * Cross-references findings with CODEOWNERS file to identify
5
+ * responsible teams/individuals for each finding.
6
+ */
7
+ import { readFileSync, existsSync } from "fs";
8
+ import { join } from "path";
9
+ // ─── Helpers ────────────────────────────────────────────────────────────────
10
+ function parseCodeowners(content) {
11
+ const rules = [];
12
+ for (const line of content.split("\n")) {
13
+ const trimmed = line.trim();
14
+ if (!trimmed || trimmed.startsWith("#"))
15
+ continue;
16
+ const parts = trimmed.split(/\s+/);
17
+ if (parts.length >= 2) {
18
+ rules.push({ pattern: parts[0], owners: parts.slice(1) });
19
+ }
20
+ }
21
+ return rules;
22
+ }
23
+ function findCodeownersFile() {
24
+ const candidates = [
25
+ join(process.cwd(), "CODEOWNERS"),
26
+ join(process.cwd(), ".github", "CODEOWNERS"),
27
+ join(process.cwd(), "docs", "CODEOWNERS"),
28
+ ];
29
+ for (const c of candidates) {
30
+ if (existsSync(c))
31
+ return c;
32
+ }
33
+ return null;
34
+ }
35
+ function matchPattern(filePath, pattern) {
36
+ if (pattern === "*")
37
+ return true;
38
+ if (pattern.endsWith("/"))
39
+ return filePath.startsWith(pattern) || filePath.includes("/" + pattern);
40
+ if (pattern.startsWith("*."))
41
+ return filePath.endsWith(pattern.slice(1));
42
+ if (pattern.includes("*")) {
43
+ const prefix = pattern.split("*")[0];
44
+ return filePath.startsWith(prefix) || filePath.includes(prefix);
45
+ }
46
+ return filePath.includes(pattern);
47
+ }
48
+ function inferFilePath(title) {
49
+ const match = title.match(/in\s+[`']?(\S+\.\w{1,5})[`']?/i);
50
+ return match ? match[1] : "";
51
+ }
52
+ // ─── CLI ────────────────────────────────────────────────────────────────────
53
+ export function runReviewCodeOwner(argv) {
54
+ const verdictIdx = argv.indexOf("--verdict");
55
+ const ownersIdx = argv.indexOf("--owners");
56
+ const formatIdx = argv.indexOf("--format");
57
+ const verdictPath = verdictIdx >= 0 ? argv[verdictIdx + 1] : undefined;
58
+ const ownersPath = ownersIdx >= 0 ? argv[ownersIdx + 1] : findCodeownersFile();
59
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
60
+ if (argv.includes("--help") || argv.includes("-h")) {
61
+ console.log(`
62
+ judges review-code-owner — Map findings to CODEOWNERS
63
+
64
+ Usage:
65
+ judges review-code-owner --verdict <verdict.json> [--owners <CODEOWNERS>]
66
+ [--format table|json]
67
+
68
+ Options:
69
+ --verdict <path> Path to verdict JSON file (required)
70
+ --owners <path> Path to CODEOWNERS file (auto-detected)
71
+ --format <fmt> Output format: table (default), json
72
+ --help, -h Show this help
73
+ `);
74
+ return;
75
+ }
76
+ if (!verdictPath) {
77
+ console.error("Error: --verdict required");
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ if (!existsSync(verdictPath)) {
82
+ console.error(`Error: verdict not found: ${verdictPath}`);
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ if (!ownersPath) {
87
+ console.error("Error: CODEOWNERS file not found. Use --owners to specify.");
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ if (!existsSync(ownersPath)) {
92
+ console.error(`Error: CODEOWNERS not found: ${ownersPath}`);
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ let verdict;
97
+ try {
98
+ verdict = JSON.parse(readFileSync(verdictPath, "utf-8"));
99
+ }
100
+ catch {
101
+ console.error("Error: invalid verdict JSON");
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ const rules = parseCodeowners(readFileSync(ownersPath, "utf-8"));
106
+ const results = [];
107
+ for (const f of verdict.findings) {
108
+ const filePath = inferFilePath(f.title);
109
+ let matched = false;
110
+ // Match against CODEOWNERS rules (last match wins, per GitHub convention)
111
+ for (let i = rules.length - 1; i >= 0; i--) {
112
+ if (filePath && matchPattern(filePath, rules[i].pattern)) {
113
+ results.push({
114
+ ruleId: f.ruleId,
115
+ title: f.title,
116
+ severity: f.severity || "medium",
117
+ owners: rules[i].owners,
118
+ matchedPattern: rules[i].pattern,
119
+ });
120
+ matched = true;
121
+ break;
122
+ }
123
+ }
124
+ if (!matched) {
125
+ // Check for wildcard default owner
126
+ const defaultRule = rules.find((r) => r.pattern === "*");
127
+ results.push({
128
+ ruleId: f.ruleId,
129
+ title: f.title,
130
+ severity: f.severity || "medium",
131
+ owners: defaultRule ? defaultRule.owners : ["unassigned"],
132
+ matchedPattern: defaultRule ? "*" : "none",
133
+ });
134
+ }
135
+ }
136
+ if (format === "json") {
137
+ console.log(JSON.stringify(results, null, 2));
138
+ return;
139
+ }
140
+ console.log(`\nFinding Ownership (${results.length} findings)`);
141
+ console.log("═".repeat(70));
142
+ console.log(`${"Owner(s)".padEnd(25)} ${"Severity".padEnd(10)} Title`);
143
+ console.log("─".repeat(70));
144
+ for (const r of results) {
145
+ const owners = r.owners.join(", ");
146
+ const ownerStr = owners.length > 23 ? owners.slice(0, 23) + "…" : owners;
147
+ const sev = (r.severity || "medium").padEnd(10);
148
+ const title = r.title.length > 30 ? r.title.slice(0, 30) + "…" : r.title;
149
+ console.log(`${ownerStr.padEnd(25)} ${sev} ${title}`);
150
+ }
151
+ // Owner summary
152
+ const ownerCounts = new Map();
153
+ for (const r of results) {
154
+ for (const o of r.owners) {
155
+ ownerCounts.set(o, (ownerCounts.get(o) || 0) + 1);
156
+ }
157
+ }
158
+ console.log("\n" + "─".repeat(70));
159
+ console.log("Owner Summary:");
160
+ for (const [owner, count] of [...ownerCounts.entries()].sort((a, b) => b[1] - a[1])) {
161
+ console.log(` ${owner}: ${count} finding(s)`);
162
+ }
163
+ console.log("═".repeat(70));
164
+ }
165
+ //# sourceMappingURL=review-code-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-code-owner.js","sourceRoot":"","sources":["../../src/commands/review-code-owner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAkB5B,+EAA+E;AAE/E,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC;KAC1C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,OAAe;IACrD,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;IACnG,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,UAAU,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC/E,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;CAYf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,0EAA0E;QAC1E,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC;oBACX,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ;oBAChC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;oBACvB,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;iBACjC,CAAC,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,mCAAmC;YACnC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ;gBAChC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gBACzD,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,gBAAgB;IAChB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,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;QACpF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,aAAa,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-dependency-graph — Visualize finding dependency relationships.
3
+ */
4
+ export declare function runReviewDependencyGraph(argv: string[]): void;
5
+ //# sourceMappingURL=review-dependency-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-dependency-graph.d.ts","sourceRoot":"","sources":["../../src/commands/review-dependency-graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqG7D"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Review-dependency-graph — Visualize finding dependency relationships.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewDependencyGraph(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
8
+ console.log(`
9
+ judges review-dependency-graph — Visualize finding relationships
10
+
11
+ Usage:
12
+ judges review-dependency-graph --file <results.json> [options]
13
+
14
+ Options:
15
+ --file <path> Result file (required)
16
+ --depth <n> Relationship depth to explore (default: 2)
17
+ --format json JSON output
18
+ --help, -h Show this help
19
+
20
+ Analyzes findings for dependency relationships based on rule prefixes and categories.
21
+ `);
22
+ return;
23
+ }
24
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
25
+ if (!file) {
26
+ console.error("Error: --file required");
27
+ process.exitCode = 1;
28
+ return;
29
+ }
30
+ if (!existsSync(file)) {
31
+ console.error(`Error: file not found: ${file}`);
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
36
+ let verdict;
37
+ try {
38
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
39
+ }
40
+ catch {
41
+ console.error("Error: could not parse file");
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ const findings = verdict.findings || [];
46
+ // Group by rule prefix to find relationships
47
+ const prefixGroups = new Map();
48
+ for (const f of findings) {
49
+ const prefix = f.ruleId ? f.ruleId.split("-")[0] : "OTHER";
50
+ if (!prefixGroups.has(prefix))
51
+ prefixGroups.set(prefix, []);
52
+ prefixGroups.get(prefix).push(f.ruleId);
53
+ }
54
+ // Build edges: findings sharing line numbers are related
55
+ const edges = [];
56
+ for (let i = 0; i < findings.length; i++) {
57
+ for (let j = i + 1; j < findings.length; j++) {
58
+ const a = findings[i];
59
+ const b = findings[j];
60
+ const aLines = a.lineNumbers || [];
61
+ const bLines = b.lineNumbers || [];
62
+ const overlap = aLines.filter((l) => bLines.includes(l));
63
+ if (overlap.length > 0) {
64
+ edges.push({ from: a.ruleId, to: b.ruleId, relationship: `shared lines: ${overlap.join(",")}` });
65
+ }
66
+ }
67
+ }
68
+ if (format === "json") {
69
+ console.log(JSON.stringify({
70
+ nodes: findings.length,
71
+ groups: [...prefixGroups.entries()].map(([prefix, rules]) => ({ prefix, count: rules.length })),
72
+ edges,
73
+ }, null, 2));
74
+ return;
75
+ }
76
+ console.log(`\nDependency Graph:`);
77
+ console.log("═".repeat(60));
78
+ console.log(` ${findings.length} findings, ${prefixGroups.size} groups, ${edges.length} relationships`);
79
+ console.log("─".repeat(60));
80
+ console.log("\n Groups:");
81
+ for (const [prefix, rules] of [...prefixGroups.entries()].sort((a, b) => b[1].length - a[1].length)) {
82
+ const unique = [...new Set(rules)];
83
+ console.log(` ${prefix.padEnd(12)} ${unique.length} rules (${rules.length} findings)`);
84
+ }
85
+ if (edges.length > 0) {
86
+ console.log("\n Relationships:");
87
+ for (const e of edges.slice(0, 15)) {
88
+ console.log(` ${e.from} ↔ ${e.to} (${e.relationship})`);
89
+ }
90
+ if (edges.length > 15)
91
+ console.log(` ... and ${edges.length - 15} more`);
92
+ }
93
+ console.log("═".repeat(60));
94
+ }
95
+ //# sourceMappingURL=review-dependency-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-dependency-graph.js","sourceRoot":"","sources":["../../src/commands/review-dependency-graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAE9C,+EAA+E;AAE/E,MAAM,UAAU,wBAAwB,CAAC,IAAc;IACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;CAaf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,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;IAE1F,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAExC,6CAA6C;IAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5D,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,yDAAyD;IACzD,MAAM,KAAK,GAAyD,EAAE,CAAC;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,iBAAiB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/F,KAAK;SACN,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,cAAc,YAAY,CAAC,IAAI,YAAY,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACpG,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-diff-stats — Statistics about diff/change metrics for reviews.
3
+ */
4
+ export declare function runReviewDiffStats(argv: string[]): void;
5
+ //# sourceMappingURL=review-diff-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-diff-stats.d.ts","sourceRoot":"","sources":["../../src/commands/review-diff-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwGvD"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Review-diff-stats — Statistics about diff/change metrics for reviews.
3
+ */
4
+ import { execSync } from "child_process";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewDiffStats(argv) {
7
+ if (argv.includes("--help") || argv.includes("-h") || argv.length === 0) {
8
+ console.log(`
9
+ judges review-diff-stats — Diff and change statistics
10
+
11
+ Usage:
12
+ judges review-diff-stats --since <ref> [options]
13
+ judges review-diff-stats --compare <ref1>..<ref2> [options]
14
+
15
+ Options:
16
+ --since <ref> Git ref to compare against (e.g., HEAD~5, main)
17
+ --compare <range> Git range (e.g., main..feature)
18
+ --extensions <ext> Filter by extensions (default: all)
19
+ --format json JSON output
20
+ --help, -h Show this help
21
+
22
+ Shows statistics about code changes including lines added/removed per file.
23
+ `);
24
+ return;
25
+ }
26
+ const since = argv.find((_a, i) => argv[i - 1] === "--since");
27
+ const compare = argv.find((_a, i) => argv[i - 1] === "--compare");
28
+ const extsStr = argv.find((_a, i) => argv[i - 1] === "--extensions");
29
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
30
+ const ref = compare || (since ? `${since}..HEAD` : null);
31
+ if (!ref) {
32
+ console.error("Error: --since or --compare required");
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ // Check we're in a git repo
37
+ try {
38
+ execSync("git rev-parse --git-dir", { encoding: "utf-8" });
39
+ }
40
+ catch {
41
+ console.error("Error: not in a git repository");
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ const stats = [];
46
+ try {
47
+ const output = execSync(`git diff --numstat ${ref}`, { encoding: "utf-8" });
48
+ const extensions = extsStr ? extsStr.split(",").map((e) => e.trim()) : null;
49
+ for (const line of output.split("\n").filter(Boolean)) {
50
+ const parts = line.split("\t");
51
+ if (parts.length < 3)
52
+ continue;
53
+ const added = parts[0] === "-" ? 0 : parseInt(parts[0], 10);
54
+ const removed = parts[1] === "-" ? 0 : parseInt(parts[1], 10);
55
+ const file = parts[2];
56
+ if (extensions) {
57
+ const ext = "." + file.split(".").pop();
58
+ if (!extensions.includes(ext))
59
+ continue;
60
+ }
61
+ stats.push({ file, added, removed, total: added + removed });
62
+ }
63
+ }
64
+ catch (err) {
65
+ console.error(`Error running git diff: ${err}`);
66
+ process.exitCode = 1;
67
+ return;
68
+ }
69
+ stats.sort((a, b) => b.total - a.total);
70
+ const totalAdded = stats.reduce((s, f) => s + f.added, 0);
71
+ const totalRemoved = stats.reduce((s, f) => s + f.removed, 0);
72
+ if (format === "json") {
73
+ console.log(JSON.stringify({ ref, files: stats.length, totalAdded, totalRemoved, totalChanged: totalAdded + totalRemoved, stats }, null, 2));
74
+ return;
75
+ }
76
+ console.log(`\nDiff Statistics (${ref}):`);
77
+ console.log("═".repeat(70));
78
+ console.log(` Files changed: ${stats.length}`);
79
+ console.log(` Lines added: +${totalAdded}`);
80
+ console.log(` Lines removed: -${totalRemoved}`);
81
+ console.log(` Net change: ${totalAdded - totalRemoved > 0 ? "+" : ""}${totalAdded - totalRemoved}`);
82
+ console.log("─".repeat(70));
83
+ for (const s of stats.slice(0, 20)) {
84
+ const bar = "+".repeat(Math.min(s.added, 20)) + "-".repeat(Math.min(s.removed, 20));
85
+ console.log(` ${s.file.padEnd(40)} +${String(s.added).padStart(4)} -${String(s.removed).padStart(4)} ${bar}`);
86
+ }
87
+ if (stats.length > 20)
88
+ console.log(` ... and ${stats.length - 20} more files`);
89
+ console.log("═".repeat(70));
90
+ }
91
+ //# sourceMappingURL=review-diff-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-diff-stats.js","sourceRoot":"","sources":["../../src/commands/review-diff-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-exclude-vendor — Exclude vendor/third-party code from reviews.
3
+ */
4
+ export declare function runReviewExcludeVendor(argv: string[]): void;
5
+ //# sourceMappingURL=review-exclude-vendor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-exclude-vendor.d.ts","sourceRoot":"","sources":["../../src/commands/review-exclude-vendor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqDH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgH3D"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Review-exclude-vendor — Exclude vendor/third-party code from reviews.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname, join } from "path";
6
+ // ─── Helpers ────────────────────────────────────────────────────────────────
7
+ function exclusionFile() {
8
+ return join(process.cwd(), ".judges", "vendor-exclusions.json");
9
+ }
10
+ function loadExclusions() {
11
+ const f = exclusionFile();
12
+ if (!existsSync(f))
13
+ return [];
14
+ try {
15
+ return JSON.parse(readFileSync(f, "utf-8"));
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ }
21
+ function saveExclusions(exclusions) {
22
+ const f = exclusionFile();
23
+ const d = dirname(f);
24
+ if (!existsSync(d))
25
+ mkdirSync(d, { recursive: true });
26
+ writeFileSync(f, JSON.stringify(exclusions, null, 2));
27
+ }
28
+ const DEFAULT_VENDOR_PATTERNS = [
29
+ "node_modules/**",
30
+ "vendor/**",
31
+ "third_party/**",
32
+ "bower_components/**",
33
+ "dist/**",
34
+ "build/**",
35
+ "*.min.js",
36
+ "*.min.css",
37
+ "*.bundle.js",
38
+ "**/*.lock",
39
+ "**/package-lock.json",
40
+ "**/yarn.lock",
41
+ ];
42
+ // ─── CLI ────────────────────────────────────────────────────────────────────
43
+ export function runReviewExcludeVendor(argv) {
44
+ const sub = argv[0];
45
+ if (!sub || sub === "--help" || sub === "-h") {
46
+ console.log(`
47
+ judges review-exclude-vendor — Exclude vendor/third-party code
48
+
49
+ Usage:
50
+ judges review-exclude-vendor list
51
+ judges review-exclude-vendor add --pattern <glob> [--reason <text>]
52
+ judges review-exclude-vendor remove --pattern <glob>
53
+ judges review-exclude-vendor init (add default vendor patterns)
54
+ judges review-exclude-vendor test --file <path>
55
+ judges review-exclude-vendor clear
56
+
57
+ Options:
58
+ --pattern <glob> Glob pattern to exclude
59
+ --reason <text> Reason for exclusion
60
+ --file <path> Test if a file matches exclusions
61
+ --help, -h Show this help
62
+ `);
63
+ return;
64
+ }
65
+ const args = argv.slice(1);
66
+ const exclusions = loadExclusions();
67
+ if (sub === "list") {
68
+ if (exclusions.length === 0) {
69
+ console.log("No vendor exclusions configured. Run 'init' to add defaults.");
70
+ return;
71
+ }
72
+ console.log(`\nVendor Exclusions (${exclusions.length}):`);
73
+ console.log("═".repeat(60));
74
+ for (const e of exclusions) {
75
+ const reason = e.reason ? ` (${e.reason})` : "";
76
+ console.log(` ${e.pattern}${reason}`);
77
+ }
78
+ console.log("═".repeat(60));
79
+ }
80
+ else if (sub === "add") {
81
+ const pattern = args.find((_a, i) => args[i - 1] === "--pattern");
82
+ if (!pattern) {
83
+ console.error("Error: --pattern required");
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ if (exclusions.some((e) => e.pattern === pattern)) {
88
+ console.log(`Pattern already exists: ${pattern}`);
89
+ return;
90
+ }
91
+ const reason = args.find((_a, i) => args[i - 1] === "--reason") || "";
92
+ exclusions.push({ pattern, reason, addedAt: new Date().toISOString() });
93
+ saveExclusions(exclusions);
94
+ console.log(`Added exclusion: ${pattern}`);
95
+ }
96
+ else if (sub === "remove") {
97
+ const pattern = args.find((_a, i) => args[i - 1] === "--pattern");
98
+ if (!pattern) {
99
+ console.error("Error: --pattern required");
100
+ process.exitCode = 1;
101
+ return;
102
+ }
103
+ const filtered = exclusions.filter((e) => e.pattern !== pattern);
104
+ if (filtered.length === exclusions.length) {
105
+ console.error(`Pattern not found: ${pattern}`);
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ saveExclusions(filtered);
110
+ console.log(`Removed exclusion: ${pattern}`);
111
+ }
112
+ else if (sub === "init") {
113
+ const existing = new Set(exclusions.map((e) => e.pattern));
114
+ let added = 0;
115
+ for (const p of DEFAULT_VENDOR_PATTERNS) {
116
+ if (!existing.has(p)) {
117
+ exclusions.push({ pattern: p, reason: "default vendor pattern", addedAt: new Date().toISOString() });
118
+ added++;
119
+ }
120
+ }
121
+ saveExclusions(exclusions);
122
+ console.log(`Initialized: ${added} default patterns added (${exclusions.length} total)`);
123
+ }
124
+ else if (sub === "test") {
125
+ const filePath = args.find((_a, i) => args[i - 1] === "--file");
126
+ if (!filePath) {
127
+ console.error("Error: --file required");
128
+ process.exitCode = 1;
129
+ return;
130
+ }
131
+ const matched = exclusions.filter((e) => {
132
+ if (e.pattern.includes("**")) {
133
+ const prefix = e.pattern.split("**")[0];
134
+ return filePath.startsWith(prefix);
135
+ }
136
+ if (e.pattern.startsWith("*.")) {
137
+ return filePath.endsWith(e.pattern.slice(1));
138
+ }
139
+ return filePath.includes(e.pattern.replace(/\*/g, ""));
140
+ });
141
+ if (matched.length > 0) {
142
+ console.log(`Excluded: ${filePath} matches ${matched.length} pattern(s):`);
143
+ for (const m of matched)
144
+ console.log(` - ${m.pattern}`);
145
+ }
146
+ else {
147
+ console.log(`Not excluded: ${filePath}`);
148
+ }
149
+ }
150
+ else if (sub === "clear") {
151
+ saveExclusions([]);
152
+ console.log("All vendor exclusions cleared.");
153
+ }
154
+ else {
155
+ console.error(`Unknown subcommand: ${sub}. Use --help for usage.`);
156
+ process.exitCode = 1;
157
+ }
158
+ }
159
+ //# sourceMappingURL=review-exclude-vendor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-exclude-vendor.js","sourceRoot":"","sources":["../../src/commands/review-exclude-vendor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Review-export-pdf — Export review results to PDF-ready markdown.
3
+ *
4
+ * Generates a structured markdown document suitable for PDF conversion
5
+ * via external tools (pandoc, md-to-pdf, etc.).
6
+ */
7
+ export declare function runReviewExportPdf(argv: string[]): void;
8
+ //# sourceMappingURL=review-export-pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-export-pdf.d.ts","sourceRoot":"","sources":["../../src/commands/review-export-pdf.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmFH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2DvD"}