@kevinrabun/judges 3.52.0 → 3.53.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 (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/code-similarity.d.ts +9 -0
  6. package/dist/commands/code-similarity.d.ts.map +1 -0
  7. package/dist/commands/code-similarity.js +232 -0
  8. package/dist/commands/code-similarity.js.map +1 -0
  9. package/dist/commands/compliance-weight.d.ts +9 -0
  10. package/dist/commands/compliance-weight.d.ts.map +1 -0
  11. package/dist/commands/compliance-weight.js +273 -0
  12. package/dist/commands/compliance-weight.js.map +1 -0
  13. package/dist/commands/cross-pr-regression.d.ts +9 -0
  14. package/dist/commands/cross-pr-regression.d.ts.map +1 -0
  15. package/dist/commands/cross-pr-regression.js +298 -0
  16. package/dist/commands/cross-pr-regression.js.map +1 -0
  17. package/dist/commands/doc-drift.d.ts +9 -0
  18. package/dist/commands/doc-drift.d.ts.map +1 -0
  19. package/dist/commands/doc-drift.js +259 -0
  20. package/dist/commands/doc-drift.js.map +1 -0
  21. package/dist/commands/exception-consistency.d.ts +7 -0
  22. package/dist/commands/exception-consistency.d.ts.map +1 -0
  23. package/dist/commands/exception-consistency.js +193 -0
  24. package/dist/commands/exception-consistency.js.map +1 -0
  25. package/dist/commands/refactor-safety.d.ts +9 -0
  26. package/dist/commands/refactor-safety.d.ts.map +1 -0
  27. package/dist/commands/refactor-safety.js +274 -0
  28. package/dist/commands/refactor-safety.js.map +1 -0
  29. package/dist/commands/resource-cleanup.d.ts +7 -0
  30. package/dist/commands/resource-cleanup.d.ts.map +1 -0
  31. package/dist/commands/resource-cleanup.js +236 -0
  32. package/dist/commands/resource-cleanup.js.map +1 -0
  33. package/dist/commands/team-trust.d.ts +8 -0
  34. package/dist/commands/team-trust.d.ts.map +1 -0
  35. package/dist/commands/team-trust.js +175 -0
  36. package/dist/commands/team-trust.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Code similarity — compare code against internal implementations
3
+ * to detect when AI generates near-identical copies of known
4
+ * problematic patterns or unsafe implementations.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync, readdirSync } from "fs";
9
+ import { join, extname, relative } from "path";
10
+ // ─── Analysis ───────────────────────────────────────────────────────────────
11
+ function normalizeLines(content) {
12
+ return content
13
+ .split("\n")
14
+ .map((l) => l.trim())
15
+ .filter((l) => l.length > 0 &&
16
+ !l.startsWith("//") &&
17
+ !l.startsWith("*") &&
18
+ !l.startsWith("/*") &&
19
+ l !== "{" &&
20
+ l !== "}" &&
21
+ l !== "");
22
+ }
23
+ function computeSimilarity(linesA, linesB) {
24
+ const setA = new Set(linesA);
25
+ const setB = new Set(linesB);
26
+ let shared = 0;
27
+ const sharedBlocks = [];
28
+ for (const line of setA) {
29
+ if (setB.has(line) && line.length > 10) {
30
+ shared++;
31
+ if (sharedBlocks.length < 5)
32
+ sharedBlocks.push(line.slice(0, 80));
33
+ }
34
+ }
35
+ const total = Math.max(setA.size, setB.size);
36
+ const similarity = total > 0 ? Math.round((shared / total) * 100) : 0;
37
+ return { similarity, sharedLines: shared, sharedBlocks };
38
+ }
39
+ // n-gram structural similarity
40
+ function computeStructuralSimilarity(linesA, linesB, n = 3) {
41
+ if (linesA.length < n || linesB.length < n)
42
+ return 0;
43
+ const ngramsA = new Set();
44
+ for (let i = 0; i <= linesA.length - n; i++) {
45
+ ngramsA.add(linesA.slice(i, i + n).join("\n"));
46
+ }
47
+ const ngramsB = new Set();
48
+ for (let i = 0; i <= linesB.length - n; i++) {
49
+ ngramsB.add(linesB.slice(i, i + n).join("\n"));
50
+ }
51
+ let overlap = 0;
52
+ for (const ng of ngramsA) {
53
+ if (ngramsB.has(ng))
54
+ overlap++;
55
+ }
56
+ const total = Math.max(ngramsA.size, ngramsB.size);
57
+ return total > 0 ? Math.round((overlap / total) * 100) : 0;
58
+ }
59
+ // ─── Scanner ────────────────────────────────────────────────────────────────
60
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
61
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
62
+ function collectFiles(dir) {
63
+ const result = [];
64
+ function walk(d) {
65
+ let entries;
66
+ try {
67
+ entries = readdirSync(d);
68
+ }
69
+ catch {
70
+ return;
71
+ }
72
+ for (const name of entries) {
73
+ if (SKIP.has(name) || name.startsWith("."))
74
+ continue;
75
+ const full = join(d, name);
76
+ try {
77
+ const sub = readdirSync(full);
78
+ void sub;
79
+ walk(full);
80
+ }
81
+ catch {
82
+ if (EXTS.has(extname(name).toLowerCase()))
83
+ result.push(full);
84
+ }
85
+ }
86
+ }
87
+ walk(dir);
88
+ return result;
89
+ }
90
+ // ─── CLI ────────────────────────────────────────────────────────────────────
91
+ export function runCodeSimilarity(argv) {
92
+ if (argv.includes("--help") || argv.includes("-h")) {
93
+ console.log(`
94
+ judges code-similarity — Detect similar/duplicate code across files
95
+
96
+ Usage:
97
+ judges code-similarity <dir>
98
+ judges code-similarity src/ --threshold 60
99
+ judges code-similarity --compare fileA.ts fileB.ts
100
+
101
+ Options:
102
+ --threshold <n> Minimum similarity % to report (default: 50)
103
+ --compare <a> <b> Compare two specific files
104
+ --max-pairs <n> Maximum pairs to report (default: 20)
105
+ --format json JSON output
106
+ --help, -h Show this help
107
+
108
+ Algorithm:
109
+ • Line-level deduplication (normalized, comments stripped)
110
+ • N-gram structural similarity (3-line blocks)
111
+ • Combined score with shared block identification
112
+ `);
113
+ return;
114
+ }
115
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
116
+ const threshold = parseInt(argv.find((_a, i) => argv[i - 1] === "--threshold") || "50");
117
+ const maxPairs = parseInt(argv.find((_a, i) => argv[i - 1] === "--max-pairs") || "20");
118
+ const isCompare = argv.includes("--compare");
119
+ if (isCompare) {
120
+ const compareIdx = argv.indexOf("--compare");
121
+ const fileA = argv[compareIdx + 1];
122
+ const fileB = argv[compareIdx + 2];
123
+ if (!fileA || !fileB) {
124
+ console.error(" --compare requires two file paths");
125
+ return;
126
+ }
127
+ if (!existsSync(fileA) || !existsSync(fileB)) {
128
+ console.error(" One or both files not found");
129
+ return;
130
+ }
131
+ const linesA = normalizeLines(readFileSync(fileA, "utf-8"));
132
+ const linesB = normalizeLines(readFileSync(fileB, "utf-8"));
133
+ const { similarity, sharedLines, sharedBlocks } = computeSimilarity(linesA, linesB);
134
+ const structural = computeStructuralSimilarity(linesA, linesB);
135
+ const combined = Math.round((similarity + structural) / 2);
136
+ if (format === "json") {
137
+ console.log(JSON.stringify({
138
+ fileA,
139
+ fileB,
140
+ lineSimilarity: similarity,
141
+ structuralSimilarity: structural,
142
+ combined,
143
+ sharedLines,
144
+ sharedBlocks,
145
+ }, null, 2));
146
+ }
147
+ else {
148
+ const icon = combined >= 80 ? "🔴" : combined >= 50 ? "🟡" : "🟢";
149
+ console.log(`\n ${icon} Similarity: ${combined}%`);
150
+ console.log(` Line-level: ${similarity}% | Structural: ${structural}%`);
151
+ console.log(` Shared lines: ${sharedLines} / ${Math.max(linesA.length, linesB.length)}`);
152
+ if (sharedBlocks.length > 0) {
153
+ console.log(` Shared blocks:`);
154
+ for (const b of sharedBlocks)
155
+ console.log(` ${b}`);
156
+ }
157
+ console.log("");
158
+ }
159
+ return;
160
+ }
161
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
162
+ if (!existsSync(target)) {
163
+ console.error(` Path not found: ${target}`);
164
+ return;
165
+ }
166
+ const files = collectFiles(target);
167
+ if (files.length < 2) {
168
+ console.log(" Need at least 2 files to compare.");
169
+ return;
170
+ }
171
+ // Pre-compute normalized lines
172
+ const fileLines = new Map();
173
+ for (const f of files) {
174
+ try {
175
+ fileLines.set(f, normalizeLines(readFileSync(f, "utf-8")));
176
+ }
177
+ catch {
178
+ /* skip */
179
+ }
180
+ }
181
+ const pairs = [];
182
+ const fileList = Array.from(fileLines.keys());
183
+ // Compare pairs (limit to avoid O(n^2) on large codebases)
184
+ const maxFiles = Math.min(fileList.length, 100);
185
+ for (let i = 0; i < maxFiles; i++) {
186
+ for (let j = i + 1; j < maxFiles; j++) {
187
+ const lA = fileLines.get(fileList[i]);
188
+ const lB = fileLines.get(fileList[j]);
189
+ if (!lA || !lB || lA.length < 5 || lB.length < 5)
190
+ continue;
191
+ const { similarity, sharedLines, sharedBlocks } = computeSimilarity(lA, lB);
192
+ if (similarity >= threshold) {
193
+ const structural = computeStructuralSimilarity(lA, lB);
194
+ const combined = Math.round((similarity + structural) / 2);
195
+ if (combined >= threshold) {
196
+ pairs.push({
197
+ fileA: relative(target, fileList[i]) || fileList[i],
198
+ fileB: relative(target, fileList[j]) || fileList[j],
199
+ similarity: combined,
200
+ sharedLines,
201
+ totalLines: Math.max(lA.length, lB.length),
202
+ sharedBlocks,
203
+ });
204
+ }
205
+ }
206
+ }
207
+ }
208
+ pairs.sort((a, b) => b.similarity - a.similarity);
209
+ const shown = pairs.slice(0, maxPairs);
210
+ if (format === "json") {
211
+ console.log(JSON.stringify({ pairs: shown, scannedFiles: files.length, totalPairs: pairs.length, timestamp: new Date().toISOString() }, null, 2));
212
+ }
213
+ else {
214
+ console.log(`\n Code Similarity — ${files.length} files, ${pairs.length} pairs above ${threshold}%\n ──────────────────────────`);
215
+ if (shown.length === 0) {
216
+ console.log(` ✅ No high-similarity pairs found\n`);
217
+ return;
218
+ }
219
+ for (const p of shown) {
220
+ const icon = p.similarity >= 80 ? "🔴" : p.similarity >= 60 ? "🟠" : "🟡";
221
+ console.log(`\n ${icon} ${p.similarity}% — ${p.fileA} ↔ ${p.fileB}`);
222
+ console.log(` Shared: ${p.sharedLines}/${p.totalLines} lines`);
223
+ if (p.sharedBlocks.length > 0) {
224
+ console.log(` Examples: ${p.sharedBlocks.slice(0, 2).join(" | ")}`);
225
+ }
226
+ }
227
+ if (pairs.length > maxPairs)
228
+ console.log(`\n ... and ${pairs.length - maxPairs} more pairs`);
229
+ console.log("");
230
+ }
231
+ }
232
+ //# sourceMappingURL=code-similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-similarity.js","sourceRoot":"","sources":["../../src/commands/code-similarity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAa/C,+EAA+E;AAE/E,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO;SACX,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QACnB,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAClB,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QACnB,CAAC,KAAK,GAAG;QACT,CAAC,KAAK,GAAG;QACT,CAAC,KAAK,EAAE,CACX,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAgB,EAChB,MAAgB;IAEhB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAE7B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,EAAE,CAAC;YACT,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC3D,CAAC;AAED,+BAA+B;AAC/B,SAAS,2BAA2B,CAAC,MAAgB,EAAE,MAAgB,EAAE,IAAY,CAAC;IACpF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,+EAA+E;AAE/E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAC5E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAEzF,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,SAAS,IAAI,CAAC,CAAS;QACrB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,CAAC,CAAwB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,KAAK,GAAG,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBf,CAAC,CAAC;QACC,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;IAC1F,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC;IACxG,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC;IACvG,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpF,MAAM,UAAU,GAAG,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;gBACE,KAAK;gBACL,KAAK;gBACL,cAAc,EAAE,UAAU;gBAC1B,oBAAoB,EAAE,UAAU;gBAChC,QAAQ;gBACR,WAAW;gBACX,YAAY;aACb,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,gBAAgB,QAAQ,GAAG,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,mBAAmB,UAAU,GAAG,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,yBAAyB,WAAW,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChG,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBACtC,KAAK,MAAM,CAAC,IAAI,YAAY;oBAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;IACpH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,+BAA+B;IAC/B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9C,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAE3D,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5E,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gBAC5B,MAAM,UAAU,GAAG,2BAA2B,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3D,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC;wBACT,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;wBACnD,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;wBACnD,UAAU,EAAE,QAAQ;wBACpB,WAAW;wBACX,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC;wBAC1C,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEvC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAC3G,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,yBAAyB,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,gBAAgB,SAAS,iCAAiC,CACvH,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,UAAU,QAAQ,CAAC,CAAC;YACtE,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,GAAG,QAAQ,aAAa,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Compliance weight — dynamically adjust finding severity based on
3
+ * active compliance frameworks (PCI-DSS, HIPAA, GDPR, SOC2, ISO27001).
4
+ *
5
+ * Takes a judges report (JSON) and re-weights findings according to
6
+ * the specified framework(s). Stored config in `.judgesrc` or CLI flags.
7
+ */
8
+ export declare function runComplianceWeight(argv: string[]): void;
9
+ //# sourceMappingURL=compliance-weight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-weight.d.ts","sourceRoot":"","sources":["../../src/commands/compliance-weight.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkMH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6HxD"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Compliance weight — dynamically adjust finding severity based on
3
+ * active compliance frameworks (PCI-DSS, HIPAA, GDPR, SOC2, ISO27001).
4
+ *
5
+ * Takes a judges report (JSON) and re-weights findings according to
6
+ * the specified framework(s). Stored config in `.judgesrc` or CLI flags.
7
+ */
8
+ // ─── Framework Definitions ──────────────────────────────────────────────────
9
+ const FRAMEWORK_RULES = [
10
+ // PCI-DSS
11
+ { pattern: /sql.?inject|injection/i, weight: 3.0, frameworks: ["PCI-DSS"], note: "PCI-DSS 6.5.1: Injection flaws" },
12
+ {
13
+ pattern: /xss|cross.?site.?script/i,
14
+ weight: 2.5,
15
+ frameworks: ["PCI-DSS"],
16
+ note: "PCI-DSS 6.5.7: Cross-site scripting",
17
+ },
18
+ {
19
+ pattern: /hardcoded.?(secret|password|key|credential|token)/i,
20
+ weight: 3.0,
21
+ frameworks: ["PCI-DSS"],
22
+ note: "PCI-DSS 3.4: Render PAN unreadable",
23
+ },
24
+ {
25
+ pattern: /crypto|encrypt|hash|cipher/i,
26
+ weight: 2.0,
27
+ frameworks: ["PCI-DSS"],
28
+ note: "PCI-DSS 4.1: Strong cryptography",
29
+ },
30
+ {
31
+ pattern: /auth|session|login|password/i,
32
+ weight: 2.0,
33
+ frameworks: ["PCI-DSS"],
34
+ note: "PCI-DSS 8.x: Authentication controls",
35
+ },
36
+ // HIPAA
37
+ {
38
+ pattern: /pii|personal.?data|patient|health|phi|protected.?health/i,
39
+ weight: 3.0,
40
+ frameworks: ["HIPAA"],
41
+ note: "HIPAA §164.312: ePHI protection",
42
+ },
43
+ {
44
+ pattern: /encrypt|crypto|tls|ssl/i,
45
+ weight: 2.5,
46
+ frameworks: ["HIPAA"],
47
+ note: "HIPAA §164.312(a)(2)(iv): Encryption",
48
+ },
49
+ { pattern: /log|audit|monitor/i, weight: 2.0, frameworks: ["HIPAA"], note: "HIPAA §164.312(b): Audit controls" },
50
+ {
51
+ pattern: /access.?control|rbac|authorization/i,
52
+ weight: 2.5,
53
+ frameworks: ["HIPAA"],
54
+ note: "HIPAA §164.312(a)(1): Access control",
55
+ },
56
+ // GDPR
57
+ {
58
+ pattern: /pii|personal.?data|consent|data.?subject/i,
59
+ weight: 3.0,
60
+ frameworks: ["GDPR"],
61
+ note: "GDPR Art. 5: Data processing principles",
62
+ },
63
+ {
64
+ pattern: /data.?retention|delete|erase|forget/i,
65
+ weight: 2.5,
66
+ frameworks: ["GDPR"],
67
+ note: "GDPR Art. 17: Right to erasure",
68
+ },
69
+ {
70
+ pattern: /encrypt|pseudonym|anonymi/i,
71
+ weight: 2.0,
72
+ frameworks: ["GDPR"],
73
+ note: "GDPR Art. 32: Security of processing",
74
+ },
75
+ {
76
+ pattern: /third.?party|vendor|external.?api/i,
77
+ weight: 2.0,
78
+ frameworks: ["GDPR"],
79
+ note: "GDPR Art. 28: Processor obligations",
80
+ },
81
+ // SOC2
82
+ { pattern: /log|audit|monitor|alert/i, weight: 2.0, frameworks: ["SOC2"], note: "SOC2 CC7.x: System monitoring" },
83
+ { pattern: /access.?control|auth|rbac/i, weight: 2.5, frameworks: ["SOC2"], note: "SOC2 CC6.x: Logical access" },
84
+ {
85
+ pattern: /encrypt|crypto|tls/i,
86
+ weight: 2.0,
87
+ frameworks: ["SOC2"],
88
+ note: "SOC2 CC6.7: Encryption in transit/at rest",
89
+ },
90
+ {
91
+ pattern: /error.?handling|exception|catch/i,
92
+ weight: 1.5,
93
+ frameworks: ["SOC2"],
94
+ note: "SOC2 CC7.4: Error handling",
95
+ },
96
+ // ISO 27001
97
+ {
98
+ pattern: /access.?control|auth|rbac/i,
99
+ weight: 2.5,
100
+ frameworks: ["ISO27001"],
101
+ note: "ISO27001 A.9: Access control",
102
+ },
103
+ {
104
+ pattern: /crypto|encrypt|hash|key.?manage/i,
105
+ weight: 2.5,
106
+ frameworks: ["ISO27001"],
107
+ note: "ISO27001 A.10: Cryptography",
108
+ },
109
+ { pattern: /backup|recovery|disaster/i, weight: 2.0, frameworks: ["ISO27001"], note: "ISO27001 A.12.3: Backup" },
110
+ {
111
+ pattern: /log|audit|monitor/i,
112
+ weight: 2.0,
113
+ frameworks: ["ISO27001"],
114
+ note: "ISO27001 A.12.4: Logging and monitoring",
115
+ },
116
+ ];
117
+ const SEVERITY_LEVELS = { info: 1, low: 2, medium: 3, high: 4, critical: 5 };
118
+ const SEVERITY_NAMES = ["info", "low", "medium", "high", "critical"];
119
+ function numericSeverity(sev) {
120
+ return SEVERITY_LEVELS[sev.toLowerCase()] || 2;
121
+ }
122
+ function severityFromScore(score) {
123
+ const clamped = Math.min(5, Math.max(1, Math.round(score)));
124
+ return SEVERITY_NAMES[clamped - 1];
125
+ }
126
+ // ─── Re-weighting ───────────────────────────────────────────────────────────
127
+ function reweightFindings(findings, activeFrameworks) {
128
+ const active = new Set(activeFrameworks.map((f) => f.toUpperCase()));
129
+ return findings.map((f) => {
130
+ const text = [f.ruleId || "", f.title || "", f.description || ""].join(" ");
131
+ const originalSev = (f.severity || "medium").toLowerCase();
132
+ const baseSeverity = numericSeverity(originalSev);
133
+ let maxWeight = 1.0;
134
+ const matchedFrameworks = [];
135
+ const notes = [];
136
+ for (const rule of FRAMEWORK_RULES) {
137
+ // Only apply rules from active frameworks
138
+ const ruleFrameworks = rule.frameworks.filter((fw) => active.has(fw.toUpperCase()));
139
+ if (ruleFrameworks.length === 0)
140
+ continue;
141
+ if (rule.pattern.test(text)) {
142
+ if (rule.weight > maxWeight)
143
+ maxWeight = rule.weight;
144
+ matchedFrameworks.push(...ruleFrameworks);
145
+ notes.push(rule.note);
146
+ }
147
+ }
148
+ const adjustedScore = baseSeverity * maxWeight;
149
+ const newSeverity = severityFromScore(adjustedScore);
150
+ return {
151
+ ruleId: f.ruleId || "unknown",
152
+ title: f.title || f.description || "Untitled finding",
153
+ severity: newSeverity,
154
+ originalSeverity: originalSev,
155
+ frameworks: [...new Set(matchedFrameworks)],
156
+ complianceNotes: [...new Set(notes)],
157
+ weight: maxWeight,
158
+ };
159
+ });
160
+ }
161
+ // ─── CLI ────────────────────────────────────────────────────────────────────
162
+ export function runComplianceWeight(argv) {
163
+ if (argv.includes("--help") || argv.includes("-h")) {
164
+ console.log(`
165
+ judges compliance-weight — Re-weight findings by compliance framework
166
+
167
+ Usage:
168
+ judges compliance-weight --frameworks PCI-DSS,HIPAA < report.json
169
+ judges compliance-weight --frameworks GDPR --demo
170
+ judges compliance-weight --list-frameworks
171
+
172
+ Options:
173
+ --frameworks <list> Comma-separated frameworks: PCI-DSS, HIPAA, GDPR, SOC2, ISO27001
174
+ --demo Run with demo findings
175
+ --list-frameworks List available frameworks and rules
176
+ --format json JSON output
177
+ --help, -h Show this help
178
+ `);
179
+ return;
180
+ }
181
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
182
+ const frameworksArg = argv.find((_a, i) => argv[i - 1] === "--frameworks") || "";
183
+ const isDemo = argv.includes("--demo");
184
+ const isList = argv.includes("--list-frameworks");
185
+ if (isList) {
186
+ const frameworks = new Map();
187
+ for (const rule of FRAMEWORK_RULES) {
188
+ for (const fw of rule.frameworks) {
189
+ const list = frameworks.get(fw) || [];
190
+ list.push(` ${rule.note} (weight: ${rule.weight}x)`);
191
+ frameworks.set(fw, list);
192
+ }
193
+ }
194
+ console.log("\n Available Compliance Frameworks:\n ──────────────────────────");
195
+ for (const [fw, rules] of frameworks) {
196
+ console.log(`\n ${fw} (${rules.length} rules):`);
197
+ for (const r of rules)
198
+ console.log(` ${r}`);
199
+ }
200
+ console.log("");
201
+ return;
202
+ }
203
+ const activeFrameworks = frameworksArg
204
+ .split(",")
205
+ .map((f) => f.trim())
206
+ .filter(Boolean);
207
+ if (activeFrameworks.length === 0) {
208
+ console.error(" Specify --frameworks (e.g., --frameworks PCI-DSS,GDPR) or use --list-frameworks");
209
+ return;
210
+ }
211
+ let findings;
212
+ if (isDemo) {
213
+ findings = [
214
+ { ruleId: "SEC-001", title: "SQL injection in user query", severity: "medium" },
215
+ { ruleId: "SEC-002", title: "XSS vulnerability in template", severity: "medium" },
216
+ { ruleId: "SEC-003", title: "Hardcoded password in config", severity: "high" },
217
+ { ruleId: "SEC-004", title: "Missing encryption for PII data", severity: "medium" },
218
+ { ruleId: "SEC-005", title: "No audit logging for access control", severity: "low" },
219
+ { ruleId: "SEC-006", title: "Third-party API calls without auth", severity: "medium" },
220
+ { ruleId: "SEC-007", title: "Missing data retention policy", severity: "low" },
221
+ { ruleId: "PERF-001", title: "Inefficient loop nesting", severity: "low" },
222
+ ];
223
+ }
224
+ else {
225
+ // Read from stdin
226
+ try {
227
+ const input = require("fs").readFileSync(0, "utf-8");
228
+ const parsed = JSON.parse(input);
229
+ findings = parsed.findings || parsed.results || parsed;
230
+ if (!Array.isArray(findings)) {
231
+ console.error(" Input must contain a 'findings' or 'results' array");
232
+ return;
233
+ }
234
+ }
235
+ catch {
236
+ console.error(" Could not read JSON from stdin. Use --demo for a demo or pipe a report.");
237
+ return;
238
+ }
239
+ }
240
+ const weighted = reweightFindings(findings, activeFrameworks);
241
+ if (format === "json") {
242
+ console.log(JSON.stringify({
243
+ frameworks: activeFrameworks,
244
+ findings: weighted,
245
+ summary: {
246
+ total: weighted.length,
247
+ escalated: weighted.filter((f) => f.severity !== f.originalSeverity).length,
248
+ complianceRelevant: weighted.filter((f) => f.frameworks.length > 0).length,
249
+ },
250
+ timestamp: new Date().toISOString(),
251
+ }, null, 2));
252
+ }
253
+ else {
254
+ const escalated = weighted.filter((f) => f.severity !== f.originalSeverity);
255
+ const relevant = weighted.filter((f) => f.frameworks.length > 0);
256
+ console.log(`\n Compliance-Weighted Findings — ${activeFrameworks.join(", ")}\n ──────────────────────────`);
257
+ console.log(` Total: ${weighted.length} | Escalated: ${escalated.length} | Compliance-relevant: ${relevant.length}\n`);
258
+ for (const f of weighted) {
259
+ const changed = f.severity !== f.originalSeverity;
260
+ const sevDisplay = changed ? `${f.originalSeverity} → ${f.severity} ⬆` : f.severity;
261
+ const icon = f.severity === "critical" ? "🔴" : f.severity === "high" ? "🟠" : f.severity === "medium" ? "🟡" : "⚪";
262
+ console.log(` ${icon} [${sevDisplay}] ${f.ruleId}: ${f.title}`);
263
+ if (f.frameworks.length > 0) {
264
+ console.log(` Frameworks: ${f.frameworks.join(", ")}`);
265
+ for (const note of f.complianceNotes.slice(0, 2)) {
266
+ console.log(` 📋 ${note}`);
267
+ }
268
+ }
269
+ }
270
+ console.log("");
271
+ }
272
+ }
273
+ //# sourceMappingURL=compliance-weight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-weight.js","sourceRoot":"","sources":["../../src/commands/compliance-weight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Cross-PR pattern regression — track flagged patterns and alert
3
+ * when they recur in new code. Prevents AI from reintroducing
4
+ * known bugs.
5
+ *
6
+ * All data stored locally in `.judges-pr-patterns/`.
7
+ */
8
+ export declare function runCrossPrRegression(argv: string[]): void;
9
+ //# sourceMappingURL=cross-pr-regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-pr-regression.d.ts","sourceRoot":"","sources":["../../src/commands/cross-pr-regression.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0LH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4JzD"}