@kevinrabun/judges 3.38.0 → 3.41.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 (379) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +5 -4
  3. package/dist/api.d.ts +5 -2
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +5 -1
  6. package/dist/api.js.map +1 -1
  7. package/dist/ast/structural-parser.js +3 -3
  8. package/dist/ast/structural-parser.js.map +1 -1
  9. package/dist/calibration.d.ts +35 -0
  10. package/dist/calibration.d.ts.map +1 -1
  11. package/dist/calibration.js +52 -0
  12. package/dist/calibration.js.map +1 -1
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +370 -16
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/auto-calibrate.d.ts +15 -0
  17. package/dist/commands/auto-calibrate.d.ts.map +1 -0
  18. package/dist/commands/auto-calibrate.js +107 -0
  19. package/dist/commands/auto-calibrate.js.map +1 -0
  20. package/dist/commands/benchmark-languages.js +4 -4
  21. package/dist/commands/benchmark.d.ts +2 -1
  22. package/dist/commands/benchmark.d.ts.map +1 -1
  23. package/dist/commands/benchmark.js +67 -2
  24. package/dist/commands/benchmark.js.map +1 -1
  25. package/dist/commands/calibration-dashboard.d.ts.map +1 -1
  26. package/dist/commands/calibration-dashboard.js +198 -0
  27. package/dist/commands/calibration-dashboard.js.map +1 -1
  28. package/dist/commands/calibration-share.d.ts +31 -0
  29. package/dist/commands/calibration-share.d.ts.map +1 -0
  30. package/dist/commands/calibration-share.js +183 -0
  31. package/dist/commands/calibration-share.js.map +1 -0
  32. package/dist/commands/compliance-report.d.ts +35 -0
  33. package/dist/commands/compliance-report.d.ts.map +1 -0
  34. package/dist/commands/compliance-report.js +162 -0
  35. package/dist/commands/compliance-report.js.map +1 -0
  36. package/dist/commands/config-migrate.d.ts +44 -0
  37. package/dist/commands/config-migrate.d.ts.map +1 -0
  38. package/dist/commands/config-migrate.js +241 -0
  39. package/dist/commands/config-migrate.js.map +1 -0
  40. package/dist/commands/dedup-report.d.ts +13 -0
  41. package/dist/commands/dedup-report.d.ts.map +1 -0
  42. package/dist/commands/dedup-report.js +138 -0
  43. package/dist/commands/dedup-report.js.map +1 -0
  44. package/dist/commands/dep-audit.d.ts +53 -0
  45. package/dist/commands/dep-audit.d.ts.map +1 -0
  46. package/dist/commands/dep-audit.js +278 -0
  47. package/dist/commands/dep-audit.js.map +1 -0
  48. package/dist/commands/deprecated.d.ts +48 -0
  49. package/dist/commands/deprecated.d.ts.map +1 -0
  50. package/dist/commands/deprecated.js +202 -0
  51. package/dist/commands/deprecated.js.map +1 -0
  52. package/dist/commands/diff.d.ts.map +1 -1
  53. package/dist/commands/diff.js +8 -3
  54. package/dist/commands/diff.js.map +1 -1
  55. package/dist/commands/feedback-rules.d.ts +29 -0
  56. package/dist/commands/feedback-rules.d.ts.map +1 -0
  57. package/dist/commands/feedback-rules.js +174 -0
  58. package/dist/commands/feedback-rules.js.map +1 -0
  59. package/dist/commands/feedback.d.ts +12 -0
  60. package/dist/commands/feedback.d.ts.map +1 -1
  61. package/dist/commands/feedback.js +16 -0
  62. package/dist/commands/feedback.js.map +1 -1
  63. package/dist/commands/fix-pr.d.ts +23 -0
  64. package/dist/commands/fix-pr.d.ts.map +1 -0
  65. package/dist/commands/fix-pr.js +323 -0
  66. package/dist/commands/fix-pr.js.map +1 -0
  67. package/dist/commands/fix.d.ts.map +1 -1
  68. package/dist/commands/fix.js +33 -1
  69. package/dist/commands/fix.js.map +1 -1
  70. package/dist/commands/governance.d.ts +32 -0
  71. package/dist/commands/governance.d.ts.map +1 -0
  72. package/dist/commands/governance.js +203 -0
  73. package/dist/commands/governance.js.map +1 -0
  74. package/dist/commands/help.d.ts +8 -0
  75. package/dist/commands/help.d.ts.map +1 -0
  76. package/dist/commands/help.js +303 -0
  77. package/dist/commands/help.js.map +1 -0
  78. package/dist/commands/hook.d.ts.map +1 -1
  79. package/dist/commands/hook.js +17 -20
  80. package/dist/commands/hook.js.map +1 -1
  81. package/dist/commands/interactive-fix.d.ts +23 -0
  82. package/dist/commands/interactive-fix.d.ts.map +1 -0
  83. package/dist/commands/interactive-fix.js +140 -0
  84. package/dist/commands/interactive-fix.js.map +1 -0
  85. package/dist/commands/llm-benchmark.d.ts +119 -0
  86. package/dist/commands/llm-benchmark.d.ts.map +1 -0
  87. package/dist/commands/llm-benchmark.js +396 -0
  88. package/dist/commands/llm-benchmark.js.map +1 -0
  89. package/dist/commands/metrics-dashboard.d.ts +22 -0
  90. package/dist/commands/metrics-dashboard.d.ts.map +1 -0
  91. package/dist/commands/metrics-dashboard.js +335 -0
  92. package/dist/commands/metrics-dashboard.js.map +1 -0
  93. package/dist/commands/metrics.d.ts +58 -0
  94. package/dist/commands/metrics.d.ts.map +1 -0
  95. package/dist/commands/metrics.js +242 -0
  96. package/dist/commands/metrics.js.map +1 -0
  97. package/dist/commands/monorepo.d.ts +38 -0
  98. package/dist/commands/monorepo.d.ts.map +1 -0
  99. package/dist/commands/monorepo.js +233 -0
  100. package/dist/commands/monorepo.js.map +1 -0
  101. package/dist/commands/notify.d.ts +79 -0
  102. package/dist/commands/notify.d.ts.map +1 -0
  103. package/dist/commands/notify.js +325 -0
  104. package/dist/commands/notify.js.map +1 -0
  105. package/dist/commands/onboard.d.ts +13 -0
  106. package/dist/commands/onboard.d.ts.map +1 -0
  107. package/dist/commands/onboard.js +179 -0
  108. package/dist/commands/onboard.js.map +1 -0
  109. package/dist/commands/org-metrics.d.ts +24 -0
  110. package/dist/commands/org-metrics.d.ts.map +1 -0
  111. package/dist/commands/org-metrics.js +238 -0
  112. package/dist/commands/org-metrics.js.map +1 -0
  113. package/dist/commands/override.d.ts +62 -0
  114. package/dist/commands/override.d.ts.map +1 -0
  115. package/dist/commands/override.js +264 -0
  116. package/dist/commands/override.js.map +1 -0
  117. package/dist/commands/parity.d.ts +31 -0
  118. package/dist/commands/parity.d.ts.map +1 -0
  119. package/dist/commands/parity.js +213 -0
  120. package/dist/commands/parity.js.map +1 -0
  121. package/dist/commands/plugin-search.d.ts +40 -0
  122. package/dist/commands/plugin-search.d.ts.map +1 -0
  123. package/dist/commands/plugin-search.js +328 -0
  124. package/dist/commands/plugin-search.js.map +1 -0
  125. package/dist/commands/plugins.d.ts +13 -0
  126. package/dist/commands/plugins.d.ts.map +1 -0
  127. package/dist/commands/plugins.js +105 -0
  128. package/dist/commands/plugins.js.map +1 -0
  129. package/dist/commands/quality-gate.d.ts +70 -0
  130. package/dist/commands/quality-gate.d.ts.map +1 -0
  131. package/dist/commands/quality-gate.js +264 -0
  132. package/dist/commands/quality-gate.js.map +1 -0
  133. package/dist/commands/review.js +1 -1
  134. package/dist/commands/review.js.map +1 -1
  135. package/dist/commands/snapshot.d.ts +27 -0
  136. package/dist/commands/snapshot.d.ts.map +1 -1
  137. package/dist/commands/snapshot.js +99 -0
  138. package/dist/commands/snapshot.js.map +1 -1
  139. package/dist/commands/trace.d.ts +65 -0
  140. package/dist/commands/trace.d.ts.map +1 -0
  141. package/dist/commands/trace.js +246 -0
  142. package/dist/commands/trace.js.map +1 -0
  143. package/dist/commands/trust-ramp.d.ts +30 -0
  144. package/dist/commands/trust-ramp.d.ts.map +1 -0
  145. package/dist/commands/trust-ramp.js +190 -0
  146. package/dist/commands/trust-ramp.js.map +1 -0
  147. package/dist/config.d.ts +5 -0
  148. package/dist/config.d.ts.map +1 -1
  149. package/dist/config.js +65 -0
  150. package/dist/config.js.map +1 -1
  151. package/dist/data-adapter.d.ts +124 -0
  152. package/dist/data-adapter.d.ts.map +1 -0
  153. package/dist/data-adapter.js +213 -0
  154. package/dist/data-adapter.js.map +1 -0
  155. package/dist/evaluators/accessibility.js +1 -1
  156. package/dist/evaluators/accessibility.js.map +1 -1
  157. package/dist/evaluators/ai-code-safety.d.ts.map +1 -1
  158. package/dist/evaluators/ai-code-safety.js +1 -4
  159. package/dist/evaluators/ai-code-safety.js.map +1 -1
  160. package/dist/evaluators/cost-effectiveness.js +1 -1
  161. package/dist/evaluators/cost-effectiveness.js.map +1 -1
  162. package/dist/evaluators/false-positive-review.js +4 -4
  163. package/dist/evaluators/false-positive-review.js.map +1 -1
  164. package/dist/evaluators/framework-rules.d.ts +59 -0
  165. package/dist/evaluators/framework-rules.d.ts.map +1 -0
  166. package/dist/evaluators/framework-rules.js +292 -0
  167. package/dist/evaluators/framework-rules.js.map +1 -0
  168. package/dist/evaluators/iac-security.js +1 -1
  169. package/dist/evaluators/iac-security.js.map +1 -1
  170. package/dist/evaluators/index.d.ts.map +1 -1
  171. package/dist/evaluators/index.js +59 -10
  172. package/dist/evaluators/index.js.map +1 -1
  173. package/dist/evaluators/intent-alignment.d.ts +4 -0
  174. package/dist/evaluators/intent-alignment.d.ts.map +1 -1
  175. package/dist/evaluators/intent-alignment.js +163 -0
  176. package/dist/evaluators/intent-alignment.js.map +1 -1
  177. package/dist/evaluators/logic-review.js +1 -1
  178. package/dist/evaluators/logic-review.js.map +1 -1
  179. package/dist/evaluators/maintainability.js +1 -1
  180. package/dist/evaluators/maintainability.js.map +1 -1
  181. package/dist/evaluators/over-engineering.js +3 -3
  182. package/dist/evaluators/over-engineering.js.map +1 -1
  183. package/dist/evaluators/project.d.ts +12 -0
  184. package/dist/evaluators/project.d.ts.map +1 -1
  185. package/dist/evaluators/project.js +86 -0
  186. package/dist/evaluators/project.js.map +1 -1
  187. package/dist/evaluators/security.js +2 -2
  188. package/dist/evaluators/security.js.map +1 -1
  189. package/dist/evaluators/ux.js +1 -1
  190. package/dist/evaluators/ux.js.map +1 -1
  191. package/dist/finding-lifecycle.d.ts +9 -0
  192. package/dist/finding-lifecycle.d.ts.map +1 -1
  193. package/dist/finding-lifecycle.js +15 -0
  194. package/dist/finding-lifecycle.js.map +1 -1
  195. package/dist/fix-history.d.ts +9 -0
  196. package/dist/fix-history.d.ts.map +1 -1
  197. package/dist/fix-history.js +15 -0
  198. package/dist/fix-history.js.map +1 -1
  199. package/dist/formatters/sarif.d.ts +3 -0
  200. package/dist/formatters/sarif.d.ts.map +1 -1
  201. package/dist/formatters/sarif.js +36 -12
  202. package/dist/formatters/sarif.js.map +1 -1
  203. package/dist/github-app.d.ts +16 -1
  204. package/dist/github-app.d.ts.map +1 -1
  205. package/dist/github-app.js +85 -2
  206. package/dist/github-app.js.map +1 -1
  207. package/dist/index.js +5 -0
  208. package/dist/index.js.map +1 -1
  209. package/dist/judge-registry.d.ts +157 -0
  210. package/dist/judge-registry.d.ts.map +1 -0
  211. package/dist/judge-registry.js +273 -0
  212. package/dist/judge-registry.js.map +1 -0
  213. package/dist/judges/accessibility.d.ts.map +1 -1
  214. package/dist/judges/accessibility.js +4 -0
  215. package/dist/judges/accessibility.js.map +1 -1
  216. package/dist/judges/agent-instructions.d.ts.map +1 -1
  217. package/dist/judges/agent-instructions.js +4 -0
  218. package/dist/judges/agent-instructions.js.map +1 -1
  219. package/dist/judges/ai-code-safety.d.ts.map +1 -1
  220. package/dist/judges/ai-code-safety.js +4 -0
  221. package/dist/judges/ai-code-safety.js.map +1 -1
  222. package/dist/judges/api-contract.d.ts.map +1 -1
  223. package/dist/judges/api-contract.js +4 -0
  224. package/dist/judges/api-contract.js.map +1 -1
  225. package/dist/judges/api-design.d.ts.map +1 -1
  226. package/dist/judges/api-design.js +4 -0
  227. package/dist/judges/api-design.js.map +1 -1
  228. package/dist/judges/authentication.d.ts.map +1 -1
  229. package/dist/judges/authentication.js +4 -0
  230. package/dist/judges/authentication.js.map +1 -1
  231. package/dist/judges/backwards-compatibility.d.ts.map +1 -1
  232. package/dist/judges/backwards-compatibility.js +4 -0
  233. package/dist/judges/backwards-compatibility.js.map +1 -1
  234. package/dist/judges/caching.d.ts.map +1 -1
  235. package/dist/judges/caching.js +4 -0
  236. package/dist/judges/caching.js.map +1 -1
  237. package/dist/judges/ci-cd.d.ts.map +1 -1
  238. package/dist/judges/ci-cd.js +4 -0
  239. package/dist/judges/ci-cd.js.map +1 -1
  240. package/dist/judges/cloud-readiness.d.ts.map +1 -1
  241. package/dist/judges/cloud-readiness.js +4 -0
  242. package/dist/judges/cloud-readiness.js.map +1 -1
  243. package/dist/judges/code-structure.d.ts.map +1 -1
  244. package/dist/judges/code-structure.js +4 -0
  245. package/dist/judges/code-structure.js.map +1 -1
  246. package/dist/judges/compliance.d.ts.map +1 -1
  247. package/dist/judges/compliance.js +4 -0
  248. package/dist/judges/compliance.js.map +1 -1
  249. package/dist/judges/concurrency.d.ts.map +1 -1
  250. package/dist/judges/concurrency.js +4 -0
  251. package/dist/judges/concurrency.js.map +1 -1
  252. package/dist/judges/configuration-management.d.ts.map +1 -1
  253. package/dist/judges/configuration-management.js +4 -0
  254. package/dist/judges/configuration-management.js.map +1 -1
  255. package/dist/judges/cost-effectiveness.d.ts.map +1 -1
  256. package/dist/judges/cost-effectiveness.js +4 -0
  257. package/dist/judges/cost-effectiveness.js.map +1 -1
  258. package/dist/judges/cybersecurity.d.ts.map +1 -1
  259. package/dist/judges/cybersecurity.js +4 -0
  260. package/dist/judges/cybersecurity.js.map +1 -1
  261. package/dist/judges/data-security.d.ts.map +1 -1
  262. package/dist/judges/data-security.js +4 -0
  263. package/dist/judges/data-security.js.map +1 -1
  264. package/dist/judges/data-sovereignty.d.ts.map +1 -1
  265. package/dist/judges/data-sovereignty.js +4 -0
  266. package/dist/judges/data-sovereignty.js.map +1 -1
  267. package/dist/judges/database.d.ts.map +1 -1
  268. package/dist/judges/database.js +4 -0
  269. package/dist/judges/database.js.map +1 -1
  270. package/dist/judges/dependency-health.d.ts.map +1 -1
  271. package/dist/judges/dependency-health.js +4 -0
  272. package/dist/judges/dependency-health.js.map +1 -1
  273. package/dist/judges/documentation.d.ts.map +1 -1
  274. package/dist/judges/documentation.js +4 -0
  275. package/dist/judges/documentation.js.map +1 -1
  276. package/dist/judges/error-handling.d.ts.map +1 -1
  277. package/dist/judges/error-handling.js +4 -0
  278. package/dist/judges/error-handling.js.map +1 -1
  279. package/dist/judges/ethics-bias.d.ts.map +1 -1
  280. package/dist/judges/ethics-bias.js +4 -0
  281. package/dist/judges/ethics-bias.js.map +1 -1
  282. package/dist/judges/false-positive-review.d.ts.map +1 -1
  283. package/dist/judges/false-positive-review.js +2 -0
  284. package/dist/judges/false-positive-review.js.map +1 -1
  285. package/dist/judges/framework-safety.d.ts.map +1 -1
  286. package/dist/judges/framework-safety.js +4 -0
  287. package/dist/judges/framework-safety.js.map +1 -1
  288. package/dist/judges/hallucination-detection.d.ts.map +1 -1
  289. package/dist/judges/hallucination-detection.js +4 -0
  290. package/dist/judges/hallucination-detection.js.map +1 -1
  291. package/dist/judges/iac-security.d.ts.map +1 -1
  292. package/dist/judges/iac-security.js +4 -0
  293. package/dist/judges/iac-security.js.map +1 -1
  294. package/dist/judges/index.d.ts +59 -0
  295. package/dist/judges/index.d.ts.map +1 -1
  296. package/dist/judges/index.js +65 -189
  297. package/dist/judges/index.js.map +1 -1
  298. package/dist/judges/intent-alignment.d.ts.map +1 -1
  299. package/dist/judges/intent-alignment.js +4 -0
  300. package/dist/judges/intent-alignment.js.map +1 -1
  301. package/dist/judges/internationalization.d.ts.map +1 -1
  302. package/dist/judges/internationalization.js +4 -0
  303. package/dist/judges/internationalization.js.map +1 -1
  304. package/dist/judges/logging-privacy.d.ts.map +1 -1
  305. package/dist/judges/logging-privacy.js +4 -0
  306. package/dist/judges/logging-privacy.js.map +1 -1
  307. package/dist/judges/logic-review.d.ts.map +1 -1
  308. package/dist/judges/logic-review.js +4 -0
  309. package/dist/judges/logic-review.js.map +1 -1
  310. package/dist/judges/maintainability.d.ts.map +1 -1
  311. package/dist/judges/maintainability.js +4 -0
  312. package/dist/judges/maintainability.js.map +1 -1
  313. package/dist/judges/model-fingerprint.d.ts.map +1 -1
  314. package/dist/judges/model-fingerprint.js +4 -0
  315. package/dist/judges/model-fingerprint.js.map +1 -1
  316. package/dist/judges/multi-turn-coherence.d.ts.map +1 -1
  317. package/dist/judges/multi-turn-coherence.js +4 -0
  318. package/dist/judges/multi-turn-coherence.js.map +1 -1
  319. package/dist/judges/observability.d.ts.map +1 -1
  320. package/dist/judges/observability.js +4 -0
  321. package/dist/judges/observability.js.map +1 -1
  322. package/dist/judges/over-engineering.d.ts.map +1 -1
  323. package/dist/judges/over-engineering.js +4 -0
  324. package/dist/judges/over-engineering.js.map +1 -1
  325. package/dist/judges/performance.d.ts.map +1 -1
  326. package/dist/judges/performance.js +4 -0
  327. package/dist/judges/performance.js.map +1 -1
  328. package/dist/judges/portability.d.ts.map +1 -1
  329. package/dist/judges/portability.js +4 -0
  330. package/dist/judges/portability.js.map +1 -1
  331. package/dist/judges/rate-limiting.d.ts.map +1 -1
  332. package/dist/judges/rate-limiting.js +4 -0
  333. package/dist/judges/rate-limiting.js.map +1 -1
  334. package/dist/judges/reliability.d.ts.map +1 -1
  335. package/dist/judges/reliability.js +4 -0
  336. package/dist/judges/reliability.js.map +1 -1
  337. package/dist/judges/scalability.d.ts.map +1 -1
  338. package/dist/judges/scalability.js +4 -0
  339. package/dist/judges/scalability.js.map +1 -1
  340. package/dist/judges/security.d.ts.map +1 -1
  341. package/dist/judges/security.js +4 -0
  342. package/dist/judges/security.js.map +1 -1
  343. package/dist/judges/software-practices.d.ts.map +1 -1
  344. package/dist/judges/software-practices.js +4 -0
  345. package/dist/judges/software-practices.js.map +1 -1
  346. package/dist/judges/testing.d.ts.map +1 -1
  347. package/dist/judges/testing.js +4 -0
  348. package/dist/judges/testing.js.map +1 -1
  349. package/dist/judges/ux.d.ts.map +1 -1
  350. package/dist/judges/ux.js +4 -0
  351. package/dist/judges/ux.js.map +1 -1
  352. package/dist/parallel.d.ts +53 -0
  353. package/dist/parallel.d.ts.map +1 -0
  354. package/dist/parallel.js +170 -0
  355. package/dist/parallel.js.map +1 -0
  356. package/dist/plugins.d.ts +8 -51
  357. package/dist/plugins.d.ts.map +1 -1
  358. package/dist/plugins.js +16 -125
  359. package/dist/plugins.js.map +1 -1
  360. package/dist/security-ids.d.ts +24 -0
  361. package/dist/security-ids.d.ts.map +1 -0
  362. package/dist/security-ids.js +240 -0
  363. package/dist/security-ids.js.map +1 -0
  364. package/dist/tools/prompts.d.ts +4 -0
  365. package/dist/tools/prompts.d.ts.map +1 -1
  366. package/dist/tools/prompts.js +6 -4
  367. package/dist/tools/prompts.js.map +1 -1
  368. package/dist/tools/register-scaffold.d.ts +3 -0
  369. package/dist/tools/register-scaffold.d.ts.map +1 -0
  370. package/dist/tools/register-scaffold.js +399 -0
  371. package/dist/tools/register-scaffold.js.map +1 -0
  372. package/dist/tools/register.d.ts +1 -1
  373. package/dist/tools/register.d.ts.map +1 -1
  374. package/dist/tools/register.js +3 -1
  375. package/dist/tools/register.js.map +1 -1
  376. package/dist/types.d.ts +75 -0
  377. package/dist/types.d.ts.map +1 -1
  378. package/package.json +3 -2
  379. package/server.json +2 -2
