kirograph 0.12.1

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 (434) hide show
  1. package/README.md +1171 -0
  2. package/dist/architecture/index.d.ts +11 -0
  3. package/dist/architecture/index.d.ts.map +1 -0
  4. package/dist/architecture/index.js +207 -0
  5. package/dist/architecture/index.js.map +7 -0
  6. package/dist/architecture/layers/csharp.d.ts +6 -0
  7. package/dist/architecture/layers/csharp.d.ts.map +1 -0
  8. package/dist/architecture/layers/csharp.js +100 -0
  9. package/dist/architecture/layers/csharp.js.map +7 -0
  10. package/dist/architecture/layers/elixir.js +116 -0
  11. package/dist/architecture/layers/elixir.js.map +7 -0
  12. package/dist/architecture/layers/go.d.ts +7 -0
  13. package/dist/architecture/layers/go.d.ts.map +1 -0
  14. package/dist/architecture/layers/go.js +117 -0
  15. package/dist/architecture/layers/go.js.map +7 -0
  16. package/dist/architecture/layers/index.d.ts +30 -0
  17. package/dist/architecture/layers/index.d.ts.map +1 -0
  18. package/dist/architecture/layers/index.js +100 -0
  19. package/dist/architecture/layers/index.js.map +7 -0
  20. package/dist/architecture/layers/java.d.ts +7 -0
  21. package/dist/architecture/layers/java.d.ts.map +1 -0
  22. package/dist/architecture/layers/java.js +119 -0
  23. package/dist/architecture/layers/java.js.map +7 -0
  24. package/dist/architecture/layers/python.d.ts +7 -0
  25. package/dist/architecture/layers/python.d.ts.map +1 -0
  26. package/dist/architecture/layers/python.js +111 -0
  27. package/dist/architecture/layers/python.js.map +7 -0
  28. package/dist/architecture/layers/ruby.d.ts +6 -0
  29. package/dist/architecture/layers/ruby.d.ts.map +1 -0
  30. package/dist/architecture/layers/ruby.js +95 -0
  31. package/dist/architecture/layers/ruby.js.map +7 -0
  32. package/dist/architecture/layers/rust.d.ts +6 -0
  33. package/dist/architecture/layers/rust.d.ts.map +1 -0
  34. package/dist/architecture/layers/rust.js +98 -0
  35. package/dist/architecture/layers/rust.js.map +7 -0
  36. package/dist/architecture/layers/types.d.ts +2 -0
  37. package/dist/architecture/layers/types.d.ts.map +1 -0
  38. package/dist/architecture/layers/types.js +17 -0
  39. package/dist/architecture/layers/types.js.map +7 -0
  40. package/dist/architecture/layers/typescript.d.ts +9 -0
  41. package/dist/architecture/layers/typescript.d.ts.map +1 -0
  42. package/dist/architecture/layers/typescript.js +143 -0
  43. package/dist/architecture/layers/typescript.js.map +7 -0
  44. package/dist/architecture/manifest/cargo.d.ts +3 -0
  45. package/dist/architecture/manifest/cargo.d.ts.map +1 -0
  46. package/dist/architecture/manifest/cargo.js +94 -0
  47. package/dist/architecture/manifest/cargo.js.map +7 -0
  48. package/dist/architecture/manifest/csproj.d.ts +3 -0
  49. package/dist/architecture/manifest/csproj.d.ts.map +1 -0
  50. package/dist/architecture/manifest/csproj.js +75 -0
  51. package/dist/architecture/manifest/csproj.js.map +7 -0
  52. package/dist/architecture/manifest/go.d.ts +3 -0
  53. package/dist/architecture/manifest/go.d.ts.map +1 -0
  54. package/dist/architecture/manifest/go.js +85 -0
  55. package/dist/architecture/manifest/go.js.map +7 -0
  56. package/dist/architecture/manifest/gradle.d.ts +3 -0
  57. package/dist/architecture/manifest/gradle.d.ts.map +1 -0
  58. package/dist/architecture/manifest/gradle.js +80 -0
  59. package/dist/architecture/manifest/gradle.js.map +7 -0
  60. package/dist/architecture/manifest/index.d.ts +12 -0
  61. package/dist/architecture/manifest/index.d.ts.map +1 -0
  62. package/dist/architecture/manifest/index.js +130 -0
  63. package/dist/architecture/manifest/index.js.map +7 -0
  64. package/dist/architecture/manifest/maven.d.ts +3 -0
  65. package/dist/architecture/manifest/maven.d.ts.map +1 -0
  66. package/dist/architecture/manifest/maven.js +76 -0
  67. package/dist/architecture/manifest/maven.js.map +7 -0
  68. package/dist/architecture/manifest/npm.d.ts +3 -0
  69. package/dist/architecture/manifest/npm.d.ts.map +1 -0
  70. package/dist/architecture/manifest/npm.js +103 -0
  71. package/dist/architecture/manifest/npm.js.map +7 -0
  72. package/dist/architecture/manifest/python.d.ts +3 -0
  73. package/dist/architecture/manifest/python.d.ts.map +1 -0
  74. package/dist/architecture/manifest/python.js +105 -0
  75. package/dist/architecture/manifest/python.js.map +7 -0
  76. package/dist/architecture/manifest/types.d.ts +2 -0
  77. package/dist/architecture/manifest/types.d.ts.map +1 -0
  78. package/dist/architecture/manifest/types.js +17 -0
  79. package/dist/architecture/manifest/types.js.map +7 -0
  80. package/dist/architecture/types.d.ts +91 -0
  81. package/dist/architecture/types.d.ts.map +1 -0
  82. package/dist/architecture/types.js +17 -0
  83. package/dist/architecture/types.js.map +7 -0
  84. package/dist/assets/logo.png +0 -0
  85. package/dist/banner.d.ts +6 -0
  86. package/dist/banner.d.ts.map +1 -0
  87. package/dist/banner.js +67 -0
  88. package/dist/banner.js.map +1 -0
  89. package/dist/bin/banner.d.ts +6 -0
  90. package/dist/bin/banner.d.ts.map +1 -0
  91. package/dist/bin/banner.js +88 -0
  92. package/dist/bin/banner.js.map +7 -0
  93. package/dist/bin/commands/affected.d.ts +3 -0
  94. package/dist/bin/commands/affected.d.ts.map +1 -0
  95. package/dist/bin/commands/affected.js +78 -0
  96. package/dist/bin/commands/affected.js.map +7 -0
  97. package/dist/bin/commands/architecture.d.ts +3 -0
  98. package/dist/bin/commands/architecture.d.ts.map +1 -0
  99. package/dist/bin/commands/architecture.js +125 -0
  100. package/dist/bin/commands/architecture.js.map +7 -0
  101. package/dist/bin/commands/caveman.js +136 -0
  102. package/dist/bin/commands/caveman.js.map +7 -0
  103. package/dist/bin/commands/context.d.ts +3 -0
  104. package/dist/bin/commands/context.d.ts.map +1 -0
  105. package/dist/bin/commands/context.js +81 -0
  106. package/dist/bin/commands/context.js.map +7 -0
  107. package/dist/bin/commands/coupling.d.ts +3 -0
  108. package/dist/bin/commands/coupling.d.ts.map +1 -0
  109. package/dist/bin/commands/coupling.js +164 -0
  110. package/dist/bin/commands/coupling.js.map +7 -0
  111. package/dist/bin/commands/dashboard.d.ts +3 -0
  112. package/dist/bin/commands/dashboard.d.ts.map +1 -0
  113. package/dist/bin/commands/dashboard.js +209 -0
  114. package/dist/bin/commands/dashboard.js.map +7 -0
  115. package/dist/bin/commands/dead-code.js +77 -0
  116. package/dist/bin/commands/dead-code.js.map +7 -0
  117. package/dist/bin/commands/export.js +2620 -0
  118. package/dist/bin/commands/export.js.map +7 -0
  119. package/dist/bin/commands/files.d.ts +3 -0
  120. package/dist/bin/commands/files.d.ts.map +1 -0
  121. package/dist/bin/commands/files.js +104 -0
  122. package/dist/bin/commands/files.js.map +7 -0
  123. package/dist/bin/commands/help.d.ts +4 -0
  124. package/dist/bin/commands/help.d.ts.map +1 -0
  125. package/dist/bin/commands/help.js +212 -0
  126. package/dist/bin/commands/help.js.map +7 -0
  127. package/dist/bin/commands/hotspots.js +77 -0
  128. package/dist/bin/commands/hotspots.js.map +7 -0
  129. package/dist/bin/commands/index.d.ts +3 -0
  130. package/dist/bin/commands/index.d.ts.map +1 -0
  131. package/dist/bin/commands/index.js +58 -0
  132. package/dist/bin/commands/index.js.map +7 -0
  133. package/dist/bin/commands/init.d.ts +3 -0
  134. package/dist/bin/commands/init.d.ts.map +1 -0
  135. package/dist/bin/commands/init.js +68 -0
  136. package/dist/bin/commands/init.js.map +7 -0
  137. package/dist/bin/commands/install.d.ts +3 -0
  138. package/dist/bin/commands/install.d.ts.map +1 -0
  139. package/dist/bin/commands/install.js +34 -0
  140. package/dist/bin/commands/install.js.map +7 -0
  141. package/dist/bin/commands/mark-dirty.d.ts +3 -0
  142. package/dist/bin/commands/mark-dirty.d.ts.map +1 -0
  143. package/dist/bin/commands/mark-dirty.js +51 -0
  144. package/dist/bin/commands/mark-dirty.js.map +7 -0
  145. package/dist/bin/commands/package.d.ts +3 -0
  146. package/dist/bin/commands/package.d.ts.map +1 -0
  147. package/dist/bin/commands/package.js +139 -0
  148. package/dist/bin/commands/package.js.map +7 -0
  149. package/dist/bin/commands/path.js +93 -0
  150. package/dist/bin/commands/path.js.map +7 -0
  151. package/dist/bin/commands/qdrant.d.ts +3 -0
  152. package/dist/bin/commands/qdrant.d.ts.map +1 -0
  153. package/dist/bin/commands/qdrant.js +159 -0
  154. package/dist/bin/commands/qdrant.js.map +1 -0
  155. package/dist/bin/commands/query.d.ts +3 -0
  156. package/dist/bin/commands/query.d.ts.map +1 -0
  157. package/dist/bin/commands/query.js +47 -0
  158. package/dist/bin/commands/query.js.map +7 -0
  159. package/dist/bin/commands/serve.d.ts +3 -0
  160. package/dist/bin/commands/serve.d.ts.map +1 -0
  161. package/dist/bin/commands/serve.js +59 -0
  162. package/dist/bin/commands/serve.js.map +7 -0
  163. package/dist/bin/commands/snapshot.js +122 -0
  164. package/dist/bin/commands/snapshot.js.map +7 -0
  165. package/dist/bin/commands/status.d.ts +3 -0
  166. package/dist/bin/commands/status.d.ts.map +1 -0
  167. package/dist/bin/commands/status.js +107 -0
  168. package/dist/bin/commands/status.js.map +7 -0
  169. package/dist/bin/commands/stop.d.ts +3 -0
  170. package/dist/bin/commands/stop.d.ts.map +1 -0
  171. package/dist/bin/commands/stop.js +81 -0
  172. package/dist/bin/commands/stop.js.map +1 -0
  173. package/dist/bin/commands/surprising.js +79 -0
  174. package/dist/bin/commands/surprising.js.map +7 -0
  175. package/dist/bin/commands/sync-if-dirty.d.ts +3 -0
  176. package/dist/bin/commands/sync-if-dirty.d.ts.map +1 -0
  177. package/dist/bin/commands/sync-if-dirty.js +67 -0
  178. package/dist/bin/commands/sync-if-dirty.js.map +7 -0
  179. package/dist/bin/commands/sync.d.ts +3 -0
  180. package/dist/bin/commands/sync.d.ts.map +1 -0
  181. package/dist/bin/commands/sync.js +81 -0
  182. package/dist/bin/commands/sync.js.map +7 -0
  183. package/dist/bin/commands/typesense.d.ts +3 -0
  184. package/dist/bin/commands/typesense.d.ts.map +1 -0
  185. package/dist/bin/commands/typesense.js +126 -0
  186. package/dist/bin/commands/typesense.js.map +1 -0
  187. package/dist/bin/commands/uninit.d.ts +4 -0
  188. package/dist/bin/commands/uninit.d.ts.map +1 -0
  189. package/dist/bin/commands/uninit.js +123 -0
  190. package/dist/bin/commands/uninit.js.map +7 -0
  191. package/dist/bin/commands/unlock.d.ts +3 -0
  192. package/dist/bin/commands/unlock.d.ts.map +1 -0
  193. package/dist/bin/commands/unlock.js +53 -0
  194. package/dist/bin/commands/unlock.js.map +7 -0
  195. package/dist/bin/commands/utils.d.ts +12 -0
  196. package/dist/bin/commands/utils.d.ts.map +1 -0
  197. package/dist/bin/commands/utils.js +56 -0
  198. package/dist/bin/commands/utils.js.map +7 -0
  199. package/dist/bin/installer/archive.js +230 -0
  200. package/dist/bin/installer/archive.js.map +7 -0
  201. package/dist/bin/installer/caveman.js +57 -0
  202. package/dist/bin/installer/caveman.js.map +7 -0
  203. package/dist/bin/installer/cli-agent.d.ts +15 -0
  204. package/dist/bin/installer/cli-agent.d.ts.map +1 -0
  205. package/dist/bin/installer/cli-agent.js +89 -0
  206. package/dist/bin/installer/cli-agent.js.map +7 -0
  207. package/dist/bin/installer/config-prompt.d.ts +13 -0
  208. package/dist/bin/installer/config-prompt.d.ts.map +1 -0
  209. package/dist/bin/installer/config-prompt.js +158 -0
  210. package/dist/bin/installer/config-prompt.js.map +7 -0
  211. package/dist/bin/installer/dashboard.d.ts +3 -0
  212. package/dist/bin/installer/dashboard.d.ts.map +1 -0
  213. package/dist/bin/installer/dashboard.js +149 -0
  214. package/dist/bin/installer/dashboard.js.map +7 -0
  215. package/dist/bin/installer/hooks.d.ts +5 -0
  216. package/dist/bin/installer/hooks.d.ts.map +1 -0
  217. package/dist/bin/installer/hooks.js +155 -0
  218. package/dist/bin/installer/hooks.js.map +7 -0
  219. package/dist/bin/installer/index.d.ts +11 -0
  220. package/dist/bin/installer/index.d.ts.map +1 -0
  221. package/dist/bin/installer/index.js +228 -0
  222. package/dist/bin/installer/index.js.map +7 -0
  223. package/dist/bin/installer/mcp.d.ts +5 -0
  224. package/dist/bin/installer/mcp.d.ts.map +1 -0
  225. package/dist/bin/installer/mcp.js +80 -0
  226. package/dist/bin/installer/mcp.js.map +7 -0
  227. package/dist/bin/installer/prompts.d.ts +28 -0
  228. package/dist/bin/installer/prompts.d.ts.map +1 -0
  229. package/dist/bin/installer/prompts.js +134 -0
  230. package/dist/bin/installer/prompts.js.map +7 -0
  231. package/dist/bin/installer/qdrant-dashboard.d.ts +4 -0
  232. package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -0
  233. package/dist/bin/installer/qdrant-dashboard.js +115 -0
  234. package/dist/bin/installer/qdrant-dashboard.js.map +7 -0
  235. package/dist/bin/installer/steering.d.ts +5 -0
  236. package/dist/bin/installer/steering.d.ts.map +1 -0
  237. package/dist/bin/installer/steering.js +283 -0
  238. package/dist/bin/installer/steering.js.map +7 -0
  239. package/dist/bin/kirograph.d.ts +6 -0
  240. package/dist/bin/kirograph.d.ts.map +1 -0
  241. package/dist/bin/kirograph.js +95 -0
  242. package/dist/bin/kirograph.js.map +7 -0
  243. package/dist/bin/progress.d.ts +14 -0
  244. package/dist/bin/progress.d.ts.map +1 -0
  245. package/dist/bin/progress.js +201 -0
  246. package/dist/bin/progress.js.map +7 -0
  247. package/dist/bin/ui.d.ts +11 -0
  248. package/dist/bin/ui.d.ts.map +1 -0
  249. package/dist/bin/ui.js +71 -0
  250. package/dist/bin/ui.js.map +7 -0
  251. package/dist/config.d.ts +48 -0
  252. package/dist/config.d.ts.map +1 -0
  253. package/dist/config.js +273 -0
  254. package/dist/config.js.map +7 -0
  255. package/dist/context/index.d.ts +61 -0
  256. package/dist/context/index.d.ts.map +1 -0
  257. package/dist/context/index.js +224 -0
  258. package/dist/context/index.js.map +7 -0
  259. package/dist/core/file-tree.d.ts +15 -0
  260. package/dist/core/file-tree.d.ts.map +1 -0
  261. package/dist/core/file-tree.js +69 -0
  262. package/dist/core/file-tree.js.map +7 -0
  263. package/dist/core/lock-manager.d.ts +20 -0
  264. package/dist/core/lock-manager.d.ts.map +1 -0
  265. package/dist/core/lock-manager.js +120 -0
  266. package/dist/core/lock-manager.js.map +7 -0
  267. package/dist/core/pipeline.d.ts +37 -0
  268. package/dist/core/pipeline.d.ts.map +1 -0
  269. package/dist/core/pipeline.js +375 -0
  270. package/dist/core/pipeline.js.map +7 -0
  271. package/dist/core/snapshot.js +141 -0
  272. package/dist/core/snapshot.js.map +7 -0
  273. package/dist/db/database.d.ts +133 -0
  274. package/dist/db/database.d.ts.map +1 -0
  275. package/dist/db/database.js +929 -0
  276. package/dist/db/database.js.map +7 -0
  277. package/dist/db/schema.sql +174 -0
  278. package/dist/errors.d.ts +49 -0
  279. package/dist/errors.d.ts.map +1 -0
  280. package/dist/errors.js +160 -0
  281. package/dist/errors.js.map +7 -0
  282. package/dist/extraction/extractor.d.ts +29 -0
  283. package/dist/extraction/extractor.d.ts.map +1 -0
  284. package/dist/extraction/extractor.js +764 -0
  285. package/dist/extraction/extractor.js.map +7 -0
  286. package/dist/extraction/grammars.d.ts +48 -0
  287. package/dist/extraction/grammars.d.ts.map +1 -0
  288. package/dist/extraction/grammars.js +166 -0
  289. package/dist/extraction/grammars.js.map +7 -0
  290. package/dist/extraction/languages.d.ts +9 -0
  291. package/dist/extraction/languages.d.ts.map +1 -0
  292. package/dist/extraction/languages.js +103 -0
  293. package/dist/extraction/languages.js.map +7 -0
  294. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  295. package/dist/frameworks/csharp.d.ts +8 -0
  296. package/dist/frameworks/csharp.d.ts.map +1 -0
  297. package/dist/frameworks/csharp.js +93 -0
  298. package/dist/frameworks/csharp.js.map +7 -0
  299. package/dist/frameworks/elixir.js +142 -0
  300. package/dist/frameworks/elixir.js.map +7 -0
  301. package/dist/frameworks/express.d.ts +8 -0
  302. package/dist/frameworks/express.d.ts.map +1 -0
  303. package/dist/frameworks/express.js +143 -0
  304. package/dist/frameworks/express.js.map +7 -0
  305. package/dist/frameworks/go.d.ts +8 -0
  306. package/dist/frameworks/go.d.ts.map +1 -0
  307. package/dist/frameworks/go.js +85 -0
  308. package/dist/frameworks/go.js.map +7 -0
  309. package/dist/frameworks/index.d.ts +30 -0
  310. package/dist/frameworks/index.d.ts.map +1 -0
  311. package/dist/frameworks/index.js +243 -0
  312. package/dist/frameworks/index.js.map +7 -0
  313. package/dist/frameworks/java.d.ts +8 -0
  314. package/dist/frameworks/java.d.ts.map +1 -0
  315. package/dist/frameworks/java.js +87 -0
  316. package/dist/frameworks/java.js.map +7 -0
  317. package/dist/frameworks/laravel.d.ts +9 -0
  318. package/dist/frameworks/laravel.d.ts.map +1 -0
  319. package/dist/frameworks/laravel.js +115 -0
  320. package/dist/frameworks/laravel.js.map +7 -0
  321. package/dist/frameworks/python.d.ts +10 -0
  322. package/dist/frameworks/python.d.ts.map +1 -0
  323. package/dist/frameworks/python.js +158 -0
  324. package/dist/frameworks/python.js.map +7 -0
  325. package/dist/frameworks/react.d.ts +9 -0
  326. package/dist/frameworks/react.d.ts.map +1 -0
  327. package/dist/frameworks/react.js +230 -0
  328. package/dist/frameworks/react.js.map +7 -0
  329. package/dist/frameworks/ruby.d.ts +8 -0
  330. package/dist/frameworks/ruby.d.ts.map +1 -0
  331. package/dist/frameworks/ruby.js +136 -0
  332. package/dist/frameworks/ruby.js.map +7 -0
  333. package/dist/frameworks/rust.d.ts +8 -0
  334. package/dist/frameworks/rust.d.ts.map +1 -0
  335. package/dist/frameworks/rust.js +82 -0
  336. package/dist/frameworks/rust.js.map +7 -0
  337. package/dist/frameworks/svelte.d.ts +8 -0
  338. package/dist/frameworks/svelte.d.ts.map +1 -0
  339. package/dist/frameworks/svelte.js +174 -0
  340. package/dist/frameworks/svelte.js.map +7 -0
  341. package/dist/frameworks/swift.d.ts +10 -0
  342. package/dist/frameworks/swift.d.ts.map +1 -0
  343. package/dist/frameworks/swift.js +151 -0
  344. package/dist/frameworks/swift.js.map +7 -0
  345. package/dist/frameworks/types.d.ts +37 -0
  346. package/dist/frameworks/types.d.ts.map +1 -0
  347. package/dist/frameworks/types.js +17 -0
  348. package/dist/frameworks/types.js.map +7 -0
  349. package/dist/graph/queries.d.ts +53 -0
  350. package/dist/graph/queries.d.ts.map +1 -0
  351. package/dist/graph/queries.js +224 -0
  352. package/dist/graph/queries.js.map +7 -0
  353. package/dist/graph/traversal.d.ts +35 -0
  354. package/dist/graph/traversal.d.ts.map +1 -0
  355. package/dist/graph/traversal.js +148 -0
  356. package/dist/graph/traversal.js.map +7 -0
  357. package/dist/index.d.ts +102 -0
  358. package/dist/index.d.ts.map +1 -0
  359. package/dist/index.js +303 -0
  360. package/dist/index.js.map +7 -0
  361. package/dist/installer/index.d.ts +10 -0
  362. package/dist/installer/index.d.ts.map +1 -0
  363. package/dist/installer/index.js +526 -0
  364. package/dist/installer/index.js.map +1 -0
  365. package/dist/mcp/server.d.ts +16 -0
  366. package/dist/mcp/server.d.ts.map +1 -0
  367. package/dist/mcp/server.js +116 -0
  368. package/dist/mcp/server.js.map +7 -0
  369. package/dist/mcp/tools.d.ts +37 -0
  370. package/dist/mcp/tools.d.ts.map +1 -0
  371. package/dist/mcp/tools.js +779 -0
  372. package/dist/mcp/tools.js.map +7 -0
  373. package/dist/mcp/transport.d.ts +29 -0
  374. package/dist/mcp/transport.d.ts.map +1 -0
  375. package/dist/mcp/transport.js +70 -0
  376. package/dist/mcp/transport.js.map +7 -0
  377. package/dist/resolution/index.d.ts +56 -0
  378. package/dist/resolution/index.d.ts.map +1 -0
  379. package/dist/resolution/index.js +384 -0
  380. package/dist/resolution/index.js.map +7 -0
  381. package/dist/resolution/name-matcher.d.ts +25 -0
  382. package/dist/resolution/name-matcher.d.ts.map +1 -0
  383. package/dist/resolution/name-matcher.js +60 -0
  384. package/dist/resolution/name-matcher.js.map +7 -0
  385. package/dist/scripts/postinstall.js +64 -0
  386. package/dist/search/query-utils.d.ts +21 -0
  387. package/dist/search/query-utils.d.ts.map +1 -0
  388. package/dist/search/query-utils.js +219 -0
  389. package/dist/search/query-utils.js.map +7 -0
  390. package/dist/search/searcher.d.ts +15 -0
  391. package/dist/search/searcher.d.ts.map +1 -0
  392. package/dist/search/searcher.js +49 -0
  393. package/dist/search/searcher.js.map +7 -0
  394. package/dist/sync/index.d.ts +33 -0
  395. package/dist/sync/index.d.ts.map +1 -0
  396. package/dist/sync/index.js +200 -0
  397. package/dist/sync/index.js.map +7 -0
  398. package/dist/types.d.ts +131 -0
  399. package/dist/types.d.ts.map +1 -0
  400. package/dist/types.js +37 -0
  401. package/dist/types.js.map +7 -0
  402. package/dist/utils.d.ts +52 -0
  403. package/dist/utils.d.ts.map +1 -0
  404. package/dist/utils.js +254 -0
  405. package/dist/utils.js.map +7 -0
  406. package/dist/vectors/index.d.ts +71 -0
  407. package/dist/vectors/index.d.ts.map +1 -0
  408. package/dist/vectors/index.js +480 -0
  409. package/dist/vectors/index.js.map +7 -0
  410. package/dist/vectors/lancedb-index.d.ts +50 -0
  411. package/dist/vectors/lancedb-index.d.ts.map +1 -0
  412. package/dist/vectors/lancedb-index.js +153 -0
  413. package/dist/vectors/lancedb-index.js.map +7 -0
  414. package/dist/vectors/orama-index.d.ts +54 -0
  415. package/dist/vectors/orama-index.d.ts.map +1 -0
  416. package/dist/vectors/orama-index.js +213 -0
  417. package/dist/vectors/orama-index.js.map +7 -0
  418. package/dist/vectors/pglite-index.d.ts +53 -0
  419. package/dist/vectors/pglite-index.d.ts.map +1 -0
  420. package/dist/vectors/pglite-index.js +194 -0
  421. package/dist/vectors/pglite-index.js.map +7 -0
  422. package/dist/vectors/qdrant-index.d.ts +70 -0
  423. package/dist/vectors/qdrant-index.d.ts.map +1 -0
  424. package/dist/vectors/qdrant-index.js +364 -0
  425. package/dist/vectors/qdrant-index.js.map +7 -0
  426. package/dist/vectors/typesense-index.d.ts +75 -0
  427. package/dist/vectors/typesense-index.d.ts.map +1 -0
  428. package/dist/vectors/typesense-index.js +453 -0
  429. package/dist/vectors/typesense-index.js.map +7 -0
  430. package/dist/vectors/vec-index.d.ts +52 -0
  431. package/dist/vectors/vec-index.d.ts.map +1 -0
  432. package/dist/vectors/vec-index.js +198 -0
  433. package/dist/vectors/vec-index.js.map +7 -0
  434. package/package.json +67 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * KiroGraph Graph Query Manager
