kirograph 0.28.0 → 1.0.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 (753) hide show
  1. package/dist/architecture/index.js +4 -1
  2. package/dist/architecture/index.js.map +2 -2
  3. package/dist/architecture/manifest/index.js +13 -2
  4. package/dist/architecture/manifest/index.js.map +2 -2
  5. package/dist/bin/commands/install.js +2 -1
  6. package/dist/bin/commands/install.js.map +2 -2
  7. package/dist/bin/commands/status.js +2 -1
  8. package/dist/bin/commands/status.js.map +2 -2
  9. package/dist/bin/commands/uninit.js +2 -1
  10. package/dist/bin/commands/uninit.js.map +2 -2
  11. package/dist/bin/commands/vulns.js +10 -5
  12. package/dist/bin/commands/vulns.js.map +2 -2
  13. package/dist/bin/installer/common.js +7 -1
  14. package/dist/bin/installer/common.js.map +2 -2
  15. package/dist/bin/installer/config-prompt.js +117 -100
  16. package/dist/bin/installer/config-prompt.js.map +3 -3
  17. package/dist/bin/installer/detect.js +10 -0
  18. package/dist/bin/installer/detect.js.map +2 -2
  19. package/dist/bin/installer/hooks.js +13 -8
  20. package/dist/bin/installer/hooks.js.map +2 -2
  21. package/dist/bin/installer/targets/antigravity.js +1 -1
  22. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  23. package/dist/bin/installer/targets/claude.js +1 -1
  24. package/dist/bin/installer/targets/claude.js.map +2 -2
  25. package/dist/bin/installer/targets/codex.js +1 -1
  26. package/dist/bin/installer/targets/codex.js.map +2 -2
  27. package/dist/bin/installer/targets/commandcode.js +84 -0
  28. package/dist/bin/installer/targets/commandcode.js.map +7 -0
  29. package/dist/bin/installer/targets/copilot.js +1 -1
  30. package/dist/bin/installer/targets/copilot.js.map +2 -2
  31. package/dist/bin/installer/targets/cursor.js +2 -2
  32. package/dist/bin/installer/targets/cursor.js.map +2 -2
  33. package/dist/bin/installer/targets/devin.js +1 -1
  34. package/dist/bin/installer/targets/devin.js.map +2 -2
  35. package/dist/bin/installer/targets/gemini-cli.js +1 -1
  36. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  37. package/dist/bin/installer/targets/index.js +10 -0
  38. package/dist/bin/installer/targets/index.js.map +2 -2
  39. package/dist/bin/installer/targets/opencode.js +1 -1
  40. package/dist/bin/installer/targets/opencode.js.map +2 -2
  41. package/dist/bin/installer/targets/windsurf.js +1 -1
  42. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  43. package/dist/bin/kirograph.js +1 -1
  44. package/dist/bin/kirograph.js.map +1 -1
  45. package/dist/config.js +21 -1
  46. package/dist/config.js.map +2 -2
  47. package/dist/core/pipeline.js +18 -6
  48. package/dist/core/pipeline.js.map +2 -2
  49. package/dist/extraction/extractor.js +58 -1
  50. package/dist/extraction/extractor.js.map +2 -2
  51. package/dist/extraction/grammars.js +38 -3
  52. package/dist/extraction/grammars.js.map +2 -2
  53. package/dist/extraction/wasm/tree-sitter-bash.wasm +0 -0
  54. package/dist/extraction/wasm/tree-sitter-c.wasm +0 -0
  55. package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
  56. package/dist/extraction/wasm/tree-sitter-cpp.wasm +0 -0
  57. package/dist/extraction/wasm/tree-sitter-csharp.wasm +0 -0
  58. package/dist/extraction/wasm/tree-sitter-css.wasm +0 -0
  59. package/dist/extraction/wasm/tree-sitter-dart.wasm +0 -0
  60. package/dist/extraction/wasm/tree-sitter-elisp.wasm +0 -0
  61. package/dist/extraction/wasm/tree-sitter-elixir.wasm +0 -0
  62. package/dist/extraction/wasm/tree-sitter-elm.wasm +0 -0
  63. package/dist/extraction/wasm/tree-sitter-embedded_template.wasm +0 -0
  64. package/dist/extraction/wasm/tree-sitter-embeddedtemplate.wasm +0 -0
  65. package/dist/extraction/wasm/tree-sitter-go.wasm +0 -0
  66. package/dist/extraction/wasm/tree-sitter-html.wasm +0 -0
  67. package/dist/extraction/wasm/tree-sitter-java.wasm +0 -0
  68. package/dist/extraction/wasm/tree-sitter-javascript.wasm +0 -0
  69. package/dist/extraction/wasm/tree-sitter-json.wasm +0 -0
  70. package/dist/extraction/wasm/tree-sitter-kotlin.wasm +0 -0
  71. package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  72. package/dist/extraction/wasm/tree-sitter-objc.wasm +0 -0
  73. package/dist/extraction/wasm/tree-sitter-ocaml.wasm +0 -0
  74. package/dist/extraction/wasm/tree-sitter-php.wasm +0 -0
  75. package/dist/extraction/wasm/tree-sitter-python.wasm +0 -0
  76. package/dist/extraction/wasm/tree-sitter-ql.wasm +0 -0
  77. package/dist/extraction/wasm/tree-sitter-rescript.wasm +0 -0
  78. package/dist/extraction/wasm/tree-sitter-ruby.wasm +0 -0
  79. package/dist/extraction/wasm/tree-sitter-rust.wasm +0 -0
  80. package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  81. package/dist/extraction/wasm/tree-sitter-solidity.wasm +0 -0
  82. package/dist/extraction/wasm/tree-sitter-swift.wasm +0 -0
  83. package/dist/extraction/wasm/tree-sitter-systemrdl.wasm +0 -0
  84. package/dist/extraction/wasm/tree-sitter-tlaplus.wasm +0 -0
  85. package/dist/extraction/wasm/tree-sitter-toml.wasm +0 -0
  86. package/dist/extraction/wasm/tree-sitter-tsx.wasm +0 -0
  87. package/dist/extraction/wasm/tree-sitter-typescript.wasm +0 -0
  88. package/dist/extraction/wasm/tree-sitter-vue.wasm +0 -0
  89. package/dist/extraction/wasm/tree-sitter-yaml.wasm +0 -0
  90. package/dist/extraction/wasm/tree-sitter-zig.wasm +0 -0
  91. package/dist/frameworks/index.js +68 -7
  92. package/dist/frameworks/index.js.map +2 -2
  93. package/dist/security/manifest/adapter.js +17 -2
  94. package/dist/security/manifest/adapter.js.map +2 -2
  95. package/dist/security/manifest/parser.js +2 -2
  96. package/dist/security/manifest/parser.js.map +2 -2
  97. package/dist/security/pipeline.js +4 -1
  98. package/dist/security/pipeline.js.map +2 -2
  99. package/dist/security/reachability.js +61 -45
  100. package/dist/security/reachability.js.map +3 -3
  101. package/dist/security/types.js.map +1 -1
  102. package/dist/security/vuln/epss-client.js +1 -1
  103. package/dist/security/vuln/epss-client.js.map +1 -1
  104. package/dist/security/vuln/osv-adapter.js +99 -31
  105. package/dist/security/vuln/osv-adapter.js.map +2 -2
  106. package/dist/sync/index.js +9 -2
  107. package/dist/sync/index.js.map +2 -2
  108. package/dist/vectors/libsql-index.js +287 -0
  109. package/dist/vectors/libsql-index.js.map +7 -0
  110. package/dist/vectors/turso-index.js +307 -0
  111. package/dist/vectors/turso-index.js.map +7 -0
  112. package/package.json +3 -2
  113. package/dist/architecture/index.d.ts +0 -11
  114. package/dist/architecture/index.d.ts.map +0 -1
  115. package/dist/architecture/layers/csharp.d.ts +0 -6
  116. package/dist/architecture/layers/csharp.d.ts.map +0 -1
  117. package/dist/architecture/layers/dart.d.ts +0 -10
  118. package/dist/architecture/layers/dart.d.ts.map +0 -1
  119. package/dist/architecture/layers/elixir.d.ts +0 -6
  120. package/dist/architecture/layers/elixir.d.ts.map +0 -1
  121. package/dist/architecture/layers/go.d.ts +0 -7
  122. package/dist/architecture/layers/go.d.ts.map +0 -1
  123. package/dist/architecture/layers/index.d.ts +0 -30
  124. package/dist/architecture/layers/index.d.ts.map +0 -1
  125. package/dist/architecture/layers/java.d.ts +0 -7
  126. package/dist/architecture/layers/java.d.ts.map +0 -1
  127. package/dist/architecture/layers/ocaml.d.ts +0 -6
  128. package/dist/architecture/layers/ocaml.d.ts.map +0 -1
  129. package/dist/architecture/layers/python.d.ts +0 -7
  130. package/dist/architecture/layers/python.d.ts.map +0 -1
  131. package/dist/architecture/layers/ruby.d.ts +0 -6
  132. package/dist/architecture/layers/ruby.d.ts.map +0 -1
  133. package/dist/architecture/layers/rust.d.ts +0 -6
  134. package/dist/architecture/layers/rust.d.ts.map +0 -1
  135. package/dist/architecture/layers/scala.d.ts +0 -6
  136. package/dist/architecture/layers/scala.d.ts.map +0 -1
  137. package/dist/architecture/layers/solidity.d.ts +0 -6
  138. package/dist/architecture/layers/solidity.d.ts.map +0 -1
  139. package/dist/architecture/layers/types.d.ts +0 -2
  140. package/dist/architecture/layers/types.d.ts.map +0 -1
  141. package/dist/architecture/layers/typescript.d.ts +0 -9
  142. package/dist/architecture/layers/typescript.d.ts.map +0 -1
  143. package/dist/architecture/layers/vue.d.ts +0 -6
  144. package/dist/architecture/layers/vue.d.ts.map +0 -1
  145. package/dist/architecture/manifest/cargo.d.ts +0 -3
  146. package/dist/architecture/manifest/cargo.d.ts.map +0 -1
  147. package/dist/architecture/manifest/csproj.d.ts +0 -3
  148. package/dist/architecture/manifest/csproj.d.ts.map +0 -1
  149. package/dist/architecture/manifest/elm.d.ts +0 -3
  150. package/dist/architecture/manifest/elm.d.ts.map +0 -1
  151. package/dist/architecture/manifest/go.d.ts +0 -3
  152. package/dist/architecture/manifest/go.d.ts.map +0 -1
  153. package/dist/architecture/manifest/gradle.d.ts +0 -3
  154. package/dist/architecture/manifest/gradle.d.ts.map +0 -1
  155. package/dist/architecture/manifest/index.d.ts +0 -12
  156. package/dist/architecture/manifest/index.d.ts.map +0 -1
  157. package/dist/architecture/manifest/maven.d.ts +0 -3
  158. package/dist/architecture/manifest/maven.d.ts.map +0 -1
  159. package/dist/architecture/manifest/npm.d.ts +0 -3
  160. package/dist/architecture/manifest/npm.d.ts.map +0 -1
  161. package/dist/architecture/manifest/ocaml.d.ts +0 -3
  162. package/dist/architecture/manifest/ocaml.d.ts.map +0 -1
  163. package/dist/architecture/manifest/python.d.ts +0 -3
  164. package/dist/architecture/manifest/python.d.ts.map +0 -1
  165. package/dist/architecture/manifest/scala.d.ts +0 -3
  166. package/dist/architecture/manifest/scala.d.ts.map +0 -1
  167. package/dist/architecture/manifest/types.d.ts +0 -2
  168. package/dist/architecture/manifest/types.d.ts.map +0 -1
  169. package/dist/architecture/types.d.ts +0 -91
  170. package/dist/architecture/types.d.ts.map +0 -1
  171. package/dist/banner.d.ts +0 -6
  172. package/dist/banner.d.ts.map +0 -1
  173. package/dist/banner.js +0 -67
  174. package/dist/banner.js.map +0 -1
  175. package/dist/bin/banner.d.ts +0 -6
  176. package/dist/bin/banner.d.ts.map +0 -1
  177. package/dist/bin/commands/affected.d.ts +0 -3
  178. package/dist/bin/commands/affected.d.ts.map +0 -1
  179. package/dist/bin/commands/architecture.d.ts +0 -3
  180. package/dist/bin/commands/architecture.d.ts.map +0 -1
  181. package/dist/bin/commands/attack-surface.d.ts +0 -3
  182. package/dist/bin/commands/attack-surface.d.ts.map +0 -1
  183. package/dist/bin/commands/benchmark.d.ts +0 -9
  184. package/dist/bin/commands/benchmark.d.ts.map +0 -1
  185. package/dist/bin/commands/budget.d.ts +0 -6
  186. package/dist/bin/commands/budget.d.ts.map +0 -1
  187. package/dist/bin/commands/caveman.d.ts +0 -7
  188. package/dist/bin/commands/caveman.d.ts.map +0 -1
  189. package/dist/bin/commands/communities.d.ts +0 -3
  190. package/dist/bin/commands/communities.d.ts.map +0 -1
  191. package/dist/bin/commands/compression.d.ts +0 -7
  192. package/dist/bin/commands/compression.d.ts.map +0 -1
  193. package/dist/bin/commands/configure-mcp.js +0 -104
  194. package/dist/bin/commands/configure-mcp.js.map +0 -7
  195. package/dist/bin/commands/context.d.ts +0 -3
  196. package/dist/bin/commands/context.d.ts.map +0 -1
  197. package/dist/bin/commands/coupling.d.ts +0 -3
  198. package/dist/bin/commands/coupling.d.ts.map +0 -1
  199. package/dist/bin/commands/dashboard.d.ts +0 -3
  200. package/dist/bin/commands/dashboard.d.ts.map +0 -1
  201. package/dist/bin/commands/data.d.ts +0 -3
  202. package/dist/bin/commands/data.d.ts.map +0 -1
  203. package/dist/bin/commands/dead-code.d.ts +0 -3
  204. package/dist/bin/commands/dead-code.d.ts.map +0 -1
  205. package/dist/bin/commands/dep-confusion.d.ts +0 -3
  206. package/dist/bin/commands/dep-confusion.d.ts.map +0 -1
  207. package/dist/bin/commands/docs.d.ts +0 -3
  208. package/dist/bin/commands/docs.d.ts.map +0 -1
  209. package/dist/bin/commands/exec.d.ts +0 -11
  210. package/dist/bin/commands/exec.d.ts.map +0 -1
  211. package/dist/bin/commands/export.d.ts +0 -3
  212. package/dist/bin/commands/export.d.ts.map +0 -1
  213. package/dist/bin/commands/files.d.ts +0 -3
  214. package/dist/bin/commands/files.d.ts.map +0 -1
  215. package/dist/bin/commands/flows.d.ts +0 -3
  216. package/dist/bin/commands/flows.d.ts.map +0 -1
  217. package/dist/bin/commands/gain.d.ts +0 -6
  218. package/dist/bin/commands/gain.d.ts.map +0 -1
  219. package/dist/bin/commands/help.d.ts +0 -11
  220. package/dist/bin/commands/help.d.ts.map +0 -1
  221. package/dist/bin/commands/hotspots.d.ts +0 -3
  222. package/dist/bin/commands/hotspots.d.ts.map +0 -1
  223. package/dist/bin/commands/index.d.ts +0 -3
  224. package/dist/bin/commands/index.d.ts.map +0 -1
  225. package/dist/bin/commands/init.d.ts +0 -3
  226. package/dist/bin/commands/init.d.ts.map +0 -1
  227. package/dist/bin/commands/install.d.ts +0 -3
  228. package/dist/bin/commands/install.d.ts.map +0 -1
  229. package/dist/bin/commands/licenses.d.ts +0 -3
  230. package/dist/bin/commands/licenses.d.ts.map +0 -1
  231. package/dist/bin/commands/mark-dirty.d.ts +0 -3
  232. package/dist/bin/commands/mark-dirty.d.ts.map +0 -1
  233. package/dist/bin/commands/memory.d.ts +0 -16
  234. package/dist/bin/commands/memory.d.ts.map +0 -1
  235. package/dist/bin/commands/package.d.ts +0 -3
  236. package/dist/bin/commands/package.d.ts.map +0 -1
  237. package/dist/bin/commands/path.d.ts +0 -3
  238. package/dist/bin/commands/path.d.ts.map +0 -1
  239. package/dist/bin/commands/pattern.d.ts +0 -3
  240. package/dist/bin/commands/pattern.d.ts.map +0 -1
  241. package/dist/bin/commands/qdrant.d.ts +0 -3
  242. package/dist/bin/commands/qdrant.d.ts.map +0 -1
  243. package/dist/bin/commands/qdrant.js +0 -159
  244. package/dist/bin/commands/qdrant.js.map +0 -1
  245. package/dist/bin/commands/query.d.ts +0 -3
  246. package/dist/bin/commands/query.d.ts.map +0 -1
  247. package/dist/bin/commands/reachability.d.ts +0 -3
  248. package/dist/bin/commands/reachability.d.ts.map +0 -1
  249. package/dist/bin/commands/read.d.ts +0 -6
  250. package/dist/bin/commands/read.d.ts.map +0 -1
  251. package/dist/bin/commands/refactor.d.ts +0 -3
  252. package/dist/bin/commands/refactor.d.ts.map +0 -1
  253. package/dist/bin/commands/remediation.d.ts +0 -3
  254. package/dist/bin/commands/remediation.d.ts.map +0 -1
  255. package/dist/bin/commands/sbom.d.ts +0 -3
  256. package/dist/bin/commands/sbom.d.ts.map +0 -1
  257. package/dist/bin/commands/security-ci-report.d.ts +0 -9
  258. package/dist/bin/commands/security-ci-report.d.ts.map +0 -1
  259. package/dist/bin/commands/security-export.d.ts +0 -2
  260. package/dist/bin/commands/security-export.d.ts.map +0 -1
  261. package/dist/bin/commands/security-flows.d.ts +0 -3
  262. package/dist/bin/commands/security-flows.d.ts.map +0 -1
  263. package/dist/bin/commands/security-secrets.d.ts +0 -3
  264. package/dist/bin/commands/security-secrets.d.ts.map +0 -1
  265. package/dist/bin/commands/security.d.ts +0 -3
  266. package/dist/bin/commands/security.d.ts.map +0 -1
  267. package/dist/bin/commands/serve.d.ts +0 -3
  268. package/dist/bin/commands/serve.d.ts.map +0 -1
  269. package/dist/bin/commands/snapshot.d.ts +0 -3
  270. package/dist/bin/commands/snapshot.d.ts.map +0 -1
  271. package/dist/bin/commands/staleness.d.ts +0 -3
  272. package/dist/bin/commands/staleness.d.ts.map +0 -1
  273. package/dist/bin/commands/status.d.ts +0 -3
  274. package/dist/bin/commands/status.d.ts.map +0 -1
  275. package/dist/bin/commands/stop.d.ts +0 -3
  276. package/dist/bin/commands/stop.d.ts.map +0 -1
  277. package/dist/bin/commands/stop.js +0 -81
  278. package/dist/bin/commands/stop.js.map +0 -1
  279. package/dist/bin/commands/supply-chain.d.ts +0 -3
  280. package/dist/bin/commands/supply-chain.d.ts.map +0 -1
  281. package/dist/bin/commands/surprising.d.ts +0 -3
  282. package/dist/bin/commands/surprising.d.ts.map +0 -1
  283. package/dist/bin/commands/sync-if-dirty.d.ts +0 -3
  284. package/dist/bin/commands/sync-if-dirty.d.ts.map +0 -1
  285. package/dist/bin/commands/sync.d.ts +0 -3
  286. package/dist/bin/commands/sync.d.ts.map +0 -1
  287. package/dist/bin/commands/typesense.d.ts +0 -3
  288. package/dist/bin/commands/typesense.d.ts.map +0 -1
  289. package/dist/bin/commands/typesense.js +0 -126
  290. package/dist/bin/commands/typesense.js.map +0 -1
  291. package/dist/bin/commands/uninit.d.ts +0 -4
  292. package/dist/bin/commands/uninit.d.ts.map +0 -1
  293. package/dist/bin/commands/unlock.d.ts +0 -3
  294. package/dist/bin/commands/unlock.d.ts.map +0 -1
  295. package/dist/bin/commands/utils.d.ts +0 -17
  296. package/dist/bin/commands/utils.d.ts.map +0 -1
  297. package/dist/bin/commands/vex.d.ts +0 -3
  298. package/dist/bin/commands/vex.d.ts.map +0 -1
  299. package/dist/bin/commands/vuln-suppress.d.ts +0 -3
  300. package/dist/bin/commands/vuln-suppress.d.ts.map +0 -1
  301. package/dist/bin/commands/vulns.d.ts +0 -3
  302. package/dist/bin/commands/vulns.d.ts.map +0 -1
  303. package/dist/bin/installer/archive.d.ts +0 -47
  304. package/dist/bin/installer/archive.d.ts.map +0 -1
  305. package/dist/bin/installer/auto-detect.d.ts +0 -16
  306. package/dist/bin/installer/auto-detect.d.ts.map +0 -1
  307. package/dist/bin/installer/caveman.d.ts +0 -12
  308. package/dist/bin/installer/caveman.d.ts.map +0 -1
  309. package/dist/bin/installer/cli-agent.d.ts +0 -20
  310. package/dist/bin/installer/cli-agent.d.ts.map +0 -1
  311. package/dist/bin/installer/common.d.ts +0 -36
  312. package/dist/bin/installer/common.d.ts.map +0 -1
  313. package/dist/bin/installer/config-prompt.d.ts +0 -13
  314. package/dist/bin/installer/config-prompt.d.ts.map +0 -1
  315. package/dist/bin/installer/dashboard.d.ts +0 -3
  316. package/dist/bin/installer/dashboard.d.ts.map +0 -1
  317. package/dist/bin/installer/detect.d.ts +0 -30
  318. package/dist/bin/installer/detect.d.ts.map +0 -1
  319. package/dist/bin/installer/hooks.d.ts +0 -8
  320. package/dist/bin/installer/hooks.d.ts.map +0 -1
  321. package/dist/bin/installer/index.d.ts +0 -12
  322. package/dist/bin/installer/index.d.ts.map +0 -1
  323. package/dist/bin/installer/instructions.d.ts +0 -14
  324. package/dist/bin/installer/instructions.d.ts.map +0 -1
  325. package/dist/bin/installer/mcp.d.ts +0 -5
  326. package/dist/bin/installer/mcp.d.ts.map +0 -1
  327. package/dist/bin/installer/prompts.d.ts +0 -45
  328. package/dist/bin/installer/prompts.d.ts.map +0 -1
  329. package/dist/bin/installer/qdrant-dashboard.d.ts +0 -4
  330. package/dist/bin/installer/qdrant-dashboard.d.ts.map +0 -1
  331. package/dist/bin/installer/steering.d.ts +0 -17
  332. package/dist/bin/installer/steering.d.ts.map +0 -1
  333. package/dist/bin/installer/targets/aider.d.ts +0 -6
  334. package/dist/bin/installer/targets/aider.d.ts.map +0 -1
  335. package/dist/bin/installer/targets/amp.d.ts +0 -6
  336. package/dist/bin/installer/targets/amp.d.ts.map +0 -1
  337. package/dist/bin/installer/targets/antigravity.d.ts +0 -13
  338. package/dist/bin/installer/targets/antigravity.d.ts.map +0 -1
  339. package/dist/bin/installer/targets/augment.d.ts +0 -6
  340. package/dist/bin/installer/targets/augment.d.ts.map +0 -1
  341. package/dist/bin/installer/targets/claude.d.ts +0 -6
  342. package/dist/bin/installer/targets/claude.d.ts.map +0 -1
  343. package/dist/bin/installer/targets/cline.d.ts +0 -13
  344. package/dist/bin/installer/targets/cline.d.ts.map +0 -1
  345. package/dist/bin/installer/targets/codex.d.ts +0 -6
  346. package/dist/bin/installer/targets/codex.d.ts.map +0 -1
  347. package/dist/bin/installer/targets/continue.d.ts +0 -12
  348. package/dist/bin/installer/targets/continue.d.ts.map +0 -1
  349. package/dist/bin/installer/targets/copilot-cli.d.ts +0 -12
  350. package/dist/bin/installer/targets/copilot-cli.d.ts.map +0 -1
  351. package/dist/bin/installer/targets/copilot.d.ts +0 -6
  352. package/dist/bin/installer/targets/copilot.d.ts.map +0 -1
  353. package/dist/bin/installer/targets/cursor.d.ts +0 -6
  354. package/dist/bin/installer/targets/cursor.d.ts.map +0 -1
  355. package/dist/bin/installer/targets/devin.d.ts +0 -13
  356. package/dist/bin/installer/targets/devin.d.ts.map +0 -1
  357. package/dist/bin/installer/targets/gemini-cli.d.ts +0 -16
  358. package/dist/bin/installer/targets/gemini-cli.d.ts.map +0 -1
  359. package/dist/bin/installer/targets/generic.d.ts +0 -59
  360. package/dist/bin/installer/targets/generic.d.ts.map +0 -1
  361. package/dist/bin/installer/targets/goose.d.ts +0 -6
  362. package/dist/bin/installer/targets/goose.d.ts.map +0 -1
  363. package/dist/bin/installer/targets/index.d.ts +0 -11
  364. package/dist/bin/installer/targets/index.d.ts.map +0 -1
  365. package/dist/bin/installer/targets/junie.d.ts +0 -13
  366. package/dist/bin/installer/targets/junie.d.ts.map +0 -1
  367. package/dist/bin/installer/targets/kilo.d.ts +0 -12
  368. package/dist/bin/installer/targets/kilo.d.ts.map +0 -1
  369. package/dist/bin/installer/targets/kiro.d.ts +0 -5
  370. package/dist/bin/installer/targets/kiro.d.ts.map +0 -1
  371. package/dist/bin/installer/targets/opencode.d.ts +0 -13
  372. package/dist/bin/installer/targets/opencode.d.ts.map +0 -1
  373. package/dist/bin/installer/targets/openhands.d.ts +0 -6
  374. package/dist/bin/installer/targets/openhands.d.ts.map +0 -1
  375. package/dist/bin/installer/targets/qoder.d.ts +0 -12
  376. package/dist/bin/installer/targets/qoder.d.ts.map +0 -1
  377. package/dist/bin/installer/targets/qwen.d.ts +0 -12
  378. package/dist/bin/installer/targets/qwen.d.ts.map +0 -1
  379. package/dist/bin/installer/targets/replit.d.ts +0 -6
  380. package/dist/bin/installer/targets/replit.d.ts.map +0 -1
  381. package/dist/bin/installer/targets/roo.d.ts +0 -13
  382. package/dist/bin/installer/targets/roo.d.ts.map +0 -1
  383. package/dist/bin/installer/targets/tabnine.d.ts +0 -6
  384. package/dist/bin/installer/targets/tabnine.d.ts.map +0 -1
  385. package/dist/bin/installer/targets/trae.d.ts +0 -6
  386. package/dist/bin/installer/targets/trae.d.ts.map +0 -1
  387. package/dist/bin/installer/targets/warp.d.ts +0 -12
  388. package/dist/bin/installer/targets/warp.d.ts.map +0 -1
  389. package/dist/bin/installer/targets/windsurf.d.ts +0 -13
  390. package/dist/bin/installer/targets/windsurf.d.ts.map +0 -1
  391. package/dist/bin/kirograph.d.ts +0 -6
  392. package/dist/bin/kirograph.d.ts.map +0 -1
  393. package/dist/bin/progress.d.ts +0 -29
  394. package/dist/bin/progress.d.ts.map +0 -1
  395. package/dist/bin/ui.d.ts +0 -11
  396. package/dist/bin/ui.d.ts.map +0 -1
  397. package/dist/compression/filters/aws.d.ts +0 -9
  398. package/dist/compression/filters/aws.d.ts.map +0 -1
  399. package/dist/compression/filters/docker.d.ts +0 -6
  400. package/dist/compression/filters/docker.d.ts.map +0 -1
  401. package/dist/compression/filters/files.d.ts +0 -6
  402. package/dist/compression/filters/files.d.ts.map +0 -1
  403. package/dist/compression/filters/generic.d.ts +0 -7
  404. package/dist/compression/filters/generic.d.ts.map +0 -1
  405. package/dist/compression/filters/git.d.ts +0 -6
  406. package/dist/compression/filters/git.d.ts.map +0 -1
  407. package/dist/compression/filters/github.d.ts +0 -6
  408. package/dist/compression/filters/github.d.ts.map +0 -1
  409. package/dist/compression/filters/lint.d.ts +0 -6
  410. package/dist/compression/filters/lint.d.ts.map +0 -1
  411. package/dist/compression/filters/misc.d.ts +0 -6
  412. package/dist/compression/filters/misc.d.ts.map +0 -1
  413. package/dist/compression/filters/package.d.ts +0 -6
  414. package/dist/compression/filters/package.d.ts.map +0 -1
  415. package/dist/compression/filters/test.d.ts +0 -6
  416. package/dist/compression/filters/test.d.ts.map +0 -1
  417. package/dist/compression/index.d.ts +0 -29
  418. package/dist/compression/index.d.ts.map +0 -1
  419. package/dist/compression/naive-cost.d.ts +0 -26
  420. package/dist/compression/naive-cost.d.ts.map +0 -1
  421. package/dist/compression/tracker.d.ts +0 -155
  422. package/dist/compression/tracker.d.ts.map +0 -1
  423. package/dist/compression/types.d.ts +0 -49
  424. package/dist/compression/types.d.ts.map +0 -1
  425. package/dist/config.d.ts +0 -138
  426. package/dist/config.d.ts.map +0 -1
  427. package/dist/context/index.d.ts +0 -61
  428. package/dist/context/index.d.ts.map +0 -1
  429. package/dist/core/file-tree.d.ts +0 -15
  430. package/dist/core/file-tree.d.ts.map +0 -1
  431. package/dist/core/lock-manager.d.ts +0 -22
  432. package/dist/core/lock-manager.d.ts.map +0 -1
  433. package/dist/core/pipeline.d.ts +0 -40
  434. package/dist/core/pipeline.d.ts.map +0 -1
  435. package/dist/core/snapshot.d.ts +0 -58
  436. package/dist/core/snapshot.d.ts.map +0 -1
  437. package/dist/data/filters.d.ts +0 -23
  438. package/dist/data/filters.d.ts.map +0 -1
  439. package/dist/data/indexer.d.ts +0 -25
  440. package/dist/data/indexer.d.ts.map +0 -1
  441. package/dist/data/linker.d.ts +0 -37
  442. package/dist/data/linker.d.ts.map +0 -1
  443. package/dist/data/linker.test.js +0 -60
  444. package/dist/data/linker.test.js.map +0 -7
  445. package/dist/data/lint.d.ts +0 -27
  446. package/dist/data/lint.d.ts.map +0 -1
  447. package/dist/data/parsers/__fixtures__/pdf-inspector-stub.js +0 -41
  448. package/dist/data/parsers/__fixtures__/pdf-inspector-stub.js.map +0 -7
  449. package/dist/data/parsers/csv.d.ts +0 -11
  450. package/dist/data/parsers/csv.d.ts.map +0 -1
  451. package/dist/data/parsers/excel.d.ts +0 -10
  452. package/dist/data/parsers/excel.d.ts.map +0 -1
  453. package/dist/data/parsers/index.d.ts +0 -28
  454. package/dist/data/parsers/index.d.ts.map +0 -1
  455. package/dist/data/parsers/json-array.d.ts +0 -9
  456. package/dist/data/parsers/json-array.d.ts.map +0 -1
  457. package/dist/data/parsers/jsonl.d.ts +0 -9
  458. package/dist/data/parsers/jsonl.d.ts.map +0 -1
  459. package/dist/data/parsers/parquet.d.ts +0 -10
  460. package/dist/data/parsers/parquet.d.ts.map +0 -1
  461. package/dist/data/parsers/pdf.test.js +0 -125
  462. package/dist/data/parsers/pdf.test.js.map +0 -7
  463. package/dist/data/pixelrag-bridge.js +0 -93
  464. package/dist/data/pixelrag-bridge.js.map +0 -7
  465. package/dist/data/pixelrag-manager.js +0 -416
  466. package/dist/data/pixelrag-manager.js.map +0 -7
  467. package/dist/data/profiler.d.ts +0 -29
  468. package/dist/data/profiler.d.ts.map +0 -1
  469. package/dist/data/queries.d.ts +0 -95
  470. package/dist/data/queries.d.ts.map +0 -1
  471. package/dist/data/types.d.ts +0 -103
  472. package/dist/data/types.d.ts.map +0 -1
  473. package/dist/db/database.d.ts +0 -190
  474. package/dist/db/database.d.ts.map +0 -1
  475. package/dist/docs/formats/asciidoc.d.ts +0 -9
  476. package/dist/docs/formats/asciidoc.d.ts.map +0 -1
  477. package/dist/docs/formats/html.d.ts +0 -10
  478. package/dist/docs/formats/html.d.ts.map +0 -1
  479. package/dist/docs/formats/index.d.ts +0 -31
  480. package/dist/docs/formats/index.d.ts.map +0 -1
  481. package/dist/docs/formats/markdown.d.ts +0 -11
  482. package/dist/docs/formats/markdown.d.ts.map +0 -1
  483. package/dist/docs/formats/openapi.d.ts +0 -17
  484. package/dist/docs/formats/openapi.d.ts.map +0 -1
  485. package/dist/docs/formats/org.d.ts +0 -9
  486. package/dist/docs/formats/org.d.ts.map +0 -1
  487. package/dist/docs/formats/plaintext.d.ts +0 -11
  488. package/dist/docs/formats/plaintext.d.ts.map +0 -1
  489. package/dist/docs/formats/rdoc.d.ts +0 -10
  490. package/dist/docs/formats/rdoc.d.ts.map +0 -1
  491. package/dist/docs/formats/rst.d.ts +0 -11
  492. package/dist/docs/formats/rst.d.ts.map +0 -1
  493. package/dist/docs/indexer.d.ts +0 -49
  494. package/dist/docs/indexer.d.ts.map +0 -1
  495. package/dist/docs/linker.d.ts +0 -30
  496. package/dist/docs/linker.d.ts.map +0 -1
  497. package/dist/docs/lint.d.ts +0 -27
  498. package/dist/docs/lint.d.ts.map +0 -1
  499. package/dist/docs/queries.d.ts +0 -78
  500. package/dist/docs/queries.d.ts.map +0 -1
  501. package/dist/docs/section-id.d.ts +0 -48
  502. package/dist/docs/section-id.d.ts.map +0 -1
  503. package/dist/docs/summarizer.d.ts +0 -13
  504. package/dist/docs/summarizer.d.ts.map +0 -1
  505. package/dist/docs/types.d.ts +0 -71
  506. package/dist/docs/types.d.ts.map +0 -1
  507. package/dist/docs/vectors.d.ts +0 -54
  508. package/dist/docs/vectors.d.ts.map +0 -1
  509. package/dist/errors.d.ts +0 -49
  510. package/dist/errors.d.ts.map +0 -1
  511. package/dist/extraction/extractor.d.ts +0 -29
  512. package/dist/extraction/extractor.d.ts.map +0 -1
  513. package/dist/extraction/grammars.d.ts +0 -54
  514. package/dist/extraction/grammars.d.ts.map +0 -1
  515. package/dist/extraction/languages.d.ts +0 -9
  516. package/dist/extraction/languages.d.ts.map +0 -1
  517. package/dist/extraction/notebook.d.ts +0 -14
  518. package/dist/extraction/notebook.d.ts.map +0 -1
  519. package/dist/frameworks/amplify.d.ts +0 -9
  520. package/dist/frameworks/amplify.d.ts.map +0 -1
  521. package/dist/frameworks/angular.d.ts +0 -9
  522. package/dist/frameworks/angular.d.ts.map +0 -1
  523. package/dist/frameworks/ansible.d.ts +0 -8
  524. package/dist/frameworks/ansible.d.ts.map +0 -1
  525. package/dist/frameworks/cloudformation.d.ts +0 -9
  526. package/dist/frameworks/cloudformation.d.ts.map +0 -1
  527. package/dist/frameworks/csharp.d.ts +0 -8
  528. package/dist/frameworks/csharp.d.ts.map +0 -1
  529. package/dist/frameworks/docker.d.ts +0 -9
  530. package/dist/frameworks/docker.d.ts.map +0 -1
  531. package/dist/frameworks/elixir.d.ts +0 -6
  532. package/dist/frameworks/elixir.d.ts.map +0 -1
  533. package/dist/frameworks/express.d.ts +0 -8
  534. package/dist/frameworks/express.d.ts.map +0 -1
  535. package/dist/frameworks/flutter.d.ts +0 -12
  536. package/dist/frameworks/flutter.d.ts.map +0 -1
  537. package/dist/frameworks/go.d.ts +0 -8
  538. package/dist/frameworks/go.d.ts.map +0 -1
  539. package/dist/frameworks/iac.d.ts +0 -10
  540. package/dist/frameworks/iac.d.ts.map +0 -1
  541. package/dist/frameworks/index.d.ts +0 -44
  542. package/dist/frameworks/index.d.ts.map +0 -1
  543. package/dist/frameworks/java.d.ts +0 -8
  544. package/dist/frameworks/java.d.ts.map +0 -1
  545. package/dist/frameworks/kubernetes.d.ts +0 -9
  546. package/dist/frameworks/kubernetes.d.ts.map +0 -1
  547. package/dist/frameworks/laravel.d.ts +0 -9
  548. package/dist/frameworks/laravel.d.ts.map +0 -1
  549. package/dist/frameworks/pulumi.d.ts +0 -9
  550. package/dist/frameworks/pulumi.d.ts.map +0 -1
  551. package/dist/frameworks/python.d.ts +0 -10
  552. package/dist/frameworks/python.d.ts.map +0 -1
  553. package/dist/frameworks/react.d.ts +0 -9
  554. package/dist/frameworks/react.d.ts.map +0 -1
  555. package/dist/frameworks/ruby.d.ts +0 -8
  556. package/dist/frameworks/ruby.d.ts.map +0 -1
  557. package/dist/frameworks/rust.d.ts +0 -8
  558. package/dist/frameworks/rust.d.ts.map +0 -1
  559. package/dist/frameworks/scala.d.ts +0 -6
  560. package/dist/frameworks/scala.d.ts.map +0 -1
  561. package/dist/frameworks/solidity.d.ts +0 -6
  562. package/dist/frameworks/solidity.d.ts.map +0 -1
  563. package/dist/frameworks/svelte.d.ts +0 -8
  564. package/dist/frameworks/svelte.d.ts.map +0 -1
  565. package/dist/frameworks/swift.d.ts +0 -10
  566. package/dist/frameworks/swift.d.ts.map +0 -1
  567. package/dist/frameworks/terraform.d.ts +0 -14
  568. package/dist/frameworks/terraform.d.ts.map +0 -1
  569. package/dist/frameworks/types.d.ts +0 -37
  570. package/dist/frameworks/types.d.ts.map +0 -1
  571. package/dist/frameworks/vue.d.ts +0 -7
  572. package/dist/frameworks/vue.d.ts.map +0 -1
  573. package/dist/graph/communities.d.ts +0 -43
  574. package/dist/graph/communities.d.ts.map +0 -1
  575. package/dist/graph/flows.d.ts +0 -55
  576. package/dist/graph/flows.d.ts.map +0 -1
  577. package/dist/graph/queries.d.ts +0 -53
  578. package/dist/graph/queries.d.ts.map +0 -1
  579. package/dist/graph/refactor.d.ts +0 -43
  580. package/dist/graph/refactor.d.ts.map +0 -1
  581. package/dist/graph/traversal.d.ts +0 -35
  582. package/dist/graph/traversal.d.ts.map +0 -1
  583. package/dist/index.d.ts +0 -134
  584. package/dist/index.d.ts.map +0 -1
  585. package/dist/installer/index.d.ts +0 -10
  586. package/dist/installer/index.d.ts.map +0 -1
  587. package/dist/installer/index.js +0 -526
  588. package/dist/installer/index.js.map +0 -1
  589. package/dist/mcp/cache.d.ts +0 -69
  590. package/dist/mcp/cache.d.ts.map +0 -1
  591. package/dist/mcp/read-modes.d.ts +0 -31
  592. package/dist/mcp/read-modes.d.ts.map +0 -1
  593. package/dist/mcp/server.d.ts +0 -17
  594. package/dist/mcp/server.d.ts.map +0 -1
  595. package/dist/mcp/tool-names.d.ts +0 -2
  596. package/dist/mcp/tool-names.d.ts.map +0 -1
  597. package/dist/mcp/tools.d.ts +0 -49
  598. package/dist/mcp/tools.d.ts.map +0 -1
  599. package/dist/mcp/transport.d.ts +0 -29
  600. package/dist/mcp/transport.d.ts.map +0 -1
  601. package/dist/memory/compress.d.ts +0 -19
  602. package/dist/memory/compress.d.ts.map +0 -1
  603. package/dist/memory/database.d.ts +0 -92
  604. package/dist/memory/database.d.ts.map +0 -1
  605. package/dist/memory/index.d.ts +0 -71
  606. package/dist/memory/index.d.ts.map +0 -1
  607. package/dist/memory/symbols.d.ts +0 -21
  608. package/dist/memory/symbols.d.ts.map +0 -1
  609. package/dist/memory/types.d.ts +0 -78
  610. package/dist/memory/types.d.ts.map +0 -1
  611. package/dist/memory/vectors.d.ts +0 -43
  612. package/dist/memory/vectors.d.ts.map +0 -1
  613. package/dist/patterns/graph.d.ts +0 -16
  614. package/dist/patterns/graph.d.ts.map +0 -1
  615. package/dist/patterns/index.d.ts +0 -4
  616. package/dist/patterns/index.d.ts.map +0 -1
  617. package/dist/patterns/indexer.d.ts +0 -15
  618. package/dist/patterns/indexer.d.ts.map +0 -1
  619. package/dist/patterns/loader.d.ts +0 -18
  620. package/dist/patterns/loader.d.ts.map +0 -1
  621. package/dist/patterns/runner.d.ts +0 -42
  622. package/dist/patterns/runner.d.ts.map +0 -1
  623. package/dist/patterns/types.d.ts +0 -27
  624. package/dist/patterns/types.d.ts.map +0 -1
  625. package/dist/resolution/bridges/android-rn.d.ts +0 -13
  626. package/dist/resolution/bridges/android-rn.d.ts.map +0 -1
  627. package/dist/resolution/bridges/expo-modules.d.ts +0 -10
  628. package/dist/resolution/bridges/expo-modules.d.ts.map +0 -1
  629. package/dist/resolution/bridges/flutter-channel.d.ts +0 -14
  630. package/dist/resolution/bridges/flutter-channel.d.ts.map +0 -1
  631. package/dist/resolution/bridges/index.d.ts +0 -40
  632. package/dist/resolution/bridges/index.d.ts.map +0 -1
  633. package/dist/resolution/bridges/native-events.d.ts +0 -10
  634. package/dist/resolution/bridges/native-events.d.ts.map +0 -1
  635. package/dist/resolution/bridges/native-views.d.ts +0 -13
  636. package/dist/resolution/bridges/native-views.d.ts.map +0 -1
  637. package/dist/resolution/bridges/react-native.d.ts +0 -9
  638. package/dist/resolution/bridges/react-native.d.ts.map +0 -1
  639. package/dist/resolution/bridges/swift-objc.d.ts +0 -14
  640. package/dist/resolution/bridges/swift-objc.d.ts.map +0 -1
  641. package/dist/resolution/bridges/turbomodules.d.ts +0 -10
  642. package/dist/resolution/bridges/turbomodules.d.ts.map +0 -1
  643. package/dist/resolution/index.d.ts +0 -81
  644. package/dist/resolution/index.d.ts.map +0 -1
  645. package/dist/resolution/name-matcher.d.ts +0 -25
  646. package/dist/resolution/name-matcher.d.ts.map +0 -1
  647. package/dist/scripts/postinstall.js +0 -64
  648. package/dist/search/query-utils.d.ts +0 -21
  649. package/dist/search/query-utils.d.ts.map +0 -1
  650. package/dist/search/searcher.d.ts +0 -15
  651. package/dist/search/searcher.d.ts.map +0 -1
  652. package/dist/security/attack-surface.d.ts +0 -46
  653. package/dist/security/attack-surface.d.ts.map +0 -1
  654. package/dist/security/context-warnings.d.ts +0 -40
  655. package/dist/security/context-warnings.d.ts.map +0 -1
  656. package/dist/security/data-flows.d.ts +0 -33
  657. package/dist/security/data-flows.d.ts.map +0 -1
  658. package/dist/security/dep-confusion.d.ts +0 -23
  659. package/dist/security/dep-confusion.d.ts.map +0 -1
  660. package/dist/security/errors.d.ts +0 -16
  661. package/dist/security/errors.d.ts.map +0 -1
  662. package/dist/security/export/fix-suggestions.d.ts +0 -21
  663. package/dist/security/export/fix-suggestions.d.ts.map +0 -1
  664. package/dist/security/export/sbom.d.ts +0 -33
  665. package/dist/security/export/sbom.d.ts.map +0 -1
  666. package/dist/security/export/serialization.d.ts +0 -62
  667. package/dist/security/export/serialization.d.ts.map +0 -1
  668. package/dist/security/export/vex.d.ts +0 -58
  669. package/dist/security/export/vex.d.ts.map +0 -1
  670. package/dist/security/index.d.ts +0 -21
  671. package/dist/security/index.d.ts.map +0 -1
  672. package/dist/security/integrator.d.ts +0 -63
  673. package/dist/security/integrator.d.ts.map +0 -1
  674. package/dist/security/license.d.ts +0 -33
  675. package/dist/security/license.d.ts.map +0 -1
  676. package/dist/security/manifest/adapter.d.ts +0 -92
  677. package/dist/security/manifest/adapter.d.ts.map +0 -1
  678. package/dist/security/manifest/parser.d.ts +0 -73
  679. package/dist/security/manifest/parser.d.ts.map +0 -1
  680. package/dist/security/manifest/plugins/cargo.d.ts +0 -11
  681. package/dist/security/manifest/plugins/cargo.d.ts.map +0 -1
  682. package/dist/security/manifest/plugins/composer.d.ts +0 -11
  683. package/dist/security/manifest/plugins/composer.d.ts.map +0 -1
  684. package/dist/security/manifest/plugins/go.d.ts +0 -12
  685. package/dist/security/manifest/plugins/go.d.ts.map +0 -1
  686. package/dist/security/manifest/plugins/gradle.d.ts +0 -12
  687. package/dist/security/manifest/plugins/gradle.d.ts.map +0 -1
  688. package/dist/security/manifest/plugins/hex.d.ts +0 -11
  689. package/dist/security/manifest/plugins/hex.d.ts.map +0 -1
  690. package/dist/security/manifest/plugins/maven.d.ts +0 -11
  691. package/dist/security/manifest/plugins/maven.d.ts.map +0 -1
  692. package/dist/security/manifest/plugins/npm.d.ts +0 -11
  693. package/dist/security/manifest/plugins/npm.d.ts.map +0 -1
  694. package/dist/security/manifest/plugins/nuget.d.ts +0 -12
  695. package/dist/security/manifest/plugins/nuget.d.ts.map +0 -1
  696. package/dist/security/manifest/plugins/pip.d.ts +0 -11
  697. package/dist/security/manifest/plugins/pip.d.ts.map +0 -1
  698. package/dist/security/manifest/plugins/pubspec.d.ts +0 -11
  699. package/dist/security/manifest/plugins/pubspec.d.ts.map +0 -1
  700. package/dist/security/manifest/plugins/pyproject.d.ts +0 -3
  701. package/dist/security/manifest/plugins/pyproject.d.ts.map +0 -1
  702. package/dist/security/manifest/plugins/rubygems.d.ts +0 -11
  703. package/dist/security/manifest/plugins/rubygems.d.ts.map +0 -1
  704. package/dist/security/manifest/plugins/swift.d.ts +0 -11
  705. package/dist/security/manifest/plugins/swift.d.ts.map +0 -1
  706. package/dist/security/owasp.d.ts +0 -16
  707. package/dist/security/owasp.d.ts.map +0 -1
  708. package/dist/security/pipeline.d.ts +0 -37
  709. package/dist/security/pipeline.d.ts.map +0 -1
  710. package/dist/security/reachability.d.ts +0 -67
  711. package/dist/security/reachability.d.ts.map +0 -1
  712. package/dist/security/remediation.d.ts +0 -51
  713. package/dist/security/remediation.d.ts.map +0 -1
  714. package/dist/security/secrets.d.ts +0 -38
  715. package/dist/security/secrets.d.ts.map +0 -1
  716. package/dist/security/staleness.d.ts +0 -43
  717. package/dist/security/staleness.d.ts.map +0 -1
  718. package/dist/security/supply-chain.d.ts +0 -34
  719. package/dist/security/supply-chain.d.ts.map +0 -1
  720. package/dist/security/suppressions.d.ts +0 -18
  721. package/dist/security/suppressions.d.ts.map +0 -1
  722. package/dist/security/types.d.ts +0 -144
  723. package/dist/security/types.d.ts.map +0 -1
  724. package/dist/security/vuln/client.d.ts +0 -90
  725. package/dist/security/vuln/client.d.ts.map +0 -1
  726. package/dist/security/vuln/epss-client.d.ts +0 -26
  727. package/dist/security/vuln/epss-client.d.ts.map +0 -1
  728. package/dist/security/vuln/index.d.ts +0 -6
  729. package/dist/security/vuln/index.d.ts.map +0 -1
  730. package/dist/security/vuln/osv-adapter.d.ts +0 -58
  731. package/dist/security/vuln/osv-adapter.d.ts.map +0 -1
  732. package/dist/security/vuln/types.d.ts +0 -29
  733. package/dist/security/vuln/types.d.ts.map +0 -1
  734. package/dist/sync/index.d.ts +0 -35
  735. package/dist/sync/index.d.ts.map +0 -1
  736. package/dist/types.d.ts +0 -137
  737. package/dist/types.d.ts.map +0 -1
  738. package/dist/utils.d.ts +0 -52
  739. package/dist/utils.d.ts.map +0 -1
  740. package/dist/vectors/index.d.ts +0 -79
  741. package/dist/vectors/index.d.ts.map +0 -1
  742. package/dist/vectors/lancedb-index.d.ts +0 -50
  743. package/dist/vectors/lancedb-index.d.ts.map +0 -1
  744. package/dist/vectors/orama-index.d.ts +0 -54
  745. package/dist/vectors/orama-index.d.ts.map +0 -1
  746. package/dist/vectors/pglite-index.d.ts +0 -53
  747. package/dist/vectors/pglite-index.d.ts.map +0 -1
  748. package/dist/vectors/qdrant-index.d.ts +0 -77
  749. package/dist/vectors/qdrant-index.d.ts.map +0 -1
  750. package/dist/vectors/typesense-index.d.ts +0 -75
  751. package/dist/vectors/typesense-index.d.ts.map +0 -1
  752. package/dist/vectors/vec-index.d.ts +0 -52
  753. package/dist/vectors/vec-index.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AACtB,oBAA2B;AAC3B,gBAAgD;AAChD,6BAAoC;AACpC,0BAAmC;AAKnC,SAAS,gBAAgB,QAA+B;AACtD,QAAM,IAAI,OAAO,MAAM,aAAa;AACpC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,WAAW,EAAE,CAAC,CAAC;AACzB,SAAO,MAAM,CAAC,IAAI,OAAO;AAC3B;AAGA,SAAS,uBAAuB,iBAAwC;AACtE,MAAI,CAAC,gBAAiB,QAAO;AAC7B,MAAI;AACF,UAAM,YAAsB,KAAK,MAAM,eAAe;AACtD,QAAI,CAAC,UAAU,OAAQ,QAAO;AAC9B,UAAM,MAAM,KAAK,QAAQ,UAAU,CAAC,CAAC;AACrC,WAAO,QAAQ,MAAM,SAAS;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,qBAAqB,EAC7B,YAAY,8DAA8D,EAC1E,OAAO,sBAAsB,iDAAiD,EAC9E,OAAO,uBAAuB,gEAAgE,EAC9F,OAAO,aAAa,uDAAuD,EAC3E,OAAO,sBAAsB,mEAAmE,EAChG,OAAO,WAAW,oEAAoE,EACtF,OAAO,gBAAgB,mDAAmD,EAC1E,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,oBAAoB,wBAAwB,EACnD,OAAO,mBAAmB,2BAA2B,EACrD,OAAO,yBAAyB,mEAAmE,EACnG,OAAO,oBAAoB,4BAA4B,EACvD,OAAO,OAAO,aAAiC,SAY1C;AACJ,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,SAAS,UAAM,0BAAW,MAAM;AAEtC,QAAI,CAAC,OAAO,gBAAgB;AAC1B,cAAQ,MAAM;AAAA,IAAO,UAAU,wCAAmC,eAAK,EAAE;AACzE,cAAQ,MAAM,KAAK,aAAG,uCAAuC,eAAK,IAAI,gBAAM,GAAG,cAAI,yBAAyB,eAAK,EAAE;AACnH,cAAQ,MAAM,KAAK,aAAG,eAAe,eAAK,IAAI,gBAAM,GAAG,cAAI,kBAAkB,eAAK;AAAA,CAAI;AACtF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,KAAK,WAAW,QAAW;AAC7B,YAAM,eAAe,CAAC,YAAY,OAAO,YAAY,MAAM;AAC3D,YAAM,SAAS,gBAAgB,KAAK,MAAM,MAAM;AAChD,UAAI,CAAC,aAAa,SAAS,KAAK,MAAM,KAAK,CAAC,QAAQ;AAClD,gBAAQ,MAAM,qCAAgC,KAAK,MAAM,8CAA8C;AACvG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,UAAa,KAAK,YAAY,aAAa;AAC9D,cAAQ,MAAM,sCAAiC,KAAK,OAAO,wBAAwB;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,QAAI,CAAC,UAAU,cAAc,MAAM,GAAG;AACpC,cAAQ,MAAM,yDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,UAAM,KAAK,GAAG,YAAY;AAC1B,OAAG,oBAAoB;AACvB,UAAM,QAAQ,GAAG,SAAS;AAG1B,QAAI,KAAK,KAAK;AACZ,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,SAAS;AAClC,gBAAQ,MAAM,8DAAyD;AACvE,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AAEA,YAAM,QAAQ,KAAK;AACnB,YAAM,UAAU,KAAK;AACrB,YAAM,aAAa,KAAK;AAGxB,YAAM,SAA6D,MAAM;AAAA,QACvE;AAAA;AAAA,QAEA,CAAC,SAAS,YAAY,UAAU;AAAA,MAClC;AAEA,UAAI,CAAC,QAAQ;AACX,gBAAQ,MAAM,yCAAoC,gBAAM,GAAG,OAAO,IAAI,UAAU,GAAG,eAAK,EAAE;AAC1F,gBAAQ,MAAM,KAAK,aAAG,MAAM,eAAK,IAAI,gBAAM,GAAG,cAAI,kBAAkB,eAAK,IAAI,aAAG,kCAAkC,eAAK,EAAE;AACzH,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AAGA,YAAM,aAAa,QAAQ,KAAK;AAChC,YAAM,MAAM,KAAK,IAAI;AAErB,YAAM;AAAA,QACJ;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,YAAY,OAAO,OAAO,GAAG;AAAA,MAChC;AAEA,YAAM;AAAA,QACJ;AAAA;AAAA;AAAA,QAGA,CAAC,YAAY,KAAK;AAAA,MACpB;AAGA,YAAM;AAAA,QACJ;AAAA;AAAA,QAEA,CAAC,OAAO,SAAS,UAAU;AAAA,MAC7B;AAEA,cAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,eAAe,gBAAM,GAAG,cAAI,GAAG,KAAK,GAAG,eAAK,YAAY,gBAAM,GAAG,OAAO,IAAI,UAAU,GAAG,eAAK,EAAE;AAC/H,SAAG,MAAM;AACT;AAAA,IACF;AAGA,QAAI,KAAK,SAAS;AAChB,cAAQ,MAAM,KAAK,aAAG,6DAA6D,eAAK,EAAE;AAC1F,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oCAAoC,CAAC;AACvG,YAAM,EAAE,4BAA4B,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,+BAA+B,CAAC;AAEnH,YAAM,WAAW,OAAO,kBAAkB,IAAI,CAAC,WAAmB;AAChE,YAAI,OAAO,YAAY,MAAM,MAAO,QAAO,IAAI,WAAW;AAC1D,eAAO;AAAA,MACT,CAAC,EAAE,OAAO,OAAO;AAEjB,YAAM,SAAS,IAAI,4BAA4B,UAAU,EAAE;AAC3D,YAAM,SAAS,MAAM,OAAO,UAAU;AAEtC,cAAQ,MAAM,KAAK,eAAK,SAAI,eAAK,YAAY,cAAI,GAAG,OAAO,mBAAmB,GAAG,eAAK,wBAAwB,cAAI,GAAG,OAAO,oBAAoB,GAAG,eAAK,kBAAkB;AAC1K,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,MAAM,KAAK,UAAU,SAAI,eAAK,IAAI,OAAO,OAAO,MAAM,6BAA6B;AAAA,MAC7F;AACA,cAAQ,MAAM;AAAA,IAChB;AAIA,UAAM,wBAAwB,KAAK,YAAY,cAAc;AAAA,gCAAoC;AACjG,QAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAMG,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOpC,UAAM,SAAgB,CAAC;AAGvB,QAAI,KAAK,UAAU;AACjB,YAAM,iBAAmD;AAAA,QACvD,UAAU,CAAC,GAAK,EAAI;AAAA,QACpB,MAAM,CAAC,GAAK,GAAG;AAAA,QACf,QAAQ,CAAC,GAAK,GAAG;AAAA,QACjB,KAAK,CAAC,KAAK,GAAG;AAAA,MAChB;AACA,YAAM,QAAQ,eAAe,KAAK,SAAS,YAAY,CAAC;AACxD,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,8BAAyB,KAAK,QAAQ,oCAAoC;AACxF,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AACA,eAAS;AACT,aAAO,KAAK,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,IAChC;AAGA,QAAI,KAAK,SAAS;AAChB,YAAM,gBAAgB,CAAC,YAAY,gBAAgB,qBAAqB;AACxE,UAAI,CAAC,cAAc,SAAS,KAAK,OAAO,GAAG;AACzC,gBAAQ,MAAM,6BAAwB,KAAK,OAAO,oDAAoD;AACtG,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AACA,eAAS;AACT,aAAO,KAAK,KAAK,OAAO;AAAA,IAC1B;AAGA,QAAI,KAAK,SAAS,QAAW;AAC3B,YAAM,gBAAgB,WAAW,KAAK,IAAI;AAC1C,UAAI,MAAM,aAAa,KAAK,gBAAgB,KAAK,gBAAgB,GAAG;AAClE,gBAAQ,MAAM,oCAA+B,KAAK,IAAI,2CAA2C;AACjG,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AACA,eAAS;AACT,aAAO,KAAK,aAAa;AAAA,IAC3B;AAGA,UAAM,UAAU,KAAK,MAAM,YAAY,KAAK;AAC5C,UAAM,gBAAgB,CAAC,QAAQ,QAAQ,QAAQ,MAAM;AACrD,QAAI,CAAC,cAAc,SAAS,OAAO,GAAG;AACpC,cAAQ,MAAM,8BAAyB,KAAK,IAAI,+BAA+B;AAC/E,SAAG,MAAM;AAAG,cAAQ,KAAK,CAAC;AAAA,IAC5B;AACA,UAAM,aACJ,YAAY,SAAS,iCACrB,YAAY,SAAS,qCACrB,YAAY,SAAS,iCACrB;AACF,aAAS,aAAa,UAAU;AAEhC,UAAM,OAiBD,MAAM,IAAI,OAAO,MAAM;AAK5B,UAAM,cAAc,CAAC,MACnB,MAAM,aAAa,IAAI,MAAM,wBAAwB,IAAI,MAAM,iBAAiB,IAAI;AACtF,UAAM,UAAU,oBAAI,IAA4B;AAChD,eAAW,OAAO,MAAM;AACtB,YAAM,MAAM,GAAG,IAAI,MAAM,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,aAAa,EAAE;AAC5E,YAAM,WAAW,QAAQ,IAAI,GAAG;AAChC,UAAI,CAAC,YAAY,YAAY,IAAI,OAAO,IAAI,YAAY,SAAS,OAAO,GAAG;AACzE,gBAAQ,IAAI,KAAK,GAAG;AAAA,MACtB;AAAA,IACF;AACA,UAAM,cAAc,CAAC,GAAG,QAAQ,OAAO,CAAC;AAGxC,UAAM,eAAe,IAAI,uCAAmB,MAAM;AAClD,UAAM,iBAAiB,YAAY,OAAO,SAAO,aAAa,aAAa,IAAI,MAAM,CAAC;AACtF,UAAM,eAAe,YAAY,OAAO,SAAO,CAAC,aAAa,aAAa,IAAI,MAAM,CAAC;AAErF,QAAI,aAAa,WAAW,GAAG;AAC7B,YAAM,aAAc,KAAK,YAAY,KAAK,UACtC,sBACA;AACJ,cAAQ,IAAI;AAAA,IAAO,aAAG,2BAA2B,UAAU,IAAI,eAAK;AAAA,CAAI;AACxE,UAAI,eAAe,SAAS,GAAG;AAC7B,gBAAQ,IAAI,KAAK,aAAG,GAAG,eAAe,MAAM,kEAA6D,eAAK;AAAA,CAAI;AAAA,MACpH;AACA,SAAG,MAAM;AACT;AAAA,IACF;AAIA,aAAS,aAAa,KAA+B,SAAS,MAAY;AAExE,YAAM,QAAQ,IAAI;AAClB,UAAI;AACJ,UAAI;AACJ,UAAI,SAAS,MAAM;AACjB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,WAAW,SAAS,GAAK;AACvB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,WAAW,SAAS,GAAK;AACvB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,WAAW,SAAS,GAAK;AACvB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,OAAO;AACL,wBAAgB;AAChB,wBAAgB;AAAA,MAClB;AAGA,UAAI;AACJ,UAAI;AACJ,UAAI,CAAC,IAAI,SAAS;AAChB,uBAAe;AACf,uBAAe;AAAA,MACjB,WAAW,IAAI,YAAY,YAAY;AACrC,uBAAe;AACf,uBAAe;AAAA,MACjB,WAAW,IAAI,YAAY,gBAAgB;AACzC,uBAAe;AACf,uBAAe;AAAA,MACjB,OAAO;AACL,uBAAe;AACf,uBAAe;AAAA,MACjB;AAEA,YAAM,MAAM,IAAI,eACZ,GAAG,IAAI,YAAY,IAAI,IAAI,oBAAoB,IAAI,uBAAuB,GAAG,KAC7E;AAGJ,UAAI,YAAY;AAChB,UAAI,IAAI,cAAc,QAAQ,IAAI,mBAAmB,MAAM;AACzD,cAAM,YAAY,IAAI,cAAc,MAAM,aAAa;AACvD,cAAM,WAAW,IAAI,WAAW,QAAQ,CAAC;AACzC,cAAM,SAAS,GAAG,KAAK,MAAM,IAAI,kBAAkB,GAAG,CAAC;AACvD,oBAAY,KAAK,SAAS,GAAG,aAAG,UAAU,QAAQ,MAAM,MAAM,IAAI,eAAK;AAAA,MACzE;AAGA,UAAI,YAAY;AAChB,UAAI,IAAI,cAAc,MAAM;AAC1B,cAAM,YAAY,IAAI,cAAc,IAAI,aAAa,IAAI,cAAc,IAAI,aAAa;AACxF,oBAAY,KAAK,SAAS,UAAU,IAAI,WAAW,QAAQ,CAAC,CAAC,IAAI,eAAK;AAAA,MACxE;AAEA,cAAQ,IAAI,GAAG,MAAM,GAAG,aAAa,GAAG,aAAa,GAAG,eAAK,KAAK,gBAAM,GAAG,cAAI,GAAG,IAAI,MAAM,GAAG,eAAK,KAAK,aAAG,GAAG,GAAG,GAAG,eAAK,MAAM,YAAY,GAAG,YAAY,GAAG,eAAK,IAAI,SAAS,GAAG,SAAS,EAAE;AAE9L,UAAI,IAAI,WAAW,IAAI,YAAY,uBAAuB;AACxD,cAAM,YAAY,IAAI,QAAQ,SAAS,MAAM,IAAI,QAAQ,MAAM,GAAG,GAAG,IAAI,WAAM,IAAI;AACnF,gBAAQ,IAAI,GAAG,MAAM,KAAK,aAAG,GAAG,SAAS,GAAG,eAAK,EAAE;AAAA,MACrD;AAGA,UAAI,KAAK,SAAS,IAAI,mBAAmB,MAAM;AAC7C,cAAM,IAAI,IAAI;AACd,cAAM,aAAa,KAAK,MAAM,aAAa,KAAK,MAAM,aAAa;AACnE,gBAAQ,IAAI,GAAG,MAAM,KAAK,UAAU,GAAG,aAAG,eAAe,EAAE,QAAQ,CAAC,CAAC,IAAI,eAAK,EAAE;AAAA,MAClF;AAGA,UAAI,IAAI,iBAAiB,IAAI,aAAa,IAAI,cAAc;AAC1D,cAAM,UAAM,4CAAoB,IAAI,WAAW,IAAI,cAAc,IAAI,aAAa;AAClF,YAAI,KAAK;AACP,kBAAQ,IAAI,GAAG,MAAM,KAAK,GAAG,EAAE;AAAA,QACjC;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA,IACd;AAIA,QAAI,KAAK,YAAY,aAAa;AAEhC,YAAM,SAAS,oBAAI,IAA6C;AAChE,iBAAW,OAAO,cAAc;AAC9B,cAAM,KAAK,uBAAuB,IAAI,oBAAoB,IAAI;AAC9D,YAAI,CAAC,OAAO,IAAI,EAAE,EAAG,QAAO,IAAI,IAAI,CAAC,CAAC;AACtC,eAAO,IAAI,EAAE,EAAG,KAAK,GAAG;AAAA,MAC1B;AAGA,YAAM,aAAa,MAAM,KAAK,OAAO,KAAK,CAAC;AAC3C,UAAI,WAAW,UAAU,GAAG;AAE1B,gBAAQ,IAAI;AAAA,IAAO,cAAI,kBAAkB,eAAK,KAAK,aAAa,MAAM;AAAA,CAAK;AAC3E,mBAAW,OAAO,cAAc;AAC9B,uBAAa,GAAG;AAAA,QAClB;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI;AAAA,IAAO,cAAI,kBAAkB,eAAK,KAAK,aAAa,MAAM;AAAA,CAAK;AAC3E,mBAAW,MAAM,YAAY;AAC3B,gBAAM,SAAS,OAAO,IAAI,EAAE;AAC5B,gBAAM,QAAQ,OAAO;AACrB,gBAAM,SAAS,cAAc,EAAE,KAAK,KAAK,gBAAgB,UAAU,IAAI,MAAM,KAAK;AAClF,gBAAM,OAAO,SAAI,OAAO,OAAO,MAAM;AACrC,kBAAQ,IAAI,KAAK,cAAI,GAAG,MAAM,GAAG,eAAK,EAAE;AACxC,kBAAQ,IAAI,KAAK,aAAG,GAAG,IAAI,GAAG,eAAK,EAAE;AACrC,qBAAW,OAAO,QAAQ;AACxB,yBAAa,GAAG;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,IAAI;AAAA,IAAO,cAAI,kBAAkB,eAAK,KAAK,aAAa,MAAM;AAAA,CAAK;AAC3E,iBAAW,OAAO,cAAc;AAC9B,qBAAa,GAAG;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,eAAe,SAAS,GAAG;AAC7B,cAAQ,IAAI,KAAK,aAAG,GAAG,eAAe,MAAM,kEAA6D,eAAK;AAAA,CAAI;AAAA,IACpH;AAIA,QAAI,KAAK,WAAW,QAAW;AAC7B,YAAM,SAAS,KAAK;AAEpB,UAAI,YAAY;AAChB,UAAI,aAAa;AAEjB,UAAI,WAAW,YAAY;AACzB,oBAAY,aAAa,OAAO,OAAK,EAAE,YAAY,UAAU,EAAE;AAC/D,qBAAa;AAAA,MACf,WAAW,WAAW,OAAO;AAC3B,oBAAY,aAAa;AACzB,qBAAa;AAAA,MACf,WAAW,WAAW,YAAY;AAChC,oBAAY,aAAa,OAAO,OAAK,EAAE,kBAAkB,QAAQ,EAAE,kBAAkB,CAAG,EAAE;AAC1F,qBAAa;AAAA,MACf,WAAW,WAAW,QAAQ;AAC5B,oBAAY,aAAa,OAAO,OAAK,EAAE,kBAAkB,QAAQ,EAAE,kBAAkB,CAAG,EAAE;AAC1F,qBAAa;AAAA,MACf,OAAO;AACL,cAAM,gBAAgB,gBAAgB,MAAM;AAC5C,YAAI,kBAAkB,MAAM;AAC1B,sBAAY,aAAa,OAAO,OAAK,EAAE,cAAc,QAAQ,EAAE,cAAc,aAAa,EAAE;AAC5F,uBAAa,QAAQ,aAAa;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,YAAY,GAAG;AACjB,gBAAQ,IAAI,qCAAgC,UAAU,KAAK,SAAS,IAAI,eAAe,QAAQ,KAAK,GAAG,UAAU,GAAG,eAAe,cAAc,IAAI,MAAM,KAAK,8BAA8B;AAC9L,WAAG,MAAM;AACT,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
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 // Bounds are half-open [min, max) and MUST mirror the display buckets in\n // printVulnRow() so the filter and the rendered label never disagree:\n // CRITICAL >= 9.0, HIGH >= 7.0, MEDIUM >= 4.0, LOW < 4.0 (incl. 0.0).\n if (opts.severity) {\n const severityRanges: Record<string, [number, number]> = {\n critical: [9.0, 10.01],\n high: [7.0, 9.0],\n medium: [4.0, 7.0],\n low: [0.0, 4.0],\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 // severity_score IS NULL means \"unknown\" \u2014 excluded from every band.\n query += ` AND v.severity_score IS NOT NULL 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 // Hint when reachability hasn't been computed yet (verdict is pending).\n // vulns --refresh only re-queries vulnerability data; the call-graph\n // reachability analysis that resolves [pending] \u2192 [affected]/[not affected]\n // runs during `kirograph index`.\n const pendingCount = filteredRows.filter(r => !r.verdict).length;\n if (pendingCount > 0) {\n console.log(` ${dim}${pendingCount} vulnerabilit${pendingCount === 1 ? 'y is' : 'ies are'} [pending] reachability analysis \u2014 run ${reset}kirograph index${dim} to compute call-graph verdicts.${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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AACtB,oBAA2B;AAC3B,gBAAgD;AAChD,6BAAoC;AACpC,0BAAmC;AAKnC,SAAS,gBAAgB,QAA+B;AACtD,QAAM,IAAI,OAAO,MAAM,aAAa;AACpC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,WAAW,EAAE,CAAC,CAAC;AACzB,SAAO,MAAM,CAAC,IAAI,OAAO;AAC3B;AAGA,SAAS,uBAAuB,iBAAwC;AACtE,MAAI,CAAC,gBAAiB,QAAO;AAC7B,MAAI;AACF,UAAM,YAAsB,KAAK,MAAM,eAAe;AACtD,QAAI,CAAC,UAAU,OAAQ,QAAO;AAC9B,UAAM,MAAM,KAAK,QAAQ,UAAU,CAAC,CAAC;AACrC,WAAO,QAAQ,MAAM,SAAS;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,qBAAqB,EAC7B,YAAY,8DAA8D,EAC1E,OAAO,sBAAsB,iDAAiD,EAC9E,OAAO,uBAAuB,gEAAgE,EAC9F,OAAO,aAAa,uDAAuD,EAC3E,OAAO,sBAAsB,mEAAmE,EAChG,OAAO,WAAW,oEAAoE,EACtF,OAAO,gBAAgB,mDAAmD,EAC1E,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,oBAAoB,wBAAwB,EACnD,OAAO,mBAAmB,2BAA2B,EACrD,OAAO,yBAAyB,mEAAmE,EACnG,OAAO,oBAAoB,4BAA4B,EACvD,OAAO,OAAO,aAAiC,SAY1C;AACJ,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,SAAS,UAAM,0BAAW,MAAM;AAEtC,QAAI,CAAC,OAAO,gBAAgB;AAC1B,cAAQ,MAAM;AAAA,IAAO,UAAU,wCAAmC,eAAK,EAAE;AACzE,cAAQ,MAAM,KAAK,aAAG,uCAAuC,eAAK,IAAI,gBAAM,GAAG,cAAI,yBAAyB,eAAK,EAAE;AACnH,cAAQ,MAAM,KAAK,aAAG,eAAe,eAAK,IAAI,gBAAM,GAAG,cAAI,kBAAkB,eAAK;AAAA,CAAI;AACtF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,KAAK,WAAW,QAAW;AAC7B,YAAM,eAAe,CAAC,YAAY,OAAO,YAAY,MAAM;AAC3D,YAAM,SAAS,gBAAgB,KAAK,MAAM,MAAM;AAChD,UAAI,CAAC,aAAa,SAAS,KAAK,MAAM,KAAK,CAAC,QAAQ;AAClD,gBAAQ,MAAM,qCAAgC,KAAK,MAAM,8CAA8C;AACvG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,UAAa,KAAK,YAAY,aAAa;AAC9D,cAAQ,MAAM,sCAAiC,KAAK,OAAO,wBAAwB;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,QAAI,CAAC,UAAU,cAAc,MAAM,GAAG;AACpC,cAAQ,MAAM,yDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,UAAM,KAAK,GAAG,YAAY;AAC1B,OAAG,oBAAoB;AACvB,UAAM,QAAQ,GAAG,SAAS;AAG1B,QAAI,KAAK,KAAK;AACZ,UAAI,CAAC,KAAK,WAAW,CAAC,KAAK,SAAS;AAClC,gBAAQ,MAAM,8DAAyD;AACvE,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AAEA,YAAM,QAAQ,KAAK;AACnB,YAAM,UAAU,KAAK;AACrB,YAAM,aAAa,KAAK;AAGxB,YAAM,SAA6D,MAAM;AAAA,QACvE;AAAA;AAAA,QAEA,CAAC,SAAS,YAAY,UAAU;AAAA,MAClC;AAEA,UAAI,CAAC,QAAQ;AACX,gBAAQ,MAAM,yCAAoC,gBAAM,GAAG,OAAO,IAAI,UAAU,GAAG,eAAK,EAAE;AAC1F,gBAAQ,MAAM,KAAK,aAAG,MAAM,eAAK,IAAI,gBAAM,GAAG,cAAI,kBAAkB,eAAK,IAAI,aAAG,kCAAkC,eAAK,EAAE;AACzH,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AAGA,YAAM,aAAa,QAAQ,KAAK;AAChC,YAAM,MAAM,KAAK,IAAI;AAErB,YAAM;AAAA,QACJ;AAAA;AAAA;AAAA;AAAA;AAAA,QAKA,CAAC,YAAY,OAAO,OAAO,GAAG;AAAA,MAChC;AAEA,YAAM;AAAA,QACJ;AAAA;AAAA;AAAA,QAGA,CAAC,YAAY,KAAK;AAAA,MACpB;AAGA,YAAM;AAAA,QACJ;AAAA;AAAA,QAEA,CAAC,OAAO,SAAS,UAAU;AAAA,MAC7B;AAEA,cAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,eAAe,gBAAM,GAAG,cAAI,GAAG,KAAK,GAAG,eAAK,YAAY,gBAAM,GAAG,OAAO,IAAI,UAAU,GAAG,eAAK,EAAE;AAC/H,SAAG,MAAM;AACT;AAAA,IACF;AAGA,QAAI,KAAK,SAAS;AAChB,cAAQ,MAAM,KAAK,aAAG,6DAA6D,eAAK,EAAE;AAC1F,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oCAAoC,CAAC;AACvG,YAAM,EAAE,4BAA4B,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,+BAA+B,CAAC;AAEnH,YAAM,WAAW,OAAO,kBAAkB,IAAI,CAAC,WAAmB;AAChE,YAAI,OAAO,YAAY,MAAM,MAAO,QAAO,IAAI,WAAW;AAC1D,eAAO;AAAA,MACT,CAAC,EAAE,OAAO,OAAO;AAEjB,YAAM,SAAS,IAAI,4BAA4B,UAAU,EAAE;AAC3D,YAAM,SAAS,MAAM,OAAO,UAAU;AAEtC,cAAQ,MAAM,KAAK,eAAK,SAAI,eAAK,YAAY,cAAI,GAAG,OAAO,mBAAmB,GAAG,eAAK,wBAAwB,cAAI,GAAG,OAAO,oBAAoB,GAAG,eAAK,kBAAkB;AAC1K,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,MAAM,KAAK,UAAU,SAAI,eAAK,IAAI,OAAO,OAAO,MAAM,6BAA6B;AAAA,MAC7F;AACA,cAAQ,MAAM;AAAA,IAChB;AAIA,UAAM,wBAAwB,KAAK,YAAY,cAAc;AAAA,gCAAoC;AACjG,QAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAMG,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOpC,UAAM,SAAgB,CAAC;AAMvB,QAAI,KAAK,UAAU;AACjB,YAAM,iBAAmD;AAAA,QACvD,UAAU,CAAC,GAAK,KAAK;AAAA,QACrB,MAAM,CAAC,GAAK,CAAG;AAAA,QACf,QAAQ,CAAC,GAAK,CAAG;AAAA,QACjB,KAAK,CAAC,GAAK,CAAG;AAAA,MAChB;AACA,YAAM,QAAQ,eAAe,KAAK,SAAS,YAAY,CAAC;AACxD,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,8BAAyB,KAAK,QAAQ,oCAAoC;AACxF,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AAEA,eAAS;AACT,aAAO,KAAK,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,IAChC;AAGA,QAAI,KAAK,SAAS;AAChB,YAAM,gBAAgB,CAAC,YAAY,gBAAgB,qBAAqB;AACxE,UAAI,CAAC,cAAc,SAAS,KAAK,OAAO,GAAG;AACzC,gBAAQ,MAAM,6BAAwB,KAAK,OAAO,oDAAoD;AACtG,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AACA,eAAS;AACT,aAAO,KAAK,KAAK,OAAO;AAAA,IAC1B;AAGA,QAAI,KAAK,SAAS,QAAW;AAC3B,YAAM,gBAAgB,WAAW,KAAK,IAAI;AAC1C,UAAI,MAAM,aAAa,KAAK,gBAAgB,KAAK,gBAAgB,GAAG;AAClE,gBAAQ,MAAM,oCAA+B,KAAK,IAAI,2CAA2C;AACjG,WAAG,MAAM;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAC5B;AACA,eAAS;AACT,aAAO,KAAK,aAAa;AAAA,IAC3B;AAGA,UAAM,UAAU,KAAK,MAAM,YAAY,KAAK;AAC5C,UAAM,gBAAgB,CAAC,QAAQ,QAAQ,QAAQ,MAAM;AACrD,QAAI,CAAC,cAAc,SAAS,OAAO,GAAG;AACpC,cAAQ,MAAM,8BAAyB,KAAK,IAAI,+BAA+B;AAC/E,SAAG,MAAM;AAAG,cAAQ,KAAK,CAAC;AAAA,IAC5B;AACA,UAAM,aACJ,YAAY,SAAS,iCACrB,YAAY,SAAS,qCACrB,YAAY,SAAS,iCACrB;AACF,aAAS,aAAa,UAAU;AAEhC,UAAM,OAiBD,MAAM,IAAI,OAAO,MAAM;AAK5B,UAAM,cAAc,CAAC,MACnB,MAAM,aAAa,IAAI,MAAM,wBAAwB,IAAI,MAAM,iBAAiB,IAAI;AACtF,UAAM,UAAU,oBAAI,IAA4B;AAChD,eAAW,OAAO,MAAM;AACtB,YAAM,MAAM,GAAG,IAAI,MAAM,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,aAAa,EAAE;AAC5E,YAAM,WAAW,QAAQ,IAAI,GAAG;AAChC,UAAI,CAAC,YAAY,YAAY,IAAI,OAAO,IAAI,YAAY,SAAS,OAAO,GAAG;AACzE,gBAAQ,IAAI,KAAK,GAAG;AAAA,MACtB;AAAA,IACF;AACA,UAAM,cAAc,CAAC,GAAG,QAAQ,OAAO,CAAC;AAGxC,UAAM,eAAe,IAAI,uCAAmB,MAAM;AAClD,UAAM,iBAAiB,YAAY,OAAO,SAAO,aAAa,aAAa,IAAI,MAAM,CAAC;AACtF,UAAM,eAAe,YAAY,OAAO,SAAO,CAAC,aAAa,aAAa,IAAI,MAAM,CAAC;AAErF,QAAI,aAAa,WAAW,GAAG;AAC7B,YAAM,aAAc,KAAK,YAAY,KAAK,UACtC,sBACA;AACJ,cAAQ,IAAI;AAAA,IAAO,aAAG,2BAA2B,UAAU,IAAI,eAAK;AAAA,CAAI;AACxE,UAAI,eAAe,SAAS,GAAG;AAC7B,gBAAQ,IAAI,KAAK,aAAG,GAAG,eAAe,MAAM,kEAA6D,eAAK;AAAA,CAAI;AAAA,MACpH;AACA,SAAG,MAAM;AACT;AAAA,IACF;AAIA,aAAS,aAAa,KAA+B,SAAS,MAAY;AAExE,YAAM,QAAQ,IAAI;AAClB,UAAI;AACJ,UAAI;AACJ,UAAI,SAAS,MAAM;AACjB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,WAAW,SAAS,GAAK;AACvB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,WAAW,SAAS,GAAK;AACvB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,WAAW,SAAS,GAAK;AACvB,wBAAgB;AAChB,wBAAgB;AAAA,MAClB,OAAO;AACL,wBAAgB;AAChB,wBAAgB;AAAA,MAClB;AAGA,UAAI;AACJ,UAAI;AACJ,UAAI,CAAC,IAAI,SAAS;AAChB,uBAAe;AACf,uBAAe;AAAA,MACjB,WAAW,IAAI,YAAY,YAAY;AACrC,uBAAe;AACf,uBAAe;AAAA,MACjB,WAAW,IAAI,YAAY,gBAAgB;AACzC,uBAAe;AACf,uBAAe;AAAA,MACjB,OAAO;AACL,uBAAe;AACf,uBAAe;AAAA,MACjB;AAEA,YAAM,MAAM,IAAI,eACZ,GAAG,IAAI,YAAY,IAAI,IAAI,oBAAoB,IAAI,uBAAuB,GAAG,KAC7E;AAGJ,UAAI,YAAY;AAChB,UAAI,IAAI,cAAc,QAAQ,IAAI,mBAAmB,MAAM;AACzD,cAAM,YAAY,IAAI,cAAc,MAAM,aAAa;AACvD,cAAM,WAAW,IAAI,WAAW,QAAQ,CAAC;AACzC,cAAM,SAAS,GAAG,KAAK,MAAM,IAAI,kBAAkB,GAAG,CAAC;AACvD,oBAAY,KAAK,SAAS,GAAG,aAAG,UAAU,QAAQ,MAAM,MAAM,IAAI,eAAK;AAAA,MACzE;AAGA,UAAI,YAAY;AAChB,UAAI,IAAI,cAAc,MAAM;AAC1B,cAAM,YAAY,IAAI,cAAc,IAAI,aAAa,IAAI,cAAc,IAAI,aAAa;AACxF,oBAAY,KAAK,SAAS,UAAU,IAAI,WAAW,QAAQ,CAAC,CAAC,IAAI,eAAK;AAAA,MACxE;AAEA,cAAQ,IAAI,GAAG,MAAM,GAAG,aAAa,GAAG,aAAa,GAAG,eAAK,KAAK,gBAAM,GAAG,cAAI,GAAG,IAAI,MAAM,GAAG,eAAK,KAAK,aAAG,GAAG,GAAG,GAAG,eAAK,MAAM,YAAY,GAAG,YAAY,GAAG,eAAK,IAAI,SAAS,GAAG,SAAS,EAAE;AAE9L,UAAI,IAAI,WAAW,IAAI,YAAY,uBAAuB;AACxD,cAAM,YAAY,IAAI,QAAQ,SAAS,MAAM,IAAI,QAAQ,MAAM,GAAG,GAAG,IAAI,WAAM,IAAI;AACnF,gBAAQ,IAAI,GAAG,MAAM,KAAK,aAAG,GAAG,SAAS,GAAG,eAAK,EAAE;AAAA,MACrD;AAGA,UAAI,KAAK,SAAS,IAAI,mBAAmB,MAAM;AAC7C,cAAM,IAAI,IAAI;AACd,cAAM,aAAa,KAAK,MAAM,aAAa,KAAK,MAAM,aAAa;AACnE,gBAAQ,IAAI,GAAG,MAAM,KAAK,UAAU,GAAG,aAAG,eAAe,EAAE,QAAQ,CAAC,CAAC,IAAI,eAAK,EAAE;AAAA,MAClF;AAGA,UAAI,IAAI,iBAAiB,IAAI,aAAa,IAAI,cAAc;AAC1D,cAAM,UAAM,4CAAoB,IAAI,WAAW,IAAI,cAAc,IAAI,aAAa;AAClF,YAAI,KAAK;AACP,kBAAQ,IAAI,GAAG,MAAM,KAAK,GAAG,EAAE;AAAA,QACjC;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA,IACd;AAIA,QAAI,KAAK,YAAY,aAAa;AAEhC,YAAM,SAAS,oBAAI,IAA6C;AAChE,iBAAW,OAAO,cAAc;AAC9B,cAAM,KAAK,uBAAuB,IAAI,oBAAoB,IAAI;AAC9D,YAAI,CAAC,OAAO,IAAI,EAAE,EAAG,QAAO,IAAI,IAAI,CAAC,CAAC;AACtC,eAAO,IAAI,EAAE,EAAG,KAAK,GAAG;AAAA,MAC1B;AAGA,YAAM,aAAa,MAAM,KAAK,OAAO,KAAK,CAAC;AAC3C,UAAI,WAAW,UAAU,GAAG;AAE1B,gBAAQ,IAAI;AAAA,IAAO,cAAI,kBAAkB,eAAK,KAAK,aAAa,MAAM;AAAA,CAAK;AAC3E,mBAAW,OAAO,cAAc;AAC9B,uBAAa,GAAG;AAAA,QAClB;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI;AAAA,IAAO,cAAI,kBAAkB,eAAK,KAAK,aAAa,MAAM;AAAA,CAAK;AAC3E,mBAAW,MAAM,YAAY;AAC3B,gBAAM,SAAS,OAAO,IAAI,EAAE;AAC5B,gBAAM,QAAQ,OAAO;AACrB,gBAAM,SAAS,cAAc,EAAE,KAAK,KAAK,gBAAgB,UAAU,IAAI,MAAM,KAAK;AAClF,gBAAM,OAAO,SAAI,OAAO,OAAO,MAAM;AACrC,kBAAQ,IAAI,KAAK,cAAI,GAAG,MAAM,GAAG,eAAK,EAAE;AACxC,kBAAQ,IAAI,KAAK,aAAG,GAAG,IAAI,GAAG,eAAK,EAAE;AACrC,qBAAW,OAAO,QAAQ;AACxB,yBAAa,GAAG;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,IAAI;AAAA,IAAO,cAAI,kBAAkB,eAAK,KAAK,aAAa,MAAM;AAAA,CAAK;AAC3E,iBAAW,OAAO,cAAc;AAC9B,qBAAa,GAAG;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,eAAe,SAAS,GAAG;AAC7B,cAAQ,IAAI,KAAK,aAAG,GAAG,eAAe,MAAM,kEAA6D,eAAK;AAAA,CAAI;AAAA,IACpH;AAMA,UAAM,eAAe,aAAa,OAAO,OAAK,CAAC,EAAE,OAAO,EAAE;AAC1D,QAAI,eAAe,GAAG;AACpB,cAAQ,IAAI,KAAK,aAAG,GAAG,YAAY,gBAAgB,iBAAiB,IAAI,SAAS,SAAS,+CAA0C,eAAK,kBAAkB,aAAG,mCAAmC,eAAK;AAAA,CAAI;AAAA,IAC5M;AAIA,QAAI,KAAK,WAAW,QAAW;AAC7B,YAAM,SAAS,KAAK;AAEpB,UAAI,YAAY;AAChB,UAAI,aAAa;AAEjB,UAAI,WAAW,YAAY;AACzB,oBAAY,aAAa,OAAO,OAAK,EAAE,YAAY,UAAU,EAAE;AAC/D,qBAAa;AAAA,MACf,WAAW,WAAW,OAAO;AAC3B,oBAAY,aAAa;AACzB,qBAAa;AAAA,MACf,WAAW,WAAW,YAAY;AAChC,oBAAY,aAAa,OAAO,OAAK,EAAE,kBAAkB,QAAQ,EAAE,kBAAkB,CAAG,EAAE;AAC1F,qBAAa;AAAA,MACf,WAAW,WAAW,QAAQ;AAC5B,oBAAY,aAAa,OAAO,OAAK,EAAE,kBAAkB,QAAQ,EAAE,kBAAkB,CAAG,EAAE;AAC1F,qBAAa;AAAA,MACf,OAAO;AACL,cAAM,gBAAgB,gBAAgB,MAAM;AAC5C,YAAI,kBAAkB,MAAM;AAC1B,sBAAY,aAAa,OAAO,OAAK,EAAE,cAAc,QAAQ,EAAE,cAAc,aAAa,EAAE;AAC5F,uBAAa,QAAQ,aAAa;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,YAAY,GAAG;AACjB,gBAAQ,IAAI,qCAAgC,UAAU,KAAK,SAAS,IAAI,eAAe,QAAQ,KAAK,GAAG,UAAU,GAAG,eAAe,cAAc,IAAI,MAAM,KAAK,8BAA8B;AAC9L,WAAG,MAAM;AACT,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
6
6
  "names": []
