@colbymchenry/codegraph 0.6.8 → 0.7.2

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 (207) hide show
  1. package/README.md +179 -476
  2. package/dist/bin/codegraph.d.ts +0 -5
  3. package/dist/bin/codegraph.d.ts.map +1 -1
  4. package/dist/bin/codegraph.js +217 -237
  5. package/dist/bin/codegraph.js.map +1 -1
  6. package/dist/bin/uninstall.d.ts +0 -1
  7. package/dist/bin/uninstall.d.ts.map +1 -1
  8. package/dist/bin/uninstall.js +3 -29
  9. package/dist/bin/uninstall.js.map +1 -1
  10. package/dist/context/index.d.ts +3 -5
  11. package/dist/context/index.d.ts.map +1 -1
  12. package/dist/context/index.js +497 -46
  13. package/dist/context/index.js.map +1 -1
  14. package/dist/db/migrations.d.ts +1 -1
  15. package/dist/db/migrations.d.ts.map +1 -1
  16. package/dist/db/migrations.js +10 -1
  17. package/dist/db/migrations.js.map +1 -1
  18. package/dist/db/queries.d.ts +53 -0
  19. package/dist/db/queries.d.ts.map +1 -1
  20. package/dist/db/queries.js +244 -14
  21. package/dist/db/queries.js.map +1 -1
  22. package/dist/db/schema.sql +1 -16
  23. package/dist/extraction/dfm-extractor.d.ts +31 -0
  24. package/dist/extraction/dfm-extractor.d.ts.map +1 -0
  25. package/dist/extraction/dfm-extractor.js +151 -0
  26. package/dist/extraction/dfm-extractor.js.map +1 -0
  27. package/dist/extraction/grammars.d.ts +9 -1
  28. package/dist/extraction/grammars.d.ts.map +1 -1
  29. package/dist/extraction/grammars.js +34 -2
  30. package/dist/extraction/grammars.js.map +1 -1
  31. package/dist/extraction/index.d.ts +7 -1
  32. package/dist/extraction/index.d.ts.map +1 -1
  33. package/dist/extraction/index.js +373 -22
  34. package/dist/extraction/index.js.map +1 -1
  35. package/dist/extraction/languages/c-cpp.d.ts +4 -0
  36. package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
  37. package/dist/extraction/languages/c-cpp.js +126 -0
  38. package/dist/extraction/languages/c-cpp.js.map +1 -0
  39. package/dist/extraction/languages/csharp.d.ts +3 -0
  40. package/dist/extraction/languages/csharp.d.ts.map +1 -0
  41. package/dist/extraction/languages/csharp.js +72 -0
  42. package/dist/extraction/languages/csharp.js.map +1 -0
  43. package/dist/extraction/languages/dart.d.ts +3 -0
  44. package/dist/extraction/languages/dart.d.ts.map +1 -0
  45. package/dist/extraction/languages/dart.js +192 -0
  46. package/dist/extraction/languages/dart.js.map +1 -0
  47. package/dist/extraction/languages/go.d.ts +3 -0
  48. package/dist/extraction/languages/go.d.ts.map +1 -0
  49. package/dist/extraction/languages/go.js +58 -0
  50. package/dist/extraction/languages/go.js.map +1 -0
  51. package/dist/extraction/languages/index.d.ts +10 -0
  52. package/dist/extraction/languages/index.d.ts.map +1 -0
  53. package/dist/extraction/languages/index.js +43 -0
  54. package/dist/extraction/languages/index.js.map +1 -0
  55. package/dist/extraction/languages/java.d.ts +3 -0
  56. package/dist/extraction/languages/java.d.ts.map +1 -0
  57. package/dist/extraction/languages/java.js +64 -0
  58. package/dist/extraction/languages/java.js.map +1 -0
  59. package/dist/extraction/languages/javascript.d.ts +3 -0
  60. package/dist/extraction/languages/javascript.d.ts.map +1 -0
  61. package/dist/extraction/languages/javascript.js +90 -0
  62. package/dist/extraction/languages/javascript.js.map +1 -0
  63. package/dist/extraction/languages/kotlin.d.ts +3 -0
  64. package/dist/extraction/languages/kotlin.d.ts.map +1 -0
  65. package/dist/extraction/languages/kotlin.js +253 -0
  66. package/dist/extraction/languages/kotlin.js.map +1 -0
  67. package/dist/extraction/languages/pascal.d.ts +3 -0
  68. package/dist/extraction/languages/pascal.d.ts.map +1 -0
  69. package/dist/extraction/languages/pascal.js +66 -0
  70. package/dist/extraction/languages/pascal.js.map +1 -0
  71. package/dist/extraction/languages/php.d.ts +3 -0
  72. package/dist/extraction/languages/php.d.ts.map +1 -0
  73. package/dist/extraction/languages/php.js +107 -0
  74. package/dist/extraction/languages/php.js.map +1 -0
  75. package/dist/extraction/languages/python.d.ts +3 -0
  76. package/dist/extraction/languages/python.d.ts.map +1 -0
  77. package/dist/extraction/languages/python.js +56 -0
  78. package/dist/extraction/languages/python.js.map +1 -0
  79. package/dist/extraction/languages/ruby.d.ts +3 -0
  80. package/dist/extraction/languages/ruby.d.ts.map +1 -0
  81. package/dist/extraction/languages/ruby.js +114 -0
  82. package/dist/extraction/languages/ruby.js.map +1 -0
  83. package/dist/extraction/languages/rust.d.ts +3 -0
  84. package/dist/extraction/languages/rust.d.ts.map +1 -0
  85. package/dist/extraction/languages/rust.js +109 -0
  86. package/dist/extraction/languages/rust.js.map +1 -0
  87. package/dist/extraction/languages/swift.d.ts +3 -0
  88. package/dist/extraction/languages/swift.d.ts.map +1 -0
  89. package/dist/extraction/languages/swift.js +91 -0
  90. package/dist/extraction/languages/swift.js.map +1 -0
  91. package/dist/extraction/languages/typescript.d.ts +3 -0
  92. package/dist/extraction/languages/typescript.d.ts.map +1 -0
  93. package/dist/extraction/languages/typescript.js +129 -0
  94. package/dist/extraction/languages/typescript.js.map +1 -0
  95. package/dist/extraction/liquid-extractor.d.ts +52 -0
  96. package/dist/extraction/liquid-extractor.d.ts.map +1 -0
  97. package/dist/extraction/liquid-extractor.js +313 -0
  98. package/dist/extraction/liquid-extractor.js.map +1 -0
  99. package/dist/extraction/parse-worker.d.ts +8 -0
  100. package/dist/extraction/parse-worker.d.ts.map +1 -0
  101. package/dist/extraction/parse-worker.js +57 -0
  102. package/dist/extraction/parse-worker.js.map +1 -0
  103. package/dist/extraction/svelte-extractor.d.ts +47 -0
  104. package/dist/extraction/svelte-extractor.d.ts.map +1 -0
  105. package/dist/extraction/svelte-extractor.js +230 -0
  106. package/dist/extraction/svelte-extractor.js.map +1 -0
  107. package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  108. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
  109. package/dist/extraction/tree-sitter-helpers.js +103 -0
  110. package/dist/extraction/tree-sitter-helpers.js.map +1 -0
  111. package/dist/extraction/tree-sitter-types.d.ts +179 -0
  112. package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
  113. package/dist/extraction/tree-sitter-types.js +10 -0
  114. package/dist/extraction/tree-sitter-types.js.map +1 -0
  115. package/dist/extraction/tree-sitter.d.ts +67 -125
  116. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  117. package/dist/extraction/tree-sitter.js +1052 -1855
  118. package/dist/extraction/tree-sitter.js.map +1 -1
  119. package/dist/graph/traversal.d.ts.map +1 -1
  120. package/dist/graph/traversal.js +20 -2
  121. package/dist/graph/traversal.js.map +1 -1
  122. package/dist/index.d.ts +29 -53
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +88 -114
  125. package/dist/index.js.map +1 -1
  126. package/dist/installer/claude-md-template.d.ts +1 -1
  127. package/dist/installer/claude-md-template.d.ts.map +1 -1
  128. package/dist/installer/claude-md-template.js +15 -15
  129. package/dist/installer/config-writer.d.ts +1 -10
  130. package/dist/installer/config-writer.d.ts.map +1 -1
  131. package/dist/installer/config-writer.js +0 -79
  132. package/dist/installer/config-writer.js.map +1 -1
  133. package/dist/installer/index.d.ts +3 -4
  134. package/dist/installer/index.d.ts.map +1 -1
  135. package/dist/installer/index.js +118 -116
  136. package/dist/installer/index.js.map +1 -1
  137. package/dist/mcp/index.d.ts +5 -0
  138. package/dist/mcp/index.d.ts.map +1 -1
  139. package/dist/mcp/index.js +25 -1
  140. package/dist/mcp/index.js.map +1 -1
  141. package/dist/mcp/tools.d.ts +33 -0
  142. package/dist/mcp/tools.d.ts.map +1 -1
  143. package/dist/mcp/tools.js +405 -21
  144. package/dist/mcp/tools.js.map +1 -1
  145. package/dist/resolution/frameworks/csharp.js +29 -84
  146. package/dist/resolution/frameworks/csharp.js.map +1 -1
  147. package/dist/resolution/frameworks/express.js +44 -48
  148. package/dist/resolution/frameworks/express.js.map +1 -1
  149. package/dist/resolution/frameworks/go.js +34 -70
  150. package/dist/resolution/frameworks/go.js.map +1 -1
  151. package/dist/resolution/frameworks/java.js +29 -87
  152. package/dist/resolution/frameworks/java.js.map +1 -1
  153. package/dist/resolution/frameworks/laravel.js +6 -6
  154. package/dist/resolution/frameworks/laravel.js.map +1 -1
  155. package/dist/resolution/frameworks/python.js +33 -98
  156. package/dist/resolution/frameworks/python.js.map +1 -1
  157. package/dist/resolution/frameworks/react.js +53 -76
  158. package/dist/resolution/frameworks/react.js.map +1 -1
  159. package/dist/resolution/frameworks/ruby.js +12 -24
  160. package/dist/resolution/frameworks/ruby.js.map +1 -1
  161. package/dist/resolution/frameworks/rust.js +26 -66
  162. package/dist/resolution/frameworks/rust.js.map +1 -1
  163. package/dist/resolution/frameworks/svelte.js +11 -31
  164. package/dist/resolution/frameworks/svelte.js.map +1 -1
  165. package/dist/resolution/frameworks/swift.js +42 -160
  166. package/dist/resolution/frameworks/swift.js.map +1 -1
  167. package/dist/resolution/index.d.ts +19 -6
  168. package/dist/resolution/index.d.ts.map +1 -1
  169. package/dist/resolution/index.js +300 -141
  170. package/dist/resolution/index.js.map +1 -1
  171. package/dist/resolution/name-matcher.d.ts +5 -0
  172. package/dist/resolution/name-matcher.d.ts.map +1 -1
  173. package/dist/resolution/name-matcher.js +148 -8
  174. package/dist/resolution/name-matcher.js.map +1 -1
  175. package/dist/resolution/types.d.ts +1 -1
  176. package/dist/resolution/types.d.ts.map +1 -1
  177. package/dist/search/query-utils.d.ts +26 -1
  178. package/dist/search/query-utils.d.ts.map +1 -1
  179. package/dist/search/query-utils.js +209 -9
  180. package/dist/search/query-utils.js.map +1 -1
  181. package/dist/sync/index.d.ts +2 -4
  182. package/dist/sync/index.d.ts.map +1 -1
  183. package/dist/sync/index.js +4 -3
  184. package/dist/sync/index.js.map +1 -1
  185. package/dist/sync/watcher.d.ts +81 -0
  186. package/dist/sync/watcher.d.ts.map +1 -0
  187. package/dist/sync/watcher.js +184 -0
  188. package/dist/sync/watcher.js.map +1 -0
  189. package/dist/types.d.ts +2 -0
  190. package/dist/types.d.ts.map +1 -1
  191. package/dist/types.js.map +1 -1
  192. package/dist/ui/shimmer-progress.d.ts +11 -0
  193. package/dist/ui/shimmer-progress.d.ts.map +1 -0
  194. package/dist/ui/shimmer-progress.js +90 -0
  195. package/dist/ui/shimmer-progress.js.map +1 -0
  196. package/dist/ui/shimmer-worker.d.ts +2 -0
  197. package/dist/ui/shimmer-worker.d.ts.map +1 -0
  198. package/dist/ui/shimmer-worker.js +112 -0
  199. package/dist/ui/shimmer-worker.js.map +1 -0
  200. package/dist/ui/types.d.ts +17 -0
  201. package/dist/ui/types.d.ts.map +1 -0
  202. package/dist/ui/types.js +3 -0
  203. package/dist/ui/types.js.map +1 -0
  204. package/dist/vectors/embedder.js +1 -1
  205. package/dist/vectors/embedder.js.map +1 -1
  206. package/package.json +7 -12
  207. package/scripts/postinstall.js +0 -68
@@ -1 +1 @@
1
- {"version":3,"file":"name-matcher.d.ts","sourceRoot":"","sources":["../../src/resolution/name-matcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAExE;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAgCpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAmCpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAsCpB;AAqFD;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAoBpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAqBpB"}
1
+ {"version":3,"file":"name-matcher.d.ts","sourceRoot":"","sources":["../../src/resolution/name-matcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAExE;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CA8CpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAiCpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAmCpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CA2HpB;AAiGD;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAyBpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,GAAG,IAAI,CAyBpB"}
@@ -5,11 +5,59 @@
5
5
  * Handles symbol name matching for reference resolution.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.matchByFilePath = matchByFilePath;
8
9
  exports.matchByExactName = matchByExactName;
9
10
  exports.matchByQualifiedName = matchByQualifiedName;
10
11
  exports.matchMethodCall = matchMethodCall;
11
12
  exports.matchFuzzy = matchFuzzy;
12
13
  exports.matchReference = matchReference;
14
+ /**
15
+ * Try to resolve a path-like reference (e.g., "snippets/drawer-menu.liquid")
16
+ * by matching the filename against file nodes.
17
+ */
18
+ function matchByFilePath(ref, context) {
19
+ if (!ref.referenceName.includes('/'))
20
+ return null;
21
+ // Extract the filename from the path
22
+ const fileName = ref.referenceName.split('/').pop();
23
+ if (!fileName)
24
+ return null;
25
+ // Search for file nodes with this name
26
+ const candidates = context.getNodesByName(fileName);
27
+ const fileNodes = candidates.filter(n => n.kind === 'file');
28
+ if (fileNodes.length === 0)
29
+ return null;
30
+ // Prefer exact path match on qualified_name
31
+ const exactMatch = fileNodes.find(n => n.qualifiedName === ref.referenceName || n.filePath === ref.referenceName);
32
+ if (exactMatch) {
33
+ return {
34
+ original: ref,
35
+ targetNodeId: exactMatch.id,
36
+ confidence: 0.95,
37
+ resolvedBy: 'file-path',
38
+ };
39
+ }
40
+ // Fall back to suffix match (e.g., ref="snippets/foo.liquid" matches "src/snippets/foo.liquid")
41
+ const suffixMatch = fileNodes.find(n => n.qualifiedName.endsWith(ref.referenceName) || n.filePath.endsWith(ref.referenceName));
42
+ if (suffixMatch) {
43
+ return {
44
+ original: ref,
45
+ targetNodeId: suffixMatch.id,
46
+ confidence: 0.85,
47
+ resolvedBy: 'file-path',
48
+ };
49
+ }
50
+ // If only one file node with this name, use it with lower confidence
51
+ if (fileNodes.length === 1) {
52
+ return {
53
+ original: ref,
54
+ targetNodeId: fileNodes[0].id,
55
+ confidence: 0.7,
56
+ resolvedBy: 'file-path',
57
+ };
58
+ }
59
+ return null;
60
+ }
13
61
  /**
14
62
  * Try to resolve a reference by exact name match
15
63
  */
@@ -18,12 +66,13 @@ function matchByExactName(ref, context) {
18
66
  if (candidates.length === 0) {
19
67
  return null;
20
68
  }
21
- // If only one match, use it
69
+ // If only one match, use it — but penalize cross-language matches
22
70
  if (candidates.length === 1) {
71
+ const isCrossLanguage = candidates[0].language !== ref.language;
23
72
  return {
24
73
  original: ref,
25
74
  targetNodeId: candidates[0].id,
26
- confidence: 0.9,
75
+ confidence: isCrossLanguage ? 0.5 : 0.9,
27
76
  resolvedBy: 'exact-match',
28
77
  };
29
78
  }
@@ -89,11 +138,13 @@ function matchMethodCall(ref, context) {
89
138
  return null;
90
139
  }
91
140
  const [, objectOrClass, methodName] = match;
92
- // Find the class/object first
141
+ // Strategy 1: Direct class name match (existing logic)
93
142
  const classCandidates = context.getNodesByName(objectOrClass);
94
143
  for (const classNode of classCandidates) {
95
144
  if (classNode.kind === 'class' || classNode.kind === 'struct' || classNode.kind === 'interface') {
96
- // Look for method in the same file
145
+ // Skip cross-language class matches
146
+ if (classNode.language !== ref.language)
147
+ continue;
97
148
  const nodesInFile = context.getNodesInFile(classNode.filePath);
98
149
  const methodNode = nodesInFile.find((n) => n.kind === 'method' &&
99
150
  n.name === methodName &&
@@ -108,8 +159,86 @@ function matchMethodCall(ref, context) {
108
159
  }
109
160
  }
110
161
  }
162
+ // Strategy 2: Instance variable receiver - try capitalized form to find class
163
+ // e.g., "permissionEngine" → look for classes containing "PermissionEngine"
164
+ const capitalizedReceiver = objectOrClass.charAt(0).toUpperCase() + objectOrClass.slice(1);
165
+ if (capitalizedReceiver !== objectOrClass) {
166
+ const fuzzyClassCandidates = context.getNodesByName(capitalizedReceiver);
167
+ for (const classNode of fuzzyClassCandidates) {
168
+ if (classNode.kind === 'class' || classNode.kind === 'struct' || classNode.kind === 'interface') {
169
+ // Skip cross-language class matches
170
+ if (classNode.language !== ref.language)
171
+ continue;
172
+ const nodesInFile = context.getNodesInFile(classNode.filePath);
173
+ const methodNode = nodesInFile.find((n) => n.kind === 'method' &&
174
+ n.name === methodName &&
175
+ n.qualifiedName.includes(classNode.name));
176
+ if (methodNode) {
177
+ return {
178
+ original: ref,
179
+ targetNodeId: methodNode.id,
180
+ confidence: 0.8,
181
+ resolvedBy: 'instance-method',
182
+ };
183
+ }
184
+ }
185
+ }
186
+ }
187
+ // Strategy 3: Find methods by name across the codebase, match by receiver
188
+ // name similarity with the containing class. Handles abbreviated variable
189
+ // names like permissionEngine → PermissionRuleEngine.
190
+ if (methodName) {
191
+ const methodCandidates = context.getNodesByName(methodName);
192
+ const methods = methodCandidates.filter((n) => n.kind === 'method' && n.name === methodName);
193
+ // Filter to same-language candidates first
194
+ const sameLanguageMethods = methods.filter(m => m.language === ref.language);
195
+ const targetMethods = sameLanguageMethods.length > 0 ? sameLanguageMethods : methods;
196
+ // If only one same-language method with this name exists, use it
197
+ if (targetMethods.length === 1 && targetMethods[0].language === ref.language) {
198
+ return {
199
+ original: ref,
200
+ targetNodeId: targetMethods[0].id,
201
+ confidence: 0.7,
202
+ resolvedBy: 'instance-method',
203
+ };
204
+ }
205
+ // Multiple methods: score by receiver name word overlap with class name
206
+ if (targetMethods.length > 1) {
207
+ const receiverWords = splitCamelCase(objectOrClass);
208
+ let bestMatch;
209
+ let bestScore = 0;
210
+ for (const method of targetMethods) {
211
+ const classWords = splitCamelCase(method.qualifiedName);
212
+ let score = receiverWords.filter(w => classWords.some(cw => cw.toLowerCase() === w.toLowerCase())).length;
213
+ // Bonus for same language
214
+ if (method.language === ref.language)
215
+ score += 1;
216
+ if (score > bestScore) {
217
+ bestScore = score;
218
+ bestMatch = method;
219
+ }
220
+ }
221
+ if (bestMatch && bestScore >= 2) {
222
+ return {
223
+ original: ref,
224
+ targetNodeId: bestMatch.id,
225
+ confidence: 0.65,
226
+ resolvedBy: 'instance-method',
227
+ };
228
+ }
229
+ }
230
+ }
111
231
  return null;
112
232
  }
233
+ /**
234
+ * Split a camelCase or PascalCase string into words.
235
+ */
236
+ function splitCamelCase(str) {
237
+ return str.replace(/([a-z])([A-Z])/g, '$1 $2')
238
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
239
+ .split(/[\s._:\/\\]+/)
240
+ .filter(w => w.length > 1);
241
+ }
113
242
  /**
114
243
  * Compute directory proximity between two file paths.
115
244
  * Returns a score based on the number of shared directory segments.
@@ -150,10 +279,13 @@ function findBestMatch(ref, candidates, _context) {
150
279
  }
151
280
  // Directory proximity bonus — strongly prefer same module/package
152
281
  score += computePathProximity(ref.filePath, candidate.filePath);
153
- // Same language bonus
282
+ // Language matching: strongly prefer same language, penalize cross-language
154
283
  if (candidate.language === ref.language) {
155
284
  score += 50;
156
285
  }
286
+ else {
287
+ score -= 80;
288
+ }
157
289
  // For call references, prefer functions/methods
158
290
  if (ref.referenceKind === 'calls') {
159
291
  if (candidate.kind === 'function' || candidate.kind === 'method') {
@@ -186,11 +318,15 @@ function matchFuzzy(ref, context) {
186
318
  // Filter to callable kinds only (function, method, class)
187
319
  const callableKinds = new Set(['function', 'method', 'class']);
188
320
  const callableCandidates = candidates.filter((n) => callableKinds.has(n.kind));
189
- if (callableCandidates.length === 1) {
321
+ // Prefer same-language matches
322
+ const sameLanguageCandidates = callableCandidates.filter(n => n.language === ref.language);
323
+ const finalCandidates = sameLanguageCandidates.length > 0 ? sameLanguageCandidates : callableCandidates;
324
+ if (finalCandidates.length === 1) {
325
+ const isCrossLanguage = finalCandidates[0].language !== ref.language;
190
326
  return {
191
327
  original: ref,
192
- targetNodeId: callableCandidates[0].id,
193
- confidence: 0.5,
328
+ targetNodeId: finalCandidates[0].id,
329
+ confidence: isCrossLanguage ? 0.3 : 0.5,
194
330
  resolvedBy: 'fuzzy',
195
331
  };
196
332
  }
@@ -202,6 +338,10 @@ function matchFuzzy(ref, context) {
202
338
  function matchReference(ref, context) {
203
339
  // Try strategies in order of confidence
204
340
  let result;
341
+ // 0. File path match (e.g., "snippets/drawer-menu.liquid" → file node)
342
+ result = matchByFilePath(ref, context);
343
+ if (result)
344
+ return result;
205
345
  // 1. Qualified name match (highest confidence)
206
346
  result = matchByQualifiedName(ref, context);
207
347
  if (result)
@@ -1 +1 @@
1
- {"version":3,"file":"name-matcher.js","sourceRoot":"","sources":["../../src/resolution/name-matcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"name-matcher.js","sourceRoot":"","sources":["../../src/resolution/name-matcher.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ export interface ResolvedRef {
36
36
  /** Confidence score (0-1) */
37
37
  confidence: number;
38
38
  /** How it was resolved */
39
- resolvedBy: 'exact-match' | 'import' | 'qualified-name' | 'framework' | 'fuzzy';
39
+ resolvedBy: 'exact-match' | 'import' | 'qualified-name' | 'framework' | 'fuzzy' | 'instance-method' | 'file-path';
40
40
  }
41
41
  /**
42
42
  * Result of resolution attempt
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolution/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolution/types.ts"],"names":[],"mappings":"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"}
@@ -9,17 +9,42 @@ import { Node } from '../types';
9
9
  * Includes generic English + code-specific noise words.
10
10
  */
11
11
  export declare const STOP_WORDS: Set<string>;
12
+ /**
13
+ * Generate stem variants of a search term by removing common English suffixes.
14
+ * Used for FTS query expansion so "caching" also finds "cache", "eviction" finds "evict", etc.
15
+ * Stems are used as PREFIX matches in FTS, so they don't need to be perfect English words.
16
+ */
17
+ export declare function getStemVariants(term: string): string[];
12
18
  /**
13
19
  * Extract meaningful search terms from a natural language query.
14
20
  * Splits camelCase, PascalCase, snake_case, SCREAMING_SNAKE, and dot.notation
15
21
  * into individual tokens before filtering.
22
+ *
23
+ * Preserves original compound identifiers (e.g., "scrapeLoop") alongside
24
+ * their split parts so that FTS can match both the full symbol name and
25
+ * individual words within it.
26
+ *
27
+ * Also generates stem variants (e.g., "caching"→"cache", "eviction"→"evict")
28
+ * so FTS prefix matching can find related code symbols.
16
29
  */
17
- export declare function extractSearchTerms(query: string): string[];
30
+ export declare function extractSearchTerms(query: string, options?: {
31
+ stems?: boolean;
32
+ }): string[];
18
33
  /**
19
34
  * Score path relevance to a query
20
35
  * Higher score = more relevant path
21
36
  */
22
37
  export declare function scorePathRelevance(filePath: string, query: string): number;
38
+ /**
39
+ * Check if a file path looks like a test file
40
+ */
41
+ export declare function isTestFile(filePath: string): boolean;
42
+ /**
43
+ * Bonus when a node's name matches the search query.
44
+ * Exact matches get the largest boost; prefix matches get smaller boosts.
45
+ * Multi-word queries also check individual term matches against the name.
46
+ */
47
+ export declare function nameMatchBonus(nodeName: string, query: string): number;
23
48
  /**
24
49
  * Kind-based bonus for search ranking
25
50
  * Functions and classes are typically more relevant than variables/imports
@@ -1 +1 @@
1
- {"version":3,"file":"query-utils.d.ts","sourceRoot":"","sources":["../../src/search/query-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,UAAU,aAerB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsB1D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAmB1E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CA0BpD"}
1
+ {"version":3,"file":"query-utils.d.ts","sourceRoot":"","sources":["../../src/search/query-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,UAAU,aAkBrB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAyDtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CA2DzF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA4B1E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAgCpD;AAmBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuCtE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CA0BpD"}
@@ -39,8 +39,11 @@ var __importStar = (this && this.__importStar) || (function () {
39
39
  })();
40
40
  Object.defineProperty(exports, "__esModule", { value: true });
41
41
  exports.STOP_WORDS = void 0;
42
+ exports.getStemVariants = getStemVariants;
42
43
  exports.extractSearchTerms = extractSearchTerms;
43
44
  exports.scorePathRelevance = scorePathRelevance;
45
+ exports.isTestFile = isTestFile;
46
+ exports.nameMatchBonus = nameMatchBonus;
44
47
  exports.kindBonus = kindBonus;
45
48
  const path = __importStar(require("path"));
46
49
  /**
@@ -55,21 +58,104 @@ exports.STOP_WORDS = new Set([
55
58
  'should', 'may', 'might', 'can', 'shall', 'not', 'no', 'all', 'each',
56
59
  'every', 'how', 'what', 'where', 'when', 'who', 'which', 'why',
57
60
  'i', 'me', 'my', 'we', 'our', 'you', 'your', 'he', 'she', 'they',
58
- 'find', 'show', 'get', 'list', 'give', 'tell',
61
+ 'show', 'give', 'tell',
59
62
  'been', 'done', 'made', 'used', 'using', 'work', 'works', 'found',
60
63
  'also', 'into', 'then', 'than', 'just', 'more', 'some', 'such',
61
- 'over', 'only', 'new', 'out', 'its', 'so', 'up', 'as', 'if',
62
- // Code-specific noise
64
+ 'over', 'only', 'out', 'its', 'so', 'up', 'as', 'if',
65
+ 'look', 'need', 'needs', 'want', 'happen', 'happens',
66
+ 'affect', 'affected', 'break', 'breaks', 'failing',
67
+ 'implemented', 'implement',
68
+ // Code-specific noise (avoid filtering common symbol names like get/set/add/build/find/list)
63
69
  'code', 'file', 'files', 'function', 'method', 'class', 'type',
64
- 'build', 'run', 'test', 'fix', 'bug', 'call', 'called', 'set', 'add',
70
+ 'fix', 'bug', 'called',
65
71
  ]);
72
+ /**
73
+ * Generate stem variants of a search term by removing common English suffixes.
74
+ * Used for FTS query expansion so "caching" also finds "cache", "eviction" finds "evict", etc.
75
+ * Stems are used as PREFIX matches in FTS, so they don't need to be perfect English words.
76
+ */
77
+ function getStemVariants(term) {
78
+ const variants = new Set();
79
+ const t = term.toLowerCase();
80
+ // -ing: caching→cach/cache, handling→handl/handle, running→run
81
+ if (t.endsWith('ing') && t.length > 5) {
82
+ const base = t.slice(0, -3);
83
+ variants.add(base);
84
+ variants.add(base + 'e');
85
+ if (base.length >= 2 && base[base.length - 1] === base[base.length - 2]) {
86
+ variants.add(base.slice(0, -1));
87
+ }
88
+ }
89
+ // -tion/-sion: eviction→evict, expression→express
90
+ if ((t.endsWith('tion') || t.endsWith('sion')) && t.length > 5) {
91
+ variants.add(t.slice(0, -3));
92
+ }
93
+ // -ment: management→manage
94
+ if (t.endsWith('ment') && t.length > 6) {
95
+ variants.add(t.slice(0, -4));
96
+ }
97
+ // -ies: entries→entry
98
+ if (t.endsWith('ies') && t.length > 4) {
99
+ variants.add(t.slice(0, -3) + 'y');
100
+ }
101
+ // -es: processes→process, classes→class
102
+ else if (t.endsWith('es') && t.length > 4) {
103
+ variants.add(t.slice(0, -2));
104
+ }
105
+ // -s: errors→error (skip -ss endings like "class")
106
+ else if (t.endsWith('s') && !t.endsWith('ss') && t.length > 4) {
107
+ variants.add(t.slice(0, -1));
108
+ }
109
+ // -ed: handled→handle, propagated→propagate, carried→carry
110
+ if (t.endsWith('ed') && !t.endsWith('eed') && t.length > 4) {
111
+ variants.add(t.slice(0, -1));
112
+ variants.add(t.slice(0, -2));
113
+ if (t.endsWith('ied') && t.length > 5) {
114
+ variants.add(t.slice(0, -3) + 'y');
115
+ }
116
+ }
117
+ // -er: builder→build/builde, handler→handl/handle, getter→get
118
+ if (t.endsWith('er') && t.length > 4) {
119
+ const base = t.slice(0, -2);
120
+ variants.add(base);
121
+ variants.add(base + 'e');
122
+ if (base.length >= 2 && base[base.length - 1] === base[base.length - 2]) {
123
+ variants.add(base.slice(0, -1));
124
+ }
125
+ }
126
+ return [...variants].filter(v => v.length >= 3 && v !== t);
127
+ }
66
128
  /**
67
129
  * Extract meaningful search terms from a natural language query.
68
130
  * Splits camelCase, PascalCase, snake_case, SCREAMING_SNAKE, and dot.notation
69
131
  * into individual tokens before filtering.
132
+ *
133
+ * Preserves original compound identifiers (e.g., "scrapeLoop") alongside
134
+ * their split parts so that FTS can match both the full symbol name and
135
+ * individual words within it.
136
+ *
137
+ * Also generates stem variants (e.g., "caching"→"cache", "eviction"→"evict")
138
+ * so FTS prefix matching can find related code symbols.
70
139
  */
71
- function extractSearchTerms(query) {
140
+ function extractSearchTerms(query, options) {
141
+ const includeStems = options?.stems !== false;
72
142
  const tokens = new Set();
143
+ // First, extract and preserve compound identifiers before splitting
144
+ // CamelCase: scrapeLoop, UserService, getCallGraph
145
+ const compoundPattern = /\b([a-zA-Z][a-zA-Z0-9]*(?:[A-Z][a-z]+)+|[A-Z][a-z]+(?:[A-Z][a-z]*)+)\b/g;
146
+ let match;
147
+ while ((match = compoundPattern.exec(query)) !== null) {
148
+ if (match[1] && match[1].length >= 3) {
149
+ tokens.add(match[1].toLowerCase()); // preserve full compound: "scrapeloop"
150
+ }
151
+ }
152
+ // snake_case: scrape_loop, user_service
153
+ const snakePattern = /\b([a-zA-Z][a-zA-Z0-9]*(?:_[a-zA-Z0-9]+)+)\b/g;
154
+ while ((match = snakePattern.exec(query)) !== null) {
155
+ if (match[1] && match[1].length >= 3) {
156
+ tokens.add(match[1].toLowerCase());
157
+ }
158
+ }
73
159
  // Split camelCase / PascalCase: "getUserName" → "get User Name"
74
160
  const camelSplit = query
75
161
  .replace(/([a-z])([A-Z])/g, '$1 $2')
@@ -86,6 +172,23 @@ function extractSearchTerms(query) {
86
172
  continue;
87
173
  tokens.add(lower);
88
174
  }
175
+ // Generate stem variants for broader FTS matching.
176
+ // "caching" → "cache" finds CacheBuilder; "eviction" → "evict" finds evictEntries.
177
+ // Also enables co-occurrence dampening by increasing term count above 1.
178
+ // Stems are skipped when scoring path relevance (stems inflate path scores).
179
+ if (includeStems) {
180
+ const stems = new Set();
181
+ for (const token of tokens) {
182
+ for (const variant of getStemVariants(token)) {
183
+ if (!tokens.has(variant) && !exports.STOP_WORDS.has(variant)) {
184
+ stems.add(variant);
185
+ }
186
+ }
187
+ }
188
+ for (const stem of stems) {
189
+ tokens.add(stem);
190
+ }
191
+ }
89
192
  return [...tokens];
90
193
  }
91
194
  /**
@@ -93,7 +196,9 @@ function extractSearchTerms(query) {
93
196
  * Higher score = more relevant path
94
197
  */
95
198
  function scorePathRelevance(filePath, query) {
96
- const terms = extractSearchTerms(query);
199
+ // Use base terms only — stem variants inflate path scores by generating
200
+ // many near-duplicate terms that all match the same path segments.
201
+ const terms = extractSearchTerms(query, { stems: false });
97
202
  if (terms.length === 0)
98
203
  return 0;
99
204
  const pathLower = filePath.toLowerCase();
@@ -111,8 +216,103 @@ function scorePathRelevance(filePath, query) {
111
216
  else if (pathLower.includes(term))
112
217
  score += 3;
113
218
  }
219
+ // Deprioritize test files unless the query is explicitly about tests
220
+ const queryLower = query.toLowerCase();
221
+ const isTestQuery = queryLower.includes('test') || queryLower.includes('spec');
222
+ if (!isTestQuery && isTestFile(filePath)) {
223
+ score -= 15;
224
+ }
114
225
  return score;
115
226
  }
227
+ /**
228
+ * Check if a file path looks like a test file
229
+ */
230
+ function isTestFile(filePath) {
231
+ const lower = filePath.toLowerCase();
232
+ const fileName = path.basename(lower);
233
+ // Common test file patterns
234
+ return (fileName.startsWith('test_') ||
235
+ fileName.startsWith('test.') ||
236
+ fileName.endsWith('.test.ts') ||
237
+ fileName.endsWith('.test.js') ||
238
+ fileName.endsWith('.test.tsx') ||
239
+ fileName.endsWith('.test.jsx') ||
240
+ fileName.endsWith('.spec.ts') ||
241
+ fileName.endsWith('.spec.js') ||
242
+ fileName.endsWith('_test.go') ||
243
+ fileName.endsWith('_test.py') ||
244
+ fileName.endsWith('_test.rs') ||
245
+ fileName.endsWith('Tests.java') ||
246
+ fileName.endsWith('Test.java') ||
247
+ fileName.endsWith('Tester.java') ||
248
+ fileName.endsWith('TestCase.java') ||
249
+ lower.includes('/tests/') ||
250
+ lower.includes('/test/') ||
251
+ lower.includes('/__tests__/') ||
252
+ lower.includes('/spec/') ||
253
+ lower.includes('/testlib/') ||
254
+ lower.includes('/testing/') ||
255
+ // Non-production directories: examples, samples, benchmarks, fixtures, demos.
256
+ // Check both mid-path (/integration/) and start-of-path (integration/) since
257
+ // file paths may be stored as relative paths without a leading slash.
258
+ matchesNonProductionDir(lower));
259
+ }
260
+ /**
261
+ * Check if a path is in a non-production directory (integration, sample, example, etc.)
262
+ * Handles both absolute paths (/foo/integration/bar) and relative paths (integration/bar).
263
+ */
264
+ function matchesNonProductionDir(lowerPath) {
265
+ const dirs = [
266
+ 'integration', 'sample', 'samples', 'example', 'examples',
267
+ 'fixture', 'fixtures', 'benchmark', 'benchmarks', 'demo', 'demos',
268
+ ];
269
+ for (const dir of dirs) {
270
+ if (lowerPath.includes('/' + dir + '/') || lowerPath.startsWith(dir + '/')) {
271
+ return true;
272
+ }
273
+ }
274
+ return false;
275
+ }
276
+ /**
277
+ * Bonus when a node's name matches the search query.
278
+ * Exact matches get the largest boost; prefix matches get smaller boosts.
279
+ * Multi-word queries also check individual term matches against the name.
280
+ */
281
+ function nameMatchBonus(nodeName, query) {
282
+ const nameLower = nodeName.toLowerCase();
283
+ // Split query into word-level terms (handles "CacheBuilder build" → ["cache","builder","build"])
284
+ const rawTerms = query
285
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
286
+ .split(/[\s_.\-]+/)
287
+ .map(t => t.toLowerCase())
288
+ .filter(t => t.length >= 2);
289
+ // Also keep original space-separated tokens for exact-term matching
290
+ const queryTokens = query.split(/\s+/).map(t => t.toLowerCase()).filter(t => t.length >= 2);
291
+ // Full query as a single token (for compound identifiers like "CacheBuilder")
292
+ const queryLower = query.replace(/[\s]+/g, '').toLowerCase();
293
+ // Exact match: query exactly equals the node name
294
+ if (nameLower === queryLower)
295
+ return 80;
296
+ // Exact match on a query token: "CacheBuilder build" and node name is "build"
297
+ if (queryTokens.length > 1 && queryTokens.includes(nameLower))
298
+ return 60;
299
+ // Name starts with query — scale by length ratio so "Pod"→"Pod" (exact, handled above)
300
+ // scores much higher than "Pod"→"PodGCControllerOptions" (ratio 0.125).
301
+ if (nameLower.startsWith(queryLower)) {
302
+ const ratio = queryLower.length / nameLower.length;
303
+ return Math.round(10 + 30 * ratio);
304
+ }
305
+ // All camelCase-split terms appear in the name
306
+ if (rawTerms.length > 1) {
307
+ const allMatch = rawTerms.every(t => nameLower.includes(t));
308
+ if (allMatch)
309
+ return 15;
310
+ }
311
+ // Name contains the full query as substring
312
+ if (nameLower.includes(queryLower))
313
+ return 10;
314
+ return 0;
315
+ }
116
316
  /**
117
317
  * Kind-based bonus for search ranking
118
318
  * Functions and classes are typically more relevant than variables/imports
@@ -122,10 +322,10 @@ function kindBonus(kind) {
122
322
  function: 10,
123
323
  method: 10,
124
324
  class: 8,
125
- interface: 7,
325
+ interface: 9,
126
326
  type_alias: 6,
127
327
  struct: 6,
128
- trait: 6,
328
+ trait: 9,
129
329
  enum: 5,
130
330
  component: 8,
131
331
  route: 9,
@@ -139,7 +339,7 @@ function kindBonus(kind) {
139
339
  parameter: 0,
140
340
  namespace: 4,
141
341
  file: 0,
142
- protocol: 6,
342
+ protocol: 9,
143
343
  enum_member: 3,
144
344
  };
145
345
  return bonuses[kind] ?? 0;