@kevinrabun/judges 3.50.0 → 3.51.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/ai-gate.d.ts +8 -0
  6. package/dist/commands/ai-gate.d.ts.map +1 -0
  7. package/dist/commands/ai-gate.js +213 -0
  8. package/dist/commands/ai-gate.js.map +1 -0
  9. package/dist/commands/ai-output-compare.d.ts +9 -0
  10. package/dist/commands/ai-output-compare.d.ts.map +1 -0
  11. package/dist/commands/ai-output-compare.js +203 -0
  12. package/dist/commands/ai-output-compare.js.map +1 -0
  13. package/dist/commands/ai-pattern-trend.d.ts +9 -0
  14. package/dist/commands/ai-pattern-trend.d.ts.map +1 -0
  15. package/dist/commands/ai-pattern-trend.js +224 -0
  16. package/dist/commands/ai-pattern-trend.js.map +1 -0
  17. package/dist/commands/arch-audit.d.ts +9 -0
  18. package/dist/commands/arch-audit.d.ts.map +1 -0
  19. package/dist/commands/arch-audit.js +284 -0
  20. package/dist/commands/arch-audit.js.map +1 -0
  21. package/dist/commands/clarity-score.d.ts +9 -0
  22. package/dist/commands/clarity-score.d.ts.map +1 -0
  23. package/dist/commands/clarity-score.js +261 -0
  24. package/dist/commands/clarity-score.js.map +1 -0
  25. package/dist/commands/hallucination-score.d.ts +9 -0
  26. package/dist/commands/hallucination-score.d.ts.map +1 -0
  27. package/dist/commands/hallucination-score.js +317 -0
  28. package/dist/commands/hallucination-score.js.map +1 -0
  29. package/dist/commands/test-suggest.d.ts +9 -0
  30. package/dist/commands/test-suggest.d.ts.map +1 -0
  31. package/dist/commands/test-suggest.js +248 -0
  32. package/dist/commands/test-suggest.js.map +1 -0
  33. package/dist/commands/vendor-lock-detect.d.ts +8 -0
  34. package/dist/commands/vendor-lock-detect.d.ts.map +1 -0
  35. package/dist/commands/vendor-lock-detect.js +289 -0
  36. package/dist/commands/vendor-lock-detect.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Test suggest — analyze AI-generated code and suggest specific
3
+ * test scenarios (edge cases, error paths, boundary conditions)
4
+ * that the code likely missed.
5
+ *
6
+ * All analysis local.
7
+ */
8
+ import { existsSync, readFileSync } from "fs";
9
+ // ─── Function extraction ────────────────────────────────────────────────────
10
+ function extractFunctions(content, lines) {
11
+ const functions = [];
12
+ const fnPatterns = [
13
+ /(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/g,
14
+ /(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?(?:\(([^)]*)\)|(\w+))\s*=>/g,
15
+ /(\w+)\s*\(([^)]*)\)\s*(?::\s*\w+)?\s*{/g,
16
+ ];
17
+ for (const pattern of fnPatterns) {
18
+ pattern.lastIndex = 0;
19
+ let m;
20
+ while ((m = pattern.exec(content)) !== null) {
21
+ const lineIdx = content.substring(0, m.index).split("\n").length;
22
+ const name = m[1];
23
+ const params = (m[2] || m[3] || "")
24
+ .split(",")
25
+ .map((p) => p.trim())
26
+ .filter(Boolean);
27
+ // Extract rough function body
28
+ let braceCount = 0;
29
+ let bodyStart = -1;
30
+ let bodyEnd = -1;
31
+ for (let i = lineIdx - 1; i < lines.length; i++) {
32
+ if (lines[i].includes("{") && bodyStart === -1)
33
+ bodyStart = i;
34
+ braceCount += (lines[i].match(/{/g) || []).length;
35
+ braceCount -= (lines[i].match(/}/g) || []).length;
36
+ if (bodyStart !== -1 && braceCount <= 0) {
37
+ bodyEnd = i;
38
+ break;
39
+ }
40
+ }
41
+ const body = bodyStart >= 0 && bodyEnd >= 0 ? lines.slice(bodyStart, bodyEnd + 1).join("\n") : "";
42
+ const hasReturn = /\breturn\b/.test(body);
43
+ const isAsync = /\basync\b/.test(m[0]);
44
+ functions.push({ name, line: lineIdx, params, hasReturn, isAsync, body });
45
+ }
46
+ }
47
+ // Deduplicate by name and line
48
+ const seen = new Set();
49
+ return functions.filter((f) => {
50
+ const key = `${f.name}:${f.line}`;
51
+ if (seen.has(key))
52
+ return false;
53
+ seen.add(key);
54
+ return true;
55
+ });
56
+ }
57
+ // ─── Test suggestion generators ─────────────────────────────────────────────
58
+ function suggestTests(fn, _content) {
59
+ const suggestions = [];
60
+ // 1. Null/undefined parameter tests
61
+ for (const param of fn.params) {
62
+ const paramName = param.split(/[:=]/)[0].trim().replace(/[?!]/g, "");
63
+ if (paramName) {
64
+ suggestions.push({
65
+ category: "Null Input",
66
+ description: `Test ${fn.name}() with ${paramName} = null/undefined`,
67
+ priority: "high",
68
+ targetLine: fn.line,
69
+ testCode: `it("should handle null ${paramName}", () => { expect(() => ${fn.name}(${fn.params.map((p) => (p.split(/[:=]/)[0].trim() === paramName ? "null" : "'valid'")).join(", ")})).not.toThrow(); });`,
70
+ });
71
+ }
72
+ }
73
+ // 2. Empty input tests
74
+ if (fn.params.length > 0) {
75
+ suggestions.push({
76
+ category: "Empty Input",
77
+ description: `Test ${fn.name}() with empty string/array/object inputs`,
78
+ priority: "high",
79
+ targetLine: fn.line,
80
+ });
81
+ }
82
+ // 3. Error path tests
83
+ if (/\bthrow\b/.test(fn.body)) {
84
+ suggestions.push({
85
+ category: "Error Path",
86
+ description: `Test error throwing conditions in ${fn.name}()`,
87
+ priority: "high",
88
+ targetLine: fn.line,
89
+ });
90
+ }
91
+ // 4. Async error handling
92
+ if (fn.isAsync) {
93
+ suggestions.push({
94
+ category: "Async Error",
95
+ description: `Test ${fn.name}() with rejected promises and timeout scenarios`,
96
+ priority: "high",
97
+ targetLine: fn.line,
98
+ });
99
+ if (/\bawait\b/.test(fn.body) && !/\btry\s*{/.test(fn.body)) {
100
+ suggestions.push({
101
+ category: "Unhandled Rejection",
102
+ description: `${fn.name}() has await without try/catch — test rejection behavior`,
103
+ priority: "high",
104
+ targetLine: fn.line,
105
+ });
106
+ }
107
+ }
108
+ // 5. Boundary conditions
109
+ if (/\b(?:length|size|count|index|i|j)\b/.test(fn.body)) {
110
+ suggestions.push({
111
+ category: "Boundary",
112
+ description: `Test ${fn.name}() with boundary values (0, -1, MAX_SAFE_INTEGER, empty collection)`,
113
+ priority: "medium",
114
+ targetLine: fn.line,
115
+ });
116
+ }
117
+ // 6. Type coercion
118
+ if (/\b(?:parseInt|parseFloat|Number\(|String\(|\.toString\()/.test(fn.body)) {
119
+ suggestions.push({
120
+ category: "Type Coercion",
121
+ description: `Test ${fn.name}() with unexpected types (NaN, Infinity, "not a number")`,
122
+ priority: "medium",
123
+ targetLine: fn.line,
124
+ });
125
+ }
126
+ // 7. Regular expression edge cases
127
+ if (/new\s+RegExp|\/[^/]+\/[gimsuy]*/.test(fn.body)) {
128
+ suggestions.push({
129
+ category: "Regex Edge Case",
130
+ description: `Test ${fn.name}() with regex edge cases (empty string, special characters, very long input)`,
131
+ priority: "medium",
132
+ targetLine: fn.line,
133
+ });
134
+ }
135
+ // 8. File/IO operations
136
+ if (/\bread(?:File|dir)|write(?:File)|open|close|exists/.test(fn.body)) {
137
+ suggestions.push({
138
+ category: "File IO",
139
+ description: `Test ${fn.name}() with missing files, permission errors, and empty files`,
140
+ priority: "high",
141
+ targetLine: fn.line,
142
+ });
143
+ }
144
+ // 9. State mutation
145
+ if (/\.push\(|\.splice\(|\.pop\(|\.shift\(|delete\s/.test(fn.body)) {
146
+ suggestions.push({
147
+ category: "State Mutation",
148
+ description: `Test ${fn.name}() for unintended side effects on input data`,
149
+ priority: "medium",
150
+ targetLine: fn.line,
151
+ });
152
+ }
153
+ // 10. Return value consistency
154
+ if (fn.hasReturn) {
155
+ const returnCount = (fn.body.match(/\breturn\b/g) || []).length;
156
+ if (returnCount > 2) {
157
+ suggestions.push({
158
+ category: "Return Consistency",
159
+ description: `${fn.name}() has ${returnCount} return paths — test each returns consistent type`,
160
+ priority: "medium",
161
+ targetLine: fn.line,
162
+ });
163
+ }
164
+ }
165
+ return suggestions;
166
+ }
167
+ // ─── CLI ────────────────────────────────────────────────────────────────────
168
+ export function runTestSuggest(argv) {
169
+ if (argv.includes("--help") || argv.includes("-h")) {
170
+ console.log(`
171
+ judges test-suggest — Suggest test scenarios for AI-generated code
172
+
173
+ Usage:
174
+ judges test-suggest <file>
175
+ judges test-suggest src/service.ts --priority high
176
+ judges test-suggest handler.js --format json
177
+
178
+ Options:
179
+ --priority <level> Filter by priority (high, medium, low)
180
+ --function <name> Focus on a specific function
181
+ --format json JSON output
182
+ --help, -h Show this help
183
+
184
+ Categories: Null Input, Empty Input, Error Path, Async Error,
185
+ Boundary, Type Coercion, Regex Edge Case, File IO,
186
+ State Mutation, Return Consistency
187
+ `);
188
+ return;
189
+ }
190
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
191
+ const priorityFilter = argv.find((_a, i) => argv[i - 1] === "--priority");
192
+ const fnFilter = argv.find((_a, i) => argv[i - 1] === "--function");
193
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--"));
194
+ if (!target || !existsSync(target)) {
195
+ console.error(" Please provide a valid source file");
196
+ return;
197
+ }
198
+ let content;
199
+ try {
200
+ content = readFileSync(target, "utf-8");
201
+ }
202
+ catch {
203
+ console.error(` Cannot read: ${target}`);
204
+ return;
205
+ }
206
+ const lines = content.split("\n");
207
+ let functions = extractFunctions(content, lines);
208
+ if (fnFilter) {
209
+ functions = functions.filter((f) => f.name === fnFilter);
210
+ if (functions.length === 0) {
211
+ console.error(` Function not found: ${fnFilter}`);
212
+ return;
213
+ }
214
+ }
215
+ let allSuggestions = [];
216
+ for (const fn of functions) {
217
+ const suggestions = suggestTests(fn, content);
218
+ allSuggestions.push(...suggestions.map((s) => ({ ...s, functionName: fn.name })));
219
+ }
220
+ if (priorityFilter) {
221
+ allSuggestions = allSuggestions.filter((s) => s.priority === priorityFilter);
222
+ }
223
+ if (format === "json") {
224
+ console.log(JSON.stringify({ file: target, functions: functions.length, suggestions: allSuggestions, timestamp: new Date().toISOString() }, null, 2));
225
+ }
226
+ else {
227
+ console.log(`\n Test Suggestions for ${target}`);
228
+ console.log(` Functions: ${functions.length} | Suggestions: ${allSuggestions.length}\n ──────────────────────────`);
229
+ if (allSuggestions.length === 0) {
230
+ console.log(` No test suggestions generated.\n`);
231
+ return;
232
+ }
233
+ for (const priority of ["high", "medium", "low"]) {
234
+ const items = allSuggestions.filter((s) => s.priority === priority);
235
+ if (items.length === 0)
236
+ continue;
237
+ console.log(`\n ${priority.toUpperCase()} PRIORITY (${items.length})`);
238
+ for (const s of items) {
239
+ console.log(` [${s.category}] ${s.functionName}() — ${s.description}`);
240
+ if (s.testCode) {
241
+ console.log(` Code: ${s.testCode.substring(0, 100)}${s.testCode.length > 100 ? "..." : ""}`);
242
+ }
243
+ }
244
+ }
245
+ console.log("");
246
+ }
247
+ }
248
+ //# sourceMappingURL=test-suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-suggest.js","sourceRoot":"","sources":["../../src/commands/test-suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Vendor lock detect — scan code for vendor-specific APIs and SDKs
3
+ * commonly embedded by AI models. Flag portability risks.
4
+ *
5
+ * All analysis local.
6
+ */
7
+ export declare function runVendorLockDetect(argv: string[]): void;
8
+ //# sourceMappingURL=vendor-lock-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor-lock-detect.d.ts","sourceRoot":"","sources":["../../src/commands/vendor-lock-detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8MH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwHxD"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Vendor lock detect — scan code for vendor-specific APIs and SDKs
3
+ * commonly embedded by AI models. Flag portability risks.
4
+ *
5
+ * All analysis local.
6
+ */
7
+ import { existsSync, readFileSync, readdirSync } from "fs";
8
+ import { join, extname } from "path";
9
+ // ─── Vendor patterns ────────────────────────────────────────────────────────
10
+ const VENDOR_PATTERNS = [
11
+ // AWS
12
+ { vendor: "AWS", category: "SDK", regex: /(?:aws-sdk|@aws-sdk\/|require\s*\(\s*["']aws)/i, severity: "high" },
13
+ {
14
+ vendor: "AWS",
15
+ category: "Service",
16
+ regex: /\b(?:DynamoDB|S3Client|LambdaClient|SQSClient|SNSClient|EC2Client)\b/,
17
+ severity: "high",
18
+ },
19
+ { vendor: "AWS", category: "API", regex: /\b(?:amazonaws\.com|\.aws\.amazon\.com)\b/i, severity: "medium" },
20
+ {
21
+ vendor: "AWS",
22
+ category: "Config",
23
+ regex: /\b(?:AWS_ACCESS_KEY|AWS_SECRET|AWS_REGION|aws_access_key_id)\b/,
24
+ severity: "medium",
25
+ },
26
+ {
27
+ vendor: "AWS",
28
+ category: "Service",
29
+ regex: /\b(?:cognito|cloudformation|cloudwatch|elasticache|redshift)\b/i,
30
+ severity: "medium",
31
+ },
32
+ // Azure
33
+ { vendor: "Azure", category: "SDK", regex: /(?:@azure\/|azure-storage|microsoft\.azure)/i, severity: "high" },
34
+ {
35
+ vendor: "Azure",
36
+ category: "Service",
37
+ regex: /\b(?:BlobServiceClient|CosmosClient|ServiceBusClient|EventHubClient)\b/,
38
+ severity: "high",
39
+ },
40
+ {
41
+ vendor: "Azure",
42
+ category: "API",
43
+ regex: /\b(?:\.azure\.com|\.windows\.net|\.microsoft\.com\/api)\b/i,
44
+ severity: "medium",
45
+ },
46
+ {
47
+ vendor: "Azure",
48
+ category: "Config",
49
+ regex: /\b(?:AZURE_TENANT|AZURE_CLIENT_ID|AZURE_SUBSCRIPTION)\b/,
50
+ severity: "medium",
51
+ },
52
+ // GCP
53
+ { vendor: "GCP", category: "SDK", regex: /(?:@google-cloud\/|googleapis|google\.cloud)/i, severity: "high" },
54
+ {
55
+ vendor: "GCP",
56
+ category: "Service",
57
+ regex: /\b(?:BigQuery|Firestore|PubSub|CloudStorage|Spanner)\b/,
58
+ severity: "high",
59
+ },
60
+ { vendor: "GCP", category: "API", regex: /\b(?:googleapis\.com|\.gstatic\.com)\b/i, severity: "medium" },
61
+ {
62
+ vendor: "GCP",
63
+ category: "Config",
64
+ regex: /\b(?:GOOGLE_APPLICATION_CREDENTIALS|GCP_PROJECT|GCLOUD)\b/,
65
+ severity: "medium",
66
+ },
67
+ // Vercel
68
+ { vendor: "Vercel", category: "SDK", regex: /(?:@vercel\/|vercel\.com\/api)\b/i, severity: "medium" },
69
+ { vendor: "Vercel", category: "Service", regex: /\b(?:VERCEL_URL|VERCEL_ENV|vercel\.json)\b/, severity: "low" },
70
+ // Cloudflare
71
+ {
72
+ vendor: "Cloudflare",
73
+ category: "SDK",
74
+ regex: /(?:@cloudflare\/|cloudflare-workers|wrangler)\b/i,
75
+ severity: "medium",
76
+ },
77
+ {
78
+ vendor: "Cloudflare",
79
+ category: "Service",
80
+ regex: /\b(?:Workers|KVNamespace|DurableObject|R2Bucket)\b/,
81
+ severity: "medium",
82
+ },
83
+ // Firebase
84
+ { vendor: "Firebase", category: "SDK", regex: /(?:firebase\/|firebase-admin|@firebase\/)\b/i, severity: "high" },
85
+ {
86
+ vendor: "Firebase",
87
+ category: "Service",
88
+ regex: /\b(?:initializeApp|getFirestore|getAuth|getStorage)\b.*firebase/i,
89
+ severity: "high",
90
+ },
91
+ // Stripe
92
+ { vendor: "Stripe", category: "SDK", regex: /(?:stripe|@stripe\/)/i, severity: "medium" },
93
+ // Twilio
94
+ { vendor: "Twilio", category: "SDK", regex: /(?:twilio|@twilio\/)/i, severity: "medium" },
95
+ // Docker-specific
96
+ { vendor: "Docker", category: "Platform", regex: /\b(?:DOCKER_HOST|docker-compose|dockerfile)\b/i, severity: "low" },
97
+ // Vendor-specific ORMs
98
+ { vendor: "MongoDB", category: "Database", regex: /(?:mongoose|mongodb|MongoClient)\b/i, severity: "medium" },
99
+ {
100
+ vendor: "PostgreSQL",
101
+ category: "Database",
102
+ regex: /(?:pg|sequelize|knex|prisma).*(?:postgres|pg)\b/i,
103
+ severity: "low",
104
+ },
105
+ ];
106
+ // ─── Scanner ────────────────────────────────────────────────────────────────
107
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
108
+ const EXTS = new Set([
109
+ ".ts",
110
+ ".js",
111
+ ".py",
112
+ ".java",
113
+ ".cs",
114
+ ".go",
115
+ ".rb",
116
+ ".php",
117
+ ".rs",
118
+ ".yaml",
119
+ ".yml",
120
+ ".json",
121
+ ".env",
122
+ ".cfg",
123
+ ]);
124
+ function collectFiles(dir) {
125
+ const result = [];
126
+ function walk(d) {
127
+ let entries;
128
+ try {
129
+ entries = readdirSync(d);
130
+ }
131
+ catch {
132
+ return;
133
+ }
134
+ for (const name of entries) {
135
+ if (SKIP.has(name) || name.startsWith("."))
136
+ continue;
137
+ const full = join(d, name);
138
+ try {
139
+ const sub = readdirSync(full);
140
+ void sub;
141
+ walk(full);
142
+ }
143
+ catch {
144
+ if (EXTS.has(extname(name).toLowerCase()))
145
+ result.push(full);
146
+ }
147
+ }
148
+ }
149
+ walk(dir);
150
+ return result;
151
+ }
152
+ function scanFile(filePath) {
153
+ let content;
154
+ try {
155
+ content = readFileSync(filePath, "utf-8");
156
+ }
157
+ catch {
158
+ return [];
159
+ }
160
+ const lines = content.split("\n");
161
+ const matches = [];
162
+ for (let i = 0; i < lines.length; i++) {
163
+ for (const vp of VENDOR_PATTERNS) {
164
+ if (vp.regex.test(lines[i])) {
165
+ matches.push({
166
+ file: filePath,
167
+ line: i + 1,
168
+ vendor: vp.vendor,
169
+ category: vp.category,
170
+ pattern: lines[i].trim().substring(0, 80),
171
+ severity: vp.severity,
172
+ });
173
+ }
174
+ }
175
+ }
176
+ return matches;
177
+ }
178
+ // ─── CLI ────────────────────────────────────────────────────────────────────
179
+ export function runVendorLockDetect(argv) {
180
+ if (argv.includes("--help") || argv.includes("-h")) {
181
+ console.log(`
182
+ judges vendor-lock-detect — Scan for vendor-specific API dependencies
183
+
184
+ Usage:
185
+ judges vendor-lock-detect [dir]
186
+ judges vendor-lock-detect src/ --vendor AWS,GCP
187
+
188
+ Options:
189
+ --vendor <names> Filter by vendor (comma-separated: AWS,Azure,GCP,Firebase,...)
190
+ --severity <levels> Filter by severity (comma-separated)
191
+ --vendors List all detected vendor patterns
192
+ --format json JSON output
193
+ --help, -h Show this help
194
+
195
+ Vendors: AWS, Azure, GCP, Vercel, Cloudflare, Firebase, Stripe, Twilio, Docker, MongoDB, PostgreSQL
196
+ `);
197
+ return;
198
+ }
199
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
200
+ if (argv.includes("--vendors")) {
201
+ const grouped = {};
202
+ for (const vp of VENDOR_PATTERNS) {
203
+ if (!grouped[vp.vendor])
204
+ grouped[vp.vendor] = [];
205
+ if (!grouped[vp.vendor].includes(vp.category))
206
+ grouped[vp.vendor].push(vp.category);
207
+ }
208
+ if (format === "json") {
209
+ console.log(JSON.stringify(grouped, null, 2));
210
+ }
211
+ else {
212
+ console.log(`\n Vendor Patterns\n ──────────────────────────`);
213
+ for (const [vendor, categories] of Object.entries(grouped)) {
214
+ console.log(` ${vendor}: ${categories.join(", ")}`);
215
+ }
216
+ console.log("");
217
+ }
218
+ return;
219
+ }
220
+ const target = argv.find((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--")) || ".";
221
+ const vendorFilter = argv.find((_a, i) => argv[i - 1] === "--vendor");
222
+ const sevFilter = argv.find((_a, i) => argv[i - 1] === "--severity");
223
+ if (!existsSync(target)) {
224
+ console.error(` Path not found: ${target}`);
225
+ return;
226
+ }
227
+ let files;
228
+ try {
229
+ readdirSync(target);
230
+ files = collectFiles(target);
231
+ }
232
+ catch {
233
+ files = [target];
234
+ }
235
+ let allMatches = [];
236
+ for (const f of files)
237
+ allMatches.push(...scanFile(f));
238
+ if (vendorFilter) {
239
+ const allowed = vendorFilter.split(",");
240
+ allMatches = allMatches.filter((m) => allowed.includes(m.vendor));
241
+ }
242
+ if (sevFilter) {
243
+ const allowed = sevFilter.split(",");
244
+ allMatches = allMatches.filter((m) => allowed.includes(m.severity));
245
+ }
246
+ // Group by vendor
247
+ const byVendor = {};
248
+ for (const m of allMatches) {
249
+ if (!byVendor[m.vendor])
250
+ byVendor[m.vendor] = [];
251
+ byVendor[m.vendor].push(m);
252
+ }
253
+ const vendorCount = Object.keys(byVendor).length;
254
+ const portabilityScore = vendorCount <= 1 ? 90 : vendorCount <= 2 ? 60 : vendorCount <= 3 ? 40 : 20;
255
+ if (format === "json") {
256
+ console.log(JSON.stringify({
257
+ matches: allMatches,
258
+ byVendor,
259
+ portabilityScore,
260
+ scannedFiles: files.length,
261
+ timestamp: new Date().toISOString(),
262
+ }, null, 2));
263
+ }
264
+ else {
265
+ console.log(`\n Vendor Lock-In Detection — ${files.length} files`);
266
+ console.log(` Vendors detected: ${vendorCount} | Portability score: ${portabilityScore}/100`);
267
+ console.log(` ──────────────────────────`);
268
+ if (allMatches.length === 0) {
269
+ console.log(` ✅ No vendor lock-in detected\n`);
270
+ return;
271
+ }
272
+ for (const [vendor, matches] of Object.entries(byVendor)) {
273
+ console.log(`\n ${vendor} (${matches.length} references)`);
274
+ const categories = [...new Set(matches.map((m) => m.category))];
275
+ console.log(` Categories: ${categories.join(", ")}`);
276
+ for (const m of matches.slice(0, 5)) {
277
+ const icon = m.severity === "high" ? "🔴" : m.severity === "medium" ? "🟡" : "🟢";
278
+ console.log(` ${icon} ${m.file}:${m.line} — ${m.pattern}`);
279
+ }
280
+ if (matches.length > 5)
281
+ console.log(` ... and ${matches.length - 5} more`);
282
+ }
283
+ if (vendorCount > 1) {
284
+ console.log(`\n ⚠️ Multi-vendor dependency detected — consider abstraction layers`);
285
+ }
286
+ console.log("");
287
+ }
288
+ }
289
+ //# sourceMappingURL=vendor-lock-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor-lock-detect.js","sourceRoot":"","sources":["../../src/commands/vendor-lock-detect.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.50.0",
3
+ "version": "3.51.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.50.0",
10
+ "version": "3.51.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.50.0",
15
+ "version": "3.51.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }