kirograph 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (658) 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 +38 -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/grammars.d.ts +6 -0
  390. package/dist/extraction/grammars.d.ts.map +1 -1
  391. package/dist/extraction/languages.d.ts.map +1 -1
  392. package/dist/extraction/notebook.d.ts +14 -0
  393. package/dist/extraction/notebook.d.ts.map +1 -0
  394. package/dist/frameworks/amplify.d.ts +9 -0
  395. package/dist/frameworks/amplify.d.ts.map +1 -0
  396. package/dist/frameworks/angular.d.ts +9 -0
  397. package/dist/frameworks/angular.d.ts.map +1 -0
  398. package/dist/frameworks/ansible.d.ts +8 -0
  399. package/dist/frameworks/ansible.d.ts.map +1 -0
  400. package/dist/frameworks/cloudformation.d.ts +9 -0
  401. package/dist/frameworks/cloudformation.d.ts.map +1 -0
  402. package/dist/frameworks/docker.d.ts +9 -0
  403. package/dist/frameworks/docker.d.ts.map +1 -0
  404. package/dist/frameworks/elixir.d.ts +6 -0
  405. package/dist/frameworks/elixir.d.ts.map +1 -0
  406. package/dist/frameworks/flutter.d.ts +12 -0
  407. package/dist/frameworks/flutter.d.ts.map +1 -0
  408. package/dist/frameworks/iac.d.ts +10 -0
  409. package/dist/frameworks/iac.d.ts.map +1 -0
  410. package/dist/frameworks/index.d.ts +14 -0
  411. package/dist/frameworks/index.d.ts.map +1 -1
  412. package/dist/frameworks/kubernetes.d.ts +9 -0
  413. package/dist/frameworks/kubernetes.d.ts.map +1 -0
  414. package/dist/frameworks/pulumi.d.ts +9 -0
  415. package/dist/frameworks/pulumi.d.ts.map +1 -0
  416. package/dist/frameworks/scala.d.ts +6 -0
  417. package/dist/frameworks/scala.d.ts.map +1 -0
  418. package/dist/frameworks/solidity.d.ts +6 -0
  419. package/dist/frameworks/solidity.d.ts.map +1 -0
  420. package/dist/frameworks/terraform.d.ts +14 -0
  421. package/dist/frameworks/terraform.d.ts.map +1 -0
  422. package/dist/frameworks/vue.d.ts +7 -0
  423. package/dist/frameworks/vue.d.ts.map +1 -0
  424. package/dist/graph/communities.d.ts +43 -0
  425. package/dist/graph/communities.d.ts.map +1 -0
  426. package/dist/graph/flows.d.ts +55 -0
  427. package/dist/graph/flows.d.ts.map +1 -0
  428. package/dist/graph/refactor.d.ts +43 -0
  429. package/dist/graph/refactor.d.ts.map +1 -0
  430. package/dist/index.d.ts +36 -4
  431. package/dist/index.d.ts.map +1 -1
  432. package/dist/mcp/cache.d.ts +69 -0
  433. package/dist/mcp/cache.d.ts.map +1 -0
  434. package/dist/mcp/read-modes.d.ts +31 -0
  435. package/dist/mcp/read-modes.d.ts.map +1 -0
  436. package/dist/mcp/server.d.ts +1 -0
  437. package/dist/mcp/server.d.ts.map +1 -1
  438. package/dist/mcp/server.js +15 -2
  439. package/dist/mcp/server.js.map +2 -2
  440. package/dist/mcp/tool-names.d.ts +2 -0
  441. package/dist/mcp/tool-names.d.ts.map +1 -0
  442. package/dist/mcp/tool-names.js +4 -1
  443. package/dist/mcp/tool-names.js.map +2 -2
  444. package/dist/mcp/tools.d.ts +12 -0
  445. package/dist/mcp/tools.d.ts.map +1 -1
  446. package/dist/mcp/tools.js +397 -0
  447. package/dist/mcp/tools.js.map +2 -2
  448. package/dist/memory/compress.d.ts +19 -0
  449. package/dist/memory/compress.d.ts.map +1 -0
  450. package/dist/memory/database.d.ts +92 -0
  451. package/dist/memory/database.d.ts.map +1 -0
  452. package/dist/memory/database.js +38 -0
  453. package/dist/memory/database.js.map +2 -2
  454. package/dist/memory/index.d.ts +71 -0
  455. package/dist/memory/index.d.ts.map +1 -0
  456. package/dist/memory/index.js +12 -2
  457. package/dist/memory/index.js.map +2 -2
  458. package/dist/memory/symbols.d.ts +21 -0
  459. package/dist/memory/symbols.d.ts.map +1 -0
  460. package/dist/memory/types.d.ts +78 -0
  461. package/dist/memory/types.d.ts.map +1 -0
  462. package/dist/memory/types.js.map +1 -1
  463. package/dist/memory/vectors.d.ts +43 -0
  464. package/dist/memory/vectors.d.ts.map +1 -0
  465. package/dist/patterns/graph.d.ts +16 -0
  466. package/dist/patterns/graph.d.ts.map +1 -0
  467. package/dist/patterns/graph.js +45 -0
  468. package/dist/patterns/graph.js.map +7 -0
  469. package/dist/patterns/index.d.ts +4 -0
  470. package/dist/patterns/index.d.ts.map +1 -0
  471. package/dist/patterns/index.js +39 -0
  472. package/dist/patterns/index.js.map +7 -0
  473. package/dist/patterns/indexer.d.ts +15 -0
  474. package/dist/patterns/indexer.d.ts.map +1 -0
  475. package/dist/patterns/indexer.js +97 -0
  476. package/dist/patterns/indexer.js.map +7 -0
  477. package/dist/patterns/library/command-injection-go.yaml +11 -0
  478. package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
  479. package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
  480. package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
  481. package/dist/patterns/library/path-traversal-go.yaml +11 -0
  482. package/dist/patterns/library/path-traversal-py.yaml +12 -0
  483. package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
  484. package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
  485. package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
  486. package/dist/patterns/library/sql-injection-java.yaml +13 -0
  487. package/dist/patterns/library/sql-injection-py.yaml +12 -0
  488. package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
  489. package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
  490. package/dist/patterns/library/weak-crypto-py.yaml +13 -0
  491. package/dist/patterns/loader.d.ts +18 -0
  492. package/dist/patterns/loader.d.ts.map +1 -0
  493. package/dist/patterns/loader.js +277 -0
  494. package/dist/patterns/loader.js.map +7 -0
  495. package/dist/patterns/runner.d.ts +42 -0
  496. package/dist/patterns/runner.d.ts.map +1 -0
  497. package/dist/patterns/runner.js +277 -0
  498. package/dist/patterns/runner.js.map +7 -0
  499. package/dist/patterns/types.d.ts +27 -0
  500. package/dist/patterns/types.d.ts.map +1 -0
  501. package/dist/patterns/types.js +34 -0
  502. package/dist/patterns/types.js.map +7 -0
  503. package/dist/resolution/bridges/android-rn.d.ts +13 -0
  504. package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
  505. package/dist/resolution/bridges/expo-modules.d.ts +10 -0
  506. package/dist/resolution/bridges/expo-modules.d.ts.map +1 -0
  507. package/dist/resolution/bridges/flutter-channel.d.ts +14 -0
  508. package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -0
  509. package/dist/resolution/bridges/index.d.ts +40 -0
  510. package/dist/resolution/bridges/index.d.ts.map +1 -0
  511. package/dist/resolution/bridges/native-events.d.ts +10 -0
  512. package/dist/resolution/bridges/native-events.d.ts.map +1 -0
  513. package/dist/resolution/bridges/native-views.d.ts +13 -0
  514. package/dist/resolution/bridges/native-views.d.ts.map +1 -0
  515. package/dist/resolution/bridges/react-native.d.ts +9 -0
  516. package/dist/resolution/bridges/react-native.d.ts.map +1 -0
  517. package/dist/resolution/bridges/swift-objc.d.ts +14 -0
  518. package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
  519. package/dist/resolution/bridges/turbomodules.d.ts +10 -0
  520. package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
  521. package/dist/resolution/index.d.ts +28 -3
  522. package/dist/resolution/index.d.ts.map +1 -1
  523. package/dist/security/attack-surface.d.ts +46 -0
  524. package/dist/security/attack-surface.d.ts.map +1 -0
  525. package/dist/security/attack-surface.js +43 -1
  526. package/dist/security/attack-surface.js.map +2 -2
  527. package/dist/security/context-warnings.d.ts +40 -0
  528. package/dist/security/context-warnings.d.ts.map +1 -0
  529. package/dist/security/data-flows.d.ts +33 -0
  530. package/dist/security/data-flows.d.ts.map +1 -0
  531. package/dist/security/data-flows.js +65 -7
  532. package/dist/security/data-flows.js.map +2 -2
  533. package/dist/security/dep-confusion.d.ts +23 -0
  534. package/dist/security/dep-confusion.d.ts.map +1 -0
  535. package/dist/security/errors.d.ts +16 -0
  536. package/dist/security/errors.d.ts.map +1 -0
  537. package/dist/security/export/fix-suggestions.d.ts +21 -0
  538. package/dist/security/export/fix-suggestions.d.ts.map +1 -0
  539. package/dist/security/export/sbom.d.ts +33 -0
  540. package/dist/security/export/sbom.d.ts.map +1 -0
  541. package/dist/security/export/serialization.d.ts +62 -0
  542. package/dist/security/export/serialization.d.ts.map +1 -0
  543. package/dist/security/export/vex.d.ts +58 -0
  544. package/dist/security/export/vex.d.ts.map +1 -0
  545. package/dist/security/index.d.ts +21 -0
  546. package/dist/security/index.d.ts.map +1 -0
  547. package/dist/security/integrator.d.ts +63 -0
  548. package/dist/security/integrator.d.ts.map +1 -0
  549. package/dist/security/license.d.ts +33 -0
  550. package/dist/security/license.d.ts.map +1 -0
  551. package/dist/security/manifest/adapter.d.ts +92 -0
  552. package/dist/security/manifest/adapter.d.ts.map +1 -0
  553. package/dist/security/manifest/parser.d.ts +73 -0
  554. package/dist/security/manifest/parser.d.ts.map +1 -0
  555. package/dist/security/manifest/plugins/cargo.d.ts +11 -0
  556. package/dist/security/manifest/plugins/cargo.d.ts.map +1 -0
  557. package/dist/security/manifest/plugins/composer.d.ts +11 -0
  558. package/dist/security/manifest/plugins/composer.d.ts.map +1 -0
  559. package/dist/security/manifest/plugins/go.d.ts +12 -0
  560. package/dist/security/manifest/plugins/go.d.ts.map +1 -0
  561. package/dist/security/manifest/plugins/gradle.d.ts +12 -0
  562. package/dist/security/manifest/plugins/gradle.d.ts.map +1 -0
  563. package/dist/security/manifest/plugins/hex.d.ts +11 -0
  564. package/dist/security/manifest/plugins/hex.d.ts.map +1 -0
  565. package/dist/security/manifest/plugins/maven.d.ts +11 -0
  566. package/dist/security/manifest/plugins/maven.d.ts.map +1 -0
  567. package/dist/security/manifest/plugins/npm.d.ts +11 -0
  568. package/dist/security/manifest/plugins/npm.d.ts.map +1 -0
  569. package/dist/security/manifest/plugins/nuget.d.ts +12 -0
  570. package/dist/security/manifest/plugins/nuget.d.ts.map +1 -0
  571. package/dist/security/manifest/plugins/pip.d.ts +11 -0
  572. package/dist/security/manifest/plugins/pip.d.ts.map +1 -0
  573. package/dist/security/manifest/plugins/pubspec.d.ts +11 -0
  574. package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -0
  575. package/dist/security/manifest/plugins/pyproject.d.ts +3 -0
  576. package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -0
  577. package/dist/security/manifest/plugins/rubygems.d.ts +11 -0
  578. package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -0
  579. package/dist/security/manifest/plugins/swift.d.ts +11 -0
  580. package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
  581. package/dist/security/owasp.d.ts +16 -0
  582. package/dist/security/owasp.d.ts.map +1 -0
  583. package/dist/security/pipeline.d.ts +37 -0
  584. package/dist/security/pipeline.d.ts.map +1 -0
  585. package/dist/security/reachability.d.ts +67 -0
  586. package/dist/security/reachability.d.ts.map +1 -0
  587. package/dist/security/remediation.d.ts +51 -0
  588. package/dist/security/remediation.d.ts.map +1 -0
  589. package/dist/security/secrets.d.ts +38 -0
  590. package/dist/security/secrets.d.ts.map +1 -0
  591. package/dist/security/staleness.d.ts +43 -0
  592. package/dist/security/staleness.d.ts.map +1 -0
  593. package/dist/security/supply-chain.d.ts +34 -0
  594. package/dist/security/supply-chain.d.ts.map +1 -0
  595. package/dist/security/suppressions.d.ts +18 -0
  596. package/dist/security/suppressions.d.ts.map +1 -0
  597. package/dist/security/types.d.ts +144 -0
  598. package/dist/security/types.d.ts.map +1 -0
  599. package/dist/security/vuln/client.d.ts +90 -0
  600. package/dist/security/vuln/client.d.ts.map +1 -0
  601. package/dist/security/vuln/client.js.map +2 -2
  602. package/dist/security/vuln/epss-client.d.ts +26 -0
  603. package/dist/security/vuln/epss-client.d.ts.map +1 -0
  604. package/dist/security/vuln/index.d.ts +6 -0
  605. package/dist/security/vuln/index.d.ts.map +1 -0
  606. package/dist/security/vuln/osv-adapter.d.ts +58 -0
  607. package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
  608. package/dist/security/vuln/types.d.ts +29 -0
  609. package/dist/security/vuln/types.d.ts.map +1 -0
  610. package/dist/sync/index.d.ts +4 -2
  611. package/dist/sync/index.d.ts.map +1 -1
  612. package/dist/types.d.ts +10 -4
  613. package/dist/types.d.ts.map +1 -1
  614. package/dist/types.js.map +1 -1
  615. package/dist/vectors/index.d.ts +11 -3
  616. package/dist/vectors/index.d.ts.map +1 -1
  617. package/dist/vectors/qdrant-index.d.ts +10 -3
  618. package/dist/vectors/qdrant-index.d.ts.map +1 -1
  619. package/dist/vectors/typesense-index.d.ts.map +1 -1
  620. package/dist/watchmen/index.js +83 -0
  621. package/dist/watchmen/index.js.map +7 -0
  622. package/dist/watchmen/synthesize.js +475 -0
  623. package/dist/watchmen/synthesize.js.map +7 -0
  624. package/package.json +5 -2
  625. package/dist/security/context-warnings.test.js +0 -300
  626. package/dist/security/context-warnings.test.js.map +0 -7
  627. package/dist/security/export/fix-suggestions.test.js +0 -74
  628. package/dist/security/export/fix-suggestions.test.js.map +0 -7
  629. package/dist/security/export/sbom.test.js +0 -288
  630. package/dist/security/export/sbom.test.js.map +0 -7
  631. package/dist/security/export/serialization.test.js +0 -310
  632. package/dist/security/export/serialization.test.js.map +0 -7
  633. package/dist/security/export/vex.test.js +0 -278
  634. package/dist/security/export/vex.test.js.map +0 -7
  635. package/dist/security/integrator-transitives.test.js +0 -359
  636. package/dist/security/integrator-transitives.test.js.map +0 -7
  637. package/dist/security/integrator.test.js +0 -237
  638. package/dist/security/integrator.test.js.map +0 -7
  639. package/dist/security/manifest/adapter.test.js +0 -272
  640. package/dist/security/manifest/adapter.test.js.map +0 -7
  641. package/dist/security/manifest/parser.test.js +0 -110
  642. package/dist/security/manifest/parser.test.js.map +0 -7
  643. package/dist/security/manifest/plugins/cargo.test.js +0 -304
  644. package/dist/security/manifest/plugins/cargo.test.js.map +0 -7
  645. package/dist/security/manifest/plugins/go.test.js +0 -341
  646. package/dist/security/manifest/plugins/go.test.js.map +0 -7
  647. package/dist/security/manifest/plugins/maven.test.js +0 -389
  648. package/dist/security/manifest/plugins/maven.test.js.map +0 -7
  649. package/dist/security/manifest/plugins/npm.test.js +0 -298
  650. package/dist/security/manifest/plugins/npm.test.js.map +0 -7
  651. package/dist/security/manifest/plugins/pip.test.js +0 -208
  652. package/dist/security/manifest/plugins/pip.test.js.map +0 -7
  653. package/dist/security/reachability.test.js +0 -394
  654. package/dist/security/reachability.test.js.map +0 -7
  655. package/dist/security/vuln/client.test.js +0 -288
  656. package/dist/security/vuln/client.test.js.map +0 -7
  657. package/dist/security/vuln/osv-adapter.test.js +0 -391
  658. package/dist/security/vuln/osv-adapter.test.js.map +0 -7
