scip-query 0.2.0 → 0.3.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 (330) hide show
  1. package/README.md +16 -43
  2. package/dist/chunk-26DOJ63W.js +161 -0
  3. package/dist/chunk-2UELLEBI.js +1 -0
  4. package/dist/{chunk-4PDAL6IL.js → chunk-4JCSOF2O.js} +3 -3
  5. package/dist/{chunk-6SXADWLW.js → chunk-5OMVSV6E.js} +13 -5
  6. package/dist/{chunk-KPPHZCZJ.js → chunk-7HK5ZLOE.js} +28 -46
  7. package/dist/{chunk-7RLE5EWE.js → chunk-7KIMF5PV.js} +34 -13
  8. package/dist/chunk-AXQKUYKF.js +1442 -0
  9. package/dist/chunk-C7H5WBTJ.js +46 -0
  10. package/dist/{chunk-NHBZIL2J.js → chunk-CHDJXYBG.js} +3 -28
  11. package/dist/{chunk-KCBMVQL5.js → chunk-CPVAQJEC.js} +13 -5
  12. package/dist/{chunk-ZQIIPFD7.js → chunk-DH7G3DDV.js} +2 -2
  13. package/dist/{chunk-BOVXCR46.js → chunk-EOROMIFO.js} +14 -6
  14. package/dist/{chunk-2CKGIR6G.js → chunk-EPWLXXBL.js} +3 -3
  15. package/dist/{chunk-5RMYT5WH.js → chunk-F7XU27LU.js} +2 -2
  16. package/dist/{chunk-63G7IQTD.js → chunk-FYYOWQXK.js} +20 -40
  17. package/dist/chunk-GEXE2T6I.js +87 -0
  18. package/dist/{chunk-DGUPQSOR.js → chunk-GJDHTTR2.js} +11 -4
  19. package/dist/chunk-GSH2FPKV.js +87 -0
  20. package/dist/{chunk-NUZ4OMU3.js → chunk-GU2H5QRN.js} +2 -2
  21. package/dist/{chunk-Z6YZJ36C.js → chunk-HJZUSUPU.js} +8 -4
  22. package/dist/{chunk-LAWMH22O.js → chunk-HLKAFWWJ.js} +82 -3
  23. package/dist/{chunk-HPFZLISB.js → chunk-HLUS2HEB.js} +2 -2
  24. package/dist/{chunk-H2MDONBU.js → chunk-J3JSOSUO.js} +9 -6
  25. package/dist/{chunk-7PBOG4YE.js → chunk-KBOQX573.js} +2 -2
  26. package/dist/{chunk-HDSRORNV.js → chunk-KKCHYLVI.js} +17 -11
  27. package/dist/{chunk-HMLMH7VZ.js → chunk-LFJQVJYJ.js} +2 -2
  28. package/dist/{chunk-4EXL2CUA.js → chunk-LQJUPXQY.js} +16 -8
  29. package/dist/{chunk-ITZ3DDOG.js → chunk-MPGIHELS.js} +18 -3
  30. package/dist/chunk-NFS5W3PP.js +37 -0
  31. package/dist/chunk-NG5F43OU.js +200 -0
  32. package/dist/{chunk-DCKMSTJ4.js → chunk-O7Q7FDUJ.js} +22 -14
  33. package/dist/{chunk-UJQN5N3I.js → chunk-OIDHN6GD.js} +6 -3
  34. package/dist/{chunk-Z4GHE2HD.js → chunk-P3E6L7KW.js} +6 -2
  35. package/dist/{chunk-BNN2RKD2.js → chunk-P4WO3BBW.js} +3 -3
  36. package/dist/{chunk-QOV2R2WT.js → chunk-QIXNAB5K.js} +42 -2
  37. package/dist/{chunk-NWCE4CIC.js → chunk-SMDCNPMK.js} +11 -28
  38. package/dist/{chunk-SEFSL2GF.js → chunk-TOIEB3LG.js} +2 -2
  39. package/dist/{chunk-4XHWPRAX.js → chunk-UGQKAVCD.js} +3 -3
  40. package/dist/{chunk-OVPLOMPY.js → chunk-UQEQ6AHX.js} +7 -4
  41. package/dist/{chunk-ZK6GXM3J.js → chunk-VIYSWZCO.js} +3 -3
  42. package/dist/chunk-VJJKSGIX.js +121 -0
  43. package/dist/{chunk-N5KEREIA.js → chunk-VT4JBH6L.js} +19 -7
  44. package/dist/{chunk-7LLPRPR5.js → chunk-WGAD3GNR.js} +2 -2
  45. package/dist/chunk-YDBXNPYU.js +69 -0
  46. package/dist/chunk-YY4QGUQ5.js +84 -0
  47. package/dist/{chunk-FGXRVW7G.js → chunk-YZ6L7GFO.js} +2 -2
  48. package/dist/{chunk-W4ALF422.js → chunk-ZEUCXQBN.js} +3 -3
  49. package/dist/cli.js +2697 -1054
  50. package/dist/{db-BNVVZSfP.d.ts → db-ShvwGDKf.d.ts} +12 -19
  51. package/dist/index.d.ts +15 -15
  52. package/dist/index.js +263 -234
  53. package/dist/postinstall.js +5 -76
  54. package/dist/queries/affected.d.ts +1 -1
  55. package/dist/queries/affected.js +3 -3
  56. package/dist/queries/bottlenecks.d.ts +1 -1
  57. package/dist/queries/bottlenecks.js +2 -2
  58. package/dist/queries/by-kind.d.ts +1 -1
  59. package/dist/queries/by-kind.js +2 -2
  60. package/dist/queries/call-graph.d.ts +1 -1
  61. package/dist/queries/call-graph.js +3 -3
  62. package/dist/queries/change-surface.d.ts +2 -2
  63. package/dist/queries/change-surface.js +3 -3
  64. package/dist/queries/code.d.ts +1 -1
  65. package/dist/queries/code.js +3 -3
  66. package/dist/queries/complexity-hotspots.d.ts +1 -1
  67. package/dist/queries/complexity-hotspots.js +3 -3
  68. package/dist/queries/complexity.d.ts +1 -1
  69. package/dist/queries/complexity.js +3 -3
  70. package/dist/queries/convergence.d.ts +1 -1
  71. package/dist/queries/convergence.js +3 -3
  72. package/dist/queries/coupling.d.ts +1 -1
  73. package/dist/queries/coupling.js +3 -1
  74. package/dist/queries/cycles.d.ts +1 -1
  75. package/dist/queries/cycles.js +3 -2
  76. package/dist/queries/dataflow.d.ts +1 -1
  77. package/dist/queries/dataflow.js +3 -3
  78. package/dist/queries/dead.d.ts +1 -1
  79. package/dist/queries/dead.js +4 -3
  80. package/dist/queries/deep-chains.d.ts +1 -1
  81. package/dist/queries/deep-chains.js +3 -2
  82. package/dist/queries/deps.d.ts +1 -1
  83. package/dist/queries/deps.js +3 -1
  84. package/dist/queries/diff-impact.d.ts +2 -2
  85. package/dist/queries/diff-impact.js +2 -3
  86. package/dist/queries/doc-coverage.d.ts +1 -1
  87. package/dist/queries/doc-coverage.js +2 -2
  88. package/dist/queries/drift.d.ts +1 -1
  89. package/dist/queries/drift.js +3 -2
  90. package/dist/queries/extract-candidates.d.ts +1 -1
  91. package/dist/queries/extract-candidates.js +3 -3
  92. package/dist/queries/fan.d.ts +1 -1
  93. package/dist/queries/fan.js +3 -2
  94. package/dist/queries/files.d.ts +1 -1
  95. package/dist/queries/health.d.ts +1 -1
  96. package/dist/queries/health.js +14 -14
  97. package/dist/queries/hierarchy.d.ts +1 -1
  98. package/dist/queries/hierarchy.js +3 -2
  99. package/dist/queries/hotspots.d.ts +1 -1
  100. package/dist/queries/hotspots.js +2 -2
  101. package/dist/queries/imports.d.ts +1 -1
  102. package/dist/queries/imports.js +3 -2
  103. package/dist/queries/index.d.ts +1 -2
  104. package/dist/queries/index.js +46 -51
  105. package/dist/queries/isolated.d.ts +1 -1
  106. package/dist/queries/isolated.js +4 -3
  107. package/dist/queries/members.d.ts +2 -2
  108. package/dist/queries/members.js +3 -2
  109. package/dist/queries/methods.d.ts +1 -1
  110. package/dist/queries/methods.js +2 -2
  111. package/dist/queries/outline.d.ts +1 -1
  112. package/dist/queries/outline.js +3 -2
  113. package/dist/queries/passthrough-candidates.d.ts +1 -1
  114. package/dist/queries/passthrough-candidates.js +3 -3
  115. package/dist/queries/redundant-reexports.d.ts +1 -1
  116. package/dist/queries/redundant-reexports.js +4 -2
  117. package/dist/queries/refs.d.ts +1 -1
  118. package/dist/queries/refs.js +3 -1
  119. package/dist/queries/similar-chains.d.ts +1 -1
  120. package/dist/queries/similar-chains.js +3 -2
  121. package/dist/queries/similar-files.d.ts +1 -1
  122. package/dist/queries/similar-files.js +3 -2
  123. package/dist/queries/similar-signatures.d.ts +1 -1
  124. package/dist/queries/similar-signatures.js +2 -2
  125. package/dist/queries/similar.d.ts +1 -1
  126. package/dist/queries/similar.js +3 -3
  127. package/dist/queries/slice.d.ts +2 -2
  128. package/dist/queries/slice.js +3 -3
  129. package/dist/queries/stale-abstractions.d.ts +1 -1
  130. package/dist/queries/stale-abstractions.js +3 -3
  131. package/dist/queries/stats.d.ts +1 -1
  132. package/dist/queries/surface.d.ts +1 -1
  133. package/dist/queries/surface.js +3 -2
  134. package/dist/queries/symbols.d.ts +1 -1
  135. package/dist/queries/symbols.js +3 -2
  136. package/dist/queries/system.d.ts +1 -1
  137. package/dist/queries/system.js +3 -2
  138. package/dist/queries/trace.d.ts +1 -1
  139. package/dist/queries/trace.js +3 -1
  140. package/dist/queries/wrapper-candidates.d.ts +1 -1
  141. package/dist/queries/wrapper-candidates.js +3 -3
  142. package/dist/reindex-worker.js +24 -12
  143. package/package.json +6 -1
  144. package/IMPROVEMENTS.md +0 -143
  145. package/PLAN.md +0 -320
  146. package/dist/chunk-2CKGIR6G.js.map +0 -1
  147. package/dist/chunk-3UOUTZQT.js +0 -45
  148. package/dist/chunk-3UOUTZQT.js.map +0 -1
  149. package/dist/chunk-4EXL2CUA.js.map +0 -1
  150. package/dist/chunk-4PDAL6IL.js.map +0 -1
  151. package/dist/chunk-4TYLS5XX.js.map +0 -1
  152. package/dist/chunk-4XHWPRAX.js.map +0 -1
  153. package/dist/chunk-5RMYT5WH.js.map +0 -1
  154. package/dist/chunk-63G7IQTD.js.map +0 -1
  155. package/dist/chunk-6SXADWLW.js.map +0 -1
  156. package/dist/chunk-74RFWB5T.js.map +0 -1
  157. package/dist/chunk-7LLPRPR5.js.map +0 -1
  158. package/dist/chunk-7PBOG4YE.js.map +0 -1
  159. package/dist/chunk-7RLE5EWE.js.map +0 -1
  160. package/dist/chunk-7UCKSQRS.js +0 -55
  161. package/dist/chunk-7UCKSQRS.js.map +0 -1
  162. package/dist/chunk-BNN2RKD2.js.map +0 -1
  163. package/dist/chunk-BOVXCR46.js.map +0 -1
  164. package/dist/chunk-D567NFIF.js +0 -65
  165. package/dist/chunk-D567NFIF.js.map +0 -1
  166. package/dist/chunk-DCKMSTJ4.js.map +0 -1
  167. package/dist/chunk-DEZKCZXD.js +0 -40
  168. package/dist/chunk-DEZKCZXD.js.map +0 -1
  169. package/dist/chunk-DGUPQSOR.js.map +0 -1
  170. package/dist/chunk-DVWGWHFW.js +0 -99
  171. package/dist/chunk-DVWGWHFW.js.map +0 -1
  172. package/dist/chunk-EQYLEQCW.js +0 -46
  173. package/dist/chunk-EQYLEQCW.js.map +0 -1
  174. package/dist/chunk-FGXRVW7G.js.map +0 -1
  175. package/dist/chunk-H2MDONBU.js.map +0 -1
  176. package/dist/chunk-HB7MRLLL.js +0 -76
  177. package/dist/chunk-HB7MRLLL.js.map +0 -1
  178. package/dist/chunk-HDSRORNV.js.map +0 -1
  179. package/dist/chunk-HMLMH7VZ.js.map +0 -1
  180. package/dist/chunk-HPFZLISB.js.map +0 -1
  181. package/dist/chunk-HZBC7PPD.js +0 -88
  182. package/dist/chunk-HZBC7PPD.js.map +0 -1
  183. package/dist/chunk-ITZ3DDOG.js.map +0 -1
  184. package/dist/chunk-JJP7KQND.js +0 -1
  185. package/dist/chunk-JJP7KQND.js.map +0 -1
  186. package/dist/chunk-KCBMVQL5.js.map +0 -1
  187. package/dist/chunk-KPPHZCZJ.js.map +0 -1
  188. package/dist/chunk-LAWMH22O.js.map +0 -1
  189. package/dist/chunk-MCUX5LA7.js +0 -103
  190. package/dist/chunk-MCUX5LA7.js.map +0 -1
  191. package/dist/chunk-MGNMHKX3.js.map +0 -1
  192. package/dist/chunk-N5KEREIA.js.map +0 -1
  193. package/dist/chunk-NHBZIL2J.js.map +0 -1
  194. package/dist/chunk-NUZ4OMU3.js.map +0 -1
  195. package/dist/chunk-NWCE4CIC.js.map +0 -1
  196. package/dist/chunk-OVPLOMPY.js.map +0 -1
  197. package/dist/chunk-QOV2R2WT.js.map +0 -1
  198. package/dist/chunk-SEFSL2GF.js.map +0 -1
  199. package/dist/chunk-UJQN5N3I.js.map +0 -1
  200. package/dist/chunk-W4ALF422.js.map +0 -1
  201. package/dist/chunk-Z4GHE2HD.js.map +0 -1
  202. package/dist/chunk-Z6YZJ36C.js.map +0 -1
  203. package/dist/chunk-ZK6GXM3J.js.map +0 -1
  204. package/dist/chunk-ZOGY2V3N.js +0 -158
  205. package/dist/chunk-ZOGY2V3N.js.map +0 -1
  206. package/dist/chunk-ZQIIPFD7.js.map +0 -1
  207. package/dist/cli.js.map +0 -1
  208. package/dist/index.js.map +0 -1
  209. package/dist/postinstall.js.map +0 -1
  210. package/dist/queries/affected.js.map +0 -1
  211. package/dist/queries/bottlenecks.js.map +0 -1
  212. package/dist/queries/by-kind.js.map +0 -1
  213. package/dist/queries/call-graph.js.map +0 -1
  214. package/dist/queries/change-surface.js.map +0 -1
  215. package/dist/queries/clean-signature.js.map +0 -1
  216. package/dist/queries/code.js.map +0 -1
  217. package/dist/queries/complexity-hotspots.js.map +0 -1
  218. package/dist/queries/complexity.js.map +0 -1
  219. package/dist/queries/convergence.js.map +0 -1
  220. package/dist/queries/coupling.js.map +0 -1
  221. package/dist/queries/cycles.js.map +0 -1
  222. package/dist/queries/dataflow.js.map +0 -1
  223. package/dist/queries/dead.js.map +0 -1
  224. package/dist/queries/deep-chains.js.map +0 -1
  225. package/dist/queries/deps.js.map +0 -1
  226. package/dist/queries/diff-impact.js.map +0 -1
  227. package/dist/queries/doc-coverage.js.map +0 -1
  228. package/dist/queries/drift.js.map +0 -1
  229. package/dist/queries/extract-candidates.js.map +0 -1
  230. package/dist/queries/fan.js.map +0 -1
  231. package/dist/queries/files.js.map +0 -1
  232. package/dist/queries/health.js.map +0 -1
  233. package/dist/queries/hierarchy.js.map +0 -1
  234. package/dist/queries/hotspots.js.map +0 -1
  235. package/dist/queries/imports.js.map +0 -1
  236. package/dist/queries/index.js.map +0 -1
  237. package/dist/queries/isolated.js.map +0 -1
  238. package/dist/queries/members.js.map +0 -1
  239. package/dist/queries/methods.js.map +0 -1
  240. package/dist/queries/outline.js.map +0 -1
  241. package/dist/queries/passthrough-candidates.js.map +0 -1
  242. package/dist/queries/redundant-reexports.js.map +0 -1
  243. package/dist/queries/refs.js.map +0 -1
  244. package/dist/queries/similar-chains.js.map +0 -1
  245. package/dist/queries/similar-files.js.map +0 -1
  246. package/dist/queries/similar-signatures.js.map +0 -1
  247. package/dist/queries/similar.js.map +0 -1
  248. package/dist/queries/slice.js.map +0 -1
  249. package/dist/queries/stale-abstractions.js.map +0 -1
  250. package/dist/queries/stats.js.map +0 -1
  251. package/dist/queries/surface.js.map +0 -1
  252. package/dist/queries/symbols.js.map +0 -1
  253. package/dist/queries/system.js.map +0 -1
  254. package/dist/queries/test-coverage.d.ts +0 -22
  255. package/dist/queries/test-coverage.js +0 -11
  256. package/dist/queries/test-coverage.js.map +0 -1
  257. package/dist/queries/trace.js.map +0 -1
  258. package/dist/queries/wrapper-candidates.js.map +0 -1
  259. package/dist/reindex-worker.js.map +0 -1
  260. package/docs/AGENT_GUIDE.md +0 -359
  261. package/reports/debloat/2026-04-10-scip-query-self-audit.md +0 -161
  262. package/src/cli.ts +0 -1480
  263. package/src/config.ts +0 -117
  264. package/src/db.ts +0 -127
  265. package/src/gitignore-filter.ts +0 -143
  266. package/src/index.ts +0 -11
  267. package/src/postinstall.ts +0 -8
  268. package/src/queries/affected.ts +0 -86
  269. package/src/queries/bottlenecks.ts +0 -67
  270. package/src/queries/by-kind.ts +0 -204
  271. package/src/queries/call-graph.ts +0 -66
  272. package/src/queries/change-surface.ts +0 -110
  273. package/src/queries/clean-signature.ts +0 -22
  274. package/src/queries/code.ts +0 -101
  275. package/src/queries/complexity-hotspots.ts +0 -119
  276. package/src/queries/complexity.ts +0 -152
  277. package/src/queries/convergence.ts +0 -82
  278. package/src/queries/coupling.ts +0 -99
  279. package/src/queries/cycles.ts +0 -78
  280. package/src/queries/dataflow.ts +0 -128
  281. package/src/queries/dead.ts +0 -122
  282. package/src/queries/deep-chains.ts +0 -59
  283. package/src/queries/deps.ts +0 -46
  284. package/src/queries/diff-impact.ts +0 -204
  285. package/src/queries/doc-coverage.ts +0 -86
  286. package/src/queries/drift.ts +0 -224
  287. package/src/queries/extract-candidates.ts +0 -167
  288. package/src/queries/fan.ts +0 -148
  289. package/src/queries/files.ts +0 -16
  290. package/src/queries/health.ts +0 -324
  291. package/src/queries/hierarchy.ts +0 -49
  292. package/src/queries/hotspots.ts +0 -53
  293. package/src/queries/imports.ts +0 -95
  294. package/src/queries/index.ts +0 -45
  295. package/src/queries/isolated.ts +0 -67
  296. package/src/queries/members.ts +0 -54
  297. package/src/queries/methods.ts +0 -27
  298. package/src/queries/outline.ts +0 -52
  299. package/src/queries/passthrough-candidates.ts +0 -94
  300. package/src/queries/redundant-reexports.ts +0 -170
  301. package/src/queries/refs.ts +0 -27
  302. package/src/queries/similar-chains.ts +0 -314
  303. package/src/queries/similar-files.ts +0 -140
  304. package/src/queries/similar-signatures.ts +0 -151
  305. package/src/queries/similar.ts +0 -305
  306. package/src/queries/slice.ts +0 -154
  307. package/src/queries/stale-abstractions.ts +0 -82
  308. package/src/queries/stats.ts +0 -22
  309. package/src/queries/surface.ts +0 -34
  310. package/src/queries/symbols.ts +0 -39
  311. package/src/queries/system.ts +0 -86
  312. package/src/queries/test-coverage.ts +0 -106
  313. package/src/queries/trace.ts +0 -55
  314. package/src/queries/wrapper-candidates.ts +0 -112
  315. package/src/query-support.ts +0 -226
  316. package/src/reindex/detect.ts +0 -58
  317. package/src/reindex/index.ts +0 -153
  318. package/src/reindex/indexers.ts +0 -220
  319. package/src/reindex/install.ts +0 -125
  320. package/src/reindex-worker.ts +0 -35
  321. package/src/setup.ts +0 -202
  322. package/src/symbol-parser.ts +0 -278
  323. package/src/types.ts +0 -654
  324. package/src/watch.ts +0 -274
  325. package/tests/gitignore-filter.test.ts +0 -48
  326. package/tests/queries.test.ts +0 -300
  327. package/tests/symbol-parser.test.ts +0 -157
  328. package/tsconfig.json +0 -20
  329. package/tsup.config.ts +0 -40
  330. package/vitest.config.ts +0 -7
