@oddessentials/odd-ai-reviewers 1.11.0 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +16 -9
  2. package/dist/benchmark/adapter.d.ts.map +1 -1
  3. package/dist/benchmark/adapter.js +4 -2
  4. package/dist/benchmark/adapter.js.map +1 -1
  5. package/dist/cache/store.d.ts.map +1 -1
  6. package/dist/cache/store.js +26 -2
  7. package/dist/cache/store.js.map +1 -1
  8. package/dist/cli/commands/benchmark.d.ts +14 -0
  9. package/dist/cli/commands/benchmark.d.ts.map +1 -0
  10. package/dist/cli/commands/benchmark.js +86 -0
  11. package/dist/cli/commands/benchmark.js.map +1 -0
  12. package/dist/cli/commands/local-review.d.ts +13 -2
  13. package/dist/cli/commands/local-review.d.ts.map +1 -1
  14. package/dist/cli/commands/local-review.js +164 -33
  15. package/dist/cli/commands/local-review.js.map +1 -1
  16. package/dist/cli/execution-plan.d.ts +118 -0
  17. package/dist/cli/execution-plan.d.ts.map +1 -0
  18. package/dist/cli/execution-plan.js +260 -0
  19. package/dist/cli/execution-plan.js.map +1 -0
  20. package/dist/config/schemas.d.ts +103 -21
  21. package/dist/config/schemas.d.ts.map +1 -1
  22. package/dist/config/schemas.js +177 -10
  23. package/dist/config/schemas.js.map +1 -1
  24. package/dist/config.d.ts +8 -3
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +15 -6
  27. package/dist/config.js.map +1 -1
  28. package/dist/diff.d.ts.map +1 -1
  29. package/dist/diff.js +3 -0
  30. package/dist/diff.js.map +1 -1
  31. package/dist/main.d.ts.map +1 -1
  32. package/dist/main.js +86 -90
  33. package/dist/main.js.map +1 -1
  34. package/dist/phases/execute.d.ts +3 -0
  35. package/dist/phases/execute.d.ts.map +1 -1
  36. package/dist/phases/execute.js +17 -5
  37. package/dist/phases/execute.js.map +1 -1
  38. package/dist/phases/index.d.ts +1 -1
  39. package/dist/phases/index.d.ts.map +1 -1
  40. package/dist/phases/index.js +1 -1
  41. package/dist/phases/index.js.map +1 -1
  42. package/dist/phases/report.d.ts +28 -4
  43. package/dist/phases/report.d.ts.map +1 -1
  44. package/dist/phases/report.js +86 -36
  45. package/dist/phases/report.js.map +1 -1
  46. package/dist/report/ado.d.ts +2 -1
  47. package/dist/report/ado.d.ts.map +1 -1
  48. package/dist/report/ado.js +9 -5
  49. package/dist/report/ado.js.map +1 -1
  50. package/dist/report/finding-validator.d.ts +1 -4
  51. package/dist/report/finding-validator.d.ts.map +1 -1
  52. package/dist/report/finding-validator.js +23 -54
  53. package/dist/report/finding-validator.js.map +1 -1
  54. package/dist/report/framework-pattern-filter.d.ts +1 -1
  55. package/dist/report/framework-pattern-filter.d.ts.map +1 -1
  56. package/dist/report/framework-pattern-filter.js +114 -99
  57. package/dist/report/framework-pattern-filter.js.map +1 -1
  58. package/dist/report/github.d.ts +2 -1
  59. package/dist/report/github.d.ts.map +1 -1
  60. package/dist/report/github.js +9 -5
  61. package/dist/report/github.js.map +1 -1
  62. package/dist/report/terminal.d.ts +42 -4
  63. package/dist/report/terminal.d.ts.map +1 -1
  64. package/dist/report/terminal.js +36 -8
  65. package/dist/report/terminal.js.map +1 -1
  66. package/dist/report/user-suppressions.d.ts +74 -0
  67. package/dist/report/user-suppressions.d.ts.map +1 -0
  68. package/dist/report/user-suppressions.js +264 -0
  69. package/dist/report/user-suppressions.js.map +1 -0
  70. package/package.json +2 -1
@@ -65,6 +65,33 @@ function extractLinesNearFinding(diffSection, findingLine, windowSize = 10) {
65
65
  }
66
66
  return result;
67
67
  }