@@ -1,394 +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 fs = __toESM(require("fs"));
26
- var path = __toESM(require("path"));
27
- var os = __toESM(require("os"));
28
- var import_reachability = require("./reachability");
29
- var import_database = require("../db/database");
30
- var import_config = require("../config");
31
- (0, import_vitest.describe)("ReachabilityAnalyzer", () => {
32
- let db;
33
- let config;
34
- let analyzer;
35
- let tmpDir;
36
- (0, import_vitest.beforeEach)(() => {
37
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "kirograph-reachability-test-"));
38
- db = new import_database.GraphDatabase(tmpDir);
39
- db.applySecuritySchema();
40
- config = (0, import_config.createDefaultConfig)();
41
- config.enableArchitecture = true;
42
- config.enableSecurity = true;
43
- analyzer = new import_reachability.ReachabilityAnalyzer(db, config);
44
- });
45
- (0, import_vitest.afterEach)(() => {
46
- db.close();
47
- fs.rmSync(tmpDir, { recursive: true, force: true });
48
- });
49
- function createNode(id, kind, opts) {
50
- const node = {
51
- id,
52
- kind,
53
- name: opts?.name ?? id,
54
- qualifiedName: opts?.qualifiedName ?? id,
55
- filePath: opts?.filePath ?? `src/${id}.ts`,
56
- language: "typescript",
57
- startLine: 0,
58
- endLine: 0,
59
- startColumn: 0,
60
- endColumn: 0,
61
- isExported: opts?.isExported ?? false,
62
- updatedAt: Date.now()
63
- };
64
- db.upsertNode(node);
65
- }
66
- function createEdge(source, target, kind) {
67
- db.insertEdge({ source, target, kind });
68
- }
69
- function createDependencyNode(name) {
70
- const nodeId = `dep:npm:${name}`;
71
- createNode(nodeId, "dependency", { name });
72
- const rawDb = db.getRawDb();
73
- rawDb.run(
74
- `INSERT OR REPLACE INTO sec_dependencies
75
- (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)
76
- VALUES (?, ?, ?, ?, ?, ?, ?)`,
77
- [nodeId, "npm", name, "^1.0.0", "1.0.0", "production", '["package.json"]']
78
- );
79
- return nodeId;
80
- }
81
- function createVulnerabilityNode(cveId, depNodeId) {
82
- const nodeId = `vuln:${cveId}`;
83
- createNode(nodeId, "vulnerability", { name: cveId });
84
- const rawDb = db.getRawDb();
85
- rawDb.run(
86
- `INSERT OR REPLACE INTO sec_vulnerabilities
87
- (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)
88
- VALUES (?, ?, ?, ?, ?, ?, ?)`,
89
- [nodeId, cveId, 7.5, "[]", "1.0.1", "Test vulnerability", "OSV"]
90
- );
91
- createEdge(depNodeId, nodeId, "has_vulnerability");
92
- return nodeId;
93
- }
94
- function createEntryPoint(id, kind = "route") {
95
- createNode(id, kind, { isExported: true });
96
- }
97
- function assignLayer(filePath, layerId) {
98
- const rawDb = db.getRawDb();
99
- rawDb.run(
100
- `INSERT OR IGNORE INTO arch_layers (id, name, source, patterns, updated_at)
101
- VALUES (?, ?, 'auto', '[]', ?)`,
102
- [layerId, layerId, Date.now()]
103
- );
104
- rawDb.run(
105
- `INSERT OR REPLACE INTO arch_file_layers (file_path, layer_id, confidence, matched_pattern)
106
- VALUES (?, ?, 1.0, '**')`,
107
- [filePath, layerId]
108
- );
109
- }
110
- (0, import_vitest.describe)("analyze() - core reachability", () => {
111
- (0, import_vitest.it)("should return affected when a path exists from entry point to dependency", async () => {
112
- createEntryPoint("ep1");
113
- createNode("mid1", "function");
114
- const depId = createDependencyNode("vulnerable-pkg");
115
- const vulnId = createVulnerabilityNode("CVE-2023-001", depId);
116
- createEdge("ep1", "mid1", "calls");
117
- createEdge("mid1", depId, "imports");
118
- const result = await analyzer.analyze(vulnId);
119
- (0, import_vitest.expect)(result.verdict).toBe("affected");
120
- (0, import_vitest.expect)(result.paths.length).toBe(1);
121
- (0, import_vitest.expect)(result.paths[0].entryPoint).toBe("ep1");
122
- (0, import_vitest.expect)(result.paths[0].path).toEqual(["ep1", "mid1", depId]);
123
- (0, import_vitest.expect)(result.reachingEntryPointCount).toBe(1);
124
- });
125
- (0, import_vitest.it)("should return not_affected when no path exists", async () => {
126
- createEntryPoint("ep1");
127
- createNode("mid1", "function");
128
- const depId = createDependencyNode("isolated-pkg");
129
- const vulnId = createVulnerabilityNode("CVE-2023-002", depId);
130
- createEdge("ep1", "mid1", "calls");
131
- const result = await analyzer.analyze(vulnId);
132
- (0, import_vitest.expect)(result.verdict).toBe("not_affected");
133
- (0, import_vitest.expect)(result.paths.length).toBe(0);
134
- (0, import_vitest.expect)(result.reachingEntryPointCount).toBe(0);
135
- });
136
- (0, import_vitest.it)("should return under_investigation when unresolved imports are encountered", async () => {
137
- createEntryPoint("ep1");
138
- createNode("unresolved1", "import");
139
- const depId = createDependencyNode("maybe-pkg");
140
- const vulnId = createVulnerabilityNode("CVE-2023-003", depId);
141
- createEdge("ep1", "unresolved1", "imports");
142
- const result = await analyzer.analyze(vulnId);
143
- (0, import_vitest.expect)(result.verdict).toBe("under_investigation");
144
- (0, import_vitest.expect)(result.unresolvedSymbols).toContain("unresolved1");
145
- (0, import_vitest.expect)(result.paths.length).toBe(0);
146
- });
147
- (0, import_vitest.it)("should handle cycles without infinite loops", async () => {
148
- createEntryPoint("ep1");
149
- createNode("nodeA", "function");
150
- createNode("nodeB", "function");
151
- const depId = createDependencyNode("unreachable-pkg");
152
- const vulnId = createVulnerabilityNode("CVE-2023-004", depId);
153
- createEdge("ep1", "nodeA", "calls");
154
- createEdge("nodeA", "nodeB", "calls");
155
- createEdge("nodeB", "nodeA", "calls");
156
- const result = await analyzer.analyze(vulnId);
157
- (0, import_vitest.expect)(result.verdict).toBe("not_affected");
158
- (0, import_vitest.expect)(result.paths.length).toBe(0);
159
- });
160
- (0, import_vitest.it)("should visit each node at most once", async () => {
161
- createEntryPoint("ep1");
162
- createNode("nodeA", "function");
163
- createNode("nodeB", "function");
164
- const depId = createDependencyNode("shared-pkg");
165
- const vulnId = createVulnerabilityNode("CVE-2023-005", depId);
166
- createEdge("ep1", "nodeA", "calls");
167
- createEdge("ep1", "nodeB", "calls");
168
- createEdge("nodeA", depId, "imports");
169
- createEdge("nodeB", "nodeA", "calls");
170
- const result = await analyzer.analyze(vulnId);
171
- (0, import_vitest.expect)(result.verdict).toBe("affected");
172
- (0, import_vitest.expect)(result.paths[0].path).toEqual(["ep1", "nodeA", depId]);
173
- });
174
- (0, import_vitest.it)("should traverse calls, imports, and references edges", async () => {
175
- createEntryPoint("ep1");
176
- createNode("mid1", "function");
177
- createNode("mid2", "class");
178
- const depId = createDependencyNode("ref-pkg");
179
- const vulnId = createVulnerabilityNode("CVE-2023-006", depId);
180
- createEdge("ep1", "mid1", "calls");
181
- createEdge("mid1", "mid2", "references");
182
- createEdge("mid2", depId, "imports");
183
- const result = await analyzer.analyze(vulnId);
184
- (0, import_vitest.expect)(result.verdict).toBe("affected");
185
- (0, import_vitest.expect)(result.paths[0].path).toEqual(["ep1", "mid1", "mid2", depId]);
186
- });
187
- (0, import_vitest.it)("should return under_investigation when no dependency is linked", async () => {
188
- const vulnId = "vuln:CVE-2023-orphan";
189
- createNode(vulnId, "vulnerability", { name: "CVE-2023-orphan" });
190
- const rawDb = db.getRawDb();
191
- rawDb.run(
192
- `INSERT OR REPLACE INTO sec_vulnerabilities
193
- (node_id, cve_id, severity_score, affected_ranges, summary, source_database)
194
- VALUES (?, ?, ?, ?, ?, ?)`,
195
- [vulnId, "CVE-2023-orphan", 5, "[]", "Orphan vuln", "OSV"]
196
- );
197
- const result = await analyzer.analyze(vulnId);
198
- (0, import_vitest.expect)(result.verdict).toBe("under_investigation");
199
- });
200
- (0, import_vitest.it)("should return not_affected when no entry points exist", async () => {
201
- const depId = createDependencyNode("no-ep-pkg");
202
- const vulnId = createVulnerabilityNode("CVE-2023-007", depId);
203
- const result = await analyzer.analyze(vulnId);
204
- (0, import_vitest.expect)(result.verdict).toBe("not_affected");
205
- });
206
- (0, import_vitest.it)("should limit unresolved symbols to 50", async () => {
207
- createEntryPoint("ep1");
208
- const depId = createDependencyNode("many-unresolved-pkg");
209
- const vulnId = createVulnerabilityNode("CVE-2023-008", depId);
210
- for (let i = 0; i < 60; i++) {
211
- const importId = `unresolved-import-${i}`;
212
- createNode(importId, "import");
213
- createEdge("ep1", importId, "imports");
214
- }
215
- const result = await analyzer.analyze(vulnId);
216
- (0, import_vitest.expect)(result.verdict).toBe("under_investigation");
217
- (0, import_vitest.expect)(result.unresolvedSymbols.length).toBeLessThanOrEqual(50);
218
- });
219
- (0, import_vitest.it)("should store result in sec_reachability table", async () => {
220
- createEntryPoint("ep1");
221
- const depId = createDependencyNode("stored-pkg");
222
- const vulnId = createVulnerabilityNode("CVE-2023-009", depId);
223
- createEdge("ep1", depId, "imports");
224
- await analyzer.analyze(vulnId);
225
- const rawDb = db.getRawDb();
226
- const row = rawDb.get(
227
- `SELECT * FROM sec_reachability WHERE vulnerability_node_id = ?`,
228
- [vulnId]
229
- );
230
- (0, import_vitest.expect)(row).not.toBeNull();
231
- (0, import_vitest.expect)(row.verdict).toBe("affected");
232
- (0, import_vitest.expect)(row.reaching_entry_point_count).toBe(1);
233
- });
234
- });
235
- (0, import_vitest.describe)("analyze() - multi-entry-point paths", () => {
236
- (0, import_vitest.it)("should record shortest path from each reaching entry point", async () => {
237
- createEntryPoint("ep1");
238
- createEntryPoint("ep2");
239
- createNode("mid1", "function");
240
- createNode("mid2", "function");
241
- const depId = createDependencyNode("multi-ep-pkg");
242
- const vulnId = createVulnerabilityNode("CVE-2023-010", depId);
243
- createEdge("ep1", "mid1", "calls");
244
- createEdge("mid1", depId, "imports");
245
- createEdge("ep2", depId, "imports");
246
- const result = await analyzer.analyze(vulnId);
247
- (0, import_vitest.expect)(result.verdict).toBe("affected");
248
- (0, import_vitest.expect)(result.reachingEntryPointCount).toBe(2);
249
- (0, import_vitest.expect)(result.paths.length).toBe(2);
250
- const ep1Path = result.paths.find((p) => p.entryPoint === "ep1");
251
- const ep2Path = result.paths.find((p) => p.entryPoint === "ep2");
252
- (0, import_vitest.expect)(ep1Path).toBeDefined();
253
- (0, import_vitest.expect)(ep1Path.path).toEqual(["ep1", "mid1", depId]);
254
- (0, import_vitest.expect)(ep2Path).toBeDefined();
255
- (0, import_vitest.expect)(ep2Path.path).toEqual(["ep2", depId]);
256
- });
257
- (0, import_vitest.it)("should include total count of reaching entry points", async () => {
258
- const depId = createDependencyNode("counted-pkg");
259
- const vulnId = createVulnerabilityNode("CVE-2023-011", depId);
260
- for (let i = 0; i < 5; i++) {
261
- createEntryPoint(`ep${i}`);
262
- if (i < 3) {
263
- createEdge(`ep${i}`, depId, "imports");
264
- }
265
- }
266
- const result = await analyzer.analyze(vulnId);
267
- (0, import_vitest.expect)(result.verdict).toBe("affected");
268
- (0, import_vitest.expect)(result.reachingEntryPointCount).toBe(3);
269
- (0, import_vitest.expect)(result.paths.length).toBe(3);
270
- });
271
- (0, import_vitest.it)("should handle exported functions as entry points", async () => {
272
- createEntryPoint("exported-fn", "function");
273
- const depId = createDependencyNode("fn-ep-pkg");
274
- const vulnId = createVulnerabilityNode("CVE-2023-012", depId);
275
- createEdge("exported-fn", depId, "references");
276
- const result = await analyzer.analyze(vulnId);
277
- (0, import_vitest.expect)(result.verdict).toBe("affected");
278
- (0, import_vitest.expect)(result.paths[0].entryPoint).toBe("exported-fn");
279
- });
280
- });
281
- (0, import_vitest.describe)("getImpactSummary()", () => {
282
- (0, import_vitest.it)("should return null for non-affected vulnerabilities", async () => {
283
- createEntryPoint("ep1");
284
- const depId = createDependencyNode("not-affected-pkg");
285
- const vulnId = createVulnerabilityNode("CVE-2023-020", depId);
286
- await analyzer.analyze(vulnId);
287
- const summary = await analyzer.getImpactSummary(vulnId);
288
- (0, import_vitest.expect)(summary).toBeNull();
289
- });
290
- (0, import_vitest.it)("should identify affected layers on reachable paths", async () => {
291
- createEntryPoint("ep1");
292
- createNode("mid1", "function", { filePath: "src/api/handler.ts" });
293
- createNode("mid2", "function", { filePath: "src/service/logic.ts" });
294
- const depId = createDependencyNode("layered-pkg");
295
- const vulnId = createVulnerabilityNode("CVE-2023-021", depId);
296
- createEdge("ep1", "mid1", "calls");
297
- createEdge("mid1", "mid2", "calls");
298
- createEdge("mid2", depId, "imports");
299
- assignLayer("src/api/handler.ts", "api");
300
- assignLayer("src/service/logic.ts", "service");
301
- await analyzer.analyze(vulnId);
302
- const summary = await analyzer.getImpactSummary(vulnId);
303
- (0, import_vitest.expect)(summary).not.toBeNull();
304
- (0, import_vitest.expect)(summary.affectedLayers).toContain("api");
305
- (0, import_vitest.expect)(summary.affectedLayers).toContain("service");
306
- });
307
- (0, import_vitest.it)("should identify all affected entry points", async () => {
308
- createEntryPoint("ep1");
309
- createEntryPoint("ep2");
310
- const depId = createDependencyNode("multi-ep-impact-pkg");
311
- const vulnId = createVulnerabilityNode("CVE-2023-022", depId);
312
- createEdge("ep1", depId, "imports");
313
- createEdge("ep2", depId, "imports");
314
- await analyzer.analyze(vulnId);
315
- const summary = await analyzer.getImpactSummary(vulnId);
316
- (0, import_vitest.expect)(summary).not.toBeNull();
317
- (0, import_vitest.expect)(summary.affectedEntryPoints).toContain("ep1");
318
- (0, import_vitest.expect)(summary.affectedEntryPoints).toContain("ep2");
319
- });
320
- (0, import_vitest.it)("should cap distinct path count at 100", async () => {
321
- const depId = createDependencyNode("many-paths-pkg");
322
- const vulnId = createVulnerabilityNode("CVE-2023-023", depId);
323
- for (let i = 0; i < 110; i++) {
324
- createEntryPoint(`ep${i}`);
325
- createEdge(`ep${i}`, depId, "imports");
326
- }
327
- await analyzer.analyze(vulnId);
328
- const summary = await analyzer.getImpactSummary(vulnId);
329
- (0, import_vitest.expect)(summary).not.toBeNull();
330
- (0, import_vitest.expect)(summary.distinctPathCount).toBeLessThanOrEqual(100);
331
- });
332
- (0, import_vitest.it)("should classify symbols with no assigned layer as unclassified", async () => {
333
- createEntryPoint("ep1");
334
- createNode("mid1", "function", { filePath: "src/unknown/file.ts" });
335
- const depId = createDependencyNode("unclassified-pkg");
336
- const vulnId = createVulnerabilityNode("CVE-2023-024", depId);
337
- createEdge("ep1", "mid1", "calls");
338
- createEdge("mid1", depId, "imports");
339
- await analyzer.analyze(vulnId);
340
- const summary = await analyzer.getImpactSummary(vulnId);
341
- (0, import_vitest.expect)(summary).not.toBeNull();
342
- (0, import_vitest.expect)(summary.affectedLayers).toContain("unclassified");
343
- });
344
- (0, import_vitest.it)("should omit layer classification when enableArchitecture is false", async () => {
345
- config.enableArchitecture = false;
346
- analyzer = new import_reachability.ReachabilityAnalyzer(db, config);
347
- createEntryPoint("ep1");
348
- createNode("mid1", "function", { filePath: "src/api/handler.ts" });
349
- const depId = createDependencyNode("no-arch-pkg");
350
- const vulnId = createVulnerabilityNode("CVE-2023-025", depId);
351
- createEdge("ep1", "mid1", "calls");
352
- createEdge("mid1", depId, "imports");
353
- assignLayer("src/api/handler.ts", "api");
354
- await analyzer.analyze(vulnId);
355
- const summary = await analyzer.getImpactSummary(vulnId);
356
- (0, import_vitest.expect)(summary).not.toBeNull();
357
- (0, import_vitest.expect)(summary.affectedLayers).toEqual([]);
358
- });
359
- (0, import_vitest.it)("should store impact summary in sec_impact table", async () => {
360
- createEntryPoint("ep1");
361
- const depId = createDependencyNode("stored-impact-pkg");
362
- const vulnId = createVulnerabilityNode("CVE-2023-026", depId);
363
- createEdge("ep1", depId, "imports");
364
- await analyzer.analyze(vulnId);
365
- await analyzer.getImpactSummary(vulnId);
366
- const rawDb = db.getRawDb();
367
- const row = rawDb.get(
368
- `SELECT * FROM sec_impact WHERE vulnerability_node_id = ?`,
369
- [vulnId]
370
- );
371
- (0, import_vitest.expect)(row).not.toBeNull();
372
- (0, import_vitest.expect)(row.distinct_path_count).toBeGreaterThan(0);
373
- });
374
- });
375
- (0, import_vitest.describe)("analyzeAll()", () => {
376
- (0, import_vitest.it)("should analyze all vulnerability nodes", async () => {
377
- createEntryPoint("ep1");
378
- const dep1 = createDependencyNode("pkg1");
379
- const dep2 = createDependencyNode("pkg2");
380
- const vuln1 = createVulnerabilityNode("CVE-2023-030", dep1);
381
- const vuln2 = createVulnerabilityNode("CVE-2023-031", dep2);
382
- createEdge("ep1", dep1, "imports");
383
- const results = await analyzer.analyzeAll();
384
- (0, import_vitest.expect)(results.size).toBe(2);
385
- (0, import_vitest.expect)(results.get(vuln1).verdict).toBe("affected");
386
- (0, import_vitest.expect)(results.get(vuln2).verdict).toBe("not_affected");
387
- });
388
- (0, import_vitest.it)("should return empty map when no vulnerabilities exist", async () => {
389
- const results = await analyzer.analyzeAll();
390
- (0, import_vitest.expect)(results.size).toBe(0);
391
- });
392
- });
393
- });
394
- //# sourceMappingURL=reachability.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/security/reachability.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for ReachabilityAnalyzer\n *\n * Verifies BFS traversal, verdict assignment, multi-entry-point path recording,\n * and impact analysis with architecture context.\n *\n * Requirements: 4.1, 4.2, 4.3, 4.4, 4.6, 5.1, 5.2, 5.3, 5.4, 5.5\n */\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { ReachabilityAnalyzer } from './reachability';\nimport { GraphDatabase } from '../db/database';\nimport { createDefaultConfig, type KiroGraphConfig } from '../config';\nimport type { Node, Edge } from '../types';\n\ndescribe('ReachabilityAnalyzer', () => {\n let db: GraphDatabase;\n let config: KiroGraphConfig;\n let analyzer: ReachabilityAnalyzer;\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kirograph-reachability-test-'));\n db = new GraphDatabase(tmpDir);\n db.applySecuritySchema();\n config = createDefaultConfig();\n config.enableArchitecture = true;\n config.enableSecurity = true;\n analyzer = new ReachabilityAnalyzer(db, config);\n });\n\n afterEach(() => {\n db.close();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n // \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function createNode(id: string, kind: Node['kind'], opts?: Partial<Node>): void {\n const node: Node = {\n id,\n kind,\n name: opts?.name ?? id,\n qualifiedName: opts?.qualifiedName ?? id,\n filePath: opts?.filePath ?? `src/${id}.ts`,\n language: 'typescript',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n isExported: opts?.isExported ?? false,\n updatedAt: Date.now(),\n };\n db.upsertNode(node);\n }\n\n function createEdge(source: string, target: string, kind: Edge['kind']): void {\n db.insertEdge({ source, target, kind });\n }\n\n function createDependencyNode(name: string): string {\n const nodeId = `dep:npm:${name}`;\n createNode(nodeId, 'dependency', { name });\n const rawDb = db.getRawDb();\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 (?, ?, ?, ?, ?, ?, ?)`,\n [nodeId, 'npm', name, '^1.0.0', '1.0.0', 'production', '[\"package.json\"]'],\n );\n return nodeId;\n }\n\n function createVulnerabilityNode(cveId: string, depNodeId: string): string {\n const nodeId = `vuln:${cveId}`;\n createNode(nodeId, 'vulnerability', { name: cveId });\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [nodeId, cveId, 7.5, '[]', '1.0.1', 'Test vulnerability', 'OSV'],\n );\n // Create has_vulnerability edge: dependency \u2192 vulnerability\n createEdge(depNodeId, nodeId, 'has_vulnerability');\n return nodeId;\n }\n\n function createEntryPoint(id: string, kind: 'route' | 'function' = 'route'): void {\n createNode(id, kind, { isExported: true });\n }\n\n function assignLayer(filePath: string, layerId: string): void {\n const rawDb = db.getRawDb();\n // Ensure the layer exists in arch_layers (FK constraint)\n rawDb.run(\n `INSERT OR IGNORE INTO arch_layers (id, name, source, patterns, updated_at)\n VALUES (?, ?, 'auto', '[]', ?)`,\n [layerId, layerId, Date.now()],\n );\n rawDb.run(\n `INSERT OR REPLACE INTO arch_file_layers (file_path, layer_id, confidence, matched_pattern)\n VALUES (?, ?, 1.0, '**')`,\n [filePath, layerId],\n );\n }\n\n // \u2500\u2500 Tests: Core Reachability Traversal (Task 7.1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe('analyze() - core reachability', () => {\n it('should return affected when a path exists from entry point to dependency', async () => {\n // Graph: entryPoint \u2192 intermediate \u2192 dependency\n createEntryPoint('ep1');\n createNode('mid1', 'function');\n const depId = createDependencyNode('vulnerable-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-001', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.paths.length).toBe(1);\n expect(result.paths[0].entryPoint).toBe('ep1');\n expect(result.paths[0].path).toEqual(['ep1', 'mid1', depId]);\n expect(result.reachingEntryPointCount).toBe(1);\n });\n\n it('should return not_affected when no path exists', async () => {\n // Graph: entryPoint \u2192 mid1 (no connection to dep)\n createEntryPoint('ep1');\n createNode('mid1', 'function');\n const depId = createDependencyNode('isolated-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-002', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n // No edge from mid1 to depId\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('not_affected');\n expect(result.paths.length).toBe(0);\n expect(result.reachingEntryPointCount).toBe(0);\n });\n\n it('should return under_investigation when unresolved imports are encountered', async () => {\n // Graph: entryPoint \u2192 unresolvedImport (import node with no outgoing edges)\n createEntryPoint('ep1');\n createNode('unresolved1', 'import');\n const depId = createDependencyNode('maybe-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-003', depId);\n\n createEdge('ep1', 'unresolved1', 'imports');\n // unresolved1 has no outgoing edges \u2192 unresolved import\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('under_investigation');\n expect(result.unresolvedSymbols).toContain('unresolved1');\n expect(result.paths.length).toBe(0);\n });\n\n it('should handle cycles without infinite loops', async () => {\n // Graph: ep1 \u2192 A \u2192 B \u2192 A (cycle), no path to dep\n createEntryPoint('ep1');\n createNode('nodeA', 'function');\n createNode('nodeB', 'function');\n const depId = createDependencyNode('unreachable-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-004', depId);\n\n createEdge('ep1', 'nodeA', 'calls');\n createEdge('nodeA', 'nodeB', 'calls');\n createEdge('nodeB', 'nodeA', 'calls'); // cycle\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('not_affected');\n expect(result.paths.length).toBe(0);\n });\n\n it('should visit each node at most once', async () => {\n // Graph: ep1 \u2192 A \u2192 dep, ep1 \u2192 B \u2192 A \u2192 dep\n // A should only be visited once per BFS from ep1\n createEntryPoint('ep1');\n createNode('nodeA', 'function');\n createNode('nodeB', 'function');\n const depId = createDependencyNode('shared-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-005', depId);\n\n createEdge('ep1', 'nodeA', 'calls');\n createEdge('ep1', 'nodeB', 'calls');\n createEdge('nodeA', depId, 'imports');\n createEdge('nodeB', 'nodeA', 'calls');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n // Should find shortest path: ep1 \u2192 nodeA \u2192 dep\n expect(result.paths[0].path).toEqual(['ep1', 'nodeA', depId]);\n });\n\n it('should traverse calls, imports, and references edges', async () => {\n createEntryPoint('ep1');\n createNode('mid1', 'function');\n createNode('mid2', 'class');\n const depId = createDependencyNode('ref-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-006', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', 'mid2', 'references');\n createEdge('mid2', depId, 'imports');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.paths[0].path).toEqual(['ep1', 'mid1', 'mid2', depId]);\n });\n\n it('should return under_investigation when no dependency is linked', async () => {\n // Vulnerability with no has_vulnerability edge\n const vulnId = 'vuln:CVE-2023-orphan';\n createNode(vulnId, 'vulnerability', { name: 'CVE-2023-orphan' });\n const rawDb = db.getRawDb();\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, summary, source_database)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [vulnId, 'CVE-2023-orphan', 5.0, '[]', 'Orphan vuln', 'OSV'],\n );\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('under_investigation');\n });\n\n it('should return not_affected when no entry points exist', async () => {\n // No entry points in the graph\n const depId = createDependencyNode('no-ep-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-007', depId);\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('not_affected');\n });\n\n it('should limit unresolved symbols to 50', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('many-unresolved-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-008', depId);\n\n // Create 60 unresolved import nodes\n for (let i = 0; i < 60; i++) {\n const importId = `unresolved-import-${i}`;\n createNode(importId, 'import');\n createEdge('ep1', importId, 'imports');\n }\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('under_investigation');\n expect(result.unresolvedSymbols.length).toBeLessThanOrEqual(50);\n });\n\n it('should store result in sec_reachability table', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('stored-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-009', depId);\n createEdge('ep1', depId, 'imports');\n\n await analyzer.analyze(vulnId);\n\n const rawDb = db.getRawDb();\n const row = rawDb.get(\n `SELECT * FROM sec_reachability WHERE vulnerability_node_id = ?`,\n [vulnId],\n );\n expect(row).not.toBeNull();\n expect(row.verdict).toBe('affected');\n expect(row.reaching_entry_point_count).toBe(1);\n });\n });\n\n // \u2500\u2500 Tests: Multi-Entry-Point Path Recording (Task 7.2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe('analyze() - multi-entry-point paths', () => {\n it('should record shortest path from each reaching entry point', async () => {\n createEntryPoint('ep1');\n createEntryPoint('ep2');\n createNode('mid1', 'function');\n createNode('mid2', 'function');\n const depId = createDependencyNode('multi-ep-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-010', depId);\n\n // ep1 \u2192 mid1 \u2192 dep (length 3)\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n // ep2 \u2192 dep (length 2, shorter)\n createEdge('ep2', depId, 'imports');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.reachingEntryPointCount).toBe(2);\n expect(result.paths.length).toBe(2);\n\n const ep1Path = result.paths.find(p => p.entryPoint === 'ep1');\n const ep2Path = result.paths.find(p => p.entryPoint === 'ep2');\n\n expect(ep1Path).toBeDefined();\n expect(ep1Path!.path).toEqual(['ep1', 'mid1', depId]);\n\n expect(ep2Path).toBeDefined();\n expect(ep2Path!.path).toEqual(['ep2', depId]);\n });\n\n it('should include total count of reaching entry points', async () => {\n const depId = createDependencyNode('counted-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-011', depId);\n\n // Create 5 entry points, 3 of which reach the dep\n for (let i = 0; i < 5; i++) {\n createEntryPoint(`ep${i}`);\n if (i < 3) {\n createEdge(`ep${i}`, depId, 'imports');\n }\n }\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.reachingEntryPointCount).toBe(3);\n expect(result.paths.length).toBe(3);\n });\n\n it('should handle exported functions as entry points', async () => {\n createEntryPoint('exported-fn', 'function');\n const depId = createDependencyNode('fn-ep-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-012', depId);\n\n createEdge('exported-fn', depId, 'references');\n\n const result = await analyzer.analyze(vulnId);\n\n expect(result.verdict).toBe('affected');\n expect(result.paths[0].entryPoint).toBe('exported-fn');\n });\n });\n\n // \u2500\u2500 Tests: Impact Analysis (Task 7.3) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe('getImpactSummary()', () => {\n it('should return null for non-affected vulnerabilities', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('not-affected-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-020', depId);\n // No path to dep \u2192 not_affected\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).toBeNull();\n });\n\n it('should identify affected layers on reachable paths', async () => {\n createEntryPoint('ep1');\n createNode('mid1', 'function', { filePath: 'src/api/handler.ts' });\n createNode('mid2', 'function', { filePath: 'src/service/logic.ts' });\n const depId = createDependencyNode('layered-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-021', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', 'mid2', 'calls');\n createEdge('mid2', depId, 'imports');\n\n // Assign layers\n assignLayer('src/api/handler.ts', 'api');\n assignLayer('src/service/logic.ts', 'service');\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.affectedLayers).toContain('api');\n expect(summary!.affectedLayers).toContain('service');\n });\n\n it('should identify all affected entry points', async () => {\n createEntryPoint('ep1');\n createEntryPoint('ep2');\n const depId = createDependencyNode('multi-ep-impact-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-022', depId);\n\n createEdge('ep1', depId, 'imports');\n createEdge('ep2', depId, 'imports');\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.affectedEntryPoints).toContain('ep1');\n expect(summary!.affectedEntryPoints).toContain('ep2');\n });\n\n it('should cap distinct path count at 100', async () => {\n const depId = createDependencyNode('many-paths-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-023', depId);\n\n // Create 110 entry points each with a direct path\n for (let i = 0; i < 110; i++) {\n createEntryPoint(`ep${i}`);\n createEdge(`ep${i}`, depId, 'imports');\n }\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.distinctPathCount).toBeLessThanOrEqual(100);\n });\n\n it('should classify symbols with no assigned layer as unclassified', async () => {\n createEntryPoint('ep1');\n createNode('mid1', 'function', { filePath: 'src/unknown/file.ts' });\n const depId = createDependencyNode('unclassified-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-024', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n // No layer assigned to src/unknown/file.ts\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n expect(summary!.affectedLayers).toContain('unclassified');\n });\n\n it('should omit layer classification when enableArchitecture is false', async () => {\n config.enableArchitecture = false;\n analyzer = new ReachabilityAnalyzer(db, config);\n\n createEntryPoint('ep1');\n createNode('mid1', 'function', { filePath: 'src/api/handler.ts' });\n const depId = createDependencyNode('no-arch-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-025', depId);\n\n createEdge('ep1', 'mid1', 'calls');\n createEdge('mid1', depId, 'imports');\n\n assignLayer('src/api/handler.ts', 'api');\n\n await analyzer.analyze(vulnId);\n const summary = await analyzer.getImpactSummary(vulnId);\n\n expect(summary).not.toBeNull();\n // When enableArchitecture is false, affectedLayers should be empty\n expect(summary!.affectedLayers).toEqual([]);\n });\n\n it('should store impact summary in sec_impact table', async () => {\n createEntryPoint('ep1');\n const depId = createDependencyNode('stored-impact-pkg');\n const vulnId = createVulnerabilityNode('CVE-2023-026', depId);\n createEdge('ep1', depId, 'imports');\n\n await analyzer.analyze(vulnId);\n await analyzer.getImpactSummary(vulnId);\n\n const rawDb = db.getRawDb();\n const row = rawDb.get(\n `SELECT * FROM sec_impact WHERE vulnerability_node_id = ?`,\n [vulnId],\n );\n expect(row).not.toBeNull();\n expect(row.distinct_path_count).toBeGreaterThan(0);\n });\n });\n\n // \u2500\u2500 Tests: analyzeAll() \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n describe('analyzeAll()', () => {\n it('should analyze all vulnerability nodes', async () => {\n createEntryPoint('ep1');\n const dep1 = createDependencyNode('pkg1');\n const dep2 = createDependencyNode('pkg2');\n const vuln1 = createVulnerabilityNode('CVE-2023-030', dep1);\n const vuln2 = createVulnerabilityNode('CVE-2023-031', dep2);\n\n createEdge('ep1', dep1, 'imports');\n // dep2 is not reachable\n\n const results = await analyzer.analyzeAll();\n\n expect(results.size).toBe(2);\n expect(results.get(vuln1)!.verdict).toBe('affected');\n expect(results.get(vuln2)!.verdict).toBe('not_affected');\n });\n\n it('should return empty map when no vulnerabilities exist', async () => {\n const results = await analyzer.analyzeAll();\n expect(results.size).toBe(0);\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }