@oculum/scanner 1.0.9 → 1.0.11

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 (365) hide show
  1. package/dist/baseline/diff.d.ts +32 -0
  2. package/dist/baseline/diff.d.ts.map +1 -0
  3. package/dist/baseline/diff.js +119 -0
  4. package/dist/baseline/diff.js.map +1 -0
  5. package/dist/baseline/index.d.ts +9 -0
  6. package/dist/baseline/index.d.ts.map +1 -0
  7. package/dist/baseline/index.js +19 -0
  8. package/dist/baseline/index.js.map +1 -0
  9. package/dist/baseline/manager.d.ts +67 -0
  10. package/dist/baseline/manager.d.ts.map +1 -0
  11. package/dist/baseline/manager.js +180 -0
  12. package/dist/baseline/manager.js.map +1 -0
  13. package/dist/baseline/types.d.ts +91 -0
  14. package/dist/baseline/types.d.ts.map +1 -0
  15. package/dist/baseline/types.js +12 -0
  16. package/dist/baseline/types.js.map +1 -0
  17. package/dist/formatters/cli-terminal.d.ts +38 -0
  18. package/dist/formatters/cli-terminal.d.ts.map +1 -1
  19. package/dist/formatters/cli-terminal.js +365 -42
  20. package/dist/formatters/cli-terminal.js.map +1 -1
  21. package/dist/formatters/github-comment.d.ts +1 -1
  22. package/dist/formatters/github-comment.d.ts.map +1 -1
  23. package/dist/formatters/github-comment.js +75 -11
  24. package/dist/formatters/github-comment.js.map +1 -1
  25. package/dist/formatters/index.d.ts +1 -1
  26. package/dist/formatters/index.d.ts.map +1 -1
  27. package/dist/formatters/index.js +4 -1
  28. package/dist/formatters/index.js.map +1 -1
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +155 -16
  32. package/dist/index.js.map +1 -1
  33. package/dist/layer1/config-audit.d.ts.map +1 -1
  34. package/dist/layer1/config-audit.js +20 -3
  35. package/dist/layer1/config-audit.js.map +1 -1
  36. package/dist/layer1/config-mcp-audit.d.ts +20 -0
  37. package/dist/layer1/config-mcp-audit.d.ts.map +1 -0
  38. package/dist/layer1/config-mcp-audit.js +239 -0
  39. package/dist/layer1/config-mcp-audit.js.map +1 -0
  40. package/dist/layer1/index.d.ts +1 -0
  41. package/dist/layer1/index.d.ts.map +1 -1
  42. package/dist/layer1/index.js +9 -1
  43. package/dist/layer1/index.js.map +1 -1
  44. package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
  45. package/dist/layer2/ai-agent-tools.js +303 -0
  46. package/dist/layer2/ai-agent-tools.js.map +1 -1
  47. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
  48. package/dist/layer2/ai-endpoint-protection.js +17 -3
  49. package/dist/layer2/ai-endpoint-protection.js.map +1 -1
  50. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
  51. package/dist/layer2/ai-execution-sinks.js +462 -12
  52. package/dist/layer2/ai-execution-sinks.js.map +1 -1
  53. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
  54. package/dist/layer2/ai-fingerprinting.js +3 -0
  55. package/dist/layer2/ai-fingerprinting.js.map +1 -1
  56. package/dist/layer2/ai-mcp-security.d.ts +17 -0
  57. package/dist/layer2/ai-mcp-security.d.ts.map +1 -0
  58. package/dist/layer2/ai-mcp-security.js +679 -0
  59. package/dist/layer2/ai-mcp-security.js.map +1 -0
  60. package/dist/layer2/ai-package-hallucination.d.ts +19 -0
  61. package/dist/layer2/ai-package-hallucination.d.ts.map +1 -0
  62. package/dist/layer2/ai-package-hallucination.js +696 -0
  63. package/dist/layer2/ai-package-hallucination.js.map +1 -0
  64. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
  65. package/dist/layer2/ai-prompt-hygiene.js +495 -9
  66. package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
  67. package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
  68. package/dist/layer2/ai-rag-safety.js +372 -1
  69. package/dist/layer2/ai-rag-safety.js.map +1 -1
  70. package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
  71. package/dist/layer2/auth-antipatterns.js +4 -0
  72. package/dist/layer2/auth-antipatterns.js.map +1 -1
  73. package/dist/layer2/byok-patterns.d.ts.map +1 -1
  74. package/dist/layer2/byok-patterns.js +3 -0
  75. package/dist/layer2/byok-patterns.js.map +1 -1
  76. package/dist/layer2/dangerous-functions/child-process.d.ts +16 -0
  77. package/dist/layer2/dangerous-functions/child-process.d.ts.map +1 -0
  78. package/dist/layer2/dangerous-functions/child-process.js +74 -0
  79. package/dist/layer2/dangerous-functions/child-process.js.map +1 -0
  80. package/dist/layer2/dangerous-functions/dom-xss.d.ts +29 -0
  81. package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -0
  82. package/dist/layer2/dangerous-functions/dom-xss.js +179 -0
  83. package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -0
  84. package/dist/layer2/dangerous-functions/index.d.ts +13 -0
  85. package/dist/layer2/dangerous-functions/index.d.ts.map +1 -0
  86. package/dist/layer2/dangerous-functions/index.js +621 -0
  87. package/dist/layer2/dangerous-functions/index.js.map +1 -0
  88. package/dist/layer2/dangerous-functions/json-parse.d.ts +31 -0
  89. package/dist/layer2/dangerous-functions/json-parse.d.ts.map +1 -0
  90. package/dist/layer2/dangerous-functions/json-parse.js +319 -0
  91. package/dist/layer2/dangerous-functions/json-parse.js.map +1 -0
  92. package/dist/layer2/dangerous-functions/math-random.d.ts +61 -0
  93. package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -0
  94. package/dist/layer2/dangerous-functions/math-random.js +459 -0
  95. package/dist/layer2/dangerous-functions/math-random.js.map +1 -0
  96. package/dist/layer2/dangerous-functions/patterns.d.ts +21 -0
  97. package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -0
  98. package/dist/layer2/dangerous-functions/patterns.js +161 -0
  99. package/dist/layer2/dangerous-functions/patterns.js.map +1 -0
  100. package/dist/layer2/dangerous-functions/request-validation.d.ts +13 -0
  101. package/dist/layer2/dangerous-functions/request-validation.d.ts.map +1 -0
  102. package/dist/layer2/dangerous-functions/request-validation.js +119 -0
  103. package/dist/layer2/dangerous-functions/request-validation.js.map +1 -0
  104. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +23 -0
  105. package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -0
  106. package/dist/layer2/dangerous-functions/utils/control-flow.js +149 -0
  107. package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -0
  108. package/dist/layer2/dangerous-functions/utils/helpers.d.ts +31 -0
  109. package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -0
  110. package/dist/layer2/dangerous-functions/utils/helpers.js +124 -0
  111. package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -0
  112. package/dist/layer2/dangerous-functions/utils/index.d.ts +9 -0
  113. package/dist/layer2/dangerous-functions/utils/index.d.ts.map +1 -0
  114. package/dist/layer2/dangerous-functions/utils/index.js +23 -0
  115. package/dist/layer2/dangerous-functions/utils/index.js.map +1 -0
  116. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +22 -0
  117. package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
  118. package/dist/layer2/dangerous-functions/utils/schema-validation.js +89 -0
  119. package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -0
  120. package/dist/layer2/data-exposure.d.ts.map +1 -1
  121. package/dist/layer2/data-exposure.js +3 -0
  122. package/dist/layer2/data-exposure.js.map +1 -1
  123. package/dist/layer2/framework-checks.d.ts.map +1 -1
  124. package/dist/layer2/framework-checks.js +3 -0
  125. package/dist/layer2/framework-checks.js.map +1 -1
  126. package/dist/layer2/index.d.ts +3 -0
  127. package/dist/layer2/index.d.ts.map +1 -1
  128. package/dist/layer2/index.js +61 -2
  129. package/dist/layer2/index.js.map +1 -1
  130. package/dist/layer2/logic-gates.d.ts.map +1 -1
  131. package/dist/layer2/logic-gates.js +4 -0
  132. package/dist/layer2/logic-gates.js.map +1 -1
  133. package/dist/layer2/model-supply-chain.d.ts +20 -0
  134. package/dist/layer2/model-supply-chain.d.ts.map +1 -0
  135. package/dist/layer2/model-supply-chain.js +376 -0
  136. package/dist/layer2/model-supply-chain.js.map +1 -0
  137. package/dist/layer2/risky-imports.d.ts.map +1 -1
  138. package/dist/layer2/risky-imports.js +4 -0
  139. package/dist/layer2/risky-imports.js.map +1 -1
  140. package/dist/layer2/variables.d.ts.map +1 -1
  141. package/dist/layer2/variables.js +4 -0
  142. package/dist/layer2/variables.js.map +1 -1
  143. package/dist/layer3/anthropic/auto-dismiss.d.ts +24 -0
  144. package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -0
  145. package/dist/layer3/anthropic/auto-dismiss.js +188 -0
  146. package/dist/layer3/anthropic/auto-dismiss.js.map +1 -0
  147. package/dist/layer3/anthropic/clients.d.ts +44 -0
  148. package/dist/layer3/anthropic/clients.d.ts.map +1 -0
  149. package/dist/layer3/anthropic/clients.js +81 -0
  150. package/dist/layer3/anthropic/clients.js.map +1 -0
  151. package/dist/layer3/anthropic/index.d.ts +41 -0
  152. package/dist/layer3/anthropic/index.d.ts.map +1 -0
  153. package/dist/layer3/anthropic/index.js +141 -0
  154. package/dist/layer3/anthropic/index.js.map +1 -0
  155. package/dist/layer3/anthropic/prompts/index.d.ts +8 -0
  156. package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -0
  157. package/dist/layer3/anthropic/prompts/index.js +14 -0
  158. package/dist/layer3/anthropic/prompts/index.js.map +1 -0
  159. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +15 -0
  160. package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +1 -0
  161. package/dist/layer3/anthropic/prompts/semantic-analysis.js +169 -0
  162. package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +1 -0
  163. package/dist/layer3/anthropic/prompts/validation.d.ts +12 -0
  164. package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -0
  165. package/dist/layer3/anthropic/prompts/validation.js +421 -0
  166. package/dist/layer3/anthropic/prompts/validation.js.map +1 -0
  167. package/dist/layer3/anthropic/providers/anthropic.d.ts +21 -0
  168. package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -0
  169. package/dist/layer3/anthropic/providers/anthropic.js +266 -0
  170. package/dist/layer3/anthropic/providers/anthropic.js.map +1 -0
  171. package/dist/layer3/anthropic/providers/index.d.ts +8 -0
  172. package/dist/layer3/anthropic/providers/index.d.ts.map +1 -0
  173. package/dist/layer3/anthropic/providers/index.js +15 -0
  174. package/dist/layer3/anthropic/providers/index.js.map +1 -0
  175. package/dist/layer3/anthropic/providers/openai.d.ts +18 -0
  176. package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -0
  177. package/dist/layer3/anthropic/providers/openai.js +340 -0
  178. package/dist/layer3/anthropic/providers/openai.js.map +1 -0
  179. package/dist/layer3/anthropic/request-builder.d.ts +20 -0
  180. package/dist/layer3/anthropic/request-builder.d.ts.map +1 -0
  181. package/dist/layer3/anthropic/request-builder.js +134 -0
  182. package/dist/layer3/anthropic/request-builder.js.map +1 -0
  183. package/dist/layer3/anthropic/types.d.ts +88 -0
  184. package/dist/layer3/anthropic/types.d.ts.map +1 -0
  185. package/dist/layer3/anthropic/types.js +38 -0
  186. package/dist/layer3/anthropic/types.js.map +1 -0
  187. package/dist/layer3/anthropic/utils/index.d.ts +9 -0
  188. package/dist/layer3/anthropic/utils/index.d.ts.map +1 -0
  189. package/dist/layer3/anthropic/utils/index.js +24 -0
  190. package/dist/layer3/anthropic/utils/index.js.map +1 -0
  191. package/dist/layer3/anthropic/utils/path-helpers.d.ts +21 -0
  192. package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +1 -0
  193. package/dist/layer3/anthropic/utils/path-helpers.js +69 -0
  194. package/dist/layer3/anthropic/utils/path-helpers.js.map +1 -0
  195. package/dist/layer3/anthropic/utils/response-parser.d.ts +40 -0
  196. package/dist/layer3/anthropic/utils/response-parser.d.ts.map +1 -0
  197. package/dist/layer3/anthropic/utils/response-parser.js +285 -0
  198. package/dist/layer3/anthropic/utils/response-parser.js.map +1 -0
  199. package/dist/layer3/anthropic/utils/retry.d.ts +15 -0
  200. package/dist/layer3/anthropic/utils/retry.d.ts.map +1 -0
  201. package/dist/layer3/anthropic/utils/retry.js +62 -0
  202. package/dist/layer3/anthropic/utils/retry.js.map +1 -0
  203. package/dist/layer3/index.d.ts +1 -0
  204. package/dist/layer3/index.d.ts.map +1 -1
  205. package/dist/layer3/index.js +16 -6
  206. package/dist/layer3/index.js.map +1 -1
  207. package/dist/layer3/osv-check.d.ts +75 -0
  208. package/dist/layer3/osv-check.d.ts.map +1 -0
  209. package/dist/layer3/osv-check.js +308 -0
  210. package/dist/layer3/osv-check.js.map +1 -0
  211. package/dist/rules/framework-fixes.d.ts +48 -0
  212. package/dist/rules/framework-fixes.d.ts.map +1 -0
  213. package/dist/rules/framework-fixes.js +439 -0
  214. package/dist/rules/framework-fixes.js.map +1 -0
  215. package/dist/rules/index.d.ts +8 -0
  216. package/dist/rules/index.d.ts.map +1 -0
  217. package/dist/rules/index.js +18 -0
  218. package/dist/rules/index.js.map +1 -0
  219. package/dist/rules/metadata.d.ts +43 -0
  220. package/dist/rules/metadata.d.ts.map +1 -0
  221. package/dist/rules/metadata.js +734 -0
  222. package/dist/rules/metadata.js.map +1 -0
  223. package/dist/suppression/config-loader.d.ts +74 -0
  224. package/dist/suppression/config-loader.d.ts.map +1 -0
  225. package/dist/suppression/config-loader.js +424 -0
  226. package/dist/suppression/config-loader.js.map +1 -0
  227. package/dist/suppression/hash.d.ts +48 -0
  228. package/dist/suppression/hash.d.ts.map +1 -0
  229. package/dist/suppression/hash.js +88 -0
  230. package/dist/suppression/hash.js.map +1 -0
  231. package/dist/suppression/index.d.ts +11 -0
  232. package/dist/suppression/index.d.ts.map +1 -0
  233. package/dist/suppression/index.js +39 -0
  234. package/dist/suppression/index.js.map +1 -0
  235. package/dist/suppression/inline-parser.d.ts +39 -0
  236. package/dist/suppression/inline-parser.d.ts.map +1 -0
  237. package/dist/suppression/inline-parser.js +218 -0
  238. package/dist/suppression/inline-parser.js.map +1 -0
  239. package/dist/suppression/manager.d.ts +94 -0
  240. package/dist/suppression/manager.d.ts.map +1 -0
  241. package/dist/suppression/manager.js +292 -0
  242. package/dist/suppression/manager.js.map +1 -0
  243. package/dist/suppression/types.d.ts +151 -0
  244. package/dist/suppression/types.d.ts.map +1 -0
  245. package/dist/suppression/types.js +28 -0
  246. package/dist/suppression/types.js.map +1 -0
  247. package/dist/tiers.d.ts +1 -1
  248. package/dist/tiers.d.ts.map +1 -1
  249. package/dist/tiers.js +27 -0
  250. package/dist/tiers.js.map +1 -1
  251. package/dist/types.d.ts +62 -1
  252. package/dist/types.d.ts.map +1 -1
  253. package/dist/types.js.map +1 -1
  254. package/dist/utils/context-helpers.d.ts +4 -0
  255. package/dist/utils/context-helpers.d.ts.map +1 -1
  256. package/dist/utils/context-helpers.js +13 -9
  257. package/dist/utils/context-helpers.js.map +1 -1
  258. package/package.json +4 -2
  259. package/src/__tests__/benchmark/fixtures/layer1/mcp-config-audit.json +31 -0
  260. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1489 -82
  261. package/src/__tests__/benchmark/fixtures/layer2/ai-mcp-security.ts +495 -0
  262. package/src/__tests__/benchmark/fixtures/layer2/ai-package-hallucination.ts +255 -0
  263. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +300 -1
  264. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +139 -0
  265. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +7 -0
  266. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +63 -0
  267. package/src/__tests__/benchmark/fixtures/layer2/excessive-agency.ts +221 -0
  268. package/src/__tests__/benchmark/fixtures/layer2/index.ts +18 -0
  269. package/src/__tests__/benchmark/fixtures/layer2/model-supply-chain.ts +204 -0
  270. package/src/__tests__/benchmark/fixtures/layer2/phase1-enhancements.ts +157 -0
  271. package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +758 -0
  272. package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +503 -0
  273. package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +321 -0
  274. package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +439 -0
  275. package/src/baseline/__tests__/diff.test.ts +261 -0
  276. package/src/baseline/__tests__/manager.test.ts +225 -0
  277. package/src/baseline/diff.ts +135 -0
  278. package/src/baseline/index.ts +29 -0
  279. package/src/baseline/manager.ts +230 -0
  280. package/src/baseline/types.ts +97 -0
  281. package/src/formatters/cli-terminal.ts +444 -41
  282. package/src/formatters/github-comment.ts +79 -11
  283. package/src/formatters/index.ts +4 -0
  284. package/src/index.ts +197 -14
  285. package/src/layer1/config-audit.ts +24 -3
  286. package/src/layer1/config-mcp-audit.ts +276 -0
  287. package/src/layer1/index.ts +16 -6
  288. package/src/layer2/ai-agent-tools.ts +336 -0
  289. package/src/layer2/ai-endpoint-protection.ts +16 -3
  290. package/src/layer2/ai-execution-sinks.ts +516 -12
  291. package/src/layer2/ai-fingerprinting.ts +5 -1
  292. package/src/layer2/ai-mcp-security.ts +730 -0
  293. package/src/layer2/ai-package-hallucination.ts +791 -0
  294. package/src/layer2/ai-prompt-hygiene.ts +547 -9
  295. package/src/layer2/ai-rag-safety.ts +382 -3
  296. package/src/layer2/auth-antipatterns.ts +5 -0
  297. package/src/layer2/byok-patterns.ts +5 -1
  298. package/src/layer2/dangerous-functions/child-process.ts +98 -0
  299. package/src/layer2/dangerous-functions/dom-xss.ts +220 -0
  300. package/src/layer2/dangerous-functions/index.ts +949 -0
  301. package/src/layer2/dangerous-functions/json-parse.ts +385 -0
  302. package/src/layer2/dangerous-functions/math-random.ts +537 -0
  303. package/src/layer2/dangerous-functions/patterns.ts +174 -0
  304. package/src/layer2/dangerous-functions/request-validation.ts +145 -0
  305. package/src/layer2/dangerous-functions/utils/control-flow.ts +162 -0
  306. package/src/layer2/dangerous-functions/utils/helpers.ts +170 -0
  307. package/src/layer2/dangerous-functions/utils/index.ts +25 -0
  308. package/src/layer2/dangerous-functions/utils/schema-validation.ts +91 -0
  309. package/src/layer2/data-exposure.ts +5 -1
  310. package/src/layer2/framework-checks.ts +5 -0
  311. package/src/layer2/index.ts +63 -1
  312. package/src/layer2/logic-gates.ts +5 -0
  313. package/src/layer2/model-supply-chain.ts +456 -0
  314. package/src/layer2/risky-imports.ts +5 -0
  315. package/src/layer2/variables.ts +5 -0
  316. package/src/layer3/__tests__/osv-check.test.ts +384 -0
  317. package/src/layer3/anthropic/auto-dismiss.ts +212 -0
  318. package/src/layer3/anthropic/clients.ts +84 -0
  319. package/src/layer3/anthropic/index.ts +170 -0
  320. package/src/layer3/anthropic/prompts/index.ts +14 -0
  321. package/src/layer3/anthropic/prompts/semantic-analysis.ts +173 -0
  322. package/src/layer3/anthropic/prompts/validation.ts +419 -0
  323. package/src/layer3/anthropic/providers/anthropic.ts +310 -0
  324. package/src/layer3/anthropic/providers/index.ts +8 -0
  325. package/src/layer3/anthropic/providers/openai.ts +384 -0
  326. package/src/layer3/anthropic/request-builder.ts +150 -0
  327. package/src/layer3/anthropic/types.ts +148 -0
  328. package/src/layer3/anthropic/utils/index.ts +26 -0
  329. package/src/layer3/anthropic/utils/path-helpers.ts +68 -0
  330. package/src/layer3/anthropic/utils/response-parser.ts +322 -0
  331. package/src/layer3/anthropic/utils/retry.ts +75 -0
  332. package/src/layer3/index.ts +18 -5
  333. package/src/layer3/osv-check.ts +420 -0
  334. package/src/rules/__tests__/framework-fixes.test.ts +689 -0
  335. package/src/rules/__tests__/metadata.test.ts +218 -0
  336. package/src/rules/framework-fixes.ts +470 -0
  337. package/src/rules/index.ts +21 -0
  338. package/src/rules/metadata.ts +831 -0
  339. package/src/suppression/__tests__/config-loader.test.ts +382 -0
  340. package/src/suppression/__tests__/hash.test.ts +166 -0
  341. package/src/suppression/__tests__/inline-parser.test.ts +212 -0
  342. package/src/suppression/__tests__/manager.test.ts +415 -0
  343. package/src/suppression/config-loader.ts +462 -0
  344. package/src/suppression/hash.ts +95 -0
  345. package/src/suppression/index.ts +51 -0
  346. package/src/suppression/inline-parser.ts +273 -0
  347. package/src/suppression/manager.ts +379 -0
  348. package/src/suppression/types.ts +174 -0
  349. package/src/tiers.ts +36 -0
  350. package/src/types.ts +90 -0
  351. package/src/utils/context-helpers.ts +13 -9
  352. package/dist/layer2/dangerous-functions.d.ts +0 -7
  353. package/dist/layer2/dangerous-functions.d.ts.map +0 -1
  354. package/dist/layer2/dangerous-functions.js +0 -1701
  355. package/dist/layer2/dangerous-functions.js.map +0 -1
  356. package/dist/layer3/anthropic.d.ts +0 -87
  357. package/dist/layer3/anthropic.d.ts.map +0 -1
  358. package/dist/layer3/anthropic.js +0 -1948
  359. package/dist/layer3/anthropic.js.map +0 -1
  360. package/dist/layer3/openai.d.ts +0 -25
  361. package/dist/layer3/openai.d.ts.map +0 -1
  362. package/dist/layer3/openai.js +0 -238
  363. package/dist/layer3/openai.js.map +0 -1
  364. package/src/layer2/dangerous-functions.ts +0 -1940
  365. package/src/layer3/anthropic.ts +0 -2257
