@kevinrabun/judges 2.2.0 → 3.0.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 (330) hide show
  1. package/README.md +203 -20
  2. package/dist/api.d.ts +40 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +56 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/ast/cross-file-taint.d.ts +43 -0
  7. package/dist/ast/cross-file-taint.d.ts.map +1 -0
  8. package/dist/ast/cross-file-taint.js +713 -0
  9. package/dist/ast/cross-file-taint.js.map +1 -0
  10. package/dist/ast/index.d.ts +4 -0
  11. package/dist/ast/index.d.ts.map +1 -1
  12. package/dist/ast/index.js +5 -0
  13. package/dist/ast/index.js.map +1 -1
  14. package/dist/ast/structural-parser.d.ts.map +1 -1
  15. package/dist/ast/structural-parser.js +66 -11
  16. package/dist/ast/structural-parser.js.map +1 -1
  17. package/dist/ast/taint-tracker.d.ts +35 -0
  18. package/dist/ast/taint-tracker.d.ts.map +1 -0
  19. package/dist/ast/taint-tracker.js +518 -0
  20. package/dist/ast/taint-tracker.js.map +1 -0
  21. package/dist/ast/types.d.ts +2 -0
  22. package/dist/ast/types.d.ts.map +1 -1
  23. package/dist/ast/typescript-ast.d.ts.map +1 -1
  24. package/dist/ast/typescript-ast.js +25 -5
  25. package/dist/ast/typescript-ast.js.map +1 -1
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +10 -9
  28. package/dist/config.js.map +1 -1
  29. package/dist/dedup.d.ts +19 -0
  30. package/dist/dedup.d.ts.map +1 -0
  31. package/dist/dedup.js +222 -0
  32. package/dist/dedup.js.map +1 -0
  33. package/dist/errors.d.ts +37 -0
  34. package/dist/errors.d.ts.map +1 -0
  35. package/dist/errors.js +57 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/evaluators/accessibility.d.ts +1 -1
  38. package/dist/evaluators/accessibility.d.ts.map +1 -1
  39. package/dist/evaluators/accessibility.js +45 -7
  40. package/dist/evaluators/accessibility.js.map +1 -1
  41. package/dist/evaluators/agent-instructions.d.ts +1 -1
  42. package/dist/evaluators/agent-instructions.d.ts.map +1 -1
  43. package/dist/evaluators/agent-instructions.js +60 -2
  44. package/dist/evaluators/agent-instructions.js.map +1 -1
  45. package/dist/evaluators/ai-code-safety.d.ts +9 -0
  46. package/dist/evaluators/ai-code-safety.d.ts.map +1 -0
  47. package/dist/evaluators/ai-code-safety.js +507 -0
  48. package/dist/evaluators/ai-code-safety.js.map +1 -0
  49. package/dist/evaluators/api-design.d.ts +1 -1
  50. package/dist/evaluators/api-design.d.ts.map +1 -1
  51. package/dist/evaluators/api-design.js +33 -17
  52. package/dist/evaluators/api-design.js.map +1 -1
  53. package/dist/evaluators/app-builder.d.ts +34 -0
  54. package/dist/evaluators/app-builder.d.ts.map +1 -0
  55. package/dist/evaluators/app-builder.js +156 -0
  56. package/dist/evaluators/app-builder.js.map +1 -0
  57. package/dist/evaluators/authentication.d.ts +1 -1
  58. package/dist/evaluators/authentication.d.ts.map +1 -1
  59. package/dist/evaluators/authentication.js +69 -75
  60. package/dist/evaluators/authentication.js.map +1 -1
  61. package/dist/evaluators/backwards-compatibility.d.ts +1 -1
  62. package/dist/evaluators/backwards-compatibility.d.ts.map +1 -1
  63. package/dist/evaluators/backwards-compatibility.js +25 -3
  64. package/dist/evaluators/backwards-compatibility.js.map +1 -1
  65. package/dist/evaluators/caching.d.ts +1 -1
  66. package/dist/evaluators/caching.d.ts.map +1 -1
  67. package/dist/evaluators/caching.js +25 -4
  68. package/dist/evaluators/caching.js.map +1 -1
  69. package/dist/evaluators/ci-cd.d.ts +1 -1
  70. package/dist/evaluators/ci-cd.d.ts.map +1 -1
  71. package/dist/evaluators/ci-cd.js +34 -12
  72. package/dist/evaluators/ci-cd.js.map +1 -1
  73. package/dist/evaluators/cloud-readiness.d.ts +1 -1
  74. package/dist/evaluators/cloud-readiness.d.ts.map +1 -1
  75. package/dist/evaluators/cloud-readiness.js +26 -0
  76. package/dist/evaluators/cloud-readiness.js.map +1 -1
  77. package/dist/evaluators/code-structure.d.ts +1 -1
  78. package/dist/evaluators/code-structure.d.ts.map +1 -1
  79. package/dist/evaluators/code-structure.js +19 -6
  80. package/dist/evaluators/code-structure.js.map +1 -1
  81. package/dist/evaluators/compliance.d.ts +1 -1
  82. package/dist/evaluators/compliance.d.ts.map +1 -1
  83. package/dist/evaluators/compliance.js +48 -10
  84. package/dist/evaluators/compliance.js.map +1 -1
  85. package/dist/evaluators/concurrency.d.ts +1 -1
  86. package/dist/evaluators/concurrency.d.ts.map +1 -1
  87. package/dist/evaluators/concurrency.js +29 -4
  88. package/dist/evaluators/concurrency.js.map +1 -1
  89. package/dist/evaluators/configuration-management.d.ts +1 -1
  90. package/dist/evaluators/configuration-management.d.ts.map +1 -1
  91. package/dist/evaluators/configuration-management.js +57 -13
  92. package/dist/evaluators/configuration-management.js.map +1 -1
  93. package/dist/evaluators/cost-effectiveness.d.ts +1 -1
  94. package/dist/evaluators/cost-effectiveness.d.ts.map +1 -1
  95. package/dist/evaluators/cost-effectiveness.js +27 -3
  96. package/dist/evaluators/cost-effectiveness.js.map +1 -1
  97. package/dist/evaluators/cybersecurity.d.ts +1 -1
  98. package/dist/evaluators/cybersecurity.d.ts.map +1 -1
  99. package/dist/evaluators/cybersecurity.js +190 -1
  100. package/dist/evaluators/cybersecurity.js.map +1 -1
  101. package/dist/evaluators/data-security.d.ts +1 -1
  102. package/dist/evaluators/data-security.d.ts.map +1 -1
  103. package/dist/evaluators/data-security.js +114 -66
  104. package/dist/evaluators/data-security.js.map +1 -1
  105. package/dist/evaluators/data-sovereignty.d.ts +1 -1
  106. package/dist/evaluators/data-sovereignty.d.ts.map +1 -1
  107. package/dist/evaluators/data-sovereignty.js +89 -2
  108. package/dist/evaluators/data-sovereignty.js.map +1 -1
  109. package/dist/evaluators/database.d.ts +1 -1
  110. package/dist/evaluators/database.d.ts.map +1 -1
  111. package/dist/evaluators/database.js +35 -9
  112. package/dist/evaluators/database.js.map +1 -1
  113. package/dist/evaluators/dependencies.d.ts +6 -0
  114. package/dist/evaluators/dependencies.d.ts.map +1 -0
  115. package/dist/evaluators/dependencies.js +204 -0
  116. package/dist/evaluators/dependencies.js.map +1 -0
  117. package/dist/evaluators/dependency-health.d.ts +1 -1
  118. package/dist/evaluators/dependency-health.d.ts.map +1 -1
  119. package/dist/evaluators/dependency-health.js +265 -11
  120. package/dist/evaluators/dependency-health.js.map +1 -1
  121. package/dist/evaluators/documentation.d.ts +1 -1
  122. package/dist/evaluators/documentation.d.ts.map +1 -1
  123. package/dist/evaluators/documentation.js +25 -2
  124. package/dist/evaluators/documentation.js.map +1 -1
  125. package/dist/evaluators/error-handling.d.ts +1 -1
  126. package/dist/evaluators/error-handling.d.ts.map +1 -1
  127. package/dist/evaluators/error-handling.js +89 -24
  128. package/dist/evaluators/error-handling.js.map +1 -1
  129. package/dist/evaluators/ethics-bias.d.ts +1 -1
  130. package/dist/evaluators/ethics-bias.d.ts.map +1 -1
  131. package/dist/evaluators/ethics-bias.js +30 -5
  132. package/dist/evaluators/ethics-bias.js.map +1 -1
  133. package/dist/evaluators/framework-safety.d.ts +13 -0
  134. package/dist/evaluators/framework-safety.d.ts.map +1 -0
  135. package/dist/evaluators/framework-safety.js +424 -0
  136. package/dist/evaluators/framework-safety.js.map +1 -0
  137. package/dist/evaluators/index.d.ts +21 -24
  138. package/dist/evaluators/index.d.ts.map +1 -1
  139. package/dist/evaluators/index.js +297 -677
  140. package/dist/evaluators/index.js.map +1 -1
  141. package/dist/evaluators/internationalization.d.ts +1 -1
  142. package/dist/evaluators/internationalization.d.ts.map +1 -1
  143. package/dist/evaluators/internationalization.js +55 -4
  144. package/dist/evaluators/internationalization.js.map +1 -1
  145. package/dist/evaluators/logging-privacy.d.ts +1 -1
  146. package/dist/evaluators/logging-privacy.d.ts.map +1 -1
  147. package/dist/evaluators/logging-privacy.js +68 -30
  148. package/dist/evaluators/logging-privacy.js.map +1 -1
  149. package/dist/evaluators/maintainability.d.ts +1 -1
  150. package/dist/evaluators/maintainability.d.ts.map +1 -1
  151. package/dist/evaluators/maintainability.js +53 -26
  152. package/dist/evaluators/maintainability.js.map +1 -1
  153. package/dist/evaluators/observability.d.ts +1 -1
  154. package/dist/evaluators/observability.d.ts.map +1 -1
  155. package/dist/evaluators/observability.js +22 -1
  156. package/dist/evaluators/observability.js.map +1 -1
  157. package/dist/evaluators/performance.d.ts +1 -1
  158. package/dist/evaluators/performance.d.ts.map +1 -1
  159. package/dist/evaluators/performance.js +209 -2
  160. package/dist/evaluators/performance.js.map +1 -1
  161. package/dist/evaluators/portability.d.ts +1 -1
  162. package/dist/evaluators/portability.d.ts.map +1 -1
  163. package/dist/evaluators/portability.js +24 -1
  164. package/dist/evaluators/portability.js.map +1 -1
  165. package/dist/evaluators/project.d.ts +16 -0
  166. package/dist/evaluators/project.d.ts.map +1 -0
  167. package/dist/evaluators/project.js +353 -0
  168. package/dist/evaluators/project.js.map +1 -0
  169. package/dist/evaluators/rate-limiting.d.ts +1 -1
  170. package/dist/evaluators/rate-limiting.d.ts.map +1 -1
  171. package/dist/evaluators/rate-limiting.js +33 -10
  172. package/dist/evaluators/rate-limiting.js.map +1 -1
  173. package/dist/evaluators/reliability.d.ts +1 -1
  174. package/dist/evaluators/reliability.d.ts.map +1 -1
  175. package/dist/evaluators/reliability.js +20 -0
  176. package/dist/evaluators/reliability.js.map +1 -1
  177. package/dist/evaluators/scalability.d.ts +1 -1
  178. package/dist/evaluators/scalability.d.ts.map +1 -1
  179. package/dist/evaluators/scalability.js +27 -1
  180. package/dist/evaluators/scalability.js.map +1 -1
  181. package/dist/evaluators/shared.d.ts +24 -2
  182. package/dist/evaluators/shared.d.ts.map +1 -1
  183. package/dist/evaluators/shared.js +194 -26
  184. package/dist/evaluators/shared.js.map +1 -1
  185. package/dist/evaluators/software-practices.d.ts +1 -1
  186. package/dist/evaluators/software-practices.d.ts.map +1 -1
  187. package/dist/evaluators/software-practices.js +50 -3
  188. package/dist/evaluators/software-practices.js.map +1 -1
  189. package/dist/evaluators/testing.d.ts +1 -1
  190. package/dist/evaluators/testing.d.ts.map +1 -1
  191. package/dist/evaluators/testing.js +32 -4
  192. package/dist/evaluators/testing.js.map +1 -1
  193. package/dist/evaluators/ux.d.ts +1 -1
  194. package/dist/evaluators/ux.d.ts.map +1 -1
  195. package/dist/evaluators/ux.js +24 -0
  196. package/dist/evaluators/ux.js.map +1 -1
  197. package/dist/evaluators/v2.d.ts +1 -1
  198. package/dist/evaluators/v2.d.ts.map +1 -1
  199. package/dist/evaluators/v2.js +15 -35
  200. package/dist/evaluators/v2.js.map +1 -1
  201. package/dist/formatters/sarif.d.ts +75 -0
  202. package/dist/formatters/sarif.d.ts.map +1 -0
  203. package/dist/formatters/sarif.js +93 -0
  204. package/dist/formatters/sarif.js.map +1 -0
  205. package/dist/index.d.ts +4 -1
  206. package/dist/index.d.ts.map +1 -1
  207. package/dist/index.js +9 -782
  208. package/dist/index.js.map +1 -1
  209. package/dist/judges/accessibility.d.ts +1 -1
  210. package/dist/judges/accessibility.d.ts.map +1 -1
  211. package/dist/judges/agent-instructions.d.ts +1 -1
  212. package/dist/judges/agent-instructions.d.ts.map +1 -1
  213. package/dist/judges/ai-code-safety.d.ts +3 -0
  214. package/dist/judges/ai-code-safety.d.ts.map +1 -0
  215. package/dist/judges/ai-code-safety.js +45 -0
  216. package/dist/judges/ai-code-safety.js.map +1 -0
  217. package/dist/judges/api-design.d.ts +1 -1
  218. package/dist/judges/api-design.d.ts.map +1 -1
  219. package/dist/judges/authentication.d.ts +1 -1
  220. package/dist/judges/authentication.d.ts.map +1 -1
  221. package/dist/judges/backwards-compatibility.d.ts +1 -1
  222. package/dist/judges/backwards-compatibility.d.ts.map +1 -1
  223. package/dist/judges/caching.d.ts +1 -1
  224. package/dist/judges/caching.d.ts.map +1 -1
  225. package/dist/judges/ci-cd.d.ts +1 -1
  226. package/dist/judges/ci-cd.d.ts.map +1 -1
  227. package/dist/judges/cloud-readiness.d.ts +1 -1
  228. package/dist/judges/cloud-readiness.d.ts.map +1 -1
  229. package/dist/judges/code-structure.d.ts +1 -1
  230. package/dist/judges/code-structure.d.ts.map +1 -1
  231. package/dist/judges/compliance.d.ts +1 -1
  232. package/dist/judges/compliance.d.ts.map +1 -1
  233. package/dist/judges/concurrency.d.ts +1 -1
  234. package/dist/judges/concurrency.d.ts.map +1 -1
  235. package/dist/judges/configuration-management.d.ts +1 -1
  236. package/dist/judges/configuration-management.d.ts.map +1 -1
  237. package/dist/judges/cost-effectiveness.d.ts +1 -1
  238. package/dist/judges/cost-effectiveness.d.ts.map +1 -1
  239. package/dist/judges/cybersecurity.d.ts +1 -1
  240. package/dist/judges/cybersecurity.d.ts.map +1 -1
  241. package/dist/judges/data-security.d.ts +1 -1
  242. package/dist/judges/data-security.d.ts.map +1 -1
  243. package/dist/judges/data-sovereignty.d.ts +1 -1
  244. package/dist/judges/data-sovereignty.d.ts.map +1 -1
  245. package/dist/judges/database.d.ts +1 -1
  246. package/dist/judges/database.d.ts.map +1 -1
  247. package/dist/judges/dependency-health.d.ts +1 -1
  248. package/dist/judges/dependency-health.d.ts.map +1 -1
  249. package/dist/judges/documentation.d.ts +1 -1
  250. package/dist/judges/documentation.d.ts.map +1 -1
  251. package/dist/judges/error-handling.d.ts +1 -1
  252. package/dist/judges/error-handling.d.ts.map +1 -1
  253. package/dist/judges/ethics-bias.d.ts +1 -1
  254. package/dist/judges/ethics-bias.d.ts.map +1 -1
  255. package/dist/judges/framework-safety.d.ts +3 -0
  256. package/dist/judges/framework-safety.d.ts.map +1 -0
  257. package/dist/judges/framework-safety.js +25 -0
  258. package/dist/judges/framework-safety.js.map +1 -0
  259. package/dist/judges/index.d.ts +1 -1
  260. package/dist/judges/index.d.ts.map +1 -1
  261. package/dist/judges/index.js +76 -0
  262. package/dist/judges/index.js.map +1 -1
  263. package/dist/judges/internationalization.d.ts +1 -1
  264. package/dist/judges/internationalization.d.ts.map +1 -1
  265. package/dist/judges/logging-privacy.d.ts +1 -1
  266. package/dist/judges/logging-privacy.d.ts.map +1 -1
  267. package/dist/judges/maintainability.d.ts +1 -1
  268. package/dist/judges/maintainability.d.ts.map +1 -1
  269. package/dist/judges/observability.d.ts +1 -1
  270. package/dist/judges/observability.d.ts.map +1 -1
  271. package/dist/judges/performance.d.ts +1 -1
  272. package/dist/judges/performance.d.ts.map +1 -1
  273. package/dist/judges/portability.d.ts +1 -1
  274. package/dist/judges/portability.d.ts.map +1 -1
  275. package/dist/judges/rate-limiting.d.ts +1 -1
  276. package/dist/judges/rate-limiting.d.ts.map +1 -1
  277. package/dist/judges/reliability.d.ts +1 -1
  278. package/dist/judges/reliability.d.ts.map +1 -1
  279. package/dist/judges/scalability.d.ts +1 -1
  280. package/dist/judges/scalability.d.ts.map +1 -1
  281. package/dist/judges/software-practices.d.ts +1 -1
  282. package/dist/judges/software-practices.d.ts.map +1 -1
  283. package/dist/judges/testing.d.ts +1 -1
  284. package/dist/judges/testing.d.ts.map +1 -1
  285. package/dist/judges/ux.d.ts +1 -1
  286. package/dist/judges/ux.d.ts.map +1 -1
  287. package/dist/language-patterns.d.ts +37 -0
  288. package/dist/language-patterns.d.ts.map +1 -1
  289. package/dist/language-patterns.js +59 -4
  290. package/dist/language-patterns.js.map +1 -1
  291. package/dist/patches/index.d.ts +10 -0
  292. package/dist/patches/index.d.ts.map +1 -0
  293. package/dist/patches/index.js +533 -0
  294. package/dist/patches/index.js.map +1 -0
  295. package/dist/reports/public-repo-report.d.ts +3 -1
  296. package/dist/reports/public-repo-report.d.ts.map +1 -1
  297. package/dist/reports/public-repo-report.js +41 -0
  298. package/dist/reports/public-repo-report.js.map +1 -1
  299. package/dist/scoring.d.ts +18 -0
  300. package/dist/scoring.d.ts.map +1 -0
  301. package/dist/scoring.js +178 -0
  302. package/dist/scoring.js.map +1 -0
  303. package/dist/tools/deep-review.d.ts +4 -0
  304. package/dist/tools/deep-review.d.ts.map +1 -0
  305. package/dist/tools/deep-review.js +56 -0
  306. package/dist/tools/deep-review.js.map +1 -0
  307. package/dist/tools/prompts.d.ts +8 -0
  308. package/dist/tools/prompts.d.ts.map +1 -0
  309. package/dist/tools/prompts.js +66 -0
  310. package/dist/tools/prompts.js.map +1 -0
  311. package/dist/tools/register-evaluation.d.ts +7 -0
  312. package/dist/tools/register-evaluation.d.ts.map +1 -0
  313. package/dist/tools/register-evaluation.js +303 -0
  314. package/dist/tools/register-evaluation.js.map +1 -0
  315. package/dist/tools/register-workflow.d.ts +7 -0
  316. package/dist/tools/register-workflow.d.ts.map +1 -0
  317. package/dist/tools/register-workflow.js +395 -0
  318. package/dist/tools/register-workflow.js.map +1 -0
  319. package/dist/tools/register.d.ts +7 -0
  320. package/dist/tools/register.d.ts.map +1 -0
  321. package/dist/tools/register.js +14 -0
  322. package/dist/tools/register.js.map +1 -0
  323. package/dist/tools/schemas.d.ts +26 -0
  324. package/dist/tools/schemas.d.ts.map +1 -0
  325. package/dist/tools/schemas.js +42 -0
  326. package/dist/tools/schemas.js.map +1 -0
  327. package/dist/types.d.ts +53 -2
  328. package/dist/types.d.ts.map +1 -1
  329. package/package.json +42 -3
  330. package/server.json +51 -3
@@ -1,21 +1,23 @@
1
- import { getLineNumbers, getLangFamily } from "./shared.js";
1
+ import { getLineNumbers, getLangLineNumbers, getLangFamily } from "./shared.js";
2
+ import * as LP from "../language-patterns.js";
2
3
  export function analyzeDatabase(code, language) {
3
4
  const findings = [];
4
5
  let ruleNum = 1;
5
6
  const prefix = "DB";
6
7
  const lang = getLangFamily(language);
7
- // SQL injection via string concatenation
8
- const sqlInjectionPattern = /(?:execute|query|raw|prepare)\s*\(\s*(?:`[^`]*(?:\$\{[^}]*\b(?:req|request|params|query|body|input|user|id|name|email)\b|\$\{[^}]*\+)|['"][^'"]*['"]\s*\+\s*(?:req\.|request\.|params\.|query\.|body\.|input|user|id|name|email)|['"][^'"]*['"]\s*\.\s*concat\s*\()/gi;
9
- const sqlInjectionLines = getLineNumbers(code, sqlInjectionPattern);
8
+ // SQL injection via string concatenation (multi-language)
9
+ const sqlInjectionLines = getLangLineNumbers(code, language, LP.SQL_INJECTION);
10
10
  if (sqlInjectionLines.length > 0) {
11
11
  findings.push({
12
12
  ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
13
13
  severity: "critical",
14
14
  title: "SQL injection via string concatenation",
15
- description: `Found ${sqlInjectionLines.length} instance(s) of SQL queries built with string concatenation or template literals containing user input. This is the most common and dangerous database vulnerability.`,
15
+ description: `Found ${sqlInjectionLines.length} instance(s) of SQL queries built with string concatenation or interpolation containing user input. This is the most common and dangerous database vulnerability.`,
16
16
  lineNumbers: sqlInjectionLines,
17
17
  recommendation: "Use parameterized queries (placeholders) or prepared statements. ORMs handle this automatically. Never concatenate user input into SQL strings.",
18
18
  reference: "OWASP SQL Injection Prevention Cheat Sheet / CWE-89",
19
+ suggestedFix: "Use parameterized queries: db.query('SELECT * FROM users WHERE id = $1', [userId]) (JS), cursor.execute('...WHERE id = %s', (uid,)) (Python), db.Query('...WHERE id = $1', id) (Go).",
20
+ confidence: 0.95,
19
21
  });
20
22
  }
21
23
  // SELECT * usage
@@ -30,24 +32,30 @@ export function analyzeDatabase(code, language) {
30
32
  lineNumbers: selectStarLines,
31
33
  recommendation: "Select only the columns you need: SELECT id, name, email FROM users. This reduces network transfer, memory usage, and improves query plan optimization.",
32
34
  reference: "SQL Performance Best Practices",
35
+ suggestedFix: "Replace SELECT * with explicit columns: SELECT id, name, email FROM users WHERE active = true; — reduces data transfer and enables index-only scans.",
36
+ confidence: 0.9,
33
37
  });
34
38
  }
