kirograph 0.17.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 (815) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +105 -1822
  3. package/dist/architecture/layers/dart.d.ts +10 -0
  4. package/dist/architecture/layers/dart.d.ts.map +1 -0
  5. package/dist/architecture/layers/dart.js +112 -0
  6. package/dist/architecture/layers/dart.js.map +7 -0
  7. package/dist/architecture/layers/elixir.d.ts +6 -0
  8. package/dist/architecture/layers/elixir.d.ts.map +1 -0
  9. package/dist/architecture/layers/index.d.ts.map +1 -1
  10. package/dist/architecture/layers/index.js +3 -1
  11. package/dist/architecture/layers/index.js.map +2 -2
  12. package/dist/architecture/layers/ocaml.d.ts +6 -0
  13. package/dist/architecture/layers/ocaml.d.ts.map +1 -0
  14. package/dist/architecture/layers/scala.d.ts +6 -0
  15. package/dist/architecture/layers/scala.d.ts.map +1 -0
  16. package/dist/architecture/layers/solidity.d.ts +6 -0
  17. package/dist/architecture/layers/solidity.d.ts.map +1 -0
  18. package/dist/architecture/layers/vue.d.ts +6 -0
  19. package/dist/architecture/layers/vue.d.ts.map +1 -0
  20. package/dist/architecture/manifest/elm.d.ts +3 -0
  21. package/dist/architecture/manifest/elm.d.ts.map +1 -0
  22. package/dist/architecture/manifest/index.d.ts.map +1 -1
  23. package/dist/architecture/manifest/ocaml.d.ts +3 -0
  24. package/dist/architecture/manifest/ocaml.d.ts.map +1 -0
  25. package/dist/architecture/manifest/scala.d.ts +3 -0
  26. package/dist/architecture/manifest/scala.d.ts.map +1 -0
  27. package/dist/bin/banner.d.ts.map +1 -1
  28. package/dist/bin/banner.js +74 -6
  29. package/dist/bin/banner.js.map +2 -2
  30. package/dist/bin/commands/affected.d.ts.map +1 -1
  31. package/dist/bin/commands/attack-surface.d.ts +3 -0
  32. package/dist/bin/commands/attack-surface.d.ts.map +1 -0
  33. package/dist/bin/commands/attack-surface.js +164 -0
  34. package/dist/bin/commands/attack-surface.js.map +7 -0
  35. package/dist/bin/commands/benchmark.d.ts +9 -0
  36. package/dist/bin/commands/benchmark.d.ts.map +1 -0
  37. package/dist/bin/commands/benchmark.js +206 -0
  38. package/dist/bin/commands/benchmark.js.map +7 -0
  39. package/dist/bin/commands/budget.d.ts +6 -0
  40. package/dist/bin/commands/budget.d.ts.map +1 -0
  41. package/dist/bin/commands/budget.js +70 -0
  42. package/dist/bin/commands/budget.js.map +7 -0
  43. package/dist/bin/commands/caveman.d.ts +7 -0
  44. package/dist/bin/commands/caveman.d.ts.map +1 -0
  45. package/dist/bin/commands/communities.d.ts +3 -0
  46. package/dist/bin/commands/communities.d.ts.map +1 -0
  47. package/dist/bin/commands/communities.js +77 -0
  48. package/dist/bin/commands/communities.js.map +7 -0
  49. package/dist/bin/commands/compression.d.ts +7 -0
  50. package/dist/bin/commands/compression.d.ts.map +1 -0
  51. package/dist/bin/commands/context.d.ts.map +1 -1
  52. package/dist/bin/commands/data.d.ts +3 -0
  53. package/dist/bin/commands/data.d.ts.map +1 -0
  54. package/dist/bin/commands/dead-code.d.ts +3 -0
  55. package/dist/bin/commands/dead-code.d.ts.map +1 -0
  56. package/dist/bin/commands/dep-confusion.d.ts +3 -0
  57. package/dist/bin/commands/dep-confusion.d.ts.map +1 -0
  58. package/dist/bin/commands/dep-confusion.js +119 -0
  59. package/dist/bin/commands/dep-confusion.js.map +7 -0
  60. package/dist/bin/commands/docs.d.ts +3 -0
  61. package/dist/bin/commands/docs.d.ts.map +1 -0
  62. package/dist/bin/commands/exec.d.ts +11 -0
  63. package/dist/bin/commands/exec.d.ts.map +1 -0
  64. package/dist/bin/commands/export.d.ts +3 -0
  65. package/dist/bin/commands/export.d.ts.map +1 -0
  66. package/dist/bin/commands/export.js +304 -10
  67. package/dist/bin/commands/export.js.map +2 -2
  68. package/dist/bin/commands/flows.d.ts +3 -0
  69. package/dist/bin/commands/flows.d.ts.map +1 -0
  70. package/dist/bin/commands/flows.js +97 -0
  71. package/dist/bin/commands/flows.js.map +7 -0
  72. package/dist/bin/commands/gain.d.ts +6 -0
  73. package/dist/bin/commands/gain.d.ts.map +1 -0
  74. package/dist/bin/commands/help.d.ts +7 -0
  75. package/dist/bin/commands/help.d.ts.map +1 -1
  76. package/dist/bin/commands/help.js +399 -101
  77. package/dist/bin/commands/help.js.map +2 -2
  78. package/dist/bin/commands/hotspots.d.ts +3 -0
  79. package/dist/bin/commands/hotspots.d.ts.map +1 -0
  80. package/dist/bin/commands/hotspots.js +94 -1
  81. package/dist/bin/commands/hotspots.js.map +3 -3
  82. package/dist/bin/commands/install.d.ts.map +1 -1
  83. package/dist/bin/commands/install.js +90 -8
  84. package/dist/bin/commands/install.js.map +2 -2
  85. package/dist/bin/commands/licenses.d.ts +3 -0
  86. package/dist/bin/commands/licenses.d.ts.map +1 -0
  87. package/dist/bin/commands/licenses.js +201 -0
  88. package/dist/bin/commands/licenses.js.map +7 -0
  89. package/dist/bin/commands/memory.d.ts +16 -0
  90. package/dist/bin/commands/memory.d.ts.map +1 -0
  91. package/dist/bin/commands/memory.js +151 -4
  92. package/dist/bin/commands/memory.js.map +2 -2
  93. package/dist/bin/commands/path.d.ts +3 -0
  94. package/dist/bin/commands/path.d.ts.map +1 -0
  95. package/dist/bin/commands/pattern.d.ts +3 -0
  96. package/dist/bin/commands/pattern.d.ts.map +1 -0
  97. package/dist/bin/commands/pattern.js +592 -0
  98. package/dist/bin/commands/pattern.js.map +7 -0
  99. package/dist/bin/commands/query.d.ts.map +1 -1
  100. package/dist/bin/commands/reachability.d.ts +3 -0
  101. package/dist/bin/commands/reachability.d.ts.map +1 -0
  102. package/dist/bin/commands/reachability.js +160 -0
  103. package/dist/bin/commands/reachability.js.map +7 -0
  104. package/dist/bin/commands/read.d.ts +6 -0
  105. package/dist/bin/commands/read.d.ts.map +1 -0
  106. package/dist/bin/commands/read.js +100 -0
  107. package/dist/bin/commands/read.js.map +7 -0
  108. package/dist/bin/commands/refactor.d.ts +3 -0
  109. package/dist/bin/commands/refactor.d.ts.map +1 -0
  110. package/dist/bin/commands/refactor.js +116 -0
  111. package/dist/bin/commands/refactor.js.map +7 -0
  112. package/dist/bin/commands/remediation.d.ts +3 -0
  113. package/dist/bin/commands/remediation.d.ts.map +1 -0
  114. package/dist/bin/commands/remediation.js +133 -0
  115. package/dist/bin/commands/remediation.js.map +7 -0
  116. package/dist/bin/commands/sbom.d.ts +3 -0
  117. package/dist/bin/commands/sbom.d.ts.map +1 -0
  118. package/dist/bin/commands/sbom.js +76 -0
  119. package/dist/bin/commands/sbom.js.map +7 -0
  120. package/dist/bin/commands/security-ci-report.d.ts +9 -0
  121. package/dist/bin/commands/security-ci-report.d.ts.map +1 -0
  122. package/dist/bin/commands/security-ci-report.js +267 -0
  123. package/dist/bin/commands/security-ci-report.js.map +7 -0
  124. package/dist/bin/commands/security-export.d.ts +2 -0
  125. package/dist/bin/commands/security-export.d.ts.map +1 -0
  126. package/dist/bin/commands/security-export.js +1349 -0
  127. package/dist/bin/commands/security-export.js.map +7 -0
  128. package/dist/bin/commands/security-flows.d.ts +3 -0
  129. package/dist/bin/commands/security-flows.d.ts.map +1 -0
  130. package/dist/bin/commands/security-flows.js +126 -0
  131. package/dist/bin/commands/security-flows.js.map +7 -0
  132. package/dist/bin/commands/security-secrets.d.ts +3 -0
  133. package/dist/bin/commands/security-secrets.d.ts.map +1 -0
  134. package/dist/bin/commands/security-secrets.js +170 -0
  135. package/dist/bin/commands/security-secrets.js.map +7 -0
  136. package/dist/bin/commands/security.d.ts +3 -0
  137. package/dist/bin/commands/security.d.ts.map +1 -0
  138. package/dist/bin/commands/security.js +208 -0
  139. package/dist/bin/commands/security.js.map +7 -0
  140. package/dist/bin/commands/snapshot.d.ts +3 -0
  141. package/dist/bin/commands/snapshot.d.ts.map +1 -0
  142. package/dist/bin/commands/staleness.d.ts +3 -0
  143. package/dist/bin/commands/staleness.d.ts.map +1 -0
  144. package/dist/bin/commands/staleness.js +144 -0
  145. package/dist/bin/commands/staleness.js.map +7 -0
  146. package/dist/bin/commands/status.d.ts.map +1 -1
  147. package/dist/bin/commands/status.js +129 -2
  148. package/dist/bin/commands/status.js.map +2 -2
  149. package/dist/bin/commands/supply-chain.d.ts +3 -0
  150. package/dist/bin/commands/supply-chain.d.ts.map +1 -0
  151. package/dist/bin/commands/supply-chain.js +138 -0
  152. package/dist/bin/commands/supply-chain.js.map +7 -0
  153. package/dist/bin/commands/surprising.d.ts +3 -0
  154. package/dist/bin/commands/surprising.d.ts.map +1 -0
  155. package/dist/bin/commands/sync.d.ts.map +1 -1
  156. package/dist/bin/commands/uninit.d.ts.map +1 -1
  157. package/dist/bin/commands/uninit.js +109 -60
  158. package/dist/bin/commands/uninit.js.map +2 -2
  159. package/dist/bin/commands/utils.d.ts +5 -0
  160. package/dist/bin/commands/utils.d.ts.map +1 -1
  161. package/dist/bin/commands/vex.d.ts +3 -0
  162. package/dist/bin/commands/vex.d.ts.map +1 -0
  163. package/dist/bin/commands/vex.js +76 -0
  164. package/dist/bin/commands/vex.js.map +7 -0
  165. package/dist/bin/commands/vuln-suppress.d.ts +3 -0
  166. package/dist/bin/commands/vuln-suppress.d.ts.map +1 -0
  167. package/dist/bin/commands/vuln-suppress.js +95 -0
  168. package/dist/bin/commands/vuln-suppress.js.map +7 -0
  169. package/dist/bin/commands/vulns.d.ts +3 -0
  170. package/dist/bin/commands/vulns.d.ts.map +1 -0
  171. package/dist/bin/commands/vulns.js +382 -0
  172. package/dist/bin/commands/vulns.js.map +7 -0
  173. package/dist/bin/installer/archive.d.ts +47 -0
  174. package/dist/bin/installer/archive.d.ts.map +1 -0
  175. package/dist/bin/installer/auto-detect.d.ts +16 -0
  176. package/dist/bin/installer/auto-detect.d.ts.map +1 -0
  177. package/dist/bin/installer/auto-detect.js +125 -0
  178. package/dist/bin/installer/auto-detect.js.map +7 -0
  179. package/dist/bin/installer/caveman.d.ts +12 -0
  180. package/dist/bin/installer/caveman.d.ts.map +1 -0
  181. package/dist/bin/installer/cli-agent.d.ts +7 -2
  182. package/dist/bin/installer/cli-agent.d.ts.map +1 -1
  183. package/dist/bin/installer/cli-agent.js +32 -5
  184. package/dist/bin/installer/cli-agent.js.map +2 -2
  185. package/dist/bin/installer/common.d.ts +36 -0
  186. package/dist/bin/installer/common.d.ts.map +1 -0
  187. package/dist/bin/installer/common.js +48 -0
  188. package/dist/bin/installer/common.js.map +2 -2
  189. package/dist/bin/installer/config-prompt.d.ts +1 -1
  190. package/dist/bin/installer/config-prompt.d.ts.map +1 -1
  191. package/dist/bin/installer/config-prompt.js +85 -2
  192. package/dist/bin/installer/config-prompt.js.map +2 -2
  193. package/dist/bin/installer/dashboard.d.ts.map +1 -1
  194. package/dist/bin/installer/detect.d.ts +30 -0
  195. package/dist/bin/installer/detect.d.ts.map +1 -0
  196. package/dist/bin/installer/detect.js +309 -0
  197. package/dist/bin/installer/detect.js.map +7 -0
  198. package/dist/bin/installer/hooks.d.ts +4 -1
  199. package/dist/bin/installer/hooks.d.ts.map +1 -1
  200. package/dist/bin/installer/hooks.js +34 -0
  201. package/dist/bin/installer/hooks.js.map +2 -2
  202. package/dist/bin/installer/index.d.ts +5 -4
  203. package/dist/bin/installer/index.d.ts.map +1 -1
  204. package/dist/bin/installer/index.js +46 -8
  205. package/dist/bin/installer/index.js.map +2 -2
  206. package/dist/bin/installer/instructions.d.ts +14 -0
  207. package/dist/bin/installer/instructions.d.ts.map +1 -0
  208. package/dist/bin/installer/instructions.js +209 -3
  209. package/dist/bin/installer/instructions.js.map +2 -2
  210. package/dist/bin/installer/mcp.d.ts.map +1 -1
  211. package/dist/bin/installer/prompts.d.ts +17 -0
  212. package/dist/bin/installer/prompts.d.ts.map +1 -1
  213. package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -1
  214. package/dist/bin/installer/steering.d.ts +14 -2
  215. package/dist/bin/installer/steering.d.ts.map +1 -1
  216. package/dist/bin/installer/steering.js +488 -0
  217. package/dist/bin/installer/steering.js.map +2 -2
  218. package/dist/bin/installer/targets/aider.d.ts +6 -0
  219. package/dist/bin/installer/targets/aider.d.ts.map +1 -0
  220. package/dist/bin/installer/targets/aider.js +3 -3
  221. package/dist/bin/installer/targets/aider.js.map +2 -2
  222. package/dist/bin/installer/targets/amp.d.ts +6 -0
  223. package/dist/bin/installer/targets/amp.d.ts.map +1 -0
  224. package/dist/bin/installer/targets/amp.js +3 -3
  225. package/dist/bin/installer/targets/amp.js.map +2 -2
  226. package/dist/bin/installer/targets/antigravity.d.ts +13 -0
  227. package/dist/bin/installer/targets/antigravity.d.ts.map +1 -0
  228. package/dist/bin/installer/targets/antigravity.js +35 -6
  229. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  230. package/dist/bin/installer/targets/augment.d.ts +6 -0
  231. package/dist/bin/installer/targets/augment.d.ts.map +1 -0
  232. package/dist/bin/installer/targets/augment.js +3 -3
  233. package/dist/bin/installer/targets/augment.js.map +2 -2
  234. package/dist/bin/installer/targets/claude.d.ts +6 -0
  235. package/dist/bin/installer/targets/claude.d.ts.map +1 -0
  236. package/dist/bin/installer/targets/claude.js +49 -5
  237. package/dist/bin/installer/targets/claude.js.map +2 -2
  238. package/dist/bin/installer/targets/cline.d.ts +13 -0
  239. package/dist/bin/installer/targets/cline.d.ts.map +1 -0
  240. package/dist/bin/installer/targets/cline.js +32 -6
  241. package/dist/bin/installer/targets/cline.js.map +2 -2
  242. package/dist/bin/installer/targets/codex.d.ts +6 -0
  243. package/dist/bin/installer/targets/codex.d.ts.map +1 -0
  244. package/dist/bin/installer/targets/codex.js +64 -12
  245. package/dist/bin/installer/targets/codex.js.map +2 -2
  246. package/dist/bin/installer/targets/continue.d.ts +12 -0
  247. package/dist/bin/installer/targets/continue.d.ts.map +1 -0
  248. package/dist/bin/installer/targets/continue.js +2 -2
  249. package/dist/bin/installer/targets/continue.js.map +2 -2
  250. package/dist/bin/installer/targets/copilot-cli.d.ts +12 -0
  251. package/dist/bin/installer/targets/copilot-cli.d.ts.map +1 -0
  252. package/dist/bin/installer/targets/copilot-cli.js +101 -0
  253. package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
  254. package/dist/bin/installer/targets/copilot.d.ts +6 -0
  255. package/dist/bin/installer/targets/copilot.d.ts.map +1 -0
  256. package/dist/bin/installer/targets/copilot.js +31 -5
  257. package/dist/bin/installer/targets/copilot.js.map +2 -2
  258. package/dist/bin/installer/targets/cursor.d.ts +6 -0
  259. package/dist/bin/installer/targets/cursor.d.ts.map +1 -0
  260. package/dist/bin/installer/targets/cursor.js +4 -4
  261. package/dist/bin/installer/targets/cursor.js.map +2 -2
  262. package/dist/bin/installer/targets/devin.d.ts +13 -0
  263. package/dist/bin/installer/targets/devin.d.ts.map +1 -0
  264. package/dist/bin/installer/targets/devin.js +2 -2
  265. package/dist/bin/installer/targets/devin.js.map +2 -2
  266. package/dist/bin/installer/targets/gemini-cli.d.ts +16 -0
  267. package/dist/bin/installer/targets/gemini-cli.d.ts.map +1 -0
  268. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  269. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  270. package/dist/bin/installer/targets/generic.d.ts +59 -0
  271. package/dist/bin/installer/targets/generic.d.ts.map +1 -0
  272. package/dist/bin/installer/targets/generic.js +2 -14
  273. package/dist/bin/installer/targets/generic.js.map +2 -2
  274. package/dist/bin/installer/targets/goose.d.ts +6 -0
  275. package/dist/bin/installer/targets/goose.d.ts.map +1 -0
  276. package/dist/bin/installer/targets/goose.js +3 -3
  277. package/dist/bin/installer/targets/goose.js.map +2 -2
  278. package/dist/bin/installer/targets/index.d.ts +11 -0
  279. package/dist/bin/installer/targets/index.d.ts.map +1 -0
  280. package/dist/bin/installer/targets/index.js +250 -0
  281. package/dist/bin/installer/targets/index.js.map +2 -2
  282. package/dist/bin/installer/targets/junie.d.ts +13 -0
  283. package/dist/bin/installer/targets/junie.d.ts.map +1 -0
  284. package/dist/bin/installer/targets/junie.js +2 -2
  285. package/dist/bin/installer/targets/junie.js.map +2 -2
  286. package/dist/bin/installer/targets/kilo.d.ts +12 -0
  287. package/dist/bin/installer/targets/kilo.d.ts.map +1 -0
  288. package/dist/bin/installer/targets/kilo.js +2 -2
  289. package/dist/bin/installer/targets/kilo.js.map +2 -2
  290. package/dist/bin/installer/targets/kiro.d.ts +5 -0
  291. package/dist/bin/installer/targets/kiro.d.ts.map +1 -0
  292. package/dist/bin/installer/targets/kiro.js +4 -4
  293. package/dist/bin/installer/targets/kiro.js.map +2 -2
  294. package/dist/bin/installer/targets/opencode.d.ts +13 -0
  295. package/dist/bin/installer/targets/opencode.d.ts.map +1 -0
  296. package/dist/bin/installer/targets/opencode.js +2 -2
  297. package/dist/bin/installer/targets/opencode.js.map +2 -2
  298. package/dist/bin/installer/targets/openhands.d.ts +6 -0
  299. package/dist/bin/installer/targets/openhands.d.ts.map +1 -0
  300. package/dist/bin/installer/targets/openhands.js +3 -3
  301. package/dist/bin/installer/targets/openhands.js.map +2 -2
  302. package/dist/bin/installer/targets/qoder.d.ts +12 -0
  303. package/dist/bin/installer/targets/qoder.d.ts.map +1 -0
  304. package/dist/bin/installer/targets/qoder.js +91 -0
  305. package/dist/bin/installer/targets/qoder.js.map +7 -0
  306. package/dist/bin/installer/targets/qwen.d.ts +12 -0
  307. package/dist/bin/installer/targets/qwen.d.ts.map +1 -0
  308. package/dist/bin/installer/targets/qwen.js +96 -0
  309. package/dist/bin/installer/targets/qwen.js.map +7 -0
  310. package/dist/bin/installer/targets/replit.d.ts +6 -0
  311. package/dist/bin/installer/targets/replit.d.ts.map +1 -0
  312. package/dist/bin/installer/targets/replit.js +3 -3
  313. package/dist/bin/installer/targets/replit.js.map +2 -2
  314. package/dist/bin/installer/targets/roo.d.ts +13 -0
  315. package/dist/bin/installer/targets/roo.d.ts.map +1 -0
  316. package/dist/bin/installer/targets/roo.js +2 -2
  317. package/dist/bin/installer/targets/roo.js.map +2 -2
  318. package/dist/bin/installer/targets/tabnine.d.ts +6 -0
  319. package/dist/bin/installer/targets/tabnine.d.ts.map +1 -0
  320. package/dist/bin/installer/targets/tabnine.js +3 -3
  321. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  322. package/dist/bin/installer/targets/trae.d.ts +6 -0
  323. package/dist/bin/installer/targets/trae.d.ts.map +1 -0
  324. package/dist/bin/installer/targets/trae.js +5 -5
  325. package/dist/bin/installer/targets/trae.js.map +2 -2
  326. package/dist/bin/installer/targets/warp.d.ts +12 -0
  327. package/dist/bin/installer/targets/warp.d.ts.map +1 -0
  328. package/dist/bin/installer/targets/warp.js +2 -2
  329. package/dist/bin/installer/targets/warp.js.map +2 -2
  330. package/dist/bin/installer/targets/windsurf.d.ts +13 -0
  331. package/dist/bin/installer/targets/windsurf.d.ts.map +1 -0
  332. package/dist/bin/installer/targets/windsurf.js +35 -6
  333. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  334. package/dist/bin/kirograph.js +74 -6
  335. package/dist/bin/kirograph.js.map +3 -3
  336. package/dist/bin/progress.d.ts +16 -1
  337. package/dist/bin/progress.d.ts.map +1 -1
  338. package/dist/compression/filters/aws.d.ts +9 -0
  339. package/dist/compression/filters/aws.d.ts.map +1 -0
  340. package/dist/compression/filters/docker.d.ts +6 -0
  341. package/dist/compression/filters/docker.d.ts.map +1 -0
  342. package/dist/compression/filters/files.d.ts +6 -0
  343. package/dist/compression/filters/files.d.ts.map +1 -0
  344. package/dist/compression/filters/generic.d.ts +7 -0
  345. package/dist/compression/filters/generic.d.ts.map +1 -0
  346. package/dist/compression/filters/git.d.ts +6 -0
  347. package/dist/compression/filters/git.d.ts.map +1 -0
  348. package/dist/compression/filters/github.d.ts +6 -0
  349. package/dist/compression/filters/github.d.ts.map +1 -0
  350. package/dist/compression/filters/lint.d.ts +6 -0
  351. package/dist/compression/filters/lint.d.ts.map +1 -0
  352. package/dist/compression/filters/misc.d.ts +6 -0
  353. package/dist/compression/filters/misc.d.ts.map +1 -0
  354. package/dist/compression/filters/package.d.ts +6 -0
  355. package/dist/compression/filters/package.d.ts.map +1 -0
  356. package/dist/compression/filters/test.d.ts +6 -0
  357. package/dist/compression/filters/test.d.ts.map +1 -0
  358. package/dist/compression/index.d.ts +29 -0
  359. package/dist/compression/index.d.ts.map +1 -0
  360. package/dist/compression/naive-cost.d.ts +26 -0
  361. package/dist/compression/naive-cost.d.ts.map +1 -0
  362. package/dist/compression/tracker.d.ts +155 -0
  363. package/dist/compression/tracker.d.ts.map +1 -0
  364. package/dist/compression/tracker.js +80 -0
  365. package/dist/compression/tracker.js.map +2 -2
  366. package/dist/compression/types.d.ts +49 -0
  367. package/dist/compression/types.d.ts.map +1 -0
  368. package/dist/config.d.ts +90 -0
  369. package/dist/config.d.ts.map +1 -1
  370. package/dist/config.js +144 -3
  371. package/dist/config.js.map +2 -2
  372. package/dist/core/lock-manager.d.ts +2 -0
  373. package/dist/core/lock-manager.d.ts.map +1 -1
  374. package/dist/core/pipeline.d.ts +4 -1
  375. package/dist/core/pipeline.d.ts.map +1 -1
  376. package/dist/core/pipeline.js +78 -2
  377. package/dist/core/pipeline.js.map +2 -2
  378. package/dist/core/snapshot.d.ts +58 -0
  379. package/dist/core/snapshot.d.ts.map +1 -0
  380. package/dist/data/filters.d.ts +23 -0
  381. package/dist/data/filters.d.ts.map +1 -0
  382. package/dist/data/indexer.d.ts +25 -0
  383. package/dist/data/indexer.d.ts.map +1 -0
  384. package/dist/data/linker.d.ts +37 -0
  385. package/dist/data/linker.d.ts.map +1 -0
  386. package/dist/data/lint.d.ts +27 -0
  387. package/dist/data/lint.d.ts.map +1 -0
  388. package/dist/data/parsers/csv.d.ts +11 -0
  389. package/dist/data/parsers/csv.d.ts.map +1 -0
  390. package/dist/data/parsers/excel.d.ts +10 -0
  391. package/dist/data/parsers/excel.d.ts.map +1 -0
  392. package/dist/data/parsers/index.d.ts +28 -0
  393. package/dist/data/parsers/index.d.ts.map +1 -0
  394. package/dist/data/parsers/json-array.d.ts +9 -0
  395. package/dist/data/parsers/json-array.d.ts.map +1 -0
  396. package/dist/data/parsers/jsonl.d.ts +9 -0
  397. package/dist/data/parsers/jsonl.d.ts.map +1 -0
  398. package/dist/data/parsers/parquet.d.ts +10 -0
  399. package/dist/data/parsers/parquet.d.ts.map +1 -0
  400. package/dist/data/profiler.d.ts +29 -0
  401. package/dist/data/profiler.d.ts.map +1 -0
  402. package/dist/data/queries.d.ts +95 -0
  403. package/dist/data/queries.d.ts.map +1 -0
  404. package/dist/data/types.d.ts +103 -0
  405. package/dist/data/types.d.ts.map +1 -0
  406. package/dist/db/database.d.ts +57 -0
  407. package/dist/db/database.d.ts.map +1 -1
  408. package/dist/db/database.js +75 -5
  409. package/dist/db/database.js.map +2 -2
  410. package/dist/db/memory-schema.sql +5 -1
  411. package/dist/db/patterns-schema.sql +23 -0
  412. package/dist/db/schema.sql +3 -1
  413. package/dist/db/security-schema.sql +72 -0
  414. package/dist/docs/formats/asciidoc.d.ts +9 -0
  415. package/dist/docs/formats/asciidoc.d.ts.map +1 -0
  416. package/dist/docs/formats/html.d.ts +10 -0
  417. package/dist/docs/formats/html.d.ts.map +1 -0
  418. package/dist/docs/formats/index.d.ts +31 -0
  419. package/dist/docs/formats/index.d.ts.map +1 -0
  420. package/dist/docs/formats/markdown.d.ts +11 -0
  421. package/dist/docs/formats/markdown.d.ts.map +1 -0
  422. package/dist/docs/formats/openapi.d.ts +17 -0
  423. package/dist/docs/formats/openapi.d.ts.map +1 -0
  424. package/dist/docs/formats/org.d.ts +9 -0
  425. package/dist/docs/formats/org.d.ts.map +1 -0
  426. package/dist/docs/formats/plaintext.d.ts +11 -0
  427. package/dist/docs/formats/plaintext.d.ts.map +1 -0
  428. package/dist/docs/formats/rdoc.d.ts +10 -0
  429. package/dist/docs/formats/rdoc.d.ts.map +1 -0
  430. package/dist/docs/formats/rst.d.ts +11 -0
  431. package/dist/docs/formats/rst.d.ts.map +1 -0
  432. package/dist/docs/indexer.d.ts +49 -0
  433. package/dist/docs/indexer.d.ts.map +1 -0
  434. package/dist/docs/linker.d.ts +30 -0
  435. package/dist/docs/linker.d.ts.map +1 -0
  436. package/dist/docs/lint.d.ts +27 -0
  437. package/dist/docs/lint.d.ts.map +1 -0
  438. package/dist/docs/queries.d.ts +78 -0
  439. package/dist/docs/queries.d.ts.map +1 -0
  440. package/dist/docs/section-id.d.ts +48 -0
  441. package/dist/docs/section-id.d.ts.map +1 -0
  442. package/dist/docs/summarizer.d.ts +13 -0
  443. package/dist/docs/summarizer.d.ts.map +1 -0
  444. package/dist/docs/types.d.ts +71 -0
  445. package/dist/docs/types.d.ts.map +1 -0
  446. package/dist/docs/vectors.d.ts +54 -0
  447. package/dist/docs/vectors.d.ts.map +1 -0
  448. package/dist/extraction/extractor.d.ts +1 -1
  449. package/dist/extraction/extractor.d.ts.map +1 -1
  450. package/dist/extraction/extractor.js +81 -0
  451. package/dist/extraction/extractor.js.map +2 -2
  452. package/dist/extraction/grammars.d.ts +6 -0
  453. package/dist/extraction/grammars.d.ts.map +1 -1
  454. package/dist/extraction/grammars.js +32 -8
  455. package/dist/extraction/grammars.js.map +2 -2
  456. package/dist/extraction/languages.d.ts.map +1 -1
  457. package/dist/extraction/languages.js +43 -1
  458. package/dist/extraction/languages.js.map +2 -2
  459. package/dist/extraction/notebook.d.ts +14 -0
  460. package/dist/extraction/notebook.d.ts.map +1 -0
  461. package/dist/extraction/notebook.js +300 -0
  462. package/dist/extraction/notebook.js.map +7 -0
  463. package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
  464. package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
  465. package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
  466. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  467. package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
  468. package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
  469. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  470. package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
  471. package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
  472. package/dist/frameworks/amplify.d.ts +9 -0
  473. package/dist/frameworks/amplify.d.ts.map +1 -0
  474. package/dist/frameworks/angular.d.ts +9 -0
  475. package/dist/frameworks/angular.d.ts.map +1 -0
  476. package/dist/frameworks/ansible.d.ts +8 -0
  477. package/dist/frameworks/ansible.d.ts.map +1 -0
  478. package/dist/frameworks/cloudformation.d.ts +9 -0
  479. package/dist/frameworks/cloudformation.d.ts.map +1 -0
  480. package/dist/frameworks/docker.d.ts +9 -0
  481. package/dist/frameworks/docker.d.ts.map +1 -0
  482. package/dist/frameworks/elixir.d.ts +6 -0
  483. package/dist/frameworks/elixir.d.ts.map +1 -0
  484. package/dist/frameworks/flutter.d.ts +12 -0
  485. package/dist/frameworks/flutter.d.ts.map +1 -0
  486. package/dist/frameworks/flutter.js +130 -0
  487. package/dist/frameworks/flutter.js.map +7 -0
  488. package/dist/frameworks/iac.d.ts +10 -0
  489. package/dist/frameworks/iac.d.ts.map +1 -0
  490. package/dist/frameworks/index.d.ts +14 -0
  491. package/dist/frameworks/index.d.ts.map +1 -1
  492. package/dist/frameworks/index.js +7 -1
  493. package/dist/frameworks/index.js.map +3 -3
  494. package/dist/frameworks/kubernetes.d.ts +9 -0
  495. package/dist/frameworks/kubernetes.d.ts.map +1 -0
  496. package/dist/frameworks/pulumi.d.ts +9 -0
  497. package/dist/frameworks/pulumi.d.ts.map +1 -0
  498. package/dist/frameworks/scala.d.ts +6 -0
  499. package/dist/frameworks/scala.d.ts.map +1 -0
  500. package/dist/frameworks/solidity.d.ts +6 -0
  501. package/dist/frameworks/solidity.d.ts.map +1 -0
  502. package/dist/frameworks/terraform.d.ts +14 -0
  503. package/dist/frameworks/terraform.d.ts.map +1 -0
  504. package/dist/frameworks/vue.d.ts +7 -0
  505. package/dist/frameworks/vue.d.ts.map +1 -0
  506. package/dist/graph/communities.d.ts +43 -0
  507. package/dist/graph/communities.d.ts.map +1 -0
  508. package/dist/graph/communities.js +317 -0
  509. package/dist/graph/communities.js.map +7 -0
  510. package/dist/graph/flows.d.ts +55 -0
  511. package/dist/graph/flows.d.ts.map +1 -0
  512. package/dist/graph/flows.js +138 -0
  513. package/dist/graph/flows.js.map +7 -0
  514. package/dist/graph/refactor.d.ts +43 -0
  515. package/dist/graph/refactor.d.ts.map +1 -0
  516. package/dist/graph/refactor.js +155 -0
  517. package/dist/graph/refactor.js.map +7 -0
  518. package/dist/index.d.ts +36 -4
  519. package/dist/index.d.ts.map +1 -1
  520. package/dist/index.js +1 -1
  521. package/dist/index.js.map +2 -2
  522. package/dist/mcp/cache.d.ts +69 -0
  523. package/dist/mcp/cache.d.ts.map +1 -0
  524. package/dist/mcp/cache.js +172 -0
  525. package/dist/mcp/cache.js.map +7 -0
  526. package/dist/mcp/read-modes.d.ts +31 -0
  527. package/dist/mcp/read-modes.d.ts.map +1 -0
  528. package/dist/mcp/read-modes.js +295 -0
  529. package/dist/mcp/read-modes.js.map +7 -0
  530. package/dist/mcp/server.d.ts +1 -0
  531. package/dist/mcp/server.d.ts.map +1 -1
  532. package/dist/mcp/server.js +17 -3
  533. package/dist/mcp/server.js.map +2 -2
  534. package/dist/mcp/tool-names.d.ts +2 -0
  535. package/dist/mcp/tool-names.d.ts.map +1 -0
  536. package/dist/mcp/tool-names.js +24 -1
  537. package/dist/mcp/tool-names.js.map +2 -2
  538. package/dist/mcp/tools.d.ts +12 -0
  539. package/dist/mcp/tools.d.ts.map +1 -1
  540. package/dist/mcp/tools.js +1560 -4
  541. package/dist/mcp/tools.js.map +3 -3
  542. package/dist/memory/compress.d.ts +19 -0
  543. package/dist/memory/compress.d.ts.map +1 -0
  544. package/dist/memory/database.d.ts +92 -0
  545. package/dist/memory/database.d.ts.map +1 -0
  546. package/dist/memory/database.js +70 -2
  547. package/dist/memory/database.js.map +2 -2
  548. package/dist/memory/index.d.ts +71 -0
  549. package/dist/memory/index.d.ts.map +1 -0
  550. package/dist/memory/index.js +12 -2
  551. package/dist/memory/index.js.map +2 -2
  552. package/dist/memory/symbols.d.ts +21 -0
  553. package/dist/memory/symbols.d.ts.map +1 -0
  554. package/dist/memory/types.d.ts +78 -0
  555. package/dist/memory/types.d.ts.map +1 -0
  556. package/dist/memory/types.js.map +1 -1
  557. package/dist/memory/vectors.d.ts +43 -0
  558. package/dist/memory/vectors.d.ts.map +1 -0
  559. package/dist/patterns/graph.d.ts +16 -0
  560. package/dist/patterns/graph.d.ts.map +1 -0
  561. package/dist/patterns/graph.js +45 -0
  562. package/dist/patterns/graph.js.map +7 -0
  563. package/dist/patterns/index.d.ts +4 -0
  564. package/dist/patterns/index.d.ts.map +1 -0
  565. package/dist/patterns/index.js +39 -0
  566. package/dist/patterns/index.js.map +7 -0
  567. package/dist/patterns/indexer.d.ts +15 -0
  568. package/dist/patterns/indexer.d.ts.map +1 -0
  569. package/dist/patterns/indexer.js +97 -0
  570. package/dist/patterns/indexer.js.map +7 -0
  571. package/dist/patterns/library/command-injection-go.yaml +11 -0
  572. package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
  573. package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
  574. package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
  575. package/dist/patterns/library/path-traversal-go.yaml +11 -0
  576. package/dist/patterns/library/path-traversal-py.yaml +12 -0
  577. package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
  578. package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
  579. package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
  580. package/dist/patterns/library/sql-injection-java.yaml +13 -0
  581. package/dist/patterns/library/sql-injection-py.yaml +12 -0
  582. package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
  583. package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
  584. package/dist/patterns/library/weak-crypto-py.yaml +13 -0
  585. package/dist/patterns/loader.d.ts +18 -0
  586. package/dist/patterns/loader.d.ts.map +1 -0
  587. package/dist/patterns/loader.js +277 -0
  588. package/dist/patterns/loader.js.map +7 -0
  589. package/dist/patterns/runner.d.ts +42 -0
  590. package/dist/patterns/runner.d.ts.map +1 -0
  591. package/dist/patterns/runner.js +277 -0
  592. package/dist/patterns/runner.js.map +7 -0
  593. package/dist/patterns/types.d.ts +27 -0
  594. package/dist/patterns/types.d.ts.map +1 -0
  595. package/dist/patterns/types.js +34 -0
  596. package/dist/patterns/types.js.map +7 -0
  597. package/dist/resolution/bridges/android-rn.d.ts +13 -0
  598. package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
  599. package/dist/resolution/bridges/android-rn.js +298 -0
  600. package/dist/resolution/bridges/android-rn.js.map +7 -0
  601. package/dist/resolution/bridges/expo-modules.d.ts +10 -0
  602. package/dist/resolution/bridges/expo-modules.d.ts.map +1 -0
  603. package/dist/resolution/bridges/expo-modules.js +155 -0
  604. package/dist/resolution/bridges/expo-modules.js.map +7 -0
  605. package/dist/resolution/bridges/flutter-channel.d.ts +14 -0
  606. package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -0
  607. package/dist/resolution/bridges/flutter-channel.js +385 -0
  608. package/dist/resolution/bridges/flutter-channel.js.map +7 -0
  609. package/dist/resolution/bridges/index.d.ts +40 -0
  610. package/dist/resolution/bridges/index.d.ts.map +1 -0
  611. package/dist/resolution/bridges/index.js +80 -0
  612. package/dist/resolution/bridges/index.js.map +7 -0
  613. package/dist/resolution/bridges/native-events.d.ts +10 -0
  614. package/dist/resolution/bridges/native-events.d.ts.map +1 -0
  615. package/dist/resolution/bridges/native-events.js +188 -0
  616. package/dist/resolution/bridges/native-events.js.map +7 -0
  617. package/dist/resolution/bridges/native-views.d.ts +13 -0
  618. package/dist/resolution/bridges/native-views.d.ts.map +1 -0
  619. package/dist/resolution/bridges/native-views.js +244 -0
  620. package/dist/resolution/bridges/native-views.js.map +7 -0
  621. package/dist/resolution/bridges/react-native.d.ts +9 -0
  622. package/dist/resolution/bridges/react-native.d.ts.map +1 -0
  623. package/dist/resolution/bridges/react-native.js +161 -0
  624. package/dist/resolution/bridges/react-native.js.map +7 -0
  625. package/dist/resolution/bridges/swift-objc.d.ts +14 -0
  626. package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
  627. package/dist/resolution/bridges/swift-objc.js +227 -0
  628. package/dist/resolution/bridges/swift-objc.js.map +7 -0
  629. package/dist/resolution/bridges/turbomodules.d.ts +10 -0
  630. package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
  631. package/dist/resolution/bridges/turbomodules.js +216 -0
  632. package/dist/resolution/bridges/turbomodules.js.map +7 -0
  633. package/dist/resolution/index.d.ts +28 -3
  634. package/dist/resolution/index.d.ts.map +1 -1
  635. package/dist/resolution/index.js +61 -2
  636. package/dist/resolution/index.js.map +2 -2
  637. package/dist/security/attack-surface.d.ts +46 -0
  638. package/dist/security/attack-surface.d.ts.map +1 -0
  639. package/dist/security/attack-surface.js +206 -0
  640. package/dist/security/attack-surface.js.map +7 -0
  641. package/dist/security/context-warnings.d.ts +40 -0
  642. package/dist/security/context-warnings.d.ts.map +1 -0
  643. package/dist/security/context-warnings.js +123 -0
  644. package/dist/security/context-warnings.js.map +7 -0
  645. package/dist/security/data-flows.d.ts +33 -0
  646. package/dist/security/data-flows.d.ts.map +1 -0
  647. package/dist/security/data-flows.js +286 -0
  648. package/dist/security/data-flows.js.map +7 -0
  649. package/dist/security/dep-confusion.d.ts +23 -0
  650. package/dist/security/dep-confusion.d.ts.map +1 -0
  651. package/dist/security/dep-confusion.js +255 -0
  652. package/dist/security/dep-confusion.js.map +7 -0
  653. package/dist/security/errors.d.ts +16 -0
  654. package/dist/security/errors.d.ts.map +1 -0
  655. package/dist/security/errors.js +51 -0
  656. package/dist/security/errors.js.map +7 -0
  657. package/dist/security/export/fix-suggestions.d.ts +21 -0
  658. package/dist/security/export/fix-suggestions.d.ts.map +1 -0
  659. package/dist/security/export/fix-suggestions.js +58 -0
  660. package/dist/security/export/fix-suggestions.js.map +7 -0
  661. package/dist/security/export/sbom.d.ts +33 -0
  662. package/dist/security/export/sbom.d.ts.map +1 -0
  663. package/dist/security/export/sbom.js +230 -0
  664. package/dist/security/export/sbom.js.map +7 -0
  665. package/dist/security/export/serialization.d.ts +62 -0
  666. package/dist/security/export/serialization.d.ts.map +1 -0
  667. package/dist/security/export/serialization.js +142 -0
  668. package/dist/security/export/serialization.js.map +7 -0
  669. package/dist/security/export/vex.d.ts +58 -0
  670. package/dist/security/export/vex.d.ts.map +1 -0
  671. package/dist/security/export/vex.js +220 -0
  672. package/dist/security/export/vex.js.map +7 -0
  673. package/dist/security/index.d.ts +21 -0
  674. package/dist/security/index.d.ts.map +1 -0
  675. package/dist/security/index.js +67 -0
  676. package/dist/security/index.js.map +7 -0
  677. package/dist/security/integrator.d.ts +63 -0
  678. package/dist/security/integrator.d.ts.map +1 -0
  679. package/dist/security/integrator.js +491 -0
  680. package/dist/security/integrator.js.map +7 -0
  681. package/dist/security/license.d.ts +33 -0
  682. package/dist/security/license.d.ts.map +1 -0
  683. package/dist/security/license.js +70 -0
  684. package/dist/security/license.js.map +7 -0
  685. package/dist/security/manifest/adapter.d.ts +92 -0
  686. package/dist/security/manifest/adapter.d.ts.map +1 -0
  687. package/dist/security/manifest/adapter.js +243 -0
  688. package/dist/security/manifest/adapter.js.map +7 -0
  689. package/dist/security/manifest/parser.d.ts +73 -0
  690. package/dist/security/manifest/parser.d.ts.map +1 -0
  691. package/dist/security/manifest/parser.js +376 -0
  692. package/dist/security/manifest/parser.js.map +7 -0
  693. package/dist/security/manifest/plugins/cargo.d.ts +11 -0
  694. package/dist/security/manifest/plugins/cargo.d.ts.map +1 -0
  695. package/dist/security/manifest/plugins/cargo.js +233 -0
  696. package/dist/security/manifest/plugins/cargo.js.map +7 -0
  697. package/dist/security/manifest/plugins/composer.d.ts +11 -0
  698. package/dist/security/manifest/plugins/composer.d.ts.map +1 -0
  699. package/dist/security/manifest/plugins/composer.js +152 -0
  700. package/dist/security/manifest/plugins/composer.js.map +7 -0
  701. package/dist/security/manifest/plugins/go.d.ts +12 -0
  702. package/dist/security/manifest/plugins/go.d.ts.map +1 -0
  703. package/dist/security/manifest/plugins/go.js +146 -0
  704. package/dist/security/manifest/plugins/go.js.map +7 -0
  705. package/dist/security/manifest/plugins/gradle.d.ts +12 -0
  706. package/dist/security/manifest/plugins/gradle.d.ts.map +1 -0
  707. package/dist/security/manifest/plugins/gradle.js +159 -0
  708. package/dist/security/manifest/plugins/gradle.js.map +7 -0
  709. package/dist/security/manifest/plugins/hex.d.ts +11 -0
  710. package/dist/security/manifest/plugins/hex.d.ts.map +1 -0
  711. package/dist/security/manifest/plugins/hex.js +159 -0
  712. package/dist/security/manifest/plugins/hex.js.map +7 -0
  713. package/dist/security/manifest/plugins/maven.d.ts +11 -0
  714. package/dist/security/manifest/plugins/maven.d.ts.map +1 -0
  715. package/dist/security/manifest/plugins/maven.js +128 -0
  716. package/dist/security/manifest/plugins/maven.js.map +7 -0
  717. package/dist/security/manifest/plugins/npm.d.ts +11 -0
  718. package/dist/security/manifest/plugins/npm.d.ts.map +1 -0
  719. package/dist/security/manifest/plugins/npm.js +284 -0
  720. package/dist/security/manifest/plugins/npm.js.map +7 -0
  721. package/dist/security/manifest/plugins/nuget.d.ts +12 -0
  722. package/dist/security/manifest/plugins/nuget.d.ts.map +1 -0
  723. package/dist/security/manifest/plugins/nuget.js +186 -0
  724. package/dist/security/manifest/plugins/nuget.js.map +7 -0
  725. package/dist/security/manifest/plugins/pip.d.ts +11 -0
  726. package/dist/security/manifest/plugins/pip.d.ts.map +1 -0
  727. package/dist/security/manifest/plugins/pip.js +123 -0
  728. package/dist/security/manifest/plugins/pip.js.map +7 -0
  729. package/dist/security/manifest/plugins/pubspec.d.ts +11 -0
  730. package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -0
  731. package/dist/security/manifest/plugins/pubspec.js +212 -0
  732. package/dist/security/manifest/plugins/pubspec.js.map +7 -0
  733. package/dist/security/manifest/plugins/pyproject.d.ts +3 -0
  734. package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -0
  735. package/dist/security/manifest/plugins/pyproject.js +261 -0
  736. package/dist/security/manifest/plugins/pyproject.js.map +7 -0
  737. package/dist/security/manifest/plugins/rubygems.d.ts +11 -0
  738. package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -0
  739. package/dist/security/manifest/plugins/rubygems.js +185 -0
  740. package/dist/security/manifest/plugins/rubygems.js.map +7 -0
  741. package/dist/security/manifest/plugins/swift.d.ts +11 -0
  742. package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
  743. package/dist/security/manifest/plugins/swift.js +200 -0
  744. package/dist/security/manifest/plugins/swift.js.map +7 -0
  745. package/dist/security/owasp.d.ts +16 -0
  746. package/dist/security/owasp.d.ts.map +1 -0
  747. package/dist/security/owasp.js +104 -0
  748. package/dist/security/owasp.js.map +7 -0
  749. package/dist/security/pipeline.d.ts +37 -0
  750. package/dist/security/pipeline.d.ts.map +1 -0
  751. package/dist/security/pipeline.js +125 -0
  752. package/dist/security/pipeline.js.map +7 -0
  753. package/dist/security/reachability.d.ts +67 -0
  754. package/dist/security/reachability.d.ts.map +1 -0
  755. package/dist/security/reachability.js +276 -0
  756. package/dist/security/reachability.js.map +7 -0
  757. package/dist/security/remediation.d.ts +51 -0
  758. package/dist/security/remediation.d.ts.map +1 -0
  759. package/dist/security/remediation.js +126 -0
  760. package/dist/security/remediation.js.map +7 -0
  761. package/dist/security/secrets.d.ts +38 -0
  762. package/dist/security/secrets.d.ts.map +1 -0
  763. package/dist/security/secrets.js +176 -0
  764. package/dist/security/secrets.js.map +7 -0
  765. package/dist/security/staleness.d.ts +43 -0
  766. package/dist/security/staleness.d.ts.map +1 -0
  767. package/dist/security/staleness.js +231 -0
  768. package/dist/security/staleness.js.map +7 -0
  769. package/dist/security/supply-chain.d.ts +34 -0
  770. package/dist/security/supply-chain.d.ts.map +1 -0
  771. package/dist/security/supply-chain.js +301 -0
  772. package/dist/security/supply-chain.js.map +7 -0
  773. package/dist/security/suppressions.d.ts +18 -0
  774. package/dist/security/suppressions.d.ts.map +1 -0
  775. package/dist/security/suppressions.js +106 -0
  776. package/dist/security/suppressions.js.map +7 -0
  777. package/dist/security/types.d.ts +144 -0
  778. package/dist/security/types.d.ts.map +1 -0
  779. package/dist/security/types.js +17 -0
  780. package/dist/security/types.js.map +7 -0
  781. package/dist/security/vuln/client.d.ts +90 -0
  782. package/dist/security/vuln/client.d.ts.map +1 -0
  783. package/dist/security/vuln/client.js +355 -0
  784. package/dist/security/vuln/client.js.map +7 -0
  785. package/dist/security/vuln/epss-client.d.ts +26 -0
  786. package/dist/security/vuln/epss-client.d.ts.map +1 -0
  787. package/dist/security/vuln/epss-client.js +95 -0
  788. package/dist/security/vuln/epss-client.js.map +7 -0
  789. package/dist/security/vuln/index.d.ts +6 -0
  790. package/dist/security/vuln/index.d.ts.map +1 -0
  791. package/dist/security/vuln/index.js +29 -0
  792. package/dist/security/vuln/index.js.map +7 -0
  793. package/dist/security/vuln/osv-adapter.d.ts +58 -0
  794. package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
  795. package/dist/security/vuln/osv-adapter.js +321 -0
  796. package/dist/security/vuln/osv-adapter.js.map +7 -0
  797. package/dist/security/vuln/types.d.ts +29 -0
  798. package/dist/security/vuln/types.d.ts.map +1 -0
  799. package/dist/security/vuln/types.js +17 -0
  800. package/dist/security/vuln/types.js.map +7 -0
  801. package/dist/sync/index.d.ts +4 -2
  802. package/dist/sync/index.d.ts.map +1 -1
  803. package/dist/types.d.ts +10 -4
  804. package/dist/types.d.ts.map +1 -1
  805. package/dist/types.js.map +2 -2
  806. package/dist/vectors/index.d.ts +11 -3
  807. package/dist/vectors/index.d.ts.map +1 -1
  808. package/dist/vectors/qdrant-index.d.ts +10 -3
  809. package/dist/vectors/qdrant-index.d.ts.map +1 -1
  810. package/dist/vectors/typesense-index.d.ts.map +1 -1
  811. package/dist/watchmen/index.js +83 -0
  812. package/dist/watchmen/index.js.map +7 -0
  813. package/dist/watchmen/synthesize.js +475 -0
  814. package/dist/watchmen/synthesize.js.map +7 -0
  815. package/package.json +6 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/security/manifest/plugins/cargo.ts"],