@@ -0,0 +1,46 @@
1
+ import {
2
+ findFirstSymbolMatch,
3
+ getCalleeRowsForSymbol,
4
+ getCallerRowsForSymbol
5
+ } from "./chunk-AXQKUYKF.js";
6
+ import {
7
+ shortenSymbol
8
+ } from "./chunk-QIXNAB5K.js";
9
+
10
+ // src/queries/call-graph.ts
11
+ function callGraph(db, symbolPattern) {
12
+ const target = findFirstSymbolMatch(db, symbolPattern);
13
+ if (!target) return null;
14
+ const callerRows = getCallerRowsForSymbol(db, target, { limit: 50 });
15
+ const calleeRows = uniqueRows(getCalleeRowsForSymbol(db, target, { limit: 50 }));
16
+ return {
17
+ symbol: target.symbol,
18
+ shortName: shortenSymbol(target.symbol),
19
+ callers: callerRows.map((r) => ({
20
+ symbol: r.symbol,
21
+ shortName: shortenSymbol(r.symbol),
22
+ file: r.file
23
+ })),
24
+ callees: calleeRows.map((r) => ({
25
+ symbol: r.symbol,
26
+ shortName: shortenSymbol(r.symbol),
27
+ file: r.file
28
+ }))
29
+ };
30
+ }
31
+ function uniqueRows(rows) {
32
+ const seen = /* @__PURE__ */ new Set();
33
+ const unique = [];
34
+ for (const row of rows) {
35
+ const key = `${row.symbol}|${row.file}`;
36
+ if (seen.has(key)) continue;
37
+ seen.add(key);
38
+ unique.push(row);
39
+ }
40
+ return unique;
41
+ }
42
+
43
+ export {
44
+ callGraph
45
+ };
46
+ //# sourceMappingURL=chunk-C7H5WBTJ.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  findFirstSymbolMatch,
3
3
  getCalleeRowsForSymbol
4
- } from "./chunk-ZOGY2V3N.js";
4
+ } from "./chunk-AXQKUYKF.js";
5
5
  import {
6
6
  shortenSymbol
7
- } from "./chunk-QOV2R2WT.js";
7
+ } from "./chunk-QIXNAB5K.js";
8
8
 
9
9
  // src/queries/slice.ts
10
10
  function slice(db, symbolPattern, opts = {}) {
@@ -19,21 +19,6 @@ function slice(db, symbolPattern, opts = {}) {
19
19
  }
20
20
  function backwardSlice(db, match) {
21
21
  const callees = getCalleeRowsForSymbol(db, match);
22
- const localPredecessors = db.all(
23
- `SELECT DISTINCT gs.symbol, d.relative_path AS file
24
- FROM defn_enclosing_ranges der
25
- JOIN global_symbols gs ON der.symbol_id = gs.id
26
- JOIN documents d ON der.document_id = d.id
27
- WHERE der.document_id = ?
28
- AND der.end_line < ?
29
- AND gs.id != ?
30
- ${db.symbolNoiseFor("gs")}
31
- ORDER BY der.start_line DESC
32
- LIMIT 15`,
33
- match.documentId,
34
- match.startLine,
35
- match.symbolId
36
- );
37
22
  const seen = /* @__PURE__ */ new Set();
38
23
  const connected = [];
39
24
  for (const c of callees) {
@@ -46,16 +31,6 @@ function backwardSlice(db, match) {
46
31
  relationship: "referenced within definition (callee)"
47
32
  });
48
33
  }
49
- for (const p of localPredecessors) {
50
- if (seen.has(p.symbol) || db.isIgnored(p.file)) continue;
51
- seen.add(p.symbol);
52
- connected.push({
53
- symbol: p.symbol,
54
- shortName: shortenSymbol(p.symbol),
55
- file: p.file,
56
- relationship: "defined before target in same file (local predecessor)"
57
- });
58
- }
59
34
  return {
60
35
  symbol: match.symbol,
61
36
  shortName: shortenSymbol(match.symbol),
@@ -122,4 +97,4 @@ function forwardSlice(db, match) {
122
97
  export {
123
98
  slice
124
99
  };
125
- //# sourceMappingURL=chunk-NHBZIL2J.js.map
100
+ //# sourceMappingURL=chunk-CHDJXYBG.js.map
@@ -1,12 +1,20 @@
1
1
  import {
2
2
  cleanSignature
3
3
  } from "./chunk-4TYLS5XX.js";
4
+ import {
5
+ resolveIndexedPaths
6
+ } from "./chunk-AXQKUYKF.js";
4
7
  import {
5
8
  shortenSymbol
6
- } from "./chunk-QOV2R2WT.js";
9
+ } from "./chunk-QIXNAB5K.js";
7
10
 
8
11
  // src/queries/symbols.ts
9
12
  function symbols(db, filePattern) {
13
+ const resolvedPaths = resolveIndexedPaths(db, filePattern);
14
+ if (resolvedPaths.length === 0) {
15
+ return [];
16
+ }
17
+ const placeholders = resolvedPaths.map(() => "?").join(", ");
10
18
  const rows = db.all(
11
19
  `SELECT
12
20
  der.start_line,
@@ -17,11 +25,11 @@ function symbols(db, filePattern) {
17
25
  FROM defn_enclosing_ranges der
18
26
  JOIN global_symbols gs ON der.symbol_id = gs.id
19
27
  JOIN documents d ON der.document_id = d.id
20
- WHERE d.relative_path LIKE ?
28
+ WHERE d.relative_path IN (${placeholders})
21
29
  AND ${db.localSymbolPredicate}
22
30
  ${db.symbolNoise}
23
- ORDER BY der.start_line`,
24
- `%${filePattern}%`
31
+ ORDER BY d.relative_path, der.start_line`,
32
+ ...resolvedPaths
25
33
  );
26
34
  return rows.filter((r) => !db.isIgnored(r.relative_path)).map((r) => ({
27
35
  startLine: r.start_line,
@@ -35,4 +43,4 @@ function symbols(db, filePattern) {
35
43
  export {
36
44
  symbols
37
45
  };
38
- //# sourceMappingURL=chunk-KCBMVQL5.js.map
46
+ //# sourceMappingURL=chunk-CPVAQJEC.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildFileDepGraph
3
- } from "./chunk-ZOGY2V3N.js";
3
+ } from "./chunk-AXQKUYKF.js";
4
4
 
5
5
  // src/queries/deep-chains.ts
6
6
  function deepChains(db, opts = {}) {
@@ -41,4 +41,4 @@ function deepChains(db, opts = {}) {
41
41
  export {
42
42
  deepChains
43
43
  };
44
- //# sourceMappingURL=chunk-ZQIIPFD7.js.map
44
+ //# sourceMappingURL=chunk-DH7G3DDV.js.map
@@ -1,9 +1,17 @@
1
+ import {
2
+ resolveIndexedPaths
3
+ } from "./chunk-AXQKUYKF.js";
1
4
  import {
2
5
  shortenSymbol
3
- } from "./chunk-QOV2R2WT.js";
6
+ } from "./chunk-QIXNAB5K.js";
4
7
 
5
8
  // src/queries/surface.ts
6
9
  function surface(db, modulePattern) {
10
+ const matchedPaths = resolveIndexedPaths(db, modulePattern);
11
+ if (matchedPaths.length === 0) {
12
+ return [];
13
+ }
14
+ const placeholders = matchedPaths.map(() => "?").join(", ");
7
15
  const rows = db.all(
8
16
  `SELECT DISTINCT d1.relative_path, gs.symbol
9
17
  FROM mentions m
@@ -12,13 +20,13 @@ function surface(db, modulePattern) {
12
20
  JOIN global_symbols gs ON m.symbol_id = gs.id
13
21
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
14
22
  JOIN documents d2 ON der.document_id = d2.id
15
- WHERE d2.relative_path LIKE ?
16
- AND d1.relative_path NOT LIKE ?
23
+ WHERE d2.relative_path IN (${placeholders})
24
+ AND d1.relative_path NOT IN (${placeholders})
17
25
  AND ${db.localSymbolPredicate}
18
26
  AND m.role != 1
19
27
  ORDER BY d1.relative_path`,
20
- `%${modulePattern}%`,
21
- `%${modulePattern}%`
28
+ ...matchedPaths,
29
+ ...matchedPaths
22
30
  );
23
31
  return rows.filter((r) => !db.isIgnored(r.relative_path)).map((r) => ({
24
32
  consumer: r.relative_path,
@@ -30,4 +38,4 @@ function surface(db, modulePattern) {
30
38
  export {
31
39
  surface
32
40
  };
33
- //# sourceMappingURL=chunk-BOVXCR46.js.map
41
+ //# sourceMappingURL=chunk-EOROMIFO.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  getCalleeRowsForSymbol
3
- } from "./chunk-ZOGY2V3N.js";
3
+ } from "./chunk-AXQKUYKF.js";
4
4
  import {
5
5
  shortenSymbol
6
- } from "./chunk-QOV2R2WT.js";
6
+ } from "./chunk-QIXNAB5K.js";
7
7
 
8
8
  // src/queries/extract-candidates.ts
9
9
  function extractCandidates(db, opts = {}) {
@@ -111,4 +111,4 @@ function extractCandidates(db, opts = {}) {
111
111
  export {
112
112
  extractCandidates
113
113
  };
114
- //# sourceMappingURL=chunk-2CKGIR6G.js.map
114
+ //# sourceMappingURL=chunk-EPWLXXBL.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  shortenSymbol
3
- } from "./chunk-QOV2R2WT.js";
3
+ } from "./chunk-QIXNAB5K.js";
4
4
 
5
5
  // src/queries/bottlenecks.ts
6
6
  function bottlenecks(db, opts = {}) {
@@ -52,4 +52,4 @@ function bottlenecks(db, opts = {}) {
52
52
  export {
53
53
  bottlenecks
54
54
  };
55
- //# sourceMappingURL=chunk-5RMYT5WH.js.map
55
+ //# sourceMappingURL=chunk-F7XU27LU.js.map
@@ -1,45 +1,45 @@
1
1
  import {
2
2
  staleAbstractions
3
- } from "./chunk-BNN2RKD2.js";
3
+ } from "./chunk-P4WO3BBW.js";
4
4
  import {
5
5
  stats
6
6
  } from "./chunk-74RFWB5T.js";
7
- import {
8
- testCoverageSummary
9
- } from "./chunk-HZBC7PPD.js";
10
7
  import {
11
8
  wrapperCandidates
12
- } from "./chunk-4PDAL6IL.js";
9
+ } from "./chunk-4JCSOF2O.js";
13
10
  import {
14
11
  passthroughCandidates
15
- } from "./chunk-W4ALF422.js";
12
+ } from "./chunk-ZEUCXQBN.js";
16
13
  import {
17
14
  similarAll
18
- } from "./chunk-UJQN5N3I.js";
15
+ } from "./chunk-OIDHN6GD.js";
19
16
  import {
20
17
  isolated
21
- } from "./chunk-OVPLOMPY.js";
18
+ } from "./chunk-UQEQ6AHX.js";
22
19
  import {
23
20
  drift
24
- } from "./chunk-7RLE5EWE.js";
21
+ } from "./chunk-7KIMF5PV.js";
25
22
  import {
26
23
  extractCandidates
27
- } from "./chunk-2CKGIR6G.js";
24
+ } from "./chunk-EPWLXXBL.js";
28
25
  import {
29
26
  complexityHotspots
30
- } from "./chunk-ZK6GXM3J.js";
27
+ } from "./chunk-VIYSWZCO.js";
31
28
  import {
32
29
  cycles
33
- } from "./chunk-HMLMH7VZ.js";
30
+ } from "./chunk-LFJQVJYJ.js";
34
31
  import {
35
32
  dead
36
- } from "./chunk-4EXL2CUA.js";
33
+ } from "./chunk-LQJUPXQY.js";
34
+ import {
35
+ isEntrySurface
36
+ } from "./chunk-YY4QGUQ5.js";
37
37
 
38
38
  // src/queries/health.ts
39
39
  function health(db, opts = {}) {
40
40
  const { scope } = opts;
41
41
  const s = stats(db);
42
- const deadResult = dead(db, { scope, minLoc: 3, skipBarrels: false });
42
+ const deadResult = dead(db, { scope, minLoc: 3, skipBarrels: true });
43
43
  const isolatedResult = isolated(db, { scope, minLoc: 3 });
44
44
  const cycleResult = cycles(db, { scope });
45
45
  const similarResult = similarAll(db, { scope, minSimilarity: 0.6, limit: 50, minCallees: 4 });
@@ -49,20 +49,13 @@ function health(db, opts = {}) {
49
49
  const staleResult = staleAbstractions(db, { scope, minLoc: 3, limit: 50 });
50
50
  const driftResult = drift(db, { scope });
51
51
  const complexResult = complexityHotspots(db, { scope, minLoc: 10, limit: 10 });
52
- const testResult = testCoverageSummary(db, { scope, minLoc: 3 });
53
- const isolatedLoc = isolatedResult.reduce((sum, r) => sum + r.loc, 0);
54
- const entryPointPatterns = ["/index.ts", "/index.js", "cli.ts", "worker.ts", "postinstall.ts", "/mod.rs", "__init__.py", "main.ts", "main.rs", "main.go", "main.py"];
55
- const isEntryPoint = (path) => entryPointPatterns.some((p) => path.endsWith(p));
56
52
  const trueDeadSymbols = deadResult.symbols.filter(
57
- (s2) => !isEntryPoint(s2.relativePath) && s2.kind === "dead-code"
53
+ (s2) => !isEntrySurface(db, s2.relativePath) && s2.kind === "dead-code"
58
54
  );
59
55
  const trueDeadCount = trueDeadSymbols.length;
60
56
  const trueDeadLoc = trueDeadSymbols.reduce((sum, s2) => sum + s2.loc, 0);
61
- const fileInternalCount = deadResult.symbols.filter(
62
- (s2) => !isEntryPoint(s2.relativePath) && s2.kind === "file-internal"
63
- ).length;
64
57
  const trueIsolatedCount = isolatedResult.filter(
65
- (s2) => !isEntryPoint(s2.relativePath)
58
+ (s2) => !isEntrySurface(db, s2.relativePath)
66
59
  ).length;
67
60
  const filesWithFunctions = new Set(
68
61
  db.all(
@@ -91,16 +84,6 @@ function health(db, opts = {}) {
91
84
  locRecoverable: trueDeadLoc
92
85
  });
93
86
  }
94
- if (testResult.percent < 50) {
95
- actions.push({
96
- category: "Test coverage",
97
- description: `${testResult.percent}% of symbols referenced by tests (${testResult.uncovered} uncovered)`,
98
- effort: "high",
99
- impact: "high",
100
- count: testResult.uncovered,
101
- locRecoverable: 0
102
- });
103
- }
104
87
  if (trueIsolatedCount > 0) {
105
88
  actions.push({
106
89
  category: "Isolated symbols",
@@ -108,7 +91,7 @@ function health(db, opts = {}) {
108
91
  effort: "low",
109
92
  impact: "medium",
110
93
  count: trueIsolatedCount,
111
- locRecoverable: isolatedResult.filter((s2) => !isEntryPoint(s2.relativePath)).reduce((sum, s2) => sum + s2.loc, 0)
94
+ locRecoverable: isolatedResult.filter((s2) => !isEntrySurface(db, s2.relativePath)).reduce((sum, s2) => sum + s2.loc, 0)
112
95
  });
113
96
  }
114
97
  if (cycleResult.length > 0) {
@@ -219,8 +202,6 @@ function health(db, opts = {}) {
219
202
  score -= Math.min(5, Math.round(driftPercent * 50));
220
203
  const extremeComplexity = complexResult.filter((r) => r.score > 50).length;
221
204
  score -= Math.min(5, extremeComplexity * 2);
222
- const coverageDeduction = Math.round(15 * (1 - testResult.percent / 100));
223
- score -= coverageDeduction;
224
205
  score = Math.max(0, Math.min(100, score));
225
206
  return {
226
207
  score,
@@ -233,7 +214,7 @@ function health(db, opts = {}) {
233
214
  deadSymbols: trueDeadCount,
234
215
  deadLoc: trueDeadLoc,
235
216
  isolatedSymbols: trueIsolatedCount,
236
- isolatedLoc: isolatedResult.filter((s2) => !isEntryPoint(s2.relativePath)).reduce((sum, s2) => sum + s2.loc, 0),
217
+ isolatedLoc: isolatedResult.filter((s2) => !isEntrySurface(db, s2.relativePath)).reduce((sum, s2) => sum + s2.loc, 0),
237
218
  cycles: cycleResult.length,
238
219
  similarPairs: trueSimilarCount,
239
220
  extractionCandidates: extractResult.length,
@@ -241,8 +222,7 @@ function health(db, opts = {}) {
241
222
  passthroughs: passthroughResult.length,
242
223
  staleTypes: trueStaleCount,
243
224
  driftedFiles: trueDriftCount,
244
- complexityHotspotCount: complexResult.length,
245
- testCoveragePercent: testResult.percent
225
+ complexityHotspotCount: complexResult.length
246
226
  },
247
227
  actions,
248
228
  topComplexity: complexResult.slice(0, 5).map((r) => ({
@@ -255,4 +235,4 @@ function health(db, opts = {}) {
255
235
  export {
256
236
  health
257
237
  };
258
- //# sourceMappingURL=chunk-63G7IQTD.js.map
238
+ //# sourceMappingURL=chunk-FYYOWQXK.js.map
@@ -0,0 +1,87 @@
1
+ import {
2
+ cleanSignature
3
+ } from "./chunk-4TYLS5XX.js";
4
+ import {
5
+ findFirstSymbolMatch,
6
+ getSourceReferenceSites
7
+ } from "./chunk-AXQKUYKF.js";
8
+ import {
9
+ isFunctionLikeSymbol,
10
+ shortenSymbol
11
+ } from "./chunk-QIXNAB5K.js";
12
+
13
+ // src/queries/trace.ts
14
+ function trace(db, symbolPattern) {
15
+ const match = findFirstSymbolMatch(db, symbolPattern);
16
+ if (!match) {
17
+ return { definitions: [], referencedBy: [] };
18
+ }
19
+ const defRows = db.all(
20
+ `SELECT d.relative_path, der.start_line, der.end_line,
21
+ gs.display_name,
22
+ REPLACE(SUBSTR(gs.documentation, INSTR(gs.documentation, '|') + 1), char(10), ' ') AS sig
23
+ FROM global_symbols gs
24
+ JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
25
+ JOIN documents d ON der.document_id = d.id
26
+ WHERE gs.id = ?
27
+ ORDER BY d.relative_path, der.start_line
28
+ LIMIT 10`,
29
+ match.symbolId
30
+ );
31
+ const definitions = defRows.filter((r) => !db.isIgnored(r.relative_path)).map((r) => ({
32
+ relativePath: r.relative_path,
33
+ startLine: r.start_line,
34
+ endLine: r.end_line,
35
+ signature: buildTraceSignature(r.sig, r.display_name, match.symbol)
36
+ }));
37
+ const sourceSites = getSourceReferenceSites(db, match);
38
+ const referencedBy = sourceSites.length > 0 ? sourceSites.filter((site) => !db.isIgnored(site.file)).map((site) => ({
39
+ relativePath: site.file,
40
+ line: site.line,
41
+ enclosingSymbol: site.enclosingSymbol,
42
+ enclosingShort: site.enclosingSymbol ? shortenSymbol(site.enclosingSymbol) : "(top-level)"
43
+ })) : db.all(
44
+ `SELECT DISTINCT d.relative_path, c.start_line AS line,
45
+ (SELECT enc_gs.symbol
46
+ FROM defn_enclosing_ranges enc_der
47
+ JOIN global_symbols enc_gs ON enc_der.symbol_id = enc_gs.id
48
+ WHERE enc_der.document_id = d.id
49
+ AND enc_der.start_line <= c.start_line
50
+ AND enc_der.end_line >= c.end_line
51
+ ORDER BY (enc_der.end_line - enc_der.start_line) ASC
52
+ LIMIT 1
53
+ ) AS enclosing_symbol
54
+ FROM mentions m
55
+ JOIN chunks c ON m.chunk_id = c.id
56
+ JOIN documents d ON c.document_id = d.id
57
+ WHERE m.symbol_id = ?
58
+ AND m.role != 1
59
+ ORDER BY d.relative_path, c.start_line`,
60
+ match.symbolId
61
+ ).filter((r) => !db.isIgnored(r.relative_path)).map((r) => ({
62
+ relativePath: r.relative_path,
63
+ line: r.line,
64
+ enclosingSymbol: r.enclosing_symbol,
65
+ enclosingShort: r.enclosing_symbol ? shortenSymbol(r.enclosing_symbol) : "(top-level)"
66
+ }));
67
+ return { definitions, referencedBy };
68
+ }
69
+ function buildTraceSignature(signature, displayName, rawSymbol) {
70
+ const cleaned = cleanSignature(signature);
71
+ if (cleaned && !looksBogusSignature(cleaned)) {
72
+ return cleaned;
73
+ }
74
+ const fallback = (displayName ?? "").trim();
75
+ if (fallback) {
76
+ return isFunctionLikeSymbol(rawSymbol) && !fallback.endsWith("()") ? `${fallback}()` : fallback;
77
+ }
78
+ return shortenSymbol(rawSymbol);
79
+ }
80
+ function looksBogusSignature(signature) {
81
+ return signature.startsWith("undefined") || signature.includes("|") || signature.includes("```");
82
+ }
83
+
84
+ export {
85
+ trace
86
+ };
87
+ //# sourceMappingURL=chunk-GEXE2T6I.js.map
@@ -1,6 +1,9 @@
1
+ import {
2
+ resolveIndexedFile
3
+ } from "./chunk-AXQKUYKF.js";
1
4
  import {
2
5
  shortenSymbol
3
- } from "./chunk-QOV2R2WT.js";
6
+ } from "./chunk-QIXNAB5K.js";
4
7
 
5
8
  // src/queries/fan.ts
6
9
  function fanIn(db, symbolPattern) {
@@ -21,6 +24,10 @@ function fanIn(db, symbolPattern) {
21
24
  }));
22
25
  }
23
26
  function fanOut(db, filePattern) {
27
+ const resolvedFile = resolveIndexedFile(db, filePattern);
28
+ if (!resolvedFile) {
29
+ return [];
30
+ }
24
31
  const rows = db.all(
25
32
  `SELECT d.relative_path, COUNT(DISTINCT gs.id) AS symbol_count
26
33
  FROM mentions m
@@ -29,12 +36,12 @@ function fanOut(db, filePattern) {
29
36
  JOIN global_symbols gs ON m.symbol_id = gs.id
30
37
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
31
38
  JOIN documents def_d ON der.document_id = def_d.id
32
- WHERE d.relative_path LIKE ?
39
+ WHERE d.relative_path = ?
33
40
  AND m.role != 1
34
41
  AND def_d.id != d.id
35
42
  GROUP BY d.id
36
43
  ORDER BY symbol_count DESC`,
37
- `%${filePattern}%`
44
+ resolvedFile
38
45
  );
39
46
  return rows.filter((r) => !db.isIgnored(r.relative_path)).map((r) => ({
40
47
  name: r.relative_path,
@@ -99,4 +106,4 @@ export {
99
106
  topFanIn,
100
107
  topFanOut
101
108
  };
102
- //# sourceMappingURL=chunk-DGUPQSOR.js.map
109
+ //# sourceMappingURL=chunk-GJDHTTR2.js.map
@@ -0,0 +1,87 @@
1
+ import {
2
+ findFirstSymbolMatch,
3
+ getCalleeRowsForSymbol,
4
+ getSourceReferenceSites
5
+ } from "./chunk-AXQKUYKF.js";
6
+ import {
7
+ shortenSymbol
8
+ } from "./chunk-QIXNAB5K.js";
9
+
10
+ // src/queries/dataflow.ts
11
+ function dataflow(db, symbolPattern) {
12
+ const match = findFirstSymbolMatch(db, symbolPattern);
13
+ if (!match) return null;
14
+ const defSites = [{
15
+ file: match.relativePath,
16
+ line: match.startLine
17
+ }];
18
+ const sourceUsageSites = getSourceReferenceSites(db, match);
19
+ const usageSites = sourceUsageSites.length > 0 ? sourceUsageSites.map((site) => ({
20
+ file: site.file,
21
+ line: site.line,
22
+ enclosing_symbol: site.enclosingSymbol
23
+ })) : db.all(
24
+ `SELECT d.relative_path AS file, c.start_line AS line,
25
+ (SELECT enc_gs.symbol
26
+ FROM defn_enclosing_ranges enc_der
27
+ JOIN global_symbols enc_gs ON enc_der.symbol_id = enc_gs.id
28
+ WHERE enc_der.document_id = d.id
29
+ AND enc_der.start_line <= c.start_line
30
+ AND enc_der.end_line >= c.end_line
31
+ ORDER BY (enc_der.end_line - enc_der.start_line) ASC
32
+ LIMIT 1
33
+ ) AS enclosing_symbol
34
+ FROM mentions m
35
+ JOIN chunks c ON m.chunk_id = c.id
36
+ JOIN documents d ON c.document_id = d.id
37
+ WHERE m.symbol_id = ? AND m.role != 1
38
+ ${db.pathExclusionsFor("d")}
39
+ ORDER BY d.relative_path, c.start_line`,
40
+ match.symbolId
41
+ );
42
+ const normalizedUsageSites = usageSites.filter((site) => !db.isIgnored(site.file)).map((site) => ({
43
+ file: site.file,
44
+ line: site.line,
45
+ enclosingSymbol: site.enclosing_symbol ?? "(top-level)",
46
+ enclosingShort: site.enclosing_symbol ? shortenSymbol(site.enclosing_symbol) : "(top-level)"
47
+ }));
48
+ const producers = uniqueSymbolRows(getCalleeRowsForSymbol(db, match, { limit: 30 }).map((row) => ({
49
+ symbol: row.symbol,
50
+ file: row.file
51
+ })));
52
+ const consumers = uniqueSymbolRows(
53
+ normalizedUsageSites.map((site) => ({
54
+ symbol: site.enclosingSymbol === "(top-level)" ? site.file : site.enclosingSymbol,
55
+ file: site.file
56
+ }))
57
+ );
58
+ return {
59
+ symbol: match.symbol,
60
+ shortName: shortenSymbol(match.symbol),
61
+ relativePath: match.relativePath,
62
+ definitionSites: defSites.filter((s) => !db.isIgnored(s.file)),
63
+ usageSites: normalizedUsageSites,
64
+ producers: producers.filter((p) => !db.isIgnored(p.file)).map((p) => ({ symbol: p.symbol, shortName: shortenSymbol(p.symbol), file: p.file })),
65
+ consumers: consumers.filter((c) => !db.isIgnored(c.file)).map((c) => ({
66
+ symbol: c.symbol,
67
+ shortName: c.symbol === c.file ? "(top-level)" : shortenSymbol(c.symbol),
68
+ file: c.file
69
+ }))
70
+ };
71
+ }
72
+ function uniqueSymbolRows(rows) {
73
+ const seen = /* @__PURE__ */ new Set();
74
+ const unique = [];
75
+ for (const row of rows) {
76
+ const key = `${row.symbol}|${row.file}`;
77
+ if (seen.has(key)) continue;
78
+ seen.add(key);
79
+ unique.push(row);
80
+ }
81
+ return unique;
82
+ }
83
+
84
+ export {
85
+ dataflow
86
+ };
87
+ //# sourceMappingURL=chunk-GSH2FPKV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  leafName
3
- } from "./chunk-QOV2R2WT.js";
3
+ } from "./chunk-QIXNAB5K.js";
4
4
 
5
5
  // src/queries/methods.ts
6
6
  function methods(db, className) {
@@ -25,4 +25,4 @@ function methods(db, className) {
25
25
  export {
26
26
  methods
27
27
  };
28
- //# sourceMappingURL=chunk-NUZ4OMU3.js.map
28
+ //# sourceMappingURL=chunk-GU2H5QRN.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  findFirstSymbolMatch,
3
3
  getCalleeRowsForSymbol
4
- } from "./chunk-ZOGY2V3N.js";
4
+ } from "./chunk-AXQKUYKF.js";
5
5
  import {
6
6
  shortenSymbol
7
- } from "./chunk-QOV2R2WT.js";
7
+ } from "./chunk-QIXNAB5K.js";
8
8
 
9
9
  // src/queries/convergence.ts
10
10
  function convergence(db, symbolPatternA, symbolPatternB) {
@@ -32,7 +32,11 @@ function convergence(db, symbolPatternA, symbolPatternB) {
32
32
  const union = /* @__PURE__ */ new Set([...calleesA, ...calleesB]);
33
33
  const similarity = union.size > 0 ? shared.length / union.size : 0;
34
34
  let strategy;
35
- if (uniqueA.length === 0 && uniqueB.length === 0) {
35
+ if (union.size === 0) {
36
+ strategy = "Neither function calls other tracked symbols. There is no callee-pattern evidence for consolidation; inspect the source bodies directly.";
37
+ } else if (shared.length === 0) {
38
+ strategy = "These functions do not share any callees. They are not a callee-based consolidation candidate.";
39
+ } else if (uniqueA.length === 0 && uniqueB.length === 0) {
36
40
  strategy = "These functions have identical callee sets. One can replace the other directly.";
37
41
  } else if (uniqueA.length === 0) {
38
42
  strategy = `A is a subset of B. A can be replaced by calling B (B does everything A does plus more).`;
@@ -69,4 +73,4 @@ function convergence(db, symbolPatternA, symbolPatternB) {
69
73
  export {
70
74
  convergence
71
75
  };
72
- //# sourceMappingURL=chunk-Z6YZJ36C.js.map
76
+ //# sourceMappingURL=chunk-HJZUSUPU.js.map