@@ -35,7 +35,28 @@ const CATEGORY_DOCS = {
35
35
  data_exposure: 'https://oculum.dev/docs/rules/data-exposure',
36
36
  };
37
37
  /**
38
- * Format a single finding as a markdown list item
38
+ * Helper to determine language from file path
39
+ */
40
+ function getLanguageFromPath(filePath) {
41
+ const ext = filePath.split('.').pop()?.toLowerCase() || '';
42
+ const langMap = {
43
+ ts: 'typescript',
44
+ tsx: 'typescript',
45
+ js: 'javascript',
46
+ jsx: 'javascript',
47
+ py: 'python',
48
+ go: 'go',
49
+ java: 'java',
50
+ rb: 'ruby',
51
+ php: 'php',
52
+ yaml: 'yaml',
53
+ yml: 'yaml',
54
+ json: 'json',
55
+ };
56
+ return langMap[ext] || '';
57
+ }
58
+ /**
59
+ * Format a single finding as a markdown section with actionable info (PRO-82)
39
60
  */
40
61
  function formatFinding(finding, options = {}) {
41
62
  const { showFile = true, showDocs = true } = options;
@@ -43,16 +64,41 @@ function formatFinding(finding, options = {}) {
43
64
  const location = showFile
44
65
  ? `\`${finding.filePath}:${finding.lineNumber}\``
45
66
  : `Line ${finding.lineNumber}`;
46
- let md = `- ${badge} **${finding.title}**\n`;
47
- md += ` - 📍 ${location}\n`;
48
- md += ` - ${finding.description}\n`;
49
- if (finding.suggestedFix) {
50
- md += ` - 💡 **Fix:** ${finding.suggestedFix}\n`;
67
+ let md = `#### ${badge} ${finding.title}\n\n`;
68
+ md += `📍 ${location}\n\n`;
69
+ // Impact (why this matters) - shown if available
70
+ if (finding.impact) {
71
+ md += `**Impact:** ${finding.impact}\n\n`;
72
+ }
73
+ // Code snippet in collapsible
74
+ if (finding.lineContent && finding.lineContent.trim()) {
75
+ const language = getLanguageFromPath(finding.filePath);
76
+ md += `<details>\n<summary>View code</summary>\n\n`;
77
+ md += `\`\`\`${language}\n${finding.lineContent.trim()}\n\`\`\`\n\n`;
78
+ md += `</details>\n\n`;
51
79
  }
52
- // Add documentation link if available
80
+ // Fix steps - shown as numbered list (PRO-82)
81
+ if (finding.fixSteps && finding.fixSteps.length > 0) {
82
+ md += `**Fix:**\n`;
83
+ finding.fixSteps.forEach((step, i) => {
84
+ md += `${i + 1}. ${step}\n`;
85
+ });
86
+ md += '\n';
87
+ }
88
+ else if (finding.suggestedFix) {
89
+ // Fallback to legacy field
90
+ md += `💡 **Fix:** ${finding.suggestedFix}\n\n`;
91
+ }
92
+ // Documentation links
53
93
  const docsUrl = CATEGORY_DOCS[finding.category];
54
- if (showDocs && docsUrl) {
55
- md += ` - 📚 [Learn more](${docsUrl})\n`;
94
+ const referenceUrl = finding.references && finding.references.length > 0 ? finding.references[0] : null;
95
+ if (showDocs && (docsUrl || referenceUrl)) {
96
+ const links = [];
97
+ if (docsUrl)
98
+ links.push(`[Learn more](${docsUrl})`);
99
+ if (referenceUrl && referenceUrl !== docsUrl)
100
+ links.push(`[OWASP/CWE](${referenceUrl})`);
101
+ md += links.join(' · ') + '\n\n';
56
102
  }
57
103
  return md;
58
104
  }
@@ -289,18 +335,36 @@ function formatShortStatus(result) {
289
335
  return `✅ No security issues found (scanned ${filesScanned} files in ${(scanDuration / 1000).toFixed(1)}s)`;
290
336
  }
291
337
  /**
292
- * Format as inline annotation for GitHub check run
338
+ * Format as inline annotation for GitHub check run (PRO-82: actionable output)
293
339
  */
294
340
  function formatAnnotation(finding) {
295
341
  const level = finding.severity === 'critical' || finding.severity === 'high' ? 'failure' :
296
342
  finding.severity === 'medium' ? 'warning' : 'notice';
343
+ // Build actionable message
344
+ let message = '';
345
+ // Impact first (why this matters)
346
+ if (finding.impact) {
347
+ message += `Impact: ${finding.impact}\n\n`;
348
+ }
349
+ // Description
350
+ message += finding.description;
351
+ // Fix steps or legacy suggestedFix
352
+ if (finding.fixSteps && finding.fixSteps.length > 0) {
353
+ message += '\n\n💡 Fix:\n';
354
+ finding.fixSteps.forEach((step, i) => {
355
+ message += `${i + 1}. ${step}\n`;
356
+ });
357
+ }
358
+ else if (finding.suggestedFix) {
359
+ message += `\n\n💡 Fix: ${finding.suggestedFix}`;
360
+ }
297
361
  return {
298
362
  path: finding.filePath,
299
363
  start_line: finding.lineNumber,
300
364
  end_line: finding.lineNumber,
301
365
  annotation_level: level,
302
366
  title: `${SEVERITY_BADGE[finding.severity]} ${finding.title}`,
303
- message: finding.description + (finding.suggestedFix ? `\n\n💡 Fix: ${finding.suggestedFix}` : ''),
367
+ message,
304
368
  };
305
369
  }
306
370
  //# sourceMappingURL=github-comment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-comment.js","sourceRoot":"","sources":["../../src/formatters/github-comment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-comment.js","sourceRoot":"","sources":["../../src/formatters/github-comment.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,5 @@
5
5
  export { groupByTheme, limitPerGroup, sortBySeverity, getBlockingIssues, getActionableIssues, getRiskTheme, THEME_CONFIG, type RiskTheme, type GroupedFindings, } from './grouping';
6
6
  export { formatGitHubComment, formatShortStatus, formatAnnotation, type GitHubCommentOptions, } from './github-comment';
7
7
  export { formatDiagnostic, formatDiagnosticsByFile, generateCodeAction, formatForProblemsPanel, DiagnosticSeverity, type Diagnostic, type DiagnosticsByFile, type CodeAction, type Position, type Range, } from './vscode-diagnostic';
8
- export { formatTerminalOutput, formatSimpleList, formatJSON, formatSARIF, } from './cli-terminal';
8
+ export { formatTerminalOutput, formatSimpleList, formatJSON, formatSARIF, formatCompactSummary, getNumberedFindings, formatFindingDetail, type CompactSummaryOptions, } from './cli-terminal';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,KAAK,GACX,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,KAAK,GACX,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAA"}
@@ -4,7 +4,7 @@
4
4
  * Export all formatting utilities for different workflows
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.formatSARIF = exports.formatJSON = exports.formatSimpleList = exports.formatTerminalOutput = exports.DiagnosticSeverity = exports.formatForProblemsPanel = exports.generateCodeAction = exports.formatDiagnosticsByFile = exports.formatDiagnostic = exports.formatAnnotation = exports.formatShortStatus = exports.formatGitHubComment = exports.THEME_CONFIG = exports.getRiskTheme = exports.getActionableIssues = exports.getBlockingIssues = exports.sortBySeverity = exports.limitPerGroup = exports.groupByTheme = void 0;
7
+ exports.formatFindingDetail = exports.getNumberedFindings = exports.formatCompactSummary = exports.formatSARIF = exports.formatJSON = exports.formatSimpleList = exports.formatTerminalOutput = exports.DiagnosticSeverity = exports.formatForProblemsPanel = exports.generateCodeAction = exports.formatDiagnosticsByFile = exports.formatDiagnostic = exports.formatAnnotation = exports.formatShortStatus = exports.formatGitHubComment = exports.THEME_CONFIG = exports.getRiskTheme = exports.getActionableIssues = exports.getBlockingIssues = exports.sortBySeverity = exports.limitPerGroup = exports.groupByTheme = void 0;
8
8
  // Grouping utilities
9
9
  var grouping_1 = require("./grouping");
10
10
  Object.defineProperty(exports, "groupByTheme", { enumerable: true, get: function () { return grouping_1.groupByTheme; } });
@@ -32,4 +32,7 @@ Object.defineProperty(exports, "formatTerminalOutput", { enumerable: true, get:
32
32
  Object.defineProperty(exports, "formatSimpleList", { enumerable: true, get: function () { return cli_terminal_1.formatSimpleList; } });
33
33
  Object.defineProperty(exports, "formatJSON", { enumerable: true, get: function () { return cli_terminal_1.formatJSON; } });
34
34
  Object.defineProperty(exports, "formatSARIF", { enumerable: true, get: function () { return cli_terminal_1.formatSARIF; } });
35
+ Object.defineProperty(exports, "formatCompactSummary", { enumerable: true, get: function () { return cli_terminal_1.formatCompactSummary; } });
36
+ Object.defineProperty(exports, "getNumberedFindings", { enumerable: true, get: function () { return cli_terminal_1.getNumberedFindings; } });
37
+ Object.defineProperty(exports, "formatFindingDetail", { enumerable: true, get: function () { return cli_terminal_1.formatFindingDetail; } });
35
38
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qBAAqB;AACrB,uCAUmB;AATjB,wGAAA,YAAY,OAAA;AACZ,yGAAA,aAAa,OAAA;AACb,0GAAA,cAAc,OAAA;AACd,6GAAA,iBAAiB,OAAA;AACjB,+GAAA,mBAAmB,OAAA;AACnB,wGAAA,YAAY,OAAA;AACZ,wGAAA,YAAY,OAAA;AAKd,2BAA2B;AAC3B,mDAKyB;AAJvB,qHAAA,mBAAmB,OAAA;AACnB,mHAAA,iBAAiB,OAAA;AACjB,kHAAA,gBAAgB,OAAA;AAIlB,+BAA+B;AAC/B,yDAW4B;AAV1B,qHAAA,gBAAgB,OAAA;AAChB,4HAAA,uBAAuB,OAAA;AACvB,uHAAA,kBAAkB,OAAA;AAClB,2HAAA,sBAAsB,OAAA;AACtB,uHAAA,kBAAkB,OAAA;AAQpB,yBAAyB;AACzB,+CAKuB;AAJrB,oHAAA,oBAAoB,OAAA;AACpB,gHAAA,gBAAgB,OAAA;AAChB,0GAAA,UAAU,OAAA;AACV,2GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formatters/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qBAAqB;AACrB,uCAUmB;AATjB,wGAAA,YAAY,OAAA;AACZ,yGAAA,aAAa,OAAA;AACb,0GAAA,cAAc,OAAA;AACd,6GAAA,iBAAiB,OAAA;AACjB,+GAAA,mBAAmB,OAAA;AACnB,wGAAA,YAAY,OAAA;AACZ,wGAAA,YAAY,OAAA;AAKd,2BAA2B;AAC3B,mDAKyB;AAJvB,qHAAA,mBAAmB,OAAA;AACnB,mHAAA,iBAAiB,OAAA;AACjB,kHAAA,gBAAgB,OAAA;AAIlB,+BAA+B;AAC/B,yDAW4B;AAV1B,qHAAA,gBAAgB,OAAA;AAChB,4HAAA,uBAAuB,OAAA;AACvB,uHAAA,kBAAkB,OAAA;AAClB,2HAAA,sBAAsB,OAAA;AACtB,uHAAA,kBAAkB,OAAA;AAQpB,yBAAyB;AACzB,+CASuB;AARrB,oHAAA,oBAAoB,OAAA;AACpB,gHAAA,gBAAgB,OAAA;AAChB,0GAAA,UAAU,OAAA;AACV,2GAAA,WAAW,OAAA;AACX,oHAAA,oBAAoB,OAAA;AACpB,mHAAA,mBAAmB,OAAA;AACnB,mHAAA,mBAAmB,OAAA"}
package/dist/index.d.ts CHANGED
@@ -18,6 +18,10 @@ export interface ScanOptions {
18
18
  quiet?: boolean;
19
19
  /** Cancellation token for aborting scans gracefully */
20
20
  cancellationToken?: CancellationToken;
21
+ /** Project path for loading suppression config (defaults to cwd) */
22
+ projectPath?: string;
23
+ /** Include suppressed findings in output (for --show-suppressed) */
24
+ showSuppressed?: boolean;
21
25
  }
22
26
  export interface ScanProgress {
23
27
  status: 'fetching' | 'layer1' | 'layer2' | 'layer3' | 'validating' | 'complete' | 'failed';
@@ -54,4 +58,7 @@ export { runLayer3Scan } from './layer3';
54
58
  export { buildProjectContext, type ProjectContext } from './utils/project-context-builder';
55
59
  export { validateFindingsWithAI, type ValidationStats, type AIValidationResult } from './layer3/anthropic';
56
60
  export { createCancellationToken } from './types';
61
+ export { SuppressionManager, computeFindingHash, loadSuppressionConfig, addFindingSuppression, removeFindingSuppression, addRuleSuppression, listSuppressions, parseInlineSuppressions, generateSuppressionComment, isValidHash, type SuppressionConfig, type FindingSuppression, type RuleSuppression, type SuppressionResult, type SuppressedVulnerability, } from './suppression';
62
+ export { BaselineManager, computeDiff, hasNewBlockingIssues, formatDiffSummary, BASELINE_FILE_PATH, OCULUM_DIR, type BaselineData, type BaselineFinding, type DiffResult, type BaselineDiff, type BaselineManagerOptions, type LoadBaselineResult, type SaveBaselineResult, type ClearBaselineResult, } from './baseline';
63
+ export { RULE_REGISTRY, getRuleMetadata, getAllCategories, hasMetadata, type RuleMetadata, } from './rules';
57
64
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,aAAa,EACb,cAAc,EACd,cAAc,EAEd,QAAQ,EACR,cAAc,EACd,SAAS,EACT,iBAAiB,EAClB,MAAM,SAAS,CAAA;AAkHhB,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,QAAQ,GAAG,cAAc,CAAA;IACpC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAA;IAC1F,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;AA8C/D;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACvD,OAAO,GAAE,WAAgB,EACzB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,UAAU,CAAC,CAkTrB;AA6WD;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,eAAe,EAAE,aAAa,EAAE,GAAG;IACpF,cAAc,EAAE,cAAc,CAAA;IAC9B,cAAc,EAAE,cAAc,CAAA;IAC9B,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAMA;AAGD,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAC1F,OAAO,EAAE,sBAAsB,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC1G,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.createCancellationToken = exports.validateFindingsWithAI = exports.buildProjectContext = exports.runLayer3Scan = exports.runLayer2Scan = exports.runLayer1Scan = void 0;
21
+ exports.hasMetadata = exports.getAllCategories = exports.getRuleMetadata = exports.RULE_REGISTRY = exports.OCULUM_DIR = exports.BASELINE_FILE_PATH = exports.formatDiffSummary = exports.hasNewBlockingIssues = exports.computeDiff = exports.BaselineManager = exports.isValidHash = exports.generateSuppressionComment = exports.parseInlineSuppressions = exports.listSuppressions = exports.addRuleSuppression = exports.removeFindingSuppression = exports.addFindingSuppression = exports.loadSuppressionConfig = exports.computeFindingHash = exports.SuppressionManager = exports.createCancellationToken = exports.validateFindingsWithAI = exports.buildProjectContext = exports.runLayer3Scan = exports.runLayer2Scan = exports.runLayer1Scan = void 0;
22
22
  exports.runScan = runScan;
23
23
  exports.computeIssueMixFromVulnerabilities = computeIssueMixFromVulnerabilities;
24
24
  const types_1 = require("./types");
@@ -32,6 +32,14 @@ const auth_helper_detector_1 = require("./utils/auth-helper-detector");
32
32
  const imported_auth_detector_1 = require("./utils/imported-auth-detector");
33
33
  // Tier system imports for filtering by scan depth
34
34
  const tiers_1 = require("./tiers");
35
+ // Suppression system
36
+ const suppression_1 = require("./suppression");
37
+ // Rule metadata for actionable output (PRO-82)
38
+ const rules_1 = require("./rules");
39
+ // Framework-aware fix suggestions (PRO-83)
40
+ const framework_fixes_1 = require("./rules/framework-fixes");
41
+ // Project context for framework detection
42
+ const project_context_builder_1 = require("./utils/project-context-builder");
35
43
  // Maximum candidates per file to send to AI validation (cost control)
36
44
  const MAX_VALIDATION_CANDIDATES_PER_FILE = 10;
37
45
  /**
@@ -189,7 +197,10 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
189
197
  log(`[Scanner] repo=${repoInfo.name} files_with_imported_auth=${filesWithImportedAuth}`);
190
198
  }
191
199
  checkCancelled();
200
+ // Phase timing tracking
201
+ const phaseTiming = {};
192
202
  // Layer 1: Surface Scan
203
+ const layer1Start = Date.now();
193
204
  reportProgress('layer1', 'Running surface scan (patterns, entropy, config)...');
194
205
  let layer1Result = await (0, layer1_1.runLayer1Scan)(files, onProgress, cancellationToken);
195
206
  // Aggregate repeated localhost findings
@@ -198,9 +209,11 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
198
209
  ...layer1Result,
199
210
  vulnerabilities: (0, urls_1.aggregateLocalhostFindings)(layer1Result.vulnerabilities)
200
211
  };
201
- log(`[Layer1] repo=${repoInfo.name} findings_raw=${layer1RawCount} findings_deduped=${layer1Result.vulnerabilities.length}`);
212
+ phaseTiming.layer1 = Date.now() - layer1Start;
213
+ log(`[Layer1] repo=${repoInfo.name} findings_raw=${layer1RawCount} findings_deduped=${layer1Result.vulnerabilities.length} duration=${phaseTiming.layer1}ms`);
202
214
  checkCancelled();
203
215
  // Layer 2: Structural Scan
216
+ const layer2Start = Date.now();
204
217
  reportProgress('layer2', 'Running structural scan (variables, logic gates)...', layer1Result.vulnerabilities.length);
205
218
  const layer2Result = await (0, layer2_1.runLayer2Scan)(files, { middlewareConfig, fileAuthImports }, onProgress, cancellationToken);
206
219
  // Format heuristic breakdown for logging
@@ -208,16 +221,25 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
208
221
  .filter(([, count]) => count > 0)
209
222
  .map(([name, count]) => `${name}:${count}`)
210
223
  .join(',');
211
- log(`[Layer2] repo=${repoInfo.name} findings_raw=${Object.values(layer2Result.stats.raw).reduce((a, b) => a + b, 0)} findings_deduped=${layer2Result.vulnerabilities.length} heuristic_breakdown={${heuristicBreakdown}}`);
224
+ phaseTiming.layer2 = Date.now() - layer2Start;
225
+ log(`[Layer2] repo=${repoInfo.name} findings_raw=${Object.values(layer2Result.stats.raw).reduce((a, b) => a + b, 0)} findings_deduped=${layer2Result.vulnerabilities.length} duration=${phaseTiming.layer2}ms heuristic_breakdown={${heuristicBreakdown}}`);
212
226
  // Combine Layer 1 and Layer 2 findings
213
227
  const layer12Findings = [...layer1Result.vulnerabilities, ...layer2Result.vulnerabilities];
214
228
  // Aggregate noisy findings BEFORE tier filtering to reduce noise
215
229
  const beforeAggregationCount = layer12Findings.length;
216
230
  const aggregatedFindings = aggregateNoisyFindings(layer12Findings);
217
231
  const aggregatedCount = beforeAggregationCount - aggregatedFindings.length;
232
+ // Build project context for framework-aware fixes (PRO-83)
233
+ // This detects frameworks (Next.js, Express), ORMs (Prisma, Drizzle), and frontend libs (React, Vue)
234
+ const projectContext = (0, project_context_builder_1.buildProjectContext)(files);
235
+ // Enrich findings with metadata from rule registry (PRO-82)
236
+ // PRO-83: Uses projectContext for framework-specific fix suggestions
237
+ // This provides default impact, evidence, fixSteps, references for all findings
238
+ // AI validation can override these later with context-aware content
239
+ const enrichedFindings = enrichWithMetadata(aggregatedFindings, projectContext);
218
240
  // Apply tier-based filtering based on scan depth
219
241
  // This is the key integration point for the detector tier system
220
- const tierFiltered = filterByTierAndDepth(aggregatedFindings, depth);
242
+ const tierFiltered = filterByTierAndDepth(enrichedFindings, depth);
221
243
  // Log tier breakdown
222
244
  log(`[Scanner] repo=${repoInfo.name} tier_breakdown=${(0, tiers_1.formatTierStats)(tierFiltered.tierStats)}`);
223
245
  log(`[Scanner] repo=${repoInfo.name} depth=${depth} tier_routing: surface=${tierFiltered.toSurface.length} validate=${tierFiltered.toValidate.length} hidden=${tierFiltered.hidden.length}`);
@@ -230,18 +252,30 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
230
252
  v.category === 'ai_overpermissive_tool' // Story B4: Agent tool permissions
231
253
  );
232
254
  // Surface findings that don't need validation (excluding those that do)
233
- const noValidationNeeded = tierFiltered.toSurface.filter(v => !additionalValidation.includes(v));
255
+ const noValidationNeededRaw = tierFiltered.toSurface.filter(v => !additionalValidation.includes(v));
256
+ // Apply auto-dismiss rules to direct-surface findings (mode='surface')
257
+ // Uses 'surface' mode to exclude cost-saving rules like 'info_severity_core_only'
258
+ // This ensures test/scanner/example files are dismissed, but info-severity findings still surface
259
+ const { toValidate: noValidationNeeded, dismissed: surfaceDismissed } = (0, anthropic_1.applyAutoDismissRules)(noValidationNeededRaw, 'surface');
234
260
  // Combine tier-filtered validation candidates with additional ones
235
261
  const requiresValidation = [...tierFiltered.toValidate, ...additionalValidation];
236
262
  // Apply smart auto-dismiss rules BEFORE AI validation (saves API costs)
237
263
  const { toValidate: afterAutoDismiss, dismissed: autoDismissed } = (0, anthropic_1.applyAutoDismissRules)(requiresValidation);
238
- // Track auto-dismiss by severity for logging
264
+ // Combine all dismissed findings for logging
265
+ const allDismissed = [...surfaceDismissed, ...autoDismissed];
266
+ // Track auto-dismiss by severity and category for logging
239
267
  const autoDismissBySeverity = { info: 0, low: 0, medium: 0, high: 0, critical: 0 };
240
- for (const d of autoDismissed) {
268
+ const autoDismissByCategory = {};
269
+ for (const d of allDismissed) {
241
270
  autoDismissBySeverity[d.finding.severity] = (autoDismissBySeverity[d.finding.severity] || 0) + 1;
271
+ autoDismissByCategory[d.finding.category] = (autoDismissByCategory[d.finding.category] || 0) + 1;
242
272
  }
243
- if (autoDismissed.length > 0) {
244
- log(`[Layer2] repo=${repoInfo.name} auto_dismissed_total=${autoDismissed.length} by_severity={info:${autoDismissBySeverity.info},low:${autoDismissBySeverity.low},medium:${autoDismissBySeverity.medium},high:${autoDismissBySeverity.high}}`);
273
+ if (allDismissed.length > 0) {
274
+ const categoryBreakdown = Object.entries(autoDismissByCategory)
275
+ .sort(([, a], [, b]) => b - a)
276
+ .map(([cat, count]) => `${cat}:${count}`)
277
+ .join(',');
278
+ log(`[AutoDismiss] repo=${repoInfo.name} total=${allDismissed.length} (surface=${surfaceDismissed.length} validation=${autoDismissed.length}) by_severity={info:${autoDismissBySeverity.info},low:${autoDismissBySeverity.low},medium:${autoDismissBySeverity.medium},high:${autoDismissBySeverity.high}} by_category={${categoryBreakdown}}`);
245
279
  }
246
280
  // Apply per-file cap to validation candidates (cost control)
247
281
  // Use scan mode config for max files
@@ -254,6 +288,7 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
254
288
  const shouldValidate = options.enableAI !== false && !scanModeConfig.skipAIValidation && cappedValidation.length > 0;
255
289
  if (shouldValidate) {
256
290
  checkCancelled();
291
+ const aiValidationStart = Date.now();
257
292
  reportProgress('validating', 'AI validating findings (entropy, secrets, AI patterns)...', cappedValidation.length);
258
293
  // For incremental scans, only validate findings in changed files
259
294
  const findingsToValidate = isIncremental && scanModeConfig.changedFiles
@@ -274,7 +309,8 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
274
309
  validatedFindings = validationResult.vulnerabilities;
275
310
  const { stats: validationStats } = validationResult;
276
311
  capturedValidationStats = validationStats; // Capture for return
277
- log(`[AI Validation] repo=${repoInfo.name} depth=${depth} candidates=${findingsToValidate.length} capped_from=${requiresValidation.length} auto_dismissed=${autoDismissed.length} kept=${validationStats.confirmedFindings} rejected=${validationStats.dismissedFindings} downgraded=${validationStats.downgradedFindings}`);
312
+ phaseTiming.aiValidation = Date.now() - aiValidationStart;
313
+ log(`[AI Validation] repo=${repoInfo.name} depth=${depth} duration=${phaseTiming.aiValidation}ms candidates=${findingsToValidate.length} capped_from=${requiresValidation.length} auto_dismissed=${autoDismissed.length} kept=${validationStats.confirmedFindings} rejected=${validationStats.dismissedFindings} downgraded=${validationStats.downgradedFindings}`);
278
314
  log(`[AI Validation] cost_estimate: input_tokens=${validationStats.estimatedInputTokens} output_tokens=${validationStats.estimatedOutputTokens} cost=$${validationStats.estimatedCost.toFixed(4)} api_calls=${validationStats.apiCalls}`);
279
315
  // Add back findings that weren't validated (not in changed files)
280
316
  // Mark them as skipped rather than failed validation
@@ -288,7 +324,11 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
288
324
  }
289
325
  }
290
326
  else if (scanModeConfig.skipAIValidation) {
291
- log(`[AI Validation] repo=${repoInfo.name} depth=${depth} skipped=true reason=scan_mode_config`);
327
+ log(`[AI Validation] repo=${repoInfo.name} depth=${depth} skipped=true reason=scan_mode_config findings_requiring_validation=${cappedValidation.length}`);
328
+ // In cheap mode, don't surface findings that require AI validation
329
+ // These are low-confidence without validation and would be noise
330
+ // Only surface high-confidence findings that don't need validation
331
+ validatedFindings = [];
292
332
  }
293
333
  // Combine validated and non-validated findings
294
334
  allVulnerabilities.push(...validatedFindings, ...noValidationNeeded);
@@ -297,6 +337,7 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
297
337
  const shouldRunLayer3 = options.enableAI !== false && !scanModeConfig.skipLayer3;
298
338
  if (shouldRunLayer3) {
299
339
  checkCancelled();
340
+ const layer3Start = Date.now();
300
341
  reportProgress('layer3', 'Running AI semantic analysis...', allVulnerabilities.length);
301
342
  // For incremental scans, only analyze changed files
302
343
  const filesToAnalyze = isIncremental ? filesForAI : files;
@@ -319,22 +360,55 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
319
360
  },
320
361
  cancellationToken,
321
362
  });
363
+ phaseTiming.layer3 = Date.now() - layer3Start;
322
364
  allVulnerabilities.push(...layer3Result.vulnerabilities);
323
- log(`[Layer3] repo=${repoInfo.name} depth=${depth} files_analyzed=${layer3Result.aiAnalyzed} findings=${layer3Result.vulnerabilities.length}`);
365
+ log(`[Layer3] repo=${repoInfo.name} depth=${depth} duration=${phaseTiming.layer3}ms files_analyzed=${layer3Result.aiAnalyzed} findings=${layer3Result.vulnerabilities.length}`);
324
366
  }
325
367
  else if (scanModeConfig.skipLayer3) {
326
368
  log(`[Layer3] repo=${repoInfo.name} depth=${depth} skipped=true reason=scan_mode_config`);
327
369
  }
370
+ // Log phase timing summary
371
+ const phaseTimingStr = Object.entries(phaseTiming)
372
+ .filter(([, ms]) => ms !== undefined)
373
+ .map(([phase, ms]) => `${phase}=${ms}ms`)
374
+ .join(' ');
375
+ if (phaseTimingStr) {
376
+ log(`[Scanner] repo=${repoInfo.name} phase_timing: ${phaseTimingStr}`);
377
+ }
328
378
  // Deduplicate vulnerabilities
329
379
  const uniqueVulnerabilities = deduplicateVulnerabilities(allVulnerabilities);
330
380
  // Resolve contradictions (e.g., middleware-protected INFO vs missing-auth CRITICAL on same route)
331
381
  const resolvedVulnerabilities = resolveContradictions(uniqueVulnerabilities, middlewareConfig);
382
+ // Apply suppressions (inline comments + config file)
383
+ const projectPath = options.projectPath || process.cwd();
384
+ const suppressionManager = new suppression_1.SuppressionManager({ projectPath });
385
+ const suppressionResult = suppressionManager.applySuppressions(resolvedVulnerabilities, files);
386
+ // Log suppression stats if any were suppressed
387
+ if (suppressionResult.suppressed.length > 0 || suppressionResult.expiredSuppressions > 0) {
388
+ log(`[Suppression] repo=${repoInfo.name} suppressed=${suppressionResult.suppressed.length} (inline=${suppressionResult.stats.inlineSuppressed} config_finding=${suppressionResult.stats.configFindingSuppressed} config_rule=${suppressionResult.stats.configRuleSuppressed}) expired=${suppressionResult.expiredSuppressions}`);
389
+ }
390
+ // Use the filtered findings (after suppression)
391
+ const afterSuppression = suppressionResult.findings;
332
392
  // Sort by severity
333
- const sortedVulnerabilities = sortBySeverity(resolvedVulnerabilities);
334
- // Compute issue-mix counts
393
+ const sortedVulnerabilities = sortBySeverity(afterSuppression);
394
+ // Compute issue-mix counts (based on unsuppressed findings)
335
395
  const severityCounts = computeSeverityCounts(sortedVulnerabilities);
336
396
  const categoryCounts = computeCategoryCounts(sortedVulnerabilities);
337
397
  const hasBlockingIssues = severityCounts.critical > 0 || severityCounts.high > 0;
398
+ // Build suppressed vulnerabilities summary (for --show-suppressed)
399
+ const suppressedVulnerabilities = options.showSuppressed
400
+ ? suppressionResult.suppressed.map(s => ({
401
+ hash: s.suppression.hash,
402
+ filePath: s.vulnerability.filePath,
403
+ lineNumber: s.vulnerability.lineNumber,
404
+ category: s.vulnerability.category,
405
+ severity: s.vulnerability.severity,
406
+ title: s.vulnerability.title,
407
+ suppressionType: s.suppression.type,
408
+ suppressionReason: s.suppression.reason,
409
+ expires: s.suppression.expires,
410
+ }))
411
+ : undefined;
338
412
  reportProgress('complete', 'Scan complete!', sortedVulnerabilities.length);
339
413
  return {
340
414
  repoName: repoInfo.name,
@@ -349,6 +423,10 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
349
423
  scanDuration: Date.now() - startTime,
350
424
  timestamp: new Date().toISOString(),
351
425
  validationStats: capturedValidationStats,
426
+ suppressionStats: suppressionResult.suppressed.length > 0 || suppressionResult.expiredSuppressions > 0
427
+ ? suppressionResult.stats
428
+ : undefined,
429
+ suppressedVulnerabilities,
352
430
  };
353
431
  }
354
432
  catch (error) {
@@ -382,6 +460,41 @@ async function runScan(files, repoInfo, options = {}, onProgress) {
382
460
  throw error;
383
461
  }
384
462
  }
463
+ /**
464
+ * Enrich findings with metadata from the rule registry (PRO-82)
465
+ * Sets default impact, evidence, fixSteps, and references from registry
466
+ *
467
+ * PRO-83: When projectContext is provided, uses framework-aware fix suggestions
468
+ * that are tailored to the user's detected tech stack (e.g., Prisma-specific
469
+ * SQL injection fixes instead of generic advice).
470
+ *
471
+ * These can be overridden later by AI-generated content
472
+ */
473
+ function enrichWithMetadata(findings, projectContext) {
474
+ return findings.map(f => {
475
+ const metadata = (0, rules_1.getRuleMetadata)(f.category);
476
+ if (!metadata)
477
+ return f;
478
+ // PRO-83: Check for framework-specific fix suggestions
479
+ let fixSteps = metadata.fixSteps;
480
+ if (projectContext) {
481
+ const frameworkFix = (0, framework_fixes_1.getFrameworkFix)(f.category, projectContext.frameworks, projectContext.dataAccess);
482
+ if (frameworkFix) {
483
+ fixSteps = frameworkFix.fixSteps;
484
+ // Optionally append code example to description if available
485
+ // This makes the fix more actionable
486
+ }
487
+ }
488
+ return {
489
+ ...f,
490
+ // Set defaults from registry (AI can override later)
491
+ impact: f.impact || metadata.whyItMatters,
492
+ evidence: f.evidence || metadata.evidence,
493
+ fixSteps: f.fixSteps || fixSteps,
494
+ references: f.references || metadata.references,
495
+ };
496
+ });
497
+ }
385
498
  /**
386
499
  * Aggregate noisy findings in the same file to reduce clutter
387
500
  * Groups repeated findings with same filePath + category + title
@@ -705,10 +818,36 @@ var layer2_2 = require("./layer2");
705
818
  Object.defineProperty(exports, "runLayer2Scan", { enumerable: true, get: function () { return layer2_2.runLayer2Scan; } });
706
819
  var layer3_2 = require("./layer3");
707
820
  Object.defineProperty(exports, "runLayer3Scan", { enumerable: true, get: function () { return layer3_2.runLayer3Scan; } });
708
- var project_context_builder_1 = require("./utils/project-context-builder");
709
- Object.defineProperty(exports, "buildProjectContext", { enumerable: true, get: function () { return project_context_builder_1.buildProjectContext; } });
821
+ var project_context_builder_2 = require("./utils/project-context-builder");
822
+ Object.defineProperty(exports, "buildProjectContext", { enumerable: true, get: function () { return project_context_builder_2.buildProjectContext; } });
710
823
  var anthropic_2 = require("./layer3/anthropic");
711
824
  Object.defineProperty(exports, "validateFindingsWithAI", { enumerable: true, get: function () { return anthropic_2.validateFindingsWithAI; } });
712
825
  var types_2 = require("./types");
713
826
  Object.defineProperty(exports, "createCancellationToken", { enumerable: true, get: function () { return types_2.createCancellationToken; } });
827
+ // Suppression system exports
828
+ var suppression_2 = require("./suppression");
829
+ Object.defineProperty(exports, "SuppressionManager", { enumerable: true, get: function () { return suppression_2.SuppressionManager; } });
830
+ Object.defineProperty(exports, "computeFindingHash", { enumerable: true, get: function () { return suppression_2.computeFindingHash; } });
831
+ Object.defineProperty(exports, "loadSuppressionConfig", { enumerable: true, get: function () { return suppression_2.loadSuppressionConfig; } });
832
+ Object.defineProperty(exports, "addFindingSuppression", { enumerable: true, get: function () { return suppression_2.addFindingSuppression; } });
833
+ Object.defineProperty(exports, "removeFindingSuppression", { enumerable: true, get: function () { return suppression_2.removeFindingSuppression; } });
834
+ Object.defineProperty(exports, "addRuleSuppression", { enumerable: true, get: function () { return suppression_2.addRuleSuppression; } });
835
+ Object.defineProperty(exports, "listSuppressions", { enumerable: true, get: function () { return suppression_2.listSuppressions; } });
836
+ Object.defineProperty(exports, "parseInlineSuppressions", { enumerable: true, get: function () { return suppression_2.parseInlineSuppressions; } });
837
+ Object.defineProperty(exports, "generateSuppressionComment", { enumerable: true, get: function () { return suppression_2.generateSuppressionComment; } });
838
+ Object.defineProperty(exports, "isValidHash", { enumerable: true, get: function () { return suppression_2.isValidHash; } });
839
+ // Baseline system exports
840
+ var baseline_1 = require("./baseline");
841
+ Object.defineProperty(exports, "BaselineManager", { enumerable: true, get: function () { return baseline_1.BaselineManager; } });
842
+ Object.defineProperty(exports, "computeDiff", { enumerable: true, get: function () { return baseline_1.computeDiff; } });
843
+ Object.defineProperty(exports, "hasNewBlockingIssues", { enumerable: true, get: function () { return baseline_1.hasNewBlockingIssues; } });
844
+ Object.defineProperty(exports, "formatDiffSummary", { enumerable: true, get: function () { return baseline_1.formatDiffSummary; } });
845
+ Object.defineProperty(exports, "BASELINE_FILE_PATH", { enumerable: true, get: function () { return baseline_1.BASELINE_FILE_PATH; } });
846
+ Object.defineProperty(exports, "OCULUM_DIR", { enumerable: true, get: function () { return baseline_1.OCULUM_DIR; } });
847
+ // Rule metadata exports (PRO-82)
848
+ var rules_2 = require("./rules");
849
+ Object.defineProperty(exports, "RULE_REGISTRY", { enumerable: true, get: function () { return rules_2.RULE_REGISTRY; } });
850
+ Object.defineProperty(exports, "getRuleMetadata", { enumerable: true, get: function () { return rules_2.getRuleMetadata; } });
851
+ Object.defineProperty(exports, "getAllCategories", { enumerable: true, get: function () { return rules_2.getAllCategories; } });
852
+ Object.defineProperty(exports, "hasMetadata", { enumerable: true, get: function () { return rules_2.hasMetadata; } });
714
853
  //# sourceMappingURL=index.js.map