35
- // N+1 query pattern (query in a loop)
39
+ // N+1 query pattern (query in a loop) (multi-language)
36
40
  const lines = code.split("\n");
37
41
  const n1Lines = [];
42
+ const dbQueryLines = new Set(getLangLineNumbers(code, language, LP.DB_QUERY));
43
+ const loopLines = new Set(getLangLineNumbers(code, language, LP.FOR_LOOP));
38
44
  let inLoop = false;
39
45
  let loopDepth = 0;
40
46
  for (let i = 0; i < lines.length; i++) {
41
47
  const line = lines[i];
42
- if (/\b(?:for|while|forEach|\.map|\.each)\b/.test(line)) {
48
+ if (loopLines.has(i + 1) || /\b(?:for|while|forEach|\.map|\.each)\b/.test(line)) {
43
49
  inLoop = true;
44
50
  loopDepth++;
45
51
  }
46
- if (inLoop && /(?:await\s+)?(?:db\.|query|find|findOne|findMany|execute|select|fetch)\s*\(/.test(line)) {
52
+ if (inLoop &&
53
+ (dbQueryLines.has(i + 1) ||
54
+ /(?:await\s+)?(?:db\.|query|find|findOne|findMany|execute|select|fetch)\s*\(/.test(line))) {
47
55
  n1Lines.push(i + 1);
48
56
  }
49
57
  if (inLoop) {
50
- const opens = (line.match(/\{/g) || []).length;
58
+ const opens = (line.match(/\{/g) || []).length + (line.match(/:\s*$/g) || []).length;
51
59
  const closes = (line.match(/\}/g) || []).length;
52
60
  loopDepth += opens - closes;
53
61
  if (loopDepth <= 0) {
@@ -65,6 +73,8 @@ export function analyzeDatabase(code, language) {
65
73
  lineNumbers: n1Lines,
66
74
  recommendation: "Use batch queries (WHERE id IN (...)), JOINs, or ORM eager loading (include/populate) to fetch related data in a single query.",
67
75
  reference: "N+1 Query Problem / ORM Performance Patterns",
76
+ suggestedFix: "Batch queries: const items = await db.query('SELECT * FROM items WHERE parent_id = ANY($1)', [parentIds]); instead of querying in a loop.",
77
+ confidence: 0.75,
68
78
  });
69
79
  }
70
80
  // No connection pooling
@@ -78,6 +88,8 @@ export function analyzeDatabase(code, language) {
78
88
  description: "Database connection created without visible connection pooling. Creating a new connection per request is expensive and unsustainable under load.",
79
89
  recommendation: "Use connection pooling (e.g., pg.Pool, mysql2.createPool, mongoose connection pooling). Configure pool size based on expected concurrent connections.",
80
90
  reference: "Database Connection Pooling Best Practices",
91
+ suggestedFix: "Use connection pool: const pool = new Pool({ max: 20, idleTimeoutMillis: 30000 }); const client = await pool.connect(); try { ... } finally { client.release(); }",
92
+ confidence: 0.7,
81
93
  });
82
94
  }
83
95
  // Raw SQL queries (no ORM/query builder)
@@ -92,6 +104,8 @@ export function analyzeDatabase(code, language) {
92
104
  lineNumbers: rawSqlLines.slice(0, 5),
93
105
  recommendation: "Consider using a query builder (Knex, Prisma, Drizzle, SQLAlchemy) or ORM for type safety, parameterization, and database portability.",
94
106
  reference: "ORM vs Raw SQL Best Practices",
107
+ suggestedFix: "Use a query builder: const users = await knex('users').select('id', 'name').where({ active: true }); — provides parameterization and type safety.",
108
+ confidence: 0.8,
95
109
  });
96
110
  }
97
111
  // No transaction handling
@@ -105,6 +119,8 @@ export function analyzeDatabase(code, language) {
105
119
  description: "Data is modified (INSERT/UPDATE/DELETE) without transaction wrappers. If an error occurs mid-operation, data could be left in an inconsistent state.",
106
120
  recommendation: "Wrap multi-step data mutations in transactions. Use BEGIN/COMMIT/ROLLBACK or ORM transaction APIs to ensure atomicity.",
107
121
  reference: "ACID Properties / Database Transaction Best Practices",
122
+ suggestedFix: "Wrap mutations in transaction: await db.transaction(async (trx) => { await trx('orders').insert(order); await trx('inventory').decrement('qty', 1); });",
123
+ confidence: 0.7,
108
124
  });
109
125
  }