@@ -0,0 +1,278 @@
1
+ /**
2
+ * `judges dep-audit` — Dependency vulnerability correlation.
3
+ *
4
+ * Correlates code-level findings with known vulnerabilities in project
5
+ * dependencies. Uses npm audit / pip audit output to enrich findings
6
+ * with CVE data, adding urgency context to code review.
7
+ *
8
+ * Usage:
9
+ * judges dep-audit # Audit current directory
10
+ * judges dep-audit --format json # JSON output
11
+ * judges dep-audit --correlate results.json # Correlate with findings
12
+ */
13
+ import { existsSync, readFileSync } from "fs";
14
+ import { execSync } from "child_process";
15
+ import { resolve, join } from "path";
16
+ // ─── npm Audit ──────────────────────────────────────────────────────────────
17
+ function runNpmAudit(dir) {
18
+ try {
19
+ const output = execSync("npm audit --json 2>/dev/null || true", {
20
+ cwd: dir,
21
+ encoding: "utf-8",
22
+ timeout: 30000,
23
+ });
24
+ const data = JSON.parse(output);
25
+ const vulns = [];
26
+ // npm audit v2 format (npm >= 7)
27
+ const advisories = (data.vulnerabilities || {});
28
+ for (const [name, info] of Object.entries(advisories)) {
29
+ const severity = mapNpmSeverity(info.severity);
30
+ const via = (info.via || []);
31
+ const cves = [];
32
+ const cwes = [];
33
+ let title = `Vulnerability in ${name}`;
34
+ let url;
35
+ for (const v of via) {
36
+ if (typeof v === "object" && v !== null) {
37
+ if (v.cve)
38
+ cves.push(v.cve);
39
+ if (v.cwe) {
40
+ const cweArr = Array.isArray(v.cwe) ? v.cwe : [v.cwe];
41
+ cwes.push(...cweArr.map((c) => c));
42
+ }
43
+ if (v.title)
44
+ title = v.title;
45
+ if (v.url)
46
+ url = v.url;
47
+ }
48
+ }
49
+ vulns.push({
50
+ name,
51
+ version: info.version || "unknown",
52
+ severity,
53
+ cves: [...new Set(cves)],
54
+ cwes: [...new Set(cwes)],
55
+ title,
56
+ url,
57
+ fixedIn: info.fixAvailable?.version,
58
+ });
59
+ }
60
+ return vulns;
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ }
66
+ function mapNpmSeverity(sev) {
67
+ switch (sev) {
68
+ case "critical":
69
+ return "critical";
70
+ case "high":
71
+ return "high";
72
+ case "moderate":
73
+ return "medium";
74
+ case "low":
75
+ return "low";
76
+ default:
77
+ return "info";
78
+ }
79
+ }
80
+ // ─── pip Audit ──────────────────────────────────────────────────────────────
81
+ function runPipAudit(dir) {
82
+ try {
83
+ const output = execSync("pip-audit --format=json 2>/dev/null || python -m pip_audit --format=json 2>/dev/null || true", {
84
+ cwd: dir,
85
+ encoding: "utf-8",
86
+ timeout: 30000,
87
+ });
88
+ if (!output.trim().startsWith("["))
89
+ return [];
90
+ const data = JSON.parse(output);
91
+ return data
92
+ .filter((entry) => entry.vulns && Array.isArray(entry.vulns) && entry.vulns.length > 0)
93
+ .map((entry) => {
94
+ const vulnEntries = entry.vulns;
95
+ return {
96
+ name: entry.name,
97
+ version: entry.version,
98
+ severity: "high",
99
+ cves: vulnEntries.map((v) => v.id || "").filter(Boolean),
100
+ cwes: [],
101
+ title: `Vulnerability in ${entry.name}`,
102
+ fixedIn: vulnEntries[0]?.fix_versions,
103
+ };
104
+ });
105
+ }
106
+ catch {
107
+ return [];
108
+ }
109
+ }
110
+ // ─── Correlation Engine ─────────────────────────────────────────────────────
111
+ /** CWE-to-rule mapping for correlating deps vulnerabilities with code findings */
112
+ const CWE_TO_RULE_PREFIX = {
113
+ "CWE-79": ["SEC", "XSS"],
114
+ "CWE-89": ["SEC", "SQLI"],
115
+ "CWE-94": ["SEC"],
116
+ "CWE-78": ["SEC", "CMD"],
117
+ "CWE-22": ["SEC", "PATH"],
118
+ "CWE-611": ["SEC"],
119
+ "CWE-502": ["SEC"],
120
+ "CWE-200": ["DATA"],
121
+ "CWE-287": ["AUTH"],
122
+ "CWE-306": ["AUTH"],
123
+ "CWE-352": ["SEC", "CSRF"],
124
+ "CWE-918": ["SEC", "SSRF"],
125
+ "CWE-1321": ["SEC"],
126
+ "CWE-400": ["PERF", "DOS"],
127
+ };
128
+ function correlateVulnsWithFindings(vulns, findings) {
129
+ const correlations = [];
130
+ for (const vuln of vulns) {
131
+ const related = [];
132
+ for (const finding of findings) {
133
+ // Match by CWE
134
+ if (finding.cweIds && vuln.cwes.length > 0) {
135
+ const overlap = finding.cweIds.filter((cwe) => vuln.cwes.includes(cwe));
136
+ if (overlap.length > 0) {
137
+ related.push({
138
+ ruleId: finding.ruleId,
139
+ title: finding.title,
140
+ reason: `Shares CWE: ${overlap.join(", ")} with vulnerable dep ${vuln.name}`,
141
+ });
142
+ continue;
143
+ }
144
+ }
145
+ // Match by rule prefix → CWE category
146
+ for (const cwe of vuln.cwes) {
147
+ const prefixes = CWE_TO_RULE_PREFIX[cwe] || [];
148
+ if (prefixes.some((p) => finding.ruleId.startsWith(p))) {
149
+ related.push({
150
+ ruleId: finding.ruleId,
151
+ title: finding.title,
152
+ reason: `Code pattern (${finding.ruleId}) relates to ${cwe} in vulnerable dep ${vuln.name}`,
153
+ });
154
+ break;
155
+ }
156
+ }
157
+ }
158
+ if (related.length > 0) {
159
+ correlations.push({ vulnerability: vuln, relatedFindings: related });
160
+ }
161
+ }
162
+ return correlations;
163
+ }
164
+ // ─── Main Audit Function ────────────────────────────────────────────────────
165
+ export function runDepAudit(dir, findings) {
166
+ let packageManager = "unknown";
167
+ let vulns = [];
168
+ // Detect and run audit
169
+ if (existsSync(join(dir, "package.json")) || existsSync(join(dir, "package-lock.json"))) {
170
+ packageManager = "npm";
171
+ vulns = runNpmAudit(dir);
172
+ }
173
+ else if (existsSync(join(dir, "requirements.txt")) ||
174
+ existsSync(join(dir, "pyproject.toml")) ||
175
+ existsSync(join(dir, "Pipfile"))) {
176
+ packageManager = "pip";
177
+ vulns = runPipAudit(dir);
178
+ }
179
+ const severityCounts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
180
+ for (const v of vulns) {
181
+ severityCounts[v.severity]++;
182
+ }
183
+ const correlations = findings ? correlateVulnsWithFindings(vulns, findings) : [];
184
+ return {
185
+ packageManager,
186
+ vulnerabilities: vulns,
187
+ totalVulnerabilities: vulns.length,
188
+ severityCounts,
189
+ correlations,
190
+ };
191
+ }
192
+ // ─── CLI Runner ─────────────────────────────────────────────────────────────
193
+ export function runDepAuditCommand(argv) {
194
+ if (argv.includes("--help") || argv.includes("-h")) {
195
+ console.log(`
196
+ judges dep-audit — Dependency vulnerability correlation
197
+
198
+ Usage:
199
+ judges dep-audit [dir] Audit dependencies
200
+ judges dep-audit --correlate results.json Correlate with code findings
201
+ judges dep-audit --format json JSON output
202
+
203
+ Supports:
204
+ • npm (package.json / package-lock.json)
205
+ • pip (requirements.txt / pyproject.toml / Pipfile)
206
+
207
+ Correlates dependency vulnerabilities with code findings by CWE mapping.
208
+
209
+ Options:
210
+ --correlate <file> Path to Judges JSON results file
211
+ --format <fmt> Output format: text, json
212
+ --help, -h Show this help
213
+ `);
214
+ return;
215
+ }
216
+ const dir = argv.find((a, i) => i > 1 && !a.startsWith("-") && argv[i - 1] !== "--correlate" && argv[i - 1] !== "--format") ||
217
+ ".";
218
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
219
+ const correlatePath = argv.find((_a, i) => argv[i - 1] === "--correlate");
220
+ // Load findings for correlation if provided
221
+ let findings;
222
+ if (correlatePath && existsSync(correlatePath)) {
223
+ try {
224
+ const data = JSON.parse(readFileSync(correlatePath, "utf-8"));
225
+ findings = data.findings || [];
226
+ }
227
+ catch {
228
+ console.error(`Warning: Could not parse findings from ${correlatePath}`);
229
+ }
230
+ }
231
+ console.log(`\n Running dependency audit in ${resolve(dir)}...\n`);
232
+ const result = runDepAudit(resolve(dir), findings);
233
+ if (format === "json") {
234
+ console.log(JSON.stringify(result, null, 2));
235
+ return;
236
+ }
237
+ // Text output
238
+ if (result.packageManager === "unknown") {
239
+ console.log(" No supported package manifest found (package.json, requirements.txt, etc.)\n");
240
+ return;
241
+ }
242
+ console.log(` Package manager: ${result.packageManager}`);
243
+ console.log(` Vulnerabilities: ${result.totalVulnerabilities}\n`);
244
+ if (result.totalVulnerabilities === 0) {
245
+ console.log(" ✅ No known vulnerabilities found.\n");
246
+ return;
247
+ }
248
+ // Severity breakdown
249
+ for (const sev of ["critical", "high", "medium", "low", "info"]) {
250
+ if (result.severityCounts[sev] > 0) {
251
+ console.log(` ${sev.toUpperCase().padEnd(10)} ${result.severityCounts[sev]}`);
252
+ }
253
+ }
254
+ console.log("");
255
+ // Top vulnerabilities
256
+ for (const vuln of result.vulnerabilities.slice(0, 15)) {
257
+ const fixInfo = vuln.fixedIn ? ` → fix: ${vuln.fixedIn}` : "";
258
+ console.log(` • [${vuln.severity.toUpperCase()}] ${vuln.name}@${vuln.version}: ${vuln.title}${fixInfo}`);
259
+ if (vuln.cves.length > 0) {
260
+ console.log(` CVE: ${vuln.cves.join(", ")}`);
261
+ }
262
+ }
263
+ // Correlations
264
+ if (result.correlations.length > 0) {
265
+ console.log(`\n ─── Code ↔ Dependency Correlations ───\n`);
266
+ for (const corr of result.correlations) {
267
+ console.log(` 📦 ${corr.vulnerability.name} (${corr.vulnerability.cves.join(", ")})`);
268
+ for (const rel of corr.relatedFindings) {
269
+ console.log(` ↳ ${rel.ruleId}: ${rel.reason}`);
270
+ }
271
+ }
272
+ }
273
+ console.log("");
274
+ if (result.severityCounts.critical > 0 || result.severityCounts.high > 0) {
275
+ process.exit(1);
276
+ }
277
+ }
278
+ //# sourceMappingURL=dep-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dep-audit.js","sourceRoot":"","sources":["../../src/commands/dep-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Rule deprecation lifecycle management.
3
+ *
4
+ * Provides a registry of deprecated Judges rules with migration guidance,
5
+ * sunset dates, and replacement rules. Emits warnings when deprecated
6
+ * rules appear in findings or config.
7
+ *
8
+ * Usage:
9
+ * judges deprecated # List all deprecated rules
10
+ * judges deprecated --check .judgesrc # Check config for deprecated rules
11
+ * judges deprecated --format json # JSON output
12
+ */
13
+ export interface DeprecatedRule {
14
+ /** The deprecated rule ID */
15
+ ruleId: string;
16
+ /** When it was deprecated (version) */
17
+ deprecatedIn: string;
18
+ /** When it will be removed (version, or "TBD") */
19
+ removedIn: string;
20
+ /** Why it was deprecated */
21
+ reason: string;
22
+ /** Replacement rule(s), if any */
23
+ replacements: string[];
24
+ /** Migration guidance */
25
+ migration: string;
26
+ }
27
+ export interface DeprecationWarning {
28
+ ruleId: string;
29
+ location: "config" | "finding";
30
+ message: string;
31
+ replacements: string[];
32
+ }
33
+ export declare function getDeprecatedRules(): DeprecatedRule[];
34
+ export declare function isRuleDeprecated(ruleId: string): DeprecatedRule | undefined;
35
+ /**
36
+ * Check a config for references to deprecated rules.
37
+ * Scans disabledRules, ruleOverrides, and customRules.
38
+ */
39
+ export declare function checkConfigForDeprecated(config: Record<string, unknown>): DeprecationWarning[];
40
+ /**
41
+ * Check findings for deprecated rules and annotate them.
42
+ */
43
+ export declare function annotateDeprecatedFindings(findings: Array<{
44
+ ruleId: string;
45
+ [key: string]: unknown;
46
+ }>): DeprecationWarning[];
47
+ export declare function runDeprecatedCommand(argv: string[]): void;
48
+ //# sourceMappingURL=deprecated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecated.d.ts","sourceRoot":"","sources":["../../src/commands/deprecated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAoDD,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAErD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE3E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,EAAE,CA8C9F;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,GAC1D,kBAAkB,EAAE,CAmBtB;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6EzD"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Rule deprecation lifecycle management.
3
+ *
4
+ * Provides a registry of deprecated Judges rules with migration guidance,
5
+ * sunset dates, and replacement rules. Emits warnings when deprecated
6
+ * rules appear in findings or config.
7
+ *
8
+ * Usage:
9
+ * judges deprecated # List all deprecated rules
10
+ * judges deprecated --check .judgesrc # Check config for deprecated rules
11
+ * judges deprecated --format json # JSON output
12
+ */
13
+ // ─── Deprecated Rules Registry ──────────────────────────────────────────────
14
+ const DEPRECATED_RULES = [
15
+ {
16
+ ruleId: "SEC-EVAL-001",
17
+ deprecatedIn: "3.10.0",
18
+ removedIn: "4.0.0",
19
+ reason: "Merged into SEC-INJ-001 for unified injection detection",
20
+ replacements: ["SEC-INJ-001"],
21
+ migration: "Replace SEC-EVAL-001 references in ruleOverrides with SEC-INJ-001. The new rule covers eval(), Function(), and other injection vectors.",
22
+ },
23
+ {
24
+ ruleId: "PERF-LOOP-001",
25
+ deprecatedIn: "3.15.0",
26
+ removedIn: "4.0.0",
27
+ reason: "Superseded by the more comprehensive PERF-COMPLEXITY-001 which covers loops, recursion, and algorithmic complexity",
28
+ replacements: ["PERF-COMPLEXITY-001"],
29
+ migration: "Update ruleOverrides to use PERF-COMPLEXITY-001. The new rule has more granular severity options.",
30
+ },
31
+ {
32
+ ruleId: "DOC-INLINE-001",
33
+ deprecatedIn: "3.20.0",
34
+ removedIn: "4.0.0",
35
+ reason: "Split into DOC-FUNC-001 (function docs) and DOC-CLASS-001 (class docs) for more targeted analysis",
36
+ replacements: ["DOC-FUNC-001", "DOC-CLASS-001"],
37
+ migration: "Replace DOC-INLINE-001 in ruleOverrides with DOC-FUNC-001 and/or DOC-CLASS-001 depending on your needs.",
38
+ },
39
+ {
40
+ ruleId: "DATA-PII-001",
41
+ deprecatedIn: "3.25.0",
42
+ removedIn: "4.0.0",
43
+ reason: "Replaced by DATA-001 which includes PII detection alongside other sensitive data patterns",
44
+ replacements: ["DATA-001"],
45
+ migration: "Update references from DATA-PII-001 to DATA-001. The new rule has broader coverage.",
46
+ },
47
+ {
48
+ ruleId: "SEC-CRYPTO-WEAK",
49
+ deprecatedIn: "3.30.0",
50
+ removedIn: "4.0.0",
51
+ reason: "Renamed to SEC-CRYPTO-001 for consistent naming convention",
52
+ replacements: ["SEC-CRYPTO-001"],
53
+ migration: "Simply rename SEC-CRYPTO-WEAK to SEC-CRYPTO-001 in all config references.",
54
+ },
55
+ ];
56
+ // ─── Registry API ───────────────────────────────────────────────────────────
57
+ export function getDeprecatedRules() {
58
+ return [...DEPRECATED_RULES];
59
+ }
60
+ export function isRuleDeprecated(ruleId) {
61
+ return DEPRECATED_RULES.find((r) => r.ruleId === ruleId);
62
+ }
63
+ /**
64
+ * Check a config for references to deprecated rules.
65
+ * Scans disabledRules, ruleOverrides, and customRules.
66
+ */
67
+ export function checkConfigForDeprecated(config) {
68
+ const warnings = [];
69
+ // Check disabledRules
70
+ const disabled = (config.disabledRules || []);
71
+ for (const ruleId of disabled) {
72
+ const dep = isRuleDeprecated(ruleId);
73
+ if (dep) {
74
+ warnings.push({
75
+ ruleId,
76
+ location: "config",
77
+ message: `disabledRules contains deprecated rule "${ruleId}" (deprecated in v${dep.deprecatedIn}). ${dep.migration}`,
78
+ replacements: dep.replacements,
79
+ });
80
+ }
81
+ }
82
+ // Check ruleOverrides keys
83
+ const overrides = (config.ruleOverrides || {});
84
+ for (const ruleId of Object.keys(overrides)) {
85
+ const dep = isRuleDeprecated(ruleId);
86
+ if (dep) {
87
+ warnings.push({
88
+ ruleId,
89
+ location: "config",
90
+ message: `ruleOverrides references deprecated rule "${ruleId}" (deprecated in v${dep.deprecatedIn}). ${dep.migration}`,
91
+ replacements: dep.replacements,
92
+ });
93
+ }
94
+ }
95
+ // Check lockedRules
96
+ const locked = (config.lockedRules || []);
97
+ for (const ruleId of locked) {
98
+ const dep = isRuleDeprecated(ruleId);
99
+ if (dep) {
100
+ warnings.push({
101
+ ruleId,
102
+ location: "config",
103
+ message: `lockedRules contains deprecated rule "${ruleId}" (deprecated in v${dep.deprecatedIn}). ${dep.migration}`,
104
+ replacements: dep.replacements,
105
+ });
106
+ }
107
+ }
108
+ return warnings;
109
+ }
110
+ /**
111
+ * Check findings for deprecated rules and annotate them.
112
+ */
113
+ export function annotateDeprecatedFindings(findings) {
114
+ const warnings = [];
115
+ const seen = new Set();
116
+ for (const finding of findings) {
117
+ if (seen.has(finding.ruleId))
118
+ continue;
119
+ const dep = isRuleDeprecated(finding.ruleId);
120
+ if (dep) {
121
+ seen.add(finding.ruleId);
122
+ warnings.push({
123
+ ruleId: finding.ruleId,
124
+ location: "finding",
125
+ message: `Rule "${finding.ruleId}" is deprecated since v${dep.deprecatedIn}. ${dep.reason}`,
126
+ replacements: dep.replacements,
127
+ });
128
+ }
129
+ }
130
+ return warnings;
131
+ }
132
+ // ─── CLI Runner ─────────────────────────────────────────────────────────────
133
+ export function runDeprecatedCommand(argv) {
134
+ if (argv.includes("--help") || argv.includes("-h")) {
135
+ console.log(`
136
+ judges deprecated — Rule deprecation lifecycle
137
+
138
+ Usage:
139
+ judges deprecated List all deprecated rules
140
+ judges deprecated --check .judgesrc Check config for deprecated references
141
+ judges deprecated --format json JSON output
142
+
143
+ Shows deprecated rules with migration guidance, replacement rules, and removal timeline.
144
+
145
+ Options:
146
+ --check <path> Check a .judgesrc for deprecated rule references
147
+ --format <fmt> Output format: text, json
148
+ --help, -h Show this help
149
+ `);
150
+ return;
151
+ }
152
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
153
+ const checkPath = argv.find((_a, i) => argv[i - 1] === "--check");
154
+ // Check config mode
155
+ if (checkPath) {
156
+ try {
157
+ const { readFileSync, existsSync } = require("fs");
158
+ if (!existsSync(checkPath)) {
159
+ console.log(`\n File not found: ${checkPath}\n`);
160
+ return;
161
+ }
162
+ const config = JSON.parse(readFileSync(checkPath, "utf-8"));
163
+ const warnings = checkConfigForDeprecated(config);
164
+ if (format === "json") {
165
+ console.log(JSON.stringify({ warnings }, null, 2));
166
+ return;
167
+ }
168
+ console.log(`\n Checking ${checkPath} for deprecated rules...\n`);
169
+ if (warnings.length === 0) {
170
+ console.log(" ✅ No deprecated rule references found.\n");
171
+ }
172
+ else {
173
+ for (const w of warnings) {
174
+ console.log(` ⚠️ ${w.message}`);
175
+ if (w.replacements.length > 0) {
176
+ console.log(` → Replace with: ${w.replacements.join(", ")}`);
177
+ }
178
+ console.log("");
179
+ }
180
+ }
181
+ return;
182
+ }
183
+ catch (err) {
184
+ console.error(`\n Error checking config: ${err instanceof Error ? err.message : String(err)}\n`);
185
+ return;
186
+ }
187
+ }
188
+ // List all deprecated rules
189
+ const rules = getDeprecatedRules();
190
+ if (format === "json") {
191
+ console.log(JSON.stringify({ deprecatedRules: rules }, null, 2));
192
+ return;
193
+ }
194
+ console.log("\n Deprecated Rules\n");
195
+ console.log(` ${"RULE ID".padEnd(20)} ${"DEPRECATED IN".padEnd(15)} ${"REMOVED IN".padEnd(12)} REPLACEMENT(S)`);
196
+ console.log(` ${"─".repeat(20)} ${"─".repeat(15)} ${"─".repeat(12)} ${"─".repeat(25)}`);
197
+ for (const rule of rules) {
198
+ console.log(` ${rule.ruleId.padEnd(20)} v${rule.deprecatedIn.padEnd(14)} v${rule.removedIn.padEnd(11)} ${rule.replacements.join(", ") || "—"}`);
199
+ }
200
+ console.log(`\n ${rules.length} deprecated rule(s). Run with --check <config> to scan your .judgesrc.\n`);
201
+ }
202
+ //# sourceMappingURL=deprecated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecated.js","sourceRoot":"","sources":["../../src/commands/deprecated.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AA2YA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA2BlG;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgI5C"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAgZA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA2BlG;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgI5C"}
@@ -157,7 +157,7 @@ const SECURITY_DELETION_PATTERNS = [
157
157
  * Analyze removed lines for security-relevant deletions.
158
158
  * Returns findings for patterns that were deleted from the codebase.
159
159
  */
160
- function analyzeDeletions(removedLines, filePath) {
160
+ function analyzeDeletions(removedLines, _filePath) {
161
161
  if (removedLines.length === 0)
162
162
  return [];
163
163
  const findings = [];
@@ -208,8 +208,13 @@ function extractExportedSignatures(lines) {
208
208
  function countParams(paramStr) {
209
209
  if (!paramStr.trim())
210
210
  return 0;
211
- // Handle generic type parameters by removing angle-bracket contents
212
- const cleaned = paramStr.replace(/<[^>]*>/g, "");
211
+ // Handle generic type parameters by removing angle-bracket contents iteratively
212
+ let cleaned = paramStr;
213
+ let prev;
214
+ do {
215
+ prev = cleaned;
216
+ cleaned = cleaned.replace(/<[^>]*>/g, "");
217
+ } while (cleaned !== prev);
213
218
  return cleaned.split(",").length;
214
219
  }
215
220
  /**