3
+ * High-level graph queries built on top of GraphTraverser and GraphDatabase.
4
+ */
5
+ import type { Node, NodeContext, NodeMetrics, Subgraph } from '../types';
6
+ import type { GraphDatabase } from '../db/database';
7
+ import { type TraversalOptions } from './traversal';
8
+ export declare class GraphQueryManager {
9
+ private readonly db;
10
+ private readonly traverser;
11
+ constructor(db: GraphDatabase);
12
+ /** Get full context for a node (node + ancestors + children + callers + callees). */
13
+ getContext(nodeId: string): Promise<NodeContext>;
14
+ /** Get all nodes that call the given node (depth=1, incoming 'calls' edges). */
15
+ getCallers(nodeId: string, limit?: number): Promise<Node[]>;
16
+ /** Get all nodes called by the given node (depth=1, outgoing 'calls' edges). */
17
+ getCallees(nodeId: string, limit?: number): Promise<Node[]>;
18
+ /** Get the full call graph rooted at nodeId up to the given depth. */
19
+ getCallGraph(nodeId: string, depth?: number): Promise<Subgraph>;
20
+ /**
21
+ * Get the type hierarchy for a node.
22
+ * direction: 'up' = base types, 'down' = derived types, 'both' = all.
23
+ */
24
+ getTypeHierarchy(nodeId: string, direction?: 'up' | 'down' | 'both'): Promise<Node[]>;
25
+ /** Get all nodes that would be impacted by changing nodeId (incoming edges). */
26
+ getImpactRadius(nodeId: string, depth?: number): Promise<Node[]>;
27
+ /** Find the shortest path between two nodes via BFS. */
28
+ findPath(fromId: string, toId: string, maxDepth?: number): Promise<Node[]>;
29
+ /** Get all ancestor containers of a node (incoming 'contains' edges). */
30
+ getAncestors(nodeId: string): Promise<Node[]>;
31
+ /** Get direct children of a node (outgoing 'contains' edges, depth=1). */
32
+ getChildren(nodeId: string): Promise<Node[]>;
33
+ /**
34
+ * Find test files that are transitively affected by changes to the given source files.
35
+ * BFS-traverses import/call dependents to discover which test files depend on changed code.
36
+ */
37
+ getAffectedTests(changedFiles: string[], opts?: {
38
+ depth?: number;
39
+ testPattern?: string;
40
+ }): string[];
41
+ /** Find all circular import dependencies. Returns arrays of file paths forming cycles. */
42
+ findCircularDependencies(): Promise<string[][]>;
43
+ /** Find nodes with no incoming edges (potential dead code). */
44
+ findDeadCode(limit?: number): Promise<Node[]>;
45
+ /** Get metrics for a node (edge counts, callers, callees, children). */
46
+ getNodeMetrics(nodeId: string): Promise<NodeMetrics>;
47
+ /**
48
+ * Build a subgraph from a set of node IDs, optionally traversing further
49
+ * with the given TraversalOptions.
50
+ */
51
+ getFilteredSubgraph(nodeIds: string[], opts?: TraversalOptions): Promise<Subgraph>;
52
+ }
53
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/graph/queries.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpE,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAF/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;gBAEd,EAAE,EAAE,aAAa;IAI9C,qFAAqF;IAC/E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAUtD,gFAAgF;IAC1E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IASjE,gFAAgF;IAC1E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IASjE,sEAAsE;IAChE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;IAchE;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,IAAI,GAAG,MAAM,GAAG,MAAe,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAYnG,gFAAgF;IAC1E,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAOjE,wDAAwD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAgD5E,yEAAyE;IACnE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAOnD,0EAA0E;IACpE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQlD;;;OAGG;IACH,gBAAgB,CACd,YAAY,EAAE,MAAM,EAAE,EACtB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9C,MAAM,EAAE;IAqCX,0FAA0F;IACpF,wBAAwB,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAIrD,+DAA+D;IACzD,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAI/C,wEAAwE;IAClE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI1D;;;OAGG;IACG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAyBzF"}
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var queries_exports = {};
20
+ __export(queries_exports, {
21
+ GraphQueryManager: () => GraphQueryManager
22
+ });
23
+ module.exports = __toCommonJS(queries_exports);
24
+ var import_traversal = require("./traversal");
25
+ class GraphQueryManager {
26
+ constructor(db) {
27
+ this.db = db;
28
+ this.traverser = new import_traversal.GraphTraverser(db);
29
+ }
30
+ /** Get full context for a node (node + ancestors + children + callers + callees). */
31
+ async getContext(nodeId) {
32
+ const ctx = this.db.getNodeContext(nodeId);
33
+ if (!ctx) {
34
+ const node = this.db.getNode(nodeId);
35
+ if (!node) throw new Error(`Node not found: ${nodeId}`);
36
+ return { node, ancestors: [], children: [], callers: [], callees: [] };
37
+ }
38
+ return ctx;
39
+ }
40
+ /** Get all nodes that call the given node (depth=1, incoming 'calls' edges). */
41
+ async getCallers(nodeId, limit) {
42
+ return this.traverser.traverseBFS(nodeId, {
43
+ direction: "incoming",
44
+ edgeKinds: ["calls"],
45
+ maxDepth: 1,
46
+ limit
47
+ });
48
+ }
49
+ /** Get all nodes called by the given node (depth=1, outgoing 'calls' edges). */
50
+ async getCallees(nodeId, limit) {
51
+ return this.traverser.traverseBFS(nodeId, {
52
+ direction: "outgoing",
53
+ edgeKinds: ["calls"],
54
+ maxDepth: 1,
55
+ limit
56
+ });
57
+ }
58
+ /** Get the full call graph rooted at nodeId up to the given depth. */
59
+ async getCallGraph(nodeId, depth = 3) {
60
+ const nodes = await this.traverser.traverseBFS(nodeId, {
61
+ direction: "outgoing",
62
+ edgeKinds: ["calls"],
63
+ maxDepth: depth,
64
+ includeStart: true
65
+ });
66
+ const nodeIds = nodes.map((n) => n.id);
67
+ const edges = this.db.getEdgesForNodes(nodeIds).filter(
68
+ (e) => nodeIds.includes(e.source) && nodeIds.includes(e.target) && e.kind === "calls"
69
+ );
70
+ return { nodes, edges, entryPoints: [nodeId] };
71
+ }
72
+ /**
73
+ * Get the type hierarchy for a node.
74
+ * direction: 'up' = base types, 'down' = derived types, 'both' = all.
75
+ */
76
+ async getTypeHierarchy(nodeId, direction = "both") {
77
+ const traversalDirection = direction === "up" ? "outgoing" : direction === "down" ? "incoming" : "both";
78
+ return this.traverser.traverseBFS(nodeId, {
79
+ direction: traversalDirection,
80
+ edgeKinds: ["extends", "implements"]
81
+ });
82
+ }
83
+ /** Get all nodes that would be impacted by changing nodeId (incoming edges). */
84
+ async getImpactRadius(nodeId, depth = 2) {
85
+ return this.traverser.traverseBFS(nodeId, {
86
+ direction: "incoming",
87
+ maxDepth: depth
88
+ });
89
+ }
90
+ /** Find the shortest path between two nodes via BFS. */
91
+ async findPath(fromId, toId, maxDepth = 10) {
92
+ if (fromId === toId) {
93
+ const node = this.db.getNode(fromId);
94
+ return node ? [node] : [];
95
+ }
96
+ const prev = /* @__PURE__ */ new Map();
97
+ const queue = [[fromId, 0]];
98
+ const visited = /* @__PURE__ */ new Set([fromId]);
99
+ let found = false;
100
+ outer: while (queue.length > 0) {
101
+ const [currentId, depth] = queue.shift();
102
+ if (depth >= maxDepth) continue;
103
+ const edges = this.db.getEdgesForNodes([currentId]);
104
+ for (const edge of edges) {
105
+ const neighborId = edge.source === currentId ? edge.target : edge.source;
106
+ if (!visited.has(neighborId)) {
107
+ visited.add(neighborId);
108
+ prev.set(neighborId, currentId);
109
+ if (neighborId === toId) {
110
+ found = true;
111
+ break outer;
112
+ }
113
+ queue.push([neighborId, depth + 1]);
114
+ }
115
+ }
116
+ }
117
+ if (!found) return [];
118
+ const pathIds = [];
119
+ let cur = toId;
120
+ while (cur !== void 0) {
121
+ pathIds.unshift(cur);
122
+ cur = prev.get(cur);
123
+ }
124
+ const result = [];
125
+ for (const id of pathIds) {
126
+ const node = this.db.getNode(id);
127
+ if (node) result.push(node);
128
+ }
129
+ return result;
130
+ }
131
+ /** Get all ancestor containers of a node (incoming 'contains' edges). */
132
+ async getAncestors(nodeId) {
133
+ return this.traverser.traverseBFS(nodeId, {
134
+ direction: "incoming",
135
+ edgeKinds: ["contains"]
136
+ });
137
+ }
138
+ /** Get direct children of a node (outgoing 'contains' edges, depth=1). */
139
+ async getChildren(nodeId) {
140
+ return this.traverser.traverseBFS(nodeId, {
141
+ direction: "outgoing",
142
+ edgeKinds: ["contains"],
143
+ maxDepth: 1
144
+ });
145
+ }
146
+ /**
147
+ * Find test files that are transitively affected by changes to the given source files.
148
+ * BFS-traverses import/call dependents to discover which test files depend on changed code.
149
+ */
150
+ getAffectedTests(changedFiles, opts) {
151
+ const picomatch = require("picomatch");
152
+ const depth = opts?.depth ?? 5;
153
+ const isTest = picomatch(
154
+ opts?.testPattern ?? "{**/*.spec.*,**/*.test.*,**/e2e/**,**/tests/**,**/__tests__/**}"
155
+ );
156
+ const results = /* @__PURE__ */ new Set();
157
+ for (const file of changedFiles) {
158
+ const rel = file.replace(/\\/g, "/").replace(/^\.\//, "");
159
+ if (isTest(rel)) {
160
+ results.add(rel);
161
+ continue;
162
+ }
163
+ const visited = /* @__PURE__ */ new Set([rel]);
164
+ let frontier = [rel];
165
+ for (let d = 0; d < depth; d++) {
166
+ if (frontier.length === 0) break;
167
+ const next = [];
168
+ for (const f of frontier) {
169
+ for (const dep of this.db.getDependentFiles(f)) {
170
+ if (!visited.has(dep)) {
171
+ visited.add(dep);
172
+ next.push(dep);
173
+ if (isTest(dep)) results.add(dep);
174
+ }
175
+ }
176
+ }
177
+ frontier = next;
178
+ }
179
+ }
180
+ return [...results].sort();
181
+ }
182
+ /** Find all circular import dependencies. Returns arrays of file paths forming cycles. */
183
+ async findCircularDependencies() {
184
+ return this.db.findCircularDependencies();
185
+ }
186
+ /** Find nodes with no incoming edges (potential dead code). */
187
+ async findDeadCode(limit = 50) {
188
+ return this.db.findDeadCode(limit);
189
+ }
190
+ /** Get metrics for a node (edge counts, callers, callees, children). */
191
+ async getNodeMetrics(nodeId) {
192
+ return this.db.getNodeMetrics(nodeId);
193
+ }
194
+ /**
195
+ * Build a subgraph from a set of node IDs, optionally traversing further
196
+ * with the given TraversalOptions.
197
+ */
198
+ async getFilteredSubgraph(nodeIds, opts) {
199
+ const allNodeIds = new Set(nodeIds);
200
+ if (opts) {
201
+ for (const startId of nodeIds) {
202
+ const traversed = await this.traverser.traverseBFS(startId, opts);
203
+ for (const node of traversed) {
204
+ allNodeIds.add(node.id);
205
+ }
206
+ }
207
+ }
208
+ const ids = [...allNodeIds];
209
+ const nodes = [];
210
+ for (const id of ids) {
211
+ const node = this.db.getNode(id);
212
+ if (node) nodes.push(node);
213
+ }
214
+ const edges = this.db.getEdgesForNodes(ids).filter(
215
+ (e) => allNodeIds.has(e.source) && allNodeIds.has(e.target)
216
+ );
217
+ return { nodes, edges, entryPoints: nodeIds };
218
+ }
219
+ }
220
+ // Annotate the CommonJS export names for ESM import in node:
221
+ 0 && (module.exports = {
222
+ GraphQueryManager
223
+ });
224
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/graph/queries.ts"],
4
+ "sourcesContent": ["/**\n * KiroGraph Graph Query Manager\n * High-level graph queries built on top of GraphTraverser and GraphDatabase.\n */\n\nimport type { Node, NodeContext, NodeMetrics, Subgraph } from '../types';\nimport type { GraphDatabase } from '../db/database';\nimport { GraphTraverser, type TraversalOptions } from './traversal';\n\nexport class GraphQueryManager {\n private readonly traverser: GraphTraverser;\n\n constructor(private readonly db: GraphDatabase) {\n this.traverser = new GraphTraverser(db);\n }\n\n /** Get full context for a node (node + ancestors + children + callers + callees). */\n async getContext(nodeId: string): Promise<NodeContext> {\n const ctx = this.db.getNodeContext(nodeId);\n if (!ctx) {\n const node = this.db.getNode(nodeId);\n if (!node) throw new Error(`Node not found: ${nodeId}`);\n return { node, ancestors: [], children: [], callers: [], callees: [] };\n }\n return ctx;\n }\n\n /** Get all nodes that call the given node (depth=1, incoming 'calls' edges). */\n async getCallers(nodeId: string, limit?: number): Promise<Node[]> {\n return this.traverser.traverseBFS(nodeId, {\n direction: 'incoming',\n edgeKinds: ['calls'],\n maxDepth: 1,\n limit,\n });\n }\n\n /** Get all nodes called by the given node (depth=1, outgoing 'calls' edges). */\n async getCallees(nodeId: string, limit?: number): Promise<Node[]> {\n return this.traverser.traverseBFS(nodeId, {\n direction: 'outgoing',\n edgeKinds: ['calls'],\n maxDepth: 1,\n limit,\n });\n }\n\n /** Get the full call graph rooted at nodeId up to the given depth. */\n async getCallGraph(nodeId: string, depth = 3): Promise<Subgraph> {\n const nodes = await this.traverser.traverseBFS(nodeId, {\n direction: 'outgoing',\n edgeKinds: ['calls'],\n maxDepth: depth,\n includeStart: true,\n });\n const nodeIds = nodes.map(n => n.id);\n const edges = this.db.getEdgesForNodes(nodeIds).filter(\n e => nodeIds.includes(e.source) && nodeIds.includes(e.target) && e.kind === 'calls'\n );\n return { nodes, edges, entryPoints: [nodeId] };\n }\n\n /**\n * Get the type hierarchy for a node.\n * direction: 'up' = base types, 'down' = derived types, 'both' = all.\n */\n async getTypeHierarchy(nodeId: string, direction: 'up' | 'down' | 'both' = 'both'): Promise<Node[]> {\n const traversalDirection =\n direction === 'up' ? 'outgoing' :\n direction === 'down' ? 'incoming' :\n 'both';\n\n return this.traverser.traverseBFS(nodeId, {\n direction: traversalDirection,\n edgeKinds: ['extends', 'implements'],\n });\n }\n\n /** Get all nodes that would be impacted by changing nodeId (incoming edges). */\n async getImpactRadius(nodeId: string, depth = 2): Promise<Node[]> {\n return this.traverser.traverseBFS(nodeId, {\n direction: 'incoming',\n maxDepth: depth,\n });\n }\n\n /** Find the shortest path between two nodes via BFS. */\n async findPath(fromId: string, toId: string, maxDepth = 10): Promise<Node[]> {\n if (fromId === toId) {\n const node = this.db.getNode(fromId);\n return node ? [node] : [];\n }\n\n const prev = new Map<string, string>();\n const queue: Array<[string, number]> = [[fromId, 0]];\n const visited = new Set<string>([fromId]);\n let found = false;\n\n outer: while (queue.length > 0) {\n const [currentId, depth] = queue.shift()!;\n if (depth >= maxDepth) continue;\n\n const edges = this.db.getEdgesForNodes([currentId]);\n for (const edge of edges) {\n const neighborId = edge.source === currentId ? edge.target : edge.source;\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n prev.set(neighborId, currentId);\n if (neighborId === toId) {\n found = true;\n break outer;\n }\n queue.push([neighborId, depth + 1]);\n }\n }\n }\n\n if (!found) return [];\n\n // Reconstruct path\n const pathIds: string[] = [];\n let cur: string | undefined = toId;\n while (cur !== undefined) {\n pathIds.unshift(cur);\n cur = prev.get(cur);\n }\n\n const result: Node[] = [];\n for (const id of pathIds) {\n const node = this.db.getNode(id);\n if (node) result.push(node);\n }\n return result;\n }\n\n /** Get all ancestor containers of a node (incoming 'contains' edges). */\n async getAncestors(nodeId: string): Promise<Node[]> {\n return this.traverser.traverseBFS(nodeId, {\n direction: 'incoming',\n edgeKinds: ['contains'],\n });\n }\n\n /** Get direct children of a node (outgoing 'contains' edges, depth=1). */\n async getChildren(nodeId: string): Promise<Node[]> {\n return this.traverser.traverseBFS(nodeId, {\n direction: 'outgoing',\n edgeKinds: ['contains'],\n maxDepth: 1,\n });\n }\n\n /**\n * Find test files that are transitively affected by changes to the given source files.\n * BFS-traverses import/call dependents to discover which test files depend on changed code.\n */\n getAffectedTests(\n changedFiles: string[],\n opts?: { depth?: number; testPattern?: string },\n ): string[] {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const picomatch = require('picomatch');\n const depth = opts?.depth ?? 5;\n const isTest = picomatch(\n opts?.testPattern ?? '{**/*.spec.*,**/*.test.*,**/e2e/**,**/tests/**,**/__tests__/**}'\n );\n\n const results = new Set<string>();\n\n for (const file of changedFiles) {\n const rel = file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n\n if (isTest(rel)) { results.add(rel); continue; }\n\n const visited = new Set<string>([rel]);\n let frontier = [rel];\n\n for (let d = 0; d < depth; d++) {\n if (frontier.length === 0) break;\n const next: string[] = [];\n for (const f of frontier) {\n for (const dep of this.db.getDependentFiles(f)) {\n if (!visited.has(dep)) {\n visited.add(dep);\n next.push(dep);\n if (isTest(dep)) results.add(dep);\n }\n }\n }\n frontier = next;\n }\n }\n\n return [...results].sort();\n }\n\n /** Find all circular import dependencies. Returns arrays of file paths forming cycles. */\n async findCircularDependencies(): Promise<string[][]> {\n return this.db.findCircularDependencies();\n }\n\n /** Find nodes with no incoming edges (potential dead code). */\n async findDeadCode(limit = 50): Promise<Node[]> {\n return this.db.findDeadCode(limit);\n }\n\n /** Get metrics for a node (edge counts, callers, callees, children). */\n async getNodeMetrics(nodeId: string): Promise<NodeMetrics> {\n return this.db.getNodeMetrics(nodeId);\n }\n\n /**\n * Build a subgraph from a set of node IDs, optionally traversing further\n * with the given TraversalOptions.\n */\n async getFilteredSubgraph(nodeIds: string[], opts?: TraversalOptions): Promise<Subgraph> {\n const allNodeIds = new Set<string>(nodeIds);\n\n if (opts) {\n for (const startId of nodeIds) {\n const traversed = await this.traverser.traverseBFS(startId, opts);\n for (const node of traversed) {\n allNodeIds.add(node.id);\n }\n }\n }\n\n const ids = [...allNodeIds];\n const nodes: Node[] = [];\n for (const id of ids) {\n const node = this.db.getNode(id);\n if (node) nodes.push(node);\n }\n\n const edges = this.db.getEdgesForNodes(ids).filter(\n e => allNodeIds.has(e.source) && allNodeIds.has(e.target)\n );\n\n return { nodes, edges, entryPoints: nodeIds };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * KiroGraph Graph Traversal Module
3
+ * Provides BFS and DFS traversal over the knowledge graph.
4
+ */
5
+ import type { Node, EdgeKind, NodeKind } from '../types';
6
+ import type { GraphDatabase } from '../db/database';
7
+ export interface TraversalOptions {
8
+ maxDepth?: number;
9
+ edgeKinds?: EdgeKind[];
10
+ nodeKinds?: NodeKind[];
11
+ direction?: 'outgoing' | 'incoming' | 'both';
12
+ limit?: number;
13
+ includeStart?: boolean;
14
+ }
15
+ export declare class GraphTraverser {
16
+ private readonly db;
17
+ constructor(db: GraphDatabase);
18
+ /**
19
+ * Breadth-first traversal from startId.
20
+ * Visits all nodes at depth D before any node at depth D+1.
21
+ */
22
+ traverseBFS(startId: string, opts?: TraversalOptions): Promise<Node[]>;
23
+ /**
24
+ * Depth-first traversal from startId.
25
+ */
26
+ traverseDFS(startId: string, opts?: TraversalOptions): Promise<Node[]>;
27
+ /**
28
+ * Get neighbor node IDs from the database, filtered by direction and edge kinds.
29
+ */
30
+ private getNeighbors;
31
+ private getOutgoingEdges;
32
+ private getIncomingEdges;
33
+ private matchesNodeKinds;
34
+ }
35
+ //# sourceMappingURL=traversal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal.d.ts","sourceRoot":"","sources":["../../src/graph/traversal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAE9C;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAoDhF;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IA+ChF;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,gBAAgB;CAIzB"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var traversal_exports = {};
20
+ __export(traversal_exports, {
21
+ GraphTraverser: () => GraphTraverser
22
+ });
23
+ module.exports = __toCommonJS(traversal_exports);
24
+ class GraphTraverser {
25
+ constructor(db) {
26
+ this.db = db;
27
+ }
28
+ /**
29
+ * Breadth-first traversal from startId.
30
+ * Visits all nodes at depth D before any node at depth D+1.
31
+ */
32
+ async traverseBFS(startId, opts = {}) {
33
+ const {
34
+ maxDepth = Infinity,
35
+ edgeKinds,
36
+ nodeKinds,
37
+ direction = "outgoing",
38
+ limit = Infinity,
39
+ includeStart = false
40
+ } = opts;
41
+ const visited = /* @__PURE__ */ new Set();
42
+ const result = [];
43
+ const queue = [[startId, 0]];
44
+ visited.add(startId);
45
+ while (queue.length > 0) {
46
+ const [currentId, depth] = queue.shift();
47
+ if (currentId === startId) {
48
+ if (includeStart) {
49
+ const node = this.db.getNode(currentId);
50
+ if (node && this.matchesNodeKinds(node, nodeKinds)) {
51
+ result.push(node);
52
+ if (result.length >= limit) break;
53
+ }
54
+ }
55
+ } else {
56
+ const node = this.db.getNode(currentId);
57
+ if (node && this.matchesNodeKinds(node, nodeKinds)) {
58
+ result.push(node);
59
+ if (result.length >= limit) break;
60
+ }
61
+ }
62
+ if (depth >= maxDepth) continue;
63
+ const neighbors = this.getNeighbors(currentId, direction, edgeKinds);
64
+ for (const neighborId of neighbors) {
65
+ if (!visited.has(neighborId)) {
66
+ visited.add(neighborId);
67
+ queue.push([neighborId, depth + 1]);
68
+ }
69
+ }
70
+ }
71
+ return result;
72
+ }
73
+ /**
74
+ * Depth-first traversal from startId.
75
+ */
76
+ async traverseDFS(startId, opts = {}) {
77
+ const {
78
+ maxDepth = Infinity,
79
+ edgeKinds,
80
+ nodeKinds,
81
+ direction = "outgoing",
82
+ limit = Infinity,
83
+ includeStart = false
84
+ } = opts;
85
+ const visited = /* @__PURE__ */ new Set();
86
+ const result = [];
87
+ const dfs = (currentId, depth) => {
88
+ if (result.length >= limit) return;
89
+ if (visited.has(currentId)) return;
90
+ visited.add(currentId);
91
+ if (currentId === startId) {
92
+ if (includeStart) {
93
+ const node = this.db.getNode(currentId);
94
+ if (node && this.matchesNodeKinds(node, nodeKinds)) {
95
+ result.push(node);
96
+ }
97
+ }
98
+ } else {
99
+ const node = this.db.getNode(currentId);
100
+ if (node && this.matchesNodeKinds(node, nodeKinds)) {
101
+ result.push(node);
102
+ }
103
+ }
104
+ if (depth >= maxDepth) return;
105
+ const neighbors = this.getNeighbors(currentId, direction, edgeKinds);
106
+ for (const neighborId of neighbors) {
107
+ if (!visited.has(neighborId)) {
108
+ dfs(neighborId, depth + 1);
109
+ if (result.length >= limit) return;
110
+ }
111
+ }
112
+ };
113
+ dfs(startId, 0);
114
+ return result;
115
+ }
116
+ /**
117
+ * Get neighbor node IDs from the database, filtered by direction and edge kinds.
118
+ */
119
+ getNeighbors(nodeId, direction, edgeKinds) {
120
+ const neighbors = [];
121
+ if (direction === "outgoing" || direction === "both") {
122
+ const edges = this.getOutgoingEdges(nodeId, edgeKinds);
123
+ for (const e of edges) neighbors.push(e.target);
124
+ }
125
+ if (direction === "incoming" || direction === "both") {
126
+ const edges = this.getIncomingEdges(nodeId, edgeKinds);
127
+ for (const e of edges) neighbors.push(e.target);
128
+ }
129
+ return neighbors;
130
+ }
131
+ getOutgoingEdges(nodeId, edgeKinds) {
132
+ const allEdges = this.db.getEdgesForNodes([nodeId]);
133
+ return allEdges.filter((e) => e.source === nodeId).filter((e) => !edgeKinds || edgeKinds.includes(e.kind)).map((e) => ({ target: e.target }));
134
+ }
135
+ getIncomingEdges(nodeId, edgeKinds) {
136
+ const allEdges = this.db.getEdgesForNodes([nodeId]);
137
+ return allEdges.filter((e) => e.target === nodeId).filter((e) => !edgeKinds || edgeKinds.includes(e.kind)).map((e) => ({ target: e.source }));
138
+ }
139
+ matchesNodeKinds(node, nodeKinds) {
140
+ if (!nodeKinds || nodeKinds.length === 0) return true;
141
+ return nodeKinds.includes(node.kind);
142
+ }
143
+ }
144
+ // Annotate the CommonJS export names for ESM import in node:
145
+ 0 && (module.exports = {
146
+ GraphTraverser
147
+ });
148
+ //# sourceMappingURL=traversal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/graph/traversal.ts"],
4
+ "sourcesContent": ["/**\n * KiroGraph Graph Traversal Module\n * Provides BFS and DFS traversal over the knowledge graph.\n */\n\nimport type { Node, EdgeKind, NodeKind } from '../types';\nimport type { GraphDatabase } from '../db/database';\n\nexport interface TraversalOptions {\n maxDepth?: number;\n edgeKinds?: EdgeKind[];\n nodeKinds?: NodeKind[];\n direction?: 'outgoing' | 'incoming' | 'both';\n limit?: number;\n includeStart?: boolean;\n}\n\nexport class GraphTraverser {\n constructor(private readonly db: GraphDatabase) {}\n\n /**\n * Breadth-first traversal from startId.\n * Visits all nodes at depth D before any node at depth D+1.\n */\n async traverseBFS(startId: string, opts: TraversalOptions = {}): Promise<Node[]> {\n const {\n maxDepth = Infinity,\n edgeKinds,\n nodeKinds,\n direction = 'outgoing',\n limit = Infinity,\n includeStart = false,\n } = opts;\n\n const visited = new Set<string>();\n const result: Node[] = [];\n\n // Queue entries: [nodeId, depth]\n const queue: Array<[string, number]> = [[startId, 0]];\n visited.add(startId);\n\n while (queue.length > 0) {\n const [currentId, depth] = queue.shift()!;\n\n // Include the start node only if requested\n if (currentId === startId) {\n if (includeStart) {\n const node = this.db.getNode(currentId);\n if (node && this.matchesNodeKinds(node, nodeKinds)) {\n result.push(node);\n if (result.length >= limit) break;\n }\n }\n } else {\n const node = this.db.getNode(currentId);\n if (node && this.matchesNodeKinds(node, nodeKinds)) {\n result.push(node);\n if (result.length >= limit) break;\n }\n }\n\n if (depth >= maxDepth) continue;\n\n // Get neighbors\n const neighbors = this.getNeighbors(currentId, direction, edgeKinds);\n for (const neighborId of neighbors) {\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n queue.push([neighborId, depth + 1]);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Depth-first traversal from startId.\n */\n async traverseDFS(startId: string, opts: TraversalOptions = {}): Promise<Node[]> {\n const {\n maxDepth = Infinity,\n edgeKinds,\n nodeKinds,\n direction = 'outgoing',\n limit = Infinity,\n includeStart = false,\n } = opts;\n\n const visited = new Set<string>();\n const result: Node[] = [];\n\n const dfs = (currentId: string, depth: number): void => {\n if (result.length >= limit) return;\n if (visited.has(currentId)) return;\n visited.add(currentId);\n\n if (currentId === startId) {\n if (includeStart) {\n const node = this.db.getNode(currentId);\n if (node && this.matchesNodeKinds(node, nodeKinds)) {\n result.push(node);\n }\n }\n } else {\n const node = this.db.getNode(currentId);\n if (node && this.matchesNodeKinds(node, nodeKinds)) {\n result.push(node);\n }\n }\n\n if (depth >= maxDepth) return;\n\n const neighbors = this.getNeighbors(currentId, direction, edgeKinds);\n for (const neighborId of neighbors) {\n if (!visited.has(neighborId)) {\n dfs(neighborId, depth + 1);\n if (result.length >= limit) return;\n }\n }\n };\n\n dfs(startId, 0);\n return result;\n }\n\n /**\n * Get neighbor node IDs from the database, filtered by direction and edge kinds.\n */\n private getNeighbors(\n nodeId: string,\n direction: 'outgoing' | 'incoming' | 'both',\n edgeKinds?: EdgeKind[]\n ): string[] {\n const neighbors: string[] = [];\n\n if (direction === 'outgoing' || direction === 'both') {\n const edges = this.getOutgoingEdges(nodeId, edgeKinds);\n for (const e of edges) neighbors.push(e.target);\n }\n\n if (direction === 'incoming' || direction === 'both') {\n const edges = this.getIncomingEdges(nodeId, edgeKinds);\n for (const e of edges) neighbors.push(e.target);\n }\n\n return neighbors;\n }\n\n private getOutgoingEdges(nodeId: string, edgeKinds?: EdgeKind[]): Array<{ target: string }> {\n // Use getEdgesForNodes and filter manually since db doesn't expose raw edge queries\n const allEdges = this.db.getEdgesForNodes([nodeId]);\n return allEdges\n .filter(e => e.source === nodeId)\n .filter(e => !edgeKinds || edgeKinds.includes(e.kind))\n .map(e => ({ target: e.target }));\n }\n\n private getIncomingEdges(nodeId: string, edgeKinds?: EdgeKind[]): Array<{ target: string }> {\n const allEdges = this.db.getEdgesForNodes([nodeId]);\n return allEdges\n .filter(e => e.target === nodeId)\n .filter(e => !edgeKinds || edgeKinds.includes(e.kind))\n .map(e => ({ target: e.source }));\n }\n\n private matchesNodeKinds(node: Node, nodeKinds?: NodeKind[]): boolean {\n if (!nodeKinds || nodeKinds.length === 0) return true;\n return nodeKinds.includes(node.kind);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * KiroGraph — Semantic code knowledge graph for Kiro
3
+ *
4
+ * Pure facade. Every method delegates to a focused sub-system.
5
+ * No business logic lives here.
6
+ */
7
+ import type { KiroGraphConfig } from './config';
8
+ import type { FileTreeNode, FileTree } from './core/file-tree';
9
+ import type { Node, NodeKind, IndexResult, IndexProgress, SyncResult, TaskContext, SearchResult, SearchOptions, NodeContext, NodeMetrics } from './types';
10
+ import type { ArchitectureResult } from './architecture/types';
11
+ export type { FileTreeNode, FileTree };
12
+ export default class KiroGraph {
13
+ private readonly db;
14
+ private readonly config;
15
+ private readonly projectRoot;
16
+ private readonly queryManager;
17
+ private readonly resolver;
18
+ private readonly vectors;
19
+ private readonly contextBuilder;
20
+ private readonly arch;
21
+ private readonly lock;
22
+ private readonly pipeline;
23
+ private readonly searcher;
24
+ private constructor();
25
+ static init(projectRoot: string, config?: Partial<KiroGraphConfig>): Promise<KiroGraph>;
26
+ static open(projectRoot: string): Promise<KiroGraph>;
27
+ static isInitialized(projectRoot: string): boolean;
28
+ unlockForce(): void;
29
+ markDirty(): void;
30
+ clearDirty(): void;
31
+ isDirty(): boolean;
32
+ syncIfDirty(): Promise<SyncResult | null>;
33
+ indexAll(opts?: {
34
+ onProgress?: (p: IndexProgress) => void;
35
+ force?: boolean;
36
+ signal?: AbortSignal;
37
+ }): Promise<IndexResult>;
38
+ sync(changedFiles?: string[]): Promise<SyncResult>;
39
+ searchNodes(query: string, kindOrOpts?: NodeKind | SearchOptions, limit?: number): SearchResult[];
40
+ getCallers(nodeId: string, limit?: number): Promise<Node[]>;
41
+ getCallees(nodeId: string, limit?: number): Promise<Node[]>;
42
+ getImpactRadius(nodeId: string, depth?: number): Promise<Node[]>;
43
+ findDeadCode(limit?: number): Node[];
44
+ findCircularDependencies(): string[][];
45
+ findPath(fromId: string, toId: string, maxDepth?: number): Promise<Node[]>;
46
+ getTypeHierarchy(nodeId: string, direction?: 'up' | 'down' | 'both'): Node[];
47
+ getNode(id: string): Node | null;
48
+ getNodeContext(nodeId: string): NodeContext | null;
49
+ getNodeMetrics(nodeId: string): NodeMetrics;
50
+ getNodeSource(node: Node): string | null;
51
+ buildContext(task: string, opts?: {
52
+ maxNodes?: number;
53
+ includeCode?: boolean;
54
+ }): Promise<TaskContext>;
55
+ getFiles(opts?: {
56
+ filterPath?: string;
57
+ pattern?: string;
58
+ maxDepth?: number;
59
+ }): FileTree;
60
+ getAffectedTests(changedFiles: string[], opts?: {
61
+ depth?: number;
62
+ testPattern?: string;
63
+ }): string[];
64
+ getStats(): Promise<{
65
+ architectureStats?: {
66
+ packages: number;
67
+ layers: number;
68
+ packageDeps: number;
69
+ };
70
+ embeddingCount: number;
71
+ embeddableNodeCount: number;
72
+ embeddingsEnabled: boolean;
73
+ embeddingModel: string;
74
+ useVecIndex: boolean;
75
+ semanticEngine: "cosine" | "sqlite-vec" | "orama" | "pglite" | "lancedb" | "qdrant" | "typesense";
76
+ vecIndexCount: number;
77
+ engineFallback: string | null;
78
+ frameworks: string[];
79
+ architectureEnabled: boolean;
80
+ files: number;
81
+ nodes: number;
82
+ edges: number;
83
+ nodesByKind: Record<string, number>;
84
+ filesByLanguage: Record<string, number>;
85
+ dbSizeBytes: number;
86
+ }>;
87
+ getEngineFallback(): string | null;
88
+ getArchitecture(): ArchitectureResult & {
89
+ filePackages: Record<string, string[]>;
90
+ fileLayers: Record<string, Array<{
91
+ layerId: string;
92
+ confidence: number;
93
+ matchedPattern: string;
94
+ }>>;
95
+ };
96
+ isArchitectureEnabled(): boolean;
97
+ getProjectRoot(): string;
98
+ close(): void;
99
+ }
100
+ /** Walk up directories to find the nearest .kirograph/ folder. */
101
+ export declare function findNearestKiroGraphRoot(startPath: string): string | null;
102
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}