@kevinrabun/judges 3.51.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 (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/chat-notify.d.ts +9 -0
  6. package/dist/commands/chat-notify.d.ts.map +1 -0
  7. package/dist/commands/chat-notify.js +259 -0
  8. package/dist/commands/chat-notify.js.map +1 -0
  9. package/dist/commands/code-similarity.d.ts +9 -0
  10. package/dist/commands/code-similarity.d.ts.map +1 -0
  11. package/dist/commands/code-similarity.js +232 -0
  12. package/dist/commands/code-similarity.js.map +1 -0
  13. package/dist/commands/compliance-weight.d.ts +9 -0
  14. package/dist/commands/compliance-weight.d.ts.map +1 -0
  15. package/dist/commands/compliance-weight.js +273 -0
  16. package/dist/commands/compliance-weight.js.map +1 -0
  17. package/dist/commands/cross-pr-regression.d.ts +9 -0
  18. package/dist/commands/cross-pr-regression.d.ts.map +1 -0
  19. package/dist/commands/cross-pr-regression.js +298 -0
  20. package/dist/commands/cross-pr-regression.js.map +1 -0
  21. package/dist/commands/design-audit.d.ts +9 -0
  22. package/dist/commands/design-audit.d.ts.map +1 -0
  23. package/dist/commands/design-audit.js +302 -0
  24. package/dist/commands/design-audit.js.map +1 -0
  25. package/dist/commands/doc-drift.d.ts +9 -0
  26. package/dist/commands/doc-drift.d.ts.map +1 -0
  27. package/dist/commands/doc-drift.js +259 -0
  28. package/dist/commands/doc-drift.js.map +1 -0
  29. package/dist/commands/exception-consistency.d.ts +7 -0
  30. package/dist/commands/exception-consistency.d.ts.map +1 -0
  31. package/dist/commands/exception-consistency.js +193 -0
  32. package/dist/commands/exception-consistency.js.map +1 -0
  33. package/dist/commands/impact-scan.d.ts +9 -0
  34. package/dist/commands/impact-scan.d.ts.map +1 -0
  35. package/dist/commands/impact-scan.js +282 -0
  36. package/dist/commands/impact-scan.js.map +1 -0
  37. package/dist/commands/judge-learn.d.ts +9 -0
  38. package/dist/commands/judge-learn.d.ts.map +1 -0
  39. package/dist/commands/judge-learn.js +218 -0
  40. package/dist/commands/judge-learn.js.map +1 -0
  41. package/dist/commands/model-report.d.ts +9 -0
  42. package/dist/commands/model-report.d.ts.map +1 -0
  43. package/dist/commands/model-report.js +195 -0
  44. package/dist/commands/model-report.js.map +1 -0
  45. package/dist/commands/refactor-safety.d.ts +9 -0
  46. package/dist/commands/refactor-safety.d.ts.map +1 -0
  47. package/dist/commands/refactor-safety.js +274 -0
  48. package/dist/commands/refactor-safety.js.map +1 -0
  49. package/dist/commands/remediation-lib.d.ts +9 -0
  50. package/dist/commands/remediation-lib.d.ts.map +1 -0
  51. package/dist/commands/remediation-lib.js +266 -0
  52. package/dist/commands/remediation-lib.js.map +1 -0
  53. package/dist/commands/resource-cleanup.d.ts +7 -0
  54. package/dist/commands/resource-cleanup.d.ts.map +1 -0
  55. package/dist/commands/resource-cleanup.js +236 -0
  56. package/dist/commands/resource-cleanup.js.map +1 -0
  57. package/dist/commands/team-trust.d.ts +8 -0
  58. package/dist/commands/team-trust.d.ts.map +1 -0
  59. package/dist/commands/team-trust.js +175 -0
  60. package/dist/commands/team-trust.js.map +1 -0
  61. package/dist/commands/trust-adaptive.d.ts +9 -0
  62. package/dist/commands/trust-adaptive.d.ts.map +1 -0
  63. package/dist/commands/trust-adaptive.js +194 -0
  64. package/dist/commands/trust-adaptive.js.map +1 -0
  65. package/dist/commands/watch-judge.d.ts +8 -0
  66. package/dist/commands/watch-judge.d.ts.map +1 -0
  67. package/dist/commands/watch-judge.js +180 -0
  68. package/dist/commands/watch-judge.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Chat-notify — publish findings to Slack, Teams, Discord, or custom
3
+ * webhooks with rich formatting and team mention routing.
4
+ *
5
+ * DataAdapter-friendly: webhook URLs come from local config,
6
+ * no data stored server-side.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
9
+ import { join } from "path";
10
+ // ─── Config ─────────────────────────────────────────────────────────────────
11
+ const CONFIG_DIR = ".judges-notify";
12
+ const CONFIG_FILE = join(CONFIG_DIR, "webhooks.json");
13
+ function ensureDir() {
14
+ if (!existsSync(CONFIG_DIR))
15
+ mkdirSync(CONFIG_DIR, { recursive: true });
16
+ }
17
+ function loadWebhooks() {
18
+ if (!existsSync(CONFIG_FILE))
19
+ return [];
20
+ try {
21
+ return JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ function saveWebhooks(webhooks) {
28
+ ensureDir();
29
+ writeFileSync(CONFIG_FILE, JSON.stringify(webhooks, null, 2));
30
+ }
31
+ // ─── Formatters ─────────────────────────────────────────────────────────────
32
+ function formatSlack(payload) {
33
+ const color = payload.criticalCount > 0 ? "#e74c3c" : payload.score < 60 ? "#f39c12" : "#2ecc71";
34
+ return {
35
+ attachments: [
36
+ {
37
+ color,
38
+ title: `🔍 Judges Panel: ${payload.subject}`,
39
+ text: payload.body,
40
+ fields: [
41
+ { title: "Score", value: `${payload.score}/100`, short: true },
42
+ { title: "Findings", value: String(payload.findings), short: true },
43
+ { title: "Critical", value: String(payload.criticalCount), short: true },
44
+ ],
45
+ footer: "Judges Panel",
46
+ ts: Math.floor(Date.now() / 1000),
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ function formatTeams(payload) {
52
+ const color = payload.criticalCount > 0 ? "FF0000" : payload.score < 60 ? "FFC107" : "28A745";
53
+ return {
54
+ "@type": "MessageCard",
55
+ "@context": "http://schema.org/extensions",
56
+ themeColor: color,
57
+ summary: `Judges Panel: ${payload.subject}`,
58
+ sections: [
59
+ {
60
+ activityTitle: `🔍 ${payload.subject}`,
61
+ facts: [
62
+ { name: "Score", value: `${payload.score}/100` },
63
+ { name: "Findings", value: String(payload.findings) },
64
+ { name: "Critical", value: String(payload.criticalCount) },
65
+ ],
66
+ text: payload.body,
67
+ },
68
+ ],
69
+ };
70
+ }
71
+ function formatDiscord(payload) {
72
+ const color = payload.criticalCount > 0 ? 0xe74c3c : payload.score < 60 ? 0xf39c12 : 0x2ecc71;
73
+ return {
74
+ embeds: [
75
+ {
76
+ title: `🔍 Judges Panel: ${payload.subject}`,
77
+ description: payload.body,
78
+ color,
79
+ fields: [
80
+ { name: "Score", value: `${payload.score}/100`, inline: true },
81
+ { name: "Findings", value: String(payload.findings), inline: true },
82
+ { name: "Critical", value: String(payload.criticalCount), inline: true },
83
+ ],
84
+ timestamp: new Date().toISOString(),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ function formatPayload(webhook, payload) {
90
+ switch (webhook.type) {
91
+ case "slack":
92
+ return JSON.stringify(formatSlack(payload));
93
+ case "teams":
94
+ return JSON.stringify(formatTeams(payload));
95
+ case "discord":
96
+ return JSON.stringify(formatDiscord(payload));
97
+ default:
98
+ return JSON.stringify(payload);
99
+ }
100
+ }
101
+ // ─── CLI ────────────────────────────────────────────────────────────────────
102
+ export function runChatNotify(argv) {
103
+ if (argv.includes("--help") || argv.includes("-h")) {
104
+ console.log(`
105
+ judges chat-notify — Publish findings to chat platforms
106
+
107
+ Usage:
108
+ judges chat-notify --add --name "team-slack" --type slack --url <webhook-url>
109
+ judges chat-notify --send --subject "PR #42" --score 65 --findings 5 --critical 1
110
+ judges chat-notify --send --file eval-output.json
111
+ judges chat-notify --list
112
+ judges chat-notify --preview --name "team-slack" --subject "test"
113
+ judges chat-notify --remove --name "team-slack"
114
+
115
+ Options:
116
+ --add Add webhook configuration
117
+ --name <name> Webhook name
118
+ --type <platform> Platform: slack, teams, discord, custom
119
+ --url <webhook-url> Webhook URL (stored locally in .judges-notify/)
120
+ --channel <name> Channel name (for display)
121
+ --mention <user> Mention on critical findings
122
+ --min-severity <sev> Minimum severity to notify (default: medium)
123
+ --send Send notification
124
+ --subject <text> Notification subject
125
+ --score <n> Score (0-100)
126
+ --findings <n> Finding count
127
+ --critical <n> Critical finding count
128
+ --file <path> Import from evaluation output
129
+ --preview Preview formatted message (no send)
130
+ --list List configured webhooks
131
+ --remove Remove webhook
132
+ --format json JSON output
133
+ --help, -h Show this help
134
+
135
+ Platforms: Slack (attachments), Teams (MessageCard), Discord (embeds), Custom (raw JSON)
136
+ Webhook URLs are stored locally — no data sent to Judges servers.
137
+ `);
138
+ return;
139
+ }
140
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
141
+ const isAdd = argv.includes("--add");
142
+ const isSend = argv.includes("--send");
143
+ const isList = argv.includes("--list");
144
+ const isPreview = argv.includes("--preview");
145
+ const isRemove = argv.includes("--remove");
146
+ const name = argv.find((_a, i) => argv[i - 1] === "--name") || "";
147
+ const webhookType = (argv.find((_a, i) => argv[i - 1] === "--type") ||
148
+ "custom");
149
+ const url = argv.find((_a, i) => argv[i - 1] === "--url") || "";
150
+ const channel = argv.find((_a, i) => argv[i - 1] === "--channel") || "";
151
+ const mention = argv.find((_a, i) => argv[i - 1] === "--mention") || "";
152
+ const subject = argv.find((_a, i) => argv[i - 1] === "--subject") || "Judges Panel Evaluation";
153
+ const score = parseInt(argv.find((_a, i) => argv[i - 1] === "--score") || "0");
154
+ const findings = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0");
155
+ const critical = parseInt(argv.find((_a, i) => argv[i - 1] === "--critical") || "0");
156
+ const fileArg = argv.find((_a, i) => argv[i - 1] === "--file");
157
+ if (isAdd) {
158
+ if (!name || !url) {
159
+ console.error(" --name and --url are required for --add");
160
+ return;
161
+ }
162
+ const webhooks = loadWebhooks();
163
+ if (webhooks.some((w) => w.name === name)) {
164
+ console.error(` Webhook "${name}" already exists. Remove first.`);
165
+ return;
166
+ }
167
+ webhooks.push({ name, url, type: webhookType, channel, mentionOnCritical: mention || undefined });
168
+ saveWebhooks(webhooks);
169
+ console.log(` ✅ Added ${webhookType} webhook "${name}"`);
170
+ return;
171
+ }
172
+ if (isRemove) {
173
+ if (!name) {
174
+ console.error(" --name is required");
175
+ return;
176
+ }
177
+ const webhooks = loadWebhooks().filter((w) => w.name !== name);
178
+ saveWebhooks(webhooks);
179
+ console.log(` ✅ Removed webhook "${name}"`);
180
+ return;
181
+ }
182
+ if (isList) {
183
+ const webhooks = loadWebhooks();
184
+ if (format === "json") {
185
+ console.log(JSON.stringify(webhooks, null, 2));
186
+ }
187
+ else {
188
+ console.log(`\n Configured Webhooks — ${webhooks.length}\n ──────────────────────────`);
189
+ for (const w of webhooks) {
190
+ const masked = w.url.replace(/(.{20}).*(.{6})/, "$1***$2");
191
+ console.log(` 📡 ${w.name} (${w.type}) → ${masked}${w.channel ? ` #${w.channel}` : ""}`);
192
+ }
193
+ if (webhooks.length === 0)
194
+ console.log(" No webhooks configured. Use --add to add one.");
195
+ console.log("");
196
+ }
197
+ return;
198
+ }
199
+ if (isSend || isPreview) {
200
+ const webhooks = loadWebhooks();
201
+ const targets = name ? webhooks.filter((w) => w.name === name) : webhooks;
202
+ if (targets.length === 0) {
203
+ console.error(" No webhooks configured. Use --add first.");
204
+ return;
205
+ }
206
+ let payloadScore = score;
207
+ let payloadFindings = findings;
208
+ let payloadCritical = critical;
209
+ let body = `Score: ${score}/100 | ${findings} findings | ${critical} critical`;
210
+ if (fileArg && existsSync(fileArg)) {
211
+ try {
212
+ const data = JSON.parse(readFileSync(fileArg, "utf-8"));
213
+ payloadScore = data.overallScore || score;
214
+ payloadFindings = Array.isArray(data.findings) ? data.findings.length : findings;
215
+ payloadCritical = data.criticalCount || critical;
216
+ body = data.summary || body;
217
+ }
218
+ catch {
219
+ /* use manual values */
220
+ }
221
+ }
222
+ for (const webhook of targets) {
223
+ const payload = {
224
+ platform: webhook.type,
225
+ channel: webhook.channel || "",
226
+ subject,
227
+ body,
228
+ findings: payloadFindings,
229
+ criticalCount: payloadCritical,
230
+ score: payloadScore,
231
+ };
232
+ const formatted = formatPayload(webhook, payload);
233
+ if (isPreview) {
234
+ console.log(`\n Preview for ${webhook.name} (${webhook.type}):\n`);
235
+ console.log(JSON.stringify(JSON.parse(formatted), null, 2));
236
+ }
237
+ else {
238
+ // In a real implementation, this would use fetch/https to POST
239
+ // Since we can't store/process data server-side, we output the curl command
240
+ console.log(`\n 📡 ${webhook.name} (${webhook.type}):`);
241
+ console.log(` curl -X POST -H "Content-Type: application/json" -d '${formatted}' "${webhook.url}"`);
242
+ if (webhook.mentionOnCritical && payloadCritical > 0) {
243
+ console.log(` ⚠ Critical findings — mention ${webhook.mentionOnCritical}`);
244
+ }
245
+ }
246
+ }
247
+ console.log("");
248
+ return;
249
+ }
250
+ // Default: show status
251
+ const webhooks = loadWebhooks();
252
+ console.log(`\n Chat Notify — ${webhooks.length} webhook(s) configured`);
253
+ if (webhooks.length > 0) {
254
+ for (const w of webhooks)
255
+ console.log(` 📡 ${w.name} (${w.type})`);
256
+ }
257
+ console.log(" Use --help for usage.\n");
258
+ }
259
+ //# sourceMappingURL=chat-notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-notify.js","sourceRoot":"","sources":["../../src/commands/chat-notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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
+ export declare function runCodeSimilarity(argv: string[]): void;
9
+ //# sourceMappingURL=code-similarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-similarity.d.ts","sourceRoot":"","sources":["../../src/commands/code-similarity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgHH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmKtD"}
@@ -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":"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"}
@@ -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"}