@kevinrabun/judges 3.51.0 → 3.52.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/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/design-audit.d.ts +9 -0
  10. package/dist/commands/design-audit.d.ts.map +1 -0
  11. package/dist/commands/design-audit.js +302 -0
  12. package/dist/commands/design-audit.js.map +1 -0
  13. package/dist/commands/impact-scan.d.ts +9 -0
  14. package/dist/commands/impact-scan.d.ts.map +1 -0
  15. package/dist/commands/impact-scan.js +282 -0
  16. package/dist/commands/impact-scan.js.map +1 -0
  17. package/dist/commands/judge-learn.d.ts +9 -0
  18. package/dist/commands/judge-learn.d.ts.map +1 -0
  19. package/dist/commands/judge-learn.js +218 -0
  20. package/dist/commands/judge-learn.js.map +1 -0
  21. package/dist/commands/model-report.d.ts +9 -0
  22. package/dist/commands/model-report.d.ts.map +1 -0
  23. package/dist/commands/model-report.js +195 -0
  24. package/dist/commands/model-report.js.map +1 -0
  25. package/dist/commands/remediation-lib.d.ts +9 -0
  26. package/dist/commands/remediation-lib.d.ts.map +1 -0
  27. package/dist/commands/remediation-lib.js +266 -0
  28. package/dist/commands/remediation-lib.js.map +1 -0
  29. package/dist/commands/trust-adaptive.d.ts +9 -0
  30. package/dist/commands/trust-adaptive.d.ts.map +1 -0
  31. package/dist/commands/trust-adaptive.js +194 -0
  32. package/dist/commands/trust-adaptive.js.map +1 -0
  33. package/dist/commands/watch-judge.d.ts +8 -0
  34. package/dist/commands/watch-judge.d.ts.map +1 -0
  35. package/dist/commands/watch-judge.js +180 -0
  36. package/dist/commands/watch-judge.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Impact scan — detect ripple effects of AI-generated code across
3
+ * the codebase: broken imports, unused exports, API contract breaks,
4
+ * dependency chain issues.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync, readdirSync } from "fs";
9
+ import { join, extname, relative, basename } from "path";
10
+ // ─── Scanner ────────────────────────────────────────────────────────────────
11
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
12
+ const EXTS = new Set([".ts", ".js", ".py", ".java", ".cs", ".go", ".rb", ".php", ".rs"]);
13
+ function collectFiles(dir) {
14
+ const result = [];
15
+ function walk(d) {
16
+ let entries;
17
+ try {
18
+ entries = readdirSync(d);
19
+ }
20
+ catch {
21
+ return;
22
+ }
23
+ for (const name of entries) {
24
+ if (SKIP.has(name) || name.startsWith("."))
25
+ continue;
26
+ const full = join(d, name);
27
+ try {
28
+ const sub = readdirSync(full);
29
+ void sub;
30
+ walk(full);
31
+ }
32
+ catch {
33
+ if (EXTS.has(extname(name).toLowerCase()))
34
+ result.push(full);
35
+ }
36
+ }
37
+ }
38
+ walk(dir);
39
+ return result;
40
+ }
41
+ // ─── Analysis ───────────────────────────────────────────────────────────────
42
+ function extractExports(content) {
43
+ const exports = [];
44
+ const patterns = [
45
+ /export\s+(?:function|class|const|let|var|interface|type|enum)\s+(\w+)/g,
46
+ /export\s+default\s+(?:function|class)\s+(\w+)/g,
47
+ /export\s*{\s*([^}]+)\s*}/g,
48
+ ];
49
+ for (const pat of patterns) {
50
+ let m;
51
+ while ((m = pat.exec(content)) !== null) {
52
+ if (pat === patterns[2]) {
53
+ exports.push(...m[1]
54
+ .split(",")
55
+ .map((s) => s
56
+ .trim()
57
+ .split(/\s+as\s+/)[0]
58
+ .trim())
59
+ .filter(Boolean));
60
+ }
61
+ else {
62
+ exports.push(m[1]);
63
+ }
64
+ }
65
+ }
66
+ return exports;
67
+ }
68
+ function extractImports(content) {
69
+ const names = [];
70
+ const sources = [];
71
+ const importRe = /import\s+(?:{([^}]+)}|(\w+))\s+from\s+["']([^"']+)["']/g;
72
+ let m;
73
+ while ((m = importRe.exec(content)) !== null) {
74
+ sources.push(m[3]);
75
+ if (m[1]) {
76
+ names.push(...m[1]
77
+ .split(",")
78
+ .map((s) => s
79
+ .trim()
80
+ .split(/\s+as\s+/)[0]
81
+ .trim())
82
+ .filter(Boolean));
83
+ }
84
+ if (m[2])
85
+ names.push(m[2]);
86
+ }
87
+ // require
88
+ const reqRe = /require\s*\(\s*["']([^"']+)["']\s*\)/g;
89
+ while ((m = reqRe.exec(content)) !== null)
90
+ sources.push(m[1]);
91
+ return { names, sources };
92
+ }
93
+ function analyzeImpact(targetFile, allFiles, baseDir) {
94
+ const issues = [];
95
+ const targetContent = readFileSync(targetFile, "utf-8");
96
+ const targetRel = relative(baseDir, targetFile);
97
+ const targetBase = basename(targetFile).replace(/\.\w+$/, "");
98
+ const targetExports = extractExports(targetContent);
99
+ const targetImports = extractImports(targetContent);
100
+ // Build import graph from all other files
101
+ const importers = [];
102
+ const allExportsMap = new Map();
103
+ for (const f of allFiles) {
104
+ if (f === targetFile)
105
+ continue;
106
+ let content;
107
+ try {
108
+ content = readFileSync(f, "utf-8");
109
+ }
110
+ catch {
111
+ continue;
112
+ }
113
+ const rel = relative(baseDir, f);
114
+ allExportsMap.set(rel, extractExports(content));
115
+ const { names, sources } = extractImports(content);
116
+ for (const src of sources) {
117
+ if (src.includes(targetBase) || src.endsWith("/" + targetBase)) {
118
+ importers.push({ file: rel, names, source: src });
119
+ }
120
+ }
121
+ }
122
+ // 1. Check if target's imports reference valid sources
123
+ for (const src of targetImports.sources) {
124
+ if (src.startsWith(".")) {
125
+ const resolved = allFiles.find((f) => {
126
+ const rel = relative(baseDir, f).replace(/\\/g, "/");
127
+ const srcNorm = src.replace(/^\.\//, "").replace(/\.\w+$/, "");
128
+ return rel.replace(/\.\w+$/, "").endsWith(srcNorm);
129
+ });
130
+ if (!resolved) {
131
+ issues.push({
132
+ type: "broken-import",
133
+ severity: "high",
134
+ file: targetRel,
135
+ detail: `Import "${src}" could not be resolved`,
136
+ });
137
+ }
138
+ }
139
+ }
140
+ // 2. Find exports that nobody imports
141
+ for (const exp of targetExports) {
142
+ const usedAnywhere = allFiles.some((f) => {
143
+ if (f === targetFile)
144
+ return false;
145
+ try {
146
+ return readFileSync(f, "utf-8").includes(exp);
147
+ }
148
+ catch {
149
+ return false;
150
+ }
151
+ });
152
+ if (!usedAnywhere) {
153
+ issues.push({
154
+ type: "unused-export",
155
+ severity: "low",
156
+ file: targetRel,
157
+ detail: `Export "${exp}" is not imported by any other file`,
158
+ });
159
+ }
160
+ }
161
+ // 3. Check naming conflicts
162
+ for (const exp of targetExports) {
163
+ const conflicts = [];
164
+ for (const [file, exports] of allExportsMap) {
165
+ if (exports.includes(exp))
166
+ conflicts.push(file);
167
+ }
168
+ if (conflicts.length > 0) {
169
+ issues.push({
170
+ type: "naming-conflict",
171
+ severity: "medium",
172
+ file: targetRel,
173
+ detail: `Export "${exp}" also exported by: ${conflicts.join(", ")}`,
174
+ affectedFiles: conflicts,
175
+ });
176
+ }
177
+ }
178
+ // 4. Check files importing target for potential breaks
179
+ if (importers.length > 0) {
180
+ const importerFiles = importers.map((i) => i.file);
181
+ issues.push({
182
+ type: "dependency-chain",
183
+ severity: "medium",
184
+ file: targetRel,
185
+ detail: `${importers.length} file(s) depend on this module`,
186
+ affectedFiles: importerFiles,
187
+ });
188
+ }
189
+ // 5. API contract — detect exported function signature changes
190
+ const fnSigs = targetContent.match(/export\s+(?:async\s+)?function\s+\w+\s*\([^)]*\)/g) || [];
191
+ const paramCounts = fnSigs.map((sig) => {
192
+ const params = sig.match(/\(([^)]*)\)/)?.[1] || "";
193
+ return params.split(",").filter((p) => p.trim().length > 0).length;
194
+ });
195
+ const _highArity = paramCounts.filter((c) => c > 5).length;
196
+ if (_highArity > 0) {
197
+ issues.push({
198
+ type: "api-contract",
199
+ severity: "medium",
200
+ file: targetRel,
201
+ detail: `${_highArity} exported function(s) with >5 parameters — fragile API contract`,
202
+ });
203
+ }
204
+ const affected = new Set();
205
+ for (const iss of issues) {
206
+ if (iss.affectedFiles)
207
+ iss.affectedFiles.forEach((f) => affected.add(f));
208
+ }
209
+ const impactScore = Math.max(0, 100 -
210
+ issues.filter((i) => i.severity === "high").length * 25 -
211
+ issues.filter((i) => i.severity === "medium").length * 10 -
212
+ issues.filter((i) => i.severity === "low").length * 3);
213
+ return { targetFile: targetRel, issues, impactScore, affectedFileCount: affected.size };
214
+ }
215
+ // ─── CLI ────────────────────────────────────────────────────────────────────
216
+ export function runImpactScan(argv) {
217
+ if (argv.includes("--help") || argv.includes("-h")) {
218
+ console.log(`
219
+ judges impact-scan — Detect cross-file ripple effects
220
+
221
+ Usage:
222
+ judges impact-scan <file>
223
+ judges impact-scan src/api.ts --base-dir src/
224
+ judges impact-scan <dir> (scan all files)
225
+
226
+ Options:
227
+ --base-dir <dir> Base directory for resolution (default: .)
228
+ --format json JSON output
229
+ --help, -h Show this help
230
+
231
+ Checks:
232
+ • Broken imports (unresolved local imports)
233
+ • Unused exports (dead code)
234
+ • Naming conflicts (duplicate export names)
235
+ • Dependency chain (files that depend on this module)
236
+ • API contract (fragile function signatures)
237
+ `);
238
+ return;
239
+ }
240
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
241
+ const baseDir = argv.find((_a, i) => argv[i - 1] === "--base-dir") || ".";
242
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
243
+ if (!existsSync(target)) {
244
+ console.error(` Path not found: ${target}`);
245
+ return;
246
+ }
247
+ const allFiles = collectFiles(baseDir);
248
+ let targetFiles;
249
+ try {
250
+ readdirSync(target);
251
+ targetFiles = collectFiles(target);
252
+ }
253
+ catch {
254
+ targetFiles = [target];
255
+ }
256
+ const results = [];
257
+ for (const f of targetFiles) {
258
+ results.push(analyzeImpact(f, allFiles, baseDir));
259
+ }
260
+ results.sort((a, b) => a.impactScore - b.impactScore);
261
+ if (format === "json") {
262
+ console.log(JSON.stringify({ results, timestamp: new Date().toISOString() }, null, 2));
263
+ }
264
+ else {
265
+ console.log(`\n Impact Scan — ${targetFiles.length} target(s), ${allFiles.length} total files\n ──────────────────────────`);
266
+ for (const r of results) {
267
+ if (r.issues.length === 0)
268
+ continue;
269
+ const icon = r.impactScore >= 80 ? "🟢" : r.impactScore >= 50 ? "🟡" : "🔴";
270
+ console.log(`\n ${icon} ${r.targetFile} — impact ${r.impactScore}/100 (${r.affectedFileCount} affected files)`);
271
+ for (const iss of r.issues) {
272
+ const sev = iss.severity === "high" ? "🔴" : iss.severity === "medium" ? "🟠" : "🟡";
273
+ console.log(` ${sev} [${iss.type}] ${iss.detail}`);
274
+ }
275
+ }
276
+ const clean = results.filter((r) => r.issues.length === 0).length;
277
+ if (clean > 0)
278
+ console.log(`\n ✅ ${clean} file(s) have no cross-file impact issues`);
279
+ console.log("");
280
+ }
281
+ }
282
+ //# sourceMappingURL=impact-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact-scan.js","sourceRoot":"","sources":["../../src/commands/impact-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Judge-learn — interactive wizard that ingests false positive/negative
3
+ * feedback to automatically generate domain-specific judges with
4
+ * detection rules and confidence calibration.
5
+ *
6
+ * All data stored locally in `.judges-learned/`.
7
+ */
8
+ export declare function runJudgeLearn(argv: string[]): void;
9
+ //# sourceMappingURL=judge-learn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge-learn.d.ts","sourceRoot":"","sources":["../../src/commands/judge-learn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiHH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0JlD"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Judge-learn — interactive wizard that ingests false positive/negative
3
+ * feedback to automatically generate domain-specific judges with
4
+ * detection rules and confidence calibration.
5
+ *
6
+ * All data stored locally in `.judges-learned/`.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
9
+ import { join } from "path";
10
+ // ─── Storage ────────────────────────────────────────────────────────────────
11
+ const DATA_DIR = ".judges-learned";
12
+ function ensureDir() {
13
+ if (!existsSync(DATA_DIR))
14
+ mkdirSync(DATA_DIR, { recursive: true });
15
+ }
16
+ function loadFeedback() {
17
+ const file = join(DATA_DIR, "feedback.json");
18
+ if (!existsSync(file))
19
+ return [];
20
+ try {
21
+ return JSON.parse(readFileSync(file, "utf-8"));
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ function saveFeedback(entries) {
28
+ ensureDir();
29
+ writeFileSync(join(DATA_DIR, "feedback.json"), JSON.stringify(entries, null, 2));
30
+ }
31
+ function loadJudges() {
32
+ const file = join(DATA_DIR, "judges.json");
33
+ if (!existsSync(file))
34
+ return [];
35
+ try {
36
+ return JSON.parse(readFileSync(file, "utf-8"));
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ }
42
+ function saveJudges(judges) {
43
+ ensureDir();
44
+ writeFileSync(join(DATA_DIR, "judges.json"), JSON.stringify(judges, null, 2));
45
+ }
46
+ // ─── Pattern extraction ─────────────────────────────────────────────────────
47
+ function extractPatterns(feedback) {
48
+ const patternMap = new Map();
49
+ for (const entry of feedback) {
50
+ const key = `${entry.pattern}:${entry.language}`;
51
+ const existing = patternMap.get(key) || { entries: [], fpCount: 0, fnCount: 0 };
52
+ existing.entries.push(entry);
53
+ if (entry.type === "false-positive")
54
+ existing.fpCount++;
55
+ if (entry.type === "false-negative")
56
+ existing.fnCount++;
57
+ patternMap.set(key, existing);
58
+ }
59
+ const rules = [];
60
+ for (const [key, data] of patternMap) {
61
+ const [pattern, language] = key.split(":");
62
+ const total = data.entries.length;
63
+ const correctRate = total > 0 ? (total - data.fpCount) / total : 0;
64
+ const confidence = Math.round(correctRate * 100);
65
+ // Only create rules for patterns with enough feedback
66
+ if (total >= 2) {
67
+ rules.push({
68
+ id: `learned-${rules.length + 1}`,
69
+ name: `${pattern}-detector`,
70
+ pattern,
71
+ language: language || "any",
72
+ confidence,
73
+ feedbackCount: total,
74
+ description: `Detects "${pattern}" pattern (${total} feedback entries, ${confidence}% confidence)`,
75
+ });
76
+ }
77
+ }
78
+ return rules.sort((a, b) => b.confidence - a.confidence);
79
+ }
80
+ // ─── CLI ────────────────────────────────────────────────────────────────────
81
+ export function runJudgeLearn(argv) {
82
+ if (argv.includes("--help") || argv.includes("-h")) {
83
+ console.log(`
84
+ judges judge-learn — Generate custom judges from feedback
85
+
86
+ Usage:
87
+ judges judge-learn --feedback --type fp --pattern "unused-import" --lang ts
88
+ judges judge-learn --feedback --type fn --pattern "sql-injection" --lang py --context "raw query"
89
+ judges judge-learn --generate --name "my-team-judge"
90
+ judges judge-learn --show
91
+
92
+ Options:
93
+ --feedback Record feedback entry
94
+ --type <fp|fn|ok> Feedback type: fp (false positive), fn (false negative), ok (correct)
95
+ --pattern <name> Pattern/rule that triggered
96
+ --lang <language> Language context
97
+ --context <text> Additional context
98
+ --generate Generate judge from accumulated feedback
99
+ --name <name> Judge name for generation
100
+ --show Show learned judges and feedback stats
101
+ --format json JSON output
102
+ --help, -h Show this help
103
+
104
+ Workflow:
105
+ 1. Record feedback as you review findings (--feedback)
106
+ 2. Generate a custom judge once patterns emerge (--generate)
107
+ 3. Use generated judge in .judgesrc config
108
+ `);
109
+ return;
110
+ }
111
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
112
+ const isFeedback = argv.includes("--feedback");
113
+ const isGenerate = argv.includes("--generate");
114
+ const _isShow = argv.includes("--show");
115
+ if (isFeedback) {
116
+ const typeMap = {
117
+ fp: "false-positive",
118
+ fn: "false-negative",
119
+ ok: "correct",
120
+ };
121
+ const typeArg = argv.find((_a, i) => argv[i - 1] === "--type") || "fp";
122
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern") || "";
123
+ const lang = argv.find((_a, i) => argv[i - 1] === "--lang") || "any";
124
+ const context = argv.find((_a, i) => argv[i - 1] === "--context") || "";
125
+ if (!pattern) {
126
+ console.error(" --pattern is required");
127
+ return;
128
+ }
129
+ const entry = {
130
+ id: `fb-${Date.now()}`,
131
+ type: typeMap[typeArg] || "false-positive",
132
+ pattern,
133
+ language: lang,
134
+ context,
135
+ timestamp: new Date().toISOString(),
136
+ };
137
+ const feedback = loadFeedback();
138
+ feedback.push(entry);
139
+ saveFeedback(feedback);
140
+ console.log(` ✅ Recorded ${entry.type} feedback for "${pattern}" (${lang})`);
141
+ return;
142
+ }
143
+ if (isGenerate) {
144
+ const name = argv.find((_a, i) => argv[i - 1] === "--name") || "custom-judge";
145
+ const feedback = loadFeedback();
146
+ if (feedback.length < 3) {
147
+ console.log(` Need at least 3 feedback entries to generate a judge (have ${feedback.length}).`);
148
+ return;
149
+ }
150
+ const rules = extractPatterns(feedback);
151
+ if (rules.length === 0) {
152
+ console.log(" No patterns with enough feedback to generate rules.");
153
+ return;
154
+ }
155
+ const judge = {
156
+ id: `learned-${name}`,
157
+ name,
158
+ description: `Auto-generated judge from ${feedback.length} feedback entries`,
159
+ rules,
160
+ createdAt: new Date().toISOString(),
161
+ updatedAt: new Date().toISOString(),
162
+ };
163
+ const judges = loadJudges();
164
+ const existing = judges.findIndex((j) => j.id === judge.id);
165
+ if (existing >= 0) {
166
+ judges[existing] = judge;
167
+ }
168
+ else {
169
+ judges.push(judge);
170
+ }
171
+ saveJudges(judges);
172
+ if (format === "json") {
173
+ console.log(JSON.stringify(judge, null, 2));
174
+ }
175
+ else {
176
+ console.log(`\n ✅ Generated judge: ${name}`);
177
+ console.log(` ${rules.length} rule(s) from ${feedback.length} feedback entries\n`);
178
+ for (const rule of rules) {
179
+ const icon = rule.confidence >= 80 ? "🟢" : rule.confidence >= 50 ? "🟡" : "🔴";
180
+ console.log(` ${icon} ${rule.name} — ${rule.confidence}% confidence (${rule.feedbackCount} entries)`);
181
+ }
182
+ console.log(`\n Add to .judgesrc: { "customJudges": ["${judge.id}"] }\n`);
183
+ }
184
+ return;
185
+ }
186
+ // Show
187
+ const feedback = loadFeedback();
188
+ const judges = loadJudges();
189
+ if (format === "json") {
190
+ console.log(JSON.stringify({ feedback: feedback.length, judges, timestamp: new Date().toISOString() }, null, 2));
191
+ return;
192
+ }
193
+ console.log(`\n Judge Learn — ${feedback.length} feedback entries, ${judges.length} generated judges\n ──────────────────────────`);
194
+ if (feedback.length > 0) {
195
+ const fpCount = feedback.filter((f) => f.type === "false-positive").length;
196
+ const fnCount = feedback.filter((f) => f.type === "false-negative").length;
197
+ const okCount = feedback.filter((f) => f.type === "correct").length;
198
+ console.log(` Feedback: ${fpCount} false positives, ${fnCount} false negatives, ${okCount} correct`);
199
+ const patterns = extractPatterns(feedback);
200
+ if (patterns.length > 0) {
201
+ console.log(` Learnable patterns: ${patterns.length}`);
202
+ for (const p of patterns.slice(0, 5)) {
203
+ console.log(` • ${p.name} — ${p.confidence}% confidence`);
204
+ }
205
+ }
206
+ }
207
+ if (judges.length > 0) {
208
+ console.log(`\n Generated Judges:`);
209
+ for (const j of judges) {
210
+ console.log(` 📋 ${j.name} — ${j.rules.length} rules (${j.updatedAt})`);
211
+ }
212
+ }
213
+ if (feedback.length === 0 && judges.length === 0) {
214
+ console.log(" No data yet. Use --feedback to record findings feedback.");
215
+ }
216
+ console.log("");
217
+ }
218
+ //# sourceMappingURL=judge-learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge-learn.js","sourceRoot":"","sources":["../../src/commands/judge-learn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAgC5B,+EAA+E;AAE/E,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AAEnC,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAwB;IAC5C,SAAS,EAAE,CAAC;IACZ,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAsB;IACxC,SAAS,EAAE,CAAC;IACZ,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,+EAA+E;AAE/E,SAAS,eAAe,CAAC,QAAyB;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0E,CAAC;IAErG,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAChF,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;YAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;YAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAClC,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;QAEjD,sDAAsD;QACtD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,WAAW,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjC,IAAI,EAAE,GAAG,OAAO,WAAW;gBAC3B,OAAO;gBACP,QAAQ,EAAE,QAAQ,IAAI,KAAK;gBAC3B,UAAU;gBACV,aAAa,EAAE,KAAK;gBACpB,WAAW,EAAE,YAAY,OAAO,cAAc,KAAK,sBAAsB,UAAU,eAAe;aACnG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBf,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,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,OAAO,GAA0C;YACrD,EAAE,EAAE,gBAAgB;YACpB,EAAE,EAAE,gBAAgB;YACpB,EAAE,EAAE,SAAS;SACd,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC;QACvF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QACxF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC;QACrF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QAExF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAkB;YAC3B,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE;YACtB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,gBAAgB;YAC1C,OAAO;YACP,QAAQ,EAAE,IAAI;YACd,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,kBAAkB,OAAO,MAAM,IAAI,GAAG,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,cAAc,CAAC;QAC9F,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAEhC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,gEAAgE,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAiB;YAC1B,EAAE,EAAE,WAAW,IAAI,EAAE;YACrB,IAAI;YACJ,WAAW,EAAE,6BAA6B,QAAQ,CAAC,MAAM,mBAAmB;YAC5E,KAAK;YACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,MAAM,iBAAiB,QAAQ,CAAC,MAAM,qBAAqB,CAAC,CAAC;YACvF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,iBAAiB,IAAI,CAAC,aAAa,WAAW,CAAC,CAAC;YAC5G,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,gDAAgD,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChF,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO;IACP,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,qBAAqB,QAAQ,CAAC,MAAM,sBAAsB,MAAM,CAAC,MAAM,iDAAiD,CACzH,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,MAAM,CAAC;QAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,MAAM,CAAC;QAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,qBAAqB,OAAO,qBAAqB,OAAO,UAAU,CAAC,CAAC;QAExG,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,UAAU,cAAc,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Model report — track which AI model/version produced each finding
3
+ * across evaluation runs. Generates model scorecards with pass rates,
4
+ * failure categories, and vendor-specific blind spots.
5
+ *
6
+ * All data stored locally in `.judges-model-reports/`.
7
+ */
8
+ export declare function runModelReport(argv: string[]): void;
9
+ //# sourceMappingURL=model-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-report.d.ts","sourceRoot":"","sources":["../../src/commands/model-report.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkHH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6HnD"}