68
+ /**
69
+ * Extract nearby context from a diff for a finding.
70
+ * Replaces the 4-line boilerplate pattern used in 8 of 9 matchers.
71
+ * Returns null if the finding's file is not found in the diff.
72
+ */
73
+ function extractNearbyContext(finding, diffContent, windowSize = 10) {
74
+ const fileSection = extractFileDiffSection(finding, diffContent);
75
+ if (!fileSection)
76
+ return null;
77
+ const nearbyLines = extractLinesNearFinding(fileSection, finding.line, windowSize);
78
+ const nearbyText = nearbyLines.join('\n');
79
+ return { fileSection, nearbyLines, nearbyText };
80
+ }
81
+ /**
82
+ * Build a RegExp that matches a word-bounded variable name followed by a suffix.
83
+ * Validates that varName contains only word characters to prevent regex injection.
84
+ * SAFETY: All call sites extract varName from \w+ regex matches.
85
+ */
86
+ function boundedVarPattern(varName, suffix) {
87
+ // eslint-disable-next-line security/detect-non-literal-regexp
88
+ return new RegExp('\\b' + varName + suffix);
89
+ }
90
+ /**
91
+ * Matches server-side HTTP response output calls: res.send(), res.write(), res.end().
92
+ * Extracted from 4 duplicate inline regexes across the error-object-xss matcher.
93
+ */
94
+ const RES_RESPONSE_SINK = /\bres\s*\.\s*(?:send|write|end)\s*\(/;
68
95
  // =============================================================================
69
96
  // Closed Matcher Table — DEFAULT DENY
70
97
  // Only these 9 matchers. No additions without spec change.
@@ -76,25 +103,21 @@ const FRAMEWORK_MATCHERS = [
76
103
  name: 'Express Error Middleware',
77
104
  messagePattern: /unused.*param|declared\s+but\s+never\s+referenced|dead\s+code.*never\s+called|parameter\s+not\s+referenced/i,
78
105
  evidenceValidator(finding, diffContent) {
79
- const fileSection = extractFileDiffSection(finding, diffContent);
80
- if (!fileSection)
106
+ const ctx = extractNearbyContext(finding, diffContent, 5);
107
+ if (!ctx)
81
108
  return false;
82
109
  // Must have a 4-parameter function near the finding line
83
110
  // Express error middleware signature: (err, req, res, next) or variants
84
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 5);
85
- const nearbyText = nearbyLines.join('\n');
86
- // Match 4-param function: (param1, param2, param3, param4) with optional type annotations
87
111
  const fourParamPattern = /\(\s*\w+\s*(?::\s*[^,)]+)?\s*,\s*\w+\s*(?::\s*[^,)]+)?\s*,\s*\w+\s*(?::\s*[^,)]+)?\s*,\s*\w+\s*(?::\s*[^,)]+)?\s*\)/;
88
- const hasFourParams = fourParamPattern.test(nearbyText);
89
- if (!hasFourParams)
112
+ if (!fourParamPattern.test(ctx.nearbyText))
90
113
  return false;
91
114
  // At least one Express indicator required (in the file section):
92
115
  // - .use() middleware registration call
93
116
  // - import from 'express' package
94
117
  // - Express type annotations (Request, Response, NextFunction, ErrorRequestHandler)
