@kevinrabun/judges 3.28.0 → 3.29.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +125 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/calibration-dashboard.d.ts +2 -0
- package/dist/commands/calibration-dashboard.d.ts.map +1 -0
- package/dist/commands/calibration-dashboard.js +97 -0
- package/dist/commands/calibration-dashboard.js.map +1 -0
- package/dist/commands/community-patterns.d.ts +2 -0
- package/dist/commands/community-patterns.d.ts.map +1 -0
- package/dist/commands/community-patterns.js +132 -0
- package/dist/commands/community-patterns.js.map +1 -0
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +91 -0
- package/dist/commands/diff.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -1
- package/dist/evaluators/api-contract.d.ts +10 -0
- package/dist/evaluators/api-contract.d.ts.map +1 -0
- package/dist/evaluators/api-contract.js +204 -0
- package/dist/evaluators/api-contract.js.map +1 -0
- package/dist/evaluators/api-design.d.ts.map +1 -1
- package/dist/evaluators/api-design.js +2 -2
- package/dist/evaluators/api-design.js.map +1 -1
- package/dist/evaluators/code-structure.d.ts.map +1 -1
- package/dist/evaluators/code-structure.js +8 -2
- package/dist/evaluators/code-structure.js.map +1 -1
- package/dist/evaluators/index.d.ts.map +1 -1
- package/dist/evaluators/index.js +33 -1
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/intent-alignment.d.ts +15 -0
- package/dist/evaluators/intent-alignment.d.ts.map +1 -0
- package/dist/evaluators/intent-alignment.js +243 -0
- package/dist/evaluators/intent-alignment.js.map +1 -0
- package/dist/evaluators/model-fingerprint.d.ts +3 -0
- package/dist/evaluators/model-fingerprint.d.ts.map +1 -0
- package/dist/evaluators/model-fingerprint.js +152 -0
- package/dist/evaluators/model-fingerprint.js.map +1 -0
- package/dist/evaluators/multi-turn-coherence.d.ts +14 -0
- package/dist/evaluators/multi-turn-coherence.d.ts.map +1 -0
- package/dist/evaluators/multi-turn-coherence.js +150 -0
- package/dist/evaluators/multi-turn-coherence.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/judges/api-contract.d.ts +3 -0
- package/dist/judges/api-contract.d.ts.map +1 -0
- package/dist/judges/api-contract.js +28 -0
- package/dist/judges/api-contract.js.map +1 -0
- package/dist/judges/index.d.ts.map +1 -1
- package/dist/judges/index.js +16 -0
- package/dist/judges/index.js.map +1 -1
- package/dist/judges/intent-alignment.d.ts +3 -0
- package/dist/judges/intent-alignment.d.ts.map +1 -0
- package/dist/judges/intent-alignment.js +28 -0
- package/dist/judges/intent-alignment.js.map +1 -0
- package/dist/judges/model-fingerprint.d.ts +3 -0
- package/dist/judges/model-fingerprint.d.ts.map +1 -0
- package/dist/judges/model-fingerprint.js +30 -0
- package/dist/judges/model-fingerprint.js.map +1 -0
- package/dist/judges/multi-turn-coherence.d.ts +3 -0
- package/dist/judges/multi-turn-coherence.d.ts.map +1 -0
- package/dist/judges/multi-turn-coherence.js +27 -0
- package/dist/judges/multi-turn-coherence.js.map +1 -0
- package/dist/patches/index.d.ts.map +1 -1
- package/dist/patches/index.js +372 -0
- package/dist/patches/index.js.map +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +76 -0
- package/dist/presets.js.map +1 -1
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/server.json +3 -3
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { isCommentLine } from "./shared.js";
|
|
2
|
+
/**
|
|
3
|
+
* Intent-Alignment evaluator — detects mismatches between code's stated intent
|
|
4
|
+
* (names, comments, docstrings) and its actual implementation.
|
|
5
|
+
*
|
|
6
|
+
* Rules:
|
|
7
|
+
* INTENT-001 Stub function with TODO / not-implemented body
|
|
8
|
+
* INTENT-002 Security-sensitive stub (validate/auth/encrypt/sanitize)
|
|
9
|
+
* INTENT-003 Empty or trivial function body
|
|
10
|
+
* INTENT-004 Placeholder return (hardcoded value despite dynamic name)
|
|
11
|
+
* INTENT-005 Docstring param mismatch
|
|
12
|
+
* INTENT-006 Misleading function name (promises behavior it doesn't perform)
|
|
13
|
+
*/
|
|
14
|
+
export function analyzeIntentAlignment(code, _language) {
|
|
15
|
+
const findings = [];
|
|
16
|
+
const lines = code.split("\n");
|
|
17
|
+
const prefix = "INTENT";
|
|
18
|
+
// ── INTENT-001 / INTENT-002: Stub functions ──────────────────────────────
|
|
19
|
+
// Detect function bodies that contain only TODO/FIXME/throw "not implemented"
|
|
20
|
+
const stubPattern = /(?:function\s+(\w+)|(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?(?:\([^)]*\)|[^=])\s*=>|(\w+)\s*\([^)]*\)\s*(?::\s*\w[^{]*?)?\{|def\s+(\w+)|fn\s+(\w+)|(?:public|private|protected|internal)\s+(?:(?:static|async|override|virtual)\s+)*\w+\s+(\w+)\s*\()/;
|
|
21
|
+
const todoStubBody = /^\s*(?:\/\/\s*TODO|#\s*TODO|\/\*\s*TODO|throw\s+(?:new\s+)?(?:Error|NotImplementedError|UnsupportedOperationException)\s*\(\s*["'](?:not implemented|todo|fixme|stub)|pass\s*(?:#.*)?$|raise\s+NotImplementedError|unimplemented!\(\)|todo!\(\))/im;
|
|
22
|
+
const securityNames = /^(?:validate|verify|authenticate|authorize|check(?:Auth|Permission|Access|Token)|encrypt|decrypt|sanitize|escape|hash(?:Password)?|signToken|verifyToken|filterXss|checkCsrf)/i;
|
|
23
|
+
for (let i = 0; i < lines.length; i++) {
|
|
24
|
+
if (isCommentLine(lines[i]))
|
|
25
|
+
continue;
|
|
26
|
+
const fnMatch = lines[i].match(stubPattern);
|
|
27
|
+
if (!fnMatch)
|
|
28
|
+
continue;
|
|
29
|
+
const fnName = fnMatch[1] || fnMatch[2] || fnMatch[3] || fnMatch[4] || fnMatch[5] || fnMatch[6];
|
|
30
|
+
if (!fnName)
|
|
31
|
+
continue;
|
|
32
|
+
// Look at the next 5 non-empty lines for stub indicators
|
|
33
|
+
const bodyLines = [];
|
|
34
|
+
for (let j = i + 1; j < Math.min(i + 8, lines.length); j++) {
|
|
35
|
+
const trimmed = lines[j].trim();
|
|
36
|
+
if (trimmed === "{" || trimmed === "")
|
|
37
|
+
continue;
|
|
38
|
+
if (trimmed === "}" || trimmed === "}," || trimmed === "};")
|
|
39
|
+
break;
|
|
40
|
+
bodyLines.push(trimmed);
|
|
41
|
+
}
|
|
42
|
+
if (bodyLines.length === 0)
|
|
43
|
+
continue;
|
|
44
|
+
const bodyText = bodyLines.join("\n");
|
|
45
|
+
if (todoStubBody.test(bodyText)) {
|
|
46
|
+
// Skip explicitly deprecated/legacy functions — stubs are expected there
|
|
47
|
+
if (/^(?:old_|legacy_|deprecated_)/i.test(fnName) || /\bdeprecated\b/i.test(bodyText))
|
|
48
|
+
continue;
|
|
49
|
+
const isSecurity = securityNames.test(fnName);
|
|
50
|
+
findings.push({
|
|
51
|
+
ruleId: `${prefix}-${isSecurity ? "002" : "001"}`,
|
|
52
|
+
severity: isSecurity ? "critical" : "medium",
|
|
53
|
+
title: isSecurity ? `Security-sensitive stub: \`${fnName}()\`` : `Stub function: \`${fnName}()\``,
|
|
54
|
+
description: isSecurity
|
|
55
|
+
? `Function \`${fnName}()\` has a security-sensitive name but its body is a stub (TODO/throw). ` +
|
|
56
|
+
"This means the security check is not actually performed, leaving the system unprotected."
|
|
57
|
+
: `Function \`${fnName}()\` contains only a TODO comment or throws "not implemented". ` +
|
|
58
|
+
"Stub functions that reach production can cause runtime failures.",
|
|
59
|
+
lineNumbers: [i + 1],
|
|
60
|
+
recommendation: isSecurity
|
|
61
|
+
? `Implement the ${fnName}() function with proper security logic, or remove it and handle the security concern at a higher level.`
|
|
62
|
+
: `Implement the function body or remove it if it's no longer needed. If it's intentionally deferred, add a tracking issue reference.`,
|
|
63
|
+
reference: "Code Review — Stub & Placeholder Detection",
|
|
64
|
+
confidence: isSecurity ? 0.88 : 0.75,
|
|
65
|
+
provenance: "intent-alignment",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ── INTENT-003: Empty / trivial function bodies ──────────────────────────
|
|
70
|
+
const emptyFnPattern = /(?:function\s+(\w+)|(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?(?:\([^)]*\)|[^=])\s*=>|(\w+)\s*\([^)]*\)\s*(?::\s*\w[^{]*?)?\{|def\s+(\w+)|fn\s+(\w+))/;
|
|
71
|
+
// Require at least 2 empty functions to reduce false positives — a single
|
|
72
|
+
// empty function (e.g. a default trait method, callback stub, or protocol
|
|
73
|
+
// conformance) is common in otherwise well-written code.
|
|
74
|
+
const emptyFnLines = [];
|
|
75
|
+
for (let i = 0; i < lines.length; i++) {
|
|
76
|
+
if (isCommentLine(lines[i]))
|
|
77
|
+
continue;
|
|
78
|
+
const fnMatch = lines[i].match(emptyFnPattern);
|
|
79
|
+
if (!fnMatch)
|
|
80
|
+
continue;
|
|
81
|
+
const fnName = fnMatch[1] || fnMatch[2] || fnMatch[3] || fnMatch[4] || fnMatch[5];
|
|
82
|
+
if (!fnName)
|
|
83
|
+
continue;
|
|
84
|
+
// Check for empty body: { } or => {} or pass
|
|
85
|
+
const nextLines = [];
|
|
86
|
+
for (let j = i + 1; j < Math.min(i + 4, lines.length); j++) {
|
|
87
|
+
nextLines.push(lines[j].trim());
|
|
88
|
+
}
|
|
89
|
+
const next = nextLines.join(" ").trim();
|
|
90
|
+
// Empty body patterns
|
|
91
|
+
const isEmpty = /^(?:\{?\s*\}|return\s*;?\s*\}|return\s+(?:null|undefined|None|nil|false|"")\s*;?\s*\}|pass\s*$)/.test(next);
|
|
92
|
+
if (isEmpty && fnName.length > 2 && !/^(?:noop|empty|stub|mock|fake|dummy|_)/i.test(fnName)) {
|
|
93
|
+
emptyFnLines.push(i + 1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (emptyFnLines.length > 1) {
|
|
97
|
+
findings.push({
|
|
98
|
+
ruleId: `${prefix}-003`,
|
|
99
|
+
severity: "medium",
|
|
100
|
+
title: `Empty function bodies (${emptyFnLines.length} found)`,
|
|
101
|
+
description: `${emptyFnLines.length} functions have empty or trivial bodies (return null/undefined/false with no logic). ` +
|
|
102
|
+
"If this is intentional, consider naming them with a 'noop' prefix or adding a comment.",
|
|
103
|
+
lineNumbers: emptyFnLines.slice(0, 5),
|
|
104
|
+
recommendation: "Implement the function logic, or if they are deliberate no-ops, rename them to signal intent.",
|
|
105
|
+
reference: "Code Review — Empty Implementation Detection",
|
|
106
|
+
confidence: 0.65,
|
|
107
|
+
provenance: "intent-alignment",
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// ── INTENT-004: Placeholder returns (hardcoded value from dynamic name) ──
|
|
111
|
+
const dynamicNames = /^(?:calculate|compute|get|fetch|find|search|lookup|resolve|determine|derive|parse|extract|generate|build|create|load|read)/i;
|
|
112
|
+
for (let i = 0; i < lines.length; i++) {
|
|
113
|
+
if (isCommentLine(lines[i]))
|
|
114
|
+
continue;
|
|
115
|
+
const fnMatch = lines[i].match(emptyFnPattern);
|
|
116
|
+
if (!fnMatch)
|
|
117
|
+
continue;
|
|
118
|
+
const fnName = fnMatch[1] || fnMatch[2] || fnMatch[3] || fnMatch[4] || fnMatch[5];
|
|
119
|
+
if (!fnName || !dynamicNames.test(fnName))
|
|
120
|
+
continue;
|
|
121
|
+
// Check if body is just a single return of a hardcoded value
|
|
122
|
+
const bodyLines = [];
|
|
123
|
+
for (let j = i + 1; j < Math.min(i + 6, lines.length); j++) {
|
|
124
|
+
const trimmed = lines[j].trim();
|
|
125
|
+
if (trimmed === "{" || trimmed === "")
|
|
126
|
+
continue;
|
|
127
|
+
if (trimmed === "}" || trimmed === "}," || trimmed === "};")
|
|
128
|
+
break;
|
|
129
|
+
bodyLines.push(trimmed);
|
|
130
|
+
}
|
|
131
|
+
if (bodyLines.length === 1 &&
|
|
132
|
+
/^return\s+(?:true|false|null|undefined|None|nil|0|-1|""|\[\]|\{\}|'[^']*'|"[^"]*"|\d+)\s*;?$/.test(bodyLines[0])) {
|
|
133
|
+
findings.push({
|
|
134
|
+
ruleId: `${prefix}-004`,
|
|
135
|
+
severity: "medium",
|
|
136
|
+
title: `Placeholder return in \`${fnName}()\``,
|
|
137
|
+
description: `Function \`${fnName}()\` has a name that implies computation or data retrieval, ` +
|
|
138
|
+
`but its body simply returns a hardcoded value: \`${bodyLines[0].trim()}\`.`,
|
|
139
|
+
lineNumbers: [i + 1],
|
|
140
|
+
recommendation: "Implement the actual logic, or rename the function to indicate it returns a constant " +
|
|
141
|
+
"(e.g., `getDefault${fnName.slice(3)}`).",
|
|
142
|
+
reference: "Code Review — Placeholder Detection",
|
|
143
|
+
confidence: 0.7,
|
|
144
|
+
provenance: "intent-alignment",
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ── INTENT-005: Docstring param mismatch ─────────────────────────────────
|
|
149
|
+
// Detect @param/@arg JSDoc tags that reference non-existent parameters
|
|
150
|
+
const jsdocBlock = /\/\*\*[\s\S]*?\*\//g;
|
|
151
|
+
let jsdocMatch;
|
|
152
|
+
while ((jsdocMatch = jsdocBlock.exec(code)) !== null) {
|
|
153
|
+
const blockStart = code.slice(0, jsdocMatch.index).split("\n").length;
|
|
154
|
+
const docParams = [];
|
|
155
|
+
for (const m of jsdocMatch[0].matchAll(/@param\s+(?:\{[^}]*\}\s+)?(\w+)/g)) {
|
|
156
|
+
docParams.push(m[1]);
|
|
157
|
+
}
|
|
158
|
+
if (docParams.length === 0)
|
|
159
|
+
continue;
|
|
160
|
+
// Find the function signature after this JSDoc block
|
|
161
|
+
const afterDoc = code.slice(jsdocMatch.index + jsdocMatch[0].length, jsdocMatch.index + jsdocMatch[0].length + 300);
|
|
162
|
+
const sigMatch = afterDoc.match(/(?:function\s+\w+|(?:const|let|var)\s+\w+\s*=\s*(?:async\s+)?)\s*\(([^)]*)\)/);
|
|
163
|
+
if (!sigMatch)
|
|
164
|
+
continue;
|
|
165
|
+
const actualParams = sigMatch[1]
|
|
166
|
+
.split(",")
|
|
167
|
+
.map((p) => p
|
|
168
|
+
.trim()
|
|
169
|
+
.replace(/[:=?].*$/, "")
|
|
170
|
+
.replace(/^\.\.\./, "")
|
|
171
|
+
.trim())
|
|
172
|
+
.filter(Boolean);
|
|
173
|
+
const missing = docParams.filter((dp) => !actualParams.includes(dp));
|
|
174
|
+
if (missing.length > 0) {
|
|
175
|
+
findings.push({
|
|
176
|
+
ruleId: `${prefix}-005`,
|
|
177
|
+
severity: "low",
|
|
178
|
+
title: `Docstring references non-existent parameter(s): ${missing.join(", ")}`,
|
|
179
|
+
description: `JSDoc block documents parameter(s) ${missing.map((p) => `\`${p}\``).join(", ")} ` +
|
|
180
|
+
`but the function signature only has: ${actualParams.map((p) => `\`${p}\``).join(", ") || "(none)"}.`,
|
|
181
|
+
lineNumbers: [blockStart],
|
|
182
|
+
recommendation: "Update the JSDoc to match the actual function signature, or add the missing parameters.",
|
|
183
|
+
reference: "Code Documentation Best Practices",
|
|
184
|
+
confidence: 0.8,
|
|
185
|
+
provenance: "intent-alignment",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ── INTENT-006: Misleading name — security function without security logic
|
|
190
|
+
const securityFnPattern = /(?:function\s+(validate\w*|verify\w*|authenticate\w*|authorize\w*|sanitize\w*|escape\w*|encrypt\w*|checkPermission\w*)|(?:const|let|var)\s+(validate\w*|verify\w*|authenticate\w*|authorize\w*|sanitize\w*|escape\w*|encrypt\w*|checkPermission\w*)\s*=)/;
|
|
191
|
+
for (let i = 0; i < lines.length; i++) {
|
|
192
|
+
if (isCommentLine(lines[i]))
|
|
193
|
+
continue;
|
|
194
|
+
const secMatch = lines[i].match(securityFnPattern);
|
|
195
|
+
if (!secMatch)
|
|
196
|
+
continue;
|
|
197
|
+
const fnName = secMatch[1] || secMatch[2];
|
|
198
|
+
if (!fnName)
|
|
199
|
+
continue;
|
|
200
|
+
// Collect body (up to 20 lines)
|
|
201
|
+
const bodyLines = [];
|
|
202
|
+
let braceDepth = 0;
|
|
203
|
+
let foundOpen = false;
|
|
204
|
+
for (let j = i; j < Math.min(i + 25, lines.length); j++) {
|
|
205
|
+
const line = lines[j];
|
|
206
|
+
if (line.includes("{")) {
|
|
207
|
+
foundOpen = true;
|
|
208
|
+
braceDepth += (line.match(/\{/g) || []).length;
|
|
209
|
+
}
|
|
210
|
+
if (line.includes("}")) {
|
|
211
|
+
braceDepth -= (line.match(/\}/g) || []).length;
|
|
212
|
+
}
|
|
213
|
+
if (foundOpen)
|
|
214
|
+
bodyLines.push(line);
|
|
215
|
+
if (foundOpen && braceDepth <= 0)
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
const body = bodyLines.join("\n");
|
|
219
|
+
// Check if the body actually performs the promised operation
|
|
220
|
+
const hasSecurityLogic = /(?:bcrypt|argon2|crypto\.|jwt\.|token|hash|hmac|pbkdf|scrypt|verify|compare|sign|encrypt|decrypt|sanitize|escape|encode|decode|salt|DOMPurify|createCipher|createHash|timingSafeEqual)/i.test(body) || /(?:throw|reject|res\.status\s*\(\s*(?:401|403)|unauthorized|forbidden|invalid)/i.test(body);
|
|
221
|
+
// If the function name promises security but body has none, and body is >3 lines
|
|
222
|
+
if (!hasSecurityLogic && bodyLines.length > 3) {
|
|
223
|
+
// Make sure it's not just returning true (already caught by INTENT-004)
|
|
224
|
+
if (!/^(?:\s*return\s+true\s*;?\s*)$/m.test(body)) {
|
|
225
|
+
findings.push({
|
|
226
|
+
ruleId: `${prefix}-006`,
|
|
227
|
+
severity: "high",
|
|
228
|
+
title: `Misleading name: \`${fnName}()\` lacks security logic`,
|
|
229
|
+
description: `Function \`${fnName}()\` has a name that implies security validation, ` +
|
|
230
|
+
"but its body contains no recognizable security operations (hashing, token verification, sanitization, etc.).",
|
|
231
|
+
lineNumbers: [i + 1],
|
|
232
|
+
recommendation: `Either implement proper ${fnName.replace(/[A-Z]/g, (c) => " " + c.toLowerCase()).trim()} logic, ` +
|
|
233
|
+
"or rename the function to accurately reflect what it does.",
|
|
234
|
+
reference: "Secure Development — Naming Conventions",
|
|
235
|
+
confidence: 0.68,
|
|
236
|
+
provenance: "intent-alignment",
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return findings;
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=intent-alignment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-alignment.js","sourceRoot":"","sources":["../../src/evaluators/intent-alignment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-fingerprint.d.ts","sourceRoot":"","sources":["../../src/evaluators/model-fingerprint.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AA6G3C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAmElF"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// ─── Model-Specific AI Fingerprint Detection ─────────────────────────────────
|
|
2
|
+
// Detects stylistic fingerprints and patterns characteristic of specific AI
|
|
3
|
+
// code generators (ChatGPT/GPT-4, Claude, Copilot, Gemini, etc.). These are
|
|
4
|
+
// not security vulnerabilities — they are signals that code was generated by a
|
|
5
|
+
// particular model and may carry that model's known biases or blind spots.
|
|
6
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
import { isCommentLine } from "./shared.js";
|
|
8
|
+
const FINGERPRINT_SIGNALS = [
|
|
9
|
+
// ── ChatGPT / GPT-4 signatures ──────────────────────────────────────────
|
|
10
|
+
{
|
|
11
|
+
pattern: /\/\/\s*(?:Example|Note|Remember|Important):\s/,
|
|
12
|
+
model: "ChatGPT/GPT-4",
|
|
13
|
+
description: 'Imperative tutorial-style comments ("Note:", "Remember:", "Important:")',
|
|
14
|
+
weight: 0.3,
|
|
15
|
+
checkComments: true,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
pattern: /\/\/\s*This\s+(?:function|method|class|variable|constant|module)\s+(?:is|will|does|handles|represents)/,
|
|
19
|
+
model: "ChatGPT/GPT-4",
|
|
20
|
+
description: 'Verbose "This function does X" documentation style in inline comments',
|
|
21
|
+
weight: 0.3,
|
|
22
|
+
checkComments: true,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
pattern: /\/\/ (?:Step \d|First,|Second,|Third,|Next,|Finally,|Then,)/,
|
|
26
|
+
model: "ChatGPT/GPT-4",
|
|
27
|
+
description: 'Sequential step-numbered comments ("Step 1:", "First,", "Then,")',
|
|
28
|
+
weight: 0.4,
|
|
29
|
+
checkComments: true,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
pattern: /console\.log\s*\(\s*['"`](?:Result|Output|Data|Response|Error|Success|Value|Hello):/,
|
|
33
|
+
model: "ChatGPT/GPT-4",
|
|
34
|
+
description: "Demonstration console.log with label-colon pattern",
|
|
35
|
+
weight: 0.2,
|
|
36
|
+
checkComments: true,
|
|
37
|
+
},
|
|
38
|
+
// ── Copilot signatures ───────────────────────────────────────────────────
|
|
39
|
+
{
|
|
40
|
+
pattern: /\/\/\s*TODO:\s*(?:implement|add|handle|fix|replace)\s/i,
|
|
41
|
+
model: "Copilot",
|
|
42
|
+
description: "Placeholder TODO stubs with generic verbs",
|
|
43
|
+
weight: 0.2,
|
|
44
|
+
checkComments: true,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
pattern: /(?:\/\/|#)\s*(?:Copilot|GitHub Copilot|Generated by Copilot)/i,
|
|
48
|
+
model: "Copilot",
|
|
49
|
+
description: "Explicit Copilot attribution comment",
|
|
50
|
+
weight: 0.9,
|
|
51
|
+
checkComments: true,
|
|
52
|
+
},
|
|
53
|
+
// ── Claude / Anthropic signatures ────────────────────────────────────────
|
|
54
|
+
{
|
|
55
|
+
pattern: /\/\/\s*(?:Let me|I'll|Here's|Here is|Let's)\s/,
|
|
56
|
+
model: "Claude",
|
|
57
|
+
description: 'Conversational first-person comments ("Let me", "I\'ll", "Here\'s")',
|
|
58
|
+
weight: 0.4,
|
|
59
|
+
checkComments: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
pattern: /\/\*\*\s*\n\s*\*\s*@(?:description|summary)\s+[A-Z][^.]+\.\s*\n\s*\*\s*\n\s*\*\s*@(?:param|returns)/,
|
|
63
|
+
model: "Claude",
|
|
64
|
+
description: "Dense multi-paragraph JSDoc with blank-line separators",
|
|
65
|
+
weight: 0.3,
|
|
66
|
+
checkComments: true,
|
|
67
|
+
},
|
|
68
|
+
// ── Gemini / Google signatures ───────────────────────────────────────────
|
|
69
|
+
{
|
|
70
|
+
pattern: /\/\/\s*(?:See|Refer to|For more information|Documentation):\s*https?:\/\//,
|
|
71
|
+
model: "Gemini",
|
|
72
|
+
description: "Inline URL documentation references",
|
|
73
|
+
weight: 0.3,
|
|
74
|
+
checkComments: true,
|
|
75
|
+
},
|
|
76
|
+
// ── Generic AI code signals (model-agnostic) ────────────────────────────
|
|
77
|
+
{
|
|
78
|
+
pattern: /(?:\/\/|#)\s*(?:Generated by|Auto-generated|AI[ -]generated|Created by AI|Written by AI)/i,
|
|
79
|
+
model: "AI-generated",
|
|
80
|
+
description: "Explicit AI-generation attribution comment",
|
|
81
|
+
weight: 0.9,
|
|
82
|
+
checkComments: true,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
pattern: /\/\/\s*[-─]{3,}\s*\w+.*[-─]{3,}/,
|
|
86
|
+
model: "AI-generated",
|
|
87
|
+
description: "Decorative section-divider comments with dashes",
|
|
88
|
+
weight: 0.2,
|
|
89
|
+
checkComments: true,
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
// ─── Main Analyzer ──────────────────────────────────────────────────────────
|
|
93
|
+
export function analyzeModelFingerprint(code, _language) {
|
|
94
|
+
const findings = [];
|
|
95
|
+
const lines = code.split("\n");
|
|
96
|
+
const prefix = "MFPR";
|
|
97
|
+
// Accumulate signals per model
|
|
98
|
+
const modelSignals = new Map();
|
|
99
|
+
for (const signal of FINGERPRINT_SIGNALS) {
|
|
100
|
+
const matchedLines = [];
|
|
101
|
+
for (let i = 0; i < lines.length; i++) {
|
|
102
|
+
const line = lines[i];
|
|
103
|
+
const isComment = isCommentLine(line);
|
|
104
|
+
// Only check comments for comment-only signals; check non-comments for code signals
|
|
105
|
+
if (signal.checkComments && !isComment)
|
|
106
|
+
continue;
|
|
107
|
+
if (!signal.checkComments && isComment)
|
|
108
|
+
continue;
|
|
109
|
+
signal.pattern.lastIndex = 0;
|
|
110
|
+
if (signal.pattern.test(line)) {
|
|
111
|
+
matchedLines.push(i + 1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (matchedLines.length > 0) {
|
|
115
|
+
const existing = modelSignals.get(signal.model) ?? { lines: [], totalWeight: 0, descriptions: [] };
|
|
116
|
+
existing.lines.push(...matchedLines);
|
|
117
|
+
existing.totalWeight += signal.weight * Math.min(matchedLines.length, 3);
|
|
118
|
+
if (!existing.descriptions.includes(signal.description)) {
|
|
119
|
+
existing.descriptions.push(signal.description);
|
|
120
|
+
}
|
|
121
|
+
modelSignals.set(signal.model, existing);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Emit findings for models with sufficient signal accumulation
|
|
125
|
+
let ruleNum = 1;
|
|
126
|
+
for (const [model, data] of modelSignals) {
|
|
127
|
+
// Require at least 2 distinct signal types OR one high-weight signal
|
|
128
|
+
if (data.descriptions.length < 2 && data.totalWeight < 0.8)
|
|
129
|
+
continue;
|
|
130
|
+
const uniqueLines = [...new Set(data.lines)].sort((a, b) => a - b);
|
|
131
|
+
const confidence = Math.min(0.9, 0.4 + data.totalWeight * 0.15);
|
|
132
|
+
findings.push({
|
|
133
|
+
ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
|
|
134
|
+
severity: "info",
|
|
135
|
+
title: `Code fingerprint matches ${model} generation patterns`,
|
|
136
|
+
description: `Detected ${data.descriptions.length} stylistic signal(s) characteristic of ${model}-generated code: ` +
|
|
137
|
+
data.descriptions.join("; ") +
|
|
138
|
+
". This is informational — AI-generated code should receive extra review for hallucinated APIs, " +
|
|
139
|
+
"placeholder security comments, and model-specific blind spots.",
|
|
140
|
+
lineNumbers: uniqueLines.slice(0, 10),
|
|
141
|
+
recommendation: `This code shows patterns typical of ${model}. Review carefully for: ` +
|
|
142
|
+
"(1) hallucinated imports/APIs, (2) placeholder security comments, " +
|
|
143
|
+
"(3) incomplete error handling, (4) overly verbose or missing documentation. " +
|
|
144
|
+
"Consider running the hallucination-detection and ai-code-safety judges specifically.",
|
|
145
|
+
reference: "AI Code Safety — Model Fingerprint Detection",
|
|
146
|
+
confidence,
|
|
147
|
+
provenance: "regex-pattern-match",
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return findings;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=model-fingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-fingerprint.js","sourceRoot":"","sources":["../../src/evaluators/model-fingerprint.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,2EAA2E;AAC3E,iFAAiF;AAGjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiB5C,MAAM,mBAAmB,GAAwB;IAC/C,2EAA2E;IAC3E;QACE,OAAO,EAAE,+CAA+C;QACxD,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,yEAAyE;QACtF,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IACD;QACE,OAAO,EAAE,wGAAwG;QACjH,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,uEAAuE;QACpF,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IACD;QACE,OAAO,EAAE,6DAA6D;QACtE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,kEAAkE;QAC/E,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IACD;QACE,OAAO,EAAE,qFAAqF;QAC9F,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,oDAAoD;QACjE,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IAED,4EAA4E;IAC5E;QACE,OAAO,EAAE,wDAAwD;QACjE,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,2CAA2C;QACxD,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IACD;QACE,OAAO,EAAE,+DAA+D;QACxE,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,sCAAsC;QACnD,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IAED,4EAA4E;IAC5E;QACE,OAAO,EAAE,+CAA+C;QACxD,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,qEAAqE;QAClF,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IACD;QACE,OAAO,EAAE,qGAAqG;QAC9G,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,wDAAwD;QACrE,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IAED,4EAA4E;IAC5E;QACE,OAAO,EAAE,2EAA2E;QACpF,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,qCAAqC;QAClD,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IAED,2EAA2E;IAC3E;QACE,OAAO,EAAE,2FAA2F;QACpG,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,4CAA4C;QACzD,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;IACD;QACE,OAAO,EAAE,iCAAiC;QAC1C,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,iDAAiD;QAC9D,MAAM,EAAE,GAAG;QACX,aAAa,EAAE,IAAI;KACpB;CACF,CAAC;AAEF,+EAA+E;AAE/E,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,SAAiB;IACrE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC;IAEtB,+BAA+B;IAC/B,MAAM,YAAY,GAAkF,IAAI,GAAG,EAAE,CAAC;IAE9G,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACzC,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAEtC,oFAAoF;YACpF,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,SAAS;gBAAE,SAAS;YACjD,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS;gBAAE,SAAS;YAEjD,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;YACnG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YACrC,QAAQ,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxD,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACjD,CAAC;YACD,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;QACzC,qEAAqE;QACrE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG;YAAE,SAAS;QAErE,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QAEhE,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YACzD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,4BAA4B,KAAK,sBAAsB;YAC9D,WAAW,EACT,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,0CAA0C,KAAK,mBAAmB;gBACtG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5B,iGAAiG;gBACjG,gEAAgE;YAClE,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACrC,cAAc,EACZ,uCAAuC,KAAK,0BAA0B;gBACtE,oEAAoE;gBACpE,8EAA8E;gBAC9E,sFAAsF;YACxF,SAAS,EAAE,8CAA8C;YACzD,UAAU;YACV,UAAU,EAAE,qBAAqB;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Finding } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-turn coherence evaluator.
|
|
4
|
+
*
|
|
5
|
+
* Detects self-contradicting patterns within a single code file that suggest
|
|
6
|
+
* incomplete refactoring, copy-paste inconsistencies, or conflicting logic:
|
|
7
|
+
* - Duplicate function definitions with different implementations
|
|
8
|
+
* - Contradictory boolean assignments to the same variable
|
|
9
|
+
* - Dead code after unconditional return/throw
|
|
10
|
+
* - Import statements for unused modules alongside re-implementations
|
|
11
|
+
* - Conflicting configuration values
|
|
12
|
+
*/
|
|
13
|
+
export declare function analyzeMultiTurnCoherence(code: string, _language: string): Finding[];
|
|
14
|
+
//# sourceMappingURL=multi-turn-coherence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-turn-coherence.d.ts","sourceRoot":"","sources":["../../src/evaluators/multi-turn-coherence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAkJpF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { getLineNumbers } from "./shared.js";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-turn coherence evaluator.
|
|
4
|
+
*
|
|
5
|
+
* Detects self-contradicting patterns within a single code file that suggest
|
|
6
|
+
* incomplete refactoring, copy-paste inconsistencies, or conflicting logic:
|
|
7
|
+
* - Duplicate function definitions with different implementations
|
|
8
|
+
* - Contradictory boolean assignments to the same variable
|
|
9
|
+
* - Dead code after unconditional return/throw
|
|
10
|
+
* - Import statements for unused modules alongside re-implementations
|
|
11
|
+
* - Conflicting configuration values
|
|
12
|
+
*/
|
|
13
|
+
export function analyzeMultiTurnCoherence(code, _language) {
|
|
14
|
+
const findings = [];
|
|
15
|
+
const prefix = "COH";
|
|
16
|
+
let ruleNum = 1;
|
|
17
|
+
const lines = code.split("\n");
|
|
18
|
+
// ── COH-001: Contradictory boolean assignments ────────────────────────
|
|
19
|
+
const boolAssignPattern = /\b(\w+)\s*=\s*(true|false)\s*;/g;
|
|
20
|
+
const boolAssignments = new Map();
|
|
21
|
+
let match;
|
|
22
|
+
while ((match = boolAssignPattern.exec(code)) !== null) {
|
|
23
|
+
const varName = match[1];
|
|
24
|
+
const value = match[2];
|
|
25
|
+
const lineNum = code.slice(0, match.index).split("\n").length;
|
|
26
|
+
if (!boolAssignments.has(varName))
|
|
27
|
+
boolAssignments.set(varName, []);
|
|
28
|
+
boolAssignments.get(varName).push({ value, line: lineNum });
|
|
29
|
+
}
|
|
30
|
+
const contradictoryVars = [];
|
|
31
|
+
for (const [, assignments] of boolAssignments) {
|
|
32
|
+
if (assignments.length >= 2) {
|
|
33
|
+
const values = new Set(assignments.map((a) => a.value));
|
|
34
|
+
if (values.size > 1) {
|
|
35
|
+
// Same variable assigned both true and false — check they're at the same scope level
|
|
36
|
+
// (simple heuristic: within 5 lines of each other with no control flow between)
|
|
37
|
+
for (let i = 0; i < assignments.length - 1; i++) {
|
|
38
|
+
const a = assignments[i];
|
|
39
|
+
const b = assignments[i + 1];
|
|
40
|
+
if (a.value !== b.value && b.line - a.line <= 5) {
|
|
41
|
+
const between = lines.slice(a.line - 1, b.line).join("\n");
|
|
42
|
+
if (!/\b(if|else|switch|case|for|while|catch|try)\b/.test(between)) {
|
|
43
|
+
contradictoryVars.push(a.line, b.line);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (contradictoryVars.length > 0) {
|
|
51
|
+
findings.push({
|
|
52
|
+
ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
|
|
53
|
+
severity: "medium",
|
|
54
|
+
title: "Contradictory boolean assignments",
|
|
55
|
+
description: "The same variable is assigned both true and false in close proximity without " +
|
|
56
|
+
"intervening control flow, suggesting incomplete refactoring or a logic error.",
|
|
57
|
+
lineNumbers: [...new Set(contradictoryVars)],
|
|
58
|
+
recommendation: "Review the variable assignments and remove the stale one, or add proper " +
|
|
59
|
+
"conditional logic if both assignments are intentional.",
|
|
60
|
+
confidence: 0.7,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// ── COH-002: Dead code after unconditional return/throw ───────────────
|
|
64
|
+
// Skipped — STRUCT-005 covers dead-code detection with AST-based analysis
|
|
65
|
+
// which correctly handles switch/case, guard clauses, and nested blocks.
|
|
66
|
+
// The regex-based heuristic here produced excessive false positives on
|
|
67
|
+
// returns inside if-blocks, switch cases, and early-return guard patterns.
|
|
68
|
+
ruleNum = 2;
|
|
69
|
+
// ── COH-003: Duplicate function definitions ───────────────────────────
|
|
70
|
+
ruleNum = 3;
|
|
71
|
+
const funcDefPattern = /^(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(/gm;
|
|
72
|
+
const funcDefs = new Map();
|
|
73
|
+
while ((match = funcDefPattern.exec(code)) !== null) {
|
|
74
|
+
const name = match[1];
|
|
75
|
+
const lineNum = code.slice(0, match.index).split("\n").length;
|
|
76
|
+
if (!funcDefs.has(name))
|
|
77
|
+
funcDefs.set(name, []);
|
|
78
|
+
funcDefs.get(name).push(lineNum);
|
|
79
|
+
}
|
|
80
|
+
const duplicateFuncLines = [];
|
|
81
|
+
for (const [, defLines] of funcDefs) {
|
|
82
|
+
if (defLines.length >= 2) {
|
|
83
|
+
duplicateFuncLines.push(...defLines);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (duplicateFuncLines.length > 0) {
|
|
87
|
+
findings.push({
|
|
88
|
+
ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
|
|
89
|
+
severity: "high",
|
|
90
|
+
title: "Duplicate function definitions",
|
|
91
|
+
description: "Multiple functions with the same name are defined in this file. " +
|
|
92
|
+
"Only the last definition will be effective, which may cause unexpected behaviour.",
|
|
93
|
+
lineNumbers: duplicateFuncLines,
|
|
94
|
+
recommendation: "Remove or rename the duplicate function definitions. If they serve " +
|
|
95
|
+
"different purposes, give them distinct names.",
|
|
96
|
+
confidence: 0.85,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// ── COH-004: Conflicting config values ────────────────────────────────
|
|
100
|
+
ruleNum = 4;
|
|
101
|
+
const configPattern = /(['"])([\w.]+)\1\s*:\s*(['"]?)([^'",}\]\n]+)\3/g;
|
|
102
|
+
const configValues = new Map();
|
|
103
|
+
while ((match = configPattern.exec(code)) !== null) {
|
|
104
|
+
const key = match[2];
|
|
105
|
+
const value = match[4].trim();
|
|
106
|
+
const lineNum = code.slice(0, match.index).split("\n").length;
|
|
107
|
+
if (!configValues.has(key))
|
|
108
|
+
configValues.set(key, []);
|
|
109
|
+
configValues.get(key).push({ value, line: lineNum });
|
|
110
|
+
}
|
|
111
|
+
const conflictLines = [];
|
|
112
|
+
for (const [, vals] of configValues) {
|
|
113
|
+
if (vals.length >= 2) {
|
|
114
|
+
const uniqueValues = new Set(vals.map((v) => v.value));
|
|
115
|
+
if (uniqueValues.size > 1) {
|
|
116
|
+
conflictLines.push(...vals.map((v) => v.line));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (conflictLines.length >= 6 && conflictLines.length <= 10) {
|
|
121
|
+
findings.push({
|
|
122
|
+
ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
|
|
123
|
+
severity: "low",
|
|
124
|
+
title: "Potentially conflicting configuration values",
|
|
125
|
+
description: "The same configuration key appears multiple times with different values. " +
|
|
126
|
+
"This may indicate a copy-paste error or conflicting settings.",
|
|
127
|
+
lineNumbers: [...new Set(conflictLines)].slice(0, 5),
|
|
128
|
+
recommendation: "Verify that each configuration key has the intended value and remove duplicates.",
|
|
129
|
+
confidence: 0.5,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// ── COH-005: TODO/FIXME/HACK with contradicting code ─────────────────
|
|
133
|
+
ruleNum = 5;
|
|
134
|
+
const todoLines = getLineNumbers(code, /\/\/\s*(TODO|FIXME|HACK|XXX)\b/i);
|
|
135
|
+
if (todoLines.length >= 5) {
|
|
136
|
+
findings.push({
|
|
137
|
+
ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
|
|
138
|
+
severity: "info",
|
|
139
|
+
title: "High density of TODO/FIXME markers",
|
|
140
|
+
description: `${todoLines.length} TODO/FIXME/HACK markers found. High density of unresolved ` +
|
|
141
|
+
"markers suggests incomplete implementation or deferred work that may affect reliability.",
|
|
142
|
+
lineNumbers: todoLines.slice(0, 5),
|
|
143
|
+
recommendation: "Prioritize and address the TODO/FIXME items, or create tracked issues " +
|
|
144
|
+
"for each one and remove stale markers.",
|
|
145
|
+
confidence: 0.8,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return findings;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=multi-turn-coherence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-turn-coherence.js","sourceRoot":"","sources":["../../src/evaluators/multi-turn-coherence.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|