7
7
  }
@@ -44,6 +44,7 @@ __export(common_exports, {
44
44
  removeGeneratedBlock: () => removeGeneratedBlock,
45
45
  removeImportLine: () => removeImportLine,
46
46
  removeMcpServersConfig: () => removeMcpServersConfig,
47
+ silentCommand: () => silentCommand,
47
48
  upsertGeneratedBlock: () => upsertGeneratedBlock,
48
49
  writeJson: () => writeJson,
49
50
  writeMcpServersConfig: () => writeMcpServersConfig
@@ -55,7 +56,11 @@ var import_tool_names = require("../../mcp/tool-names");
55
56
  const KIROGRAPH_SERVER_NAME = "kirograph";
56
57
  const KIROGRAPH_COMMAND = "kirograph";
57
58
  const KIROGRAPH_MCP_ARGS = ["serve", "--mcp"];
58
- const KIROGRAPH_SYNC_CMD = "kirograph sync-if-dirty --quiet 2>/dev/null || true";
59
+ function silentCommand(baseCommand) {
60
+ const isWindows = process.platform === "win32";
61
+ return isWindows ? `${baseCommand} >nul 2>&1 || exit /b 0` : `${baseCommand} >/dev/null 2>&1 || true`;
62
+ }
63
+ const KIROGRAPH_SYNC_CMD = silentCommand("kirograph sync-if-dirty --quiet");
59
64
  const KIROGRAPH_TOOLS = import_tool_names.KIROGRAPH_TOOL_NAMES;
60
65
  const KIROGRAPH_SCOPED_TOOLS = import_tool_names.KIROGRAPH_TOOL_NAMES.map((name) => `@kirograph/${name}`);
61
66
  function ensureDir(p) {
@@ -214,6 +219,7 @@ function printMcpCommand(command) {
214
219
  removeGeneratedBlock,
215
220
  removeImportLine,
216
221
  removeMcpServersConfig,
222
+ silentCommand,
217
223
  upsertGeneratedBlock,
218
224
  writeJson,
219
225
  writeMcpServersConfig
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/installer/common.ts"],
4
- "sourcesContent": ["import * as fs from 'fs';\nimport * as path from 'path';\nimport { KIROGRAPH_TOOL_NAMES } from '../../mcp/tool-names';\nimport type { InstructionOptions } from './instructions';\nimport type { CavemanMode } from './caveman';\n\n/** Single options object passed to every target's installLate(). */\nexport interface LateInstallOptions {\n cavemanMode?: CavemanMode | 'off';\n shellCompressionLevel?: string;\n enableMemory?: boolean;\n enableDocs?: boolean;\n enableData?: boolean;\n enableSecurity?: boolean;\n enableArchitecture?: boolean;\n enablePatterns?: boolean;\n enableWatchmen?: boolean;\n watchmenSynthesisMode?: 'local' | 'agent';\n enableWiki?: boolean;\n wikiSynthesisMode?: 'local' | 'agent';\n wikiLocalModel?: string;\n enableCodeHealth?: boolean;\n enableNavigation?: boolean;\n enableComplexity?: boolean;\n enableGitContext?: boolean;\n enableEditPrimitives?: boolean;\n enableBranch?: boolean;\n enableAgentUtils?: boolean;\n enableGeneralCompression?: boolean;\n trackCallSites?: boolean;\n kiroHookFormat?: 'v1-legacy' | 'v2';\n}\n\nexport type InstallTarget = 'kiro' | 'claude' | 'codex' | 'cursor' | 'antigravity' | 'opencode' | 'windsurf' | 'cline' | 'copilot' | 'copilot-cli' | 'junie' | 'gemini-cli' | 'continue' | 'roo' | 'warp' | 'aider' | 'trae' | 'augment' | 'kilo' | 'amp' | 'devin' | 'replit' | 'goose' | 'openhands' | 'tabnine' | 'mistral-vibe' | 'ibm-bob' | 'crush' | 'droid-factory' | 'forgecode' | 'iflow' | 'qwen' | 'rovo' | 'qoder';\n\nexport const KIROGRAPH_SERVER_NAME = 'kirograph';\nexport const KIROGRAPH_COMMAND = 'kirograph';\nexport const KIROGRAPH_MCP_ARGS = ['serve', '--mcp'];\nexport const KIROGRAPH_SYNC_CMD = 'kirograph sync-if-dirty --quiet 2>/dev/null || true';\nexport const KIROGRAPH_TOOLS = KIROGRAPH_TOOL_NAMES;\nexport const KIROGRAPH_SCOPED_TOOLS = KIROGRAPH_TOOL_NAMES.map(name => `@kirograph/${name}`);\n\nexport function ensureDir(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nexport function readJson(p: string): any {\n try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return {}; }\n}\n\nexport function writeJson(p: string, data: unknown): void {\n fs.writeFileSync(p, JSON.stringify(data, null, 2) + '\\n');\n}\n\n/**\n * Write MCP server config to a JSON file under the mcpServers key.\n * Returns true if the config was written, false if already configured (idempotent).\n */\nexport function writeMcpServersConfig(configPath: string, serverConfig: object): boolean {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n if (existing.mcpServers[KIROGRAPH_SERVER_NAME]) {\n return false; // Already configured\n }\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n return true;\n}\n\n/**\n * Always write (overwrite) the MCP server config entry, regardless of whether it already exists.\n * Used when the final state is known upfront and idempotency would cause stale data.\n */\nexport function overwriteMcpServersConfig(configPath: string, serverConfig: object): void {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n}\n\nexport function removeMcpServersConfig(configPath: string): boolean {\n if (!fs.existsSync(configPath)) return false;\n const existing = readJson(configPath);\n if (!existing.mcpServers?.[KIROGRAPH_SERVER_NAME]) return false;\n delete existing.mcpServers[KIROGRAPH_SERVER_NAME];\n writeJson(configPath, existing);\n return true;\n}\n\nexport function appendImportLine(filePath: string, line: string, heading: string): boolean {\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n if (existing.includes(line)) return false;\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + heading + '\\n' + line + '\\n');\n return true;\n}\n\nexport function removeImportLine(filePath: string, line: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const original = fs.readFileSync(filePath, 'utf8');\n const next = original\n .split('\\n')\n .filter(l => l.trim() !== line)\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nexport function upsertGeneratedBlock(filePath: string, blockId: string, heading: string, content: string): boolean {\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const block = `${start}\\n${heading}\\n\\n${content.trim()}\\n${end}`;\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n const pattern = new RegExp(`${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}`);\n\n if (pattern.test(existing)) {\n const next = existing.replace(pattern, block);\n if (next === existing) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n }\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + block + '\\n');\n return true;\n}\n\nexport function removeGeneratedBlock(filePath: string, blockId: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const original = fs.readFileSync(filePath, 'utf8');\n const pattern = new RegExp(`\\\\n?${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}\\\\n?`);\n const next = original.replace(pattern, '\\n').replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Build InstructionOptions from the installLate parameters.\n * Used by all targets to pass full feature config to buildAgentInstructions.\n */\nexport function buildInstructionOpts(opts: LateInstallOptions, hasHooks?: boolean): InstructionOptions {\n return {\n cavemanMode: opts.cavemanMode,\n shellCompressionLevel: (opts.shellCompressionLevel as InstructionOptions['shellCompressionLevel']) ?? undefined,\n enableArchitecture: opts.enableArchitecture ?? false,\n enableMemory: opts.enableMemory ?? false,\n enableDocs: opts.enableDocs ?? false,\n enableData: opts.enableData ?? false,\n enableSecurity: opts.enableSecurity ?? false,\n enablePatterns: opts.enablePatterns ?? false,\n enableWiki: opts.enableWiki ?? false,\n enableCodeHealth: opts.enableCodeHealth ?? false,\n enableNavigation: opts.enableNavigation ?? false,\n enableComplexity: opts.enableComplexity ?? false,\n enableGitContext: opts.enableGitContext ?? false,\n enableEditPrimitives: opts.enableEditPrimitives ?? false,\n enableBranch: opts.enableBranch ?? false,\n enableAgentUtils: opts.enableAgentUtils ?? false,\n enableGeneralCompression: opts.enableGeneralCompression ?? false,\n trackCallSites: opts.trackCallSites ?? false,\n hasHooks: hasHooks ?? false,\n };\n}\n\nconst violet = '\\x1b[38;5;99m';\nconst resetAnsi = '\\x1b[0m';\nconst dimAnsi = '\\x1b[2m';\nconst boldAnsi = '\\x1b[1m';\n\n/**\n * Print a highlighted MCP config JSON block for targets that need user-scoped setup.\n */\nexport function printMcpSetup(configPath: string, projectRoot: string): void {\n const escapedPath = projectRoot.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n console.log(`\\n ${dimAnsi}Add the MCP server manually:${resetAnsi}`);\n console.log(` ${dimAnsi}Edit${resetAnsi} ${violet}${boldAnsi}${configPath}${resetAnsi} ${dimAnsi}and add:${resetAnsi}`);\n console.log(` ${violet}{${resetAnsi}`);\n console.log(` ${violet} \"mcpServers\": {${resetAnsi}`);\n console.log(` ${violet} \"kirograph\": {${resetAnsi}`);\n console.log(` ${violet} \"command\": \"kirograph\",${resetAnsi}`);\n console.log(` ${violet} \"args\": [\"serve\", \"--mcp\", \"--path\", \"${escapedPath}\"]${resetAnsi}`);\n console.log(` ${violet} }${resetAnsi}`);\n console.log(` ${violet} }${resetAnsi}`);\n console.log(` ${violet}}${resetAnsi}\\n`);\n}\n\n/**\n * Print a highlighted CLI command for MCP registration.\n */\nexport function printMcpCommand(command: string): void {\n console.log(`\\n ${dimAnsi}Add the MCP server with:${resetAnsi}`);\n console.log(` ${violet}${boldAnsi}${command}${resetAnsi}\\n`);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as fs from 'fs';\nimport * as path from 'path';\nimport { KIROGRAPH_TOOL_NAMES } from '../../mcp/tool-names';\nimport type { InstructionOptions } from './instructions';\nimport type { CavemanMode } from './caveman';\n\n/** Single options object passed to every target's installLate(). */\nexport interface LateInstallOptions {\n cavemanMode?: CavemanMode | 'off';\n shellCompressionLevel?: string;\n enableMemory?: boolean;\n enableDocs?: boolean;\n enableData?: boolean;\n enableSecurity?: boolean;\n enableArchitecture?: boolean;\n enablePatterns?: boolean;\n enableWatchmen?: boolean;\n watchmenSynthesisMode?: 'local' | 'agent';\n enableWiki?: boolean;\n wikiSynthesisMode?: 'local' | 'agent';\n wikiLocalModel?: string;\n enableCodeHealth?: boolean;\n enableNavigation?: boolean;\n enableComplexity?: boolean;\n enableGitContext?: boolean;\n enableEditPrimitives?: boolean;\n enableBranch?: boolean;\n enableAgentUtils?: boolean;\n enableGeneralCompression?: boolean;\n trackCallSites?: boolean;\n kiroHookFormat?: 'v1-legacy' | 'v2';\n}\n\nexport type InstallTarget = 'kiro' | 'claude' | 'codex' | 'cursor' | 'antigravity' | 'opencode' | 'windsurf' | 'cline' | 'copilot' | 'copilot-cli' | 'junie' | 'gemini-cli' | 'continue' | 'roo' | 'warp' | 'aider' | 'trae' | 'augment' | 'kilo' | 'amp' | 'devin' | 'replit' | 'goose' | 'openhands' | 'tabnine' | 'mistral-vibe' | 'ibm-bob' | 'crush' | 'droid-factory' | 'forgecode' | 'iflow' | 'qwen' | 'rovo' | 'qoder' | 'commandcode';\n\nexport const KIROGRAPH_SERVER_NAME = 'kirograph';\nexport const KIROGRAPH_COMMAND = 'kirograph';\nexport const KIROGRAPH_MCP_ARGS = ['serve', '--mcp'];\n\n/**\n * Wrap a kirograph command so it runs quietly and never fails the host process,\n * emitting shell syntax appropriate for the OS the install is running on.\n *\n * Hook commands are executed by the host agent's shell: POSIX sh/bash on\n * macOS/Linux, cmd.exe on Windows. The two use incompatible syntax for\n * discarding output and swallowing a non-zero exit code:\n * - POSIX: `<cmd> >/dev/null 2>&1 || true`\n * - cmd.exe: `<cmd> >nul 2>&1 || exit /b 0`\n *\n * On Windows `/dev/null` is treated as a literal path and `true` is not a valid\n * command, so the bash form silently breaks hooks (see issue #40).\n *\n * @param baseCommand the kirograph invocation without redirection, e.g. `kirograph sync --quiet`\n */\nexport function silentCommand(baseCommand: string): string {\n const isWindows = process.platform === 'win32';\n return isWindows\n ? `${baseCommand} >nul 2>&1 || exit /b 0`\n : `${baseCommand} >/dev/null 2>&1 || true`;\n}\n\nexport const KIROGRAPH_SYNC_CMD = silentCommand('kirograph sync-if-dirty --quiet');\nexport const KIROGRAPH_TOOLS = KIROGRAPH_TOOL_NAMES;\nexport const KIROGRAPH_SCOPED_TOOLS = KIROGRAPH_TOOL_NAMES.map(name => `@kirograph/${name}`);\n\nexport function ensureDir(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nexport function readJson(p: string): any {\n try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return {}; }\n}\n\nexport function writeJson(p: string, data: unknown): void {\n fs.writeFileSync(p, JSON.stringify(data, null, 2) + '\\n');\n}\n\n/**\n * Write MCP server config to a JSON file under the mcpServers key.\n * Returns true if the config was written, false if already configured (idempotent).\n */\nexport function writeMcpServersConfig(configPath: string, serverConfig: object): boolean {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n if (existing.mcpServers[KIROGRAPH_SERVER_NAME]) {\n return false; // Already configured\n }\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n return true;\n}\n\n/**\n * Always write (overwrite) the MCP server config entry, regardless of whether it already exists.\n * Used when the final state is known upfront and idempotency would cause stale data.\n */\nexport function overwriteMcpServersConfig(configPath: string, serverConfig: object): void {\n ensureDir(path.dirname(configPath));\n const existing = readJson(configPath);\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers[KIROGRAPH_SERVER_NAME] = serverConfig;\n writeJson(configPath, existing);\n}\n\nexport function removeMcpServersConfig(configPath: string): boolean {\n if (!fs.existsSync(configPath)) return false;\n const existing = readJson(configPath);\n if (!existing.mcpServers?.[KIROGRAPH_SERVER_NAME]) return false;\n delete existing.mcpServers[KIROGRAPH_SERVER_NAME];\n writeJson(configPath, existing);\n return true;\n}\n\nexport function appendImportLine(filePath: string, line: string, heading: string): boolean {\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n if (existing.includes(line)) return false;\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + heading + '\\n' + line + '\\n');\n return true;\n}\n\nexport function removeImportLine(filePath: string, line: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const original = fs.readFileSync(filePath, 'utf8');\n const next = original\n .split('\\n')\n .filter(l => l.trim() !== line)\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nexport function upsertGeneratedBlock(filePath: string, blockId: string, heading: string, content: string): boolean {\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const block = `${start}\\n${heading}\\n\\n${content.trim()}\\n${end}`;\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n const pattern = new RegExp(`${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}`);\n\n if (pattern.test(existing)) {\n const next = existing.replace(pattern, block);\n if (next === existing) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n }\n\n const prefix = existing.length > 0 && !existing.endsWith('\\n') ? '\\n' : '';\n const separator = existing.trim().length > 0 ? '\\n' : '';\n fs.writeFileSync(filePath, existing + prefix + separator + block + '\\n');\n return true;\n}\n\nexport function removeGeneratedBlock(filePath: string, blockId: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n const start = `<!-- kirograph:${blockId}:start -->`;\n const end = `<!-- kirograph:${blockId}:end -->`;\n const original = fs.readFileSync(filePath, 'utf8');\n const pattern = new RegExp(`\\\\n?${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}\\\\n?`);\n const next = original.replace(pattern, '\\n').replace(/\\n{3,}/g, '\\n\\n');\n if (next === original) return false;\n fs.writeFileSync(filePath, next.endsWith('\\n') ? next : next + '\\n');\n return true;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Build InstructionOptions from the installLate parameters.\n * Used by all targets to pass full feature config to buildAgentInstructions.\n */\nexport function buildInstructionOpts(opts: LateInstallOptions, hasHooks?: boolean): InstructionOptions {\n return {\n cavemanMode: opts.cavemanMode,\n shellCompressionLevel: (opts.shellCompressionLevel as InstructionOptions['shellCompressionLevel']) ?? undefined,\n enableArchitecture: opts.enableArchitecture ?? false,\n enableMemory: opts.enableMemory ?? false,\n enableDocs: opts.enableDocs ?? false,\n enableData: opts.enableData ?? false,\n enableSecurity: opts.enableSecurity ?? false,\n enablePatterns: opts.enablePatterns ?? false,\n enableWiki: opts.enableWiki ?? false,\n enableCodeHealth: opts.enableCodeHealth ?? false,\n enableNavigation: opts.enableNavigation ?? false,\n enableComplexity: opts.enableComplexity ?? false,\n enableGitContext: opts.enableGitContext ?? false,\n enableEditPrimitives: opts.enableEditPrimitives ?? false,\n enableBranch: opts.enableBranch ?? false,\n enableAgentUtils: opts.enableAgentUtils ?? false,\n enableGeneralCompression: opts.enableGeneralCompression ?? false,\n trackCallSites: opts.trackCallSites ?? false,\n hasHooks: hasHooks ?? false,\n };\n}\n\nconst violet = '\\x1b[38;5;99m';\nconst resetAnsi = '\\x1b[0m';\nconst dimAnsi = '\\x1b[2m';\nconst boldAnsi = '\\x1b[1m';\n\n/**\n * Print a highlighted MCP config JSON block for targets that need user-scoped setup.\n */\nexport function printMcpSetup(configPath: string, projectRoot: string): void {\n const escapedPath = projectRoot.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n console.log(`\\n ${dimAnsi}Add the MCP server manually:${resetAnsi}`);\n console.log(` ${dimAnsi}Edit${resetAnsi} ${violet}${boldAnsi}${configPath}${resetAnsi} ${dimAnsi}and add:${resetAnsi}`);\n console.log(` ${violet}{${resetAnsi}`);\n console.log(` ${violet} \"mcpServers\": {${resetAnsi}`);\n console.log(` ${violet} \"kirograph\": {${resetAnsi}`);\n console.log(` ${violet} \"command\": \"kirograph\",${resetAnsi}`);\n console.log(` ${violet} \"args\": [\"serve\", \"--mcp\", \"--path\", \"${escapedPath}\"]${resetAnsi}`);\n console.log(` ${violet} }${resetAnsi}`);\n console.log(` ${violet} }${resetAnsi}`);\n console.log(` ${violet}}${resetAnsi}\\n`);\n}\n\n/**\n * Print a highlighted CLI command for MCP registration.\n */\nexport function printMcpCommand(command: string): void {\n console.log(`\\n ${dimAnsi}Add the MCP server with:${resetAnsi}`);\n console.log(` ${violet}${boldAnsi}${command}${resetAnsi}\\n`);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAoB;AACpB,WAAsB;AACtB,wBAAqC;AAiC9B,MAAM,wBAAwB;AAC9B,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB,CAAC,SAAS,OAAO;AAiB5C,SAAS,cAAc,aAA6B;AACzD,QAAM,YAAY,QAAQ,aAAa;AACvC,SAAO,YACH,GAAG,WAAW,4BACd,GAAG,WAAW;AACpB;AAEO,MAAM,qBAAqB,cAAc,iCAAiC;AAC1E,MAAM,kBAAkB;AACxB,MAAM,yBAAyB,uCAAqB,IAAI,UAAQ,cAAc,IAAI,EAAE;AAEpF,SAAS,UAAU,GAAiB;AACzC,KAAG,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACrC;AAEO,SAAS,SAAS,GAAgB;AACvC,MAAI;AAAE,WAAO,KAAK,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;AAAA,EAAG,QAAQ;AAAE,WAAO,CAAC;AAAA,EAAG;AAC5E;AAEO,SAAS,UAAU,GAAW,MAAqB;AACxD,KAAG,cAAc,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAC1D;AAMO,SAAS,sBAAsB,YAAoB,cAA+B;AACvF,YAAU,KAAK,QAAQ,UAAU,CAAC;AAClC,QAAM,WAAW,SAAS,UAAU;AACpC,WAAS,aAAa,SAAS,cAAc,CAAC;AAC9C,MAAI,SAAS,WAAW,qBAAqB,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,WAAS,WAAW,qBAAqB,IAAI;AAC7C,YAAU,YAAY,QAAQ;AAC9B,SAAO;AACT;AAMO,SAAS,0BAA0B,YAAoB,cAA4B;AACxF,YAAU,KAAK,QAAQ,UAAU,CAAC;AAClC,QAAM,WAAW,SAAS,UAAU;AACpC,WAAS,aAAa,SAAS,cAAc,CAAC;AAC9C,WAAS,WAAW,qBAAqB,IAAI;AAC7C,YAAU,YAAY,QAAQ;AAChC;AAEO,SAAS,uBAAuB,YAA6B;AAClE,MAAI,CAAC,GAAG,WAAW,UAAU,EAAG,QAAO;AACvC,QAAM,WAAW,SAAS,UAAU;AACpC,MAAI,CAAC,SAAS,aAAa,qBAAqB,EAAG,QAAO;AAC1D,SAAO,SAAS,WAAW,qBAAqB;AAChD,YAAU,YAAY,QAAQ;AAC9B,SAAO;AACT;AAEO,SAAS,iBAAiB,UAAkB,MAAc,SAA0B;AACzF,QAAM,WAAW,GAAG,WAAW,QAAQ,IAAI,GAAG,aAAa,UAAU,MAAM,IAAI;AAC/E,MAAI,SAAS,SAAS,IAAI,EAAG,QAAO;AAEpC,QAAM,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,IAAI,IAAI,OAAO;AACxE,QAAM,YAAY,SAAS,KAAK,EAAE,SAAS,IAAI,OAAO;AACtD,KAAG,cAAc,UAAU,WAAW,SAAS,YAAY,UAAU,OAAO,OAAO,IAAI;AACvF,SAAO;AACT;AAEO,SAAS,iBAAiB,UAAkB,MAAuB;AACxE,MAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO;AACrC,QAAM,WAAW,GAAG,aAAa,UAAU,MAAM;AACjD,QAAM,OAAO,SACV,MAAM,IAAI,EACV,OAAO,OAAK,EAAE,KAAK,MAAM,IAAI,EAC7B,KAAK,IAAI,EACT,QAAQ,WAAW,MAAM;AAC5B,MAAI,SAAS,SAAU,QAAO;AAC9B,KAAG,cAAc,UAAU,KAAK,SAAS,IAAI,IAAI,OAAO,OAAO,IAAI;AACnE,SAAO;AACT;AAEO,SAAS,qBAAqB,UAAkB,SAAiB,SAAiB,SAA0B;AACjH,QAAM,QAAQ,kBAAkB,OAAO;AACvC,QAAM,MAAM,kBAAkB,OAAO;AACrC,QAAM,QAAQ,GAAG,KAAK;AAAA,EAAK,OAAO;AAAA;AAAA,EAAO,QAAQ,KAAK,CAAC;AAAA,EAAK,GAAG;AAC/D,QAAM,WAAW,GAAG,WAAW,QAAQ,IAAI,GAAG,aAAa,UAAU,MAAM,IAAI;AAC/E,QAAM,UAAU,IAAI,OAAO,GAAG,aAAa,KAAK,CAAC,aAAa,aAAa,GAAG,CAAC,EAAE;AAEjF,MAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,UAAM,OAAO,SAAS,QAAQ,SAAS,KAAK;AAC5C,QAAI,SAAS,SAAU,QAAO;AAC9B,OAAG,cAAc,UAAU,KAAK,SAAS,IAAI,IAAI,OAAO,OAAO,IAAI;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,IAAI,IAAI,OAAO;AACxE,QAAM,YAAY,SAAS,KAAK,EAAE,SAAS,IAAI,OAAO;AACtD,KAAG,cAAc,UAAU,WAAW,SAAS,YAAY,QAAQ,IAAI;AACvE,SAAO;AACT;AAEO,SAAS,qBAAqB,UAAkB,SAA0B;AAC/E,MAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO;AACrC,QAAM,QAAQ,kBAAkB,OAAO;AACvC,QAAM,MAAM,kBAAkB,OAAO;AACrC,QAAM,WAAW,GAAG,aAAa,UAAU,MAAM;AACjD,QAAM,UAAU,IAAI,OAAO,OAAO,aAAa,KAAK,CAAC,aAAa,aAAa,GAAG,CAAC,MAAM;AACzF,QAAM,OAAO,SAAS,QAAQ,SAAS,IAAI,EAAE,QAAQ,WAAW,MAAM;AACtE,MAAI,SAAS,SAAU,QAAO;AAC9B,KAAG,cAAc,UAAU,KAAK,SAAS,IAAI,IAAI,OAAO,OAAO,IAAI;AACnE,SAAO;AACT;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,uBAAuB,MAAM;AAChD;AAMO,SAAS,qBAAqB,MAA0B,UAAwC;AACrG,SAAO;AAAA,IACL,aAAa,KAAK;AAAA,IAClB,uBAAwB,KAAK,yBAAyE;AAAA,IACtG,oBAAoB,KAAK,sBAAsB;AAAA,IAC/C,cAAc,KAAK,gBAAgB;AAAA,IACnC,YAAY,KAAK,cAAc;AAAA,IAC/B,YAAY,KAAK,cAAc;AAAA,IAC/B,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,YAAY,KAAK,cAAc;AAAA,IAC/B,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,sBAAsB,KAAK,wBAAwB;AAAA,IACnD,cAAc,KAAK,gBAAgB;AAAA,IACnC,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,0BAA0B,KAAK,4BAA4B;AAAA,IAC3D,gBAAgB,KAAK,kBAAkB;AAAA,IACvC,UAAU,YAAY;AAAA,EACxB;AACF;AAEA,MAAM,SAAS;AACf,MAAM,YAAY;AAClB,MAAM,UAAU;AAChB,MAAM,WAAW;AAKV,SAAS,cAAc,YAAoB,aAA2B;AAC3E,QAAM,cAAc,YAAY,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAC1E,UAAQ,IAAI;AAAA,IAAO,OAAO,+BAA+B,SAAS,EAAE;AACpE,UAAQ,IAAI,KAAK,OAAO,OAAO,SAAS,IAAI,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,IAAI,OAAO,WAAW,SAAS,EAAE;AACvH,UAAQ,IAAI,KAAK,MAAM,IAAI,SAAS,EAAE;AACtC,UAAQ,IAAI,KAAK,MAAM,oBAAoB,SAAS,EAAE;AACtD,UAAQ,IAAI,KAAK,MAAM,qBAAqB,SAAS,EAAE;AACvD,UAAQ,IAAI,KAAK,MAAM,gCAAgC,SAAS,EAAE;AAClE,UAAQ,IAAI,KAAK,MAAM,+CAA+C,WAAW,KAAK,SAAS,EAAE;AACjG,UAAQ,IAAI,KAAK,MAAM,QAAQ,SAAS,EAAE;AAC1C,UAAQ,IAAI,KAAK,MAAM,MAAM,SAAS,EAAE;AACxC,UAAQ,IAAI,KAAK,MAAM,IAAI,SAAS;AAAA,CAAI;AAC1C;AAKO,SAAS,gBAAgB,SAAuB;AACrD,UAAQ,IAAI;AAAA,IAAO,OAAO,2BAA2B,SAAS,EAAE;AAChE,UAAQ,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS;AAAA,CAAI;AAC9D;",
6
6
  "names": []
7
7
  }
@@ -84,6 +84,115 @@ const PRESET_MODELS = [
84
84
  description: "Enter a custom HuggingFace model ID and embedding dimension"
85
85
  }
86
86
  ];
87
+ async function promptEmbeddings(rl) {
88
+ (0, import_prompts.printSection)("\u{1F50D}", "Semantic Search");
89
+ const enableEmbeddings = await (0, import_prompts.askToggle)(
90
+ rl,
91
+ "Semantic embeddings (similarity search):",
92
+ "Enables natural-language code search via vector embeddings. A local model (~130MB) is downloaded on first use."
93
+ );
94
+ const patch = {
95
+ enableEmbeddings,
96
+ semanticEngine: "cosine",
97
+ useVecIndex: false,
98
+ turboquantMemDocs: false,
99
+ turboquantBits: 3,
100
+ turbovecMemDocs: false,
101
+ turbovecBits: 4,
102
+ typesenseDashboard: false,
103
+ qdrantDashboard: false
104
+ };
105
+ if (!enableEmbeddings) {
106
+ return patch;
107
+ }
108
+ const modelChoice = await (0, import_prompts.arrowSelect)(
109
+ rl,
110
+ "Embedding model:",
111
+ PRESET_MODELS.map((m) => ({ value: m.value, label: m.label, description: m.description }))
112
+ );
113
+ let embeddingModel;
114
+ let embeddingDim;
115
+ if (modelChoice === "__other__") {
116
+ console.log(`
117
+ ${import_prompts.dim}Enter a HuggingFace model ID in the format org/model-name.${import_prompts.reset}`);
118
+ while (true) {
119
+ const raw = (await (0, import_prompts.ask)(rl, ` ${import_prompts.violet}Model identifier:${import_prompts.reset} `)).trim();
120
+ if (raw.includes("/")) {
121
+ embeddingModel = raw;
122
+ break;
123
+ }
124
+ console.log(` Expected a HuggingFace model ID in the format org/model-name (e.g. nomic-ai/nomic-embed-text-v1.5).`);
125
+ }
126
+ console.log(`
127
+ ${import_prompts.dim}Enter the embedding output dimension for this model (check the model card on HuggingFace).${import_prompts.reset}`);
128
+ while (true) {
129
+ const raw = (await (0, import_prompts.ask)(rl, ` ${import_prompts.violet}Embedding dimension (e.g. 768, 384):${import_prompts.reset} `)).trim();
130
+ const n = parseInt(raw, 10);
131
+ if (!isNaN(n) && n > 0) {
132
+ embeddingDim = n;
133
+ break;
134
+ }
135
+ console.log(` Expected a positive integer (e.g. 768, 384, 1536).`);
136
+ }
137
+ } else {
138
+ const preset = PRESET_MODELS.find((m) => m.value === modelChoice);
139
+ embeddingModel = preset.value;
140
+ embeddingDim = preset.dim;
141
+ }
142
+ patch.embeddingModel = embeddingModel;
143
+ patch.embeddingDim = embeddingDim;
144
+ const semanticEngine = await (0, import_prompts.arrowSelect)(rl, "Vector search engine:", [
145
+ { value: "cosine", label: "cosine", description: "In-process cosine similarity. No extra deps. Best for small/medium projects." },
146
+ { value: "turboquant", label: "turboquant", description: "ANN index, zero native deps. Compresses embeddings 20\u201330\xD7 (Google TurboQuant). ANN without native binaries \u2014 ideal for CI, ARM, restricted envs. Optional: npm install turboquant-js." },
147
+ { value: "turbovec", label: "turbovec", description: "ANN search via Rust/SIMD (napi-rs). Same TurboQuant algorithm but NEON on ARM and AVX-512BW on x86 \u2014 faster than turboquant-js at the cost of a one-time Rust build. Requires Rust toolchain. Build: cd native/turbovec-node && npm install && npm run build." },
148
+ { value: "sqlite-vec", label: "sqlite-vec", description: "ANN index. Sub-linear search. Best for large codebases. Needs: better-sqlite3, sqlite-vec (native)." },
149
+ { value: "orama", label: "orama", description: "Hybrid search (full-text + vector). Pure JS. Needs: @orama/orama, @orama/plugin-data-persistence." },
150
+ { value: "pglite", label: "pglite", description: "Hybrid search via PostgreSQL + pgvector. Exact results. Pure WASM. Needs: @electric-sql/pglite." },
151
+ { value: "lancedb", label: "lancedb", description: "ANN search via LanceDB (Apache Lance columnar format). Pure JS. Needs: @lancedb/lancedb." },
152
+ { value: "qdrant", label: "qdrant", description: "ANN search via Qdrant embedded binary (HNSW index, Cosine). Needs: qdrant-local." },
153
+ { value: "typesense", label: "typesense", description: "ANN search via Typesense (auto-downloaded binary, HNSW, Cosine). Needs: typesense." }
154
+ ]);
155
+ patch.semanticEngine = semanticEngine;
156
+ patch.useVecIndex = semanticEngine === "sqlite-vec";
157
+ if (semanticEngine === "turboquant") {
158
+ patch.turboquantMemDocs = await (0, import_prompts.askToggle)(
159
+ rl,
160
+ "TurboQuant for memory & docs search (optional):",
161
+ "Replaces the default linear cosine scan in memory observations and doc sections with a compressed ANN index \u2014 no native deps required. Most useful when you accumulate many observations or large doc sets (1 000+ entries).",
162
+ false
163
+ );
164
+ }
165
+ if (semanticEngine === "turbovec") {
166
+ patch.turbovecBits = await (0, import_prompts.arrowSelect)(rl, "TurboVec bits per coordinate:", [
167
+ { value: 4, label: "4 bits (recommended)", description: "Best quality, ~19\xD7 compression vs raw Float32. Default." },
168
+ { value: 3, label: "3 bits", description: "Balanced \u2014 ~25\xD7 compression, slight quality drop." },
169
+ { value: 2, label: "2 bits", description: "Highest compression (~38\xD7), lowest accuracy." }
170
+ ]);
171
+ patch.turbovecMemDocs = await (0, import_prompts.askToggle)(
172
+ rl,
173
+ "TurboVec for memory & docs search (optional):",
174
+ "Replaces the default linear cosine scan in memory observations and doc sections with the TurboVec ANN index. Requires the addon to be built.",
175
+ false
176
+ );
177
+ }
178
+ if (semanticEngine === "typesense") {
179
+ patch.typesenseDashboard = await (0, import_prompts.askToggle)(
180
+ rl,
181
+ "Typesense dashboard:",
182
+ "Serves the Typesense Dashboard locally and opens it in your browser after indexing completes.",
183
+ false
184
+ );
185
+ }
186
+ if (semanticEngine === "qdrant") {
187
+ patch.qdrantDashboard = await (0, import_prompts.askToggle)(
188
+ rl,
189
+ "Qdrant dashboard:",
190
+ "Downloads the Qdrant Web UI (first time only) and opens it in your browser after indexing completes.",
191
+ false
192
+ );
193
+ }
194
+ return patch;
195
+ }
87
196
  async function promptConfigOptions(rl, opts = {}) {
88
197
  const installMode = await (0, import_prompts.arrowSelect)(rl, "Installation mode:", [
89
198
  { value: "core", label: "Core only", description: "3 always-on tools (search, context, node) \u2014 ~170 tok. Zero config." },
@@ -130,14 +239,14 @@ async function promptConfigOptions(rl, opts = {}) {
130
239
  enableGeneralCompression: false
131
240
  };
132
241
  if (installMode === "core") {
133
- return { patch: basePatch, hooksToImport: null };
242
+ const embeddingPatch2 = await promptEmbeddings(rl);
243
+ return { patch: { ...basePatch, ...embeddingPatch2 }, hooksToImport: null };
134
244
  }
135
245
  if (installMode === "full") {
246
+ const embeddingPatch2 = await promptEmbeddings(rl);
136
247
  const fullPatch = {
137
248
  ...basePatch,
138
- enableEmbeddings: true,
139
- embeddingModel: DEFAULT_EMBEDDING_MODEL,
140
- embeddingDim: 768,
249
+ ...embeddingPatch2,
141
250
  extractDocstrings: true,
142
251
  trackCallSites: true,
143
252
  enableArchitecture: true,
@@ -168,104 +277,12 @@ async function promptConfigOptions(rl, opts = {}) {
168
277
  description: p.description
169
278
  })));
170
279
  const profile = PROFILES[profileKey];
171
- const patch2 = { ...basePatch, ...profile.patch };
280
+ const embeddingPatch2 = await promptEmbeddings(rl);
281
+ const patch2 = { ...basePatch, ...profile.patch, ...embeddingPatch2 };
172
282
  return { patch: patch2, hooksToImport: null };
173
283
  }
174
- (0, import_prompts.printSection)("\u{1F50D}", "Semantic Search");
175
- const enableEmbeddings = await (0, import_prompts.askToggle)(
176
- rl,
177
- "Semantic embeddings (similarity search):",
178
- "Enables natural-language code search via vector embeddings. A local model (~130MB) is downloaded on first use."
179
- );
180
- const patch = { ...basePatch, enableEmbeddings };
181
- if (enableEmbeddings) {
182
- const modelChoice = await (0, import_prompts.arrowSelect)(
183
- rl,
184
- "Embedding model:",
185
- PRESET_MODELS.map((m) => ({ value: m.value, label: m.label, description: m.description }))
186
- );
187
- let embeddingModel;
188
- let embeddingDim;
189
- if (modelChoice === "__other__") {
190
- console.log(`
191
- ${import_prompts.dim}Enter a HuggingFace model ID in the format org/model-name.${import_prompts.reset}`);
192
- while (true) {
193
- const raw = (await (0, import_prompts.ask)(rl, ` ${import_prompts.violet}Model identifier:${import_prompts.reset} `)).trim();
194
- if (raw.includes("/")) {
195
- embeddingModel = raw;
196
- break;
197
- }
198
- console.log(` Expected a HuggingFace model ID in the format org/model-name (e.g. nomic-ai/nomic-embed-text-v1.5).`);
199
- }
200
- console.log(`
201
- ${import_prompts.dim}Enter the embedding output dimension for this model (check the model card on HuggingFace).${import_prompts.reset}`);
202
- while (true) {
203
- const raw = (await (0, import_prompts.ask)(rl, ` ${import_prompts.violet}Embedding dimension (e.g. 768, 384):${import_prompts.reset} `)).trim();
204
- const n = parseInt(raw, 10);
205
- if (!isNaN(n) && n > 0) {
206
- embeddingDim = n;
207
- break;
208
- }
209
- console.log(` Expected a positive integer (e.g. 768, 384, 1536).`);
210
- }
211
- } else {
212
- const preset = PRESET_MODELS.find((m) => m.value === modelChoice);
213
- embeddingModel = preset.value;
214
- embeddingDim = preset.dim;
215
- }
216
- patch.embeddingModel = embeddingModel;
217
- patch.embeddingDim = embeddingDim;
218
- const semanticEngine = await (0, import_prompts.arrowSelect)(rl, "Vector search engine:", [
219
- { value: "cosine", label: "cosine", description: "In-process cosine similarity. No extra deps. Best for small/medium projects." },
220
- { value: "turboquant", label: "turboquant", description: "ANN index, zero native deps. Compresses embeddings 20\u201330\xD7 (Google TurboQuant). ANN without native binaries \u2014 ideal for CI, ARM, restricted envs. Optional: npm install turboquant-js." },
221
- { value: "turbovec", label: "turbovec", description: "ANN search via Rust/SIMD (napi-rs). Same TurboQuant algorithm but NEON on ARM and AVX-512BW on x86 \u2014 faster than turboquant-js at the cost of a one-time Rust build. Requires Rust toolchain. Build: cd native/turbovec-node && npm install && npm run build." },
222
- { value: "sqlite-vec", label: "sqlite-vec", description: "ANN index. Sub-linear search. Best for large codebases. Needs: better-sqlite3, sqlite-vec (native)." },
223
- { value: "orama", label: "orama", description: "Hybrid search (full-text + vector). Pure JS. Needs: @orama/orama, @orama/plugin-data-persistence." },
224
- { value: "pglite", label: "pglite", description: "Hybrid search via PostgreSQL + pgvector. Exact results. Pure WASM. Needs: @electric-sql/pglite." },
225
- { value: "lancedb", label: "lancedb", description: "ANN search via LanceDB (Apache Lance columnar format). Pure JS. Needs: @lancedb/lancedb." },
226
- { value: "qdrant", label: "qdrant", description: "ANN search via Qdrant embedded binary (HNSW index, Cosine). Needs: qdrant-local." },
227
- { value: "typesense", label: "typesense", description: "ANN search via Typesense (auto-downloaded binary, HNSW, Cosine). Needs: typesense." }
228
- ]);
229
- patch.semanticEngine = semanticEngine;
230
- patch.useVecIndex = semanticEngine === "sqlite-vec";
231
- if (semanticEngine === "turboquant") {
232
- patch.turboquantMemDocs = await (0, import_prompts.askToggle)(
233
- rl,
234
- "TurboQuant for memory & docs search (optional):",
235
- "Replaces the default linear cosine scan in memory observations and doc sections with a compressed ANN index \u2014 no native deps required. Most useful when you accumulate many observations or large doc sets (1 000+ entries).",
236
- false
237
- );
238
- }
239
- if (semanticEngine === "turbovec") {
240
- patch.turbovecBits = await (0, import_prompts.arrowSelect)(rl, "TurboVec bits per coordinate:", [
241
- { value: 4, label: "4 bits (recommended)", description: "Best quality, ~19\xD7 compression vs raw Float32. Default." },
242
- { value: 3, label: "3 bits", description: "Balanced \u2014 ~25\xD7 compression, slight quality drop." },
243
- { value: 2, label: "2 bits", description: "Highest compression (~38\xD7), lowest accuracy." }
244
- ]);
245
- patch.turbovecMemDocs = await (0, import_prompts.askToggle)(
246
- rl,
247
- "TurboVec for memory & docs search (optional):",
248
- "Replaces the default linear cosine scan in memory observations and doc sections with the TurboVec ANN index. Requires the addon to be built.",
249
- false
250
- );
251
- }
252
- if (semanticEngine === "typesense") {
253
- patch.typesenseDashboard = await (0, import_prompts.askToggle)(
254
- rl,
255
- "Typesense dashboard:",
256
- "Serves the Typesense Dashboard locally and opens it in your browser after indexing completes.",
257
- false
258
- );
259
- }
260
- if (semanticEngine === "qdrant") {
261
- patch.qdrantDashboard = await (0, import_prompts.askToggle)(
262
- rl,
263
- "Qdrant dashboard:",
264
- "Downloads the Qdrant Web UI (first time only) and opens it in your browser after indexing completes.",
265
- false
266
- );
267
- }
268
- }
284
+ const embeddingPatch = await promptEmbeddings(rl);
285
+ const patch = { ...basePatch, ...embeddingPatch };
269
286
  (0, import_prompts.printSection)("\u{1F4CA}", "Graph Features");
270
287
  patch.extractDocstrings = await (0, import_prompts.askToggle)(
271
288
  rl,