@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.
- package/CHANGELOG.md +12 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/code-similarity.d.ts +9 -0
- package/dist/commands/code-similarity.d.ts.map +1 -0
- package/dist/commands/code-similarity.js +232 -0
- package/dist/commands/code-similarity.js.map +1 -0
- package/dist/commands/compliance-weight.d.ts +9 -0
- package/dist/commands/compliance-weight.d.ts.map +1 -0
- package/dist/commands/compliance-weight.js +273 -0
- package/dist/commands/compliance-weight.js.map +1 -0
- package/dist/commands/cross-pr-regression.d.ts +9 -0
- package/dist/commands/cross-pr-regression.d.ts.map +1 -0
- package/dist/commands/cross-pr-regression.js +298 -0
- package/dist/commands/cross-pr-regression.js.map +1 -0
- package/dist/commands/doc-drift.d.ts +9 -0
- package/dist/commands/doc-drift.d.ts.map +1 -0
- package/dist/commands/doc-drift.js +259 -0
- package/dist/commands/doc-drift.js.map +1 -0
- package/dist/commands/exception-consistency.d.ts +7 -0
- package/dist/commands/exception-consistency.d.ts.map +1 -0
- package/dist/commands/exception-consistency.js +193 -0
- package/dist/commands/exception-consistency.js.map +1 -0
- package/dist/commands/refactor-safety.d.ts +9 -0
- package/dist/commands/refactor-safety.d.ts.map +1 -0
- package/dist/commands/refactor-safety.js +274 -0
- package/dist/commands/refactor-safety.js.map +1 -0
- package/dist/commands/resource-cleanup.d.ts +7 -0
- package/dist/commands/resource-cleanup.d.ts.map +1 -0
- package/dist/commands/resource-cleanup.js +236 -0
- package/dist/commands/resource-cleanup.js.map +1 -0
- package/dist/commands/team-trust.d.ts +8 -0
- package/dist/commands/team-trust.d.ts.map +1 -0
- package/dist/commands/team-trust.js +175 -0
- package/dist/commands/team-trust.js.map +1 -0
- package/package.json +1 -1
- 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"}
|