kirograph 0.17.0 → 0.19.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 (329) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +103 -1822
  3. package/dist/architecture/layers/dart.js +112 -0
  4. package/dist/architecture/layers/dart.js.map +7 -0
  5. package/dist/architecture/layers/index.js +3 -1
  6. package/dist/architecture/layers/index.js.map +2 -2
  7. package/dist/bin/banner.js +74 -6
  8. package/dist/bin/banner.js.map +2 -2
  9. package/dist/bin/commands/attack-surface.js +157 -0
  10. package/dist/bin/commands/attack-surface.js.map +7 -0
  11. package/dist/bin/commands/benchmark.js +206 -0
  12. package/dist/bin/commands/benchmark.js.map +7 -0
  13. package/dist/bin/commands/budget.js +70 -0
  14. package/dist/bin/commands/budget.js.map +7 -0
  15. package/dist/bin/commands/communities.js +77 -0
  16. package/dist/bin/commands/communities.js.map +7 -0
  17. package/dist/bin/commands/dep-confusion.js +119 -0
  18. package/dist/bin/commands/dep-confusion.js.map +7 -0
  19. package/dist/bin/commands/export.js +304 -10
  20. package/dist/bin/commands/export.js.map +2 -2
  21. package/dist/bin/commands/flows.js +97 -0
  22. package/dist/bin/commands/flows.js.map +7 -0
  23. package/dist/bin/commands/help.js +382 -101
  24. package/dist/bin/commands/help.js.map +2 -2
  25. package/dist/bin/commands/install.js +90 -8
  26. package/dist/bin/commands/install.js.map +2 -2
  27. package/dist/bin/commands/licenses.js +201 -0
  28. package/dist/bin/commands/licenses.js.map +7 -0
  29. package/dist/bin/commands/reachability.js +160 -0
  30. package/dist/bin/commands/reachability.js.map +7 -0
  31. package/dist/bin/commands/read.js +100 -0
  32. package/dist/bin/commands/read.js.map +7 -0
  33. package/dist/bin/commands/refactor.js +116 -0
  34. package/dist/bin/commands/refactor.js.map +7 -0
  35. package/dist/bin/commands/remediation.js +133 -0
  36. package/dist/bin/commands/remediation.js.map +7 -0
  37. package/dist/bin/commands/sbom.js +76 -0
  38. package/dist/bin/commands/sbom.js.map +7 -0
  39. package/dist/bin/commands/security-ci-report.js +267 -0
  40. package/dist/bin/commands/security-ci-report.js.map +7 -0
  41. package/dist/bin/commands/security-export.js +1349 -0
  42. package/dist/bin/commands/security-export.js.map +7 -0
  43. package/dist/bin/commands/security-flows.js +126 -0
  44. package/dist/bin/commands/security-flows.js.map +7 -0
  45. package/dist/bin/commands/security-secrets.js +170 -0
  46. package/dist/bin/commands/security-secrets.js.map +7 -0
  47. package/dist/bin/commands/security.js +193 -0
  48. package/dist/bin/commands/security.js.map +7 -0
  49. package/dist/bin/commands/staleness.js +144 -0
  50. package/dist/bin/commands/staleness.js.map +7 -0
  51. package/dist/bin/commands/status.js +102 -2
  52. package/dist/bin/commands/status.js.map +2 -2
  53. package/dist/bin/commands/supply-chain.js +138 -0
  54. package/dist/bin/commands/supply-chain.js.map +7 -0
  55. package/dist/bin/commands/uninit.js +109 -60
  56. package/dist/bin/commands/uninit.js.map +2 -2
  57. package/dist/bin/commands/vex.js +76 -0
  58. package/dist/bin/commands/vex.js.map +7 -0
  59. package/dist/bin/commands/vuln-suppress.js +95 -0
  60. package/dist/bin/commands/vuln-suppress.js.map +7 -0
  61. package/dist/bin/commands/vulns.js +382 -0
  62. package/dist/bin/commands/vulns.js.map +7 -0
  63. package/dist/bin/installer/auto-detect.js +125 -0
  64. package/dist/bin/installer/auto-detect.js.map +7 -0
  65. package/dist/bin/installer/cli-agent.js +28 -5
  66. package/dist/bin/installer/cli-agent.js.map +2 -2
  67. package/dist/bin/installer/common.js +47 -0
  68. package/dist/bin/installer/common.js.map +2 -2
  69. package/dist/bin/installer/config-prompt.js +12 -1
  70. package/dist/bin/installer/config-prompt.js.map +2 -2
  71. package/dist/bin/installer/detect.js +309 -0
  72. package/dist/bin/installer/detect.js.map +7 -0
  73. package/dist/bin/installer/index.js +9 -1
  74. package/dist/bin/installer/index.js.map +2 -2
  75. package/dist/bin/installer/instructions.js +195 -3
  76. package/dist/bin/installer/instructions.js.map +2 -2
  77. package/dist/bin/installer/steering.js +407 -0
  78. package/dist/bin/installer/steering.js.map +2 -2
  79. package/dist/bin/installer/targets/aider.js +3 -3
  80. package/dist/bin/installer/targets/aider.js.map +2 -2
  81. package/dist/bin/installer/targets/amp.js +3 -3
  82. package/dist/bin/installer/targets/amp.js.map +2 -2
  83. package/dist/bin/installer/targets/antigravity.js +35 -6
  84. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  85. package/dist/bin/installer/targets/augment.js +3 -3
  86. package/dist/bin/installer/targets/augment.js.map +2 -2
  87. package/dist/bin/installer/targets/claude.js +49 -5
  88. package/dist/bin/installer/targets/claude.js.map +2 -2
  89. package/dist/bin/installer/targets/cline.js +32 -6
  90. package/dist/bin/installer/targets/cline.js.map +2 -2
  91. package/dist/bin/installer/targets/codex.js +64 -12
  92. package/dist/bin/installer/targets/codex.js.map +2 -2
  93. package/dist/bin/installer/targets/continue.js +2 -2
  94. package/dist/bin/installer/targets/continue.js.map +2 -2
  95. package/dist/bin/installer/targets/copilot-cli.js +101 -0
  96. package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
  97. package/dist/bin/installer/targets/copilot.js +31 -5
  98. package/dist/bin/installer/targets/copilot.js.map +2 -2
  99. package/dist/bin/installer/targets/cursor.js +4 -4
  100. package/dist/bin/installer/targets/cursor.js.map +2 -2
  101. package/dist/bin/installer/targets/devin.js +2 -2
  102. package/dist/bin/installer/targets/devin.js.map +2 -2
  103. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  104. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  105. package/dist/bin/installer/targets/generic.js +2 -14
  106. package/dist/bin/installer/targets/generic.js.map +2 -2
  107. package/dist/bin/installer/targets/goose.js +3 -3
  108. package/dist/bin/installer/targets/goose.js.map +2 -2
  109. package/dist/bin/installer/targets/index.js +250 -0
  110. package/dist/bin/installer/targets/index.js.map +2 -2
  111. package/dist/bin/installer/targets/junie.js +2 -2
  112. package/dist/bin/installer/targets/junie.js.map +2 -2
  113. package/dist/bin/installer/targets/kilo.js +2 -2
  114. package/dist/bin/installer/targets/kilo.js.map +2 -2
  115. package/dist/bin/installer/targets/kiro.js +3 -3
  116. package/dist/bin/installer/targets/kiro.js.map +2 -2
  117. package/dist/bin/installer/targets/opencode.js +2 -2
  118. package/dist/bin/installer/targets/opencode.js.map +2 -2
  119. package/dist/bin/installer/targets/openhands.js +3 -3
  120. package/dist/bin/installer/targets/openhands.js.map +2 -2
  121. package/dist/bin/installer/targets/qoder.js +91 -0
  122. package/dist/bin/installer/targets/qoder.js.map +7 -0
  123. package/dist/bin/installer/targets/qwen.js +96 -0
  124. package/dist/bin/installer/targets/qwen.js.map +7 -0
  125. package/dist/bin/installer/targets/replit.js +3 -3
  126. package/dist/bin/installer/targets/replit.js.map +2 -2
  127. package/dist/bin/installer/targets/roo.js +2 -2
  128. package/dist/bin/installer/targets/roo.js.map +2 -2
  129. package/dist/bin/installer/targets/tabnine.js +3 -3
  130. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  131. package/dist/bin/installer/targets/trae.js +5 -5
  132. package/dist/bin/installer/targets/trae.js.map +2 -2
  133. package/dist/bin/installer/targets/warp.js +2 -2
  134. package/dist/bin/installer/targets/warp.js.map +2 -2
  135. package/dist/bin/installer/targets/windsurf.js +35 -6
  136. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  137. package/dist/bin/kirograph.js +72 -6
  138. package/dist/bin/kirograph.js.map +3 -3
  139. package/dist/compression/tracker.js +80 -0
  140. package/dist/compression/tracker.js.map +2 -2
  141. package/dist/config.js +90 -3
  142. package/dist/config.js.map +2 -2
  143. package/dist/core/pipeline.js +36 -2
  144. package/dist/core/pipeline.js.map +2 -2
  145. package/dist/db/database.js +56 -5
  146. package/dist/db/database.js.map +2 -2
  147. package/dist/db/memory-schema.sql +5 -1
  148. package/dist/db/schema.sql +3 -1
  149. package/dist/db/security-schema.sql +72 -0
  150. package/dist/extraction/extractor.js +81 -0
  151. package/dist/extraction/extractor.js.map +2 -2
  152. package/dist/extraction/grammars.js +32 -8
  153. package/dist/extraction/grammars.js.map +2 -2
  154. package/dist/extraction/languages.js +43 -1
  155. package/dist/extraction/languages.js.map +2 -2
  156. package/dist/extraction/notebook.js +300 -0
  157. package/dist/extraction/notebook.js.map +7 -0
  158. package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
  159. package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
  160. package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
  161. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  162. package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
  163. package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
  164. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  165. package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
  166. package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
  167. package/dist/frameworks/flutter.js +130 -0
  168. package/dist/frameworks/flutter.js.map +7 -0
  169. package/dist/frameworks/index.js +7 -1
  170. package/dist/frameworks/index.js.map +3 -3
  171. package/dist/graph/communities.js +317 -0
  172. package/dist/graph/communities.js.map +7 -0
  173. package/dist/graph/flows.js +138 -0
  174. package/dist/graph/flows.js.map +7 -0
  175. package/dist/graph/refactor.js +155 -0
  176. package/dist/graph/refactor.js.map +7 -0
  177. package/dist/index.js +1 -1
  178. package/dist/index.js.map +2 -2
  179. package/dist/mcp/cache.js +172 -0
  180. package/dist/mcp/cache.js.map +7 -0
  181. package/dist/mcp/read-modes.js +295 -0
  182. package/dist/mcp/read-modes.js.map +7 -0
  183. package/dist/mcp/server.js +2 -1
  184. package/dist/mcp/server.js.map +2 -2
  185. package/dist/mcp/tool-names.js +21 -1
  186. package/dist/mcp/tool-names.js.map +2 -2
  187. package/dist/mcp/tools.js +1160 -1
  188. package/dist/mcp/tools.js.map +3 -3
  189. package/dist/memory/database.js +32 -2
  190. package/dist/memory/database.js.map +2 -2
  191. package/dist/memory/types.js.map +1 -1
  192. package/dist/resolution/bridges/android-rn.js +298 -0
  193. package/dist/resolution/bridges/android-rn.js.map +7 -0
  194. package/dist/resolution/bridges/expo-modules.js +155 -0
  195. package/dist/resolution/bridges/expo-modules.js.map +7 -0
  196. package/dist/resolution/bridges/flutter-channel.js +385 -0
  197. package/dist/resolution/bridges/flutter-channel.js.map +7 -0
  198. package/dist/resolution/bridges/index.js +80 -0
  199. package/dist/resolution/bridges/index.js.map +7 -0
  200. package/dist/resolution/bridges/native-events.js +188 -0
  201. package/dist/resolution/bridges/native-events.js.map +7 -0
  202. package/dist/resolution/bridges/native-views.js +244 -0
  203. package/dist/resolution/bridges/native-views.js.map +7 -0
  204. package/dist/resolution/bridges/react-native.js +161 -0
  205. package/dist/resolution/bridges/react-native.js.map +7 -0
  206. package/dist/resolution/bridges/swift-objc.js +227 -0
  207. package/dist/resolution/bridges/swift-objc.js.map +7 -0
  208. package/dist/resolution/bridges/turbomodules.js +216 -0
  209. package/dist/resolution/bridges/turbomodules.js.map +7 -0
  210. package/dist/resolution/index.js +61 -2
  211. package/dist/resolution/index.js.map +2 -2
  212. package/dist/security/attack-surface.js +164 -0
  213. package/dist/security/attack-surface.js.map +7 -0
  214. package/dist/security/context-warnings.js +123 -0
  215. package/dist/security/context-warnings.js.map +7 -0
  216. package/dist/security/context-warnings.test.js +300 -0
  217. package/dist/security/context-warnings.test.js.map +7 -0
  218. package/dist/security/data-flows.js +228 -0
  219. package/dist/security/data-flows.js.map +7 -0
  220. package/dist/security/dep-confusion.js +255 -0
  221. package/dist/security/dep-confusion.js.map +7 -0
  222. package/dist/security/errors.js +51 -0
  223. package/dist/security/errors.js.map +7 -0
  224. package/dist/security/export/fix-suggestions.js +58 -0
  225. package/dist/security/export/fix-suggestions.js.map +7 -0
  226. package/dist/security/export/fix-suggestions.test.js +74 -0
  227. package/dist/security/export/fix-suggestions.test.js.map +7 -0
  228. package/dist/security/export/sbom.js +230 -0
  229. package/dist/security/export/sbom.js.map +7 -0
  230. package/dist/security/export/sbom.test.js +288 -0
  231. package/dist/security/export/sbom.test.js.map +7 -0
  232. package/dist/security/export/serialization.js +142 -0
  233. package/dist/security/export/serialization.js.map +7 -0
  234. package/dist/security/export/serialization.test.js +310 -0
  235. package/dist/security/export/serialization.test.js.map +7 -0
  236. package/dist/security/export/vex.js +220 -0
  237. package/dist/security/export/vex.js.map +7 -0
  238. package/dist/security/export/vex.test.js +278 -0
  239. package/dist/security/export/vex.test.js.map +7 -0
  240. package/dist/security/index.js +67 -0
  241. package/dist/security/index.js.map +7 -0
  242. package/dist/security/integrator-transitives.test.js +359 -0
  243. package/dist/security/integrator-transitives.test.js.map +7 -0
  244. package/dist/security/integrator.js +491 -0
  245. package/dist/security/integrator.js.map +7 -0
  246. package/dist/security/integrator.test.js +237 -0
  247. package/dist/security/integrator.test.js.map +7 -0
  248. package/dist/security/license.js +70 -0
  249. package/dist/security/license.js.map +7 -0
  250. package/dist/security/manifest/adapter.js +243 -0
  251. package/dist/security/manifest/adapter.js.map +7 -0
  252. package/dist/security/manifest/adapter.test.js +272 -0
  253. package/dist/security/manifest/adapter.test.js.map +7 -0
  254. package/dist/security/manifest/parser.js +376 -0
  255. package/dist/security/manifest/parser.js.map +7 -0
  256. package/dist/security/manifest/parser.test.js +110 -0
  257. package/dist/security/manifest/parser.test.js.map +7 -0
  258. package/dist/security/manifest/plugins/cargo.js +233 -0
  259. package/dist/security/manifest/plugins/cargo.js.map +7 -0
  260. package/dist/security/manifest/plugins/cargo.test.js +304 -0
  261. package/dist/security/manifest/plugins/cargo.test.js.map +7 -0
  262. package/dist/security/manifest/plugins/composer.js +152 -0
  263. package/dist/security/manifest/plugins/composer.js.map +7 -0
  264. package/dist/security/manifest/plugins/go.js +146 -0
  265. package/dist/security/manifest/plugins/go.js.map +7 -0
  266. package/dist/security/manifest/plugins/go.test.js +341 -0
  267. package/dist/security/manifest/plugins/go.test.js.map +7 -0
  268. package/dist/security/manifest/plugins/gradle.js +159 -0
  269. package/dist/security/manifest/plugins/gradle.js.map +7 -0
  270. package/dist/security/manifest/plugins/hex.js +159 -0
  271. package/dist/security/manifest/plugins/hex.js.map +7 -0
  272. package/dist/security/manifest/plugins/maven.js +128 -0
  273. package/dist/security/manifest/plugins/maven.js.map +7 -0
  274. package/dist/security/manifest/plugins/maven.test.js +389 -0
  275. package/dist/security/manifest/plugins/maven.test.js.map +7 -0
  276. package/dist/security/manifest/plugins/npm.js +284 -0
  277. package/dist/security/manifest/plugins/npm.js.map +7 -0
  278. package/dist/security/manifest/plugins/npm.test.js +298 -0
  279. package/dist/security/manifest/plugins/npm.test.js.map +7 -0
  280. package/dist/security/manifest/plugins/nuget.js +186 -0
  281. package/dist/security/manifest/plugins/nuget.js.map +7 -0
  282. package/dist/security/manifest/plugins/pip.js +123 -0
  283. package/dist/security/manifest/plugins/pip.js.map +7 -0
  284. package/dist/security/manifest/plugins/pip.test.js +208 -0
  285. package/dist/security/manifest/plugins/pip.test.js.map +7 -0
  286. package/dist/security/manifest/plugins/pubspec.js +212 -0
  287. package/dist/security/manifest/plugins/pubspec.js.map +7 -0
  288. package/dist/security/manifest/plugins/pyproject.js +261 -0
  289. package/dist/security/manifest/plugins/pyproject.js.map +7 -0
  290. package/dist/security/manifest/plugins/rubygems.js +185 -0
  291. package/dist/security/manifest/plugins/rubygems.js.map +7 -0
  292. package/dist/security/manifest/plugins/swift.js +200 -0
  293. package/dist/security/manifest/plugins/swift.js.map +7 -0
  294. package/dist/security/owasp.js +104 -0
  295. package/dist/security/owasp.js.map +7 -0
  296. package/dist/security/pipeline.js +125 -0
  297. package/dist/security/pipeline.js.map +7 -0
  298. package/dist/security/reachability.js +276 -0
  299. package/dist/security/reachability.js.map +7 -0
  300. package/dist/security/reachability.test.js +394 -0
  301. package/dist/security/reachability.test.js.map +7 -0
  302. package/dist/security/remediation.js +126 -0
  303. package/dist/security/remediation.js.map +7 -0
  304. package/dist/security/secrets.js +176 -0
  305. package/dist/security/secrets.js.map +7 -0
  306. package/dist/security/staleness.js +231 -0
  307. package/dist/security/staleness.js.map +7 -0
  308. package/dist/security/supply-chain.js +301 -0
  309. package/dist/security/supply-chain.js.map +7 -0
  310. package/dist/security/suppressions.js +106 -0
  311. package/dist/security/suppressions.js.map +7 -0
  312. package/dist/security/types.js +17 -0
  313. package/dist/security/types.js.map +7 -0
  314. package/dist/security/vuln/client.js +355 -0
  315. package/dist/security/vuln/client.js.map +7 -0
  316. package/dist/security/vuln/client.test.js +288 -0
  317. package/dist/security/vuln/client.test.js.map +7 -0
  318. package/dist/security/vuln/epss-client.js +95 -0
  319. package/dist/security/vuln/epss-client.js.map +7 -0
  320. package/dist/security/vuln/index.js +29 -0
  321. package/dist/security/vuln/index.js.map +7 -0
  322. package/dist/security/vuln/osv-adapter.js +321 -0
  323. package/dist/security/vuln/osv-adapter.js.map +7 -0
  324. package/dist/security/vuln/osv-adapter.test.js +391 -0
  325. package/dist/security/vuln/osv-adapter.test.js.map +7 -0
  326. package/dist/security/vuln/types.js +17 -0
  327. package/dist/security/vuln/types.js.map +7 -0
  328. package/dist/types.js.map +2 -2
  329. package/package.json +2 -1