4
+ "sourcesContent": ["/**\n * Cargo Version Extraction Plugin for KiroGraph-Sec\n *\n * Extends the existing architecture cargo parser to extract version constraints,\n * resolved versions (from Cargo.lock), and dependency scopes for security analysis.\n *\n * Reuses `cargoParser` from `src/architecture/manifest/cargo.ts` for discovery and\n * basic parsing, then layers on version/scope extraction.\n *\n * Handles both simple format (`serde = \"1.0\"`) and table format\n * (`serde = { version = \"1.0\", features = [\"derive\"] }`).\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ParsedDependency } from '../../types';\nimport { logWarn } from '../../../errors';\n\n/**\n * Dependency section headers in Cargo.toml mapped to their ParsedDependency scope.\n */\nconst SECTION_SCOPES: Array<{ section: string; scope: ParsedDependency['scope'] }> = [\n { section: 'dependencies', scope: 'production' },\n { section: 'dev-dependencies', scope: 'development' },\n { section: 'build-dependencies', scope: 'development' },\n];\n\n/**\n * Resolved version map: package name \u2192 resolved version string.\n * Built from Cargo.lock.\n */\ntype ResolvedVersionMap = Map<string, string>;\n\n/**\n * Parse a Cargo.toml manifest and extract dependency declarations\n * with version constraints, scopes, and resolved versions from Cargo.lock.\n *\n * @param manifestPath - Absolute path to the Cargo.toml file\n * @param projectRoot - Absolute path to the project root directory\n * @returns Array of parsed dependencies with version and scope information\n */\nexport async function parseCargoManifest(\n manifestPath: string,\n projectRoot: string,\n): Promise<ParsedDependency[]> {\n const manifestDir = path.dirname(manifestPath);\n const relativeManifest = path.relative(projectRoot, manifestPath).replace(/\\\\/g, '/');\n\n // Read the Cargo.toml content\n let content: string;\n try {\n content = fs.readFileSync(manifestPath, 'utf8');\n } catch (err) {\n logWarn(`[sec:cargo] Failed to read ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);\n return [];\n }\n\n // Attempt to load resolved versions from Cargo.lock\n const resolvedVersions = loadResolvedVersions(manifestDir);\n\n // Extract the package-level license from [package] section\n const license = extractCargoLicense(content);\n\n // Extract dependencies from each section\n const dependencies: ParsedDependency[] = [];\n\n for (const { section, scope } of SECTION_SCOPES) {\n const sectionDeps = extractSectionDependencies(content, section, relativeManifest);\n for (const dep of sectionDeps) {\n const resolvedVersion = resolvedVersions.get(dep.name);\n dependencies.push({\n name: dep.name,\n declaredConstraint: dep.constraint,\n resolvedVersion,\n scope,\n ecosystem: 'cargo',\n sourceManifest: relativeManifest,\n ...(license !== undefined ? { license } : {}),\n });\n }\n }\n\n return dependencies;\n}\n\n/**\n * A raw dependency entry extracted from a TOML section.\n */\ninterface RawDependency {\n name: string;\n constraint: string;\n}\n\n/**\n * Extract dependencies from a specific section of a Cargo.toml file.\n * Handles both simple (`name = \"version\"`) and table (`name = { version = \"...\" }`) formats.\n * Also handles `[<section>.<name>]` table headers for individual dependency configuration.\n */\nfunction extractSectionDependencies(\n content: string,\n section: string,\n relativeManifest: string,\n): RawDependency[] {\n const deps: RawDependency[] = [];\n\n // Pattern 1: Inline section [dependencies] / [dev-dependencies] / [build-dependencies]\n // Match the section header and capture everything until the next section header\n const sectionRegex = new RegExp(`^\\\\[${escapeRegex(section)}\\\\]\\\\s*$`, 'm');\n const sectionMatch = sectionRegex.exec(content);\n\n if (sectionMatch) {\n const startIdx = sectionMatch.index + sectionMatch[0].length;\n // Find the next section header (line starting with [)\n const remaining = content.slice(startIdx);\n const nextSectionMatch = remaining.match(/^\\[/m);\n const sectionContent = nextSectionMatch\n ? remaining.slice(0, nextSectionMatch.index)\n : remaining;\n\n const lines = sectionContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === '' || trimmed.startsWith('#')) continue;\n\n const dep = parseDependencyLine(trimmed, relativeManifest, section);\n if (dep) {\n deps.push(dep);\n }\n }\n }\n\n // Pattern 2: Table-style individual dependency sections\n // e.g., [dependencies.serde] or [dev-dependencies.tokio]\n const tableRegex = new RegExp(`^\\\\[${escapeRegex(section)}\\\\.([^\\\\]]+)\\\\]\\\\s*$`, 'gm');\n let tableMatch: RegExpExecArray | null;\n while ((tableMatch = tableRegex.exec(content)) !== null) {\n const depName = tableMatch[1].trim();\n const startIdx = tableMatch.index + tableMatch[0].length;\n const remaining = content.slice(startIdx);\n const nextSectionMatch = remaining.match(/^\\[/m);\n const tableContent = nextSectionMatch\n ? remaining.slice(0, nextSectionMatch.index)\n : remaining;\n\n const version = extractVersionFromTable(tableContent);\n if (version) {\n deps.push({ name: depName, constraint: version });\n } else {\n // If no version specified, it might use path/git \u2014 use \"*\" as constraint\n deps.push({ name: depName, constraint: '*' });\n }\n }\n\n return deps;\n}\n\n/**\n * Parse a single dependency line from a Cargo.toml section.\n *\n * Handles:\n * - Simple string: `serde = \"1.0\"`\n * - Inline table: `serde = { version = \"1.0\", features = [\"derive\"] }`\n * - Path/git dependencies without version: `my-lib = { path = \"../my-lib\" }`\n */\nfunction parseDependencyLine(\n line: string,\n relativeManifest: string,\n section: string,\n): RawDependency | null {\n // Match: name = \"version\" or name = '...'\n const simpleMatch = line.match(/^([a-zA-Z0-9_-]+)\\s*=\\s*\"([^\"]*)\"$/);\n if (simpleMatch) {\n const name = simpleMatch[1];\n const constraint = simpleMatch[2];\n if (!isValidCrateName(name)) {\n logWarn(`[sec:cargo] Invalid crate name \"${name}\" in ${relativeManifest} [${section}] \u2014 skipping`);\n return null;\n }\n if (constraint.trim() === '') {\n logWarn(`[sec:cargo] Empty version constraint for \"${name}\" in ${relativeManifest} [${section}] \u2014 skipping`);\n return null;\n }\n return { name, constraint };\n }\n\n // Match: name = { version = \"...\", ... }\n const tableMatch = line.match(/^([a-zA-Z0-9_-]+)\\s*=\\s*\\{(.*)\\}\\s*$/);\n if (tableMatch) {\n const name = tableMatch[1];\n const tableContent = tableMatch[2];\n if (!isValidCrateName(name)) {\n logWarn(`[sec:cargo] Invalid crate name \"${name}\" in ${relativeManifest} [${section}] \u2014 skipping`);\n return null;\n }\n\n const version = extractVersionFromInlineTable(tableContent);\n if (version) {\n return { name, constraint: version };\n }\n\n // No version field \u2014 path or git dependency, use \"*\" as constraint\n return { name, constraint: '*' };\n }\n\n // Line doesn't match expected formats \u2014 could be a comment or malformed\n // Only warn if it looks like it was intended to be a dependency\n if (line.includes('=') && !line.startsWith('#')) {\n const possibleName = line.split('=')[0].trim();\n if (possibleName && /^[a-zA-Z0-9_-]+$/.test(possibleName)) {\n logWarn(`[sec:cargo] Could not parse dependency line in ${relativeManifest} [${section}]: \"${line}\" \u2014 skipping`);\n }\n }\n\n return null;\n}\n\n/**\n * Extract the version field from an inline table string.\n * e.g., from `version = \"1.0\", features = [\"derive\"]` \u2192 \"1.0\"\n */\nfunction extractVersionFromInlineTable(tableContent: string): string | null {\n const versionMatch = tableContent.match(/version\\s*=\\s*\"([^\"]*)\"/);\n if (versionMatch && versionMatch[1].trim() !== '') {\n return versionMatch[1];\n }\n return null;\n}\n\n/**\n * Extract the version field from a multi-line table section.\n * e.g., from lines like `version = \"1.0\"`\n */\nfunction extractVersionFromTable(tableContent: string): string | null {\n const lines = tableContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n const versionMatch = trimmed.match(/^version\\s*=\\s*\"([^\"]*)\"$/);\n if (versionMatch && versionMatch[1].trim() !== '') {\n return versionMatch[1];\n }\n }\n return null;\n}\n\n/**\n * Attempt to load resolved versions from Cargo.lock in the given directory.\n * Returns an empty map if Cargo.lock is not available.\n *\n * Cargo.lock format uses [[package]] blocks:\n * ```\n * [[package]]\n * name = \"serde\"\n * version = \"1.0.193\"\n * ```\n */\nfunction loadResolvedVersions(manifestDir: string): ResolvedVersionMap {\n const map: ResolvedVersionMap = new Map();\n\n const lockPath = path.join(manifestDir, 'Cargo.lock');\n if (!fs.existsSync(lockPath)) {\n return map;\n }\n\n try {\n const lockContent = fs.readFileSync(lockPath, 'utf8');\n extractFromCargoLock(lockContent, map);\n } catch (err) {\n logWarn(`[sec:cargo] Failed to parse Cargo.lock: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n return map;\n}\n\n/**\n * Extract resolved versions from Cargo.lock content.\n *\n * Cargo.lock uses [[package]] blocks with name and version fields:\n * ```\n * [[package]]\n * name = \"serde\"\n * version = \"1.0.193\"\n * source = \"registry+https://github.com/rust-lang/crates.io-index\"\n * ```\n */\nfunction extractFromCargoLock(content: string, map: ResolvedVersionMap): void {\n const lines = content.split('\\n');\n let currentName: string | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // New package block\n if (trimmed === '[[package]]') {\n currentName = null;\n continue;\n }\n\n // Name field within a package block\n if (currentName === null) {\n const nameMatch = trimmed.match(/^name\\s*=\\s*\"([^\"]+)\"$/);\n if (nameMatch) {\n currentName = nameMatch[1];\n continue;\n }\n }\n\n // Version field within a package block (after name is set)\n if (currentName !== null) {\n const versionMatch = trimmed.match(/^version\\s*=\\s*\"([^\"]+)\"$/);\n if (versionMatch) {\n // Only store the first occurrence (highest version is typically last,\n // but Cargo.lock lists the resolved version for each unique instance)\n if (!map.has(currentName)) {\n map.set(currentName, versionMatch[1]);\n }\n currentName = null;\n continue;\n }\n }\n\n // Reset on empty line or new section\n if (trimmed === '' || trimmed.startsWith('[')) {\n currentName = null;\n }\n }\n}\n\n/**\n * Validate that a crate name follows Rust/Cargo naming conventions.\n * Crate names must be non-empty and contain only alphanumeric characters,\n * hyphens, or underscores.\n */\nfunction isValidCrateName(name: string): boolean {\n if (!name || typeof name !== 'string') return false;\n if (name.length > 64) return false;\n return /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name);\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Extract the license field from the [package] section of a Cargo.toml.\n * Handles: license = \"MIT\" or license = \"MIT OR Apache-2.0\"\n */\nfunction extractCargoLicense(content: string): string | undefined {\n // Find the [package] section\n const packageSectionMatch = /^\\[package\\]\\s*$/m.exec(content);\n if (!packageSectionMatch) return undefined;\n\n const startIdx = packageSectionMatch.index + packageSectionMatch[0].length;\n const remaining = content.slice(startIdx);\n // Grab content up to the next section header\n const nextSection = remaining.match(/^\\[/m);\n const sectionContent = nextSection ? remaining.slice(0, nextSection.index) : remaining;\n\n const licenseMatch = sectionContent.match(/^license\\s*=\\s*\"([^\"]+)\"/m);\n if (licenseMatch && licenseMatch[1].trim() !== '') {\n return licenseMatch[1].trim();\n }\n return undefined;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { ParsedDependency } from '../../types';
2
+ /**
3
+ * Parse a composer.json manifest and extract package declarations with
4
+ * version constraints, scopes, and resolved versions from composer.lock.
5
+ *
6
+ * @param manifestPath - Absolute path to the composer.json file
7
+ * @param projectRoot - Absolute path to the project root directory
8
+ * @returns Array of parsed dependencies with version and scope information
9
+ */
10
+ export declare function parseComposerManifest(manifestPath: string, projectRoot: string): Promise<ParsedDependency[]>;
11
+ //# sourceMappingURL=composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../../../src/security/manifest/plugins/composer.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AASpD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoE7B"}
@@ -0,0 +1,152 @@
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 __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var composer_exports = {};
30
+ __export(composer_exports, {
31
+ parseComposerManifest: () => parseComposerManifest
32
+ });
33
+ module.exports = __toCommonJS(composer_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ var import_errors = require("../../../errors");
37
+ async function parseComposerManifest(manifestPath, projectRoot) {
38
+ const manifestDir = path.dirname(manifestPath);
39
+ const relativeManifest = path.relative(projectRoot, manifestPath).replace(/\\/g, "/");
40
+ let content;
41
+ try {
42
+ content = fs.readFileSync(manifestPath, "utf8");
43
+ } catch (err) {
44
+ (0, import_errors.logWarn)(`[sec:composer] Failed to read ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);
45
+ return [];
46
+ }
47
+ let manifest;
48
+ try {
49
+ manifest = JSON.parse(content);
50
+ } catch (err) {
51
+ (0, import_errors.logWarn)(`[sec:composer] Failed to parse JSON in ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);
52
+ return [];
53
+ }
54
+ const resolvedVersions = loadResolvedVersions(manifestDir);
55
+ const license = extractComposerLicense(manifest);
56
+ const dependencies = [];
57
+ const sections = [
58
+ { key: "require", scope: "production" },
59
+ { key: "require-dev", scope: "development" }
60
+ ];
61
+ for (const { key, scope } of sections) {
62
+ const section = manifest[key];
63
+ if (!section || typeof section !== "object" || Array.isArray(section)) continue;
64
+ for (const [pkgName, versionConstraint] of Object.entries(section)) {
65
+ if (shouldSkipEntry(pkgName)) continue;
66
+ if (typeof versionConstraint !== "string") {
67
+ (0, import_errors.logWarn)(`[sec:composer] Non-string version for "${pkgName}" in ${relativeManifest} \u2014 skipping`);
68
+ continue;
69
+ }
70
+ if (!isValidPackageName(pkgName)) {
71
+ (0, import_errors.logWarn)(`[sec:composer] Invalid package name "${pkgName}" in ${relativeManifest} \u2014 skipping`);
72
+ continue;
73
+ }
74
+ const resolvedVersion = resolvedVersions.get(pkgName.toLowerCase());
75
+ dependencies.push({
76
+ name: pkgName,
77
+ declaredConstraint: versionConstraint,
78
+ resolvedVersion,
79
+ scope,
80
+ ecosystem: "composer",
81
+ sourceManifest: relativeManifest,
82
+ ...license !== void 0 ? { license } : {}
83
+ });
84
+ }
85
+ }
86
+ return dependencies;
87
+ }
88
+ function shouldSkipEntry(name) {
89
+ if (name === "php") return true;
90
+ if (name.startsWith("ext-")) return true;
91
+ if (name === "platform") return true;
92
+ return false;
93
+ }
94
+ function isValidPackageName(name) {
95
+ if (!name || typeof name !== "string") return false;
96
+ if (name.length > 255) return false;
97
+ return /^[a-z0-9]([a-z0-9_.-]*\/[a-z0-9][a-z0-9_.-]*)$/.test(name);
98
+ }
99
+ function loadResolvedVersions(manifestDir) {
100
+ const map = /* @__PURE__ */ new Map();
101
+ const lockPath = path.join(manifestDir, "composer.lock");
102
+ if (!fs.existsSync(lockPath)) {
103
+ return map;
104
+ }
105
+ try {
106
+ const lockContent = fs.readFileSync(lockPath, "utf8");
107
+ extractFromComposerLock(lockContent, map);
108
+ } catch (err) {
109
+ (0, import_errors.logWarn)(`[sec:composer] Failed to parse composer.lock: ${err instanceof Error ? err.message : String(err)}`);
110
+ }
111
+ return map;
112
+ }
113
+ function extractFromComposerLock(content, map) {
114
+ let lockData;
115
+ try {
116
+ lockData = JSON.parse(content);
117
+ } catch {
118
+ (0, import_errors.logWarn)("[sec:composer] composer.lock is not valid JSON \u2014 resolved versions unavailable");
119
+ return;
120
+ }
121
+ const arrays = [lockData["packages"], lockData["packages-dev"]];
122
+ for (const arr of arrays) {
123
+ if (!Array.isArray(arr)) continue;
124
+ for (const entry of arr) {
125
+ if (!entry || typeof entry !== "object") continue;
126
+ const pkg = entry;
127
+ const name = typeof pkg["name"] === "string" ? pkg["name"].toLowerCase() : null;
128
+ const version = typeof pkg["version"] === "string" ? pkg["version"] : null;
129
+ if (name && version) {
130
+ const normalised = version.startsWith("v") ? version.slice(1) : version;
131
+ if (!map.has(name)) {
132
+ map.set(name, normalised);
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ function extractComposerLicense(manifest) {
139
+ const raw = manifest["license"];
140
+ if (typeof raw === "string" && raw.trim() !== "") {
141
+ return raw.trim();
142
+ }
143
+ if (Array.isArray(raw) && raw.length > 0 && typeof raw[0] === "string") {
144
+ return raw.join(" OR ");
145
+ }
146
+ return void 0;
147
+ }
148
+ // Annotate the CommonJS export names for ESM import in node:
149
+ 0 && (module.exports = {
150
+ parseComposerManifest
151
+ });
152
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/security/manifest/plugins/composer.ts"],
4
+ "sourcesContent": ["/**\n * Composer Version Extraction Plugin for KiroGraph-Sec\n *\n * Parses composer.json manifests to extract PHP package declarations with\n * version constraints, scopes, and resolved versions from composer.lock.\n *\n * Handles:\n * - `require` section \u2192 'production' scope\n * - `require-dev` section \u2192 'development' scope\n * - Skips `php`, `ext-*`, and `platform` entries (not installable packages)\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ParsedDependency } from '../../types';\nimport { logWarn } from '../../../errors';\n\n/**\n * Resolved version map: package name \u2192 resolved version string.\n * Built from composer.lock.\n */\ntype ResolvedVersionMap = Map<string, string>;\n\n/**\n * Parse a composer.json manifest and extract package declarations with\n * version constraints, scopes, and resolved versions from composer.lock.\n *\n * @param manifestPath - Absolute path to the composer.json file\n * @param projectRoot - Absolute path to the project root directory\n * @returns Array of parsed dependencies with version and scope information\n */\nexport async function parseComposerManifest(\n manifestPath: string,\n projectRoot: string,\n): Promise<ParsedDependency[]> {\n const manifestDir = path.dirname(manifestPath);\n const relativeManifest = path.relative(projectRoot, manifestPath).replace(/\\\\/g, '/');\n\n // Read the composer.json content\n let content: string;\n try {\n content = fs.readFileSync(manifestPath, 'utf8');\n } catch (err) {\n logWarn(`[sec:composer] Failed to read ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);\n return [];\n }\n\n // Parse JSON\n let manifest: Record<string, unknown>;\n try {\n manifest = JSON.parse(content) as Record<string, unknown>;\n } catch (err) {\n logWarn(`[sec:composer] Failed to parse JSON in ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);\n return [];\n }\n\n // Attempt to load resolved versions from composer.lock\n const resolvedVersions = loadResolvedVersions(manifestDir);\n\n // Extract the project-level license\n const license = extractComposerLicense(manifest);\n\n const dependencies: ParsedDependency[] = [];\n\n // Process `require` (production) and `require-dev` (development) sections\n const sections: Array<{ key: string; scope: ParsedDependency['scope'] }> = [\n { key: 'require', scope: 'production' },\n { key: 'require-dev', scope: 'development' },\n ];\n\n for (const { key, scope } of sections) {\n const section = manifest[key];\n if (!section || typeof section !== 'object' || Array.isArray(section)) continue;\n\n for (const [pkgName, versionConstraint] of Object.entries(section as Record<string, unknown>)) {\n // Skip PHP runtime and extensions\n if (shouldSkipEntry(pkgName)) continue;\n\n if (typeof versionConstraint !== 'string') {\n logWarn(`[sec:composer] Non-string version for \"${pkgName}\" in ${relativeManifest} \u2014 skipping`);\n continue;\n }\n\n if (!isValidPackageName(pkgName)) {\n logWarn(`[sec:composer] Invalid package name \"${pkgName}\" in ${relativeManifest} \u2014 skipping`);\n continue;\n }\n\n const resolvedVersion = resolvedVersions.get(pkgName.toLowerCase());\n dependencies.push({\n name: pkgName,\n declaredConstraint: versionConstraint,\n resolvedVersion,\n scope,\n ecosystem: 'composer',\n sourceManifest: relativeManifest,\n ...(license !== undefined ? { license } : {}),\n });\n }\n }\n\n return dependencies;\n}\n\n/**\n * Determine whether a composer.json key should be skipped.\n * Skips `php`, `ext-*`, and `platform` entries.\n */\nfunction shouldSkipEntry(name: string): boolean {\n if (name === 'php') return true;\n if (name.startsWith('ext-')) return true;\n if (name === 'platform') return true;\n return false;\n}\n\n/**\n * Validate that a Composer package name follows the `vendor/package` convention.\n * Also accepts bare names for legacy packages, but rejects obviously invalid entries.\n */\nfunction isValidPackageName(name: string): boolean {\n if (!name || typeof name !== 'string') return false;\n if (name.length > 255) return false;\n // Composer names must be vendor/package (lowercase, hyphens, digits allowed)\n return /^[a-z0-9]([a-z0-9_.-]*\\/[a-z0-9][a-z0-9_.-]*)$/.test(name);\n}\n\n/**\n * Attempt to load resolved versions from composer.lock in the given directory.\n * Returns an empty map if composer.lock is not available.\n *\n * composer.lock format (JSON):\n * ```json\n * {\n * \"packages\": [{ \"name\": \"vendor/package\", \"version\": \"1.2.3\" }],\n * \"packages-dev\": [{ \"name\": \"vendor/dev-package\", \"version\": \"v2.0.0\" }]\n * }\n * ```\n * Version strings may be prefixed with `v` \u2014 these are stripped.\n */\nfunction loadResolvedVersions(manifestDir: string): ResolvedVersionMap {\n const map: ResolvedVersionMap = new Map();\n\n const lockPath = path.join(manifestDir, 'composer.lock');\n if (!fs.existsSync(lockPath)) {\n return map;\n }\n\n try {\n const lockContent = fs.readFileSync(lockPath, 'utf8');\n extractFromComposerLock(lockContent, map);\n } catch (err) {\n logWarn(`[sec:composer] Failed to parse composer.lock: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n return map;\n}\n\n/**\n * Extract resolved versions from composer.lock content.\n *\n * Reads both `packages` (production) and `packages-dev` arrays.\n * Normalises version strings by stripping a leading `v`.\n */\nfunction extractFromComposerLock(content: string, map: ResolvedVersionMap): void {\n let lockData: Record<string, unknown>;\n try {\n lockData = JSON.parse(content) as Record<string, unknown>;\n } catch {\n logWarn('[sec:composer] composer.lock is not valid JSON \u2014 resolved versions unavailable');\n return;\n }\n\n const arrays = [lockData['packages'], lockData['packages-dev']];\n for (const arr of arrays) {\n if (!Array.isArray(arr)) continue;\n for (const entry of arr) {\n if (!entry || typeof entry !== 'object') continue;\n const pkg = entry as Record<string, unknown>;\n const name = typeof pkg['name'] === 'string' ? pkg['name'].toLowerCase() : null;\n const version = typeof pkg['version'] === 'string' ? pkg['version'] : null;\n if (name && version) {\n // Strip leading `v` from version strings (e.g. \"v1.2.3\" \u2192 \"1.2.3\")\n const normalised = version.startsWith('v') ? version.slice(1) : version;\n if (!map.has(name)) {\n map.set(name, normalised);\n }\n }\n }\n }\n}\n\n/**\n * Extract the license field from a parsed composer.json manifest.\n * The \"license\" field can be a string or an array of strings (SPDX).\n */\nfunction extractComposerLicense(manifest: Record<string, unknown>): string | undefined {\n const raw = manifest['license'];\n if (typeof raw === 'string' && raw.trim() !== '') {\n return raw.trim();\n }\n if (Array.isArray(raw) && raw.length > 0 && typeof raw[0] === 'string') {\n return (raw as string[]).join(' OR ');\n }\n return undefined;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ import type { ParsedDependency } from '../../types';
2
+ /**
3
+ * Parse a go.mod manifest and extract dependency declarations with version
4
+ * information. In Go modules, the version declared in go.mod is the resolved
5
+ * version (pinned), so declaredConstraint and resolvedVersion are the same.
6
+ *
7
+ * @param manifestPath - Absolute path to the go.mod file
8
+ * @param projectRoot - Absolute path to the project root directory
9
+ * @returns Array of parsed dependencies with version information
10
+ */
11
+ export declare function parseGoManifest(manifestPath: string, projectRoot: string): Promise<ParsedDependency[]>;
12
+ //# sourceMappingURL=go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../../src/security/manifest/plugins/go.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0C7B"}
@@ -0,0 +1,146 @@
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 __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var go_exports = {};
30
+ __export(go_exports, {
31
+ parseGoManifest: () => parseGoManifest
32
+ });
33
+ module.exports = __toCommonJS(go_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ var import_errors = require("../../../errors");
37
+ async function parseGoManifest(manifestPath, projectRoot) {
38
+ const manifestDir = path.dirname(manifestPath);
39
+ const relativeManifest = path.relative(projectRoot, manifestPath).replace(/\\/g, "/");
40
+ let content;
41
+ try {
42
+ content = fs.readFileSync(manifestPath, "utf8");
43
+ } catch (err) {
44
+ (0, import_errors.logWarn)(`[sec:go] Failed to read ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);
45
+ return [];
46
+ }
47
+ const goSumHashes = loadGoSumHashes(manifestDir);
48
+ const dependencies = [];
49
+ const requireBlockRegex = /require\s*\(([^)]*)\)/gs;
50
+ let blockMatch;
51
+ while ((blockMatch = requireBlockRegex.exec(content)) !== null) {
52
+ const blockContent = blockMatch[1];
53
+ parseRequireLines(blockContent, relativeManifest, goSumHashes, dependencies);
54
+ }
55
+ const lines = content.split("\n");
56
+ for (const line of lines) {
57
+ const trimmed = line.trim();
58
+ const singleRequireMatch = trimmed.match(/^require\s+(\S+)\s+(\S+)/);
59
+ if (singleRequireMatch) {
60
+ const modulePath = singleRequireMatch[1];
61
+ const version = singleRequireMatch[2];
62
+ addDependency(modulePath, version, relativeManifest, goSumHashes, dependencies);
63
+ }
64
+ }
65
+ return dependencies;
66
+ }
67
+ function parseRequireLines(blockContent, relativeManifest, goSumHashes, dependencies) {
68
+ const lines = blockContent.split("\n");
69
+ for (const line of lines) {
70
+ const trimmed = line.trim();
71
+ if (!trimmed || trimmed.startsWith("//")) continue;
72
+ const match = trimmed.match(/^(\S+)\s+(\S+)/);
73
+ if (match) {
74
+ const modulePath = match[1];
75
+ const version = match[2];
76
+ if (modulePath.startsWith("//")) continue;
77
+ addDependency(modulePath, version, relativeManifest, goSumHashes, dependencies);
78
+ }
79
+ }
80
+ }
81
+ function addDependency(modulePath, version, relativeManifest, goSumHashes, dependencies) {
82
+ if (!isValidGoModulePath(modulePath)) {
83
+ (0, import_errors.logWarn)(`[sec:go] Invalid module path "${modulePath}" in ${relativeManifest} \u2014 skipping`);
84
+ return;
85
+ }
86
+ if (!isValidGoVersion(version)) {
87
+ (0, import_errors.logWarn)(`[sec:go] Invalid version "${version}" for module "${modulePath}" in ${relativeManifest} \u2014 skipping`);
88
+ return;
89
+ }
90
+ const hasIntegrity = goSumHashes.has(`${modulePath}@${version}`);
91
+ dependencies.push({
92
+ name: modulePath,
93
+ declaredConstraint: version,
94
+ resolvedVersion: version,
95
+ scope: "production",
96
+ // Go doesn't have dev dependencies in go.mod
97
+ ecosystem: "go",
98
+ sourceManifest: relativeManifest
99
+ });
100
+ }
101
+ function loadGoSumHashes(manifestDir) {
102
+ const map = /* @__PURE__ */ new Map();
103
+ const goSumPath = path.join(manifestDir, "go.sum");
104
+ if (!fs.existsSync(goSumPath)) {
105
+ return map;
106
+ }
107
+ try {
108
+ const content = fs.readFileSync(goSumPath, "utf8");
109
+ const lines = content.split("\n");
110
+ for (const line of lines) {
111
+ const trimmed = line.trim();
112
+ if (!trimmed) continue;
113
+ const parts = trimmed.split(/\s+/);
114
+ if (parts.length >= 3) {
115
+ const modulePath = parts[0];
116
+ let version = parts[1];
117
+ version = version.replace(/\/go\.mod$/, "");
118
+ map.set(`${modulePath}@${version}`, true);
119
+ }
120
+ }
121
+ } catch (err) {
122
+ (0, import_errors.logWarn)(`[sec:go] Failed to read go.sum: ${err instanceof Error ? err.message : String(err)}`);
123
+ }
124
+ return map;
125
+ }
126
+ function isValidGoModulePath(modulePath) {
127
+ if (!modulePath || typeof modulePath !== "string") return false;
128
+ if (modulePath.includes(" ") || modulePath.includes(" ")) return false;
129
+ const firstSlash = modulePath.indexOf("/");
130
+ const firstElement = firstSlash === -1 ? modulePath : modulePath.slice(0, firstSlash);
131
+ if (!firstElement.includes(".")) return false;
132
+ return true;
133
+ }
134
+ function isValidGoVersion(version) {
135
+ if (!version || typeof version !== "string") return false;
136
+ if (!version.startsWith("v")) return false;
137
+ const versionBody = version.slice(1);
138
+ if (!versionBody) return false;
139
+ const semverPattern = /^\d+\.\d+\.\d+/;
140
+ return semverPattern.test(versionBody);
141
+ }
142
+ // Annotate the CommonJS export names for ESM import in node:
143
+ 0 && (module.exports = {
144
+ parseGoManifest
145
+ });
146
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/security/manifest/plugins/go.ts"],
4
+ "sourcesContent": ["/**\n * Go Version Extraction Plugin for KiroGraph-Sec\n *\n * Extends the existing architecture go parser to extract version constraints\n * and resolved versions from go.mod and go.sum for security analysis.\n *\n * Reuses `goParser` from `src/architecture/manifest/go.ts` for discovery and\n * basic parsing, then layers on version extraction.\n *\n * In Go modules, the version in go.mod IS the resolved version (go.mod is\n * effectively a lock file). go.sum provides integrity hashes but the version\n * source of truth is go.mod itself. All Go dependencies are scope \"production\"\n * since Go doesn't have dev dependencies in go.mod.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ParsedDependency } from '../../types';\nimport { logWarn } from '../../../errors';\n\n/**\n * Parse a go.mod manifest and extract dependency declarations with version\n * information. In Go modules, the version declared in go.mod is the resolved\n * version (pinned), so declaredConstraint and resolvedVersion are the same.\n *\n * @param manifestPath - Absolute path to the go.mod file\n * @param projectRoot - Absolute path to the project root directory\n * @returns Array of parsed dependencies with version information\n */\nexport async function parseGoManifest(\n manifestPath: string,\n projectRoot: string,\n): Promise<ParsedDependency[]> {\n const manifestDir = path.dirname(manifestPath);\n const relativeManifest = path.relative(projectRoot, manifestPath).replace(/\\\\/g, '/');\n\n // Read go.mod content\n let content: string;\n try {\n content = fs.readFileSync(manifestPath, 'utf8');\n } catch (err) {\n logWarn(`[sec:go] Failed to read ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);\n return [];\n }\n\n // Load go.sum for integrity verification (optional)\n const goSumHashes = loadGoSumHashes(manifestDir);\n\n // Extract dependencies from require directives\n const dependencies: ParsedDependency[] = [];\n\n // Parse require block: require ( ... )\n const requireBlockRegex = /require\\s*\\(([^)]*)\\)/gs;\n let blockMatch: RegExpExecArray | null;\n while ((blockMatch = requireBlockRegex.exec(content)) !== null) {\n const blockContent = blockMatch[1];\n parseRequireLines(blockContent, relativeManifest, goSumHashes, dependencies);\n }\n\n // Parse single-line require directives: require module/path v1.2.3\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n // Skip lines inside require blocks (already handled above)\n // Match: require <module> <version>\n const singleRequireMatch = trimmed.match(/^require\\s+(\\S+)\\s+(\\S+)/);\n if (singleRequireMatch) {\n const modulePath = singleRequireMatch[1];\n const version = singleRequireMatch[2];\n addDependency(modulePath, version, relativeManifest, goSumHashes, dependencies);\n }\n }\n\n return dependencies;\n}\n\n/**\n * Parse lines within a require block and extract module paths and versions.\n */\nfunction parseRequireLines(\n blockContent: string,\n relativeManifest: string,\n goSumHashes: GoSumMap,\n dependencies: ParsedDependency[],\n): void {\n const lines = blockContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Skip empty lines and comments\n if (!trimmed || trimmed.startsWith('//')) continue;\n\n // Match: module/path v1.2.3 [// indirect]\n const match = trimmed.match(/^(\\S+)\\s+(\\S+)/);\n if (match) {\n const modulePath = match[1];\n const version = match[2];\n\n // Skip if the \"module path\" is actually a comment\n if (modulePath.startsWith('//')) continue;\n\n addDependency(modulePath, version, relativeManifest, goSumHashes, dependencies);\n }\n }\n}\n\n/**\n * Add a single dependency entry after validation.\n */\nfunction addDependency(\n modulePath: string,\n version: string,\n relativeManifest: string,\n goSumHashes: GoSumMap,\n dependencies: ParsedDependency[],\n): void {\n // Validate module path\n if (!isValidGoModulePath(modulePath)) {\n logWarn(`[sec:go] Invalid module path \"${modulePath}\" in ${relativeManifest} \u2014 skipping`);\n return;\n }\n\n // Validate version format (should start with 'v' for Go modules)\n if (!isValidGoVersion(version)) {\n logWarn(`[sec:go] Invalid version \"${version}\" for module \"${modulePath}\" in ${relativeManifest} \u2014 skipping`);\n return;\n }\n\n // Check if this module+version has integrity info in go.sum\n const hasIntegrity = goSumHashes.has(`${modulePath}@${version}`);\n\n // In Go, the version in go.mod is the resolved version\n // declaredConstraint and resolvedVersion are the same\n dependencies.push({\n name: modulePath,\n declaredConstraint: version,\n resolvedVersion: version,\n scope: 'production', // Go doesn't have dev dependencies in go.mod\n ecosystem: 'go',\n sourceManifest: relativeManifest,\n });\n}\n\n/**\n * Map of module@version \u2192 true, indicating presence in go.sum.\n * Used for integrity verification awareness.\n */\ntype GoSumMap = Map<string, boolean>;\n\n/**\n * Load go.sum hashes from the same directory as go.mod.\n * go.sum contains lines like:\n * module/path v1.2.3 h1:hash...\n * module/path v1.2.3/go.mod h1:hash...\n */\nfunction loadGoSumHashes(manifestDir: string): GoSumMap {\n const map: GoSumMap = new Map();\n const goSumPath = path.join(manifestDir, 'go.sum');\n\n if (!fs.existsSync(goSumPath)) {\n return map;\n }\n\n try {\n const content = fs.readFileSync(goSumPath, 'utf8');\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Format: module/path version hash\n // e.g.: github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqFPSKw=\n const parts = trimmed.split(/\\s+/);\n if (parts.length >= 3) {\n const modulePath = parts[0];\n let version = parts[1];\n // Strip /go.mod suffix from version if present\n version = version.replace(/\\/go\\.mod$/, '');\n map.set(`${modulePath}@${version}`, true);\n }\n }\n } catch (err) {\n logWarn(`[sec:go] Failed to read go.sum: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n return map;\n}\n\n/**\n * Validate a Go module path.\n * A valid module path must contain at least one dot in the first path element\n * (domain requirement) and consist of valid characters.\n */\nfunction isValidGoModulePath(modulePath: string): boolean {\n if (!modulePath || typeof modulePath !== 'string') return false;\n\n // Must not be empty or contain spaces\n if (modulePath.includes(' ') || modulePath.includes('\\t')) return false;\n\n // First path element must contain a dot (domain name requirement)\n const firstSlash = modulePath.indexOf('/');\n const firstElement = firstSlash === -1 ? modulePath : modulePath.slice(0, firstSlash);\n if (!firstElement.includes('.')) return false;\n\n return true;\n}\n\n/**\n * Validate a Go module version string.\n * Valid formats: v1.2.3, v0.0.0-timestamp-hash, v1.2.3-pre, v1.2.3+incompatible\n */\nfunction isValidGoVersion(version: string): boolean {\n if (!version || typeof version !== 'string') return false;\n\n // Must start with 'v'\n if (!version.startsWith('v')) return false;\n\n // Basic semver-like check after 'v': at minimum \"vX.Y.Z\" or pseudo-version\n const versionBody = version.slice(1);\n if (!versionBody) return false;\n\n // Allow semver, pseudo-versions, and +incompatible suffix\n // Pseudo-version format: v0.0.0-20230101120000-abcdef123456\n const semverPattern = /^\\d+\\.\\d+\\.\\d+/;\n return semverPattern.test(versionBody);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ import type { ParsedDependency } from '../../types';
2
+ /**
3
+ * Parse a Gradle build script (`build.gradle` or `build.gradle.kts`) and extract
4
+ * dependency declarations with version constraints, scopes, and resolved versions
5
+ * from `gradle.lockfile`.
6
+ *
7
+ * @param manifestPath - Absolute path to the build.gradle or build.gradle.kts file
8
+ * @param projectRoot - Absolute path to the project root directory
9
+ * @returns Array of parsed dependencies with version and scope information
10
+ */
11
+ export declare function parseGradleManifest(manifestPath: string, projectRoot: string): Promise<ParsedDependency[]>;
12
+ //# sourceMappingURL=gradle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradle.d.ts","sourceRoot":"","sources":["../../../../src/security/manifest/plugins/gradle.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA0CpD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmD7B"}
@@ -0,0 +1,159 @@
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 __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var gradle_exports = {};
30
+ __export(gradle_exports, {
31
+ parseGradleManifest: () => parseGradleManifest
32
+ });
33
+ module.exports = __toCommonJS(gradle_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ var import_errors = require("../../../errors");
37
+ const TEST_CONFIGURATIONS = /* @__PURE__ */ new Set([
38
+ "testimplementation",
39
+ "testapi",
40
+ "testcompile",
41
+ "testruntimeonly",
42
+ "androidtestimplementation",
43
+ "androidtestapi"
44
+ ]);
45
+ const KNOWN_CONFIGURATIONS = [
46
+ "androidTestImplementation",
47
+ "androidTestApi",
48
+ "debugImplementation",
49
+ "releaseImplementation",
50
+ "testImplementation",
51
+ "testRuntimeOnly",
52
+ "testCompile",
53
+ "testApi",
54
+ "implementation",
55
+ "runtimeOnly",
56
+ "compileOnly",
57
+ "compile",
58
+ "api"
59
+ ];
60
+ async function parseGradleManifest(manifestPath, projectRoot) {
61
+ const manifestDir = path.dirname(manifestPath);
62
+ const relativeManifest = path.relative(projectRoot, manifestPath).replace(/\\/g, "/");
63
+ let content;
64
+ try {
65
+ content = fs.readFileSync(manifestPath, "utf8");
66
+ } catch (err) {
67
+ (0, import_errors.logWarn)(`[sec:gradle] Failed to read ${relativeManifest}: ${err instanceof Error ? err.message : String(err)}`);
68
+ return [];
69
+ }
70
+ const resolvedVersions = loadResolvedVersions(manifestDir);
71
+ const dependencies = [];
72
+ const configPattern = KNOWN_CONFIGURATIONS.map((c) => escapeRegex(c)).join("|");
73
+ const depRegex = new RegExp(
74
+ `^\\s*(${configPattern})\\s*\\(?\\s*["']([^"']+)["']\\s*\\)?`,
75
+ "gmi"
76
+ );
77
+ let match;
78
+ while ((match = depRegex.exec(content)) !== null) {
79
+ const configuration = match[1];
80
+ const notation = match[2].trim();
81
+ const dep = parseGradleNotation(notation, configuration, relativeManifest);
82
+ if (!dep) continue;
83
+ const lookupKey = `${dep.group}:${dep.artifact}`.toLowerCase();
84
+ const resolvedVersion = resolvedVersions.get(lookupKey);
85
+ dependencies.push({
86
+ name: `${dep.group}:${dep.artifact}`,
87
+ declaredConstraint: dep.version,
88
+ resolvedVersion,
89
+ scope: resolveScope(configuration),
90
+ ecosystem: "gradle",
91
+ sourceManifest: relativeManifest
92
+ });
93
+ }
94
+ return dependencies;
95
+ }
96
+ function parseGradleNotation(notation, configuration, relativeManifest) {
97
+ if (notation.startsWith("libs.") || notation.startsWith("libs(")) {
98
+ return null;
99
+ }
100
+ const parts = notation.split(":");
101
+ if (parts.length < 2) {
102
+ return null;
103
+ }
104
+ const group = parts[0].trim();
105
+ const artifact = parts[1].trim();
106
+ const version = parts.length >= 3 ? parts[2].trim() : "";
107
+ if (!group || !artifact) {
108
+ (0, import_errors.logWarn)(`[sec:gradle] Empty group or artifact in notation "${notation}" (${configuration}) at ${relativeManifest} \u2014 skipping`);
109
+ return null;
110
+ }
111
+ const normalizedVersion = version === "" || version === "+" || version.toLowerCase() === "latest.release" ? "*" : version;
112
+ return { group, artifact, version: normalizedVersion };
113
+ }
114
+ function resolveScope(configuration) {
115
+ return TEST_CONFIGURATIONS.has(configuration.toLowerCase()) ? "development" : "production";
116
+ }
117
+ function loadResolvedVersions(manifestDir) {
118
+ const map = /* @__PURE__ */ new Map();
119
+ const lockPath = path.join(manifestDir, "gradle.lockfile");
120
+ if (!fs.existsSync(lockPath)) {
121
+ return map;
122
+ }
123
+ try {
124
+ const content = fs.readFileSync(lockPath, "utf8");
125
+ extractFromGradleLockfile(content, map);
126
+ } catch (err) {
127
+ (0, import_errors.logWarn)(`[sec:gradle] Failed to parse gradle.lockfile: ${err instanceof Error ? err.message : String(err)}`);
128
+ }
129
+ return map;
130
+ }
131
+ function extractFromGradleLockfile(content, map) {
132
+ const lines = content.split("\n");
133
+ for (const line of lines) {
134
+ const trimmed = line.trim();
135
+ if (trimmed === "" || trimmed.startsWith("#")) continue;
136
+ if (trimmed === "empty=") continue;
137
+ const eqIndex = trimmed.indexOf("=");
138
+ if (eqIndex === -1) continue;
139
+ const coordinate = trimmed.slice(0, eqIndex).trim();
140
+ const parts = coordinate.split(":");
141
+ if (parts.length < 3) continue;
142
+ const group = parts[0].trim();
143
+ const artifact = parts[1].trim();
144
+ const version = parts[2].trim();
145
+ if (!group || !artifact || !version) continue;
146
+ const key = `${group}:${artifact}`.toLowerCase();
147
+ if (!map.has(key)) {
148
+ map.set(key, version);
149
+ }
150
+ }
151
+ }
152
+ function escapeRegex(str) {
153
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
154
+ }
155
+ // Annotate the CommonJS export names for ESM import in node:
156
+ 0 && (module.exports = {
157
+ parseGradleManifest
158
+ });
159
+ //# sourceMappingURL=gradle.js.map