110
126
  // Hardcoded connection strings
@@ -119,6 +135,8 @@ export function analyzeDatabase(code, language) {
119
135
  lineNumbers: connStringLines,
120
136
  recommendation: "Use environment variables for connection strings. Store credentials in a secrets manager. Use different connection strings per environment.",
121
137
  reference: "12-Factor App: Config / OWASP Secrets Management",
138
+ suggestedFix: "Use env vars: const connectionString = process.env.DATABASE_URL; never hardcode credentials in source code.",
139
+ confidence: 0.9,
122
140
  });
123
141
  }
124
142
  // DROP TABLE / TRUNCATE without safeguards
@@ -133,6 +151,8 @@ export function analyzeDatabase(code, language) {
133
151
  lineNumbers: destructiveDbLines,
134
152
  recommendation: "Never run destructive DDL from application code. Use migration tools (Prisma, Flyway, Alembic) with review and rollback support. Require elevated permissions for DDL.",
135
153
  reference: "Database Migration Best Practices / Least Privilege",
154
+ suggestedFix: "Move DDL to migration files: npx prisma migrate dev --name drop_legacy_table; never embed DROP TABLE in application code.",
155
+ confidence: 0.95,
136
156
  });
137
157
  }
138
158
  // No migration tooling
@@ -146,6 +166,8 @@ export function analyzeDatabase(code, language) {
146
166
  description: "DDL statements (CREATE TABLE, ALTER TABLE) found without migration tooling. Manual schema changes are unreproducible and error-prone across environments.",
147
167
  recommendation: "Use a database migration tool (Prisma, Knex, Flyway, Alembic) to version schema changes. Migrations should be idempotent and reversible.",
148
168
  reference: "Database Migration Best Practices / Evolutionary Database Design",
169
+ suggestedFix: "Use migration tool: npx prisma migrate dev --name add_users_table; or knex migrate:make create_users — version-controlled, reversible schema changes.",
170
+ confidence: 0.7,
149
171
  });
150
172
  }
151
173
  // Missing database indexes heuristic
@@ -159,6 +181,8 @@ export function analyzeDatabase(code, language) {
159
181
  description: "SQL queries filter on columns but no index creation is visible. Without indexes, queries perform full table scans which degrade exponentially with data volume.",
160
182
  recommendation: "Create indexes on columns used in WHERE, JOIN, and ORDER BY clauses. Monitor slow query logs. Use EXPLAIN to verify query plans.",
161
183
  reference: "SQL Indexing Best Practices / Use The Index, Luke!",
184
+ suggestedFix: "Add indexes: CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_orders_user_date ON orders(user_id, created_at); use EXPLAIN to verify.",
185
+ confidence: 0.7,
162
186
  });
163
187
  }
164
188
  // Database credentials in connection string
@@ -173,6 +197,8 @@ export function analyzeDatabase(code, language) {
173
197
  lineNumbers: credInConnLines,
174
198
  recommendation: "Use separate credential parameters or environment variables. Consider IAM/managed identity for passwordless database connections in cloud environments.",
175
199
  reference: "OWASP: Credential Management / Azure Managed Identity",
200
+ suggestedFix: "Use env vars: const client = new Client({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD });",
201
+ confidence: 0.9,
176
202
  });
177
203
  }
178
204
  return findings;
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/evaluators/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/evaluators/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { DependencyVerdict } from "../types.js";
2
+ /**
3
+ * Parse a manifest file and analyze dependencies for supply-chain risks.
4
+ */
5
+ export declare function analyzeDependencies(manifest: string, manifestType: string): DependencyVerdict;
6
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/evaluators/dependencies.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,aAAa,CAAC;AAG/E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,iBAAiB,CA2M7F"}
@@ -0,0 +1,204 @@
1
+ // ─── Dependency / Supply-chain Analysis ───────────────────────────────────────
2
+ // Parses manifest files (package.json, requirements.txt, Cargo.toml, etc.)
3
+ // and detects supply-chain risks such as unpinned versions, typosquatting,
4
+ // and misclassified dev dependencies.
5
+ // ──────────────────────────────────────────────────────────────────────────────
6
+ import { calculateScore, deriveVerdict } from "./shared.js";
7
+ /**
8
+ * Parse a manifest file and analyze dependencies for supply-chain risks.
9
+ */
10
+ export function analyzeDependencies(manifest, manifestType) {
11
+ const dependencies = [];
12
+ const findings = [];
13
+ let ruleNum = 1;
14
+ const prefix = "SUPPLY";
15
+ // Parse manifest based on type
16
+ if (manifestType === "package.json") {
17
+ try {
18
+ const pkg = JSON.parse(manifest);
19
+ for (const [name, version] of Object.entries(pkg.dependencies ?? {})) {
20
+ dependencies.push({
21
+ name,
22
+ version: String(version),
23
+ isDev: false,
24
+ source: manifestType,
25
+ });
26
+ }
27
+ for (const [name, version] of Object.entries(pkg.devDependencies ?? {})) {
28
+ dependencies.push({
29
+ name,
30
+ version: String(version),
31
+ isDev: true,
32
+ source: manifestType,
33
+ });
34
+ }
35
+ }
36
+ catch {
37
+ findings.push({
38
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
39
+ severity: "high",
40
+ title: "Invalid package.json",
41
+ description: "Failed to parse package.json. The file may be malformed.",
42
+ recommendation: "Validate and fix the JSON structure.",
43
+ });
44
+ }
45
+ }
46
+ else if (manifestType === "requirements.txt") {
47
+ for (const line of manifest.split("\n")) {
48
+ const trimmed = line.trim();
49
+ if (!trimmed || trimmed.startsWith("#"))
50
+ continue;
51
+ const match = trimmed.match(/^([a-zA-Z0-9_-]+)\s*(?:[>=<~!]+\s*(.+))?$/);
52
+ if (match) {
53
+ dependencies.push({
54
+ name: match[1],
55
+ version: match[2] ?? "*",
56
+ isDev: false,
57
+ source: manifestType,
58
+ });
59
+ }
60
+ }
61
+ }
62
+ else if (manifestType === "Cargo.toml") {
63
+ // Match [dependencies] section up to the next [section] header or EOF
64
+ const depSection = manifest.match(/\[dependencies\]\s*\n([\s\S]*?)(?=\n\s*\[|\s*$)/)?.[1];
65
+ if (depSection) {
66
+ for (const line of depSection.split("\n")) {
67
+ // Simple: name = "version"
68
+ const simple = line.match(/^(\w[\w-]*)\s*=\s*"([^"]+)"/);
69
+ if (simple) {
70
+ dependencies.push({
71
+ name: simple[1],
72
+ version: simple[2],
73
+ isDev: false,
74
+ source: manifestType,
75
+ });
76
+ continue;
77
+ }
78
+ // Inline table: name = { version = "...", ... }
79
+ const table = line.match(/^(\w[\w-]*)\s*=\s*\{[^}]*version\s*=\s*"([^"]+)"/);
80
+ if (table) {
81
+ dependencies.push({
82
+ name: table[1],
83
+ version: table[2],
84
+ isDev: false,
85
+ source: manifestType,
86
+ });
87
+ }
88
+ }
89
+ }
90
+ }
91
+ else if (manifestType === "go.mod") {
92
+ for (const line of manifest.split("\n")) {
93
+ const match = line.trim().match(/^([\w./\-@]+)\s+(v[\d.]+(?:-[\w.]+)?)/);
94
+ if (match) {
95
+ dependencies.push({
96
+ name: match[1],
97
+ version: match[2],
98
+ isDev: false,
99
+ source: manifestType,
100
+ });
101
+ }
102
+ }
103
+ }
104
+ else if (manifestType === "pom.xml") {
105
+ const depRegex = /<dependency>[\s\S]*?<groupId>([^<]+)<\/groupId>[\s\S]*?<artifactId>([^<]+)<\/artifactId>[\s\S]*?(?:<version>([^<]*)<\/version>)?[\s\S]*?<\/dependency>/g;
106
+ let m;
107
+ while ((m = depRegex.exec(manifest)) !== null) {
108
+ dependencies.push({
109
+ name: `${m[1]}:${m[2]}`,
110
+ version: m[3] ?? "managed",
111
+ isDev: false,
112
+ source: manifestType,
113
+ });
114
+ }
115
+ }
116
+ else if (manifestType === "csproj") {
117
+ const pkgRegex = /<PackageReference\s+Include="([^"]+)"\s+Version="([^"]*)"/g;
118
+ let m;
119
+ while ((m = pkgRegex.exec(manifest)) !== null) {
120
+ dependencies.push({
121
+ name: m[1],
122
+ version: m[2],
123
+ isDev: false,
124
+ source: manifestType,
125
+ });
126
+ }
127
+ }
128
+ // Supply-chain analysis rules
129
+ // Wildcard / unpinned versions
130
+ const unpinned = dependencies.filter((d) => d.version === "*" ||
131
+ d.version === "latest" ||
132
+ /^\^/.test(d.version) ||
133
+ /^~/.test(d.version) ||
134
+ />=/.test(d.version));
135
+ if (unpinned.length > 0) {
136
+ findings.push({
137
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
138
+ severity: "medium",
139
+ title: "Unpinned dependency versions",
140
+ description: `${unpinned.length} dependencies use unpinned/loose version ranges: ${unpinned
141
+ .slice(0, 5)
142
+ .map((d) => `${d.name}@${d.version}`)
143
+ .join(", ")}. This can lead to unexpected breaking changes and supply-chain attacks.`,
144
+ recommendation: "Pin dependencies to exact versions or use a lockfile (package-lock.json, Cargo.lock, go.sum).",
145
+ reference: "Supply Chain Security Best Practices",
146
+ });
147
+ }
148
+ // Too many dependencies
149
+ if (dependencies.filter((d) => !d.isDev).length > 50) {
150
+ findings.push({
151
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
152
+ severity: "low",
153
+ title: "Large number of production dependencies",
154
+ description: `${dependencies.filter((d) => !d.isDev).length} production dependencies detected. Each dependency increases attack surface and maintenance burden.`,
155
+ recommendation: "Audit dependencies regularly. Remove unused packages. Consider inlining small utilities.",
156
+ reference: "Dependency Minimization Best Practices",
157
+ });
158
+ }
159
+ // Known risky package name patterns (typosquatting indicators)
160
+ const knownPrefixes = ["lodash", "express", "react", "vue", "angular", "axios", "moment"];
161
+ const suspicious = dependencies.filter((d) => knownPrefixes.some((p) => d.name !== p && d.name.startsWith(p) && d.name.length <= p.length + 3));
162
+ if (suspicious.length > 0) {
163
+ findings.push({
164
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
165
+ severity: "high",
166
+ title: "Potentially typosquatted package names",
167
+ description: `Suspicious package names detected that are similar to popular packages: ${suspicious.map((d) => d.name).join(", ")}. These may be typosquatting attempts.`,
168
+ recommendation: "Verify these package names are intentional and not typos of well-known packages.",
169
+ reference: "NPM Typosquatting / Supply Chain Attacks",
170
+ });
171
+ }
172
+ // Dev dependencies in production flag
173
+ const devInProd = dependencies.filter((d) => !d.isDev && /test|jest|mocha|chai|sinon|eslint|prettier|typescript|ts-node|nodemon/i.test(d.name));
174
+ if (devInProd.length > 0) {
175
+ findings.push({
176
+ ruleId: `${prefix}-${String(ruleNum++).padStart(3, "0")}`,
177
+ severity: "medium",
178
+ title: "Development tools in production dependencies",
179
+ description: `The following look like dev tools but are listed as production dependencies: ${devInProd.map((d) => d.name).join(", ")}. This inflates deployment size and attack surface.`,
180
+ recommendation: "Move development tools to devDependencies (or equivalent dev scope).",
181
+ });
182
+ }
183
+ // No lockfile hint
184
+ if (manifestType === "package.json" && !manifest.includes("lockfileVersion")) {
185
+ findings.push({
186
+ ruleId: `${prefix}-${String(ruleNum).padStart(3, "0")}`,
187
+ severity: "info",
188
+ title: "Reminder: ensure a lockfile is committed",
189
+ description: "This analysis is based on the manifest. Ensure a lockfile (package-lock.json, yarn.lock) is committed for reproducible builds.",
190
+ recommendation: "Commit your lockfile to version control. Run npm ci in CI/CD instead of npm install.",
191
+ });
192
+ }
193
+ const score = calculateScore(findings);
194
+ const verdict = deriveVerdict(findings, score);
195
+ return {
196
+ totalDependencies: dependencies.length,
197
+ findings,
198
+ dependencies,
199
+ score,
200
+ verdict,
201
+ summary: `Dependency analysis: ${dependencies.length} dependencies, ${findings.length} findings, score ${score}/100 — ${verdict.toUpperCase()}`,
202
+ };
203
+ }
204
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/evaluators/dependencies.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { Finding } from "../types.js";
1
+ import type { Finding } from "../types.js";
2
2
  export declare function analyzeDependencyHealth(code: string, language: string): Finding[];
3
3
  //# sourceMappingURL=dependency-health.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependency-health.d.ts","sourceRoot":"","sources":["../../src/evaluators/dependency-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA+MjF"}
1
+ {"version":3,"file":"dependency-health.d.ts","sourceRoot":"","sources":["../../src/evaluators/dependency-health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAggBjF"}