kirograph 0.16.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +103 -1605
  3. package/dist/architecture/layers/dart.js +112 -0
  4. package/dist/architecture/layers/dart.js.map +7 -0
  5. package/dist/architecture/layers/index.js +3 -1
  6. package/dist/architecture/layers/index.js.map +2 -2
  7. package/dist/bin/banner.js +74 -6
  8. package/dist/bin/banner.js.map +2 -2
  9. package/dist/bin/commands/affected.js +40 -5
  10. package/dist/bin/commands/affected.js.map +2 -2
  11. package/dist/bin/commands/attack-surface.js +157 -0
  12. package/dist/bin/commands/attack-surface.js.map +7 -0
  13. package/dist/bin/commands/benchmark.js +206 -0
  14. package/dist/bin/commands/benchmark.js.map +7 -0
  15. package/dist/bin/commands/budget.js +70 -0
  16. package/dist/bin/commands/budget.js.map +7 -0
  17. package/dist/bin/commands/communities.js +77 -0
  18. package/dist/bin/commands/communities.js.map +7 -0
  19. package/dist/bin/commands/data.js +665 -0
  20. package/dist/bin/commands/data.js.map +7 -0
  21. package/dist/bin/commands/dep-confusion.js +119 -0
  22. package/dist/bin/commands/dep-confusion.js.map +7 -0
  23. package/dist/bin/commands/export.js +304 -10
  24. package/dist/bin/commands/export.js.map +2 -2
  25. package/dist/bin/commands/flows.js +97 -0
  26. package/dist/bin/commands/flows.js.map +7 -0
  27. package/dist/bin/commands/help.js +386 -100
  28. package/dist/bin/commands/help.js.map +2 -2
  29. package/dist/bin/commands/install.js +90 -8
  30. package/dist/bin/commands/install.js.map +2 -2
  31. package/dist/bin/commands/licenses.js +201 -0
  32. package/dist/bin/commands/licenses.js.map +7 -0
  33. package/dist/bin/commands/reachability.js +160 -0
  34. package/dist/bin/commands/reachability.js.map +7 -0
  35. package/dist/bin/commands/read.js +100 -0
  36. package/dist/bin/commands/read.js.map +7 -0
  37. package/dist/bin/commands/refactor.js +116 -0
  38. package/dist/bin/commands/refactor.js.map +7 -0
  39. package/dist/bin/commands/remediation.js +133 -0
  40. package/dist/bin/commands/remediation.js.map +7 -0
  41. package/dist/bin/commands/sbom.js +76 -0
  42. package/dist/bin/commands/sbom.js.map +7 -0
  43. package/dist/bin/commands/security-ci-report.js +267 -0
  44. package/dist/bin/commands/security-ci-report.js.map +7 -0
  45. package/dist/bin/commands/security-export.js +1349 -0
  46. package/dist/bin/commands/security-export.js.map +7 -0
  47. package/dist/bin/commands/security-flows.js +126 -0
  48. package/dist/bin/commands/security-flows.js.map +7 -0
  49. package/dist/bin/commands/security-secrets.js +170 -0
  50. package/dist/bin/commands/security-secrets.js.map +7 -0
  51. package/dist/bin/commands/security.js +193 -0
  52. package/dist/bin/commands/security.js.map +7 -0
  53. package/dist/bin/commands/staleness.js +144 -0
  54. package/dist/bin/commands/staleness.js.map +7 -0
  55. package/dist/bin/commands/status.js +102 -2
  56. package/dist/bin/commands/status.js.map +2 -2
  57. package/dist/bin/commands/supply-chain.js +138 -0
  58. package/dist/bin/commands/supply-chain.js.map +7 -0
  59. package/dist/bin/commands/uninit.js +109 -60
  60. package/dist/bin/commands/uninit.js.map +2 -2
  61. package/dist/bin/commands/vex.js +76 -0
  62. package/dist/bin/commands/vex.js.map +7 -0
  63. package/dist/bin/commands/vuln-suppress.js +95 -0
  64. package/dist/bin/commands/vuln-suppress.js.map +7 -0
  65. package/dist/bin/commands/vulns.js +382 -0
  66. package/dist/bin/commands/vulns.js.map +7 -0
  67. package/dist/bin/installer/auto-detect.js +125 -0
  68. package/dist/bin/installer/auto-detect.js.map +7 -0
  69. package/dist/bin/installer/cli-agent.js +28 -5
  70. package/dist/bin/installer/cli-agent.js.map +2 -2
  71. package/dist/bin/installer/common.js +47 -0
  72. package/dist/bin/installer/common.js.map +2 -2
  73. package/dist/bin/installer/config-prompt.js +39 -1
  74. package/dist/bin/installer/config-prompt.js.map +2 -2
  75. package/dist/bin/installer/detect.js +309 -0
  76. package/dist/bin/installer/detect.js.map +7 -0
  77. package/dist/bin/installer/index.js +36 -1
  78. package/dist/bin/installer/index.js.map +2 -2
  79. package/dist/bin/installer/instructions.js +195 -3
  80. package/dist/bin/installer/instructions.js.map +2 -2
  81. package/dist/bin/installer/steering.js +440 -0
  82. package/dist/bin/installer/steering.js.map +2 -2
  83. package/dist/bin/installer/targets/aider.js +3 -3
  84. package/dist/bin/installer/targets/aider.js.map +2 -2
  85. package/dist/bin/installer/targets/amp.js +3 -3
  86. package/dist/bin/installer/targets/amp.js.map +2 -2
  87. package/dist/bin/installer/targets/antigravity.js +35 -6
  88. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  89. package/dist/bin/installer/targets/augment.js +3 -3
  90. package/dist/bin/installer/targets/augment.js.map +2 -2
  91. package/dist/bin/installer/targets/claude.js +49 -5
  92. package/dist/bin/installer/targets/claude.js.map +2 -2
  93. package/dist/bin/installer/targets/cline.js +32 -6
  94. package/dist/bin/installer/targets/cline.js.map +2 -2
  95. package/dist/bin/installer/targets/codex.js +64 -12
  96. package/dist/bin/installer/targets/codex.js.map +2 -2
  97. package/dist/bin/installer/targets/continue.js +2 -2
  98. package/dist/bin/installer/targets/continue.js.map +2 -2
  99. package/dist/bin/installer/targets/copilot-cli.js +101 -0
  100. package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
  101. package/dist/bin/installer/targets/copilot.js +31 -5
  102. package/dist/bin/installer/targets/copilot.js.map +2 -2
  103. package/dist/bin/installer/targets/cursor.js +4 -4
  104. package/dist/bin/installer/targets/cursor.js.map +2 -2
  105. package/dist/bin/installer/targets/devin.js +2 -2
  106. package/dist/bin/installer/targets/devin.js.map +2 -2
  107. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  108. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  109. package/dist/bin/installer/targets/generic.js +2 -14
  110. package/dist/bin/installer/targets/generic.js.map +2 -2
  111. package/dist/bin/installer/targets/goose.js +3 -3
  112. package/dist/bin/installer/targets/goose.js.map +2 -2
  113. package/dist/bin/installer/targets/index.js +250 -0
  114. package/dist/bin/installer/targets/index.js.map +2 -2
  115. package/dist/bin/installer/targets/junie.js +2 -2
  116. package/dist/bin/installer/targets/junie.js.map +2 -2
  117. package/dist/bin/installer/targets/kilo.js +2 -2
  118. package/dist/bin/installer/targets/kilo.js.map +2 -2
  119. package/dist/bin/installer/targets/kiro.js +3 -3
  120. package/dist/bin/installer/targets/kiro.js.map +2 -2
  121. package/dist/bin/installer/targets/opencode.js +2 -2
  122. package/dist/bin/installer/targets/opencode.js.map +2 -2
  123. package/dist/bin/installer/targets/openhands.js +3 -3
  124. package/dist/bin/installer/targets/openhands.js.map +2 -2
  125. package/dist/bin/installer/targets/qoder.js +91 -0
  126. package/dist/bin/installer/targets/qoder.js.map +7 -0
  127. package/dist/bin/installer/targets/qwen.js +96 -0
  128. package/dist/bin/installer/targets/qwen.js.map +7 -0
  129. package/dist/bin/installer/targets/replit.js +3 -3
  130. package/dist/bin/installer/targets/replit.js.map +2 -2
  131. package/dist/bin/installer/targets/roo.js +2 -2
  132. package/dist/bin/installer/targets/roo.js.map +2 -2
  133. package/dist/bin/installer/targets/tabnine.js +3 -3
  134. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  135. package/dist/bin/installer/targets/trae.js +5 -5
  136. package/dist/bin/installer/targets/trae.js.map +2 -2
  137. package/dist/bin/installer/targets/warp.js +2 -2
  138. package/dist/bin/installer/targets/warp.js.map +2 -2
  139. package/dist/bin/installer/targets/windsurf.js +35 -6
  140. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  141. package/dist/bin/kirograph.js +74 -6
  142. package/dist/bin/kirograph.js.map +3 -3
  143. package/dist/bin/progress.js +30 -0
  144. package/dist/bin/progress.js.map +2 -2
  145. package/dist/compression/naive-cost.js +25 -0
  146. package/dist/compression/naive-cost.js.map +2 -2
  147. package/dist/compression/tracker.js +91 -2
  148. package/dist/compression/tracker.js.map +2 -2
  149. package/dist/compression/types.js.map +1 -1
  150. package/dist/config.js +126 -3
  151. package/dist/config.js.map +2 -2
  152. package/dist/core/pipeline.js +92 -4
  153. package/dist/core/pipeline.js.map +2 -2
  154. package/dist/data/filters.js +105 -0
  155. package/dist/data/filters.js.map +7 -0
  156. package/dist/data/indexer.js +225 -0
  157. package/dist/data/indexer.js.map +7 -0
  158. package/dist/data/linker.js +150 -0
  159. package/dist/data/linker.js.map +7 -0
  160. package/dist/data/lint.js +109 -0
  161. package/dist/data/lint.js.map +7 -0
  162. package/dist/data/parsers/csv.js +132 -0
  163. package/dist/data/parsers/csv.js.map +7 -0
  164. package/dist/data/parsers/excel.js +88 -0
  165. package/dist/data/parsers/excel.js.map +7 -0
  166. package/dist/data/parsers/index.js +79 -0
  167. package/dist/data/parsers/index.js.map +7 -0
  168. package/dist/data/parsers/json-array.js +89 -0
  169. package/dist/data/parsers/json-array.js.map +7 -0
  170. package/dist/data/parsers/jsonl.js +84 -0
  171. package/dist/data/parsers/jsonl.js.map +7 -0
  172. package/dist/data/parsers/parquet.js +95 -0
  173. package/dist/data/parsers/parquet.js.map +7 -0
  174. package/dist/data/profiler.js +182 -0
  175. package/dist/data/profiler.js.map +7 -0
  176. package/dist/data/queries.js +512 -0
  177. package/dist/data/queries.js.map +7 -0
  178. package/dist/data/types.js +17 -0
  179. package/dist/data/types.js.map +7 -0
  180. package/dist/db/data-schema.sql +61 -0
  181. package/dist/db/database.js +67 -5
  182. package/dist/db/database.js.map +2 -2
  183. package/dist/db/memory-schema.sql +5 -1
  184. package/dist/db/schema.sql +3 -1
  185. package/dist/db/security-schema.sql +72 -0
  186. package/dist/extraction/extractor.js +81 -0
  187. package/dist/extraction/extractor.js.map +2 -2
  188. package/dist/extraction/grammars.js +32 -8
  189. package/dist/extraction/grammars.js.map +2 -2
  190. package/dist/extraction/languages.js +43 -1
  191. package/dist/extraction/languages.js.map +2 -2
  192. package/dist/extraction/notebook.js +300 -0
  193. package/dist/extraction/notebook.js.map +7 -0
  194. package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
  195. package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
  196. package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
  197. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  198. package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
  199. package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
  200. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  201. package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
  202. package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
  203. package/dist/frameworks/flutter.js +130 -0
  204. package/dist/frameworks/flutter.js.map +7 -0
  205. package/dist/frameworks/index.js +7 -1
  206. package/dist/frameworks/index.js.map +3 -3
  207. package/dist/graph/communities.js +317 -0
  208. package/dist/graph/communities.js.map +7 -0
  209. package/dist/graph/flows.js +138 -0
  210. package/dist/graph/flows.js.map +7 -0
  211. package/dist/graph/refactor.js +155 -0
  212. package/dist/graph/refactor.js.map +7 -0
  213. package/dist/index.js +1 -1
  214. package/dist/index.js.map +2 -2
  215. package/dist/mcp/cache.js +172 -0
  216. package/dist/mcp/cache.js.map +7 -0
  217. package/dist/mcp/read-modes.js +295 -0
  218. package/dist/mcp/read-modes.js.map +7 -0
  219. package/dist/mcp/server.js +2 -1
  220. package/dist/mcp/server.js.map +2 -2
  221. package/dist/mcp/tool-names.js +29 -1
  222. package/dist/mcp/tool-names.js.map +2 -2
  223. package/dist/mcp/tools.js +1588 -6
  224. package/dist/mcp/tools.js.map +3 -3
  225. package/dist/memory/database.js +32 -2
  226. package/dist/memory/database.js.map +2 -2
  227. package/dist/memory/types.js.map +1 -1
  228. package/dist/resolution/bridges/android-rn.js +298 -0
  229. package/dist/resolution/bridges/android-rn.js.map +7 -0
  230. package/dist/resolution/bridges/expo-modules.js +155 -0
  231. package/dist/resolution/bridges/expo-modules.js.map +7 -0
  232. package/dist/resolution/bridges/flutter-channel.js +385 -0
  233. package/dist/resolution/bridges/flutter-channel.js.map +7 -0
  234. package/dist/resolution/bridges/index.js +80 -0
  235. package/dist/resolution/bridges/index.js.map +7 -0
  236. package/dist/resolution/bridges/native-events.js +188 -0
  237. package/dist/resolution/bridges/native-events.js.map +7 -0
  238. package/dist/resolution/bridges/native-views.js +244 -0
  239. package/dist/resolution/bridges/native-views.js.map +7 -0
  240. package/dist/resolution/bridges/react-native.js +161 -0
  241. package/dist/resolution/bridges/react-native.js.map +7 -0
  242. package/dist/resolution/bridges/swift-objc.js +227 -0
  243. package/dist/resolution/bridges/swift-objc.js.map +7 -0
  244. package/dist/resolution/bridges/turbomodules.js +216 -0
  245. package/dist/resolution/bridges/turbomodules.js.map +7 -0
  246. package/dist/resolution/index.js +61 -2
  247. package/dist/resolution/index.js.map +2 -2
  248. package/dist/security/attack-surface.js +164 -0
  249. package/dist/security/attack-surface.js.map +7 -0
  250. package/dist/security/context-warnings.js +123 -0
  251. package/dist/security/context-warnings.js.map +7 -0
  252. package/dist/security/context-warnings.test.js +300 -0
  253. package/dist/security/context-warnings.test.js.map +7 -0
  254. package/dist/security/data-flows.js +228 -0
  255. package/dist/security/data-flows.js.map +7 -0
  256. package/dist/security/dep-confusion.js +255 -0
  257. package/dist/security/dep-confusion.js.map +7 -0
  258. package/dist/security/errors.js +51 -0
  259. package/dist/security/errors.js.map +7 -0
  260. package/dist/security/export/fix-suggestions.js +58 -0
  261. package/dist/security/export/fix-suggestions.js.map +7 -0
  262. package/dist/security/export/fix-suggestions.test.js +74 -0
  263. package/dist/security/export/fix-suggestions.test.js.map +7 -0
  264. package/dist/security/export/sbom.js +230 -0
  265. package/dist/security/export/sbom.js.map +7 -0
  266. package/dist/security/export/sbom.test.js +288 -0
  267. package/dist/security/export/sbom.test.js.map +7 -0
  268. package/dist/security/export/serialization.js +142 -0
  269. package/dist/security/export/serialization.js.map +7 -0
  270. package/dist/security/export/serialization.test.js +310 -0
  271. package/dist/security/export/serialization.test.js.map +7 -0
  272. package/dist/security/export/vex.js +220 -0
  273. package/dist/security/export/vex.js.map +7 -0
  274. package/dist/security/export/vex.test.js +278 -0
  275. package/dist/security/export/vex.test.js.map +7 -0
  276. package/dist/security/index.js +67 -0
  277. package/dist/security/index.js.map +7 -0
  278. package/dist/security/integrator-transitives.test.js +359 -0
  279. package/dist/security/integrator-transitives.test.js.map +7 -0
  280. package/dist/security/integrator.js +491 -0
  281. package/dist/security/integrator.js.map +7 -0
  282. package/dist/security/integrator.test.js +237 -0
  283. package/dist/security/integrator.test.js.map +7 -0
  284. package/dist/security/license.js +70 -0
  285. package/dist/security/license.js.map +7 -0
  286. package/dist/security/manifest/adapter.js +243 -0
  287. package/dist/security/manifest/adapter.js.map +7 -0
  288. package/dist/security/manifest/adapter.test.js +272 -0
  289. package/dist/security/manifest/adapter.test.js.map +7 -0
  290. package/dist/security/manifest/parser.js +376 -0
  291. package/dist/security/manifest/parser.js.map +7 -0
  292. package/dist/security/manifest/parser.test.js +110 -0
  293. package/dist/security/manifest/parser.test.js.map +7 -0
  294. package/dist/security/manifest/plugins/cargo.js +233 -0
  295. package/dist/security/manifest/plugins/cargo.js.map +7 -0
  296. package/dist/security/manifest/plugins/cargo.test.js +304 -0
  297. package/dist/security/manifest/plugins/cargo.test.js.map +7 -0
  298. package/dist/security/manifest/plugins/composer.js +152 -0
  299. package/dist/security/manifest/plugins/composer.js.map +7 -0
  300. package/dist/security/manifest/plugins/go.js +146 -0
  301. package/dist/security/manifest/plugins/go.js.map +7 -0
  302. package/dist/security/manifest/plugins/go.test.js +341 -0
  303. package/dist/security/manifest/plugins/go.test.js.map +7 -0
  304. package/dist/security/manifest/plugins/gradle.js +159 -0
  305. package/dist/security/manifest/plugins/gradle.js.map +7 -0
  306. package/dist/security/manifest/plugins/hex.js +159 -0
  307. package/dist/security/manifest/plugins/hex.js.map +7 -0
  308. package/dist/security/manifest/plugins/maven.js +128 -0
  309. package/dist/security/manifest/plugins/maven.js.map +7 -0
  310. package/dist/security/manifest/plugins/maven.test.js +389 -0
  311. package/dist/security/manifest/plugins/maven.test.js.map +7 -0
  312. package/dist/security/manifest/plugins/npm.js +284 -0
  313. package/dist/security/manifest/plugins/npm.js.map +7 -0
  314. package/dist/security/manifest/plugins/npm.test.js +298 -0
  315. package/dist/security/manifest/plugins/npm.test.js.map +7 -0
  316. package/dist/security/manifest/plugins/nuget.js +186 -0
  317. package/dist/security/manifest/plugins/nuget.js.map +7 -0
  318. package/dist/security/manifest/plugins/pip.js +123 -0
  319. package/dist/security/manifest/plugins/pip.js.map +7 -0
  320. package/dist/security/manifest/plugins/pip.test.js +208 -0
  321. package/dist/security/manifest/plugins/pip.test.js.map +7 -0
  322. package/dist/security/manifest/plugins/pubspec.js +212 -0
  323. package/dist/security/manifest/plugins/pubspec.js.map +7 -0
  324. package/dist/security/manifest/plugins/pyproject.js +261 -0
  325. package/dist/security/manifest/plugins/pyproject.js.map +7 -0
  326. package/dist/security/manifest/plugins/rubygems.js +185 -0
  327. package/dist/security/manifest/plugins/rubygems.js.map +7 -0
  328. package/dist/security/manifest/plugins/swift.js +200 -0
  329. package/dist/security/manifest/plugins/swift.js.map +7 -0
  330. package/dist/security/owasp.js +104 -0
  331. package/dist/security/owasp.js.map +7 -0
  332. package/dist/security/pipeline.js +125 -0
  333. package/dist/security/pipeline.js.map +7 -0
  334. package/dist/security/reachability.js +276 -0
  335. package/dist/security/reachability.js.map +7 -0
  336. package/dist/security/reachability.test.js +394 -0
  337. package/dist/security/reachability.test.js.map +7 -0
  338. package/dist/security/remediation.js +126 -0
  339. package/dist/security/remediation.js.map +7 -0
  340. package/dist/security/secrets.js +176 -0
  341. package/dist/security/secrets.js.map +7 -0
  342. package/dist/security/staleness.js +231 -0
  343. package/dist/security/staleness.js.map +7 -0
  344. package/dist/security/supply-chain.js +301 -0
  345. package/dist/security/supply-chain.js.map +7 -0
  346. package/dist/security/suppressions.js +106 -0
  347. package/dist/security/suppressions.js.map +7 -0
  348. package/dist/security/types.js +17 -0
  349. package/dist/security/types.js.map +7 -0
  350. package/dist/security/vuln/client.js +355 -0
  351. package/dist/security/vuln/client.js.map +7 -0
  352. package/dist/security/vuln/client.test.js +288 -0
  353. package/dist/security/vuln/client.test.js.map +7 -0
  354. package/dist/security/vuln/epss-client.js +95 -0
  355. package/dist/security/vuln/epss-client.js.map +7 -0
  356. package/dist/security/vuln/index.js +29 -0
  357. package/dist/security/vuln/index.js.map +7 -0
  358. package/dist/security/vuln/osv-adapter.js +321 -0
  359. package/dist/security/vuln/osv-adapter.js.map +7 -0
  360. package/dist/security/vuln/osv-adapter.test.js +391 -0
  361. package/dist/security/vuln/osv-adapter.test.js.map +7 -0
  362. package/dist/security/vuln/types.js +17 -0
  363. package/dist/security/vuln/types.js.map +7 -0
  364. package/dist/types.js.map +2 -2
  365. package/package.json +5 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/vuln-suppress.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { dim, reset, violet, bold, green } from '../ui';\nimport { SuppressionManager } from '../../security/suppressions';\n\nexport function register(program: Command): void {\n const vulnCmd = program\n .command('vuln')\n .description('CVE suppression management');\n\n vulnCmd\n .command('suppress <cveId> [projectPath]')\n .description('Mark a CVE as suppressed (false positive or accepted risk)')\n .option('--reason <text>', 'Reason for suppression')\n .option('--expires <date>', 'Expiry date in ISO format (e.g. 2026-12-31)')\n .action(async (cveId: string, projectPath: string | undefined, opts: {\n reason?: string;\n expires?: string;\n }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const manager = new SuppressionManager(target);\n manager.add(cveId, opts.reason, opts.expires);\n const reasonNote = opts.reason ? ` ${dim}(${opts.reason})${reset}` : '';\n console.log(` ${green}\u2713${reset} ${violet}${bold}${cveId}${reset} suppressed${reasonNote}`);\n });\n\n vulnCmd\n .command('unsuppress <cveId> [projectPath]')\n .description('Remove a CVE suppression')\n .action(async (cveId: string, projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const manager = new SuppressionManager(target);\n const removed = manager.remove(cveId);\n if (!removed) {\n console.error(` \u2716 No suppression found for ${violet}${bold}${cveId}${reset}`);\n process.exit(1);\n }\n console.log(` ${green}\u2713${reset} ${violet}${bold}${cveId}${reset} unsuppressed`);\n });\n\n vulnCmd\n .command('suppressions [projectPath]')\n .description('List all active CVE suppressions')\n .option('--format <fmt>', 'Output format: table | json', 'table')\n .action(async (projectPath: string | undefined, opts: { format?: string }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const manager = new SuppressionManager(target);\n const suppressions = manager.getActive();\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(suppressions, null, 2));\n return;\n }\n\n if (suppressions.length === 0) {\n console.log(`\\n ${dim}No active suppressions.${reset}\\n`);\n return;\n }\n\n const CVE_W = Math.max(6, ...suppressions.map(s => s.cveId.length));\n const DATE_W = 12;\n const EXP_W = 12;\n\n const header =\n ` ${bold}${'CVE ID'.padEnd(CVE_W)}${reset} ` +\n `${bold}${'Suppressed At'.padEnd(DATE_W)}${reset} ` +\n `${bold}${'Expires'.padEnd(EXP_W)}${reset} ` +\n `${bold}Reason${reset}`;\n\n const separator = ` ${'\u2500'.repeat(CVE_W)} ${'\u2500'.repeat(DATE_W)} ${'\u2500'.repeat(EXP_W)} ${'\u2500'.repeat(20)}`;\n\n console.log(`\\n ${bold}Active Suppressions${reset} (${suppressions.length})\\n`);\n console.log(header);\n console.log(separator);\n\n for (const s of suppressions) {\n const suppressedDate = s.suppressedAt.slice(0, 10);\n const expiresStr = s.expiresAt ? s.expiresAt.slice(0, 10) : dim + '\u2014' + reset;\n const reasonStr = s.reason ? `${dim}${s.reason}${reset}` : `${dim}\u2014${reset}`;\n console.log(\n ` ${violet}${s.cveId.padEnd(CVE_W)}${reset} ` +\n `${suppressedDate.padEnd(DATE_W)} ` +\n `${expiresStr.padEnd(EXP_W + (s.expiresAt ? 0 : (dim + reset).length))} ` +\n `${reasonStr}`,\n );\n }\n\n console.log();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,382 @@
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 vulns_exports = {};
30
+ __export(vulns_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(vulns_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ var import_fix_suggestions = require("../../security/export/fix-suggestions");
38
+ var import_suppressions = require("../../security/suppressions");
39
+ function parseEpssFailOn(failOn) {
40
+ const m = failOn.match(/^epss=(.+)$/);
41
+ if (!m) return null;
42
+ const n = parseFloat(m[1]);
43
+ return isNaN(n) ? null : n;
44
+ }
45
+ function workspaceFromManifests(sourceManifests) {
46
+ if (!sourceManifests) return "root";
47
+ try {
48
+ const manifests = JSON.parse(sourceManifests);
49
+ if (!manifests.length) return "root";
50
+ const dir = path.dirname(manifests[0]);
51
+ return dir === "." ? "root" : dir;
52
+ } catch {
53
+ return "root";
54
+ }
55
+ }
56
+ function register(program) {
57
+ program.command("vulns [projectPath]").description("List vulnerabilities with reachability verdicts and severity").option("--severity <level>", "Filter by severity: critical, high, medium, low").option("--verdict <verdict>", "Filter by verdict: affected, not_affected, under_investigation").option("--refresh", "Trigger fresh vulnerability enrichment before listing").option("--epss <threshold>", "Filter by EPSS score (e.g. 0.5 shows only vulns with EPSS >= 0.5)").option("--stale", "Show staleness score of the affected dependency alongside each CVE").option("--sort <key>", "Sort results by: risk (default), cvss, epss, name").option("--add <cveId>", "Manually register a CVE").option("--package <name>", "Package name for --add").option("--version <ver>", "Package version for --add").option("--fail-on <condition>", "Exit 1 if condition is met: affected, any, critical, high, epss=N").option("--group-by <key>", "Group output by: workspace").action(async (projectPath, opts) => {
58
+ const target = path.resolve(projectPath ?? process.cwd());
59
+ const config = await (0, import_config.loadConfig)(target);
60
+ if (!config.enableSecurity) {
61
+ console.error(`
62
+ ${"\x1B[33m"}\u26A0 Security analysis is disabled.${import_ui.reset}`);
63
+ 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}`);
64
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
65
+ `);
66
+ process.exit(1);
67
+ }
68
+ if (opts.failOn !== void 0) {
69
+ const validFailOns = ["affected", "any", "critical", "high"];
70
+ const isEpss = parseEpssFailOn(opts.failOn) !== null;
71
+ if (!validFailOns.includes(opts.failOn) && !isEpss) {
72
+ console.error(` \u2716 Invalid --fail-on value: ${opts.failOn}. Use: affected, any, critical, high, epss=N`);
73
+ process.exit(1);
74
+ }
75
+ }
76
+ if (opts.groupBy !== void 0 && opts.groupBy !== "workspace") {
77
+ console.error(` \u2716 Invalid --group-by value: ${opts.groupBy}. Supported: workspace`);
78
+ process.exit(1);
79
+ }
80
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
81
+ if (!KiroGraph.isInitialized(target)) {
82
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
83
+ process.exit(1);
84
+ }
85
+ const cg = await KiroGraph.open(target);
86
+ const db = cg.getDatabase();
87
+ db.applySecuritySchema();
88
+ const rawDb = db.getRawDb();
89
+ if (opts.add) {
90
+ if (!opts.package || !opts.version) {
91
+ console.error(` \u2716 --add requires --package <name> and --version <ver>`);
92
+ cg.close();
93
+ process.exit(1);
94
+ }
95
+ const cveId = opts.add;
96
+ const pkgName = opts.package;
97
+ const pkgVersion = opts.version;
98
+ const depRow = rawDb.get(
99
+ `SELECT node_id, ecosystem FROM sec_dependencies
100
+ WHERE package_name = ? AND (resolved_version = ? OR declared_constraint = ?)`,
101
+ [pkgName, pkgVersion, pkgVersion]
102
+ );
103
+ if (!depRow) {
104
+ console.error(` \u2716 No dependency found matching ${import_ui.violet}${pkgName}@${pkgVersion}${import_ui.reset}`);
105
+ console.error(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset} ${import_ui.dim}first to discover dependencies.${import_ui.reset}`);
106
+ cg.close();
107
+ process.exit(1);
108
+ }
109
+ const vulnNodeId = `vuln:${cveId}`;
110
+ const now = Date.now();
111
+ rawDb.run(
112
+ `INSERT OR REPLACE INTO nodes
113
+ (id, kind, name, qualified_name, file_path, language,
114
+ start_line, end_line, start_column, end_column,
115
+ is_exported, is_async, is_static, is_abstract, updated_at)
116
+ VALUES (?, 'vulnerability', ?, ?, '', 'unknown', 0, 0, 0, 0, 0, 0, 0, 0, ?)`,
117
+ [vulnNodeId, cveId, cveId, now]
118
+ );
119
+ rawDb.run(
120
+ `INSERT OR REPLACE INTO sec_vulnerabilities
121
+ (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)
122
+ VALUES (?, ?, NULL, '[]', NULL, 'Manually registered', 'manual')`,
123
+ [vulnNodeId, cveId]
124
+ );
125
+ rawDb.run(
126
+ `INSERT OR IGNORE INTO edges (source, target, kind, confidence, confidence_score)
127
+ VALUES (?, ?, 'has_vulnerability', 'extracted', 1.0)`,
128
+ [depRow.node_id, vulnNodeId]
129
+ );
130
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} Registered ${import_ui.violet}${import_ui.bold}${cveId}${import_ui.reset} against ${import_ui.violet}${pkgName}@${pkgVersion}${import_ui.reset}`);
131
+ cg.close();
132
+ return;
133
+ }
134
+ if (opts.refresh) {
135
+ console.error(` ${import_ui.dim}Refreshing vulnerability data from configured databases...${import_ui.reset}`);
136
+ const { OsvAdapter } = await Promise.resolve().then(() => require("../../security/vuln/osv-adapter.js"));
137
+ const { VulnerabilityDatabaseClient } = await Promise.resolve().then(() => require("../../security/vuln/client.js"));
138
+ const adapters = config.securityDatabases.map((dbName) => {
139
+ if (dbName.toUpperCase() === "OSV") return new OsvAdapter();
140
+ return null;
141
+ }).filter(Boolean);
142
+ const client = new VulnerabilityDatabaseClient(adapters, db);
143
+ const result = await client.enrichAll();
144
+ console.error(` ${import_ui.green}\u2713${import_ui.reset} Checked ${import_ui.bold}${result.dependenciesChecked}${import_ui.reset} dependencies, found ${import_ui.bold}${result.vulnerabilitiesFound}${import_ui.reset} vulnerabilities`);
145
+ if (result.errors.length > 0) {
146
+ console.error(` ${"\x1B[33m"}\u26A0${import_ui.reset} ${result.errors.length} error(s) during enrichment`);
147
+ }
148
+ console.error();
149
+ }
150
+ const selectSourceManifests = opts.groupBy === "workspace" ? `,
151
+ d.source_manifests` : "";
152
+ let query = `
153
+ SELECT
154
+ v.node_id, v.cve_id, v.severity_score, v.fixed_version, v.summary, v.source_database,
155
+ v.epss_score, v.epss_percentile, v.risk_score,
156
+ d.package_name, d.ecosystem, d.resolved_version, d.declared_constraint,
157
+ d.staleness_score,
158
+ r.verdict${selectSourceManifests}
159
+ FROM sec_vulnerabilities v
160
+ LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'
161
+ LEFT JOIN sec_dependencies d ON d.node_id = e.source
162
+ LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id
163
+ WHERE 1=1
164
+ `;
165
+ const params = [];
166
+ if (opts.severity) {
167
+ const severityRanges = {
168
+ critical: [9, 10],
169
+ high: [7, 8.9],
170
+ medium: [4, 6.9],
171
+ low: [0.1, 3.9]
172
+ };
173
+ const range = severityRanges[opts.severity.toLowerCase()];
174
+ if (!range) {
175
+ console.error(` \u2716 Invalid severity: ${opts.severity}. Use: critical, high, medium, low`);
176
+ cg.close();
177
+ process.exit(1);
178
+ }
179
+ query += ` AND v.severity_score >= ? AND v.severity_score <= ?`;
180
+ params.push(range[0], range[1]);
181
+ }
182
+ if (opts.verdict) {
183
+ const validVerdicts = ["affected", "not_affected", "under_investigation"];
184
+ if (!validVerdicts.includes(opts.verdict)) {
185
+ console.error(` \u2716 Invalid verdict: ${opts.verdict}. Use: affected, not_affected, under_investigation`);
186
+ cg.close();
187
+ process.exit(1);
188
+ }
189
+ query += ` AND r.verdict = ?`;
190
+ params.push(opts.verdict);
191
+ }
192
+ if (opts.epss !== void 0) {
193
+ const epssThreshold = parseFloat(opts.epss);
194
+ if (isNaN(epssThreshold) || epssThreshold < 0 || epssThreshold > 1) {
195
+ console.error(` \u2716 Invalid EPSS threshold: ${opts.epss}. Use a number between 0 and 1 (e.g. 0.5)`);
196
+ cg.close();
197
+ process.exit(1);
198
+ }
199
+ query += ` AND v.epss_score >= ?`;
200
+ params.push(epssThreshold);
201
+ }
202
+ const sortKey = opts.sort?.toLowerCase() ?? "risk";
203
+ const validSortKeys = ["risk", "cvss", "epss", "name"];
204
+ if (!validSortKeys.includes(sortKey)) {
205
+ console.error(` \u2716 Invalid sort key: ${opts.sort}. Use: risk, cvss, epss, name`);
206
+ cg.close();
207
+ process.exit(1);
208
+ }
209
+ const sortClause = sortKey === "risk" ? `v.risk_score DESC NULLS LAST` : sortKey === "cvss" ? `v.severity_score DESC NULLS LAST` : sortKey === "epss" ? `v.epss_score DESC NULLS LAST` : `v.cve_id ASC`;
210
+ query += ` ORDER BY ${sortClause}`;
211
+ const rows = rawDb.all(query, params);
212
+ const verdictRank = (v) => v === "affected" ? 3 : v === "under_investigation" ? 2 : v === "not_affected" ? 1 : 0;
213
+ const deduped = /* @__PURE__ */ new Map();
214
+ for (const row of rows) {
215
+ const key = `${row.cve_id}::${row.package_name ?? ""}::${row.ecosystem ?? ""}`;
216
+ const existing = deduped.get(key);
217
+ if (!existing || verdictRank(row.verdict) > verdictRank(existing.verdict)) {
218
+ deduped.set(key, row);
219
+ }
220
+ }
221
+ const dedupedRows = [...deduped.values()];
222
+ const suppressions = new import_suppressions.SuppressionManager(target);
223
+ const suppressedRows = dedupedRows.filter((row) => suppressions.isSuppressed(row.cve_id));
224
+ const filteredRows = dedupedRows.filter((row) => !suppressions.isSuppressed(row.cve_id));
225
+ if (filteredRows.length === 0) {
226
+ const filterNote = opts.severity || opts.verdict ? ` matching filters` : "";
227
+ console.log(`
228
+ ${import_ui.dim}No vulnerabilities found${filterNote}.${import_ui.reset}
229
+ `);
230
+ if (suppressedRows.length > 0) {
231
+ console.log(` ${import_ui.dim}${suppressedRows.length} CVE(s) suppressed \u2014 kirograph vuln suppressions to review${import_ui.reset}
232
+ `);
233
+ }
234
+ cg.close();
235
+ return;
236
+ }
237
+ function printVulnRow(row, indent = " ") {
238
+ const score = row.severity_score;
239
+ let severityLabel;
240
+ let severityColor;
241
+ if (score == null) {
242
+ severityLabel = "unknown";
243
+ severityColor = import_ui.dim;
244
+ } else if (score >= 9) {
245
+ severityLabel = "CRITICAL";
246
+ severityColor = "\x1B[31m";
247
+ } else if (score >= 7) {
248
+ severityLabel = "HIGH";
249
+ severityColor = "\x1B[31m";
250
+ } else if (score >= 4) {
251
+ severityLabel = "MEDIUM";
252
+ severityColor = "\x1B[33m";
253
+ } else {
254
+ severityLabel = "LOW";
255
+ severityColor = import_ui.dim;
256
+ }
257
+ let verdictLabel;
258
+ let verdictColor;
259
+ if (!row.verdict) {
260
+ verdictLabel = "pending";
261
+ verdictColor = import_ui.dim;
262
+ } else if (row.verdict === "affected") {
263
+ verdictLabel = "affected";
264
+ verdictColor = "\x1B[31m";
265
+ } else if (row.verdict === "not_affected") {
266
+ verdictLabel = "not affected";
267
+ verdictColor = import_ui.green;
268
+ } else {
269
+ verdictLabel = "investigating";
270
+ verdictColor = "\x1B[33m";
271
+ }
272
+ const pkg = row.package_name ? `${row.package_name}@${row.resolved_version || row.declared_constraint || "?"}` : "unknown package";
273
+ let epssBadge = "";
274
+ if (row.epss_score != null && row.epss_percentile != null) {
275
+ const epssColor = row.epss_score >= 0.3 ? "\x1B[33m" : import_ui.dim;
276
+ const scoreStr = row.epss_score.toFixed(2);
277
+ const pctStr = `${Math.round(row.epss_percentile * 100)}th%`;
278
+ epssBadge = ` ${epssColor}${import_ui.dim}[EPSS: ${scoreStr} / ${pctStr}]${import_ui.reset}`;
279
+ }
280
+ let riskBadge = "";
281
+ if (row.risk_score != null) {
282
+ const riskColor = row.risk_score >= 7 ? "\x1B[31m" : row.risk_score >= 4 ? "\x1B[33m" : import_ui.dim;
283
+ riskBadge = ` ${riskColor}[Risk: ${row.risk_score.toFixed(1)}]${import_ui.reset}`;
284
+ }
285
+ console.log(`${indent}${severityColor}${severityLabel}${import_ui.reset} ${import_ui.violet}${import_ui.bold}${row.cve_id}${import_ui.reset} ${import_ui.dim}${pkg}${import_ui.reset} [${verdictColor}${verdictLabel}${import_ui.reset}]${epssBadge}${riskBadge}`);
286
+ if (row.summary && row.summary !== "Manually registered") {
287
+ const truncated = row.summary.length > 100 ? row.summary.slice(0, 100) + "\u2026" : row.summary;
288
+ console.log(`${indent} ${import_ui.dim}${truncated}${import_ui.reset}`);
289
+ }
290
+ if (opts.stale && row.staleness_score != null) {
291
+ const s = row.staleness_score;
292
+ const staleColor = s >= 0.7 ? "\x1B[31m" : s >= 0.4 ? "\x1B[33m" : import_ui.dim;
293
+ console.log(`${indent} ${staleColor}${import_ui.dim}[staleness: ${s.toFixed(2)}]${import_ui.reset}`);
294
+ }
295
+ if (row.fixed_version && row.ecosystem && row.package_name) {
296
+ const fix = (0, import_fix_suggestions.formatFixSuggestion)(row.ecosystem, row.package_name, row.fixed_version);
297
+ if (fix) {
298
+ console.log(`${indent} ${fix}`);
299
+ }
300
+ }
301
+ console.log();
302
+ }
303
+ if (opts.groupBy === "workspace") {
304
+ const groups = /* @__PURE__ */ new Map();
305
+ for (const row of filteredRows) {
306
+ const ws = workspaceFromManifests(row.source_manifests ?? null);
307
+ if (!groups.has(ws)) groups.set(ws, []);
308
+ groups.get(ws).push(row);
309
+ }
310
+ const workspaces = Array.from(groups.keys());
311
+ if (workspaces.length <= 1) {
312
+ console.log(`
313
+ ${import_ui.bold}Vulnerabilities${import_ui.reset} (${filteredRows.length})
314
+ `);
315
+ for (const row of filteredRows) {
316
+ printVulnRow(row);
317
+ }
318
+ } else {
319
+ console.log(`
320
+ ${import_ui.bold}Vulnerabilities${import_ui.reset} (${filteredRows.length})
321
+ `);
322
+ for (const ws of workspaces) {
323
+ const wsRows = groups.get(ws);
324
+ const count = wsRows.length;
325
+ const header = `Workspace: ${ws} (${count} vulnerabilit${count === 1 ? "y" : "ies"})`;
326
+ const line = "\u2500".repeat(header.length);
327
+ console.log(` ${import_ui.bold}${header}${import_ui.reset}`);
328
+ console.log(` ${import_ui.dim}${line}${import_ui.reset}`);
329
+ for (const row of wsRows) {
330
+ printVulnRow(row);
331
+ }
332
+ }
333
+ }
334
+ } else {
335
+ console.log(`
336
+ ${import_ui.bold}Vulnerabilities${import_ui.reset} (${filteredRows.length})
337
+ `);
338
+ for (const row of filteredRows) {
339
+ printVulnRow(row);
340
+ }
341
+ }
342
+ if (suppressedRows.length > 0) {
343
+ console.log(` ${import_ui.dim}${suppressedRows.length} CVE(s) suppressed \u2014 kirograph vuln suppressions to review${import_ui.reset}
344
+ `);
345
+ }
346
+ if (opts.failOn !== void 0) {
347
+ const failOn = opts.failOn;
348
+ let failCount = 0;
349
+ let failReason = "";
350
+ if (failOn === "affected") {
351
+ failCount = filteredRows.filter((r) => r.verdict === "affected").length;
352
+ failReason = `affected`;
353
+ } else if (failOn === "any") {
354
+ failCount = filteredRows.length;
355
+ failReason = `any`;
356
+ } else if (failOn === "critical") {
357
+ failCount = filteredRows.filter((r) => r.severity_score != null && r.severity_score >= 9).length;
358
+ failReason = `critical`;
359
+ } else if (failOn === "high") {
360
+ failCount = filteredRows.filter((r) => r.severity_score != null && r.severity_score >= 7).length;
361
+ failReason = `high`;
362
+ } else {
363
+ const epssThreshold = parseEpssFailOn(failOn);
364
+ if (epssThreshold !== null) {
365
+ failCount = filteredRows.filter((r) => r.epss_score != null && r.epss_score >= epssThreshold).length;
366
+ failReason = `epss=${epssThreshold}`;
367
+ }
368
+ }
369
+ if (failCount > 0) {
370
+ console.log(` \x1B[31m\u2716\x1B[0m --fail-on ${failReason}: ${failCount} ${failReason === "any" ? "" : `${failReason} `}vulnerabilit${failCount === 1 ? "y" : "ies"} found. Exiting with code 1.`);
371
+ cg.close();
372
+ process.exit(1);
373
+ }
374
+ }
375
+ cg.close();
376
+ });
377
+ }
378
+ // Annotate the CommonJS export names for ESM import in node:
379
+ 0 && (module.exports = {
380
+ register
381
+ });
382
+ //# sourceMappingURL=vulns.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/vulns.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green } from '../ui';\nimport { formatFixSuggestion } from '../../security/export/fix-suggestions';\nimport { SuppressionManager } from '../../security/suppressions';\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Parse an `epss=N` fail-on value and return the threshold, or null if not an epss condition. */\nfunction parseEpssFailOn(failOn: string): number | null {\n const m = failOn.match(/^epss=(.+)$/);\n if (!m) return null;\n const n = parseFloat(m[1]);\n return isNaN(n) ? null : n;\n}\n\n/** Extract workspace label from a source_manifests JSON string. */\nfunction workspaceFromManifests(sourceManifests: string | null): string {\n if (!sourceManifests) return 'root';\n try {\n const manifests: string[] = JSON.parse(sourceManifests);\n if (!manifests.length) return 'root';\n const dir = path.dirname(manifests[0]);\n return dir === '.' ? 'root' : dir;\n } catch {\n return 'root';\n }\n}\n\nexport function register(program: Command): void {\n program\n .command('vulns [projectPath]')\n .description('List vulnerabilities with reachability verdicts and severity')\n .option('--severity <level>', 'Filter by severity: critical, high, medium, low')\n .option('--verdict <verdict>', 'Filter by verdict: affected, not_affected, under_investigation')\n .option('--refresh', 'Trigger fresh vulnerability enrichment before listing')\n .option('--epss <threshold>', 'Filter by EPSS score (e.g. 0.5 shows only vulns with EPSS >= 0.5)')\n .option('--stale', 'Show staleness score of the affected dependency alongside each CVE')\n .option('--sort <key>', 'Sort results by: risk (default), cvss, epss, name')\n .option('--add <cveId>', 'Manually register a CVE')\n .option('--package <name>', 'Package name for --add')\n .option('--version <ver>', 'Package version for --add')\n .option('--fail-on <condition>', 'Exit 1 if condition is met: affected, any, critical, high, epss=N')\n .option('--group-by <key>', 'Group output by: workspace')\n .action(async (projectPath: string | undefined, opts: {\n severity?: string;\n verdict?: string;\n refresh?: boolean;\n epss?: string;\n stale?: boolean;\n sort?: string;\n add?: string;\n package?: string;\n version?: string;\n failOn?: string;\n groupBy?: string;\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 // Validate --fail-on early\n if (opts.failOn !== undefined) {\n const validFailOns = ['affected', 'any', 'critical', 'high'];\n const isEpss = parseEpssFailOn(opts.failOn) !== null;\n if (!validFailOns.includes(opts.failOn) && !isEpss) {\n console.error(` \u2716 Invalid --fail-on value: ${opts.failOn}. Use: affected, any, critical, high, epss=N`);\n process.exit(1);\n }\n }\n\n // Validate --group-by early\n if (opts.groupBy !== undefined && opts.groupBy !== 'workspace') {\n console.error(` \u2716 Invalid --group-by value: ${opts.groupBy}. Supported: workspace`);\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 // Handle --add: manually register a CVE\n if (opts.add) {\n if (!opts.package || !opts.version) {\n console.error(` \u2716 --add requires --package <name> and --version <ver>`);\n cg.close(); process.exit(1);\n }\n\n const cveId = opts.add;\n const pkgName = opts.package;\n const pkgVersion = opts.version;\n\n // Find the matching dependency node\n const depRow: { node_id: string; ecosystem: string } | undefined = rawDb.get(\n `SELECT node_id, ecosystem FROM sec_dependencies\n WHERE package_name = ? AND (resolved_version = ? OR declared_constraint = ?)`,\n [pkgName, pkgVersion, pkgVersion],\n );\n\n if (!depRow) {\n console.error(` \u2716 No dependency found matching ${violet}${pkgName}@${pkgVersion}${reset}`);\n console.error(` ${dim}Run${reset} ${violet}${bold}kirograph index${reset} ${dim}first to discover dependencies.${reset}`);\n cg.close(); process.exit(1);\n }\n\n // Create the vulnerability node\n const vulnNodeId = `vuln:${cveId}`;\n const now = Date.now();\n\n rawDb.run(\n `INSERT OR REPLACE INTO nodes\n (id, kind, name, qualified_name, file_path, language,\n start_line, end_line, start_column, end_column,\n is_exported, is_async, is_static, is_abstract, updated_at)\n VALUES (?, 'vulnerability', ?, ?, '', 'unknown', 0, 0, 0, 0, 0, 0, 0, 0, ?)`,\n [vulnNodeId, cveId, cveId, now],\n );\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_vulnerabilities\n (node_id, cve_id, severity_score, affected_ranges, fixed_version, summary, source_database)\n VALUES (?, ?, NULL, '[]', NULL, 'Manually registered', 'manual')`,\n [vulnNodeId, cveId],\n );\n\n // Create has_vulnerability edge\n rawDb.run(\n `INSERT OR IGNORE INTO edges (source, target, kind, confidence, confidence_score)\n VALUES (?, ?, 'has_vulnerability', 'extracted', 1.0)`,\n [depRow.node_id, vulnNodeId],\n );\n\n console.log(` ${green}\u2713${reset} Registered ${violet}${bold}${cveId}${reset} against ${violet}${pkgName}@${pkgVersion}${reset}`);\n cg.close();\n return;\n }\n\n // Handle --refresh: trigger fresh vulnerability enrichment\n if (opts.refresh) {\n console.error(` ${dim}Refreshing vulnerability data from configured databases...${reset}`);\n const { OsvAdapter } = await Promise.resolve().then(() => require('../../security/vuln/osv-adapter.js'));\n const { VulnerabilityDatabaseClient } = await Promise.resolve().then(() => require('../../security/vuln/client.js'));\n\n const adapters = config.securityDatabases.map((dbName: string) => {\n if (dbName.toUpperCase() === 'OSV') return new OsvAdapter();\n return null;\n }).filter(Boolean) as any[];\n\n const client = new VulnerabilityDatabaseClient(adapters, db);\n const result = await client.enrichAll();\n\n console.error(` ${green}\u2713${reset} Checked ${bold}${result.dependenciesChecked}${reset} dependencies, found ${bold}${result.vulnerabilitiesFound}${reset} vulnerabilities`);\n if (result.errors.length > 0) {\n console.error(` ${'\\x1b[33m'}\u26A0${reset} ${result.errors.length} error(s) during enrichment`);\n }\n console.error();\n }\n\n // Build query for listing vulnerabilities\n // Include source_manifests when group-by workspace is requested\n const selectSourceManifests = opts.groupBy === 'workspace' ? `,\\n d.source_manifests` : '';\n let query = `\n SELECT\n v.node_id, v.cve_id, v.severity_score, v.fixed_version, v.summary, v.source_database,\n v.epss_score, v.epss_percentile, v.risk_score,\n d.package_name, d.ecosystem, d.resolved_version, d.declared_constraint,\n d.staleness_score,\n r.verdict${selectSourceManifests}\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 1=1\n `;\n const params: any[] = [];\n\n // Apply severity filter\n if (opts.severity) {\n const severityRanges: Record<string, [number, number]> = {\n critical: [9.0, 10.0],\n high: [7.0, 8.9],\n medium: [4.0, 6.9],\n low: [0.1, 3.9],\n };\n const range = severityRanges[opts.severity.toLowerCase()];\n if (!range) {\n console.error(` \u2716 Invalid severity: ${opts.severity}. Use: critical, high, medium, low`);\n cg.close(); process.exit(1);\n }\n query += ` AND v.severity_score >= ? AND v.severity_score <= ?`;\n params.push(range[0], range[1]);\n }\n\n // Apply verdict filter\n if (opts.verdict) {\n const validVerdicts = ['affected', 'not_affected', 'under_investigation'];\n if (!validVerdicts.includes(opts.verdict)) {\n console.error(` \u2716 Invalid verdict: ${opts.verdict}. Use: affected, not_affected, under_investigation`);\n cg.close(); process.exit(1);\n }\n query += ` AND r.verdict = ?`;\n params.push(opts.verdict);\n }\n\n // Apply EPSS threshold filter\n if (opts.epss !== undefined) {\n const epssThreshold = parseFloat(opts.epss);\n if (isNaN(epssThreshold) || epssThreshold < 0 || epssThreshold > 1) {\n console.error(` \u2716 Invalid EPSS threshold: ${opts.epss}. Use a number between 0 and 1 (e.g. 0.5)`);\n cg.close(); process.exit(1);\n }\n query += ` AND v.epss_score >= ?`;\n params.push(epssThreshold);\n }\n\n // Resolve sort order\n const sortKey = opts.sort?.toLowerCase() ?? 'risk';\n const validSortKeys = ['risk', 'cvss', 'epss', 'name'];\n if (!validSortKeys.includes(sortKey)) {\n console.error(` \u2716 Invalid sort key: ${opts.sort}. Use: risk, cvss, epss, name`);\n cg.close(); process.exit(1);\n }\n const sortClause =\n sortKey === 'risk' ? `v.risk_score DESC NULLS LAST` :\n sortKey === 'cvss' ? `v.severity_score DESC NULLS LAST` :\n sortKey === 'epss' ? `v.epss_score DESC NULLS LAST` :\n `v.cve_id ASC`;\n query += ` ORDER BY ${sortClause}`;\n\n const rows: Array<{\n node_id: string;\n cve_id: string;\n severity_score: number | null;\n fixed_version: string | null;\n summary: string | null;\n source_database: string;\n epss_score: number | null;\n epss_percentile: number | null;\n risk_score: number | null;\n package_name: string | null;\n ecosystem: string | null;\n resolved_version: string | null;\n declared_constraint: string | null;\n staleness_score: number | null;\n verdict: string | null;\n source_manifests?: string | null;\n }> = rawDb.all(query, params);\n\n // Deduplicate by (cve_id, package_name, ecosystem) \u2014 same CVE can appear multiple\n // times if a package is declared in multiple manifests (monorepo) or has multiple\n // dep nodes. Keep the row with the worst verdict (affected > under_investigation > not_affected > null).\n const verdictRank = (v: string | null) =>\n v === 'affected' ? 3 : v === 'under_investigation' ? 2 : v === 'not_affected' ? 1 : 0;\n const deduped = new Map<string, typeof rows[0]>();\n for (const row of rows) {\n const key = `${row.cve_id}::${row.package_name ?? ''}::${row.ecosystem ?? ''}`;\n const existing = deduped.get(key);\n if (!existing || verdictRank(row.verdict) > verdictRank(existing.verdict)) {\n deduped.set(key, row);\n }\n }\n const dedupedRows = [...deduped.values()];\n\n // Filter out suppressed CVEs\n const suppressions = new SuppressionManager(target);\n const suppressedRows = dedupedRows.filter(row => suppressions.isSuppressed(row.cve_id));\n const filteredRows = dedupedRows.filter(row => !suppressions.isSuppressed(row.cve_id));\n\n if (filteredRows.length === 0) {\n const filterNote = (opts.severity || opts.verdict)\n ? ` matching filters`\n : '';\n console.log(`\\n ${dim}No vulnerabilities found${filterNote}.${reset}\\n`);\n if (suppressedRows.length > 0) {\n console.log(` ${dim}${suppressedRows.length} CVE(s) suppressed \u2014 kirograph vuln suppressions to review${reset}\\n`);\n }\n cg.close();\n return;\n }\n\n // \u2500\u2500 Render a single vulnerability row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n function printVulnRow(row: (typeof filteredRows)[0], indent = ' '): void {\n // Severity badge\n const score = row.severity_score;\n let severityLabel: string;\n let severityColor: string;\n if (score == null) {\n severityLabel = 'unknown';\n severityColor = dim;\n } else if (score >= 9.0) {\n severityLabel = 'CRITICAL';\n severityColor = '\\x1b[31m';\n } else if (score >= 7.0) {\n severityLabel = 'HIGH';\n severityColor = '\\x1b[31m';\n } else if (score >= 4.0) {\n severityLabel = 'MEDIUM';\n severityColor = '\\x1b[33m';\n } else {\n severityLabel = 'LOW';\n severityColor = dim;\n }\n\n // Verdict badge\n let verdictLabel: string;\n let verdictColor: string;\n if (!row.verdict) {\n verdictLabel = 'pending';\n verdictColor = dim;\n } else if (row.verdict === 'affected') {\n verdictLabel = 'affected';\n verdictColor = '\\x1b[31m';\n } else if (row.verdict === 'not_affected') {\n verdictLabel = 'not affected';\n verdictColor = green;\n } else {\n verdictLabel = 'investigating';\n verdictColor = '\\x1b[33m';\n }\n\n const pkg = row.package_name\n ? `${row.package_name}@${row.resolved_version || row.declared_constraint || '?'}`\n : 'unknown package';\n\n // EPSS badge\n let epssBadge = '';\n if (row.epss_score != null && row.epss_percentile != null) {\n const epssColor = row.epss_score >= 0.3 ? '\\x1b[33m' : dim;\n const scoreStr = row.epss_score.toFixed(2);\n const pctStr = `${Math.round(row.epss_percentile * 100)}th%`;\n epssBadge = ` ${epssColor}${dim}[EPSS: ${scoreStr} / ${pctStr}]${reset}`;\n }\n\n // Risk score badge\n let riskBadge = '';\n if (row.risk_score != null) {\n const riskColor = row.risk_score >= 7 ? '\\x1b[31m' : row.risk_score >= 4 ? '\\x1b[33m' : dim;\n riskBadge = ` ${riskColor}[Risk: ${row.risk_score.toFixed(1)}]${reset}`;\n }\n\n console.log(`${indent}${severityColor}${severityLabel}${reset} ${violet}${bold}${row.cve_id}${reset} ${dim}${pkg}${reset} [${verdictColor}${verdictLabel}${reset}]${epssBadge}${riskBadge}`);\n\n if (row.summary && row.summary !== 'Manually registered') {\n const truncated = row.summary.length > 100 ? row.summary.slice(0, 100) + '\u2026' : row.summary;\n console.log(`${indent} ${dim}${truncated}${reset}`);\n }\n\n // Staleness badge (when --stale flag is set)\n if (opts.stale && row.staleness_score != null) {\n const s = row.staleness_score;\n const staleColor = s >= 0.7 ? '\\x1b[31m' : s >= 0.4 ? '\\x1b[33m' : dim;\n console.log(`${indent} ${staleColor}${dim}[staleness: ${s.toFixed(2)}]${reset}`);\n }\n\n // Fix suggestion\n if (row.fixed_version && row.ecosystem && row.package_name) {\n const fix = formatFixSuggestion(row.ecosystem, row.package_name, row.fixed_version);\n if (fix) {\n console.log(`${indent} ${fix}`);\n }\n }\n\n console.log();\n }\n\n // \u2500\u2500 Output: grouped or flat \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.groupBy === 'workspace') {\n // Group by workspace (directory of first source manifest)\n const groups = new Map<string, Array<(typeof filteredRows)[0]>>();\n for (const row of filteredRows) {\n const ws = workspaceFromManifests(row.source_manifests ?? null);\n if (!groups.has(ws)) groups.set(ws, []);\n groups.get(ws)!.push(row);\n }\n\n // Only apply workspace grouping when there are multiple distinct workspaces\n const workspaces = Array.from(groups.keys());\n if (workspaces.length <= 1) {\n // Single workspace \u2014 fall through to flat output\n console.log(`\\n ${bold}Vulnerabilities${reset} (${filteredRows.length})\\n`);\n for (const row of filteredRows) {\n printVulnRow(row);\n }\n } else {\n console.log(`\\n ${bold}Vulnerabilities${reset} (${filteredRows.length})\\n`);\n for (const ws of workspaces) {\n const wsRows = groups.get(ws)!;\n const count = wsRows.length;\n const header = `Workspace: ${ws} (${count} vulnerabilit${count === 1 ? 'y' : 'ies'})`;\n const line = '\u2500'.repeat(header.length);\n console.log(` ${bold}${header}${reset}`);\n console.log(` ${dim}${line}${reset}`);\n for (const row of wsRows) {\n printVulnRow(row);\n }\n }\n }\n } else {\n console.log(`\\n ${bold}Vulnerabilities${reset} (${filteredRows.length})\\n`);\n for (const row of filteredRows) {\n printVulnRow(row);\n }\n }\n\n if (suppressedRows.length > 0) {\n console.log(` ${dim}${suppressedRows.length} CVE(s) suppressed \u2014 kirograph vuln suppressions to review${reset}\\n`);\n }\n\n // \u2500\u2500 CI exit codes: --fail-on \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.failOn !== undefined) {\n const failOn = opts.failOn;\n\n let failCount = 0;\n let failReason = '';\n\n if (failOn === 'affected') {\n failCount = filteredRows.filter(r => r.verdict === 'affected').length;\n failReason = `affected`;\n } else if (failOn === 'any') {\n failCount = filteredRows.length;\n failReason = `any`;\n } else if (failOn === 'critical') {\n failCount = filteredRows.filter(r => r.severity_score != null && r.severity_score >= 9.0).length;\n failReason = `critical`;\n } else if (failOn === 'high') {\n failCount = filteredRows.filter(r => r.severity_score != null && r.severity_score >= 7.0).length;\n failReason = `high`;\n } else {\n const epssThreshold = parseEpssFailOn(failOn);\n if (epssThreshold !== null) {\n failCount = filteredRows.filter(r => r.epss_score != null && r.epss_score >= epssThreshold).length;\n failReason = `epss=${epssThreshold}`;\n }\n }\n\n if (failCount > 0) {\n console.log(` \\x1b[31m\u2716\\x1b[0m --fail-on ${failReason}: ${failCount} ${failReason === 'any' ? '' : `${failReason} `}vulnerabilit${failCount === 1 ? 'y' : 'ies'} found. Exiting with code 1.`);\n cg.close();\n process.exit(1);\n }\n }\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,125 @@
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 auto_detect_exports = {};
30
+ __export(auto_detect_exports, {
31
+ runAutoDetectInstaller: () => runAutoDetectInstaller
32
+ });
33
+ module.exports = __toCommonJS(auto_detect_exports);
34
+ var readline = __toESM(require("readline"));
35
+ var import_detect = require("./detect");
36
+ var import_index = require("./index");
37
+ var import_banner = require("../banner");
38
+ const dim = "\x1B[2m";
39
+ const reset = "\x1B[0m";
40
+ const green = "\x1B[32m";
41
+ const bold = "\x1B[1m";
42
+ async function runAutoDetectInstaller(opts = {}) {
43
+ if (!opts.skipBanner) (0, import_banner.printBanner)();
44
+ const cwd = process.cwd();
45
+ const detected = (0, import_detect.detectPlatforms)(cwd);
46
+ if (detected.length === 0) {
47
+ console.log(" No AI coding platforms detected in this environment.");
48
+ console.log(" Use --target <name> to install for a specific platform.");
49
+ console.log(` Available targets: kiro, claude, cursor, windsurf, codex, copilot, ...`);
50
+ console.log(` Run ${bold}kirograph install --help${reset} for the full list.
51
+ `);
52
+ return;
53
+ }
54
+ console.log(` ${bold}Detected platforms:${reset}
55
+ `);
56
+ for (const d of detected) {
57
+ console.log(` ${green}\u2713${reset} ${d.label.padEnd(20)} ${dim}(${d.reason})${reset}`);
58
+ }
59
+ console.log();
60
+ if (opts.dryRun) {
61
+ console.log(` ${dim}[dry-run] Would install KiroGraph for ${detected.length} platform(s).${reset}`);
62
+ console.log(` ${dim}[dry-run] No files will be written.${reset}
63
+ `);
64
+ return;
65
+ }
66
+ let targets = detected.map((d) => d.target);
67
+ if (!opts.skipPrompt) {
68
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
69
+ try {
70
+ const answer = await new Promise((resolve) => {
71
+ rl.question(` Install KiroGraph for all ${detected.length} detected platform(s)? [Y/n] `, resolve);
72
+ });
73
+ const trimmed = answer.trim().toLowerCase();
74
+ if (trimmed === "n" || trimmed === "no") {
75
+ console.log(" Cancelled. Use --target <name> to install for a specific platform.\n");
76
+ rl.close();
77
+ return;
78
+ }
79
+ if (detected.length > 1) {
80
+ const selectAnswer = await new Promise((resolve) => {
81
+ rl.question(` Install all, or select specific platforms? [all/select] `, resolve);
82
+ });
83
+ if (selectAnswer.trim().toLowerCase() === "select") {
84
+ const selectedTargets = [];
85
+ for (const d of detected) {
86
+ const include = await new Promise((resolve) => {
87
+ rl.question(` Include ${d.label}? [Y/n] `, resolve);
88
+ });
89
+ if (include.trim().toLowerCase() !== "n") {
90
+ selectedTargets.push(d.target);
91
+ }
92
+ }
93
+ targets = selectedTargets;
94
+ if (targets.length === 0) {
95
+ console.log(" No platforms selected. Cancelled.\n");
96
+ rl.close();
97
+ return;
98
+ }
99
+ }
100
+ }
101
+ rl.close();
102
+ } catch {
103
+ rl.close();
104
+ return;
105
+ }
106
+ }
107
+ console.log(`
108
+ Installing KiroGraph for ${targets.length} platform(s)...
109
+ `);
110
+ for (const target of targets) {
111
+ const label = detected.find((d) => d.target === target)?.label ?? target;
112
+ console.log(` \u2500\u2500 ${bold}${label}${reset} \u2500\u2500
113
+ `);
114
+ await (0, import_index.runInstaller)(target);
115
+ console.log();
116
+ }
117
+ console.log(` ${green}\u2713${reset} ${bold}All done!${reset} Configured ${targets.length} platform(s).`);
118
+ console.log(` Restart your AI coding tools for the MCP servers to load.
119
+ `);
120
+ }
121
+ // Annotate the CommonJS export names for ESM import in node:
122
+ 0 && (module.exports = {
123
+ runAutoDetectInstaller
124
+ });
125
+ //# sourceMappingURL=auto-detect.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/installer/auto-detect.ts"],
4
+ "sourcesContent": ["/**\n * Auto-detect installer for KiroGraph.\n *\n * When `kirograph install` is run without --target, this module detects\n * all installed AI coding platforms and offers to configure them all.\n */\n\nimport * as readline from 'readline';\nimport { detectPlatforms, type DetectionResult } from './detect';\nimport { runInstaller } from './index';\nimport { printBanner } from '../banner';\nimport type { InstallTarget } from './common';\n\nconst dim = '\\x1b[2m';\nconst reset = '\\x1b[0m';\nconst green = '\\x1b[32m';\nconst bold = '\\x1b[1m';\n\nexport interface AutoDetectOptions {\n /** Skip the confirmation prompt and install all detected platforms */\n skipPrompt?: boolean;\n /** Show what would be written without making changes */\n dryRun?: boolean;\n}\n\nexport async function runAutoDetectInstaller(opts: AutoDetectOptions & { skipBanner?: boolean } = {}): Promise<void> {\n if (!opts.skipBanner) printBanner();\n\n const cwd = process.cwd();\n const detected = detectPlatforms(cwd);\n\n if (detected.length === 0) {\n console.log(' No AI coding platforms detected in this environment.');\n console.log(' Use --target <name> to install for a specific platform.');\n console.log(` Available targets: kiro, claude, cursor, windsurf, codex, copilot, ...`);\n console.log(` Run ${bold}kirograph install --help${reset} for the full list.\\n`);\n return;\n }\n\n console.log(` ${bold}Detected platforms:${reset}\\n`);\n for (const d of detected) {\n console.log(` ${green}\u2713${reset} ${d.label.padEnd(20)} ${dim}(${d.reason})${reset}`);\n }\n console.log();\n\n if (opts.dryRun) {\n console.log(` ${dim}[dry-run] Would install KiroGraph for ${detected.length} platform(s).${reset}`);\n console.log(` ${dim}[dry-run] No files will be written.${reset}\\n`);\n return;\n }\n\n let targets: InstallTarget[] = detected.map(d => d.target);\n\n if (!opts.skipPrompt) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await new Promise<string>((resolve) => {\n rl.question(` Install KiroGraph for all ${detected.length} detected platform(s)? [Y/n] `, resolve);\n });\n const trimmed = answer.trim().toLowerCase();\n if (trimmed === 'n' || trimmed === 'no') {\n console.log(' Cancelled. Use --target <name> to install for a specific platform.\\n');\n rl.close();\n return;\n }\n\n // Ask if they want to select specific ones\n if (detected.length > 1) {\n const selectAnswer = await new Promise<string>((resolve) => {\n rl.question(` Install all, or select specific platforms? [all/select] `, resolve);\n });\n if (selectAnswer.trim().toLowerCase() === 'select') {\n const selectedTargets: InstallTarget[] = [];\n for (const d of detected) {\n const include = await new Promise<string>((resolve) => {\n rl.question(` Include ${d.label}? [Y/n] `, resolve);\n });\n if (include.trim().toLowerCase() !== 'n') {\n selectedTargets.push(d.target);\n }\n }\n targets = selectedTargets;\n if (targets.length === 0) {\n console.log(' No platforms selected. Cancelled.\\n');\n rl.close();\n return;\n }\n }\n }\n rl.close();\n } catch {\n rl.close();\n return;\n }\n }\n\n console.log(`\\n Installing KiroGraph for ${targets.length} platform(s)...\\n`);\n\n for (const target of targets) {\n const label = detected.find(d => d.target === target)?.label ?? target;\n console.log(` \u2500\u2500 ${bold}${label}${reset} \u2500\u2500\\n`);\n await runInstaller(target);\n console.log();\n }\n\n console.log(` ${green}\u2713${reset} ${bold}All done!${reset} Configured ${targets.length} platform(s).`);\n console.log(` Restart your AI coding tools for the MCP servers to load.\\n`);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }