kirograph 0.19.0 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/README.md +10 -8
  2. package/dist/architecture/layers/dart.d.ts +10 -0
  3. package/dist/architecture/layers/dart.d.ts.map +1 -0
  4. package/dist/architecture/layers/elixir.d.ts +6 -0
  5. package/dist/architecture/layers/elixir.d.ts.map +1 -0
  6. package/dist/architecture/layers/index.d.ts.map +1 -1
  7. package/dist/architecture/layers/ocaml.d.ts +6 -0
  8. package/dist/architecture/layers/ocaml.d.ts.map +1 -0
  9. package/dist/architecture/layers/scala.d.ts +6 -0
  10. package/dist/architecture/layers/scala.d.ts.map +1 -0
  11. package/dist/architecture/layers/solidity.d.ts +6 -0
  12. package/dist/architecture/layers/solidity.d.ts.map +1 -0
  13. package/dist/architecture/layers/vue.d.ts +6 -0
  14. package/dist/architecture/layers/vue.d.ts.map +1 -0
  15. package/dist/architecture/manifest/elm.d.ts +3 -0
  16. package/dist/architecture/manifest/elm.d.ts.map +1 -0
  17. package/dist/architecture/manifest/index.d.ts.map +1 -1
  18. package/dist/architecture/manifest/ocaml.d.ts +3 -0
  19. package/dist/architecture/manifest/ocaml.d.ts.map +1 -0
  20. package/dist/architecture/manifest/scala.d.ts +3 -0
  21. package/dist/architecture/manifest/scala.d.ts.map +1 -0
  22. package/dist/bin/banner.d.ts.map +1 -1
  23. package/dist/bin/commands/affected.d.ts.map +1 -1
  24. package/dist/bin/commands/attack-surface.d.ts +3 -0
  25. package/dist/bin/commands/attack-surface.d.ts.map +1 -0
  26. package/dist/bin/commands/attack-surface.js +7 -0
  27. package/dist/bin/commands/attack-surface.js.map +2 -2
  28. package/dist/bin/commands/benchmark.d.ts +9 -0
  29. package/dist/bin/commands/benchmark.d.ts.map +1 -0
  30. package/dist/bin/commands/budget.d.ts +6 -0
  31. package/dist/bin/commands/budget.d.ts.map +1 -0
  32. package/dist/bin/commands/caveman.d.ts +7 -0
  33. package/dist/bin/commands/caveman.d.ts.map +1 -0
  34. package/dist/bin/commands/communities.d.ts +3 -0
  35. package/dist/bin/commands/communities.d.ts.map +1 -0
  36. package/dist/bin/commands/compression.d.ts +7 -0
  37. package/dist/bin/commands/compression.d.ts.map +1 -0
  38. package/dist/bin/commands/context.d.ts.map +1 -1
  39. package/dist/bin/commands/data.d.ts +3 -0
  40. package/dist/bin/commands/data.d.ts.map +1 -0
  41. package/dist/bin/commands/dead-code.d.ts +3 -0
  42. package/dist/bin/commands/dead-code.d.ts.map +1 -0
  43. package/dist/bin/commands/dep-confusion.d.ts +3 -0
  44. package/dist/bin/commands/dep-confusion.d.ts.map +1 -0
  45. package/dist/bin/commands/docs.d.ts +3 -0
  46. package/dist/bin/commands/docs.d.ts.map +1 -0
  47. package/dist/bin/commands/exec.d.ts +11 -0
  48. package/dist/bin/commands/exec.d.ts.map +1 -0
  49. package/dist/bin/commands/export.d.ts +3 -0
  50. package/dist/bin/commands/export.d.ts.map +1 -0
  51. package/dist/bin/commands/flows.d.ts +3 -0
  52. package/dist/bin/commands/flows.d.ts.map +1 -0
  53. package/dist/bin/commands/gain.d.ts +6 -0
  54. package/dist/bin/commands/gain.d.ts.map +1 -0
  55. package/dist/bin/commands/help.d.ts +7 -0
  56. package/dist/bin/commands/help.d.ts.map +1 -1
  57. package/dist/bin/commands/help.js +20 -3
  58. package/dist/bin/commands/help.js.map +2 -2
  59. package/dist/bin/commands/hotspots.d.ts +3 -0
  60. package/dist/bin/commands/hotspots.d.ts.map +1 -0
  61. package/dist/bin/commands/hotspots.js +94 -1
  62. package/dist/bin/commands/hotspots.js.map +3 -3
  63. package/dist/bin/commands/install.d.ts.map +1 -1
  64. package/dist/bin/commands/install.js +3 -3
  65. package/dist/bin/commands/install.js.map +2 -2
  66. package/dist/bin/commands/licenses.d.ts +3 -0
  67. package/dist/bin/commands/licenses.d.ts.map +1 -0
  68. package/dist/bin/commands/memory.d.ts +16 -0
  69. package/dist/bin/commands/memory.d.ts.map +1 -0
  70. package/dist/bin/commands/memory.js +151 -4
  71. package/dist/bin/commands/memory.js.map +2 -2
  72. package/dist/bin/commands/path.d.ts +3 -0
  73. package/dist/bin/commands/path.d.ts.map +1 -0
  74. package/dist/bin/commands/pattern.d.ts +3 -0
  75. package/dist/bin/commands/pattern.d.ts.map +1 -0
  76. package/dist/bin/commands/pattern.js +592 -0
  77. package/dist/bin/commands/pattern.js.map +7 -0
  78. package/dist/bin/commands/query.d.ts.map +1 -1
  79. package/dist/bin/commands/reachability.d.ts +3 -0
  80. package/dist/bin/commands/reachability.d.ts.map +1 -0
  81. package/dist/bin/commands/read.d.ts +6 -0
  82. package/dist/bin/commands/read.d.ts.map +1 -0
  83. package/dist/bin/commands/refactor.d.ts +3 -0
  84. package/dist/bin/commands/refactor.d.ts.map +1 -0
  85. package/dist/bin/commands/remediation.d.ts +3 -0
  86. package/dist/bin/commands/remediation.d.ts.map +1 -0
  87. package/dist/bin/commands/sbom.d.ts +3 -0
  88. package/dist/bin/commands/sbom.d.ts.map +1 -0
  89. package/dist/bin/commands/security-ci-report.d.ts +9 -0
  90. package/dist/bin/commands/security-ci-report.d.ts.map +1 -0
  91. package/dist/bin/commands/security-export.d.ts +2 -0
  92. package/dist/bin/commands/security-export.d.ts.map +1 -0
  93. package/dist/bin/commands/security-flows.d.ts +3 -0
  94. package/dist/bin/commands/security-flows.d.ts.map +1 -0
  95. package/dist/bin/commands/security-secrets.d.ts +3 -0
  96. package/dist/bin/commands/security-secrets.d.ts.map +1 -0
  97. package/dist/bin/commands/security.d.ts +3 -0
  98. package/dist/bin/commands/security.d.ts.map +1 -0
  99. package/dist/bin/commands/security.js +15 -0
  100. package/dist/bin/commands/security.js.map +2 -2
  101. package/dist/bin/commands/snapshot.d.ts +3 -0
  102. package/dist/bin/commands/snapshot.d.ts.map +1 -0
  103. package/dist/bin/commands/staleness.d.ts +3 -0
  104. package/dist/bin/commands/staleness.d.ts.map +1 -0
  105. package/dist/bin/commands/status.d.ts.map +1 -1
  106. package/dist/bin/commands/status.js +27 -0
  107. package/dist/bin/commands/status.js.map +2 -2
  108. package/dist/bin/commands/supply-chain.d.ts +3 -0
  109. package/dist/bin/commands/supply-chain.d.ts.map +1 -0
  110. package/dist/bin/commands/surprising.d.ts +3 -0
  111. package/dist/bin/commands/surprising.d.ts.map +1 -0
  112. package/dist/bin/commands/sync.d.ts.map +1 -1
  113. package/dist/bin/commands/uninit.d.ts.map +1 -1
  114. package/dist/bin/commands/utils.d.ts +5 -0
  115. package/dist/bin/commands/utils.d.ts.map +1 -1
  116. package/dist/bin/commands/vex.d.ts +3 -0
  117. package/dist/bin/commands/vex.d.ts.map +1 -0
  118. package/dist/bin/commands/vuln-suppress.d.ts +3 -0
  119. package/dist/bin/commands/vuln-suppress.d.ts.map +1 -0
  120. package/dist/bin/commands/vulns.d.ts +3 -0
  121. package/dist/bin/commands/vulns.d.ts.map +1 -0
  122. package/dist/bin/installer/archive.d.ts +47 -0
  123. package/dist/bin/installer/archive.d.ts.map +1 -0
  124. package/dist/bin/installer/auto-detect.d.ts +16 -0
  125. package/dist/bin/installer/auto-detect.d.ts.map +1 -0
  126. package/dist/bin/installer/caveman.d.ts +12 -0
  127. package/dist/bin/installer/caveman.d.ts.map +1 -0
  128. package/dist/bin/installer/cli-agent.d.ts +7 -2
  129. package/dist/bin/installer/cli-agent.d.ts.map +1 -1
  130. package/dist/bin/installer/cli-agent.js +6 -2
  131. package/dist/bin/installer/cli-agent.js.map +2 -2
  132. package/dist/bin/installer/common.d.ts +36 -0
  133. package/dist/bin/installer/common.d.ts.map +1 -0
  134. package/dist/bin/installer/common.js +2 -1
  135. package/dist/bin/installer/common.js.map +2 -2
  136. package/dist/bin/installer/config-prompt.d.ts +1 -1
  137. package/dist/bin/installer/config-prompt.d.ts.map +1 -1
  138. package/dist/bin/installer/config-prompt.js +74 -2
  139. package/dist/bin/installer/config-prompt.js.map +2 -2
  140. package/dist/bin/installer/dashboard.d.ts.map +1 -1
  141. package/dist/bin/installer/detect.d.ts +30 -0
  142. package/dist/bin/installer/detect.d.ts.map +1 -0
  143. package/dist/bin/installer/hooks.d.ts +4 -1
  144. package/dist/bin/installer/hooks.d.ts.map +1 -1
  145. package/dist/bin/installer/hooks.js +34 -0
  146. package/dist/bin/installer/hooks.js.map +2 -2
  147. package/dist/bin/installer/index.d.ts +5 -4
  148. package/dist/bin/installer/index.d.ts.map +1 -1
  149. package/dist/bin/installer/index.js +67 -8
  150. package/dist/bin/installer/index.js.map +2 -2
  151. package/dist/bin/installer/instructions.d.ts +14 -0
  152. package/dist/bin/installer/instructions.d.ts.map +1 -0
  153. package/dist/bin/installer/instructions.js +15 -1
  154. package/dist/bin/installer/instructions.js.map +2 -2
  155. package/dist/bin/installer/mcp.d.ts.map +1 -1
  156. package/dist/bin/installer/prompts.d.ts +17 -0
  157. package/dist/bin/installer/prompts.d.ts.map +1 -1
  158. package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -1
  159. package/dist/bin/installer/steering.d.ts +14 -2
  160. package/dist/bin/installer/steering.d.ts.map +1 -1
  161. package/dist/bin/installer/steering.js +81 -0
  162. package/dist/bin/installer/steering.js.map +2 -2
  163. package/dist/bin/installer/targets/aider.d.ts +6 -0
  164. package/dist/bin/installer/targets/aider.d.ts.map +1 -0
  165. package/dist/bin/installer/targets/aider.js +3 -3
  166. package/dist/bin/installer/targets/aider.js.map +2 -2
  167. package/dist/bin/installer/targets/amp.d.ts +6 -0
  168. package/dist/bin/installer/targets/amp.d.ts.map +1 -0
  169. package/dist/bin/installer/targets/amp.js +3 -3
  170. package/dist/bin/installer/targets/amp.js.map +2 -2
  171. package/dist/bin/installer/targets/antigravity.d.ts +13 -0
  172. package/dist/bin/installer/targets/antigravity.d.ts.map +1 -0
  173. package/dist/bin/installer/targets/antigravity.js +2 -2
  174. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  175. package/dist/bin/installer/targets/augment.d.ts +6 -0
  176. package/dist/bin/installer/targets/augment.d.ts.map +1 -0
  177. package/dist/bin/installer/targets/augment.js +3 -3
  178. package/dist/bin/installer/targets/augment.js.map +2 -2
  179. package/dist/bin/installer/targets/claude.d.ts +6 -0
  180. package/dist/bin/installer/targets/claude.d.ts.map +1 -0
  181. package/dist/bin/installer/targets/claude.js +2 -2
  182. package/dist/bin/installer/targets/claude.js.map +2 -2
  183. package/dist/bin/installer/targets/cline.d.ts +13 -0
  184. package/dist/bin/installer/targets/cline.d.ts.map +1 -0
  185. package/dist/bin/installer/targets/cline.js +2 -2
  186. package/dist/bin/installer/targets/cline.js.map +2 -2
  187. package/dist/bin/installer/targets/codex.d.ts +6 -0
  188. package/dist/bin/installer/targets/codex.d.ts.map +1 -0
  189. package/dist/bin/installer/targets/codex.js +2 -2
  190. package/dist/bin/installer/targets/codex.js.map +2 -2
  191. package/dist/bin/installer/targets/continue.d.ts +12 -0
  192. package/dist/bin/installer/targets/continue.d.ts.map +1 -0
  193. package/dist/bin/installer/targets/continue.js +2 -2
  194. package/dist/bin/installer/targets/continue.js.map +2 -2
  195. package/dist/bin/installer/targets/copilot-cli.d.ts +12 -0
  196. package/dist/bin/installer/targets/copilot-cli.d.ts.map +1 -0
  197. package/dist/bin/installer/targets/copilot-cli.js +2 -2
  198. package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
  199. package/dist/bin/installer/targets/copilot.d.ts +6 -0
  200. package/dist/bin/installer/targets/copilot.d.ts.map +1 -0
  201. package/dist/bin/installer/targets/copilot.js +2 -2
  202. package/dist/bin/installer/targets/copilot.js.map +2 -2
  203. package/dist/bin/installer/targets/cursor.d.ts +6 -0
  204. package/dist/bin/installer/targets/cursor.d.ts.map +1 -0
  205. package/dist/bin/installer/targets/cursor.js +2 -2
  206. package/dist/bin/installer/targets/cursor.js.map +2 -2
  207. package/dist/bin/installer/targets/devin.d.ts +13 -0
  208. package/dist/bin/installer/targets/devin.d.ts.map +1 -0
  209. package/dist/bin/installer/targets/devin.js +2 -2
  210. package/dist/bin/installer/targets/devin.js.map +2 -2
  211. package/dist/bin/installer/targets/gemini-cli.d.ts +16 -0
  212. package/dist/bin/installer/targets/gemini-cli.d.ts.map +1 -0
  213. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  214. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  215. package/dist/bin/installer/targets/generic.d.ts +59 -0
  216. package/dist/bin/installer/targets/generic.d.ts.map +1 -0
  217. package/dist/bin/installer/targets/generic.js +2 -2
  218. package/dist/bin/installer/targets/generic.js.map +2 -2
  219. package/dist/bin/installer/targets/goose.d.ts +6 -0
  220. package/dist/bin/installer/targets/goose.d.ts.map +1 -0
  221. package/dist/bin/installer/targets/goose.js +3 -3
  222. package/dist/bin/installer/targets/goose.js.map +2 -2
  223. package/dist/bin/installer/targets/index.d.ts +11 -0
  224. package/dist/bin/installer/targets/index.d.ts.map +1 -0
  225. package/dist/bin/installer/targets/index.js.map +1 -1
  226. package/dist/bin/installer/targets/junie.d.ts +13 -0
  227. package/dist/bin/installer/targets/junie.d.ts.map +1 -0
  228. package/dist/bin/installer/targets/junie.js +2 -2
  229. package/dist/bin/installer/targets/junie.js.map +2 -2
  230. package/dist/bin/installer/targets/kilo.d.ts +12 -0
  231. package/dist/bin/installer/targets/kilo.d.ts.map +1 -0
  232. package/dist/bin/installer/targets/kilo.js +2 -2
  233. package/dist/bin/installer/targets/kilo.js.map +2 -2
  234. package/dist/bin/installer/targets/kiro.d.ts +5 -0
  235. package/dist/bin/installer/targets/kiro.d.ts.map +1 -0
  236. package/dist/bin/installer/targets/kiro.js +4 -4
  237. package/dist/bin/installer/targets/kiro.js.map +2 -2
  238. package/dist/bin/installer/targets/opencode.d.ts +13 -0
  239. package/dist/bin/installer/targets/opencode.d.ts.map +1 -0
  240. package/dist/bin/installer/targets/opencode.js +2 -2
  241. package/dist/bin/installer/targets/opencode.js.map +2 -2
  242. package/dist/bin/installer/targets/openhands.d.ts +6 -0
  243. package/dist/bin/installer/targets/openhands.d.ts.map +1 -0
  244. package/dist/bin/installer/targets/openhands.js +3 -3
  245. package/dist/bin/installer/targets/openhands.js.map +2 -2
  246. package/dist/bin/installer/targets/qoder.d.ts +12 -0
  247. package/dist/bin/installer/targets/qoder.d.ts.map +1 -0
  248. package/dist/bin/installer/targets/qoder.js +2 -2
  249. package/dist/bin/installer/targets/qoder.js.map +2 -2
  250. package/dist/bin/installer/targets/qwen.d.ts +12 -0
  251. package/dist/bin/installer/targets/qwen.d.ts.map +1 -0
  252. package/dist/bin/installer/targets/qwen.js +2 -2
  253. package/dist/bin/installer/targets/qwen.js.map +2 -2
  254. package/dist/bin/installer/targets/replit.d.ts +6 -0
  255. package/dist/bin/installer/targets/replit.d.ts.map +1 -0
  256. package/dist/bin/installer/targets/replit.js +3 -3
  257. package/dist/bin/installer/targets/replit.js.map +2 -2
  258. package/dist/bin/installer/targets/roo.d.ts +13 -0
  259. package/dist/bin/installer/targets/roo.d.ts.map +1 -0
  260. package/dist/bin/installer/targets/roo.js +2 -2
  261. package/dist/bin/installer/targets/roo.js.map +2 -2
  262. package/dist/bin/installer/targets/tabnine.d.ts +6 -0
  263. package/dist/bin/installer/targets/tabnine.d.ts.map +1 -0
  264. package/dist/bin/installer/targets/tabnine.js +3 -3
  265. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  266. package/dist/bin/installer/targets/trae.d.ts +6 -0
  267. package/dist/bin/installer/targets/trae.d.ts.map +1 -0
  268. package/dist/bin/installer/targets/trae.js +3 -3
  269. package/dist/bin/installer/targets/trae.js.map +2 -2
  270. package/dist/bin/installer/targets/warp.d.ts +12 -0
  271. package/dist/bin/installer/targets/warp.d.ts.map +1 -0
  272. package/dist/bin/installer/targets/warp.js +2 -2
  273. package/dist/bin/installer/targets/warp.js.map +2 -2
  274. package/dist/bin/installer/targets/windsurf.d.ts +13 -0
  275. package/dist/bin/installer/targets/windsurf.d.ts.map +1 -0
  276. package/dist/bin/installer/targets/windsurf.js +2 -2
  277. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  278. package/dist/bin/kirograph.js +3 -1
  279. package/dist/bin/kirograph.js.map +3 -3
  280. package/dist/bin/progress.d.ts +16 -1
  281. package/dist/bin/progress.d.ts.map +1 -1
  282. package/dist/compression/filters/aws.d.ts +9 -0
  283. package/dist/compression/filters/aws.d.ts.map +1 -0
  284. package/dist/compression/filters/docker.d.ts +6 -0
  285. package/dist/compression/filters/docker.d.ts.map +1 -0
  286. package/dist/compression/filters/files.d.ts +6 -0
  287. package/dist/compression/filters/files.d.ts.map +1 -0
  288. package/dist/compression/filters/generic.d.ts +7 -0
  289. package/dist/compression/filters/generic.d.ts.map +1 -0
  290. package/dist/compression/filters/git.d.ts +6 -0
  291. package/dist/compression/filters/git.d.ts.map +1 -0
  292. package/dist/compression/filters/github.d.ts +6 -0
  293. package/dist/compression/filters/github.d.ts.map +1 -0
  294. package/dist/compression/filters/lint.d.ts +6 -0
  295. package/dist/compression/filters/lint.d.ts.map +1 -0
  296. package/dist/compression/filters/misc.d.ts +6 -0
  297. package/dist/compression/filters/misc.d.ts.map +1 -0
  298. package/dist/compression/filters/package.d.ts +6 -0
  299. package/dist/compression/filters/package.d.ts.map +1 -0
  300. package/dist/compression/filters/test.d.ts +6 -0
  301. package/dist/compression/filters/test.d.ts.map +1 -0
  302. package/dist/compression/index.d.ts +29 -0
  303. package/dist/compression/index.d.ts.map +1 -0
  304. package/dist/compression/naive-cost.d.ts +26 -0
  305. package/dist/compression/naive-cost.d.ts.map +1 -0
  306. package/dist/compression/tracker.d.ts +155 -0
  307. package/dist/compression/tracker.d.ts.map +1 -0
  308. package/dist/compression/types.d.ts +49 -0
  309. package/dist/compression/types.d.ts.map +1 -0
  310. package/dist/config.d.ts +90 -0
  311. package/dist/config.d.ts.map +1 -1
  312. package/dist/config.js +55 -1
  313. package/dist/config.js.map +2 -2
  314. package/dist/core/lock-manager.d.ts +2 -0
  315. package/dist/core/lock-manager.d.ts.map +1 -1
  316. package/dist/core/pipeline.d.ts +4 -1
  317. package/dist/core/pipeline.d.ts.map +1 -1
  318. package/dist/core/pipeline.js +42 -0
  319. package/dist/core/pipeline.js.map +2 -2
  320. package/dist/core/snapshot.d.ts +58 -0
  321. package/dist/core/snapshot.d.ts.map +1 -0
  322. package/dist/data/filters.d.ts +23 -0
  323. package/dist/data/filters.d.ts.map +1 -0
  324. package/dist/data/indexer.d.ts +25 -0
  325. package/dist/data/indexer.d.ts.map +1 -0
  326. package/dist/data/linker.d.ts +37 -0
  327. package/dist/data/linker.d.ts.map +1 -0
  328. package/dist/data/lint.d.ts +27 -0
  329. package/dist/data/lint.d.ts.map +1 -0
  330. package/dist/data/parsers/csv.d.ts +11 -0
  331. package/dist/data/parsers/csv.d.ts.map +1 -0
  332. package/dist/data/parsers/excel.d.ts +10 -0
  333. package/dist/data/parsers/excel.d.ts.map +1 -0
  334. package/dist/data/parsers/index.d.ts +28 -0
  335. package/dist/data/parsers/index.d.ts.map +1 -0
  336. package/dist/data/parsers/json-array.d.ts +9 -0
  337. package/dist/data/parsers/json-array.d.ts.map +1 -0
  338. package/dist/data/parsers/jsonl.d.ts +9 -0
  339. package/dist/data/parsers/jsonl.d.ts.map +1 -0
  340. package/dist/data/parsers/parquet.d.ts +10 -0
  341. package/dist/data/parsers/parquet.d.ts.map +1 -0
  342. package/dist/data/profiler.d.ts +29 -0
  343. package/dist/data/profiler.d.ts.map +1 -0
  344. package/dist/data/queries.d.ts +95 -0
  345. package/dist/data/queries.d.ts.map +1 -0
  346. package/dist/data/types.d.ts +103 -0
  347. package/dist/data/types.d.ts.map +1 -0
  348. package/dist/db/database.d.ts +57 -0
  349. package/dist/db/database.d.ts.map +1 -1
  350. package/dist/db/database.js +19 -0
  351. package/dist/db/database.js.map +2 -2
  352. package/dist/db/patterns-schema.sql +23 -0
  353. package/dist/docs/formats/asciidoc.d.ts +9 -0
  354. package/dist/docs/formats/asciidoc.d.ts.map +1 -0
  355. package/dist/docs/formats/html.d.ts +10 -0
  356. package/dist/docs/formats/html.d.ts.map +1 -0
  357. package/dist/docs/formats/index.d.ts +31 -0
  358. package/dist/docs/formats/index.d.ts.map +1 -0
  359. package/dist/docs/formats/markdown.d.ts +11 -0
  360. package/dist/docs/formats/markdown.d.ts.map +1 -0
  361. package/dist/docs/formats/openapi.d.ts +17 -0
  362. package/dist/docs/formats/openapi.d.ts.map +1 -0
  363. package/dist/docs/formats/org.d.ts +9 -0
  364. package/dist/docs/formats/org.d.ts.map +1 -0
  365. package/dist/docs/formats/plaintext.d.ts +11 -0
  366. package/dist/docs/formats/plaintext.d.ts.map +1 -0
  367. package/dist/docs/formats/rdoc.d.ts +10 -0
  368. package/dist/docs/formats/rdoc.d.ts.map +1 -0
  369. package/dist/docs/formats/rst.d.ts +11 -0
  370. package/dist/docs/formats/rst.d.ts.map +1 -0
  371. package/dist/docs/indexer.d.ts +49 -0
  372. package/dist/docs/indexer.d.ts.map +1 -0
  373. package/dist/docs/linker.d.ts +30 -0
  374. package/dist/docs/linker.d.ts.map +1 -0
  375. package/dist/docs/lint.d.ts +27 -0
  376. package/dist/docs/lint.d.ts.map +1 -0
  377. package/dist/docs/queries.d.ts +78 -0
  378. package/dist/docs/queries.d.ts.map +1 -0
  379. package/dist/docs/section-id.d.ts +48 -0
  380. package/dist/docs/section-id.d.ts.map +1 -0
  381. package/dist/docs/summarizer.d.ts +13 -0
  382. package/dist/docs/summarizer.d.ts.map +1 -0
  383. package/dist/docs/types.d.ts +71 -0
  384. package/dist/docs/types.d.ts.map +1 -0
  385. package/dist/docs/vectors.d.ts +54 -0
  386. package/dist/docs/vectors.d.ts.map +1 -0
  387. package/dist/extraction/extractor.d.ts +1 -1
  388. package/dist/extraction/extractor.d.ts.map +1 -1
  389. package/dist/extraction/extractor.js +26 -3
  390. package/dist/extraction/extractor.js.map +2 -2
  391. package/dist/extraction/grammars.d.ts +6 -0
  392. package/dist/extraction/grammars.d.ts.map +1 -1
  393. package/dist/extraction/grammars.js +1 -0
  394. package/dist/extraction/grammars.js.map +2 -2
  395. package/dist/extraction/languages.d.ts.map +1 -1
  396. package/dist/extraction/languages.js +5 -1
  397. package/dist/extraction/languages.js.map +2 -2
  398. package/dist/extraction/notebook.d.ts +14 -0
  399. package/dist/extraction/notebook.d.ts.map +1 -0
  400. package/dist/frameworks/amplify.d.ts +9 -0
  401. package/dist/frameworks/amplify.d.ts.map +1 -0
  402. package/dist/frameworks/angular.d.ts +9 -0
  403. package/dist/frameworks/angular.d.ts.map +1 -0
  404. package/dist/frameworks/ansible.d.ts +8 -0
  405. package/dist/frameworks/ansible.d.ts.map +1 -0
  406. package/dist/frameworks/cloudformation.d.ts +9 -0
  407. package/dist/frameworks/cloudformation.d.ts.map +1 -0
  408. package/dist/frameworks/docker.d.ts +9 -0
  409. package/dist/frameworks/docker.d.ts.map +1 -0
  410. package/dist/frameworks/elixir.d.ts +6 -0
  411. package/dist/frameworks/elixir.d.ts.map +1 -0
  412. package/dist/frameworks/flutter.d.ts +12 -0
  413. package/dist/frameworks/flutter.d.ts.map +1 -0
  414. package/dist/frameworks/iac.d.ts +10 -0
  415. package/dist/frameworks/iac.d.ts.map +1 -0
  416. package/dist/frameworks/index.d.ts +14 -0
  417. package/dist/frameworks/index.d.ts.map +1 -1
  418. package/dist/frameworks/kubernetes.d.ts +9 -0
  419. package/dist/frameworks/kubernetes.d.ts.map +1 -0
  420. package/dist/frameworks/pulumi.d.ts +9 -0
  421. package/dist/frameworks/pulumi.d.ts.map +1 -0
  422. package/dist/frameworks/scala.d.ts +6 -0
  423. package/dist/frameworks/scala.d.ts.map +1 -0
  424. package/dist/frameworks/solidity.d.ts +6 -0
  425. package/dist/frameworks/solidity.d.ts.map +1 -0
  426. package/dist/frameworks/terraform.d.ts +14 -0
  427. package/dist/frameworks/terraform.d.ts.map +1 -0
  428. package/dist/frameworks/vue.d.ts +7 -0
  429. package/dist/frameworks/vue.d.ts.map +1 -0
  430. package/dist/graph/communities.d.ts +43 -0
  431. package/dist/graph/communities.d.ts.map +1 -0
  432. package/dist/graph/flows.d.ts +55 -0
  433. package/dist/graph/flows.d.ts.map +1 -0
  434. package/dist/graph/refactor.d.ts +43 -0
  435. package/dist/graph/refactor.d.ts.map +1 -0
  436. package/dist/index.d.ts +36 -4
  437. package/dist/index.d.ts.map +1 -1
  438. package/dist/mcp/cache.d.ts +69 -0
  439. package/dist/mcp/cache.d.ts.map +1 -0
  440. package/dist/mcp/read-modes.d.ts +31 -0
  441. package/dist/mcp/read-modes.d.ts.map +1 -0
  442. package/dist/mcp/server.d.ts +1 -0
  443. package/dist/mcp/server.d.ts.map +1 -1
  444. package/dist/mcp/server.js +15 -2
  445. package/dist/mcp/server.js.map +2 -2
  446. package/dist/mcp/tool-names.d.ts +2 -0
  447. package/dist/mcp/tool-names.d.ts.map +1 -0
  448. package/dist/mcp/tool-names.js +4 -1
  449. package/dist/mcp/tool-names.js.map +2 -2
  450. package/dist/mcp/tools.d.ts +12 -0
  451. package/dist/mcp/tools.d.ts.map +1 -1
  452. package/dist/mcp/tools.js +397 -0
  453. package/dist/mcp/tools.js.map +2 -2
  454. package/dist/memory/compress.d.ts +19 -0
  455. package/dist/memory/compress.d.ts.map +1 -0
  456. package/dist/memory/database.d.ts +92 -0
  457. package/dist/memory/database.d.ts.map +1 -0
  458. package/dist/memory/database.js +38 -0
  459. package/dist/memory/database.js.map +2 -2
  460. package/dist/memory/index.d.ts +71 -0
  461. package/dist/memory/index.d.ts.map +1 -0
  462. package/dist/memory/index.js +12 -2
  463. package/dist/memory/index.js.map +2 -2
  464. package/dist/memory/symbols.d.ts +21 -0
  465. package/dist/memory/symbols.d.ts.map +1 -0
  466. package/dist/memory/types.d.ts +78 -0
  467. package/dist/memory/types.d.ts.map +1 -0
  468. package/dist/memory/types.js.map +1 -1
  469. package/dist/memory/vectors.d.ts +43 -0
  470. package/dist/memory/vectors.d.ts.map +1 -0
  471. package/dist/patterns/graph.d.ts +16 -0
  472. package/dist/patterns/graph.d.ts.map +1 -0
  473. package/dist/patterns/graph.js +45 -0
  474. package/dist/patterns/graph.js.map +7 -0
  475. package/dist/patterns/index.d.ts +4 -0
  476. package/dist/patterns/index.d.ts.map +1 -0
  477. package/dist/patterns/index.js +39 -0
  478. package/dist/patterns/index.js.map +7 -0
  479. package/dist/patterns/indexer.d.ts +15 -0
  480. package/dist/patterns/indexer.d.ts.map +1 -0
  481. package/dist/patterns/indexer.js +97 -0
  482. package/dist/patterns/indexer.js.map +7 -0
  483. package/dist/patterns/library/code-eval-elixir.yaml +11 -0
  484. package/dist/patterns/library/command-injection-c.yaml +11 -0
  485. package/dist/patterns/library/command-injection-go.yaml +29 -0
  486. package/dist/patterns/library/command-injection-kotlin.yaml +10 -0
  487. package/dist/patterns/library/command-injection-php.yaml +11 -0
  488. package/dist/patterns/library/command-injection-ruby.yaml +11 -0
  489. package/dist/patterns/library/command-injection-rust.yaml +11 -0
  490. package/dist/patterns/library/dangerous-eval-bash.yaml +11 -0
  491. package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
  492. package/dist/patterns/library/dangerous-eval-php.yaml +11 -0
  493. package/dist/patterns/library/dangerous-eval-ruby.yaml +11 -0
  494. package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
  495. package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
  496. package/dist/patterns/library/dynamic-load-lua.yaml +10 -0
  497. package/dist/patterns/library/os-cmd-elixir.yaml +16 -0
  498. package/dist/patterns/library/os-execute-lua.yaml +10 -0
  499. package/dist/patterns/library/path-traversal-go.yaml +11 -0
  500. package/dist/patterns/library/path-traversal-py.yaml +12 -0
  501. package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
  502. package/dist/patterns/library/process-launch-swift.yaml +11 -0
  503. package/dist/patterns/library/process-run-dart.yaml +15 -0
  504. package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
  505. package/dist/patterns/library/source-injection-bash.yaml +11 -0
  506. package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
  507. package/dist/patterns/library/sql-injection-dart.yaml +9 -0
  508. package/dist/patterns/library/sql-injection-java.yaml +13 -0
  509. package/dist/patterns/library/sql-injection-kotlin.yaml +11 -0
  510. package/dist/patterns/library/sql-injection-php.yaml +9 -0
  511. package/dist/patterns/library/sql-injection-py.yaml +12 -0
  512. package/dist/patterns/library/sql-injection-swift.yaml +11 -0
  513. package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
  514. package/dist/patterns/library/subshell-injection-ruby.yaml +8 -0
  515. package/dist/patterns/library/unsafe-block-rust.yaml +8 -0
  516. package/dist/patterns/library/unsafe-string-c.yaml +11 -0
  517. package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
  518. package/dist/patterns/library/weak-crypto-py.yaml +13 -0
  519. package/dist/patterns/loader.d.ts +18 -0
  520. package/dist/patterns/loader.d.ts.map +1 -0
  521. package/dist/patterns/loader.js +277 -0
  522. package/dist/patterns/loader.js.map +7 -0
  523. package/dist/patterns/runner.d.ts +42 -0
  524. package/dist/patterns/runner.d.ts.map +1 -0
  525. package/dist/patterns/runner.js +295 -0
  526. package/dist/patterns/runner.js.map +7 -0
  527. package/dist/patterns/types.d.ts +27 -0
  528. package/dist/patterns/types.d.ts.map +1 -0
  529. package/dist/patterns/types.js +34 -0
  530. package/dist/patterns/types.js.map +7 -0
  531. package/dist/resolution/bridges/android-rn.d.ts +13 -0
  532. package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
  533. package/dist/resolution/bridges/expo-modules.d.ts +10 -0
  534. package/dist/resolution/bridges/expo-modules.d.ts.map +1 -0
  535. package/dist/resolution/bridges/flutter-channel.d.ts +14 -0
  536. package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -0
  537. package/dist/resolution/bridges/index.d.ts +40 -0
  538. package/dist/resolution/bridges/index.d.ts.map +1 -0
  539. package/dist/resolution/bridges/native-events.d.ts +10 -0
  540. package/dist/resolution/bridges/native-events.d.ts.map +1 -0
  541. package/dist/resolution/bridges/native-views.d.ts +13 -0
  542. package/dist/resolution/bridges/native-views.d.ts.map +1 -0
  543. package/dist/resolution/bridges/react-native.d.ts +9 -0
  544. package/dist/resolution/bridges/react-native.d.ts.map +1 -0
  545. package/dist/resolution/bridges/swift-objc.d.ts +14 -0
  546. package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
  547. package/dist/resolution/bridges/turbomodules.d.ts +10 -0
  548. package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
  549. package/dist/resolution/index.d.ts +28 -3
  550. package/dist/resolution/index.d.ts.map +1 -1
  551. package/dist/security/attack-surface.d.ts +46 -0
  552. package/dist/security/attack-surface.d.ts.map +1 -0
  553. package/dist/security/attack-surface.js +43 -1
  554. package/dist/security/attack-surface.js.map +2 -2
  555. package/dist/security/context-warnings.d.ts +40 -0
  556. package/dist/security/context-warnings.d.ts.map +1 -0
  557. package/dist/security/data-flows.d.ts +33 -0
  558. package/dist/security/data-flows.d.ts.map +1 -0
  559. package/dist/security/data-flows.js +65 -7
  560. package/dist/security/data-flows.js.map +2 -2
  561. package/dist/security/dep-confusion.d.ts +23 -0
  562. package/dist/security/dep-confusion.d.ts.map +1 -0
  563. package/dist/security/errors.d.ts +16 -0
  564. package/dist/security/errors.d.ts.map +1 -0
  565. package/dist/security/export/fix-suggestions.d.ts +21 -0
  566. package/dist/security/export/fix-suggestions.d.ts.map +1 -0
  567. package/dist/security/export/sbom.d.ts +33 -0
  568. package/dist/security/export/sbom.d.ts.map +1 -0
  569. package/dist/security/export/serialization.d.ts +62 -0
  570. package/dist/security/export/serialization.d.ts.map +1 -0
  571. package/dist/security/export/vex.d.ts +58 -0
  572. package/dist/security/export/vex.d.ts.map +1 -0
  573. package/dist/security/index.d.ts +21 -0
  574. package/dist/security/index.d.ts.map +1 -0
  575. package/dist/security/integrator.d.ts +63 -0
  576. package/dist/security/integrator.d.ts.map +1 -0
  577. package/dist/security/integrator.js +8 -8
  578. package/dist/security/integrator.js.map +2 -2
  579. package/dist/security/license.d.ts +33 -0
  580. package/dist/security/license.d.ts.map +1 -0
  581. package/dist/security/manifest/adapter.d.ts +92 -0
  582. package/dist/security/manifest/adapter.d.ts.map +1 -0
  583. package/dist/security/manifest/parser.d.ts +73 -0
  584. package/dist/security/manifest/parser.d.ts.map +1 -0
  585. package/dist/security/manifest/plugins/cargo.d.ts +11 -0
  586. package/dist/security/manifest/plugins/cargo.d.ts.map +1 -0
  587. package/dist/security/manifest/plugins/composer.d.ts +11 -0
  588. package/dist/security/manifest/plugins/composer.d.ts.map +1 -0
  589. package/dist/security/manifest/plugins/go.d.ts +12 -0
  590. package/dist/security/manifest/plugins/go.d.ts.map +1 -0
  591. package/dist/security/manifest/plugins/gradle.d.ts +12 -0
  592. package/dist/security/manifest/plugins/gradle.d.ts.map +1 -0
  593. package/dist/security/manifest/plugins/hex.d.ts +11 -0
  594. package/dist/security/manifest/plugins/hex.d.ts.map +1 -0
  595. package/dist/security/manifest/plugins/maven.d.ts +11 -0
  596. package/dist/security/manifest/plugins/maven.d.ts.map +1 -0
  597. package/dist/security/manifest/plugins/npm.d.ts +11 -0
  598. package/dist/security/manifest/plugins/npm.d.ts.map +1 -0
  599. package/dist/security/manifest/plugins/nuget.d.ts +12 -0
  600. package/dist/security/manifest/plugins/nuget.d.ts.map +1 -0
  601. package/dist/security/manifest/plugins/pip.d.ts +11 -0
  602. package/dist/security/manifest/plugins/pip.d.ts.map +1 -0
  603. package/dist/security/manifest/plugins/pubspec.d.ts +11 -0
  604. package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -0
  605. package/dist/security/manifest/plugins/pyproject.d.ts +3 -0
  606. package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -0
  607. package/dist/security/manifest/plugins/rubygems.d.ts +11 -0
  608. package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -0
  609. package/dist/security/manifest/plugins/swift.d.ts +11 -0
  610. package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
  611. package/dist/security/owasp.d.ts +16 -0
  612. package/dist/security/owasp.d.ts.map +1 -0
  613. package/dist/security/pipeline.d.ts +37 -0
  614. package/dist/security/pipeline.d.ts.map +1 -0
  615. package/dist/security/reachability.d.ts +67 -0
  616. package/dist/security/reachability.d.ts.map +1 -0
  617. package/dist/security/remediation.d.ts +51 -0
  618. package/dist/security/remediation.d.ts.map +1 -0
  619. package/dist/security/secrets.d.ts +38 -0
  620. package/dist/security/secrets.d.ts.map +1 -0
  621. package/dist/security/staleness.d.ts +43 -0
  622. package/dist/security/staleness.d.ts.map +1 -0
  623. package/dist/security/supply-chain.d.ts +34 -0
  624. package/dist/security/supply-chain.d.ts.map +1 -0
  625. package/dist/security/suppressions.d.ts +18 -0
  626. package/dist/security/suppressions.d.ts.map +1 -0
  627. package/dist/security/types.d.ts +144 -0
  628. package/dist/security/types.d.ts.map +1 -0
  629. package/dist/security/vuln/client.d.ts +90 -0
  630. package/dist/security/vuln/client.d.ts.map +1 -0
  631. package/dist/security/vuln/client.js.map +2 -2
  632. package/dist/security/vuln/epss-client.d.ts +26 -0
  633. package/dist/security/vuln/epss-client.d.ts.map +1 -0
  634. package/dist/security/vuln/index.d.ts +6 -0
  635. package/dist/security/vuln/index.d.ts.map +1 -0
  636. package/dist/security/vuln/osv-adapter.d.ts +58 -0
  637. package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
  638. package/dist/security/vuln/types.d.ts +29 -0
  639. package/dist/security/vuln/types.d.ts.map +1 -0
  640. package/dist/sync/index.d.ts +4 -2
  641. package/dist/sync/index.d.ts.map +1 -1
  642. package/dist/types.d.ts +10 -4
  643. package/dist/types.d.ts.map +1 -1
  644. package/dist/types.js.map +2 -2
  645. package/dist/vectors/index.d.ts +11 -3
  646. package/dist/vectors/index.d.ts.map +1 -1
  647. package/dist/vectors/qdrant-index.d.ts +10 -3
  648. package/dist/vectors/qdrant-index.d.ts.map +1 -1
  649. package/dist/vectors/turboquant-index.js +261 -0
  650. package/dist/vectors/turboquant-index.js.map +7 -0
  651. package/dist/vectors/typesense-index.d.ts.map +1 -1
  652. package/dist/watchmen/index.js +83 -0
  653. package/dist/watchmen/index.js.map +7 -0
  654. package/dist/watchmen/synthesize.js +475 -0
  655. package/dist/watchmen/synthesize.js.map +7 -0
  656. package/package.json +24 -2
  657. package/dist/security/context-warnings.test.js +0 -300
  658. package/dist/security/context-warnings.test.js.map +0 -7
  659. package/dist/security/export/fix-suggestions.test.js +0 -74
  660. package/dist/security/export/fix-suggestions.test.js.map +0 -7
  661. package/dist/security/export/sbom.test.js +0 -288
  662. package/dist/security/export/sbom.test.js.map +0 -7
  663. package/dist/security/export/serialization.test.js +0 -310
  664. package/dist/security/export/serialization.test.js.map +0 -7
  665. package/dist/security/export/vex.test.js +0 -278
  666. package/dist/security/export/vex.test.js.map +0 -7
  667. package/dist/security/integrator-transitives.test.js +0 -359
  668. package/dist/security/integrator-transitives.test.js.map +0 -7
  669. package/dist/security/integrator.test.js +0 -237
  670. package/dist/security/integrator.test.js.map +0 -7
  671. package/dist/security/manifest/adapter.test.js +0 -272
  672. package/dist/security/manifest/adapter.test.js.map +0 -7
  673. package/dist/security/manifest/parser.test.js +0 -110
  674. package/dist/security/manifest/parser.test.js.map +0 -7
  675. package/dist/security/manifest/plugins/cargo.test.js +0 -304
  676. package/dist/security/manifest/plugins/cargo.test.js.map +0 -7
  677. package/dist/security/manifest/plugins/go.test.js +0 -341
  678. package/dist/security/manifest/plugins/go.test.js.map +0 -7
  679. package/dist/security/manifest/plugins/maven.test.js +0 -389
  680. package/dist/security/manifest/plugins/maven.test.js.map +0 -7
  681. package/dist/security/manifest/plugins/npm.test.js +0 -298
  682. package/dist/security/manifest/plugins/npm.test.js.map +0 -7
  683. package/dist/security/manifest/plugins/pip.test.js +0 -208
  684. package/dist/security/manifest/plugins/pip.test.js.map +0 -7
  685. package/dist/security/reachability.test.js +0 -394
  686. package/dist/security/reachability.test.js.map +0 -7
  687. package/dist/security/vuln/client.test.js +0 -288
  688. package/dist/security/vuln/client.test.js.map +0 -7
  689. package/dist/security/vuln/osv-adapter.test.js +0 -391
  690. package/dist/security/vuln/osv-adapter.test.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/security/export/serialization.test.ts"],