@@ -0,0 +1,391 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_osv_adapter = require("./osv-adapter");
4
+ var import_errors = require("../errors");
5
+ (0, import_vitest.describe)("OsvAdapter", () => {
6
+ let adapter;
7
+ (0, import_vitest.beforeEach)(() => {
8
+ adapter = new import_osv_adapter.OsvAdapter({ apiUrl: "https://api.osv.dev/v1/query" });
9
+ import_vitest.vi.stubGlobal("fetch", import_vitest.vi.fn());
10
+ });
11
+ (0, import_vitest.afterEach)(() => {
12
+ import_vitest.vi.restoreAllMocks();
13
+ });
14
+ (0, import_vitest.it)('has name "OSV"', () => {
15
+ (0, import_vitest.expect)(adapter.name).toBe("OSV");
16
+ });
17
+ (0, import_vitest.it)("returns empty array for unsupported ecosystem", async () => {
18
+ const result = await adapter.query("unsupported", "pkg", "1.0.0");
19
+ (0, import_vitest.expect)(result).toEqual([]);
20
+ (0, import_vitest.expect)(fetch).not.toHaveBeenCalled();
21
+ });
22
+ (0, import_vitest.it)("maps npm ecosystem correctly and sends proper request", async () => {
23
+ const mockResponse = { vulns: [] };
24
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
25
+ new Response(JSON.stringify(mockResponse), { status: 200 })
26
+ );
27
+ await adapter.query("npm", "express", "4.18.2");
28
+ (0, import_vitest.expect)(fetch).toHaveBeenCalledWith(
29
+ "https://api.osv.dev/v1/query",
30
+ import_vitest.expect.objectContaining({
31
+ method: "POST",
32
+ headers: { "Content-Type": "application/json" },
33
+ body: JSON.stringify({
34
+ package: { name: "express", ecosystem: "npm" },
35
+ version: "4.18.2"
36
+ })
37
+ })
38
+ );
39
+ });
40
+ (0, import_vitest.it)("maps maven ecosystem to Maven", async () => {
41
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
42
+ new Response(JSON.stringify({ vulns: [] }), { status: 200 })
43
+ );
44
+ await adapter.query("maven", "log4j-core", "2.14.0");
45
+ (0, import_vitest.expect)(fetch).toHaveBeenCalledWith(
46
+ import_vitest.expect.any(String),
47
+ import_vitest.expect.objectContaining({
48
+ body: import_vitest.expect.stringContaining('"ecosystem":"Maven"')
49
+ })
50
+ );
51
+ });
52
+ (0, import_vitest.it)("maps go ecosystem to Go", async () => {
53
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
54
+ new Response(JSON.stringify({ vulns: [] }), { status: 200 })
55
+ );
56
+ await adapter.query("go", "github.com/gin-gonic/gin", "1.9.1");
57
+ (0, import_vitest.expect)(fetch).toHaveBeenCalledWith(
58
+ import_vitest.expect.any(String),
59
+ import_vitest.expect.objectContaining({
60
+ body: import_vitest.expect.stringContaining('"ecosystem":"Go"')
61
+ })
62
+ );
63
+ });
64
+ (0, import_vitest.it)("maps pypi ecosystem to PyPI", async () => {
65
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
66
+ new Response(JSON.stringify({ vulns: [] }), { status: 200 })
67
+ );
68
+ await adapter.query("pypi", "django", "4.2.0");
69
+ (0, import_vitest.expect)(fetch).toHaveBeenCalledWith(
70
+ import_vitest.expect.any(String),
71
+ import_vitest.expect.objectContaining({
72
+ body: import_vitest.expect.stringContaining('"ecosystem":"PyPI"')
73
+ })
74
+ );
75
+ });
76
+ (0, import_vitest.it)("maps cargo ecosystem to crates.io", async () => {
77
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
78
+ new Response(JSON.stringify({ vulns: [] }), { status: 200 })
79
+ );
80
+ await adapter.query("cargo", "serde", "1.0.188");
81
+ (0, import_vitest.expect)(fetch).toHaveBeenCalledWith(
82
+ import_vitest.expect.any(String),
83
+ import_vitest.expect.objectContaining({
84
+ body: import_vitest.expect.stringContaining('"ecosystem":"crates.io"')
85
+ })
86
+ );
87
+ });
88
+ (0, import_vitest.it)("returns empty array when no vulnerabilities found", async () => {
89
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
90
+ new Response(JSON.stringify({}), { status: 200 })
91
+ );
92
+ const result = await adapter.query("npm", "express", "4.18.2");
93
+ (0, import_vitest.expect)(result).toEqual([]);
94
+ });
95
+ (0, import_vitest.it)("parses CVE records from OSV response", async () => {
96
+ const osvResponse = {
97
+ vulns: [
98
+ {
99
+ id: "GHSA-xxxx-yyyy-zzzz",
100
+ aliases: ["CVE-2023-12345"],
101
+ summary: "A critical vulnerability in express",
102
+ severity: [{ type: "CVSS_V3", score: "9.8" }],
103
+ affected: [
104
+ {
105
+ package: { name: "express", ecosystem: "npm" },
106
+ ranges: [
107
+ {
108
+ type: "ECOSYSTEM",
109
+ events: [
110
+ { introduced: "4.0.0" },
111
+ { fixed: "4.18.3" }
112
+ ]
113
+ }
114
+ ]
115
+ }
116
+ ]
117
+ }
118
+ ]
119
+ };
120
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
121
+ new Response(JSON.stringify(osvResponse), { status: 200 })
122
+ );
123
+ const result = await adapter.query("npm", "express", "4.18.2");
124
+ (0, import_vitest.expect)(result).toHaveLength(1);
125
+ (0, import_vitest.expect)(result[0]).toEqual({
126
+ id: "CVE-2023-12345",
127
+ severity: 9.8,
128
+ affectedVersionRanges: [{ introduced: "4.0.0", fixed: "4.18.3" }],
129
+ fixedVersion: "4.18.3",
130
+ summary: "A critical vulnerability in express"
131
+ });
132
+ });
133
+ (0, import_vitest.it)("uses OSV ID when no CVE alias exists", async () => {
134
+ const osvResponse = {
135
+ vulns: [
136
+ {
137
+ id: "GHSA-abcd-efgh-ijkl",
138
+ aliases: ["PYSEC-2023-001"],
139
+ summary: "Some vulnerability",
140
+ severity: [{ type: "CVSS_V3", score: "7.5" }],
141
+ affected: [
142
+ {
143
+ ranges: [
144
+ {
145
+ type: "ECOSYSTEM",
146
+ events: [{ introduced: "1.0.0" }, { fixed: "1.2.0" }]
147
+ }
148
+ ]
149
+ }
150
+ ]
151
+ }
152
+ ]
153
+ };
154
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
155
+ new Response(JSON.stringify(osvResponse), { status: 200 })
156
+ );
157
+ const result = await adapter.query("npm", "some-pkg", "1.1.0");
158
+ (0, import_vitest.expect)(result).toHaveLength(1);
159
+ (0, import_vitest.expect)(result[0].id).toBe("GHSA-abcd-efgh-ijkl");
160
+ });
161
+ (0, import_vitest.it)("truncates summary to 500 characters", async () => {
162
+ const longSummary = "A".repeat(600);
163
+ const osvResponse = {
164
+ vulns: [
165
+ {
166
+ id: "GHSA-test-test-test",
167
+ aliases: ["CVE-2023-99999"],
168
+ summary: longSummary,
169
+ severity: [{ type: "CVSS_V3", score: "5.0" }],
170
+ affected: [
171
+ {
172
+ ranges: [
173
+ {
174
+ type: "ECOSYSTEM",
175
+ events: [{ introduced: "0" }]
176
+ }
177
+ ]
178
+ }
179
+ ]
180
+ }
181
+ ]
182
+ };
183
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
184
+ new Response(JSON.stringify(osvResponse), { status: 200 })
185
+ );
186
+ const result = await adapter.query("npm", "pkg", "1.0.0");
187
+ (0, import_vitest.expect)(result[0].summary.length).toBe(500);
188
+ (0, import_vitest.expect)(result[0].summary.endsWith("...")).toBe(true);
189
+ });
190
+ (0, import_vitest.it)("returns severity 0 when no severity data available", async () => {
191
+ const osvResponse = {
192
+ vulns: [
193
+ {
194
+ id: "GHSA-no-severity",
195
+ aliases: ["CVE-2023-00001"],
196
+ summary: "No severity info",
197
+ affected: [
198
+ {
199
+ ranges: [
200
+ {
201
+ type: "ECOSYSTEM",
202
+ events: [{ introduced: "0" }]
203
+ }
204
+ ]
205
+ }
206
+ ]
207
+ }
208
+ ]
209
+ };
210
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
211
+ new Response(JSON.stringify(osvResponse), { status: 200 })
212
+ );
213
+ const result = await adapter.query("npm", "pkg", "1.0.0");
214
+ (0, import_vitest.expect)(result[0].severity).toBe(0);
215
+ });
216
+ (0, import_vitest.it)("extracts multiple affected ranges", async () => {
217
+ const osvResponse = {
218
+ vulns: [
219
+ {
220
+ id: "GHSA-multi-range",
221
+ aliases: ["CVE-2023-55555"],
222
+ summary: "Multiple ranges",
223
+ severity: [{ type: "CVSS_V3", score: "8.0" }],
224
+ affected: [
225
+ {
226
+ ranges: [
227
+ {
228
+ type: "ECOSYSTEM",
229
+ events: [
230
+ { introduced: "1.0.0" },
231
+ { fixed: "1.5.0" }
232
+ ]
233
+ },
234
+ {
235
+ type: "ECOSYSTEM",
236
+ events: [
237
+ { introduced: "2.0.0" },
238
+ { fixed: "2.1.0" }
239
+ ]
240
+ }
241
+ ]
242
+ }
243
+ ]
244
+ }
245
+ ]
246
+ };
247
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
248
+ new Response(JSON.stringify(osvResponse), { status: 200 })
249
+ );
250
+ const result = await adapter.query("npm", "pkg", "2.0.1");
251
+ (0, import_vitest.expect)(result[0].affectedVersionRanges).toHaveLength(2);
252
+ (0, import_vitest.expect)(result[0].affectedVersionRanges[0]).toEqual({
253
+ introduced: "1.0.0",
254
+ fixed: "1.5.0"
255
+ });
256
+ (0, import_vitest.expect)(result[0].affectedVersionRanges[1]).toEqual({
257
+ introduced: "2.0.0",
258
+ fixed: "2.1.0"
259
+ });
260
+ (0, import_vitest.expect)(result[0].fixedVersion).toBe("1.5.0");
261
+ });
262
+ (0, import_vitest.it)("handles last_affected in version ranges", async () => {
263
+ const osvResponse = {
264
+ vulns: [
265
+ {
266
+ id: "GHSA-last-affected",
267
+ aliases: ["CVE-2023-77777"],
268
+ summary: "Last affected test",
269
+ severity: [{ type: "CVSS_V3", score: "6.0" }],
270
+ affected: [
271
+ {
272
+ ranges: [
273
+ {
274
+ type: "ECOSYSTEM",
275
+ events: [
276
+ { introduced: "1.0.0" },
277
+ { last_affected: "1.9.9" }
278
+ ]
279
+ }
280
+ ]
281
+ }
282
+ ]
283
+ }
284
+ ]
285
+ };
286
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
287
+ new Response(JSON.stringify(osvResponse), { status: 200 })
288
+ );
289
+ const result = await adapter.query("npm", "pkg", "1.5.0");
290
+ (0, import_vitest.expect)(result[0].affectedVersionRanges[0]).toEqual({
291
+ introduced: "1.0.0",
292
+ lastAffected: "1.9.9"
293
+ });
294
+ (0, import_vitest.expect)(result[0].fixedVersion).toBeUndefined();
295
+ });
296
+ (0, import_vitest.it)("throws VulnDatabaseError on HTTP error response", async () => {
297
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
298
+ new Response("Internal Server Error", { status: 500, statusText: "Internal Server Error" })
299
+ );
300
+ await (0, import_vitest.expect)(adapter.query("npm", "express", "4.18.2")).rejects.toThrow(import_errors.VulnDatabaseError);
301
+ await (0, import_vitest.expect)(adapter.query("npm", "express", "4.18.2")).rejects.toThrow(/HTTP 500/);
302
+ });
303
+ (0, import_vitest.it)("throws VulnDatabaseError on network error", async () => {
304
+ import_vitest.vi.mocked(fetch).mockRejectedValue(new TypeError("fetch failed"));
305
+ await (0, import_vitest.expect)(adapter.query("npm", "express", "4.18.2")).rejects.toThrow(import_errors.VulnDatabaseError);
306
+ await (0, import_vitest.expect)(adapter.query("npm", "express", "4.18.2")).rejects.toThrow(/Network error/);
307
+ });
308
+ (0, import_vitest.it)("throws VulnDatabaseError on abort/timeout", async () => {
309
+ const abortError = new Error("The operation was aborted");
310
+ abortError.name = "AbortError";
311
+ import_vitest.vi.mocked(fetch).mockRejectedValue(abortError);
312
+ await (0, import_vitest.expect)(adapter.query("npm", "express", "4.18.2")).rejects.toThrow(import_errors.VulnDatabaseError);
313
+ });
314
+ (0, import_vitest.it)("respects external abort signal", async () => {
315
+ const controller = new AbortController();
316
+ controller.abort();
317
+ const abortError = new Error("The operation was aborted");
318
+ abortError.name = "AbortError";
319
+ import_vitest.vi.mocked(fetch).mockRejectedValue(abortError);
320
+ await (0, import_vitest.expect)(
321
+ adapter.query("npm", "express", "4.18.2", controller.signal)
322
+ ).rejects.toThrow(import_errors.VulnDatabaseError);
323
+ });
324
+ (0, import_vitest.it)("uses details as fallback when summary is missing", async () => {
325
+ const osvResponse = {
326
+ vulns: [
327
+ {
328
+ id: "GHSA-details-only",
329
+ aliases: ["CVE-2023-88888"],
330
+ details: "Detailed description of the vulnerability",
331
+ severity: [{ type: "CVSS_V3", score: "4.0" }],
332
+ affected: [
333
+ {
334
+ ranges: [
335
+ {
336
+ type: "ECOSYSTEM",
337
+ events: [{ introduced: "0" }]
338
+ }
339
+ ]
340
+ }
341
+ ]
342
+ }
343
+ ]
344
+ };
345
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
346
+ new Response(JSON.stringify(osvResponse), { status: 200 })
347
+ );
348
+ const result = await adapter.query("npm", "pkg", "1.0.0");
349
+ (0, import_vitest.expect)(result[0].summary).toBe("Detailed description of the vulnerability");
350
+ });
351
+ (0, import_vitest.it)("handles case-insensitive ecosystem mapping", async () => {
352
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
353
+ new Response(JSON.stringify({ vulns: [] }), { status: 200 })
354
+ );
355
+ await adapter.query("NPM", "express", "4.18.2");
356
+ (0, import_vitest.expect)(fetch).toHaveBeenCalledWith(
357
+ import_vitest.expect.any(String),
358
+ import_vitest.expect.objectContaining({
359
+ body: import_vitest.expect.stringContaining('"ecosystem":"npm"')
360
+ })
361
+ );
362
+ });
363
+ (0, import_vitest.it)("skips vulnerabilities without any identifiable ID", async () => {
364
+ const osvResponse = {
365
+ vulns: [
366
+ {
367
+ id: "CVE-2023-11111",
368
+ summary: "Has CVE directly as ID",
369
+ severity: [{ type: "CVSS_V3", score: "7.0" }],
370
+ affected: [
371
+ {
372
+ ranges: [
373
+ {
374
+ type: "ECOSYSTEM",
375
+ events: [{ introduced: "0" }]
376
+ }
377
+ ]
378
+ }
379
+ ]
380
+ }
381
+ ]
382
+ };
383
+ import_vitest.vi.mocked(fetch).mockResolvedValue(
384
+ new Response(JSON.stringify(osvResponse), { status: 200 })
385
+ );
386
+ const result = await adapter.query("npm", "pkg", "1.0.0");
387
+ (0, import_vitest.expect)(result).toHaveLength(1);
388
+ (0, import_vitest.expect)(result[0].id).toBe("CVE-2023-11111");
389
+ });
390
+ });
391
+ //# sourceMappingURL=osv-adapter.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/security/vuln/osv-adapter.test.ts"],
4
+ "sourcesContent": ["/**\n * Unit tests for the OSV API adapter.\n */\n\nimport { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';\nimport { OsvAdapter } from './osv-adapter';\nimport { VulnDatabaseError } from '../errors';\n\ndescribe('OsvAdapter', () => {\n let adapter: OsvAdapter;\n\n beforeEach(() => {\n adapter = new OsvAdapter({ apiUrl: 'https://api.osv.dev/v1/query' });\n vi.stubGlobal('fetch', vi.fn());\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n it('has name \"OSV\"', () => {\n expect(adapter.name).toBe('OSV');\n });\n\n it('returns empty array for unsupported ecosystem', async () => {\n const result = await adapter.query('unsupported', 'pkg', '1.0.0');\n expect(result).toEqual([]);\n expect(fetch).not.toHaveBeenCalled();\n });\n\n it('maps npm ecosystem correctly and sends proper request', async () => {\n const mockResponse = { vulns: [] };\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(mockResponse), { status: 200 }),\n );\n\n await adapter.query('npm', 'express', '4.18.2');\n\n expect(fetch).toHaveBeenCalledWith(\n 'https://api.osv.dev/v1/query',\n expect.objectContaining({\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n package: { name: 'express', ecosystem: 'npm' },\n version: '4.18.2',\n }),\n }),\n );\n });\n\n it('maps maven ecosystem to Maven', async () => {\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify({ vulns: [] }), { status: 200 }),\n );\n\n await adapter.query('maven', 'log4j-core', '2.14.0');\n\n expect(fetch).toHaveBeenCalledWith(\n expect.any(String),\n expect.objectContaining({\n body: expect.stringContaining('\"ecosystem\":\"Maven\"'),\n }),\n );\n });\n\n it('maps go ecosystem to Go', async () => {\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify({ vulns: [] }), { status: 200 }),\n );\n\n await adapter.query('go', 'github.com/gin-gonic/gin', '1.9.1');\n\n expect(fetch).toHaveBeenCalledWith(\n expect.any(String),\n expect.objectContaining({\n body: expect.stringContaining('\"ecosystem\":\"Go\"'),\n }),\n );\n });\n\n it('maps pypi ecosystem to PyPI', async () => {\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify({ vulns: [] }), { status: 200 }),\n );\n\n await adapter.query('pypi', 'django', '4.2.0');\n\n expect(fetch).toHaveBeenCalledWith(\n expect.any(String),\n expect.objectContaining({\n body: expect.stringContaining('\"ecosystem\":\"PyPI\"'),\n }),\n );\n });\n\n it('maps cargo ecosystem to crates.io', async () => {\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify({ vulns: [] }), { status: 200 }),\n );\n\n await adapter.query('cargo', 'serde', '1.0.188');\n\n expect(fetch).toHaveBeenCalledWith(\n expect.any(String),\n expect.objectContaining({\n body: expect.stringContaining('\"ecosystem\":\"crates.io\"'),\n }),\n );\n });\n\n it('returns empty array when no vulnerabilities found', async () => {\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify({}), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'express', '4.18.2');\n expect(result).toEqual([]);\n });\n\n it('parses CVE records from OSV response', async () => {\n const osvResponse = {\n vulns: [\n {\n id: 'GHSA-xxxx-yyyy-zzzz',\n aliases: ['CVE-2023-12345'],\n summary: 'A critical vulnerability in express',\n severity: [{ type: 'CVSS_V3', score: '9.8' }],\n affected: [\n {\n package: { name: 'express', ecosystem: 'npm' },\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [\n { introduced: '4.0.0' },\n { fixed: '4.18.3' },\n ],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'express', '4.18.2');\n\n expect(result).toHaveLength(1);\n expect(result[0]).toEqual({\n id: 'CVE-2023-12345',\n severity: 9.8,\n affectedVersionRanges: [{ introduced: '4.0.0', fixed: '4.18.3' }],\n fixedVersion: '4.18.3',\n summary: 'A critical vulnerability in express',\n });\n });\n\n it('uses OSV ID when no CVE alias exists', async () => {\n const osvResponse = {\n vulns: [\n {\n id: 'GHSA-abcd-efgh-ijkl',\n aliases: ['PYSEC-2023-001'],\n summary: 'Some vulnerability',\n severity: [{ type: 'CVSS_V3', score: '7.5' }],\n affected: [\n {\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [{ introduced: '1.0.0' }, { fixed: '1.2.0' }],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'some-pkg', '1.1.0');\n\n expect(result).toHaveLength(1);\n expect(result[0].id).toBe('GHSA-abcd-efgh-ijkl');\n });\n\n it('truncates summary to 500 characters', async () => {\n const longSummary = 'A'.repeat(600);\n const osvResponse = {\n vulns: [\n {\n id: 'GHSA-test-test-test',\n aliases: ['CVE-2023-99999'],\n summary: longSummary,\n severity: [{ type: 'CVSS_V3', score: '5.0' }],\n affected: [\n {\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [{ introduced: '0' }],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'pkg', '1.0.0');\n\n expect(result[0].summary.length).toBe(500);\n expect(result[0].summary.endsWith('...')).toBe(true);\n });\n\n it('returns severity 0 when no severity data available', async () => {\n const osvResponse = {\n vulns: [\n {\n id: 'GHSA-no-severity',\n aliases: ['CVE-2023-00001'],\n summary: 'No severity info',\n affected: [\n {\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [{ introduced: '0' }],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'pkg', '1.0.0');\n\n expect(result[0].severity).toBe(0);\n });\n\n it('extracts multiple affected ranges', async () => {\n const osvResponse = {\n vulns: [\n {\n id: 'GHSA-multi-range',\n aliases: ['CVE-2023-55555'],\n summary: 'Multiple ranges',\n severity: [{ type: 'CVSS_V3', score: '8.0' }],\n affected: [\n {\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [\n { introduced: '1.0.0' },\n { fixed: '1.5.0' },\n ],\n },\n {\n type: 'ECOSYSTEM',\n events: [\n { introduced: '2.0.0' },\n { fixed: '2.1.0' },\n ],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'pkg', '2.0.1');\n\n expect(result[0].affectedVersionRanges).toHaveLength(2);\n expect(result[0].affectedVersionRanges[0]).toEqual({\n introduced: '1.0.0',\n fixed: '1.5.0',\n });\n expect(result[0].affectedVersionRanges[1]).toEqual({\n introduced: '2.0.0',\n fixed: '2.1.0',\n });\n expect(result[0].fixedVersion).toBe('1.5.0');\n });\n\n it('handles last_affected in version ranges', async () => {\n const osvResponse = {\n vulns: [\n {\n id: 'GHSA-last-affected',\n aliases: ['CVE-2023-77777'],\n summary: 'Last affected test',\n severity: [{ type: 'CVSS_V3', score: '6.0' }],\n affected: [\n {\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [\n { introduced: '1.0.0' },\n { last_affected: '1.9.9' },\n ],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'pkg', '1.5.0');\n\n expect(result[0].affectedVersionRanges[0]).toEqual({\n introduced: '1.0.0',\n lastAffected: '1.9.9',\n });\n expect(result[0].fixedVersion).toBeUndefined();\n });\n\n it('throws VulnDatabaseError on HTTP error response', async () => {\n vi.mocked(fetch).mockResolvedValue(\n new Response('Internal Server Error', { status: 500, statusText: 'Internal Server Error' }),\n );\n\n await expect(adapter.query('npm', 'express', '4.18.2')).rejects.toThrow(VulnDatabaseError);\n await expect(adapter.query('npm', 'express', '4.18.2')).rejects.toThrow(/HTTP 500/);\n });\n\n it('throws VulnDatabaseError on network error', async () => {\n vi.mocked(fetch).mockRejectedValue(new TypeError('fetch failed'));\n\n await expect(adapter.query('npm', 'express', '4.18.2')).rejects.toThrow(VulnDatabaseError);\n await expect(adapter.query('npm', 'express', '4.18.2')).rejects.toThrow(/Network error/);\n });\n\n it('throws VulnDatabaseError on abort/timeout', async () => {\n const abortError = new Error('The operation was aborted');\n abortError.name = 'AbortError';\n vi.mocked(fetch).mockRejectedValue(abortError);\n\n await expect(adapter.query('npm', 'express', '4.18.2')).rejects.toThrow(VulnDatabaseError);\n });\n\n it('respects external abort signal', async () => {\n const controller = new AbortController();\n controller.abort();\n\n const abortError = new Error('The operation was aborted');\n abortError.name = 'AbortError';\n vi.mocked(fetch).mockRejectedValue(abortError);\n\n await expect(\n adapter.query('npm', 'express', '4.18.2', controller.signal),\n ).rejects.toThrow(VulnDatabaseError);\n });\n\n it('uses details as fallback when summary is missing', async () => {\n const osvResponse = {\n vulns: [\n {\n id: 'GHSA-details-only',\n aliases: ['CVE-2023-88888'],\n details: 'Detailed description of the vulnerability',\n severity: [{ type: 'CVSS_V3', score: '4.0' }],\n affected: [\n {\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [{ introduced: '0' }],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'pkg', '1.0.0');\n\n expect(result[0].summary).toBe('Detailed description of the vulnerability');\n });\n\n it('handles case-insensitive ecosystem mapping', async () => {\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify({ vulns: [] }), { status: 200 }),\n );\n\n await adapter.query('NPM', 'express', '4.18.2');\n\n expect(fetch).toHaveBeenCalledWith(\n expect.any(String),\n expect.objectContaining({\n body: expect.stringContaining('\"ecosystem\":\"npm\"'),\n }),\n );\n });\n\n it('skips vulnerabilities without any identifiable ID', async () => {\n const osvResponse = {\n vulns: [\n {\n id: 'CVE-2023-11111',\n summary: 'Has CVE directly as ID',\n severity: [{ type: 'CVSS_V3', score: '7.0' }],\n affected: [\n {\n ranges: [\n {\n type: 'ECOSYSTEM',\n events: [{ introduced: '0' }],\n },\n ],\n },\n ],\n },\n ],\n };\n\n vi.mocked(fetch).mockResolvedValue(\n new Response(JSON.stringify(osvResponse), { status: 200 }),\n );\n\n const result = await adapter.query('npm', 'pkg', '1.0.0');\n\n expect(result).toHaveLength(1);\n expect(result[0].id).toBe('CVE-2023-11111');\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var types_exports = {};
16
+ module.exports = __toCommonJS(types_exports);
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/security/vuln/types.ts"],
4
+ "sourcesContent": ["/**\n * Shared types for the vulnerability database subsystem.\n */\n\nimport type { CVERecord } from '../types';\n\n/** A single entry in a batch vulnerability query. */\nexport interface BatchQuery {\n ecosystem: string;\n packageName: string;\n version: string;\n}\n\n/**\n * Adapter interface for querying a vulnerability database.\n * Each supported database (OSV, NVD, etc.) implements this interface.\n */\nexport interface VulnDatabaseAdapter {\n /** Human-readable name of the database (e.g. \"OSV\") */\n name: string;\n\n /**\n * Query for vulnerabilities affecting a specific package version.\n */\n query(\n ecosystem: string,\n packageName: string,\n version: string,\n signal?: AbortSignal,\n ): Promise<CVERecord[]>;\n\n /**\n * Batch query \u2014 results[i] corresponds to queries[i].\n * Implementing this is optional but strongly recommended for performance:\n * a single HTTP request replaces N sequential requests.\n */\n queryBatch?(\n queries: BatchQuery[],\n signal?: AbortSignal,\n ): Promise<Array<CVERecord[]>>;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
+ "names": []
7
+ }
package/dist/types.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/types.ts"],
4
- "sourcesContent": ["/**\n * KiroGraph Type Definitions\n */\n\nexport type NodeKind =\n | 'file' | 'module' | 'class' | 'struct' | 'interface' | 'trait' | 'protocol'\n | 'function' | 'method' | 'property' | 'field' | 'variable' | 'constant'\n | 'enum' | 'enum_member' | 'type_alias' | 'namespace' | 'parameter'\n | 'import' | 'export' | 'route' | 'component';\n\nexport type EdgeKind =\n | 'contains' | 'calls' | 'imports' | 'exports' | 'extends' | 'implements'\n | 'references' | 'type_of' | 'returns' | 'instantiates' | 'overrides' | 'decorates';\n\nexport type Language =\n | 'typescript' | 'javascript' | 'tsx' | 'jsx' | 'python' | 'go' | 'rust'\n | 'java' | 'c' | 'cpp' | 'csharp' | 'php' | 'ruby' | 'swift' | 'kotlin'\n | 'dart' | 'svelte' | 'pascal' | 'liquid' | 'elixir'\n | 'scala' | 'lua' | 'zig' | 'bash' | 'ocaml' | 'elm' | 'solidity' | 'vue' | 'objc'\n | 'yaml' | 'hcl' | 'css' | 'scss' | 'html'\n | 'unknown';\n\nexport interface Node {\n id: string;\n kind: NodeKind;\n name: string;\n qualifiedName: string;\n filePath: string;\n language: Language;\n startLine: number;\n endLine: number;\n startColumn: number;\n endColumn: number;\n docstring?: string;\n signature?: string;\n visibility?: 'public' | 'private' | 'protected' | 'internal';\n isExported?: boolean;\n isAsync?: boolean;\n isStatic?: boolean;\n isAbstract?: boolean;\n decorators?: string[];\n typeParameters?: string[];\n updatedAt: number;\n}\n\nexport interface Edge {\n source: string;\n target: string;\n kind: EdgeKind;\n metadata?: Record<string, unknown>;\n line?: number;\n column?: number;\n}\n\nexport interface FileRecord {\n path: string;\n contentHash: string;\n language: Language;\n fileSize: number;\n symbolCount: number;\n indexedAt: number;\n}\n\nexport interface SearchResult {\n node: Node;\n score: number;\n matchType: 'exact' | 'prefix' | 'fuzzy' | 'semantic';\n}\n\nexport interface SearchOptions {\n kinds?: NodeKind[];\n languages?: Language[];\n limit?: number;\n minScore?: number;\n}\n\nexport interface Subgraph {\n nodes: Node[];\n edges: Edge[];\n entryPoints: string[];\n}\n\nexport interface NodeContext {\n node: Node;\n ancestors: Node[];\n children: Node[];\n callers: Node[];\n callees: Node[];\n}\n\nexport interface NodeMetrics {\n incomingEdgeCount: number;\n outgoingEdgeCount: number;\n callCount: number;\n callerCount: number;\n childCount: number;\n}\n\nexport interface GraphStats {\n files: number;\n nodes: number;\n edges: number;\n nodesByKind: Record<string, number>;\n filesByLanguage: Record<string, number>;\n dbSizeBytes: number;\n embeddingCount: number;\n embeddableNodeCount: number;\n embeddingsEnabled: boolean;\n embeddingModel: string;\n useVecIndex: boolean;\n semanticEngine: 'cosine' | 'sqlite-vec' | 'orama' | 'pglite' | 'lancedb' | 'qdrant' | 'typesense';\n vecIndexCount: number;\n engineFallback: string | null;\n frameworks: string[];\n architectureEnabled: boolean;\n architectureStats?: { packages: number; layers: number; packageDeps: number };\n}\n\nexport interface TaskContext {\n task: string;\n entryPoints: Node[];\n relatedNodes: Node[];\n edges: Edge[];\n codeSnippets: Map<string, string>;\n summary: string;\n}\n\nexport interface IndexProgress {\n phase: 'scanning' | 'parsing' | 'storing' | 'resolving' | 'detecting frameworks' | 'embeddings' | 'architecture' | 'docs' | 'data' | 'retrying';\n current: number;\n total: number;\n currentFile?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface IndexResult {\n success: boolean;\n filesIndexed: number;\n nodesCreated: number;\n edgesCreated: number;\n errors: string[];\n duration: number;\n}\n\nexport interface SyncResult {\n added: string[];\n modified: string[];\n removed: string[];\n nodesCreated: number;\n nodesUpdated: number;\n nodesRemoved: number;\n edgesCreated: number;\n edgesRemoved: number;\n filesScanned: number;\n errors: string[];\n duration: number;\n}\n\n// \u2500\u2500 Error Classes (re-exported from src/errors.ts for backward compatibility) \u2500\u2500\n\nexport {\n KiroGraphError,\n FileError,\n ParseError,\n DatabaseError,\n ConfigError,\n} from './errors';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgKA,oBAMO;",
4
+ "sourcesContent": ["/**\n * KiroGraph Type Definitions\n */\n\nexport type NodeKind =\n | 'file' | 'module' | 'class' | 'struct' | 'interface' | 'trait' | 'protocol'\n | 'function' | 'method' | 'property' | 'field' | 'variable' | 'constant'\n | 'enum' | 'enum_member' | 'type_alias' | 'namespace' | 'parameter'\n | 'import' | 'export' | 'route' | 'component'\n | 'dependency' | 'vulnerability';\n\nexport type EdgeKind =\n | 'contains' | 'calls' | 'imports' | 'exports' | 'extends' | 'implements'\n | 'references' | 'type_of' | 'returns' | 'instantiates' | 'overrides' | 'decorates'\n | 'has_vulnerability' | 'depends_on' | 'declared_in';\n\nexport type Language =\n | 'typescript' | 'javascript' | 'tsx' | 'jsx' | 'python' | 'go' | 'rust'\n | 'java' | 'c' | 'cpp' | 'csharp' | 'php' | 'ruby' | 'swift' | 'kotlin'\n | 'dart' | 'svelte' | 'pascal' | 'liquid' | 'elixir'\n | 'scala' | 'lua' | 'zig' | 'bash' | 'ocaml' | 'elm' | 'solidity' | 'vue' | 'objc'\n | 'yaml' | 'hcl' | 'css' | 'scss' | 'html'\n | 'jupyter'\n | 'rescript' | 'sql' | 'r' | 'julia' | 'powershell' | 'perl' | 'astro' | 'gdscript' | 'nix' | 'verilog'\n | 'unknown';\n\nexport interface Node {\n id: string;\n kind: NodeKind;\n name: string;\n qualifiedName: string;\n filePath: string;\n language: Language;\n startLine: number;\n endLine: number;\n startColumn: number;\n endColumn: number;\n docstring?: string;\n signature?: string;\n visibility?: 'public' | 'private' | 'protected' | 'internal';\n isExported?: boolean;\n isAsync?: boolean;\n isStatic?: boolean;\n isAbstract?: boolean;\n decorators?: string[];\n typeParameters?: string[];\n updatedAt: number;\n}\n\nexport interface Edge {\n source: string;\n target: string;\n kind: EdgeKind;\n metadata?: Record<string, unknown>;\n line?: number;\n column?: number;\n confidence?: 'extracted' | 'inferred' | 'ambiguous';\n confidenceScore?: number;\n}\n\nexport interface FileRecord {\n path: string;\n contentHash: string;\n language: Language;\n fileSize: number;\n symbolCount: number;\n indexedAt: number;\n}\n\nexport interface SearchResult {\n node: Node;\n score: number;\n matchType: 'exact' | 'prefix' | 'fuzzy' | 'semantic';\n}\n\nexport interface SearchOptions {\n kinds?: NodeKind[];\n languages?: Language[];\n limit?: number;\n minScore?: number;\n}\n\nexport interface Subgraph {\n nodes: Node[];\n edges: Edge[];\n entryPoints: string[];\n}\n\nexport interface NodeContext {\n node: Node;\n ancestors: Node[];\n children: Node[];\n callers: Node[];\n callees: Node[];\n}\n\nexport interface NodeMetrics {\n incomingEdgeCount: number;\n outgoingEdgeCount: number;\n callCount: number;\n callerCount: number;\n childCount: number;\n}\n\nexport interface GraphStats {\n files: number;\n nodes: number;\n edges: number;\n nodesByKind: Record<string, number>;\n filesByLanguage: Record<string, number>;\n dbSizeBytes: number;\n embeddingCount: number;\n embeddableNodeCount: number;\n embeddingsEnabled: boolean;\n embeddingModel: string;\n useVecIndex: boolean;\n semanticEngine: 'cosine' | 'sqlite-vec' | 'orama' | 'pglite' | 'lancedb' | 'qdrant' | 'typesense';\n vecIndexCount: number;\n engineFallback: string | null;\n frameworks: string[];\n architectureEnabled: boolean;\n architectureStats?: { packages: number; layers: number; packageDeps: number };\n}\n\nexport interface TaskContext {\n task: string;\n entryPoints: Node[];\n relatedNodes: Node[];\n edges: Edge[];\n codeSnippets: Map<string, string>;\n summary: string;\n}\n\nexport interface IndexProgress {\n phase: 'scanning' | 'parsing' | 'storing' | 'resolving' | 'detecting frameworks' | 'embeddings' | 'architecture' | 'security' | 'docs' | 'data' | 'retrying';\n current: number;\n total: number;\n currentFile?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface IndexResult {\n success: boolean;\n filesIndexed: number;\n nodesCreated: number;\n edgesCreated: number;\n errors: string[];\n duration: number;\n}\n\nexport interface SyncResult {\n added: string[];\n modified: string[];\n removed: string[];\n nodesCreated: number;\n nodesUpdated: number;\n nodesRemoved: number;\n edgesCreated: number;\n edgesRemoved: number;\n filesScanned: number;\n errors: string[];\n duration: number;\n}\n\n// \u2500\u2500 Error Classes (re-exported from src/errors.ts for backward compatibility) \u2500\u2500\n\nexport {\n KiroGraphError,\n FileError,\n ParseError,\n DatabaseError,\n ConfigError,\n} from './errors';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsKA,oBAMO;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kirograph",
3
- "version": "0.17.0",
3
+ "version": "0.19.0",
4
4
  "description": "Semantic code knowledge graph for Kiro: fewer tool calls, instant symbol lookups, 100% local.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,6 +18,7 @@
18
18
  "typecheck": "tsc --noEmit",
19
19
  "test": "vitest --run",
20
20
  "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
21
+ "release": "./scripts/release.sh",
21
22
  "docs": "npx serve docs"
22
23
  },
23
24
  "keywords": [