@kevinrabun/judges 3.5.0 → 3.6.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 (58) hide show
  1. package/dist/api.d.ts +17 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +18 -0
  4. package/dist/api.js.map +1 -1
  5. package/dist/calibration.d.ts +58 -0
  6. package/dist/calibration.d.ts.map +1 -0
  7. package/dist/calibration.js +125 -0
  8. package/dist/calibration.js.map +1 -0
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +54 -0
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/benchmark.d.ts +100 -0
  13. package/dist/commands/benchmark.d.ts.map +1 -0
  14. package/dist/commands/benchmark.js +663 -0
  15. package/dist/commands/benchmark.js.map +1 -0
  16. package/dist/commands/config-share.d.ts +49 -0
  17. package/dist/commands/config-share.d.ts.map +1 -0
  18. package/dist/commands/config-share.js +181 -0
  19. package/dist/commands/config-share.js.map +1 -0
  20. package/dist/commands/feedback.d.ts +87 -0
  21. package/dist/commands/feedback.d.ts.map +1 -0
  22. package/dist/commands/feedback.js +320 -0
  23. package/dist/commands/feedback.js.map +1 -0
  24. package/dist/commands/language-packs.d.ts +43 -0
  25. package/dist/commands/language-packs.d.ts.map +1 -0
  26. package/dist/commands/language-packs.js +151 -0
  27. package/dist/commands/language-packs.js.map +1 -0
  28. package/dist/commands/rule.d.ts +50 -0
  29. package/dist/commands/rule.d.ts.map +1 -0
  30. package/dist/commands/rule.js +202 -0
  31. package/dist/commands/rule.js.map +1 -0
  32. package/dist/commands/smart-output.d.ts +39 -0
  33. package/dist/commands/smart-output.d.ts.map +1 -0
  34. package/dist/commands/smart-output.js +176 -0
  35. package/dist/commands/smart-output.js.map +1 -0
  36. package/dist/comparison.d.ts +68 -0
  37. package/dist/comparison.d.ts.map +1 -0
  38. package/dist/comparison.js +254 -0
  39. package/dist/comparison.js.map +1 -0
  40. package/dist/fingerprint.d.ts +40 -0
  41. package/dist/fingerprint.d.ts.map +1 -0
  42. package/dist/fingerprint.js +180 -0
  43. package/dist/fingerprint.js.map +1 -0
  44. package/dist/fix-history.d.ts +72 -0
  45. package/dist/fix-history.d.ts.map +1 -0
  46. package/dist/fix-history.js +127 -0
  47. package/dist/fix-history.js.map +1 -0
  48. package/dist/formatters/diagnostics.d.ts +82 -0
  49. package/dist/formatters/diagnostics.d.ts.map +1 -0
  50. package/dist/formatters/diagnostics.js +153 -0
  51. package/dist/formatters/diagnostics.js.map +1 -0
  52. package/dist/index.js +7 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/plugins.d.ts +103 -0
  55. package/dist/plugins.d.ts.map +1 -0
  56. package/dist/plugins.js +187 -0
  57. package/dist/plugins.js.map +1 -0
  58. package/package.json +17 -1
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Comparison Benchmarks — Compare judges against other code review tools
3
+ *
4
+ * Provides structured comparison data showing how judges performs relative to
5
+ * ESLint, SonarQube, Semgrep, CodeQL, and Bandit across multiple dimensions.
6
+ *
7
+ * This is data-driven: real comparisons require running the other tools,
8
+ * but we provide the framework and known capability matrices.
9
+ */
10
+ // ─── Tool Profiles ───────────────────────────────────────────────────────────
11
+ export const TOOL_PROFILES = [
12
+ {
13
+ name: "ESLint",
14
+ type: "linter",
15
+ languages: ["javascript", "typescript"],
16
+ categories: ["code-style", "best-practices", "potential-errors"],
17
+ strengths: ["Massive plugin ecosystem", "Auto-fixable rules", "Deep JS/TS knowledge", "IDE integration"],
18
+ weaknesses: ["JS/TS only", "No security focus by default", "No architectural analysis", "No AI-code detection"],
19
+ pricing: "Free (OSS)",
20
+ },
21
+ {
22
+ name: "SonarQube",
23
+ type: "sast",
24
+ languages: ["javascript", "typescript", "python", "java", "csharp", "go", "rust", "cpp"],
25
+ categories: ["bugs", "vulnerabilities", "code-smells", "security-hotspots"],
26
+ strengths: ["Multi-language", "Quality gates", "Historical tracking", "Enterprise features"],
27
+ weaknesses: ["Heavy infrastructure", "Slow analysis", "No AI-code detection", "Complex setup"],
28
+ pricing: "Free (Community) / $150+/mo (Enterprise)",
29
+ },
30
+ {
31
+ name: "Semgrep",
32
+ type: "sast",
33
+ languages: ["javascript", "typescript", "python", "java", "go", "rust", "ruby"],
34
+ categories: ["security", "best-practices", "correctness"],
35
+ strengths: ["Pattern-based rules", "Fast analysis", "Custom rules easy to write", "Good security coverage"],
36
+ weaknesses: [
37
+ "Limited architectural analysis",
38
+ "No AI-code detection",
39
+ "Cloud rules require account",
40
+ "No code review personas",
41
+ ],
42
+ pricing: "Free (OSS) / Team plans",
43
+ },
44
+ {
45
+ name: "CodeQL",
46
+ type: "sast",
47
+ languages: ["javascript", "typescript", "python", "java", "csharp", "go", "cpp", "ruby"],
48
+ categories: ["security", "correctness", "data-flow"],
49
+ strengths: [
50
+ "Deep data-flow analysis",
51
+ "GitHub-native integration",
52
+ "Powerful query language",
53
+ "Excellent security coverage",
54
+ ],
55
+ weaknesses: [
56
+ "Requires compilation for some languages",
57
+ "Complex query authoring",
58
+ "Slow analysis",
59
+ "No architectural/design review",
60
+ ],
61
+ pricing: "Free for OSS / GitHub Advanced Security",
62
+ },
63
+ {
64
+ name: "Bandit",
65
+ type: "sast",
66
+ languages: ["python"],
67
+ categories: ["security"],
68
+ strengths: ["Python-focused security", "Fast", "Simple setup", "CI-friendly"],
69
+ weaknesses: ["Python only", "Limited to security", "No architecture analysis", "High false-positive rate"],
70
+ pricing: "Free (OSS)",
71
+ },
72
+ ];
73
+ // ─── Capability Matrix ───────────────────────────────────────────────────────
74
+ /**
75
+ * The 10 trust dimensions that judges covers, mapped against other tools.
76
+ */
77
+ export const CAPABILITY_MATRIX = [
78
+ // Security
79
+ { tool: "judges", category: "Security (OWASP Top 10)", coverage: "full" },
80
+ { tool: "ESLint", category: "Security (OWASP Top 10)", coverage: "partial", notes: "With eslint-plugin-security" },
81
+ { tool: "SonarQube", category: "Security (OWASP Top 10)", coverage: "full" },
82
+ { tool: "Semgrep", category: "Security (OWASP Top 10)", coverage: "full" },
83
+ { tool: "CodeQL", category: "Security (OWASP Top 10)", coverage: "full" },
84
+ { tool: "Bandit", category: "Security (OWASP Top 10)", coverage: "partial", notes: "Python only" },
85
+ // Reliability
86
+ { tool: "judges", category: "Reliability (error handling, edge cases)", coverage: "full" },
87
+ { tool: "ESLint", category: "Reliability (error handling, edge cases)", coverage: "partial" },
88
+ { tool: "SonarQube", category: "Reliability (error handling, edge cases)", coverage: "full" },
89
+ { tool: "Semgrep", category: "Reliability (error handling, edge cases)", coverage: "partial" },
90
+ { tool: "CodeQL", category: "Reliability (error handling, edge cases)", coverage: "partial" },
91
+ { tool: "Bandit", category: "Reliability (error handling, edge cases)", coverage: "none" },
92
+ // Performance
93
+ { tool: "judges", category: "Performance (N+1, caching, async)", coverage: "full" },
94
+ { tool: "ESLint", category: "Performance (N+1, caching, async)", coverage: "partial", notes: "Async patterns only" },
95
+ { tool: "SonarQube", category: "Performance (N+1, caching, async)", coverage: "partial" },
96
+ { tool: "Semgrep", category: "Performance (N+1, caching, async)", coverage: "none" },
97
+ { tool: "CodeQL", category: "Performance (N+1, caching, async)", coverage: "none" },
98
+ { tool: "Bandit", category: "Performance (N+1, caching, async)", coverage: "none" },
99
+ // Accessibility
100
+ { tool: "judges", category: "Accessibility (WCAG)", coverage: "full" },
101
+ { tool: "ESLint", category: "Accessibility (WCAG)", coverage: "partial", notes: "jsx-a11y plugin" },
102
+ { tool: "SonarQube", category: "Accessibility (WCAG)", coverage: "none" },
103
+ { tool: "Semgrep", category: "Accessibility (WCAG)", coverage: "none" },
104
+ { tool: "CodeQL", category: "Accessibility (WCAG)", coverage: "none" },
105
+ { tool: "Bandit", category: "Accessibility (WCAG)", coverage: "none" },
106
+ // Architecture / Code Structure
107
+ { tool: "judges", category: "Architecture / Code Structure", coverage: "full" },
108
+ { tool: "ESLint", category: "Architecture / Code Structure", coverage: "partial", notes: "Complexity rules only" },
109
+ { tool: "SonarQube", category: "Architecture / Code Structure", coverage: "partial" },
110
+ { tool: "Semgrep", category: "Architecture / Code Structure", coverage: "none" },
111
+ { tool: "CodeQL", category: "Architecture / Code Structure", coverage: "none" },
112
+ { tool: "Bandit", category: "Architecture / Code Structure", coverage: "none" },
113
+ // AI Code Detection
114
+ { tool: "judges", category: "AI Code Detection", coverage: "full" },
115
+ { tool: "ESLint", category: "AI Code Detection", coverage: "none" },
116
+ { tool: "SonarQube", category: "AI Code Detection", coverage: "none" },
117
+ { tool: "Semgrep", category: "AI Code Detection", coverage: "none" },
118
+ { tool: "CodeQL", category: "AI Code Detection", coverage: "none" },
119
+ { tool: "Bandit", category: "AI Code Detection", coverage: "none" },
120
+ // Compliance
121
+ { tool: "judges", category: "Compliance (FedRAMP, GDPR)", coverage: "full" },
122
+ { tool: "ESLint", category: "Compliance (FedRAMP, GDPR)", coverage: "none" },
123
+ { tool: "SonarQube", category: "Compliance (FedRAMP, GDPR)", coverage: "partial", notes: "Some OWASP mapping" },
124
+ { tool: "Semgrep", category: "Compliance (FedRAMP, GDPR)", coverage: "partial", notes: "Via custom rules" },
125
+ { tool: "CodeQL", category: "Compliance (FedRAMP, GDPR)", coverage: "none" },
126
+ { tool: "Bandit", category: "Compliance (FedRAMP, GDPR)", coverage: "none" },
127
+ // API Design
128
+ { tool: "judges", category: "API Design Review", coverage: "full" },
129
+ { tool: "ESLint", category: "API Design Review", coverage: "none" },
130
+ { tool: "SonarQube", category: "API Design Review", coverage: "none" },
131
+ { tool: "Semgrep", category: "API Design Review", coverage: "none" },
132
+ { tool: "CodeQL", category: "API Design Review", coverage: "none" },
133
+ { tool: "Bandit", category: "API Design Review", coverage: "none" },
134
+ // Cost & Cloud Readiness
135
+ { tool: "judges", category: "Cost & Cloud Readiness", coverage: "full" },
136
+ { tool: "ESLint", category: "Cost & Cloud Readiness", coverage: "none" },
137
+ { tool: "SonarQube", category: "Cost & Cloud Readiness", coverage: "none" },
138
+ { tool: "Semgrep", category: "Cost & Cloud Readiness", coverage: "none" },
139
+ { tool: "CodeQL", category: "Cost & Cloud Readiness", coverage: "none" },
140
+ { tool: "Bandit", category: "Cost & Cloud Readiness", coverage: "none" },
141
+ // CI/CD Pipeline Review
142
+ { tool: "judges", category: "CI/CD Pipeline Review", coverage: "full" },
143
+ { tool: "ESLint", category: "CI/CD Pipeline Review", coverage: "none" },
144
+ { tool: "SonarQube", category: "CI/CD Pipeline Review", coverage: "none" },
145
+ { tool: "Semgrep", category: "CI/CD Pipeline Review", coverage: "partial", notes: "Dockerfile rules" },
146
+ { tool: "CodeQL", category: "CI/CD Pipeline Review", coverage: "none" },
147
+ { tool: "Bandit", category: "CI/CD Pipeline Review", coverage: "none" },
148
+ ];
149
+ // ─── Comparison Logic ────────────────────────────────────────────────────────
150
+ /**
151
+ * Generate a capability summary comparing judges to a specific tool.
152
+ */
153
+ export function compareCapabilities(toolName) {
154
+ const categories = [...new Set(CAPABILITY_MATRIX.map((c) => c.category))];
155
+ const judgesOnly = [];
156
+ const otherOnly = [];
157
+ const both = [];
158
+ const judgesPartial = [];
159
+ const otherPartial = [];
160
+ for (const cat of categories) {
161
+ const judgesCap = CAPABILITY_MATRIX.find((c) => c.tool === "judges" && c.category === cat);
162
+ const otherCap = CAPABILITY_MATRIX.find((c) => c.tool.toLowerCase() === toolName.toLowerCase() && c.category === cat);
163
+ if (!otherCap || otherCap.coverage === "none") {
164
+ if (judgesCap && judgesCap.coverage !== "none") {
165
+ judgesOnly.push(cat);
166
+ }
167
+ }
168
+ else if (judgesCap?.coverage === "full" && otherCap.coverage === "full") {
169
+ both.push(cat);
170
+ }
171
+ else if (judgesCap?.coverage === "full" && otherCap.coverage === "partial") {
172
+ judgesPartial.push(cat);
173
+ }
174
+ else if (judgesCap?.coverage === "partial" && otherCap.coverage === "full") {
175
+ otherPartial.push(cat);
176
+ }
177
+ }
178
+ return { judgesOnly, otherOnly, both, judgesPartial, otherPartial };
179
+ }
180
+ /**
181
+ * Format a comparison report as text.
182
+ */
183
+ export function formatComparisonReport(toolName) {
184
+ const profile = TOOL_PROFILES.find((t) => t.name.toLowerCase() === toolName.toLowerCase());
185
+ const comparison = compareCapabilities(toolName);
186
+ const lines = [];
187
+ lines.push(`╔══════════════════════════════════════════════════════════════╗`);
188
+ lines.push(`║ judges vs ${(profile?.name || toolName).padEnd(48)} ║`);
189
+ lines.push(`╚══════════════════════════════════════════════════════════════╝`);
190
+ lines.push("");
191
+ if (profile) {
192
+ lines.push(`Type: ${profile.type} | Languages: ${profile.languages.length} | Pricing: ${profile.pricing}`);
193
+ lines.push("");
194
+ }
195
+ if (comparison.judgesOnly.length > 0) {
196
+ lines.push(`✅ Unique to judges (${comparison.judgesOnly.length} categories):`);
197
+ for (const cat of comparison.judgesOnly) {
198
+ lines.push(` • ${cat}`);
199
+ }
200
+ lines.push("");
201
+ }
202
+ if (comparison.both.length > 0) {
203
+ lines.push(`🤝 Both tools cover fully (${comparison.both.length} categories):`);
204
+ for (const cat of comparison.both) {
205
+ lines.push(` • ${cat}`);
206
+ }
207
+ lines.push("");
208
+ }
209
+ if (comparison.judgesPartial.length > 0) {
210
+ lines.push(`📊 judges covers fully, ${toolName} partially:`);
211
+ for (const cat of comparison.judgesPartial) {
212
+ lines.push(` • ${cat}`);
213
+ }
214
+ lines.push("");
215
+ }
216
+ if (comparison.otherPartial.length > 0) {
217
+ lines.push(`📊 ${toolName} covers fully, judges partially:`);
218
+ for (const cat of comparison.otherPartial) {
219
+ lines.push(` • ${cat}`);
220
+ }
221
+ lines.push("");
222
+ }
223
+ lines.push("─".repeat(62));
224
+ lines.push(`judges covers ${comparison.judgesOnly.length + comparison.both.length + comparison.judgesPartial.length}/10 categories ` +
225
+ `vs ${toolName}'s ${comparison.both.length + comparison.otherPartial.length}/10`);
226
+ return lines.join("\n");
227
+ }
228
+ /**
229
+ * Generate a full comparison matrix across all tools.
230
+ */
231
+ export function formatFullComparisonMatrix() {
232
+ const tools = ["judges", ...TOOL_PROFILES.map((t) => t.name)];
233
+ const categories = [...new Set(CAPABILITY_MATRIX.map((c) => c.category))];
234
+ const lines = [];
235
+ lines.push("Capability Matrix: judges vs Other Tools");
236
+ lines.push("═".repeat(90));
237
+ // Header
238
+ const header = "Category".padEnd(40) + tools.map((t) => t.substring(0, 8).padEnd(10)).join("");
239
+ lines.push(header);
240
+ lines.push("─".repeat(90));
241
+ for (const cat of categories) {
242
+ let row = cat.substring(0, 38).padEnd(40);
243
+ for (const tool of tools) {
244
+ const cap = CAPABILITY_MATRIX.find((c) => c.tool.toLowerCase() === tool.toLowerCase() && c.category === cat);
245
+ const icon = cap?.coverage === "full" ? "●" : cap?.coverage === "partial" ? "◐" : "○";
246
+ row += icon.padEnd(10);
247
+ }
248
+ lines.push(row);
249
+ }
250
+ lines.push("─".repeat(90));
251
+ lines.push("● = Full coverage ◐ = Partial ○ = None");
252
+ return lines.join("\n");
253
+ }
254
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","sourceRoot":"","sources":["../src/comparison.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * AI Code Fingerprinting — Detect AI-generated code patterns
3
+ *
4
+ * Identifies patterns commonly produced by AI code generators (GitHub Copilot,
5
+ * ChatGPT, Claude, etc.) to flag code that may need extra review.
6
+ *
7
+ * Signals include:
8
+ * - Generic variable naming patterns
9
+ * - Overly verbose/uniform comment styles
10
+ * - Common AI boilerplate patterns
11
+ * - Missing error handling in generated code
12
+ * - Suspiciously complete implementations without tests
13
+ */
14
+ import type { Finding } from "./types.js";
15
+ export interface AiFingerprint {
16
+ /** Confidence that code is AI-generated (0-1) */
17
+ aiProbability: number;
18
+ /** Individual signals detected */
19
+ signals: AiSignal[];
20
+ /** Risk level based on probability */
21
+ riskLevel: "high" | "medium" | "low" | "none";
22
+ /** Summary text */
23
+ summary: string;
24
+ }
25
+ export interface AiSignal {
26
+ name: string;
27
+ description: string;
28
+ weight: number;
29
+ matches: number;
30
+ evidence?: string;
31
+ }
32
+ /**
33
+ * Analyze code for AI-generated patterns and return a fingerprint.
34
+ */
35
+ export declare function fingerprintCode(code: string, language?: string): AiFingerprint;
36
+ /**
37
+ * Convert AI fingerprint to findings for inclusion in evaluation results.
38
+ */
39
+ export declare function fingerprintToFindings(fingerprint: AiFingerprint): Finding[];
40
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,YAAY,CAAC;AAIpD,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,sCAAsC;IACtC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9C,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2HD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAqB,GAAG,aAAa,CA+B5F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,EAAE,CAiC3E"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * AI Code Fingerprinting — Detect AI-generated code patterns
3
+ *
4
+ * Identifies patterns commonly produced by AI code generators (GitHub Copilot,
5
+ * ChatGPT, Claude, etc.) to flag code that may need extra review.
6
+ *
7
+ * Signals include:
8
+ * - Generic variable naming patterns
9
+ * - Overly verbose/uniform comment styles
10
+ * - Common AI boilerplate patterns
11
+ * - Missing error handling in generated code
12
+ * - Suspiciously complete implementations without tests
13
+ */
14
+ const SIGNAL_DETECTORS = [
15
+ {
16
+ name: "todo-placeholder",
17
+ description: "TODO/FIXME placeholders common in AI-generated code",
18
+ weight: 0.15,
19
+ detect: (code) => {
20
+ const matches = (code.match(/\/\/\s*TODO:?\s*(implement|add|fix|handle|update)/gi) || []).length;
21
+ return { matches, evidence: matches > 0 ? "TODO placeholders without implementation" : undefined };
22
+ },
23
+ },
24
+ {
25
+ name: "generic-naming",
26
+ description: "Generic variable names (data, result, response, temp, item, value)",
27
+ weight: 0.1,
28
+ detect: (code) => {
29
+ const generic = /\b(?:const|let|var)\s+(?:data|result|response|temp|item|value|output|input|obj|arr)\b/gi;
30
+ const matches = (code.match(generic) || []).length;
31
+ const lines = code.split("\n").length;
32
+ // Only signal if ratio is high
33
+ return { matches: matches > lines * 0.05 ? matches : 0 };
34
+ },
35
+ },
36
+ {
37
+ name: "uniform-comments",
38
+ description: "Uniform JSDoc/docstring style on every function",
39
+ weight: 0.12,
40
+ detect: (code) => {
41
+ const jsdocBlocks = (code.match(/\/\*\*[\s\S]*?\*\//g) || []).length;
42
+ const functions = (code.match(/(?:function\s+\w+|(?:const|let)\s+\w+\s*=\s*(?:async\s+)?(?:\([^)]*\)|[^=])\s*=>|(?:async\s+)?\w+\s*\([^)]*\)\s*(?::\s*\w+\s*)?\{)/g) || []).length;
43
+ // 100% documentation coverage is unusual
44
+ const hasUniformDocs = functions > 2 && jsdocBlocks >= functions;
45
+ return { matches: hasUniformDocs ? jsdocBlocks : 0 };
46
+ },
47
+ },
48
+ {
49
+ name: "example-domains",
50
+ description: "Example domains/placeholder URLs from training data",
51
+ weight: 0.2,
52
+ detect: (code) => {
53
+ const pattern = /(?:example\.com|example\.org|test\.com|localhost:(?:3000|8080|5000)|foo\.bar|acme\.com)/gi;
54
+ const matches = (code.match(pattern) || []).length;
55
+ return { matches, evidence: matches > 0 ? "Example domains found" : undefined };
56
+ },
57
+ },
58
+ {
59
+ name: "boilerplate-express",
60
+ description: "Standard Express.js boilerplate patterns",
61
+ weight: 0.08,
62
+ detect: (code) => {
63
+ const patterns = [
64
+ /app\.listen\s*\(\s*(?:3000|8080|port)/i,
65
+ /app\.use\s*\(\s*express\.json\s*\(\s*\)\s*\)/i,
66
+ /app\.get\s*\(\s*['"]\/['"].*?Hello/i,
67
+ ];
68
+ const matches = patterns.filter((p) => p.test(code)).length;
69
+ return { matches };
70
+ },
71
+ },
72
+ {
73
+ name: "error-handling-gaps",
74
+ description: "Async code without error handling (common AI omission)",
75
+ weight: 0.1,
76
+ detect: (code) => {
77
+ const asyncFns = (code.match(/async\s+(?:function\s+\w+|\w+\s*=\s*async)/g) || []).length;
78
+ const tryCatch = (code.match(/try\s*\{/g) || []).length;
79
+ const catchBlocks = (code.match(/\.catch\s*\(/g) || []).length;
80
+ const unhandled = asyncFns > 0 && tryCatch + catchBlocks < asyncFns * 0.5;
81
+ return { matches: unhandled ? asyncFns - tryCatch - catchBlocks : 0 };
82
+ },
83
+ },
84
+ {
85
+ name: "placeholder-credentials",
86
+ description: "Placeholder API keys/tokens from AI training data",
87
+ weight: 0.25,
88
+ detect: (code) => {
89
+ const pattern = /(?:sk-[a-zA-Z0-9]{20,}|your[_-]?api[_-]?key|REPLACE_?ME|YOUR_?TOKEN|insert[_-]?(?:key|token|secret))/gi;
90
+ const matches = (code.match(pattern) || []).length;
91
+ return { matches, evidence: matches > 0 ? "Placeholder credentials detected" : undefined };
92
+ },
93
+ },
94
+ {
95
+ name: "excessive-inline-comments",
96
+ description: "Line-by-line explanatory comments (AI teaching style)",
97
+ weight: 0.12,
98
+ detect: (code) => {
99
+ const lines = code.split("\n");
100
+ const codeLines = lines.filter((l) => l.trim() && !l.trim().startsWith("//") && !l.trim().startsWith("*"));
101
+ const commentLines = lines.filter((l) => l.trim().startsWith("//"));
102
+ const ratio = codeLines.length > 0 ? commentLines.length / codeLines.length : 0;
103
+ return { matches: ratio > 0.5 ? commentLines.length : 0 };
104
+ },
105
+ },
106
+ {
107
+ name: "missing-tests",
108
+ description: "Complex implementation file without corresponding test references",
109
+ weight: 0.08,
110
+ detect: (code) => {
111
+ const hasExports = /export\s+(?:function|class|const|interface|type)/g.test(code);
112
+ const hasTestRef = /(?:describe|it|test|expect|assert|jest|mocha|vitest)\b/g.test(code);
113
+ const isComplex = code.split("\n").length > 50;
114
+ return { matches: hasExports && isComplex && !hasTestRef ? 1 : 0 };
115
+ },
116
+ },
117
+ ];
118
+ // ─── Fingerprinting ──────────────────────────────────────────────────────────
119
+ /**
120
+ * Analyze code for AI-generated patterns and return a fingerprint.
121
+ */
122
+ export function fingerprintCode(code, language = "typescript") {
123
+ const signals = [];
124
+ let totalWeight = 0;
125
+ let matchedWeight = 0;
126
+ for (const detector of SIGNAL_DETECTORS) {
127
+ const result = detector.detect(code, language);
128
+ totalWeight += detector.weight;
129
+ if (result.matches > 0) {
130
+ matchedWeight += detector.weight;
131
+ signals.push({
132
+ name: detector.name,
133
+ description: detector.description,
134
+ weight: detector.weight,
135
+ matches: result.matches,
136
+ evidence: result.evidence,
137
+ });
138
+ }
139
+ }
140
+ const aiProbability = totalWeight > 0 ? Math.min(1, matchedWeight / totalWeight) : 0;
141
+ const riskLevel = aiProbability >= 0.6 ? "high" : aiProbability >= 0.3 ? "medium" : aiProbability >= 0.1 ? "low" : "none";
142
+ const summary = riskLevel === "none"
143
+ ? "No significant AI-generated code signals detected."
144
+ : `${signals.length} AI-generated code signal(s) detected (${Math.round(aiProbability * 100)}% probability).`;
145
+ return { aiProbability, signals, riskLevel, summary };
146
+ }
147
+ /**
148
+ * Convert AI fingerprint to findings for inclusion in evaluation results.
149
+ */
150
+ export function fingerprintToFindings(fingerprint) {
151
+ if (fingerprint.riskLevel === "none")
152
+ return [];
153
+ const findings = [];
154
+ if (fingerprint.riskLevel === "high" || fingerprint.riskLevel === "medium") {
155
+ findings.push({
156
+ ruleId: "AICS-FP-001",
157
+ title: "Code appears to be AI-generated",
158
+ severity: (fingerprint.riskLevel === "high" ? "medium" : "low"),
159
+ description: `This code has a ${Math.round(fingerprint.aiProbability * 100)}% probability of being AI-generated. ` +
160
+ `Signals: ${fingerprint.signals.map((s) => s.name).join(", ")}. ` +
161
+ `AI-generated code may contain hallucinations, security vulnerabilities, or incorrect assumptions.`,
162
+ recommendation: "Review AI-generated code carefully. Verify business logic, security patterns, and edge cases.",
163
+ lineNumbers: [1],
164
+ });
165
+ }
166
+ for (const signal of fingerprint.signals) {
167
+ if (signal.weight >= 0.15) {
168
+ findings.push({
169
+ ruleId: `AICS-FP-${signal.name.toUpperCase().replace(/-/g, "")}`,
170
+ title: signal.description,
171
+ severity: "info",
172
+ description: `Detected ${signal.matches} instance(s) of "${signal.name}" pattern. ${signal.evidence || ""}`,
173
+ recommendation: "Verify this code was intentionally written and not blindly accepted from an AI tool.",
174
+ lineNumbers: [1],
175
+ });
176
+ }
177
+ }
178
+ return findings;
179
+ }
180
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Learning from Fixes — Track which auto-fix patches are accepted or rejected
3
+ *
4
+ * Records fix application outcomes to improve patch quality over time.
5
+ * Integrates with the feedback system to correlate fix acceptance with
6
+ * finding accuracy.
7
+ *
8
+ * Data stored in .judges-fix-history.json
9
+ */
10
+ export interface FixOutcome {
11
+ /** Which rule generated the fix */
12
+ ruleId: string;
13
+ /** Whether the fix was applied */
14
+ accepted: boolean;
15
+ /** Whether it was later reverted */
16
+ reverted?: boolean;
17
+ /** File that was fixed */
18
+ filePath?: string;
19
+ /** Timestamp */
20
+ timestamp: string;
21
+ /** Optional reason for rejection */
22
+ reason?: string;
23
+ }
24
+ export interface FixHistory {
25
+ version: string;
26
+ outcomes: FixOutcome[];
27
+ }
28
+ export interface FixStats {
29
+ totalFixes: number;
30
+ accepted: number;
31
+ rejected: number;
32
+ reverted: number;
33
+ acceptanceRate: number;
34
+ /** Per-rule acceptance rates */
35
+ byRule: Record<string, {
36
+ total: number;
37
+ accepted: number;
38
+ rate: number;
39
+ }>;
40
+ }
41
+ export declare function loadFixHistory(dir?: string): FixHistory;
42
+ export declare function saveFixHistory(history: FixHistory, dir?: string): void;
43
+ /**
44
+ * Record that a fix was accepted (applied).
45
+ */
46
+ export declare function recordFixAccepted(ruleId: string, filePath?: string, dir?: string): void;
47
+ /**
48
+ * Record that a fix was rejected (skipped).
49
+ */
50
+ export declare function recordFixRejected(ruleId: string, reason?: string, filePath?: string, dir?: string): void;
51
+ /**
52
+ * Record that a previously applied fix was reverted.
53
+ */
54
+ export declare function recordFixReverted(ruleId: string, filePath?: string, dir?: string): void;
55
+ /**
56
+ * Compute fix acceptance statistics from history.
57
+ */
58
+ export declare function computeFixStats(history?: FixHistory, dir?: string): FixStats;
59
+ /**
60
+ * Get fix acceptance rate for a specific rule.
61
+ * Returns undefined if no data available for that rule.
62
+ */
63
+ export declare function getFixAcceptanceRate(ruleId: string, dir?: string): number | undefined;
64
+ /**
65
+ * Get rules with low acceptance rates (potential problematic patches).
66
+ */
67
+ export declare function getLowAcceptanceRules(threshold?: number, minSamples?: number, dir?: string): Array<{
68
+ ruleId: string;
69
+ rate: number;
70
+ total: number;
71
+ }>;
72
+ //# sourceMappingURL=fix-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-history.d.ts","sourceRoot":"","sources":["../src/fix-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAMD,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAY,GAAG,UAAU,CAU5D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,GAAE,MAAY,GAAG,IAAI,CAG3E;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CASvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAUxG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAUvF;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAiC5E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,MAAY,EACvB,UAAU,GAAE,MAAU,EACtB,GAAG,CAAC,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAMxD"}