95
- const hasUseCall = /\.use\s*\(/.test(fileSection);
96
- const hasExpressImport = /from\s+['"]express['"]/.test(fileSection);
97
- const hasExpressTypes = /:\s*(?:Request|Response|NextFunction|ErrorRequestHandler)\b/.test(nearbyText);
118
+ const hasUseCall = /\.use\s*\(/.test(ctx.fileSection);
119
+ const hasExpressImport = /from\s+['"]express['"]/.test(ctx.fileSection);
120
+ const hasExpressTypes = /:\s*(?:Request|Response|NextFunction|ErrorRequestHandler)\b/.test(ctx.nearbyText);
98
121
  return hasUseCall || hasExpressImport || hasExpressTypes;
99
122
  },
100
123
  suppressionReason: 'Express 4-param error middleware — unused params required by framework',
@@ -122,14 +145,12 @@ const FRAMEWORK_MATCHERS = [
122
145
  name: 'Exhaustive Switch',
123
146
  messagePattern: /missing.*case|unhandled.*case|default.*unreachable/i,
124
147
  evidenceValidator(finding, diffContent) {
125
- const fileSection = extractFileDiffSection(finding, diffContent);
126
- if (!fileSection)
148
+ const ctx = extractNearbyContext(finding, diffContent, 8);
149
+ if (!ctx)
127
150
  return false;
128
151
  // Scan near finding line for assertNever( or exhaustive throw
129
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 8);
130
- const nearbyText = nearbyLines.join('\n');
131
- const hasAssertNever = /assertNever\s*\(/.test(nearbyText);
132
- const hasExhaustiveThrow = /throw\s+new\s+\w*[Ee]rror\s*\(\s*['"`].*(?:exhaustive|unreachable|unexpected)/i.test(nearbyText);
152
+ const hasAssertNever = /assertNever\s*\(/.test(ctx.nearbyText);
153
+ const hasExhaustiveThrow = /throw\s+new\s+\w*[Ee]rror\s*\(\s*['"`].*(?:exhaustive|unreachable|unexpected)/i.test(ctx.nearbyText);
133
154
  return hasAssertNever || hasExhaustiveThrow;
134
155
  },
135
156
  suppressionReason: 'Exhaustive switch with assertNever/throw — all cases handled at compile time',
@@ -140,19 +161,17 @@ const FRAMEWORK_MATCHERS = [
140
161
  name: 'React Query Advisory',
141
162
  messagePattern: /duplicate|double.?fetch|redundant.*query|multiple.*useQuery|(?:verify|ensure|validate).*(?:endpoint|api|fetch).*(?:return|format|response|error|handle)|missing.*error.*handling.*(?:fetch|query|useQuery)|error.?handling.*(?:useQuery|useSWR)/i,
142
163
  evidenceValidator(finding, diffContent) {
143
- const fileSection = extractFileDiffSection(finding, diffContent);
144
- if (!fileSection)
164
+ const ctx = extractNearbyContext(finding, diffContent, 10);
165
+ if (!ctx)
145
166
  return false;
146
167
  // Evidence 1: Query library import in file section
147
- const hasQueryImport = /from\s+['"]@tanstack\/react-query['"]/.test(fileSection) ||
148
- /from\s+['"]swr['"]/.test(fileSection) ||
149
- /from\s+['"]@apollo\/client['"]/.test(fileSection);
168
+ const hasQueryImport = /from\s+['"]@tanstack\/react-query['"]/.test(ctx.fileSection) ||
169
+ /from\s+['"]swr['"]/.test(ctx.fileSection) ||
170
+ /from\s+['"]@apollo\/client['"]/.test(ctx.fileSection);
150
171
  if (!hasQueryImport)
151
172
  return false;
152
173
  // Evidence 2: Query hook call near the finding line
153
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 10);
154
- const nearbyText = nearbyLines.join('\n');
155
- const hasQueryHook = /\b(useQuery|useSWR|useInfiniteQuery)\s*\(/.test(nearbyText);
174
+ const hasQueryHook = /\b(useQuery|useSWR|useInfiniteQuery)\s*\(/.test(ctx.nearbyText);
156
175
  if (!hasQueryHook)
157
176
  return false;
158
177
  // Evidence 3: Exclude raw HTTP findings (not about library dedup)
@@ -172,7 +191,7 @@ const FRAMEWORK_MATCHERS = [
172
191
  const errorBindings = [];
173
192
  // Match shorthand `{ ..., error, ... }` or `{ ..., isError, ... }`
174
193
  // and aliased `{ ..., error: NAME, ... }` or `{ ..., isError: NAME, ... }`
175
- const destructuringBlock = nearbyText.match(/\{\s*([^}]*\b(?:error|isError)\b[^}]*)\}/);
194
+ const destructuringBlock = ctx.nearbyText.match(/\{\s*([^}]*\b(?:error|isError)\b[^}]*)\}/);
176
195
  if (!destructuringBlock?.[1])
177
196
  return false;
178
197
  const blockContent = destructuringBlock[1];
@@ -203,12 +222,12 @@ const FRAMEWORK_MATCHERS = [
203
222
  const hasErrorUsage = errorBindings.some((binding) => {
204
223
  // eslint-disable-next-line security/detect-non-literal-regexp
205
224
  const ifCheck = new RegExp('\\bif\\s*\\(\\s*' + binding + '\\b');
206
- // eslint-disable-next-line security/detect-non-literal-regexp
207
- const shortCircuit = new RegExp('\\b' + binding + '\\s*&&');
225
+ const shortCircuit = boundedVarPattern(binding, '\\s*&&');
208
226
  // Ternary: `binding ? ... : ...` — must exclude optional chaining `binding?.`
209
- // eslint-disable-next-line security/detect-non-literal-regexp
210
- const ternary = new RegExp('\\b' + binding + '\\s*\\?(?!\\.)');
211
- return (ifCheck.test(nearbyText) || shortCircuit.test(nearbyText) || ternary.test(nearbyText));
227
+ const ternary = boundedVarPattern(binding, '\\s*\\?(?!\\.)');
228
+ return (ifCheck.test(ctx.nearbyText) ||
229
+ shortCircuit.test(ctx.nearbyText) ||
230
+ ternary.test(ctx.nearbyText));
212
231
  });
213
232
  if (!hasErrorUsage)
214
233
  return false;
@@ -223,20 +242,18 @@ const FRAMEWORK_MATCHERS = [
223
242
  name: 'Promise.allSettled Convention',
224
243
  messagePattern: /allSettled.*(?:order|sequence|reject|unhandled|error.?handling|silent)|(?:order|sequence).*allSettled|(?:unhandled|missing|silent).*(?:reject|error|exception).*(?:promise|settled)|allSettled.*results.*not.*(?:match|correspond|align)|(?:additional|need).*error.*handling.*(?:promise|fetch|request|response|processing)|verify.*(?:fetch|request).*(?:error|handling|additional|response)/i,
225
244
  evidenceValidator(finding, diffContent) {
226
- const fileSection = extractFileDiffSection(finding, diffContent);
227
- if (!fileSection)
245
+ const ctx = extractNearbyContext(finding, diffContent, 10);
246
+ if (!ctx)
228
247
  return false;
229
248
  // Evidence 1: Promise.allSettled call near the finding line (not just file-wide)
230
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 10);
231
- const nearbyText = nearbyLines.join('\n');
232
- if (!/Promise\.allSettled\s*\(/.test(nearbyText))
249
+ if (!/Promise\.allSettled\s*\(/.test(ctx.nearbyText))
233
250
  return false;
234
251
  // Evidence 2+3: Iteration and .status must be BOUND to the allSettled result variable.
235
252
  // Unscoped checks (any .forEach + any .status in nearbyText) allow false suppression
236
253
  // when unrelated iteration or HTTP .status references exist nearby.
237
254
  // Step 2a: Extract the result variable name.
238
255
  // Primary: `const/let/var X = await Promise.allSettled(...)`
239
- const allSettledVarMatch = nearbyText.match(/\b(?:const|let|var)\s+(\w+)\s*=\s*await\s+Promise\.allSettled\s*\(/);
256
+ const allSettledVarMatch = ctx.nearbyText.match(/\b(?:const|let|var)\s+(\w+)\s*=\s*await\s+Promise\.allSettled\s*\(/);
240
257
  let varName = allSettledVarMatch?.[1];
241
258
  // Fallback: `.then()` chain — `Promise.allSettled(...).then((X) => ...)` or
242
259
  // `.then(X => ...)` or `.then(function(X) { ... })`.
@@ -249,7 +266,7 @@ const FRAMEWORK_MATCHERS = [
249
266
  // - named function reference: `.then(handleResults)`
250
267
  // - generator patterns
251
268
  if (!varName) {
252
- const thenMatch = nearbyText.match(/Promise\.allSettled\s*\([\s\S]*?\)\.then\s*\(\s*(?:function\s*\(\s*(\w+)|(\w+)\s*=>|\(\s*(\w+)\s*\)\s*=>)/);
269
+ const thenMatch = ctx.nearbyText.match(/Promise\.allSettled\s*\([\s\S]*?\)\.then\s*\(\s*(?:function\s*\(\s*(\w+)|(\w+)\s*=>|\(\s*(\w+)\s*\)\s*=>)/);
253
270
  varName = thenMatch?.[1] ?? thenMatch?.[2] ?? thenMatch?.[3];
254
271
  }
255
272
  if (!varName)
@@ -266,36 +283,31 @@ const FRAMEWORK_MATCHERS = [
266
283
  '|\\b' +
267
284
  varName +
268
285
  '\\s*\\[');
269
- if (!iterationPattern.test(nearbyText))
286
+ if (!iterationPattern.test(ctx.nearbyText))
270
287
  return false;
271
288
  // Step 2c: .status check must appear on the iteration callback parameter,
272
289
  // not on an unrelated variable. Extract the callback/loop variable name
273
290
  // and require PARAM.status in nearbyText.
274
291
  let hasStatusCheck = false;
275
292
  // Pattern A: VARNAME.forEach((PARAM, ...) => { ... PARAM.status ... })
276
- const forEachParamMatch = nearbyText.match(
277
- // eslint-disable-next-line security/detect-non-literal-regexp
278
- new RegExp('\\b' + varName + '\\s*\\.\\s*forEach\\s*\\(\\s*(?:\\(\\s*)?(\\w+)'));
293
+ const forEachParamMatch = ctx.nearbyText.match(boundedVarPattern(varName, '\\s*\\.\\s*forEach\\s*\\(\\s*(?:\\(\\s*)?(\\w+)'));
279
294
  if (forEachParamMatch?.[1]) {
280
295
  const cbParam = forEachParamMatch[1];
281
- // eslint-disable-next-line security/detect-non-literal-regexp
282
- hasStatusCheck = new RegExp('\\b' + cbParam + '\\.status\\b').test(nearbyText);
296
+ hasStatusCheck = boundedVarPattern(cbParam, '\\.status\\b').test(ctx.nearbyText);
283
297
  }
284
298
  // Pattern B: for (const LOOPVAR of VARNAME) { ... LOOPVAR.status ... }
285
299
  if (!hasStatusCheck) {
286
- const forOfMatch = nearbyText.match(
300
+ const forOfMatch = ctx.nearbyText.match(
287
301
  // eslint-disable-next-line security/detect-non-literal-regexp
288
302
  new RegExp('for\\s*\\(\\s*(?:const|let|var)\\s+(\\w+)\\s+of\\s+' + varName + '\\b'));
289
303
  if (forOfMatch?.[1]) {
290
304
  const loopVar = forOfMatch[1];
291
- // eslint-disable-next-line security/detect-non-literal-regexp
292
- hasStatusCheck = new RegExp('\\b' + loopVar + '\\.status\\b').test(nearbyText);
305
+ hasStatusCheck = boundedVarPattern(loopVar, '\\.status\\b').test(ctx.nearbyText);
293
306
  }
294
307
  }
295
308
  // Pattern C: indexed access VARNAME[i].status
296
309
  if (!hasStatusCheck) {
297
- // eslint-disable-next-line security/detect-non-literal-regexp
298
- hasStatusCheck = new RegExp('\\b' + varName + '\\s*\\[\\w+\\]\\s*\\.\\s*status\\b').test(nearbyText);
310
+ hasStatusCheck = boundedVarPattern(varName, '\\s*\\[\\w+\\]\\s*\\.\\s*status\\b').test(ctx.nearbyText);
299
311
  }
300
312
  if (!hasStatusCheck)
301
313
  return false;
@@ -309,14 +321,13 @@ const FRAMEWORK_MATCHERS = [
309
321
  name: 'Safe Local File Read',
310
322
  messagePattern: /path.*traversal|directory.*traversal|local.*file.*read|file.*inclusion|readFileSync.*block|synchronous.*file.*read|block.*event.*loop.*(?:read|file)/i,
311
323
  evidenceValidator(finding, diffContent) {
312
- const fileSection = extractFileDiffSection(finding, diffContent);
313
- if (!fileSection)
324
+ const ctx = extractNearbyContext(finding, diffContent, 10);
325
+ if (!ctx)
314
326
  return false;
315
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 10);
316
327
  // Single-line only: check each line individually (per FR-011 scope limitation)
317
328
  const canonicalPattern = /path\.(join|resolve)\s*\(\s*(?:__dirname|__filename|import\.meta\.(?:dirname|filename|url))\s*(?:,\s*(['"])[^'"]*\2\s*)*\)/;
318
329
  let match = null;
319
- for (const line of nearbyLines) {
330
+ for (const line of ctx.nearbyLines) {
320
331
  match = canonicalPattern.exec(line);
321
332
  if (match)
322
333
  break;
@@ -360,16 +371,15 @@ const FRAMEWORK_MATCHERS = [
360
371
  // Require that at least one nearby line is a module-top-level declaration
361
372
  // (starts with at most 2 spaces of indentation followed by const/let/var/export).
362
373
  // Lines indented ≥4 spaces are inside a function body (not top-level).
363
- const hasTopLevelDecl = nearbyLines.some((l) => /^\s{0,2}(?:export\s+)?(?:const|let|var)\s+\w+\s*=/.test(l));
374
+ const hasTopLevelDecl = ctx.nearbyLines.some((l) => /^\s{0,2}(?:export\s+)?(?:const|let|var)\s+\w+\s*=/.test(l));
364
375
  if (!hasTopLevelDecl)
365
376
  return false;
366
377
  // Reject if a request-handler, middleware, or event-listener pattern appears
367
378
  // anywhere within the ±10-line window (nearbyText).
368
- const nearbyText = nearbyLines.join('\n');
369
- if (/\b(?:app|router)\s*\.\s*(?:get|post|put|patch|delete|use|all)\s*\(/.test(nearbyText) ||
370
- /\.on\s*\(\s*['"]/.test(nearbyText) ||
371
- /addEventListener\s*\(/.test(nearbyText) ||
372
- /(?:req|request)\s*,\s*(?:res|response)\s*[,)]/.test(nearbyText))
379
+ if (/\b(?:app|router)\s*\.\s*(?:get|post|put|patch|delete|use|all)\s*\(/.test(ctx.nearbyText) ||
380
+ /\.on\s*\(\s*['"]/.test(ctx.nearbyText) ||
381
+ /addEventListener\s*\(/.test(ctx.nearbyText) ||
382
+ /(?:req|request)\s*,\s*(?:res|response)\s*[,)]/.test(ctx.nearbyText))
373
383
  return false;
374
384
  }
375
385
  return true;
@@ -382,24 +392,19 @@ const FRAMEWORK_MATCHERS = [
382
392
  name: 'Exhaustive Type-Narrowed Switch',
383
393
  messagePattern: /missing.*(?:case|default)|no.*default|add.*default|non-?exhaustive/i,
384
394
  evidenceValidator(finding, diffContent) {
385
- const fileSection = extractFileDiffSection(finding, diffContent);
386
- if (!fileSection)
395
+ const ctx = extractNearbyContext(finding, diffContent, 10);
396
+ if (!ctx)
387
397
  return false;
388
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 10);
389
- const nearbyText = nearbyLines.join('\n');
390
398
  // Evidence 1: switch target must be a simple identifier (not a property access).
391
399
  // Property-access targets like switch(node.type) or switch(event.kind) cannot
392
400
  // have their type proven from a local annotation — fail open (do not suppress).
393
- const switchTargetMatch = nearbyText.match(/\bswitch\s*\((\w+)\)/);
394
- if (!switchTargetMatch)
401
+ const switchTargetMatch = ctx.nearbyText.match(/\bswitch\s*\((\w+)\)/);
402
+ if (!switchTargetMatch?.[1])
395
403
  return false;
396
404
  const varName = switchTargetMatch[1];
397
405
  // Safety constraint: reject if the switch target variable is typed as string or number.
398
406
  // A string/number-typed switch is inherently open-domain — not exhaustive.
399
- // SAFETY: varName is from \w+ match — only [a-zA-Z0-9_], no regex special chars.
400
- // eslint-disable-next-line security/detect-non-literal-regexp
401
- const varPrimitivePattern = new RegExp('\\b' + varName + '\\s*:\\s*(?:string|number)\\b');
402
- if (varPrimitivePattern.test(nearbyText))
407
+ if (boundedVarPattern(varName, '\\s*:\\s*(?:string|number)\\b').test(ctx.nearbyText))
403
408
  return false;
404
409
  // Evidence 2: the switch variable must have a named type annotation (PascalCase),
405
410
  // and that exact named type must be declared as a string-literal union in the
@@ -408,10 +413,7 @@ const FRAMEWORK_MATCHERS = [
408
413
  //
409
414
  // Step 2a: extract the type name from the variable's annotation in ±10 lines.
410
415
  // e.g., `function f(theme: Theme)` → typeName = 'Theme'
411
- // SAFETY: varName is from \w+ match — only [a-zA-Z0-9_], no regex special chars.
412
- // eslint-disable-next-line security/detect-non-literal-regexp
413
- const varTypePattern = new RegExp('\\b' + varName + '\\s*:\\s*([A-Z][\\w]*)');
414
- const typeNameMatch = nearbyText.match(varTypePattern);
416
+ const typeNameMatch = ctx.nearbyText.match(boundedVarPattern(varName, '\\s*:\\s*([A-Z][\\w]*)'));
415
417
  if (!typeNameMatch?.[1])
416
418
  return false; // no visible annotation → cannot prove union
417
419
  const typeName = typeNameMatch[1];
@@ -421,7 +423,7 @@ const FRAMEWORK_MATCHERS = [
421
423
  // SAFETY: typeName is from [A-Z][\w]* match — only [a-zA-Z0-9_], no regex special chars.
422
424
  // eslint-disable-next-line security/detect-non-literal-regexp
423
425
  const unionDeclarationPattern = new RegExp('\\btype\\s+' + typeName + '\\s*=\\s*((?:[\'"][^\'"]+[\'"]\\s*\\|?\\s*)+)');
424
- const unionMatch = fileSection.match(unionDeclarationPattern);
426
+ const unionMatch = ctx.fileSection.match(unionDeclarationPattern);
425
427
  if (!unionMatch?.[1])
426
428
  return false;
427
429
  // Step 2c: verify every union member VALUE has a corresponding case branch.
@@ -434,7 +436,7 @@ const FRAMEWORK_MATCHERS = [
434
436
  // Extract raw string values (without quotes) from union members
435
437
  const unionMemberValues = unionMemberQuoted.map((m) => m.slice(1, -1));
436
438
  // Extract raw string values from case branches (deduplicated via Set)
437
- const caseBranchMatches = nearbyText.match(/\bcase\s+['"]([^'"]+)['"]\s*:/g) ?? [];
439
+ const caseBranchMatches = ctx.nearbyText.match(/\bcase\s+['"]([^'"]+)['"]\s*:/g) ?? [];
438
440
  const caseValues = new Set(caseBranchMatches.map((m) => {
439
441
  const val = m.match(/['"]([^'"]+)['"]/);
440
442
  return val?.[1] ?? '';
@@ -453,45 +455,53 @@ const FRAMEWORK_MATCHERS = [
453
455
  name: 'Error Object XSS',
454
456
  messagePattern: /(?:xss|inject).*(?:error|err)\b.*(?:message|\.message)|(?:error|err)\b.*(?:message|\.message).*(?:xss|inject|innerHTML|template)|(?:xss|inject).*error.*(?:directly|message)|error\s+message.*(?:xss|inject|innerHTML)/i,
455
457
  evidenceValidator(finding, diffContent) {
456
- const fileSection = extractFileDiffSection(finding, diffContent);
457
- if (!fileSection)
458
+ const ctx = extractNearbyContext(finding, diffContent, 10);
459
+ if (!ctx)
458
460
  return false;
459
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 10);
460
- const nearbyText = nearbyLines.join('\n');
461
461
  // MANDATORY: catch clause visible (structural proof of error origin)
462
462
  // No naming heuristics, no function-name matching (security-engineer mandate)
463
- if (!/\bcatch\s*\(\s*\w+/.test(nearbyText))
463
+ if (!/\bcatch\s*\(\s*\w+/.test(ctx.nearbyText))
464
464
  return false;
465
465
  // MANDATORY: error.message usage visible (the flagged construct)
466
- if (!/\.\s*message\b/.test(nearbyText))
466
+ if (!/\.\s*message\b/.test(ctx.nearbyText))
467
467
  return false;
468
468
  // REJECT: error constructed from user input or external API data.
469
469
  // Errors built from req.body, query params, or external input can contain
470
470
  // attacker-controlled data — suppression would hide real XSS.
471
- if (/new\s+(?:\w+)?Error\s*\(\s*(?:req\.|request\.|body\.|params\.|query\.|input\.|data\.|payload\.)/.test(nearbyText))
471
+ if (/new\s+(?:\w+)?Error\s*\(\s*(?:req\.|request\.|body\.|params\.|query\.|input\.|data\.|payload\.)/.test(ctx.nearbyText))
472
472
  return false;
473
473
  // REJECT: direct DOM manipulation (browser-side sinks)
474
- if (/\.innerHTML\s*=|\.outerHTML\s*=|document\.write\s*\(|insertAdjacentHTML\s*\(/.test(nearbyText))
474
+ if (/\.innerHTML\s*=|\.outerHTML\s*=|document\.write\s*\(|insertAdjacentHTML\s*\(/.test(ctx.nearbyText))
475
475
  return false;
476
476
  // REJECT: React dangerouslySetInnerHTML (always renders raw HTML)
477
- if (/dangerouslySetInnerHTML/.test(nearbyText))
477
+ if (/dangerouslySetInnerHTML/.test(ctx.nearbyText))
478
478
  return false;
479
479
  // REJECT: server-side HTTP response sinks that render error.message as HTML.
480
480
  // Only triggers when BOTH a response output call AND .message appear within
481
481
  // the same ±10-line window (nearbyText), proving the error data flows into
482
482
  // the response. Plain-text responses (res.send(err.message) without HTML
483
483
  // markup) are excluded by requiring an HTML indicator (< or template literal).
484
- if (/\bres\s*\.\s*(?:send|write|end)\s*\(/.test(nearbyText)) {
484
+ if (RES_RESPONSE_SINK.test(ctx.nearbyText)) {
485
485
  // Check for HTML evidence: template literal with tags, or string with '<'
486
- const hasHtmlInResponse = /\bres\s*\.\s*(?:send|write|end)\s*\(\s*`[^`]*</.test(nearbyText) ||
487
- /\bres\s*\.\s*(?:send|write|end)\s*\([^)]*['"][^'"]*</.test(nearbyText) ||
488
- /\bres\s*\.\s*(?:send|write|end)\s*\([^)]*\+[^)]*['"]?\s*</.test(nearbyText);
486
+ const hasHtmlInResponse = /\bres\s*\.\s*(?:send|write|end)\s*\(\s*`[^`]*</.test(ctx.nearbyText) ||
487
+ /\bres\s*\.\s*(?:send|write|end)\s*\([^)]*['"][^'"]*</.test(ctx.nearbyText) ||
488
+ /\bres\s*\.\s*(?:send|write|end)\s*\([^)]*\+[^)]*['"]?\s*</.test(ctx.nearbyText);
489
489
  if (hasHtmlInResponse)
490
490
  return false;
491
+ // FR-015: Variable-backed HTML detection.
492
+ // Catches: `const html = `<p>${err}</p>`; res.send(html);`
493
+ // Extract variable name from res.send(varName) and check if the variable
494
+ // was assigned HTML-containing content in the nearby text.
495
+ const varMatch = ctx.nearbyText.match(/\bres\s*\.\s*(?:send|write|end)\s*\(\s*(\w+)\s*\)/);
496
+ if (varMatch?.[1]) {
497
+ const sendVarName = varMatch[1];
498
+ if (boundedVarPattern(sendVarName, '\\s*=\\s*(?:`[^`]*<|[\'"][^\'"]*<)').test(ctx.nearbyText))
499
+ return false;
500
+ }
491
501
  }
492
502
  // REJECT: template engine render calls (always produce HTML output)
493
- if (/\bres\s*\.\s*render\s*\(/.test(nearbyText) ||
494
- /\b(?:ejs|pug|handlebars|hbs|nunjucks|mustache)\s*[.(]/.test(nearbyText))
503
+ if (/\bres\s*\.\s*render\s*\(/.test(ctx.nearbyText) ||
504
+ /\b(?:ejs|pug|handlebars|hbs|nunjucks|mustache)\s*[.(]/.test(ctx.nearbyText))
495
505
  return false;
496
506
  return true;
497
507
  },
@@ -503,26 +513,24 @@ const FRAMEWORK_MATCHERS = [
503
513
  name: 'Thin Wrapper Stdlib',
504
514
  messagePattern: /(?:missing|add|no).*try.?catch|(?:could|may|might).*throw|unhandled.*(?:error|exception).*(?:JSON\.parse|parseInt|parseFloat|new\s+URL|Buffer\.from|decodeURI)|directly.*(?:return|call).*(?:JSON\.parse|parseInt|parseFloat)/i,
505
515
  evidenceValidator(finding, diffContent) {
506
- const fileSection = extractFileDiffSection(finding, diffContent);
507
- if (!fileSection)
516
+ const ctx = extractNearbyContext(finding, diffContent, 5);
517
+ if (!ctx)
508
518
  return false;
509
- const nearbyLines = extractLinesNearFinding(fileSection, finding.line, 5);
510
- const nearbyText = nearbyLines.join('\n');
511
519
  // Evidence 1: WHITELISTED stdlib call present (no open patterns)
512
520
  const SAFE_STDLIB = /\b(?:JSON\.parse|JSON\.stringify|parseInt|parseFloat|Number\(|new\s+URL|Buffer\.from|decodeURIComponent|decodeURI|atob|btoa)\s*\(/;
513
- if (!SAFE_STDLIB.test(nearbyText))
521
+ if (!SAFE_STDLIB.test(ctx.nearbyText))
514
522
  return false;
515
523
  // Evidence 2: thin wrapper structure (return + stdlib)
516
- if (!/\breturn\s+/.test(nearbyText))
524
+ if (!/\breturn\s+/.test(ctx.nearbyText))
517
525
  return false;
518
526
  // REJECT: I/O operations (not pure stdlib delegation)
519
- if (/\b(?:fs\.|fetch\s*\(|await\s|\.readFile|\.writeFile|database|\.query\s*\()/.test(nearbyText))
527
+ if (/\b(?:fs\.|fetch\s*\(|await\s|\.readFile|\.writeFile|database|\.query\s*\()/.test(ctx.nearbyText))
520
528
  return false;
521
529
  // REJECT: conditional logic (not a thin wrapper)
522
- if (/\b(?:if\s*\(|else\b|switch\s*\()/.test(nearbyText))
530
+ if (/\b(?:if\s*\(|else\b|switch\s*\()/.test(ctx.nearbyText))
523
531
  return false;
524
532
  // REJECT: request handler context (caller responsibility matters here)
525
- if (/\b(?:req\.|request\.|res\.|response\.|app\.\w+\(|router\.\w+\()/.test(nearbyText))
533
+ if (/\b(?:req\.|request\.|res\.|response\.|app\.\w+\(|router\.\w+\()/.test(ctx.nearbyText))
526
534
  return false;
527
535
  return true;
528
536
  },
@@ -540,12 +548,19 @@ const FRAMEWORK_MATCHERS = [
540
548
  * @param diffContent - Raw diff content for evidence validation
541
549
  * @returns Summary with suppressed/passed findings and diagnostic details
542
550
  */
543
- export function filterFrameworkConventionFindings(findings, diffContent) {
551
+ export function filterFrameworkConventionFindings(findings, diffContent, disableMatchers = []) {
552
+ const disabledSet = new Set(disableMatchers);
544
553
  const results = [];
545
554
  let suppressed = 0;
555
+ if (disabledSet.size > 0) {
556
+ console.error(`[router] [framework-filter] Disabled matchers: ${[...disabledSet].join(', ')}`);
557
+ }
546
558
  for (const finding of findings) {
547
559
  let matched = false;
548
560
  for (const matcher of FRAMEWORK_MATCHERS) {
561
+ // Skip disabled matchers (FR-022 disable_matchers)
562
+ if (disabledSet.has(matcher.id))
563
+ continue;
549
564
  // Step 1: Does the message pattern match?
550
565
  if (!matcher.messagePattern.test(finding.message))
551
566
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"framework-pattern-filter.js","sourceRoot":"","sources":["../../src/report/framework-pattern-filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"framework-pattern-filter.js","sourceRoot":"","sources":["../../src/report/framework-pattern-filter.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import type { Finding } from '../agents/types.js';
7
7
  import type { Config } from '../config.js';
8
+ import type { RunStatus } from '../cli/execution-plan.js';
8
9
  import type { DiffFile } from '../diff.js';
9
10
  import { type ValidationStats, type InvalidLineDetail } from './line-resolver.js';
10
11
  export interface GitHubContext {
@@ -55,5 +56,5 @@ export declare function completeCheckRun(context: GitHubContext, params: {
55
56
  * in check summaries and PR comments. Partial findings are rendered in a dedicated
56
57
  * section that makes clear they're from failed agents and don't affect gating.
57
58
  */
58
- export declare function reportToGitHub(findings: Finding[], partialFindings: Finding[], context: GitHubContext, config: Config, diffFiles: DiffFile[]): Promise<ReportResult>;
59
+ export declare function reportToGitHub(findings: Finding[], partialFindings: Finding[], context: GitHubContext, config: Config, diffFiles: DiffFile[], runStatus?: RunStatus): Promise<ReportResult>;
59
60
  //# sourceMappingURL=github.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/report/github.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAyB3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEvB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uEAAuE;IACvE,yBAAyB,CAAC,EAAE,OAAO,EAAE,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB3E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE;IACN,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,OAAO,EAAE,EACnB,eAAe,EAAE,OAAO,EAAE,EAC1B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,YAAY,CAAC,CAmHvB"}
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/report/github.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAyB1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEvB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uEAAuE;IACvE,yBAAyB,CAAC,EAAE,OAAO,EAAE,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB3E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE;IACN,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,OAAO,EAAE,EACnB,eAAe,EAAE,OAAO,EAAE,EAC1B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,QAAQ,EAAE,EACrB,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,YAAY,CAAC,CAoHvB"}
@@ -64,7 +64,7 @@ export async function completeCheckRun(context, params) {
64
64
  * in check summaries and PR comments. Partial findings are rendered in a dedicated
65
65
  * section that makes clear they're from failed agents and don't affect gating.
66
66
  */
67
- export async function reportToGitHub(findings, partialFindings, context, config, diffFiles) {
67
+ export async function reportToGitHub(findings, partialFindings, context, config, diffFiles, runStatus) {
68
68
  const octokit = new Octokit({ auth: context.token });
69
69
  const reportingConfig = config.reporting.github ?? {
70
70
  mode: 'checks_and_comments',
@@ -84,7 +84,7 @@ export async function reportToGitHub(findings, partialFindings, context, config,
84
84
  let checkRunCompleted = false;
85
85
  // Create check run if enabled
86
86
  if (reportingConfig.mode === 'checks_only' || reportingConfig.mode === 'checks_and_comments') {
87
- checkRunId = await createCheckRun(octokit, context, sorted, partialFindings, counts, config, driftSignal, inlineDriftSignal);
87
+ checkRunId = await createCheckRun(octokit, context, sorted, partialFindings, counts, config, driftSignal, inlineDriftSignal, runStatus);
88
88
  checkRunCompleted = true;
89
89
  }
90
90
  // Post PR comment if enabled and we have a PR number
@@ -148,10 +148,14 @@ export async function reportToGitHub(findings, partialFindings, context, config,
148
148
  *
149
149
  * (012-fix-agent-result-regressions) - Now includes partialFindings in summary
150
150
  */
151
- async function createCheckRun(octokit, context, findings, partialFindings, counts, config, driftSignal, inlineDriftSignal) {
152
- // Determine conclusion based on gating config
151
+ async function createCheckRun(octokit, context, findings, partialFindings, counts, config, driftSignal, inlineDriftSignal, runStatus) {
152
+ // FR-021: Incomplete runs MUST use 'neutral' conclusion regardless of gating.
153
+ // This check comes FIRST, before gating evaluation, enforcing the spec's precedence rule.
153
154
  let conclusion = 'success';
154
- if (config.gating.enabled) {
155
+ if (runStatus === 'incomplete') {
156
+ conclusion = 'neutral';
157
+ }
158
+ else if (config.gating.enabled) {
155
159
  if (config.gating.fail_on_severity === 'error' && counts.error > 0) {
156
160
  conclusion = 'failure';
157
161
  }