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/bin/commands/security-secrets.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold } from '../ui';\n\n// \u2500\u2500 Severity helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SEVERITY_ORDER: Record<string, number> = { critical: 0, high: 1, medium: 2, low: 3 };\n\nfunction severityColor(severity: string): string {\n switch (severity) {\n case 'critical': return '\\x1b[31m';\n case 'high': return '\\x1b[31m';\n case 'medium': return '\\x1b[33m';\n default: return dim;\n }\n}\n\nfunction severityLabel(severity: string): string {\n return severity.toUpperCase().padEnd(8);\n}\n\nfunction fixSuggestion(type: string): string {\n if (type.includes('AWS')) return 'Rotate this key immediately and use environment variables or AWS IAM roles';\n if (type.includes('GitHub')) return 'Revoke this token immediately and use GitHub Actions secrets or a vault';\n if (type.includes('Stripe')) return 'Rotate via the Stripe dashboard and store in environment variables';\n if (type.includes('SendGrid')) return 'Revoke via SendGrid settings and store in environment variables';\n if (type.includes('Twilio')) return 'Rotate via the Twilio console and store in environment variables';\n if (type.includes('Slack')) return 'Revoke via Slack app settings and store in environment variables';\n if (type.includes('Private Key')) return 'Remove from source control immediately; generate a new key pair';\n if (type.includes('JWT')) return 'Replace with a runtime-generated token; never hardcode JWTs in source';\n if (type.includes('Database URL')) return 'Move credentials to environment variables or a secrets manager';\n if (type.includes('API Key')) return 'Rotate this key and store it in environment variables or a vault';\n return 'Rotate this credential and store it in environment variables or a secrets manager';\n}\n\n// \u2500\u2500 Command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function register(program: Command): void {\n program\n .command('secrets [projectPath]')\n .description('Scan source files for hardcoded secrets and credentials')\n .option('--include-tests', 'Include test files in the scan')\n .option('--severity <level>', 'Filter by severity: critical, high, medium, low')\n .option('--format <fmt>', 'Output format: text (default), json')\n .action(async (\n projectPath: string | undefined,\n opts: { includeTests?: boolean; severity?: string; format?: string },\n ) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n // Validate --severity early\n const validSeverities = ['critical', 'high', 'medium', 'low'];\n if (opts.severity && !validSeverities.includes(opts.severity.toLowerCase())) {\n console.error(` \u2716 Invalid --severity value: ${opts.severity}. Use: critical, high, medium, low`);\n process.exit(1);\n }\n\n // Validate --format early\n const validFormats = ['text', 'json'];\n if (opts.format && !validFormats.includes(opts.format.toLowerCase())) {\n console.error(` \u2716 Invalid --format value: ${opts.format}. Use: text, json`);\n process.exit(1);\n }\n\n if (!config.enableSecurity) {\n console.error(`\\n ${'\\x1b[33m'}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n if (!config.enableArchitecture) {\n console.error(`\\n ${'\\x1b[33m'}\u26A0 Secrets scan requires Architecture analysis to be enabled.${reset}`);\n console.error(` ${dim}Enable both in .kirograph/config.json:${reset}`);\n console.error(` ${violet}${bold}\"enableArchitecture\": true${reset}`);\n console.error(` ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { SecretsScanner } = await Promise.resolve().then(() => require('../../security/secrets.js'));\n const scanner = new SecretsScanner(db, target);\n const result = await scanner.scan({ includeTests: opts.includeTests });\n\n // Apply severity filter\n let findings = result.findings;\n if (opts.severity) {\n const minSeverity = opts.severity.toLowerCase();\n const minOrder = SEVERITY_ORDER[minSeverity] ?? 3;\n findings = findings.filter(f => (SEVERITY_ORDER[f.severity] ?? 3) <= minOrder);\n }\n\n // \u2500\u2500 JSON output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n if (opts.format === 'json') {\n process.stdout.write(JSON.stringify({\n filesScanned: result.filesScanned,\n totalFindings: findings.length,\n criticalCount: findings.filter(f => f.severity === 'critical').length,\n highCount: findings.filter(f => f.severity === 'high').length,\n findings,\n }, null, 2) + '\\n');\n cg.close();\n return;\n }\n\n // \u2500\u2500 Text output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const filterNote = opts.severity ? ` \u00B7 filtered to ${opts.severity}+` : '';\n console.log(`\\n ${violet}${bold}\uD83D\uDD11 Secrets Scan${reset} ${dim}(${findings.length} finding${findings.length === 1 ? '' : 's'} in ${result.filesScanned} files${filterNote})${reset}\\n`);\n\n if (findings.length === 0) {\n console.log(` ${dim}No secrets found.${reset}\\n`);\n cg.close();\n return;\n }\n\n for (const finding of findings) {\n const color = severityColor(finding.severity);\n const label = severityLabel(finding.severity);\n\n // Relative path for display\n const relPath = path.relative(target, finding.filePath);\n const location = `${relPath}:${finding.line}`;\n\n // Header line: severity + type + location\n console.log(` ${color}${bold}${label}${reset} ${violet}${bold}${finding.type}${reset} ${dim}${location}${reset}`);\n\n // Detail line: snippet \u00B7 function \u00B7 blast radius\n const snippetPart = `${dim}${finding.snippet}${reset}`;\n const funcPart = finding.nodeName\n ? ` \u00B7 ${dim}in${reset} ${violet}${finding.nodeName}()${reset}`\n : '';\n const reachabilityPart = finding.entryPointCount > 0\n ? ` \u00B7 ${'\\x1b[33m'}reachable from ${bold}${finding.entryPointCount}${reset}${'\\x1b[33m'} entry point${finding.entryPointCount === 1 ? '' : 's'}${reset}`\n : '';\n\n console.log(` ${snippetPart}${funcPart}${reachabilityPart}`);\n\n // Fix suggestion\n const suggestion = fixSuggestion(finding.type);\n console.log(` ${dim}\uD83D\uDCA1 ${suggestion}${reset}`);\n\n console.log();\n }\n\n // Summary line when multiple severities present\n if (findings.length > 1) {\n const crit = findings.filter(f => f.severity === 'critical').length;\n const high = findings.filter(f => f.severity === 'high').length;\n const med = findings.filter(f => f.severity === 'medium').length;\n const low = findings.filter(f => f.severity === 'low').length;\n\n const parts: string[] = [];\n if (crit > 0) parts.push(`${'\\x1b[31m'}${bold}${crit} critical${reset}`);\n if (high > 0) parts.push(`${'\\x1b[31m'}${bold}${high} high${reset}`);\n if (med > 0) parts.push(`${'\\x1b[33m'}${bold}${med} medium${reset}`);\n if (low > 0) parts.push(`${dim}${bold}${low} low${reset}`);\n\n console.log(` ${dim}Total:${reset} ${parts.join(`${dim}, ${reset}`)}\\n`);\n }\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function register(program: Command): Command;
3
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAiMlD"}
@@ -0,0 +1,208 @@
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 security_exports = {};
30
+ __export(security_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(security_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ function register(program) {
38
+ const secCmd = program.command("security").description("Security analysis: overview, dashboard export, and vulnerability management").argument("[projectPath]", "Project root path (optional)").option("--refresh-staleness", "Fetch latest version info from registries and show stale dependency count").option("--fail-on <condition>", "Exit 1 if condition is met. Supported: affected").action(async (projectPath, opts) => {
39
+ const target = path.resolve(projectPath ?? process.cwd());
40
+ const config = await (0, import_config.loadConfig)(target);
41
+ if (!config.enableSecurity) {
42
+ console.error(`
43
+ ${"\x1B[33m"}\u26A0 Security analysis is disabled.${import_ui.reset}`);
44
+ console.error(` ${import_ui.dim}Enable it in .kirograph/config.json:${import_ui.reset} ${import_ui.violet}${import_ui.bold}"enableSecurity": true${import_ui.reset}`);
45
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
46
+ `);
47
+ process.exit(1);
48
+ }
49
+ if (!config.enableArchitecture) {
50
+ console.error(`
51
+ ${"\x1B[33m"}\u26A0 Security requires Architecture analysis to be enabled.${import_ui.reset}`);
52
+ console.error(` ${import_ui.dim}Enable both in .kirograph/config.json:${import_ui.reset}`);
53
+ console.error(` ${import_ui.violet}${import_ui.bold}"enableArchitecture": true${import_ui.reset}`);
54
+ console.error(` ${import_ui.violet}${import_ui.bold}"enableSecurity": true${import_ui.reset}`);
55
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
56
+ `);
57
+ process.exit(1);
58
+ }
59
+ if (opts.failOn !== void 0 && opts.failOn !== "affected") {
60
+ console.error(` \u2716 Invalid --fail-on value: ${opts.failOn}. Supported: affected`);
61
+ process.exit(1);
62
+ }
63
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
64
+ if (!KiroGraph.isInitialized(target)) {
65
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
66
+ process.exit(1);
67
+ }
68
+ const cg = await KiroGraph.open(target);
69
+ const db = cg.getDatabase();
70
+ db.applySecuritySchema();
71
+ const rawDb = db.getRawDb();
72
+ if (opts.refreshStaleness) {
73
+ console.error(` ${import_ui.dim}Fetching latest version info from package registries...${import_ui.reset}`);
74
+ const { StalenessChecker } = await Promise.resolve().then(() => require("../../security/staleness.js"));
75
+ const checker = new StalenessChecker(db);
76
+ const result = await checker.checkAll();
77
+ console.error(` ${import_ui.green}\u2713${import_ui.reset} Checked ${import_ui.bold}${result.checked}${import_ui.reset} packages, ${import_ui.bold}${result.stale}${import_ui.reset} stale`);
78
+ if (result.errors.length > 0) {
79
+ console.error(` ${"\x1B[33m"}\u26A0${import_ui.reset} ${result.errors.length} error(s) during registry fetch`);
80
+ }
81
+ console.error();
82
+ }
83
+ const depCount = rawDb.get(
84
+ `SELECT COUNT(*) as count FROM sec_dependencies`
85
+ ) ?? { count: 0 };
86
+ const vulnCount = rawDb.get(
87
+ `SELECT COUNT(*) as count FROM sec_vulnerabilities`
88
+ ) ?? { count: 0 };
89
+ const verdictRows = rawDb.all(
90
+ `SELECT verdict, COUNT(*) as count FROM sec_reachability GROUP BY verdict`
91
+ );
92
+ const verdicts = {};
93
+ for (const row of verdictRows) {
94
+ verdicts[row.verdict] = row.count;
95
+ }
96
+ const staleCount = rawDb.get(
97
+ `SELECT COUNT(*) as count FROM sec_dependencies WHERE vuln_data_stale = 1`
98
+ ) ?? { count: 0 };
99
+ console.log(`
100
+ ${(0, import_ui.section)("Security Overview")}
101
+ `);
102
+ console.log(` ${import_ui.dim}Dependencies:${import_ui.reset} ${import_ui.violet}${import_ui.bold}${depCount.count}${import_ui.reset}`);
103
+ console.log(` ${import_ui.dim}Vulnerabilities:${import_ui.reset} ${import_ui.violet}${import_ui.bold}${vulnCount.count}${import_ui.reset}`);
104
+ console.log();
105
+ if (vulnCount.count > 0) {
106
+ const topCVE = rawDb.get(
107
+ `SELECT v.cve_id, v.risk_score, d.package_name
108
+ FROM sec_vulnerabilities v
109
+ LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'
110
+ LEFT JOIN sec_dependencies d ON d.node_id = e.source
111
+ LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id
112
+ WHERE r.verdict = 'affected' AND v.risk_score IS NOT NULL
113
+ ORDER BY v.risk_score DESC NULLS LAST
114
+ LIMIT 1`
115
+ );
116
+ if (topCVE && topCVE.risk_score != null) {
117
+ const riskColor = topCVE.risk_score >= 7 ? "\x1B[31m" : topCVE.risk_score >= 4 ? "\x1B[33m" : import_ui.dim;
118
+ const pkgLabel = topCVE.package_name ? ` in ${import_ui.dim}${topCVE.package_name}${import_ui.reset}` : "";
119
+ console.log(` ${riskColor}Top risk:${import_ui.reset} ${import_ui.violet}${import_ui.bold}${topCVE.cve_id}${import_ui.reset} ${riskColor}(Risk: ${topCVE.risk_score.toFixed(1)})${import_ui.reset}${pkgLabel}`);
120
+ console.log();
121
+ }
122
+ console.log(` ${(0, import_ui.section)("Reachability Verdicts")}
123
+ `);
124
+ const affected = verdicts["affected"] ?? 0;
125
+ const notAffected = verdicts["not_affected"] ?? 0;
126
+ const underInvestigation = verdicts["under_investigation"] ?? 0;
127
+ const noAnalysis = vulnCount.count - affected - notAffected - underInvestigation;
128
+ if (affected > 0) {
129
+ console.log(` ${"\x1B[31m"}\u25CF${import_ui.reset} Affected: ${import_ui.bold}${affected}${import_ui.reset}`);
130
+ }
131
+ if (notAffected > 0) {
132
+ console.log(` ${import_ui.green}\u25CF${import_ui.reset} Not affected: ${import_ui.bold}${notAffected}${import_ui.reset}`);
133
+ }
134
+ if (underInvestigation > 0) {
135
+ console.log(` ${"\x1B[33m"}\u25CF${import_ui.reset} Under investigation: ${import_ui.bold}${underInvestigation}${import_ui.reset}`);
136
+ }
137
+ if (noAnalysis > 0) {
138
+ console.log(` ${import_ui.dim}\u25CF${import_ui.reset} Pending analysis: ${import_ui.bold}${noAnalysis}${import_ui.reset}`);
139
+ }
140
+ console.log();
141
+ }
142
+ if (staleCount.count > 0) {
143
+ console.log(` ${"\x1B[33m"}\u26A0${import_ui.reset} ${import_ui.bold}${staleCount.count}${import_ui.reset} ${import_ui.dim}dependenc${staleCount.count === 1 ? "y has" : "ies have"} stale vulnerability data.${import_ui.reset}`);
144
+ console.log(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph vulns --refresh${import_ui.reset} ${import_ui.dim}to update.${import_ui.reset}
145
+ `);
146
+ }
147
+ const stalenessDataCount = rawDb.get(
148
+ `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score IS NOT NULL`
149
+ ) ?? { count: 0 };
150
+ if (stalenessDataCount.count > 0) {
151
+ const staleDepCount = rawDb.get(
152
+ `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score >= 0.3`
153
+ ) ?? { count: 0 };
154
+ console.log(` ${import_ui.dim}Stale dependencies:${import_ui.reset} ${staleDepCount.count > 0 ? `${"\x1B[33m"}${import_ui.bold}${staleDepCount.count}${import_ui.reset}` : `${import_ui.green}${import_ui.bold}0${import_ui.reset}`} ${import_ui.dim}of ${stalenessDataCount.count} scored${import_ui.reset}`);
155
+ if (staleDepCount.count > 0) {
156
+ console.log(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph staleness${import_ui.reset} ${import_ui.dim}for details.${import_ui.reset}`);
157
+ }
158
+ console.log();
159
+ } else if (!opts.refreshStaleness) {
160
+ console.log(` ${import_ui.dim}No staleness data.${import_ui.reset} ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph security --refresh-staleness${import_ui.reset} ${import_ui.dim}to score dependencies.${import_ui.reset}
161
+ `);
162
+ }
163
+ const lastCheck = rawDb.get(
164
+ `SELECT MIN(last_vuln_check) as oldest FROM sec_dependencies WHERE last_vuln_check IS NOT NULL`
165
+ )?.oldest;
166
+ if (lastCheck != null) {
167
+ const ageMs = Date.now() - lastCheck;
168
+ const ageDays = ageMs / (1e3 * 60 * 60 * 24);
169
+ const maxAge = config.securityEnrichMaxAgeDays ?? 7;
170
+ if (ageDays > maxAge) {
171
+ console.log(`
172
+ ${"\x1B[33m"}\u26A0 Vulnerability data is ${Math.floor(ageDays)} days old (max: ${maxAge}).${import_ui.reset}`);
173
+ console.log(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph vulns --refresh${import_ui.reset} ${import_ui.dim}to update.${import_ui.reset}`);
174
+ }
175
+ }
176
+ try {
177
+ if (config.enablePatterns) {
178
+ const tableExists = rawDb.get("SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'");
179
+ if (tableExists) {
180
+ const pm = rawDb.get("SELECT COUNT(*) as cnt FROM pattern_matches");
181
+ if ((pm?.cnt ?? 0) > 0) {
182
+ const critPm = rawDb.get("SELECT COUNT(*) as cnt FROM pattern_matches WHERE severity='critical'");
183
+ console.log(` ${import_ui.dim}SAST findings:${import_ui.reset} ${import_ui.violet}${import_ui.bold}${pm.cnt}${import_ui.reset} ${import_ui.dim}pattern matches (${critPm?.cnt ?? 0} critical)${import_ui.reset}`);
184
+ console.log(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph pattern --coverage${import_ui.reset} ${import_ui.dim}for details.${import_ui.reset}
185
+ `);
186
+ }
187
+ }
188
+ }
189
+ } catch {
190
+ }
191
+ if (opts.failOn === "affected") {
192
+ const affectedCount = verdicts["affected"] ?? 0;
193
+ if (affectedCount > 0) {
194
+ console.log(`
195
+ \x1B[31m\u2716\x1B[0m --fail-on affected: ${affectedCount} affected vulnerabilit${affectedCount === 1 ? "y" : "ies"} found. Exiting with code 1.`);
196
+ cg.close();
197
+ process.exit(1);
198
+ }
199
+ }
200
+ cg.close();
201
+ });
202
+ return secCmd;
203
+ }
204
+ // Annotate the CommonJS export names for ESM import in node:
205
+ 0 && (module.exports = {
206
+ register
207
+ });
208
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/security.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green, section } from '../ui';\n\nexport function register(program: Command): Command {\n const secCmd = program\n .command('security')\n .description('Security analysis: overview, dashboard export, and vulnerability management')\n .argument('[projectPath]', 'Project root path (optional)')\n .option('--refresh-staleness', 'Fetch latest version info from registries and show stale dependency count')\n .option('--fail-on <condition>', 'Exit 1 if condition is met. Supported: affected')\n .action(async (projectPath: string | undefined, opts: { refreshStaleness?: boolean; failOn?: string }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${'\\x1b[33m'}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n if (!config.enableArchitecture) {\n console.error(`\\n ${'\\x1b[33m'}\u26A0 Security requires Architecture analysis to be enabled.${reset}`);\n console.error(` ${dim}Enable both in .kirograph/config.json:${reset}`);\n console.error(` ${violet}${bold}\"enableArchitecture\": true${reset}`);\n console.error(` ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n if (opts.failOn !== undefined && opts.failOn !== 'affected') {\n console.error(` \u2716 Invalid --fail-on value: ${opts.failOn}. Supported: affected`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Optionally refresh staleness data from registries\n if (opts.refreshStaleness) {\n console.error(` ${dim}Fetching latest version info from package registries...${reset}`);\n const { StalenessChecker } = await Promise.resolve().then(() => require('../../security/staleness.js'));\n const checker = new StalenessChecker(db);\n const result = await checker.checkAll();\n console.error(` ${green}\u2713${reset} Checked ${bold}${result.checked}${reset} packages, ${bold}${result.stale}${reset} stale`);\n if (result.errors.length > 0) {\n console.error(` ${'\\x1b[33m'}\u26A0${reset} ${result.errors.length} error(s) during registry fetch`);\n }\n console.error();\n }\n\n // Query dependency counts\n const depCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies`,\n ) ?? { count: 0 };\n\n // Query vulnerability counts\n const vulnCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_vulnerabilities`,\n ) ?? { count: 0 };\n\n // Query reachability verdict counts\n const verdictRows: Array<{ verdict: string; count: number }> = rawDb.all(\n `SELECT verdict, COUNT(*) as count FROM sec_reachability GROUP BY verdict`,\n );\n const verdicts: Record<string, number> = {};\n for (const row of verdictRows) {\n verdicts[row.verdict] = row.count;\n }\n\n // Check for stale data\n const staleCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE vuln_data_stale = 1`,\n ) ?? { count: 0 };\n\n // Display overview\n console.log(`\\n ${section('Security Overview')}\\n`);\n console.log(` ${dim}Dependencies:${reset} ${violet}${bold}${depCount.count}${reset}`);\n console.log(` ${dim}Vulnerabilities:${reset} ${violet}${bold}${vulnCount.count}${reset}`);\n console.log();\n\n if (vulnCount.count > 0) {\n // Show top-risk CVE when data is available\n const topCVE: { cve_id: string; risk_score: number | null; package_name: string | null } | undefined =\n rawDb.get(\n `SELECT v.cve_id, v.risk_score, d.package_name\n FROM sec_vulnerabilities v\n LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'\n LEFT JOIN sec_dependencies d ON d.node_id = e.source\n LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id\n WHERE r.verdict = 'affected' AND v.risk_score IS NOT NULL\n ORDER BY v.risk_score DESC NULLS LAST\n LIMIT 1`,\n );\n if (topCVE && topCVE.risk_score != null) {\n const riskColor = topCVE.risk_score >= 7 ? '\\x1b[31m' : topCVE.risk_score >= 4 ? '\\x1b[33m' : dim;\n const pkgLabel = topCVE.package_name ? ` in ${dim}${topCVE.package_name}${reset}` : '';\n console.log(` ${riskColor}Top risk:${reset} ${violet}${bold}${topCVE.cve_id}${reset} ${riskColor}(Risk: ${topCVE.risk_score.toFixed(1)})${reset}${pkgLabel}`);\n console.log();\n }\n\n console.log(` ${section('Reachability Verdicts')}\\n`);\n const affected = verdicts['affected'] ?? 0;\n const notAffected = verdicts['not_affected'] ?? 0;\n const underInvestigation = verdicts['under_investigation'] ?? 0;\n const noAnalysis = vulnCount.count - affected - notAffected - underInvestigation;\n\n if (affected > 0) {\n console.log(` ${'\\x1b[31m'}\u25CF${reset} Affected: ${bold}${affected}${reset}`);\n }\n if (notAffected > 0) {\n console.log(` ${green}\u25CF${reset} Not affected: ${bold}${notAffected}${reset}`);\n }\n if (underInvestigation > 0) {\n console.log(` ${'\\x1b[33m'}\u25CF${reset} Under investigation: ${bold}${underInvestigation}${reset}`);\n }\n if (noAnalysis > 0) {\n console.log(` ${dim}\u25CF${reset} Pending analysis: ${bold}${noAnalysis}${reset}`);\n }\n console.log();\n }\n\n if (staleCount.count > 0) {\n console.log(` ${'\\x1b[33m'}\u26A0${reset} ${bold}${staleCount.count}${reset} ${dim}dependenc${staleCount.count === 1 ? 'y has' : 'ies have'} stale vulnerability data.${reset}`);\n console.log(` ${dim}Run${reset} ${violet}${bold}kirograph vulns --refresh${reset} ${dim}to update.${reset}\\n`);\n }\n\n // Show stale dependency count (version staleness) if data exists\n const stalenessDataCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score IS NOT NULL`,\n ) ?? { count: 0 };\n\n if (stalenessDataCount.count > 0) {\n const staleDepCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score >= 0.3`,\n ) ?? { count: 0 };\n console.log(` ${dim}Stale dependencies:${reset} ${staleDepCount.count > 0 ? `${'\\x1b[33m'}${bold}${staleDepCount.count}${reset}` : `${green}${bold}0${reset}`} ${dim}of ${stalenessDataCount.count} scored${reset}`);\n if (staleDepCount.count > 0) {\n console.log(` ${dim}Run${reset} ${violet}${bold}kirograph staleness${reset} ${dim}for details.${reset}`);\n }\n console.log();\n } else if (!opts.refreshStaleness) {\n console.log(` ${dim}No staleness data.${reset} ${dim}Run${reset} ${violet}${bold}kirograph security --refresh-staleness${reset} ${dim}to score dependencies.${reset}\\n`);\n }\n\n // Check if vulnerability data is stale\n const lastCheck = (rawDb.get(\n `SELECT MIN(last_vuln_check) as oldest FROM sec_dependencies WHERE last_vuln_check IS NOT NULL`,\n ) as { oldest: number | null } | undefined)?.oldest;\n if (lastCheck != null) {\n const ageMs = Date.now() - lastCheck;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n const maxAge = config.securityEnrichMaxAgeDays ?? 7;\n if (ageDays > maxAge) {\n console.log(`\\n ${'\\x1b[33m'}\u26A0 Vulnerability data is ${Math.floor(ageDays)} days old (max: ${maxAge}).${reset}`);\n console.log(` ${dim}Run${reset} ${violet}${bold}kirograph vulns --refresh${reset} ${dim}to update.${reset}`);\n }\n }\n\n // Pattern SAST findings (if enablePatterns and data exists)\n try {\n if (config.enablePatterns) {\n const tableExists = rawDb.get(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pattern_matches'\");\n if (tableExists) {\n const pm = rawDb.get('SELECT COUNT(*) as cnt FROM pattern_matches') as { cnt: number } | undefined;\n if ((pm?.cnt ?? 0) > 0) {\n const critPm = rawDb.get(\"SELECT COUNT(*) as cnt FROM pattern_matches WHERE severity='critical'\") as { cnt: number } | undefined;\n console.log(` ${dim}SAST findings:${reset} ${violet}${bold}${pm!.cnt}${reset} ${dim}pattern matches (${critPm?.cnt ?? 0} critical)${reset}`);\n console.log(` ${dim}Run${reset} ${violet}${bold}kirograph pattern --coverage${reset} ${dim}for details.${reset}\\n`);\n }\n }\n }\n } catch { /* non-critical */ }\n\n // --fail-on: exit 1 if condition is met (after all output)\n if (opts.failOn === 'affected') {\n const affectedCount = verdicts['affected'] ?? 0;\n if (affectedCount > 0) {\n console.log(`\\n \\x1b[31m\u2716\\x1b[0m --fail-on affected: ${affectedCount} affected vulnerabilit${affectedCount === 1 ? 'y' : 'ies'} found. Exiting with code 1.`);\n cg.close();\n process.exit(1);\n }\n }\n\n cg.close();\n });\n\n return secCmd;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function register(program: Command): void;
3
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/snapshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsG/C"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function register(program: Command): void;
3
+ //# sourceMappingURL=staleness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/staleness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6H/C"}
@@ -0,0 +1,144 @@
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 staleness_exports = {};
30
+ __export(staleness_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(staleness_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ function stalenessBar(score) {
38
+ const filled = Math.round(score * 10);
39
+ return "\u2588".repeat(filled) + "\u2591".repeat(10 - filled);
40
+ }
41
+ function register(program) {
42
+ program.command("staleness [projectPath]").description("Check dependency freshness \u2014 identifies packages significantly behind their latest published version").option("--threshold <n>", "Show only packages with staleness_score >= n (default: 0.3)", "0.3").option("--format <fmt>", "Output format: table | json (default: table)", "table").option("--refresh", "Fetch latest version info from registries before listing").action(async (projectPath, opts) => {
43
+ const target = path.resolve(projectPath ?? process.cwd());
44
+ const config = await (0, import_config.loadConfig)(target);
45
+ if (!config.enableSecurity) {
46
+ console.error(`
47
+ ${"\x1B[33m"}\u26A0 Security analysis is disabled.${import_ui.reset}`);
48
+ console.error(` ${import_ui.dim}Enable it in .kirograph/config.json:${import_ui.reset} ${import_ui.violet}${import_ui.bold}"enableSecurity": true${import_ui.reset}`);
49
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
50
+ `);
51
+ process.exit(1);
52
+ }
53
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
54
+ if (!KiroGraph.isInitialized(target)) {
55
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
56
+ process.exit(1);
57
+ }
58
+ const cg = await KiroGraph.open(target);
59
+ const db = cg.getDatabase();
60
+ db.applySecuritySchema();
61
+ const rawDb = db.getRawDb();
62
+ const threshold = parseFloat(opts.threshold);
63
+ if (isNaN(threshold) || threshold < 0 || threshold > 1) {
64
+ console.error(` \u2716 --threshold must be a number between 0 and 1`);
65
+ cg.close();
66
+ process.exit(1);
67
+ }
68
+ if (opts.refresh) {
69
+ console.error(` ${import_ui.dim}Fetching latest version info from package registries...${import_ui.reset}`);
70
+ const { StalenessChecker } = await Promise.resolve().then(() => require("../../security/staleness.js"));
71
+ const checker = new StalenessChecker(db);
72
+ const result = await checker.checkAll();
73
+ console.error(` ${import_ui.green}\u2713${import_ui.reset} Checked ${import_ui.bold}${result.checked}${import_ui.reset} packages, ${import_ui.bold}${result.stale}${import_ui.reset} stale`);
74
+ if (result.errors.length > 0) {
75
+ console.error(` ${"\x1B[33m"}\u26A0${import_ui.reset} ${result.errors.length} error(s) during registry fetch`);
76
+ }
77
+ console.error();
78
+ }
79
+ const rows = rawDb.all(
80
+ `SELECT node_id, package_name, ecosystem, resolved_version, declared_constraint,
81
+ latest_version, latest_published, staleness_score
82
+ FROM sec_dependencies
83
+ WHERE staleness_score >= ?
84
+ ORDER BY staleness_score DESC`,
85
+ [threshold]
86
+ );
87
+ const totalDeps = rawDb.get(
88
+ `SELECT COUNT(*) as count FROM sec_dependencies`
89
+ ) ?? { count: 0 };
90
+ if (opts.format === "json") {
91
+ console.log(JSON.stringify(rows.map((r) => ({
92
+ packageName: r.package_name,
93
+ ecosystem: r.ecosystem,
94
+ resolvedVersion: r.resolved_version ?? r.declared_constraint,
95
+ latestVersion: r.latest_version,
96
+ latestPublished: r.latest_published,
97
+ stalenessScore: r.staleness_score
98
+ })), null, 2));
99
+ cg.close();
100
+ return;
101
+ }
102
+ if (rows.length === 0) {
103
+ console.log(`
104
+ ${import_ui.dim}No stale dependencies found (threshold: ${threshold}).${import_ui.reset}`);
105
+ if (!opts.refresh) {
106
+ console.log(` ${import_ui.dim}Run with${import_ui.reset} ${import_ui.violet}${import_ui.bold}--refresh${import_ui.reset} ${import_ui.dim}to fetch latest version data from registries.${import_ui.reset}`);
107
+ }
108
+ console.log();
109
+ cg.close();
110
+ return;
111
+ }
112
+ console.log(`
113
+ ${import_ui.bold}Stale Dependencies${import_ui.reset}
114
+ `);
115
+ for (const row of rows) {
116
+ const resolved = row.resolved_version ?? row.declared_constraint ?? "?";
117
+ const latest = row.latest_version ?? "?";
118
+ const score = row.staleness_score ?? 0;
119
+ const months = row.latest_published ? Math.round((Date.now() - row.latest_published) / (1e3 * 60 * 60 * 24 * 30)) : null;
120
+ const bar = stalenessBar(score);
121
+ const scoreStr = score.toFixed(2);
122
+ let barColor = import_ui.dim;
123
+ if (score >= 0.7) barColor = "\x1B[31m";
124
+ else if (score >= 0.4) barColor = "\x1B[33m";
125
+ const pkgLabel = `${import_ui.violet}${import_ui.bold}${row.package_name}${import_ui.reset} ${import_ui.dim}(${row.ecosystem})${import_ui.reset}`;
126
+ const versionLabel = `${resolved} \u2192 ${import_ui.green}${latest}${import_ui.reset}`;
127
+ const monthsLabel = months !== null ? `${months}mo since latest` : "publish date unknown";
128
+ console.log(` ${pkgLabel}`);
129
+ console.log(` ${versionLabel} ${import_ui.dim}${monthsLabel}${import_ui.reset}`);
130
+ console.log(` ${barColor}${bar}${import_ui.reset} ${import_ui.dim}${scoreStr}${import_ui.reset}`);
131
+ console.log();
132
+ }
133
+ const staleCount = rows.length;
134
+ const totalCount = totalDeps.count;
135
+ console.log(` ${import_ui.bold}${staleCount}${import_ui.reset} of ${import_ui.bold}${totalCount}${import_ui.reset} ${import_ui.dim}dependenc${staleCount === 1 ? "y is" : "ies are"} stale (score >= ${threshold})${import_ui.reset}
136
+ `);
137
+ cg.close();
138
+ });
139
+ }
140
+ // Annotate the CommonJS export names for ESM import in node:
141
+ 0 && (module.exports = {
142
+ register
143
+ });
144
+ //# sourceMappingURL=staleness.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/staleness.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green } from '../ui';\n\n// \u2500\u2500 Staleness bar (10-char proportional) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction stalenessBar(score: number): string {\n const filled = Math.round(score * 10);\n return '\u2588'.repeat(filled) + '\u2591'.repeat(10 - filled);\n}\n\n// \u2500\u2500 JSON output type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface StalenessRow {\n node_id: string;\n package_name: string;\n ecosystem: string;\n resolved_version: string | null;\n declared_constraint: string;\n latest_version: string | null;\n latest_published: number | null;\n staleness_score: number | null;\n}\n\nexport function register(program: Command): void {\n program\n .command('staleness [projectPath]')\n .description('Check dependency freshness \u2014 identifies packages significantly behind their latest published version')\n .option('--threshold <n>', 'Show only packages with staleness_score >= n (default: 0.3)', '0.3')\n .option('--format <fmt>', 'Output format: table | json (default: table)', 'table')\n .option('--refresh', 'Fetch latest version info from registries before listing')\n .action(async (projectPath: string | undefined, opts: {\n threshold: string;\n format: string;\n refresh?: boolean;\n }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${'\\x1b[33m'}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const threshold = parseFloat(opts.threshold);\n if (isNaN(threshold) || threshold < 0 || threshold > 1) {\n console.error(` \u2716 --threshold must be a number between 0 and 1`);\n cg.close(); process.exit(1);\n }\n\n // Optionally refresh staleness data from registries\n if (opts.refresh) {\n console.error(` ${dim}Fetching latest version info from package registries...${reset}`);\n const { StalenessChecker } = await Promise.resolve().then(() => require('../../security/staleness.js'));\n const checker = new StalenessChecker(db);\n const result = await checker.checkAll();\n console.error(` ${green}\u2713${reset} Checked ${bold}${result.checked}${reset} packages, ${bold}${result.stale}${reset} stale`);\n if (result.errors.length > 0) {\n console.error(` ${'\\x1b[33m'}\u26A0${reset} ${result.errors.length} error(s) during registry fetch`);\n }\n console.error();\n }\n\n // Query dependencies with staleness data\n const rows: StalenessRow[] = rawDb.all(\n `SELECT node_id, package_name, ecosystem, resolved_version, declared_constraint,\n latest_version, latest_published, staleness_score\n FROM sec_dependencies\n WHERE staleness_score >= ?\n ORDER BY staleness_score DESC`,\n [threshold],\n );\n\n const totalDeps: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies`,\n ) ?? { count: 0 };\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(rows.map(r => ({\n packageName: r.package_name,\n ecosystem: r.ecosystem,\n resolvedVersion: r.resolved_version ?? r.declared_constraint,\n latestVersion: r.latest_version,\n latestPublished: r.latest_published,\n stalenessScore: r.staleness_score,\n })), null, 2));\n cg.close();\n return;\n }\n\n // \u2500\u2500 Table output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n if (rows.length === 0) {\n console.log(`\\n ${dim}No stale dependencies found (threshold: ${threshold}).${reset}`);\n if (!opts.refresh) {\n console.log(` ${dim}Run with${reset} ${violet}${bold}--refresh${reset} ${dim}to fetch latest version data from registries.${reset}`);\n }\n console.log();\n cg.close();\n return;\n }\n\n console.log(`\\n ${bold}Stale Dependencies${reset}\\n`);\n\n for (const row of rows) {\n const resolved = row.resolved_version ?? row.declared_constraint ?? '?';\n const latest = row.latest_version ?? '?';\n const score = row.staleness_score ?? 0;\n const months = row.latest_published\n ? Math.round((Date.now() - row.latest_published) / (1000 * 60 * 60 * 24 * 30))\n : null;\n\n const bar = stalenessBar(score);\n const scoreStr = score.toFixed(2);\n\n // Colour the bar: red >= 0.7, yellow >= 0.4, dim otherwise\n let barColor = dim;\n if (score >= 0.7) barColor = '\\x1b[31m';\n else if (score >= 0.4) barColor = '\\x1b[33m';\n\n const pkgLabel = `${violet}${bold}${row.package_name}${reset} ${dim}(${row.ecosystem})${reset}`;\n const versionLabel = `${resolved} \u2192 ${green}${latest}${reset}`;\n const monthsLabel = months !== null ? `${months}mo since latest` : 'publish date unknown';\n\n console.log(` ${pkgLabel}`);\n console.log(` ${versionLabel} ${dim}${monthsLabel}${reset}`);\n console.log(` ${barColor}${bar}${reset} ${dim}${scoreStr}${reset}`);\n console.log();\n }\n\n const staleCount = rows.length;\n const totalCount = totalDeps.count;\n console.log(` ${bold}${staleCount}${reset} of ${bold}${totalCount}${reset} ${dim}dependenc${staleCount === 1 ? 'y is' : 'ies are'} stale (score >= ${threshold})${reset}\\n`);\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4D/C"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwJ/C"}