4
- "sourcesContent": ["/**\n * Unit tests for CycloneDX serialization utilities.\n *\n * Tests serialize/deserialize for Dependency_Nodes to/from CycloneDX JSON\n * component format, including round-trip and partial failure resilience.\n */\nimport { describe, it, expect } from 'vitest';\nimport {\n serializeDependencyToComponent,\n deserializeComponentToDependency,\n serializeAll,\n deserializeAll,\n type DependencyRow,\n} from './serialization';\nimport type { CycloneDXComponent } from '../types';\n\nfunction makeDependencyRow(overrides?: Partial<DependencyRow>): DependencyRow {\n return {\n node_id: 'dep:npm:express',\n ecosystem: 'npm',\n package_name: 'express',\n declared_constraint: '^4.18.0',\n resolved_version: '4.18.2',\n scope: 'production',\n transitive_status: 'complete',\n last_vuln_check: null,\n vuln_data_stale: 0,\n vuln_data_stale_since: null,\n source_manifests: '[\"package.json\"]',\n ...overrides,\n };\n}\n\ndescribe('serializeDependencyToComponent', () => {\n it('should serialize an npm dependency to a CycloneDX component', () => {\n const dep = makeDependencyRow();\n const component = serializeDependencyToComponent(dep);\n\n expect(component.type).toBe('library');\n expect(component.name).toBe('express');\n expect(component.version).toBe('4.18.2');\n expect(component.purl).toBe('pkg:npm/express@4.18.2');\n expect(component.scope).toBe('required');\n expect(component.properties).toEqual([\n { name: 'kirograph:declaredConstraint', value: '^4.18.0' },\n ]);\n });\n\n it('should use declared_constraint as version when resolved_version is null', () => {\n const dep = makeDependencyRow({ resolved_version: null });\n const component = serializeDependencyToComponent(dep);\n\n expect(component.version).toBe('^4.18.0');\n expect(component.purl).toBe('pkg:npm/express@^4.18.0');\n });\n\n it('should map production scope to required', () => {\n const dep = makeDependencyRow({ scope: 'production' });\n const component = serializeDependencyToComponent(dep);\n expect(component.scope).toBe('required');\n });\n\n it('should map development scope to optional', () => {\n const dep = makeDependencyRow({ scope: 'development' });\n const component = serializeDependencyToComponent(dep);\n expect(component.scope).toBe('optional');\n });\n\n it('should map optional scope to optional', () => {\n const dep = makeDependencyRow({ scope: 'optional' });\n const component = serializeDependencyToComponent(dep);\n expect(component.scope).toBe('optional');\n });\n\n it('should correctly map maven ecosystem to purl type', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:maven:log4j-core',\n ecosystem: 'maven',\n package_name: 'org.apache.logging.log4j/log4j-core',\n resolved_version: '2.17.0',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:maven/org.apache.logging.log4j/log4j-core@2.17.0');\n });\n\n it('should correctly map go ecosystem to golang purl type', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:go:github.com/gin-gonic/gin',\n ecosystem: 'go',\n package_name: 'github.com/gin-gonic/gin',\n resolved_version: '1.9.1',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:golang/github.com/gin-gonic/gin@1.9.1');\n });\n\n it('should correctly map pypi ecosystem', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:pypi:django',\n ecosystem: 'pypi',\n package_name: 'django',\n resolved_version: '4.2.0',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:pypi/django@4.2.0');\n });\n\n it('should correctly map cargo ecosystem', () => {\n const dep = makeDependencyRow({\n node_id: 'dep:cargo:serde',\n ecosystem: 'cargo',\n package_name: 'serde',\n resolved_version: '1.0.188',\n });\n const component = serializeDependencyToComponent(dep);\n expect(component.purl).toBe('pkg:cargo/serde@1.0.188');\n });\n\n it('should throw for unsupported ecosystem', () => {\n const dep = makeDependencyRow({ ecosystem: 'unknown' });\n expect(() => serializeDependencyToComponent(dep)).toThrow('Unsupported ecosystem: unknown');\n });\n\n it('should throw when both version and constraint are empty', () => {\n const dep = makeDependencyRow({\n resolved_version: null,\n declared_constraint: '',\n });\n expect(() => serializeDependencyToComponent(dep)).toThrow(\n 'No version or constraint available',\n );\n });\n\n it('should throw when package_name is empty', () => {\n const dep = makeDependencyRow({ package_name: '' });\n expect(() => serializeDependencyToComponent(dep)).toThrow(\n 'Dependency package_name is required',\n );\n });\n});\n\ndescribe('deserializeComponentToDependency', () => {\n it('should deserialize a CycloneDX component to a dependency row', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n scope: 'required',\n properties: [{ name: 'kirograph:declaredConstraint', value: '^4.18.0' }],\n };\n\n const dep = deserializeComponentToDependency(component);\n\n expect(dep.ecosystem).toBe('npm');\n expect(dep.package_name).toBe('express');\n expect(dep.resolved_version).toBe('4.18.2');\n expect(dep.declared_constraint).toBe('^4.18.0');\n expect(dep.scope).toBe('production');\n expect(dep.node_id).toBe('dep:npm:express');\n });\n\n it('should use version as declared_constraint when property is missing', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.declared_constraint).toBe('4.18.2');\n });\n\n it('should map optional scope back to optional', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'jest',\n version: '29.0.0',\n purl: 'pkg:npm/jest@29.0.0',\n scope: 'optional',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.scope).toBe('optional');\n });\n\n it('should map required scope back to production', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n scope: 'required',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.scope).toBe('production');\n });\n\n it('should map golang purl type back to go ecosystem', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'github.com/gin-gonic/gin',\n version: '1.9.1',\n purl: 'pkg:golang/github.com/gin-gonic/gin@1.9.1',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.ecosystem).toBe('go');\n expect(dep.package_name).toBe('github.com/gin-gonic/gin');\n });\n\n it('should throw for missing purl', () => {\n const component = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: '',\n } as CycloneDXComponent;\n\n expect(() => deserializeComponentToDependency(component)).toThrow('missing purl');\n });\n\n it('should throw for invalid purl format', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'invalid-purl',\n };\n\n expect(() => deserializeComponentToDependency(component)).toThrow('Invalid purl format');\n });\n\n it('should throw for unsupported purl type', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'something',\n version: '1.0.0',\n purl: 'pkg:nuget/something@1.0.0',\n };\n\n expect(() => deserializeComponentToDependency(component)).toThrow('Unsupported purl type');\n });\n\n it('should set default values for non-serialized fields', () => {\n const component: CycloneDXComponent = {\n type: 'library',\n name: 'express',\n version: '4.18.2',\n purl: 'pkg:npm/express@4.18.2',\n };\n\n const dep = deserializeComponentToDependency(component);\n expect(dep.transitive_status).toBe('complete');\n expect(dep.last_vuln_check).toBeNull();\n expect(dep.vuln_data_stale).toBe(0);\n expect(dep.vuln_data_stale_since).toBeNull();\n expect(dep.source_manifests).toBe('[]');\n });\n});\n\ndescribe('serializeDependencyToComponent \u2192 deserializeComponentToDependency round-trip', () => {\n it('should preserve key fields through round-trip', () => {\n const original = makeDependencyRow();\n const component = serializeDependencyToComponent(original);\n const restored = deserializeComponentToDependency(component);\n\n expect(restored.package_name).toBe(original.package_name);\n expect(restored.resolved_version).toBe(original.resolved_version);\n expect(restored.ecosystem).toBe(original.ecosystem);\n expect(restored.scope).toBe(original.scope);\n expect(restored.declared_constraint).toBe(original.declared_constraint);\n });\n\n it('should preserve constraint when resolved_version is null', () => {\n const original = makeDependencyRow({ resolved_version: null });\n const component = serializeDependencyToComponent(original);\n const restored = deserializeComponentToDependency(component);\n\n expect(restored.declared_constraint).toBe(original.declared_constraint);\n // When no resolved version, the version in purl is the constraint\n expect(restored.resolved_version).toBe(original.declared_constraint);\n });\n});\n\ndescribe('serializeAll', () => {\n it('should serialize all valid dependencies', () => {\n const deps = [\n makeDependencyRow({ package_name: 'express', node_id: 'dep:npm:express' }),\n makeDependencyRow({ package_name: 'lodash', node_id: 'dep:npm:lodash' }),\n ];\n\n const result = serializeAll(deps);\n expect(result.components).toHaveLength(2);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should collect errors for failing nodes and continue with remaining', () => {\n const deps = [\n makeDependencyRow({ package_name: 'express' }),\n makeDependencyRow({ package_name: 'bad-dep', ecosystem: 'unsupported' }),\n makeDependencyRow({ package_name: 'lodash' }),\n ];\n\n const result = serializeAll(deps);\n expect(result.components).toHaveLength(2);\n expect(result.errors).toHaveLength(1);\n expect(result.errors[0].name).toBe('bad-dep');\n expect(result.errors[0].reason).toContain('Unsupported ecosystem');\n });\n\n it('should handle empty input', () => {\n const result = serializeAll([]);\n expect(result.components).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should handle all failures gracefully', () => {\n const deps = [\n makeDependencyRow({ ecosystem: 'unknown1', package_name: 'a' }),\n makeDependencyRow({ ecosystem: 'unknown2', package_name: 'b' }),\n ];\n\n const result = serializeAll(deps);\n expect(result.components).toHaveLength(0);\n expect(result.errors).toHaveLength(2);\n });\n});\n\ndescribe('deserializeAll', () => {\n it('should deserialize all valid components', () => {\n const components: CycloneDXComponent[] = [\n { type: 'library', name: 'express', version: '4.18.2', purl: 'pkg:npm/express@4.18.2' },\n { type: 'library', name: 'lodash', version: '4.17.21', purl: 'pkg:npm/lodash@4.17.21' },\n ];\n\n const result = deserializeAll(components);\n expect(result.deps).toHaveLength(2);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should collect errors for failing components and continue with remaining', () => {\n const components: CycloneDXComponent[] = [\n { type: 'library', name: 'express', version: '4.18.2', purl: 'pkg:npm/express@4.18.2' },\n { type: 'library', name: 'bad', version: '1.0.0', purl: 'invalid-purl' },\n { type: 'library', name: 'lodash', version: '4.17.21', purl: 'pkg:npm/lodash@4.17.21' },\n ];\n\n const result = deserializeAll(components);\n expect(result.deps).toHaveLength(2);\n expect(result.errors).toHaveLength(1);\n expect(result.errors[0].name).toBe('bad');\n expect(result.errors[0].reason).toContain('Invalid purl format');\n });\n\n it('should handle empty input', () => {\n const result = deserializeAll([]);\n expect(result.deps).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should handle all failures gracefully', () => {\n const components: CycloneDXComponent[] = [\n { type: 'library', name: 'a', version: '1.0', purl: 'bad1' },\n { type: 'library', name: 'b', version: '2.0', purl: 'bad2' },\n ];\n\n const result = deserializeAll(components);\n expect(result.deps).toHaveLength(0);\n expect(result.errors).toHaveLength(2);\n });\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,278 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (let key of __getOwnPropNames(from))
11
- if (!__hasOwnProp.call(to, key) && key !== except)
12
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
- }
14
- return to;
15
- };
16
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
- // If the importer is in node compatibility mode or this is not an ESM
18
- // file that has been converted to a CommonJS file using a Babel-
19
- // compatible transform (i.e. "__esModule" has not been set), then set
20
- // "default" to the CommonJS "module.exports" for node compatibility.
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
- var import_vitest = require("vitest");
25
- var import_vex = require("./vex");
26
- var import_database = require("../../db/database");
27
- var fs = __toESM(require("fs"));
28
- var path = __toESM(require("path"));
29
- var os = __toESM(require("os"));
30
- (0, import_vitest.describe)("VEXExporter", () => {
31
- let db;
32
- let tmpDir;
33
- (0, import_vitest.beforeEach)(() => {
34
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "vex-test-"));
35
- db = new import_database.GraphDatabase(tmpDir);
36
- db.applySecuritySchema();
37
- });
38
- (0, import_vitest.afterEach)(() => {
39
- db.close();
40
- fs.rmSync(tmpDir, { recursive: true, force: true });
41
- });
42
- function insertDependency(nodeId, ecosystem, packageName, version) {
43
- const rawDb = db.getRawDb();
44
- db.upsertNode({
45
- id: nodeId,
46
- kind: "dependency",
47
- name: packageName,
48
- qualifiedName: `${ecosystem}/${packageName}`,
49
- filePath: "package.json",
50
- language: "unknown",
51
- startLine: 0,
52
- endLine: 0,
53
- startColumn: 0,
54
- endColumn: 0,
55
- updatedAt: Date.now()
56
- });
57
- rawDb.run(
58
- `INSERT OR REPLACE INTO sec_dependencies
59
- (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)
60
- VALUES (?, ?, ?, ?, ?, 'production', '["package.json"]')`,
61
- [nodeId, ecosystem, packageName, `^${version}`, version]
62
- );
63
- }
64
- function insertVulnerability(vulnNodeId, cveId, depNodeId, severity = 7.5) {
65
- const rawDb = db.getRawDb();
66
- db.upsertNode({
67
- id: vulnNodeId,
68
- kind: "vulnerability",
69
- name: cveId,
70
- qualifiedName: cveId,
71
- filePath: "",
72
- language: "unknown",
73
- startLine: 0,
74
- endLine: 0,
75
- startColumn: 0,
76
- endColumn: 0,
77
- updatedAt: Date.now()
78
- });
79
- rawDb.run(
80
- `INSERT OR REPLACE INTO sec_vulnerabilities (node_id, cve_id, severity_score, affected_ranges, source_database)
81
- VALUES (?, ?, ?, '[]', 'OSV')`,
82
- [vulnNodeId, cveId, severity]
83
- );
84
- db.insertEdge({
85
- source: depNodeId,
86
- target: vulnNodeId,
87
- kind: "has_vulnerability",
88
- filePath: ""
89
- });
90
- }
91
- function insertReachability(vulnNodeId, verdict, paths = null, unresolvedSymbols = null, entryPointCount = 0) {
92
- const rawDb = db.getRawDb();
93
- rawDb.run(
94
- `INSERT INTO sec_reachability (vulnerability_node_id, verdict, paths, unresolved_symbols, reaching_entry_point_count, analyzed_at)
95
- VALUES (?, ?, ?, ?, ?, ?)`,
96
- [
97
- vulnNodeId,
98
- verdict,
99
- paths ? JSON.stringify(paths) : null,
100
- unresolvedSymbols ? JSON.stringify(unresolvedSymbols) : null,
101
- entryPointCount,
102
- Date.now()
103
- ]
104
- );
105
- }
106
- function insertImpact(vulnNodeId, layers, entryPoints, pathCount) {
107
- const rawDb = db.getRawDb();
108
- rawDb.run(
109
- `INSERT INTO sec_impact (vulnerability_node_id, affected_layers, affected_entry_points, distinct_path_count, analyzed_at)
110
- VALUES (?, ?, ?, ?, ?)`,
111
- [vulnNodeId, JSON.stringify(layers), JSON.stringify(entryPoints), pathCount, Date.now()]
112
- );
113
- }
114
- (0, import_vitest.describe)("export()", () => {
115
- (0, import_vitest.it)("should produce valid CycloneDX 1.5 VEX with empty vulnerabilities when none exist", () => {
116
- const exporter = new import_vex.VEXExporter(db, tmpDir);
117
- const vex = exporter.export();
118
- (0, import_vitest.expect)(vex.bomFormat).toBe("CycloneDX");
119
- (0, import_vitest.expect)(vex.specVersion).toBe("1.5");
120
- (0, import_vitest.expect)(vex.version).toBe(1);
121
- (0, import_vitest.expect)(vex.metadata).toBeDefined();
122
- (0, import_vitest.expect)(vex.vulnerabilities).toEqual([]);
123
- });
124
- (0, import_vitest.it)("should include correct metadata with tool name, version, and timestamp", () => {
125
- const exporter = new import_vex.VEXExporter(db, "/projects/my-app");
126
- const vex = exporter.export();
127
- const meta = vex.metadata;
128
- (0, import_vitest.expect)(meta.tools.components[0].name).toBe("kirograph-sec");
129
- (0, import_vitest.expect)(meta.tools.components[0].version).toBe("0.1.0");
130
- (0, import_vitest.expect)(meta.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
131
- (0, import_vitest.expect)(meta.component.name).toBe("my-app");
132
- });
133
- (0, import_vitest.it)('should map "affected" verdict correctly', () => {
134
- insertDependency("dep-1", "npm", "lodash", "4.17.20");
135
- insertVulnerability("vuln-1", "CVE-2021-23337", "dep-1", 9.8);
136
- insertReachability(
137
- "vuln-1",
138
- "affected",
139
- [
140
- { entryPoint: "ep-1", path: ["ep-1", "mid-1", "dep-1"] },
141
- { entryPoint: "ep-2", path: ["ep-2", "dep-1"] }
142
- ],
143
- null,
144
- 2
145
- );
146
- insertImpact("vuln-1", ["api", "service"], ["ep-1", "ep-2"], 2);
147
- const exporter = new import_vex.VEXExporter(db, tmpDir);
148
- const vex = exporter.export();
149
- (0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
150
- const v = vex.vulnerabilities[0];
151
- (0, import_vitest.expect)(v.id).toBe("CVE-2021-23337");
152
- (0, import_vitest.expect)(v.analysis?.state).toBe("affected");
153
- (0, import_vitest.expect)(v.analysis?.detail).toContain("2 entry points");
154
- (0, import_vitest.expect)(v.analysis?.detail).toContain("2 layers");
155
- (0, import_vitest.expect)(v.analysis?.detail).toContain("Shortest path length: 2 nodes");
156
- (0, import_vitest.expect)(v.affects).toEqual([{ ref: "pkg:npm/lodash@4.17.20" }]);
157
- (0, import_vitest.expect)(v.ratings).toEqual([{ score: 9.8, method: "CVSSv31" }]);
158
- });
159
- (0, import_vitest.it)('should map "not_affected" verdict with justification "code_not_reachable"', () => {
160
- insertDependency("dep-1", "npm", "express", "4.17.1");
161
- insertVulnerability("vuln-1", "CVE-2022-24999", "dep-1", 5.3);
162
- insertReachability("vuln-1", "not_affected", null, null, 0);
163
- const exporter = new import_vex.VEXExporter(db, tmpDir);
164
- const vex = exporter.export();
165
- (0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
166
- const v = vex.vulnerabilities[0];
167
- (0, import_vitest.expect)(v.analysis?.state).toBe("not_affected");
168
- (0, import_vitest.expect)(v.analysis?.justification).toBe("code_not_reachable");
169
- (0, import_vitest.expect)(v.analysis?.detail).toContain("No reachable path found");
170
- });
171
- (0, import_vitest.it)('should map "under_investigation" verdict with unresolved symbols', () => {
172
- insertDependency("dep-1", "pypi", "requests", "2.28.0");
173
- insertVulnerability("vuln-1", "CVE-2023-32681", "dep-1", 6.1);
174
- insertReachability(
175
- "vuln-1",
176
- "under_investigation",
177
- null,
178
- ["sym-unresolved-1", "sym-unresolved-2"],
179
- 0
180
- );
181
- const exporter = new import_vex.VEXExporter(db, tmpDir);
182
- const vex = exporter.export();
183
- (0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
184
- const v = vex.vulnerabilities[0];
185
- (0, import_vitest.expect)(v.analysis?.state).toBe("under_investigation");
186
- (0, import_vitest.expect)(v.analysis?.detail).toContain("2 unresolved symbols");
187
- (0, import_vitest.expect)(v.analysis?.detail).toContain("sym-unresolved-1");
188
- (0, import_vitest.expect)(v.analysis?.detail).toContain("sym-unresolved-2");
189
- });
190
- (0, import_vitest.it)('should set "under_investigation" when no reachability analysis performed', () => {
191
- insertDependency("dep-1", "cargo", "serde", "1.0.188");
192
- insertVulnerability("vuln-1", "CVE-2024-00001", "dep-1", 4);
193
- const exporter = new import_vex.VEXExporter(db, tmpDir);
194
- const vex = exporter.export();
195
- (0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(1);
196
- const v = vex.vulnerabilities[0];
197
- (0, import_vitest.expect)(v.analysis?.state).toBe("under_investigation");
198
- (0, import_vitest.expect)(v.analysis?.detail).toContain("has not yet been executed");
199
- });
200
- (0, import_vitest.it)("should handle multiple vulnerabilities", () => {
201
- insertDependency("dep-1", "npm", "lodash", "4.17.20");
202
- insertDependency("dep-2", "npm", "express", "4.17.1");
203
- insertVulnerability("vuln-1", "CVE-2021-23337", "dep-1", 9.8);
204
- insertVulnerability("vuln-2", "CVE-2022-24999", "dep-2", 5.3);
205
- insertReachability(
206
- "vuln-1",
207
- "affected",
208
- [{ entryPoint: "ep-1", path: ["ep-1", "dep-1"] }],
209
- null,
210
- 1
211
- );
212
- insertReachability("vuln-2", "not_affected", null, null, 0);
213
- const exporter = new import_vex.VEXExporter(db, tmpDir);
214
- const vex = exporter.export();
215
- (0, import_vitest.expect)(vex.vulnerabilities).toHaveLength(2);
216
- const affected = vex.vulnerabilities.find((v) => v.id === "CVE-2021-23337");
217
- const notAffected = vex.vulnerabilities.find((v) => v.id === "CVE-2022-24999");
218
- (0, import_vitest.expect)(affected?.analysis?.state).toBe("affected");
219
- (0, import_vitest.expect)(notAffected?.analysis?.state).toBe("not_affected");
220
- });
221
- (0, import_vitest.it)("should use declared_constraint as version when resolved_version is null", () => {
222
- const rawDb = db.getRawDb();
223
- db.upsertNode({
224
- id: "dep-1",
225
- kind: "dependency",
226
- name: "axios",
227
- qualifiedName: "npm/axios",
228
- filePath: "package.json",
229
- language: "unknown",
230
- startLine: 0,
231
- endLine: 0,
232
- startColumn: 0,
233
- endColumn: 0,
234
- updatedAt: Date.now()
235
- });
236
- rawDb.run(
237
- `INSERT OR REPLACE INTO sec_dependencies
238
- (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)
239
- VALUES ('dep-1', 'npm', 'axios', '^1.0.0', NULL, 'production', '["package.json"]')`
240
- );
241
- insertVulnerability("vuln-1", "CVE-2023-45857", "dep-1", 6.5);
242
- insertReachability("vuln-1", "not_affected", null, null, 0);
243
- const exporter = new import_vex.VEXExporter(db, tmpDir);
244
- const vex = exporter.export();
245
- (0, import_vitest.expect)(vex.vulnerabilities[0].affects).toEqual([{ ref: "pkg:npm/axios@^1.0.0" }]);
246
- });
247
- (0, import_vitest.it)("should handle vulnerability with no severity score", () => {
248
- insertDependency("dep-1", "go", "github.com/gin-gonic/gin", "1.9.1");
249
- insertVulnerability("vuln-1", "CVE-2023-99999", "dep-1", null);
250
- insertReachability("vuln-1", "not_affected", null, null, 0);
251
- const exporter = new import_vex.VEXExporter(db, tmpDir);
252
- const vex = exporter.export();
253
- (0, import_vitest.expect)(vex.vulnerabilities[0].ratings).toBeUndefined();
254
- });
255
- (0, import_vitest.it)('should handle "under_investigation" with empty unresolved symbols', () => {
256
- insertDependency("dep-1", "npm", "minimist", "1.2.5");
257
- insertVulnerability("vuln-1", "CVE-2021-44906", "dep-1", 9.8);
258
- insertReachability("vuln-1", "under_investigation", null, [], 0);
259
- const exporter = new import_vex.VEXExporter(db, tmpDir);
260
- const vex = exporter.export();
261
- const v = vex.vulnerabilities[0];
262
- (0, import_vitest.expect)(v.analysis?.state).toBe("under_investigation");
263
- (0, import_vitest.expect)(v.analysis?.detail).toBe("Reachability analysis pending.");
264
- });
265
- });
266
- (0, import_vitest.describe)("exportJSON()", () => {
267
- (0, import_vitest.it)("should return pretty-printed JSON string", () => {
268
- const exporter = new import_vex.VEXExporter(db, tmpDir);
269
- const json = exporter.exportJSON();
270
- (0, import_vitest.expect)(() => JSON.parse(json)).not.toThrow();
271
- (0, import_vitest.expect)(json).toContain("\n");
272
- const parsed = JSON.parse(json);
273
- (0, import_vitest.expect)(parsed.bomFormat).toBe("CycloneDX");
274
- (0, import_vitest.expect)(parsed.specVersion).toBe("1.5");
275
- });
276
- });
277
- });
278
- //# sourceMappingURL=vex.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/security/export/vex.test.ts"],
4
- "sourcesContent": ["/**\n * Unit tests for VEXExporter\n *\n * Tests CycloneDX 1.5 VEX generation with various vulnerability/reachability scenarios.\n */\n\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport { VEXExporter } from './vex';\nimport { GraphDatabase } from '../../db/database';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\ndescribe('VEXExporter', () => {\n let db: GraphDatabase;\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vex-test-'));\n db = new GraphDatabase(tmpDir);\n db.applySecuritySchema();\n });\n\n afterEach(() => {\n db.close();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n /**\n * Helper to insert a dependency node into the database.\n */\n function insertDependency(\n nodeId: string,\n ecosystem: string,\n packageName: string,\n version: string,\n ): void {\n const rawDb = db.getRawDb();\n\n db.upsertNode({\n id: nodeId,\n kind: 'dependency',\n name: packageName,\n qualifiedName: `${ecosystem}/${packageName}`,\n filePath: 'package.json',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n });\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_dependencies\n (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)\n VALUES (?, ?, ?, ?, ?, 'production', '[\"package.json\"]')`,\n [nodeId, ecosystem, packageName, `^${version}`, version],\n );\n }\n\n /**\n * Helper to insert a vulnerability node linked to a dependency.\n */\n function insertVulnerability(\n vulnNodeId: string,\n cveId: string,\n depNodeId: string,\n severity: number | null = 7.5,\n ): void {\n const rawDb = db.getRawDb();\n\n db.upsertNode({\n id: vulnNodeId,\n kind: 'vulnerability',\n name: cveId,\n qualifiedName: cveId,\n filePath: '',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n });\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities (node_id, cve_id, severity_score, affected_ranges, source_database)\n VALUES (?, ?, ?, '[]', 'OSV')`,\n [vulnNodeId, cveId, severity],\n );\n\n db.insertEdge({\n source: depNodeId,\n target: vulnNodeId,\n kind: 'has_vulnerability',\n filePath: '',\n });\n }\n\n /**\n * Helper to insert a reachability result.\n */\n function insertReachability(\n vulnNodeId: string,\n verdict: string,\n paths: any[] | null = null,\n unresolvedSymbols: string[] | null = null,\n entryPointCount: number = 0,\n ): void {\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT INTO sec_reachability (vulnerability_node_id, verdict, paths, unresolved_symbols, reaching_entry_point_count, analyzed_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [\n vulnNodeId,\n verdict,\n paths ? JSON.stringify(paths) : null,\n unresolvedSymbols ? JSON.stringify(unresolvedSymbols) : null,\n entryPointCount,\n Date.now(),\n ],\n );\n }\n\n /**\n * Helper to insert an impact summary.\n */\n function insertImpact(\n vulnNodeId: string,\n layers: string[],\n entryPoints: string[],\n pathCount: number,\n ): void {\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT INTO sec_impact (vulnerability_node_id, affected_layers, affected_entry_points, distinct_path_count, analyzed_at)\n VALUES (?, ?, ?, ?, ?)`,\n [vulnNodeId, JSON.stringify(layers), JSON.stringify(entryPoints), pathCount, Date.now()],\n );\n }\n\n describe('export()', () => {\n it('should produce valid CycloneDX 1.5 VEX with empty vulnerabilities when none exist', () => {\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.bomFormat).toBe('CycloneDX');\n expect(vex.specVersion).toBe('1.5');\n expect(vex.version).toBe(1);\n expect(vex.metadata).toBeDefined();\n expect(vex.vulnerabilities).toEqual([]);\n });\n\n it('should include correct metadata with tool name, version, and timestamp', () => {\n const exporter = new VEXExporter(db, '/projects/my-app');\n const vex = exporter.export();\n\n const meta = vex.metadata as any;\n expect(meta.tools.components[0].name).toBe('kirograph-sec');\n expect(meta.tools.components[0].version).toBe('0.1.0');\n expect(meta.timestamp).toMatch(/^\\d{4}-\\d{2}-\\d{2}T/);\n expect(meta.component.name).toBe('my-app');\n });\n\n it('should map \"affected\" verdict correctly', () => {\n insertDependency('dep-1', 'npm', 'lodash', '4.17.20');\n insertVulnerability('vuln-1', 'CVE-2021-23337', 'dep-1', 9.8);\n insertReachability(\n 'vuln-1',\n 'affected',\n [\n { entryPoint: 'ep-1', path: ['ep-1', 'mid-1', 'dep-1'] },\n { entryPoint: 'ep-2', path: ['ep-2', 'dep-1'] },\n ],\n null,\n 2,\n );\n insertImpact('vuln-1', ['api', 'service'], ['ep-1', 'ep-2'], 2);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.id).toBe('CVE-2021-23337');\n expect(v.analysis?.state).toBe('affected');\n expect(v.analysis?.detail).toContain('2 entry points');\n expect(v.analysis?.detail).toContain('2 layers');\n expect(v.analysis?.detail).toContain('Shortest path length: 2 nodes');\n expect(v.affects).toEqual([{ ref: 'pkg:npm/lodash@4.17.20' }]);\n expect(v.ratings).toEqual([{ score: 9.8, method: 'CVSSv31' }]);\n });\n\n it('should map \"not_affected\" verdict with justification \"code_not_reachable\"', () => {\n insertDependency('dep-1', 'npm', 'express', '4.17.1');\n insertVulnerability('vuln-1', 'CVE-2022-24999', 'dep-1', 5.3);\n insertReachability('vuln-1', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('not_affected');\n expect(v.analysis?.justification).toBe('code_not_reachable');\n expect(v.analysis?.detail).toContain('No reachable path found');\n });\n\n it('should map \"under_investigation\" verdict with unresolved symbols', () => {\n insertDependency('dep-1', 'pypi', 'requests', '2.28.0');\n insertVulnerability('vuln-1', 'CVE-2023-32681', 'dep-1', 6.1);\n insertReachability(\n 'vuln-1',\n 'under_investigation',\n null,\n ['sym-unresolved-1', 'sym-unresolved-2'],\n 0,\n );\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('under_investigation');\n expect(v.analysis?.detail).toContain('2 unresolved symbols');\n expect(v.analysis?.detail).toContain('sym-unresolved-1');\n expect(v.analysis?.detail).toContain('sym-unresolved-2');\n });\n\n it('should set \"under_investigation\" when no reachability analysis performed', () => {\n insertDependency('dep-1', 'cargo', 'serde', '1.0.188');\n insertVulnerability('vuln-1', 'CVE-2024-00001', 'dep-1', 4.0);\n // No reachability row inserted\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(1);\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('under_investigation');\n expect(v.analysis?.detail).toContain('has not yet been executed');\n });\n\n it('should handle multiple vulnerabilities', () => {\n insertDependency('dep-1', 'npm', 'lodash', '4.17.20');\n insertDependency('dep-2', 'npm', 'express', '4.17.1');\n\n insertVulnerability('vuln-1', 'CVE-2021-23337', 'dep-1', 9.8);\n insertVulnerability('vuln-2', 'CVE-2022-24999', 'dep-2', 5.3);\n\n insertReachability(\n 'vuln-1',\n 'affected',\n [{ entryPoint: 'ep-1', path: ['ep-1', 'dep-1'] }],\n null,\n 1,\n );\n insertReachability('vuln-2', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities).toHaveLength(2);\n const affected = vex.vulnerabilities.find(v => v.id === 'CVE-2021-23337');\n const notAffected = vex.vulnerabilities.find(v => v.id === 'CVE-2022-24999');\n expect(affected?.analysis?.state).toBe('affected');\n expect(notAffected?.analysis?.state).toBe('not_affected');\n });\n\n it('should use declared_constraint as version when resolved_version is null', () => {\n const rawDb = db.getRawDb();\n\n db.upsertNode({\n id: 'dep-1',\n kind: 'dependency',\n name: 'axios',\n qualifiedName: 'npm/axios',\n filePath: 'package.json',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n });\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_dependencies\n (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)\n VALUES ('dep-1', 'npm', 'axios', '^1.0.0', NULL, 'production', '[\"package.json\"]')`,\n );\n insertVulnerability('vuln-1', 'CVE-2023-45857', 'dep-1', 6.5);\n insertReachability('vuln-1', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities[0].affects).toEqual([{ ref: 'pkg:npm/axios@^1.0.0' }]);\n });\n\n it('should handle vulnerability with no severity score', () => {\n insertDependency('dep-1', 'go', 'github.com/gin-gonic/gin', '1.9.1');\n insertVulnerability('vuln-1', 'CVE-2023-99999', 'dep-1', null);\n insertReachability('vuln-1', 'not_affected', null, null, 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n expect(vex.vulnerabilities[0].ratings).toBeUndefined();\n });\n\n it('should handle \"under_investigation\" with empty unresolved symbols', () => {\n insertDependency('dep-1', 'npm', 'minimist', '1.2.5');\n insertVulnerability('vuln-1', 'CVE-2021-44906', 'dep-1', 9.8);\n insertReachability('vuln-1', 'under_investigation', null, [], 0);\n\n const exporter = new VEXExporter(db, tmpDir);\n const vex = exporter.export();\n\n const v = vex.vulnerabilities[0];\n expect(v.analysis?.state).toBe('under_investigation');\n expect(v.analysis?.detail).toBe('Reachability analysis pending.');\n });\n });\n\n describe('exportJSON()', () => {\n it('should return pretty-printed JSON string', () => {\n const exporter = new VEXExporter(db, tmpDir);\n const json = exporter.exportJSON();\n\n expect(() => JSON.parse(json)).not.toThrow();\n // Pretty-printed means it contains newlines\n expect(json).toContain('\\n');\n\n const parsed = JSON.parse(json);\n expect(parsed.bomFormat).toBe('CycloneDX');\n expect(parsed.specVersion).toBe('1.5');\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }