scip-query 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/dist/{chunk-CM454WL3.js → chunk-2CKGIR6G.js} +2 -2
  2. package/dist/{chunk-5FGUEU7N.js → chunk-4EXL2CUA.js} +4 -4
  3. package/dist/chunk-4EXL2CUA.js.map +1 -0
  4. package/dist/{chunk-TDNNOR6D.js → chunk-4PDAL6IL.js} +6 -6
  5. package/dist/chunk-4PDAL6IL.js.map +1 -0
  6. package/dist/{chunk-BP2ATLK2.js → chunk-4XHWPRAX.js} +3 -3
  7. package/dist/chunk-4XHWPRAX.js.map +1 -0
  8. package/dist/{chunk-2QZ23IBN.js → chunk-5RMYT5WH.js} +3 -3
  9. package/dist/chunk-5RMYT5WH.js.map +1 -0
  10. package/dist/{chunk-7OZPA5OO.js → chunk-63G7IQTD.js} +13 -13
  11. package/dist/{chunk-XFXDXEUN.js → chunk-74RFWB5T.js} +2 -2
  12. package/dist/{chunk-XFXDXEUN.js.map → chunk-74RFWB5T.js.map} +1 -1
  13. package/dist/{chunk-JKP5GH6T.js → chunk-7LLPRPR5.js} +2 -2
  14. package/dist/{chunk-BFSCMC22.js → chunk-7PBOG4YE.js} +2 -2
  15. package/dist/{chunk-BFSCMC22.js.map → chunk-7PBOG4YE.js.map} +1 -1
  16. package/dist/{chunk-36OMT7ZJ.js → chunk-7RLE5EWE.js} +3 -3
  17. package/dist/{chunk-36OMT7ZJ.js.map → chunk-7RLE5EWE.js.map} +1 -1
  18. package/dist/{chunk-UNTPVD36.js → chunk-7UCKSQRS.js} +3 -3
  19. package/dist/{chunk-UNTPVD36.js.map → chunk-7UCKSQRS.js.map} +1 -1
  20. package/dist/{chunk-GJFURBEW.js → chunk-BNN2RKD2.js} +3 -3
  21. package/dist/chunk-BNN2RKD2.js.map +1 -0
  22. package/dist/{chunk-FFSWWE5O.js → chunk-BOVXCR46.js} +2 -2
  23. package/dist/{chunk-FFSWWE5O.js.map → chunk-BOVXCR46.js.map} +1 -1
  24. package/dist/{chunk-6VJ6Q7IE.js → chunk-D567NFIF.js} +3 -3
  25. package/dist/{chunk-6VJ6Q7IE.js.map → chunk-D567NFIF.js.map} +1 -1
  26. package/dist/{chunk-GTILYBH6.js → chunk-DGUPQSOR.js} +5 -5
  27. package/dist/chunk-DGUPQSOR.js.map +1 -0
  28. package/dist/{chunk-TBP6BICL.js → chunk-EQYLEQCW.js} +2 -2
  29. package/dist/{chunk-TBP6BICL.js.map → chunk-EQYLEQCW.js.map} +1 -1
  30. package/dist/{chunk-VZ7AMAFL.js → chunk-H2MDONBU.js} +2 -2
  31. package/dist/{chunk-BEPIEVLR.js → chunk-HB7MRLLL.js} +2 -2
  32. package/dist/{chunk-BEPIEVLR.js.map → chunk-HB7MRLLL.js.map} +1 -1
  33. package/dist/{chunk-KVSW5KYP.js → chunk-HDSRORNV.js} +4 -4
  34. package/dist/chunk-HDSRORNV.js.map +1 -0
  35. package/dist/{chunk-5WTJAXY2.js → chunk-HMLMH7VZ.js} +2 -2
  36. package/dist/{chunk-Z73NYSBZ.js → chunk-HPFZLISB.js} +2 -2
  37. package/dist/{chunk-3ZZJVBIO.js → chunk-HZBC7PPD.js} +4 -4
  38. package/dist/chunk-HZBC7PPD.js.map +1 -0
  39. package/dist/{chunk-6NBLIDF4.js → chunk-ITZ3DDOG.js} +2 -2
  40. package/dist/chunk-ITZ3DDOG.js.map +1 -0
  41. package/dist/{chunk-YZAA4LYG.js → chunk-KPPHZCZJ.js} +5 -5
  42. package/dist/chunk-KPPHZCZJ.js.map +1 -0
  43. package/dist/{chunk-T6ARFSBZ.js → chunk-MCUX5LA7.js} +6 -6
  44. package/dist/chunk-MCUX5LA7.js.map +1 -0
  45. package/dist/{chunk-ZJRYBOEE.js → chunk-NHBZIL2J.js} +4 -4
  46. package/dist/{chunk-ZJRYBOEE.js.map → chunk-NHBZIL2J.js.map} +1 -1
  47. package/dist/{chunk-VRUJH4BO.js → chunk-NWCE4CIC.js} +4 -4
  48. package/dist/chunk-NWCE4CIC.js.map +1 -0
  49. package/dist/{chunk-LUSIFBXO.js → chunk-OVPLOMPY.js} +4 -4
  50. package/dist/{chunk-LUSIFBXO.js.map → chunk-OVPLOMPY.js.map} +1 -1
  51. package/dist/{chunk-TSPZOMHC.js → chunk-UJQN5N3I.js} +2 -2
  52. package/dist/{chunk-NDSQYIWT.js → chunk-W4ALF422.js} +2 -2
  53. package/dist/{chunk-3E2X7RIE.js → chunk-Z4GHE2HD.js} +5 -5
  54. package/dist/chunk-Z4GHE2HD.js.map +1 -0
  55. package/dist/{chunk-LB7OS35Q.js → chunk-Z6YZJ36C.js} +2 -2
  56. package/dist/{chunk-EMDQWNYR.js → chunk-ZK6GXM3J.js} +7 -7
  57. package/dist/chunk-ZK6GXM3J.js.map +1 -0
  58. package/dist/{chunk-FUHJCHS4.js → chunk-ZOGY2V3N.js} +3 -3
  59. package/dist/chunk-ZOGY2V3N.js.map +1 -0
  60. package/dist/{chunk-MBVNHJVN.js → chunk-ZQIIPFD7.js} +2 -2
  61. package/dist/cli.js +52 -52
  62. package/dist/cli.js.map +1 -1
  63. package/dist/{db-BxaevAyc.d.ts → db-BNVVZSfP.d.ts} +1 -1
  64. package/dist/index.d.ts +2 -2
  65. package/dist/index.js +35 -35
  66. package/dist/queries/affected.d.ts +1 -1
  67. package/dist/queries/affected.js +2 -2
  68. package/dist/queries/bottlenecks.d.ts +1 -1
  69. package/dist/queries/bottlenecks.js +1 -1
  70. package/dist/queries/by-kind.d.ts +1 -1
  71. package/dist/queries/call-graph.d.ts +1 -1
  72. package/dist/queries/call-graph.js +2 -2
  73. package/dist/queries/change-surface.d.ts +1 -1
  74. package/dist/queries/change-surface.js +2 -2
  75. package/dist/queries/code.d.ts +1 -1
  76. package/dist/queries/code.js +2 -2
  77. package/dist/queries/complexity-hotspots.d.ts +1 -1
  78. package/dist/queries/complexity-hotspots.js +2 -2
  79. package/dist/queries/complexity.d.ts +1 -1
  80. package/dist/queries/complexity.js +2 -2
  81. package/dist/queries/convergence.d.ts +1 -1
  82. package/dist/queries/convergence.js +2 -2
  83. package/dist/queries/coupling.d.ts +1 -1
  84. package/dist/queries/coupling.js +1 -1
  85. package/dist/queries/cycles.d.ts +1 -1
  86. package/dist/queries/cycles.js +2 -2
  87. package/dist/queries/dataflow.d.ts +1 -1
  88. package/dist/queries/dataflow.js +2 -2
  89. package/dist/queries/dead.d.ts +1 -1
  90. package/dist/queries/dead.js +2 -2
  91. package/dist/queries/deep-chains.d.ts +1 -1
  92. package/dist/queries/deep-chains.js +2 -2
  93. package/dist/queries/deps.d.ts +1 -1
  94. package/dist/queries/diff-impact.d.ts +1 -1
  95. package/dist/queries/diff-impact.js +2 -2
  96. package/dist/queries/doc-coverage.d.ts +1 -1
  97. package/dist/queries/drift.d.ts +1 -1
  98. package/dist/queries/drift.js +2 -2
  99. package/dist/queries/extract-candidates.d.ts +1 -1
  100. package/dist/queries/extract-candidates.js +2 -2
  101. package/dist/queries/fan.d.ts +1 -1
  102. package/dist/queries/fan.js +1 -1
  103. package/dist/queries/files.d.ts +1 -1
  104. package/dist/queries/health.d.ts +1 -1
  105. package/dist/queries/health.js +14 -14
  106. package/dist/queries/hierarchy.d.ts +1 -1
  107. package/dist/queries/hotspots.d.ts +1 -1
  108. package/dist/queries/hotspots.js +1 -1
  109. package/dist/queries/imports.d.ts +1 -1
  110. package/dist/queries/imports.js +1 -1
  111. package/dist/queries/index.d.ts +1 -1
  112. package/dist/queries/index.js +35 -35
  113. package/dist/queries/isolated.d.ts +1 -1
  114. package/dist/queries/isolated.js +2 -2
  115. package/dist/queries/members.d.ts +1 -1
  116. package/dist/queries/methods.d.ts +1 -1
  117. package/dist/queries/outline.d.ts +1 -1
  118. package/dist/queries/passthrough-candidates.d.ts +1 -1
  119. package/dist/queries/passthrough-candidates.js +2 -2
  120. package/dist/queries/redundant-reexports.d.ts +1 -1
  121. package/dist/queries/redundant-reexports.js +1 -1
  122. package/dist/queries/refs.d.ts +1 -1
  123. package/dist/queries/refs.js +1 -1
  124. package/dist/queries/similar-chains.d.ts +1 -1
  125. package/dist/queries/similar-chains.js +2 -2
  126. package/dist/queries/similar-files.d.ts +1 -1
  127. package/dist/queries/similar-files.js +2 -2
  128. package/dist/queries/similar-signatures.d.ts +1 -1
  129. package/dist/queries/similar.d.ts +1 -1
  130. package/dist/queries/similar.js +2 -2
  131. package/dist/queries/slice.d.ts +1 -1
  132. package/dist/queries/slice.js +2 -2
  133. package/dist/queries/stale-abstractions.d.ts +1 -1
  134. package/dist/queries/stale-abstractions.js +2 -2
  135. package/dist/queries/stats.d.ts +1 -1
  136. package/dist/queries/stats.js +1 -1
  137. package/dist/queries/surface.d.ts +1 -1
  138. package/dist/queries/surface.js +1 -1
  139. package/dist/queries/symbols.d.ts +1 -1
  140. package/dist/queries/system.d.ts +1 -1
  141. package/dist/queries/test-coverage.d.ts +1 -1
  142. package/dist/queries/test-coverage.js +2 -2
  143. package/dist/queries/trace.d.ts +1 -1
  144. package/dist/queries/trace.js +1 -1
  145. package/dist/queries/wrapper-candidates.d.ts +1 -1
  146. package/dist/queries/wrapper-candidates.js +2 -2
  147. package/package.json +1 -1
  148. package/src/queries/affected.ts +1 -1
  149. package/src/queries/bottlenecks.ts +2 -2
  150. package/src/queries/call-graph.ts +1 -1
  151. package/src/queries/change-surface.ts +2 -2
  152. package/src/queries/complexity-hotspots.ts +5 -5
  153. package/src/queries/complexity.ts +1 -1
  154. package/src/queries/coupling.ts +3 -3
  155. package/src/queries/dataflow.ts +4 -4
  156. package/src/queries/dead.ts +2 -2
  157. package/src/queries/diff-impact.ts +3 -3
  158. package/src/queries/drift.ts +1 -1
  159. package/src/queries/fan.ts +4 -4
  160. package/src/queries/hotspots.ts +1 -1
  161. package/src/queries/imports.ts +1 -1
  162. package/src/queries/isolated.ts +2 -2
  163. package/src/queries/redundant-reexports.ts +4 -4
  164. package/src/queries/refs.ts +1 -1
  165. package/src/queries/slice.ts +2 -2
  166. package/src/queries/stale-abstractions.ts +1 -1
  167. package/src/queries/stats.ts +1 -1
  168. package/src/queries/surface.ts +1 -1
  169. package/src/queries/test-coverage.ts +2 -2
  170. package/src/queries/trace.ts +1 -1
  171. package/src/queries/wrapper-candidates.ts +4 -4
  172. package/src/query-support.ts +2 -2
  173. package/src/types.ts +1 -1
  174. package/dist/chunk-2QZ23IBN.js.map +0 -1
  175. package/dist/chunk-3E2X7RIE.js.map +0 -1
  176. package/dist/chunk-3ZZJVBIO.js.map +0 -1
  177. package/dist/chunk-5FGUEU7N.js.map +0 -1
  178. package/dist/chunk-6NBLIDF4.js.map +0 -1
  179. package/dist/chunk-BP2ATLK2.js.map +0 -1
  180. package/dist/chunk-EMDQWNYR.js.map +0 -1
  181. package/dist/chunk-FUHJCHS4.js.map +0 -1
  182. package/dist/chunk-GJFURBEW.js.map +0 -1
  183. package/dist/chunk-GTILYBH6.js.map +0 -1
  184. package/dist/chunk-KVSW5KYP.js.map +0 -1
  185. package/dist/chunk-T6ARFSBZ.js.map +0 -1
  186. package/dist/chunk-TDNNOR6D.js.map +0 -1
  187. package/dist/chunk-VRUJH4BO.js.map +0 -1
  188. package/dist/chunk-YZAA4LYG.js.map +0 -1
  189. /package/dist/{chunk-CM454WL3.js.map → chunk-2CKGIR6G.js.map} +0 -0
  190. /package/dist/{chunk-7OZPA5OO.js.map → chunk-63G7IQTD.js.map} +0 -0
  191. /package/dist/{chunk-JKP5GH6T.js.map → chunk-7LLPRPR5.js.map} +0 -0
  192. /package/dist/{chunk-VZ7AMAFL.js.map → chunk-H2MDONBU.js.map} +0 -0
  193. /package/dist/{chunk-5WTJAXY2.js.map → chunk-HMLMH7VZ.js.map} +0 -0
  194. /package/dist/{chunk-Z73NYSBZ.js.map → chunk-HPFZLISB.js.map} +0 -0
  195. /package/dist/{chunk-TSPZOMHC.js.map → chunk-UJQN5N3I.js.map} +0 -0
  196. /package/dist/{chunk-NDSQYIWT.js.map → chunk-W4ALF422.js.map} +0 -0
  197. /package/dist/{chunk-LB7OS35Q.js.map → chunk-Z6YZJ36C.js.map} +0 -0
  198. /package/dist/{chunk-MBVNHJVN.js.map → chunk-ZQIIPFD7.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  testFileExclusionSql
3
- } from "./chunk-FUHJCHS4.js";
3
+ } from "./chunk-ZOGY2V3N.js";
4
4
  import {
5
5
  shortenSymbol
6
6
  } from "./chunk-QOV2R2WT.js";
@@ -20,7 +20,7 @@ function complexityHotspots(db, opts) {
20
20
  (SELECT COUNT(DISTINCT ref_c.document_id)
21
21
  FROM mentions ref_m
22
22
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
23
- WHERE ref_m.symbol_id = gs.id AND ref_m.role = 0
23
+ WHERE ref_m.symbol_id = gs.id AND ref_m.role != 1
24
24
  ) AS fan_in,
25
25
  -- fanOut: distinct symbols referenced within this definition range
26
26
  -- that are defined in different files
@@ -32,7 +32,7 @@ function complexityHotspots(db, opts) {
32
32
  WHERE out_c.document_id = der.document_id
33
33
  AND out_c.start_line >= der.start_line
34
34
  AND out_c.end_line <= der.end_line
35
- AND out_m.role = 0
35
+ AND out_m.role != 1
36
36
  AND out_gs.id != gs.id
37
37
  AND out_der.document_id != der.document_id
38
38
  ) AS fan_out,
@@ -44,7 +44,7 @@ function complexityHotspots(db, opts) {
44
44
  WHERE callee_c.document_id = der.document_id
45
45
  AND callee_c.start_line >= der.start_line
46
46
  AND callee_c.end_line <= der.end_line
47
- AND callee_m.role = 0
47
+ AND callee_m.role != 1
48
48
  AND callee_gs.id != gs.id
49
49
  ) AS callee_count
50
50
  FROM global_symbols gs
@@ -61,7 +61,7 @@ function complexityHotspots(db, opts) {
61
61
  * CAST((SELECT COUNT(DISTINCT ref_c2.document_id)
62
62
  FROM mentions ref_m2
63
63
  JOIN chunks ref_c2 ON ref_m2.chunk_id = ref_c2.id
64
- WHERE ref_m2.symbol_id = gs.id AND ref_m2.role = 0
64
+ WHERE ref_m2.symbol_id = gs.id AND ref_m2.role != 1
65
65
  ) AS REAL) / 5.0
66
66
  * MAX(CAST((SELECT COUNT(DISTINCT out_gs2.id)
67
67
  FROM mentions out_m2
@@ -71,7 +71,7 @@ function complexityHotspots(db, opts) {
71
71
  WHERE out_c2.document_id = der.document_id
72
72
  AND out_c2.start_line >= der.start_line
73
73
  AND out_c2.end_line <= der.end_line
74
- AND out_m2.role = 0
74
+ AND out_m2.role != 1
75
75
  AND out_gs2.id != gs.id
76
76
  AND out_der2.document_id != der.document_id
77
77
  ) AS REAL) / 5.0, 1.0)
@@ -99,4 +99,4 @@ function complexityHotspots(db, opts) {
99
99
  export {
100
100
  complexityHotspots
101
101
  };
102
- //# sourceMappingURL=chunk-EMDQWNYR.js.map
102
+ //# sourceMappingURL=chunk-ZK6GXM3J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/queries/complexity-hotspots.ts"],"sourcesContent":["import type { ScipDatabase } from '../db.js';\nimport { testFileExclusionSql } from '../query-support.js';\nimport type { ComplexityHotspot } from '../types.js';\nimport { shortenSymbol } from '../symbol-parser.js';\n\n/**\n * Find complexity hotspots: symbols with a composite score based on\n * LOC, fan-in, fan-out, and callee count.\n *\n * Score = (loc / 50) * (fanIn / 5) * max(fanOut / 5, 1)\n *\n * High scores indicate symbols that are large, widely depended upon,\n * AND reach out to many other modules — the riskiest code to change.\n */\nexport function complexityHotspots(\n db: ScipDatabase,\n opts?: { scope?: string; minLoc?: number; limit?: number },\n): ComplexityHotspot[] {\n const { scope, minLoc = 10, limit = 30 } = opts ?? {};\n const scopeFilter = scope ? `AND d.relative_path LIKE '%${scope}%'` : '';\n\n const rows = db.all<{\n symbol: string;\n file: string;\n start_line: number;\n end_line: number;\n loc: number;\n fan_in: number;\n fan_out: number;\n callee_count: number;\n }>(\n `SELECT\n gs.symbol,\n d.relative_path AS file,\n der.start_line,\n der.end_line,\n (der.end_line - der.start_line + 1) AS loc,\n -- fanIn: distinct files that reference this symbol\n (SELECT COUNT(DISTINCT ref_c.document_id)\n FROM mentions ref_m\n JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id\n WHERE ref_m.symbol_id = gs.id AND ref_m.role != 1\n ) AS fan_in,\n -- fanOut: distinct symbols referenced within this definition range\n -- that are defined in different files\n (SELECT COUNT(DISTINCT out_gs.id)\n FROM mentions out_m\n JOIN chunks out_c ON out_m.chunk_id = out_c.id\n JOIN global_symbols out_gs ON out_m.symbol_id = out_gs.id\n JOIN defn_enclosing_ranges out_der ON out_gs.id = out_der.symbol_id\n WHERE out_c.document_id = der.document_id\n AND out_c.start_line >= der.start_line\n AND out_c.end_line <= der.end_line\n AND out_m.role != 1\n AND out_gs.id != gs.id\n AND out_der.document_id != der.document_id\n ) AS fan_out,\n -- calleeCount: total distinct callees within definition range\n (SELECT COUNT(DISTINCT callee_gs.id)\n FROM mentions callee_m\n JOIN chunks callee_c ON callee_m.chunk_id = callee_c.id\n JOIN global_symbols callee_gs ON callee_m.symbol_id = callee_gs.id\n WHERE callee_c.document_id = der.document_id\n AND callee_c.start_line >= der.start_line\n AND callee_c.end_line <= der.end_line\n AND callee_m.role != 1\n AND callee_gs.id != gs.id\n ) AS callee_count\n FROM global_symbols gs\n JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id\n JOIN documents d ON der.document_id = d.id\n WHERE 1 = 1\n ${db.pathExclusionsFor('d')}\n AND ${testFileExclusionSql('d')}\n ${db.symbolNoiseFor('gs')}\n AND (der.end_line - der.start_line + 1) >= ?\n ${scopeFilter}\n ORDER BY (\n CAST((der.end_line - der.start_line + 1) AS REAL) / 50.0\n * CAST((SELECT COUNT(DISTINCT ref_c2.document_id)\n FROM mentions ref_m2\n JOIN chunks ref_c2 ON ref_m2.chunk_id = ref_c2.id\n WHERE ref_m2.symbol_id = gs.id AND ref_m2.role != 1\n ) AS REAL) / 5.0\n * MAX(CAST((SELECT COUNT(DISTINCT out_gs2.id)\n FROM mentions out_m2\n JOIN chunks out_c2 ON out_m2.chunk_id = out_c2.id\n JOIN global_symbols out_gs2 ON out_m2.symbol_id = out_gs2.id\n JOIN defn_enclosing_ranges out_der2 ON out_gs2.id = out_der2.symbol_id\n WHERE out_c2.document_id = der.document_id\n AND out_c2.start_line >= der.start_line\n AND out_c2.end_line <= der.end_line\n AND out_m2.role != 1\n AND out_gs2.id != gs.id\n AND out_der2.document_id != der.document_id\n ) AS REAL) / 5.0, 1.0)\n ) DESC\n LIMIT ?`,\n minLoc, limit,\n );\n\n return rows\n .filter((r) => !db.isIgnored(r.file))\n .map((r) => ({\n symbol: r.symbol,\n shortName: shortenSymbol(r.symbol),\n file: r.file,\n startLine: r.start_line,\n endLine: r.end_line,\n loc: r.loc,\n fanIn: r.fan_in,\n fanOut: r.fan_out,\n calleeCount: r.callee_count,\n score:\n Math.round(\n (r.loc / 50) * (r.fan_in / 5) * Math.max(r.fan_out / 5, 1) * 100,\n ) / 100,\n }));\n}\n"],"mappings":";;;;;;;;AAcO,SAAS,mBACd,IACA,MACqB;AACrB,QAAM,EAAE,OAAO,SAAS,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC;AACpD,QAAM,cAAc,QAAQ,8BAA8B,KAAK,OAAO;AAEtE,QAAM,OAAO,GAAG;AAAA,IAUd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAyCI,GAAG,kBAAkB,GAAG,CAAC;AAAA,YACrB,qBAAqB,GAAG,CAAC;AAAA,QAC7B,GAAG,eAAe,IAAI,CAAC;AAAA;AAAA,QAEvB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsBf;AAAA,IAAQ;AAAA,EACV;AAEA,SAAO,KACJ,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,EACnC,IAAI,CAAC,OAAO;AAAA,IACX,QAAQ,EAAE;AAAA,IACV,WAAW,cAAc,EAAE,MAAM;AAAA,IACjC,MAAM,EAAE;AAAA,IACR,WAAW,EAAE;AAAA,IACb,SAAS,EAAE;AAAA,IACX,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,IACT,QAAQ,EAAE;AAAA,IACV,aAAa,EAAE;AAAA,IACf,OACE,KAAK;AAAA,MACF,EAAE,MAAM,MAAO,EAAE,SAAS,KAAK,KAAK,IAAI,EAAE,UAAU,GAAG,CAAC,IAAI;AAAA,IAC/D,IAAI;AAAA,EACR,EAAE;AACN;","names":[]}
@@ -33,7 +33,7 @@ function buildFileDepGraph(db, scope) {
33
33
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
34
34
  JOIN documents d2 ON der.document_id = d2.id
35
35
  WHERE d1.id != d2.id
36
- AND m.role = 0
36
+ AND m.role != 1
37
37
  ${db.pathExclusionsFor("d1", "d2")}
38
38
  ${scopeFilter}`
39
39
  );
@@ -116,7 +116,7 @@ function getCalleeRowsForSymbol(db, symbol, opts = {}) {
116
116
  WHERE c.document_id = ?
117
117
  AND c.start_line >= ?
118
118
  AND c.end_line <= ?
119
- AND m.role = 0
119
+ AND m.role != 1
120
120
  AND callee_gs.id != ?
121
121
  ${db.symbolNoiseFor("callee_gs")}
122
122
  ${db.pathExclusionsFor("callee_d")}
@@ -155,4 +155,4 @@ export {
155
155
  findFirstSymbolMatch,
156
156
  getCalleeRowsForSymbol
157
157
  };
158
- //# sourceMappingURL=chunk-FUHJCHS4.js.map
158
+ //# sourceMappingURL=chunk-ZOGY2V3N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query-support.ts"],"sourcesContent":["import type { ScipDatabase } from './db.js';\n\nexport interface SymbolLocation {\n documentId: number;\n startLine: number;\n endLine: number;\n symbolId: number;\n}\n\nexport interface SymbolMatch extends SymbolLocation {\n symbol: string;\n relativePath: string;\n}\n\nexport interface CalleeRow {\n symbol: string;\n file: string;\n chunkId: number;\n}\n\nexport const TEST_FILE_PATTERNS = [\n '%/__tests__/%',\n '%.test.%',\n '%.spec.%',\n '%/test/%',\n '%/tests/%',\n '%_test.%',\n '%_spec.%',\n '%/test_%.%',\n '%/spec_%.%',\n] as const;\n\nexport const TEST_SUPPORT_PATH_PATTERNS = [\n '%/test-utils/%',\n] as const;\n\nexport function testFileMatchSql(\n alias: string,\n patterns: readonly string[] = TEST_FILE_PATTERNS,\n): string {\n return `(${patterns.map((pattern) => `${alias}.relative_path LIKE '${pattern}'`).join(' OR ')})`;\n}\n\nexport function testFileExclusionSql(\n alias: string,\n extraPatterns: readonly string[] = [],\n): string {\n const patterns = uniquePatterns([...TEST_FILE_PATTERNS, ...extraPatterns]);\n return patterns\n .map((pattern) => `${alias}.relative_path NOT LIKE '${pattern}'`)\n .join('\\n AND ');\n}\n\nexport function buildFileDepGraph(\n db: ScipDatabase,\n scope?: string,\n): Map<string, Set<string>> {\n const scopeFilter = scope ? `AND d1.relative_path LIKE '%${scope}%'` : '';\n\n const edges = db.all<{ from_file: string; to_file: string }>(\n `SELECT DISTINCT\n d1.relative_path AS from_file,\n d2.relative_path AS to_file\n FROM mentions m\n JOIN chunks c ON m.chunk_id = c.id\n JOIN documents d1 ON c.document_id = d1.id\n JOIN global_symbols gs ON m.symbol_id = gs.id\n JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id\n JOIN documents d2 ON der.document_id = d2.id\n WHERE d1.id != d2.id\n AND m.role != 1\n ${db.pathExclusionsFor('d1', 'd2')}\n ${scopeFilter}`,\n );\n\n const graph = new Map<string, Set<string>>();\n for (const edge of edges) {\n if (db.isIgnored(edge.from_file) || db.isIgnored(edge.to_file)) continue;\n if (!graph.has(edge.from_file)) graph.set(edge.from_file, new Set());\n graph.get(edge.from_file)!.add(edge.to_file);\n }\n\n return graph;\n}\n\nexport function findFirstSymbolMatch(\n db: ScipDatabase,\n symbolPattern: string,\n): SymbolMatch | null {\n // Handle file:line-line syntax (e.g., \"src/foo.ts:10-50\")\n const fileLineMatch = symbolPattern.match(/^(.+):(\\d+)-(\\d+)$/);\n if (fileLineMatch) {\n const [, filePath, startStr, endStr] = fileLineMatch;\n const row = db.get<{\n id: number;\n symbol: string;\n document_id: number;\n start_line: number;\n end_line: number;\n relative_path: string;\n }>(\n `SELECT gs.id, gs.symbol, der.document_id, der.start_line, der.end_line, d.relative_path\n FROM global_symbols gs\n JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id\n JOIN documents d ON der.document_id = d.id\n WHERE d.relative_path LIKE ?\n AND der.start_line <= ? AND der.end_line >= ?\n ${db.pathExclusionsFor('d')}\n ORDER BY (der.end_line - der.start_line) ASC\n LIMIT 1`,\n `%${filePath}%`, parseInt(startStr!, 10), parseInt(endStr!, 10),\n );\n if (row && !db.isIgnored(row.relative_path)) {\n return {\n symbolId: row.id,\n symbol: row.symbol,\n documentId: row.document_id,\n startLine: row.start_line,\n endLine: row.end_line,\n relativePath: row.relative_path,\n };\n }\n }\n\n // Strip parentheses from the pattern to avoid shell escaping issues.\n // Agents often pass \"functionName()\" — strip the () for matching.\n const cleaned = symbolPattern.replace(/\\(\\)$/, '').replace(/\\(.*$/, '');\n\n // Try exact-ish match first (with noise filter), then fallback without noise filter.\n // The noise filter excludes %().(% which can incorrectly match some symbols.\n for (const useNoiseFilter of [true, false]) {\n const noiseClause = useNoiseFilter ? db.symbolNoiseFor('gs') : '';\n const row = db.get<{\n id: number;\n symbol: string;\n document_id: number;\n start_line: number;\n end_line: number;\n relative_path: string;\n }>(\n `SELECT gs.id, gs.symbol, der.document_id, der.start_line, der.end_line, d.relative_path\n FROM global_symbols gs\n JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id\n JOIN documents d ON der.document_id = d.id\n WHERE gs.symbol LIKE ?\n ${db.pathExclusionsFor('d')}\n ${noiseClause}\n ORDER BY (der.end_line - der.start_line) DESC\n LIMIT 1`,\n `%${cleaned}%`,\n );\n\n if (row && !db.isIgnored(row.relative_path)) {\n return {\n symbolId: row.id,\n symbol: row.symbol,\n documentId: row.document_id,\n startLine: row.start_line,\n endLine: row.end_line,\n relativePath: row.relative_path,\n };\n }\n }\n\n return null;\n}\n\nexport function getCalleeRowsForSymbol(\n db: ScipDatabase,\n symbol: SymbolLocation,\n opts: { limit?: number } = {},\n): CalleeRow[] {\n const rows = db.all<{\n symbol: string;\n file: string;\n chunk_id: number;\n }>(\n `SELECT DISTINCT\n callee_gs.symbol AS symbol,\n callee_d.relative_path AS file,\n c.id AS chunk_id\n FROM mentions m\n JOIN chunks c ON m.chunk_id = c.id\n JOIN global_symbols callee_gs ON m.symbol_id = callee_gs.id\n JOIN defn_enclosing_ranges callee_der ON callee_gs.id = callee_der.symbol_id\n JOIN documents callee_d ON callee_der.document_id = callee_d.id\n WHERE c.document_id = ?\n AND c.start_line >= ?\n AND c.end_line <= ?\n AND m.role != 1\n AND callee_gs.id != ?\n ${db.symbolNoiseFor('callee_gs')}\n ${db.pathExclusionsFor('callee_d')}\n ORDER BY callee_d.relative_path\n ${opts.limit ? 'LIMIT ?' : ''}`,\n ...calleeQueryParams(symbol, opts.limit),\n );\n\n return rows.filter((row) => !db.isIgnored(row.file)).map((row) => ({\n symbol: row.symbol,\n file: row.file,\n chunkId: row.chunk_id,\n }));\n}\n\nfunction calleeQueryParams(\n symbol: SymbolLocation,\n limit?: number,\n): number[] {\n const params = [\n symbol.documentId,\n symbol.startLine,\n symbol.endLine,\n symbol.symbolId,\n ];\n\n if (typeof limit === 'number') {\n params.push(limit);\n }\n\n return params;\n}\n\nfunction uniquePatterns(patterns: readonly string[]): string[] {\n return [...new Set(patterns)];\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildFileDepGraph
3
- } from "./chunk-FUHJCHS4.js";
3
+ } from "./chunk-ZOGY2V3N.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-MBVNHJVN.js.map
44
+ //# sourceMappingURL=chunk-ZQIIPFD7.js.map
package/dist/cli.js CHANGED
@@ -913,7 +913,7 @@ function stats(db) {
913
913
  "SELECT COUNT(*) as c FROM mentions WHERE role = 1"
914
914
  ).c;
915
915
  const references = db.get(
916
- "SELECT COUNT(*) as c FROM mentions WHERE role = 0"
916
+ "SELECT COUNT(*) as c FROM mentions WHERE role != 1"
917
917
  ).c;
918
918
  return {
919
919
  documents,
@@ -1163,7 +1163,7 @@ function refs(db, symbolPattern) {
1163
1163
  JOIN global_symbols gs ON m.symbol_id = gs.id
1164
1164
  WHERE gs.symbol LIKE ?
1165
1165
  AND ${db.localSymbolPredicate}
1166
- AND m.role = 0
1166
+ AND m.role != 1
1167
1167
  ORDER BY d.relative_path, c.start_line`,
1168
1168
  `%${symbolPattern}%`
1169
1169
  );
@@ -1203,7 +1203,7 @@ function trace(db, symbolPattern) {
1203
1203
  WHERE gs.symbol LIKE ?
1204
1204
  AND ${db.localSymbolPredicate}
1205
1205
  ${db.symbolNoise}
1206
- AND m.role = 0
1206
+ AND m.role != 1
1207
1207
  ORDER BY d.relative_path`,
1208
1208
  `%${symbolPattern}%`
1209
1209
  );
@@ -1323,7 +1323,7 @@ function surface(db, modulePattern) {
1323
1323
  WHERE d2.relative_path LIKE ?
1324
1324
  AND d1.relative_path NOT LIKE ?
1325
1325
  AND ${db.localSymbolPredicate}
1326
- AND m.role = 0
1326
+ AND m.role != 1
1327
1327
  ORDER BY d1.relative_path`,
1328
1328
  `%${modulePattern}%`,
1329
1329
  `%${modulePattern}%`
@@ -1370,7 +1370,7 @@ function buildFileDepGraph(db, scope) {
1370
1370
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
1371
1371
  JOIN documents d2 ON der.document_id = d2.id
1372
1372
  WHERE d1.id != d2.id
1373
- AND m.role = 0
1373
+ AND m.role != 1
1374
1374
  ${db.pathExclusionsFor("d1", "d2")}
1375
1375
  ${scopeFilter}`
1376
1376
  );
@@ -1453,7 +1453,7 @@ function getCalleeRowsForSymbol(db, symbol, opts = {}) {
1453
1453
  WHERE c.document_id = ?
1454
1454
  AND c.start_line >= ?
1455
1455
  AND c.end_line <= ?
1456
- AND m.role = 0
1456
+ AND m.role != 1
1457
1457
  AND callee_gs.id != ?
1458
1458
  ${db.symbolNoiseFor("callee_gs")}
1459
1459
  ${db.pathExclusionsFor("callee_d")}
@@ -1519,7 +1519,7 @@ function dead(db, opts = {}) {
1519
1519
  gs.symbol,
1520
1520
  (SELECT COUNT(*) FROM mentions m2
1521
1521
  JOIN chunks c2 ON m2.chunk_id = c2.id
1522
- WHERE m2.symbol_id = gs.id AND m2.role = 0 AND c2.document_id = d.id
1522
+ WHERE m2.symbol_id = gs.id AND m2.role != 1 AND c2.document_id = d.id
1523
1523
  ) AS same_file_refs
1524
1524
  FROM global_symbols gs
1525
1525
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
@@ -1537,7 +1537,7 @@ function dead(db, opts = {}) {
1537
1537
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
1538
1538
  JOIN documents ref_d ON ref_c.document_id = ref_d.id
1539
1539
  WHERE ref_m.symbol_id = gs.id
1540
- AND ref_m.role = 0
1540
+ AND ref_m.role != 1
1541
1541
  AND ref_d.id != d.id
1542
1542
  ${barrelExclusions}
1543
1543
  )
@@ -1588,7 +1588,7 @@ function hotspots(db, opts = {}) {
1588
1588
  JOIN global_symbols gs ON m.symbol_id = gs.id
1589
1589
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
1590
1590
  JOIN documents def_d ON der.document_id = def_d.id
1591
- WHERE m.role = 0
1591
+ WHERE m.role != 1
1592
1592
  ${db.pathExclusionsFor("def_d")}
1593
1593
  ${db.symbolNoiseFor("gs")}
1594
1594
  ${scopeFilter}
@@ -1659,7 +1659,7 @@ function unusedImports(db, filePattern) {
1659
1659
  FROM mentions ref_m
1660
1660
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
1661
1661
  WHERE ref_m.symbol_id = gs.id
1662
- AND ref_m.role = 0
1662
+ AND ref_m.role != 1
1663
1663
  AND ref_c.document_id = d.id
1664
1664
  )
1665
1665
  ORDER BY d.relative_path, gs.symbol`,
@@ -1751,7 +1751,7 @@ function fanIn(db, symbolPattern) {
1751
1751
  JOIN chunks c ON m.chunk_id = c.id
1752
1752
  JOIN global_symbols gs ON m.symbol_id = gs.id
1753
1753
  WHERE gs.symbol LIKE ?
1754
- AND m.role = 0
1754
+ AND m.role != 1
1755
1755
  GROUP BY gs.id
1756
1756
  ORDER BY file_count DESC`,
1757
1757
  `%${symbolPattern}%`
@@ -1771,7 +1771,7 @@ function fanOut(db, filePattern) {
1771
1771
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
1772
1772
  JOIN documents def_d ON der.document_id = def_d.id
1773
1773
  WHERE d.relative_path LIKE ?
1774
- AND m.role = 0
1774
+ AND m.role != 1
1775
1775
  AND def_d.id != d.id
1776
1776
  GROUP BY d.id
1777
1777
  ORDER BY symbol_count DESC`,
@@ -1792,7 +1792,7 @@ function topFanIn(db, opts = {}) {
1792
1792
  JOIN global_symbols gs ON m.symbol_id = gs.id
1793
1793
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
1794
1794
  JOIN documents def_d ON der.document_id = def_d.id
1795
- WHERE m.role = 0
1795
+ WHERE m.role != 1
1796
1796
  ${db.pathExclusionsFor("def_d")}
1797
1797
  ${db.symbolNoiseFor("gs")}
1798
1798
  ${scopeFilter}
@@ -1818,7 +1818,7 @@ function topFanOut(db, opts = {}) {
1818
1818
  JOIN global_symbols gs ON m.symbol_id = gs.id
1819
1819
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
1820
1820
  JOIN documents def_d ON der.document_id = def_d.id
1821
- WHERE m.role = 0
1821
+ WHERE m.role != 1
1822
1822
  AND def_d.id != d.id
1823
1823
  ${db.pathExclusionsFor("d")}
1824
1824
  ${db.symbolNoiseFor("gs")}
@@ -1850,7 +1850,7 @@ function coupling(db, file1, file2) {
1850
1850
  SELECT 1 FROM mentions m
1851
1851
  JOIN chunks c ON m.chunk_id = c.id
1852
1852
  JOIN documents d ON c.document_id = d.id
1853
- WHERE m.symbol_id = gs.id AND m.role = 0 AND d.relative_path LIKE ?
1853
+ WHERE m.symbol_id = gs.id AND m.role != 1 AND d.relative_path LIKE ?
1854
1854
  )
1855
1855
  ) OR (
1856
1856
  -- Defined in file2, referenced in file1
@@ -1863,7 +1863,7 @@ function coupling(db, file1, file2) {
1863
1863
  SELECT 1 FROM mentions m
1864
1864
  JOIN chunks c ON m.chunk_id = c.id
1865
1865
  JOIN documents d ON c.document_id = d.id
1866
- WHERE m.symbol_id = gs.id AND m.role = 0 AND d.relative_path LIKE ?
1866
+ WHERE m.symbol_id = gs.id AND m.role != 1 AND d.relative_path LIKE ?
1867
1867
  )
1868
1868
  )`,
1869
1869
  `%${file1}%`,
@@ -1891,7 +1891,7 @@ function topCoupling(db, opts = {}) {
1891
1891
  JOIN global_symbols gs ON m.symbol_id = gs.id
1892
1892
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
1893
1893
  JOIN documents def_d ON der.document_id = def_d.id
1894
- WHERE m.role = 0
1894
+ WHERE m.role != 1
1895
1895
  AND def_d.id != ref_d.id
1896
1896
  ${db.pathExclusionsFor("def_d", "ref_d")}
1897
1897
  ${scopeFilter}
@@ -1972,7 +1972,7 @@ function bottlenecks(db, opts = {}) {
1972
1972
  (SELECT COUNT(DISTINCT ref_c.document_id)
1973
1973
  FROM mentions ref_m
1974
1974
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
1975
- WHERE ref_m.symbol_id = gs.id AND ref_m.role = 0
1975
+ WHERE ref_m.symbol_id = gs.id AND ref_m.role != 1
1976
1976
  ) AS fan_in,
1977
1977
  (SELECT COUNT(DISTINCT ref_gs.id)
1978
1978
  FROM mentions ref_m
@@ -1980,7 +1980,7 @@ function bottlenecks(db, opts = {}) {
1980
1980
  JOIN global_symbols ref_gs ON ref_m.symbol_id = ref_gs.id
1981
1981
  JOIN defn_enclosing_ranges ref_der ON ref_gs.id = ref_der.symbol_id
1982
1982
  WHERE ref_c.document_id = def_d.id
1983
- AND ref_m.role = 0
1983
+ AND ref_m.role != 1
1984
1984
  AND ref_der.document_id != def_d.id
1985
1985
  ) AS fan_out
1986
1986
  FROM global_symbols gs
@@ -2032,13 +2032,13 @@ function isolated(db, opts = {}) {
2032
2032
  AND NOT EXISTS (
2033
2033
  SELECT 1 FROM mentions m
2034
2034
  JOIN chunks c ON m.chunk_id = c.id
2035
- WHERE m.symbol_id = gs.id AND m.role = 0 AND c.document_id != d.id
2035
+ WHERE m.symbol_id = gs.id AND m.role != 1 AND c.document_id != d.id
2036
2036
  )
2037
2037
  -- No same-file references either
2038
2038
  AND NOT EXISTS (
2039
2039
  SELECT 1 FROM mentions m
2040
2040
  JOIN chunks c ON m.chunk_id = c.id
2041
- WHERE m.symbol_id = gs.id AND m.role = 0 AND c.document_id = d.id
2041
+ WHERE m.symbol_id = gs.id AND m.role != 1 AND c.document_id = d.id
2042
2042
  )
2043
2043
  ORDER BY loc DESC, d.relative_path`,
2044
2044
  minLoc
@@ -2237,7 +2237,7 @@ function testCoverage(db, symbolPattern) {
2237
2237
  JOIN chunks c ON m.chunk_id = c.id
2238
2238
  JOIN documents ref_d ON c.document_id = ref_d.id
2239
2239
  WHERE m.symbol_id = ?
2240
- AND m.role = 0
2240
+ AND m.role != 1
2241
2241
  AND (${testPatternSql})
2242
2242
  ORDER BY ref_d.relative_path`,
2243
2243
  s.id
@@ -2276,7 +2276,7 @@ function testCoverageSummary(db, opts = {}) {
2276
2276
  `SELECT COUNT(*) AS c FROM mentions m
2277
2277
  JOIN chunks c ON m.chunk_id = c.id
2278
2278
  JOIN documents ref_d ON c.document_id = ref_d.id
2279
- WHERE m.symbol_id = ? AND m.role = 0 AND (${testRefSql})`,
2279
+ WHERE m.symbol_id = ? AND m.role != 1 AND (${testRefSql})`,
2280
2280
  s.id
2281
2281
  );
2282
2282
  if (hasTest && hasTest.c > 0) covered++;
@@ -2440,7 +2440,7 @@ function callGraph(db, symbolPattern) {
2440
2440
  JOIN global_symbols caller_gs ON caller_der.symbol_id = caller_gs.id
2441
2441
  JOIN documents caller_d ON caller_der.document_id = caller_d.id
2442
2442
  WHERE m.symbol_id = ?
2443
- AND m.role = 0
2443
+ AND m.role != 1
2444
2444
  AND caller_gs.id != ?
2445
2445
  ${db.symbolNoiseFor("caller_gs")}
2446
2446
  ${db.pathExclusionsFor("caller_d")}
@@ -3068,7 +3068,7 @@ function affected(db, symbolPattern, opts = {}) {
3068
3068
  JOIN global_symbols enc_gs ON enc_der.symbol_id = enc_gs.id
3069
3069
  JOIN documents enc_d ON enc_der.document_id = enc_d.id
3070
3070
  WHERE m.symbol_id IN (${placeholders})
3071
- AND m.role = 0
3071
+ AND m.role != 1
3072
3072
  AND enc_gs.id NOT IN (${placeholders})
3073
3073
  ${db.symbolNoiseFor("enc_gs")}
3074
3074
  ${db.pathExclusionsFor("enc_d")}
@@ -3123,7 +3123,7 @@ function changeSurface(db, filePattern) {
3123
3123
  FROM mentions m
3124
3124
  JOIN chunks c ON m.chunk_id = c.id
3125
3125
  WHERE m.symbol_id = ?
3126
- AND m.role = 0
3126
+ AND m.role != 1
3127
3127
  AND c.document_id != ?`,
3128
3128
  sym.symbol_id,
3129
3129
  doc.id
@@ -3135,7 +3135,7 @@ function changeSurface(db, filePattern) {
3135
3135
  JOIN chunks c ON m.chunk_id = c.id
3136
3136
  JOIN documents ref_d ON c.document_id = ref_d.id
3137
3137
  WHERE m.symbol_id = ?
3138
- AND m.role = 0
3138
+ AND m.role != 1
3139
3139
  AND (${testPatternSql})
3140
3140
  ORDER BY ref_d.relative_path`,
3141
3141
  sym.symbol_id
@@ -3260,7 +3260,7 @@ function diffImpact(db, opts = {}) {
3260
3260
  FROM mentions m
3261
3261
  JOIN chunks c ON m.chunk_id = c.id
3262
3262
  WHERE m.symbol_id = ?
3263
- AND m.role = 0`,
3263
+ AND m.role != 1`,
3264
3264
  sym.symbol_id
3265
3265
  );
3266
3266
  const fanIn2 = fanInRow?.fan_in ?? 0;
@@ -3277,7 +3277,7 @@ function diffImpact(db, opts = {}) {
3277
3277
  JOIN chunks c ON m.chunk_id = c.id
3278
3278
  JOIN documents ref_d ON c.document_id = ref_d.id
3279
3279
  WHERE m.symbol_id = ?
3280
- AND m.role = 0
3280
+ AND m.role != 1
3281
3281
  AND ref_d.relative_path NOT IN (${changedFiles.map(() => "?").join(",")})
3282
3282
  ${db.pathExclusionsFor("ref_d")}`,
3283
3283
  sym.symbol_id,
@@ -3296,7 +3296,7 @@ function diffImpact(db, opts = {}) {
3296
3296
  JOIN chunks c ON m.chunk_id = c.id
3297
3297
  JOIN documents ref_d ON c.document_id = ref_d.id
3298
3298
  WHERE m.symbol_id = ?
3299
- AND m.role = 0
3299
+ AND m.role != 1
3300
3300
  AND (${testPatternSql})`,
3301
3301
  sym.symbol_id
3302
3302
  );
@@ -3416,7 +3416,7 @@ function buildSymbolRefGraph(db, scope) {
3416
3416
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
3417
3417
  JOIN documents d2 ON der.document_id = d2.id
3418
3418
  WHERE d1.id != d2.id
3419
- AND m.role = 0
3419
+ AND m.role != 1
3420
3420
  ${db.pathExclusionsFor("d1", "d2")}
3421
3421
  ${scopeFilter}`
3422
3422
  );
@@ -3486,7 +3486,7 @@ function wrapperCandidates(db, opts) {
3486
3486
  AND ref_c.end_line <= caller_der.end_line
3487
3487
  JOIN global_symbols caller_gs ON caller_der.symbol_id = caller_gs.id
3488
3488
  WHERE ref_m.symbol_id = gs.id
3489
- AND ref_m.role = 0
3489
+ AND ref_m.role != 1
3490
3490
  AND ref_c.document_id != der.document_id
3491
3491
  LIMIT 1
3492
3492
  ) AS caller_symbol,
@@ -3503,11 +3503,11 @@ function wrapperCandidates(db, opts) {
3503
3503
  AND ref_c2.start_line >= caller_der2.start_line
3504
3504
  AND ref_c2.end_line <= caller_der2.end_line
3505
3505
  WHERE ref_m2.symbol_id = gs.id
3506
- AND ref_m2.role = 0
3506
+ AND ref_m2.role != 1
3507
3507
  AND ref_c2.document_id != der.document_id
3508
3508
  LIMIT 1
3509
3509
  )
3510
- AND caller_ref_m.role = 0
3510
+ AND caller_ref_m.role != 1
3511
3511
  ) AS caller_fan_in
3512
3512
  FROM global_symbols gs
3513
3513
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
@@ -3527,7 +3527,7 @@ function wrapperCandidates(db, opts) {
3527
3527
  FROM mentions ref_m
3528
3528
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
3529
3529
  WHERE ref_m.symbol_id = gs.id
3530
- AND ref_m.role = 0
3530
+ AND ref_m.role != 1
3531
3531
  AND ref_c.document_id != der.document_id
3532
3532
  ) = 1
3533
3533
  ) WHERE caller_symbol IS NOT NULL AND caller_fan_in > 3
@@ -3624,7 +3624,7 @@ function staleAbstractions(db, opts) {
3624
3624
  FROM mentions ref_m
3625
3625
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
3626
3626
  WHERE ref_m.symbol_id = gs.id
3627
- AND ref_m.role = 0
3627
+ AND ref_m.role != 1
3628
3628
  AND ref_c.document_id != der.document_id
3629
3629
  ) AS consumers
3630
3630
  FROM global_symbols gs
@@ -3676,7 +3676,7 @@ function complexityHotspots(db, opts) {
3676
3676
  (SELECT COUNT(DISTINCT ref_c.document_id)
3677
3677
  FROM mentions ref_m
3678
3678
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
3679
- WHERE ref_m.symbol_id = gs.id AND ref_m.role = 0
3679
+ WHERE ref_m.symbol_id = gs.id AND ref_m.role != 1
3680
3680
  ) AS fan_in,
3681
3681
  -- fanOut: distinct symbols referenced within this definition range
3682
3682
  -- that are defined in different files
@@ -3688,7 +3688,7 @@ function complexityHotspots(db, opts) {
3688
3688
  WHERE out_c.document_id = der.document_id
3689
3689
  AND out_c.start_line >= der.start_line
3690
3690
  AND out_c.end_line <= der.end_line
3691
- AND out_m.role = 0
3691
+ AND out_m.role != 1
3692
3692
  AND out_gs.id != gs.id
3693
3693
  AND out_der.document_id != der.document_id
3694
3694
  ) AS fan_out,
@@ -3700,7 +3700,7 @@ function complexityHotspots(db, opts) {
3700
3700
  WHERE callee_c.document_id = der.document_id
3701
3701
  AND callee_c.start_line >= der.start_line
3702
3702
  AND callee_c.end_line <= der.end_line
3703
- AND callee_m.role = 0
3703
+ AND callee_m.role != 1
3704
3704
  AND callee_gs.id != gs.id
3705
3705
  ) AS callee_count
3706
3706
  FROM global_symbols gs
@@ -3717,7 +3717,7 @@ function complexityHotspots(db, opts) {
3717
3717
  * CAST((SELECT COUNT(DISTINCT ref_c2.document_id)
3718
3718
  FROM mentions ref_m2
3719
3719
  JOIN chunks ref_c2 ON ref_m2.chunk_id = ref_c2.id
3720
- WHERE ref_m2.symbol_id = gs.id AND ref_m2.role = 0
3720
+ WHERE ref_m2.symbol_id = gs.id AND ref_m2.role != 1
3721
3721
  ) AS REAL) / 5.0
3722
3722
  * MAX(CAST((SELECT COUNT(DISTINCT out_gs2.id)
3723
3723
  FROM mentions out_m2
@@ -3727,7 +3727,7 @@ function complexityHotspots(db, opts) {
3727
3727
  WHERE out_c2.document_id = der.document_id
3728
3728
  AND out_c2.start_line >= der.start_line
3729
3729
  AND out_c2.end_line <= der.end_line
3730
- AND out_m2.role = 0
3730
+ AND out_m2.role != 1
3731
3731
  AND out_gs2.id != gs.id
3732
3732
  AND out_der2.document_id != der.document_id
3733
3733
  ) AS REAL) / 5.0, 1.0)
@@ -4120,7 +4120,7 @@ function complexity(db, symbolPattern) {
4120
4120
  `SELECT COUNT(DISTINCT c.document_id) AS c
4121
4121
  FROM mentions m
4122
4122
  JOIN chunks c ON m.chunk_id = c.id
4123
- WHERE m.symbol_id = ? AND m.role = 0`,
4123
+ WHERE m.symbol_id = ? AND m.role != 1`,
4124
4124
  match.symbolId
4125
4125
  );
4126
4126
  const fanOut2 = new Set(
@@ -4219,7 +4219,7 @@ function dataflow(db, symbolPattern) {
4219
4219
  FROM mentions m
4220
4220
  JOIN chunks c ON m.chunk_id = c.id
4221
4221
  JOIN documents d ON c.document_id = d.id
4222
- WHERE m.symbol_id = ? AND m.role = 0
4222
+ WHERE m.symbol_id = ? AND m.role != 1
4223
4223
  ${db.pathExclusionsFor("d")}
4224
4224
  ORDER BY d.relative_path, c.start_line`,
4225
4225
  match.symbolId
@@ -4233,7 +4233,7 @@ function dataflow(db, symbolPattern) {
4233
4233
  JOIN documents other_d ON other_der.document_id = other_d.id
4234
4234
  WHERE other_c.document_id = ?
4235
4235
  AND other_c.start_line >= ? AND other_c.end_line <= ?
4236
- AND other_m.role = 0
4236
+ AND other_m.role != 1
4237
4237
  AND other_gs.id != ?
4238
4238
  ${db.symbolNoiseFor("other_gs")}
4239
4239
  ${db.pathExclusionsFor("other_d")}
@@ -4256,11 +4256,11 @@ function dataflow(db, symbolPattern) {
4256
4256
  AND enc_der.end_line >= ref_c.end_line
4257
4257
  JOIN global_symbols enc_gs ON enc_der.symbol_id = enc_gs.id
4258
4258
  -- Find other symbols defined by that enclosing function's file
4259
- JOIN mentions consumer_m ON consumer_m.symbol_id = enc_gs.id AND consumer_m.role = 0
4259
+ JOIN mentions consumer_m ON consumer_m.symbol_id = enc_gs.id AND consumer_m.role != 1
4260
4260
  JOIN chunks consumer_c ON consumer_m.chunk_id = consumer_c.id
4261
4261
  JOIN documents consumer_d ON consumer_c.document_id = consumer_d.id
4262
4262
  JOIN global_symbols consumer_gs ON consumer_m.symbol_id = consumer_gs.id
4263
- WHERE ref_m.symbol_id = ? AND ref_m.role = 0
4263
+ WHERE ref_m.symbol_id = ? AND ref_m.role != 1
4264
4264
  AND consumer_d.id != ref_d.id
4265
4265
  ${db.symbolNoiseFor("consumer_gs")}
4266
4266
  ${db.pathExclusionsFor("consumer_d")}
@@ -4359,7 +4359,7 @@ function forwardSlice(db, match) {
4359
4359
  JOIN global_symbols enc_gs ON enc_der.symbol_id = enc_gs.id
4360
4360
  JOIN documents enc_d ON enc_der.document_id = enc_d.id
4361
4361
  -- Find other symbols referenced within that enclosing function
4362
- JOIN mentions out_m ON out_m.role = 0
4362
+ JOIN mentions out_m ON out_m.role != 1
4363
4363
  JOIN chunks out_c ON out_m.chunk_id = out_c.id
4364
4364
  AND out_c.document_id = enc_der.document_id
4365
4365
  AND out_c.start_line >= enc_der.start_line
@@ -4367,7 +4367,7 @@ function forwardSlice(db, match) {
4367
4367
  JOIN global_symbols out_gs ON out_m.symbol_id = out_gs.id
4368
4368
  JOIN defn_enclosing_ranges out_der ON out_gs.id = out_der.symbol_id
4369
4369
  JOIN documents out_d ON out_der.document_id = out_d.id
4370
- WHERE ref_m.symbol_id = ? AND ref_m.role = 0
4370
+ WHERE ref_m.symbol_id = ? AND ref_m.role != 1
4371
4371
  AND out_gs.id != ? AND out_gs.id != enc_gs.id
4372
4372
  AND out_d.id != ref_d.id
4373
4373
  ${db.symbolNoiseFor("out_gs")}
@@ -4415,7 +4415,7 @@ function redundantReexports(db, opts = {}) {
4415
4415
  JOIN global_symbols gs ON m.symbol_id = gs.id
4416
4416
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
4417
4417
  JOIN documents orig_d ON der.document_id = orig_d.id
4418
- WHERE m.role = 0
4418
+ WHERE m.role != 1
4419
4419
  AND (barrel_d.relative_path LIKE '%/index.ts'
4420
4420
  OR barrel_d.relative_path LIKE '%/index.js'
4421
4421
  OR barrel_d.relative_path = 'index.ts'
@@ -4443,20 +4443,20 @@ function redundantReexports(db, opts = {}) {
4443
4443
  FROM mentions barrel_m
4444
4444
  JOIN chunks barrel_c ON barrel_m.chunk_id = barrel_c.id
4445
4445
  WHERE barrel_c.document_id = consumer_d.id
4446
- AND barrel_m.role = 0
4446
+ AND barrel_m.role != 1
4447
4447
  AND barrel_m.symbol_id IN (
4448
4448
  SELECT m2.symbol_id
4449
4449
  FROM mentions m2
4450
4450
  JOIN chunks c2 ON m2.chunk_id = c2.id
4451
4451
  WHERE c2.document_id = ?
4452
- AND m2.role = 0
4452
+ AND m2.role != 1
4453
4453
  )
4454
4454
  ) THEN 1 ELSE 0 END) AS uses_barrel
4455
4455
  FROM mentions ref_m
4456
4456
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
4457
4457
  JOIN documents consumer_d ON ref_c.document_id = consumer_d.id
4458
4458
  WHERE ref_m.symbol_id = ?
4459
- AND ref_m.role = 0
4459
+ AND ref_m.role != 1
4460
4460
  AND consumer_d.id != ?
4461
4461
  AND consumer_d.id != ?
4462
4462
  ${db.pathExclusionsFor("consumer_d")}