purecontext-mcp 1.1.7 → 1.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 (182) hide show
  1. package/AGENT_INSTRUCTIONS.md +393 -0
  2. package/AGENT_INSTRUCTIONS_SHORT.md +53 -0
  3. package/AST-SEARCH.md +274 -0
  4. package/CHANGELOG.md +62 -0
  5. package/CODE-INTELLIGENCE.md +369 -0
  6. package/HEALTH-DASHBOARDS.md +241 -0
  7. package/README.md +7 -0
  8. package/REFACTORING-SAFELY.md +279 -0
  9. package/UNDERSTANDING-RELATIONSHIPS.md +240 -0
  10. package/USER-GUIDE.md +14 -0
  11. package/VISUALIZING-CODE.md +199 -0
  12. package/WORKFLOW-TECH-DEBT.md +286 -0
  13. package/dist/core/db/dep-store.d.ts +75 -0
  14. package/dist/core/db/dep-store.d.ts.map +1 -1
  15. package/dist/core/db/dep-store.js +277 -0
  16. package/dist/core/db/dep-store.js.map +1 -1
  17. package/dist/core/db/schema.d.ts.map +1 -1
  18. package/dist/core/db/schema.js +12 -0
  19. package/dist/core/db/schema.js.map +1 -1
  20. package/dist/core/index-manager.js +1 -1
  21. package/dist/core/index-manager.js.map +1 -1
  22. package/dist/core/token-tracker.d.ts +0 -9
  23. package/dist/core/token-tracker.d.ts.map +1 -1
  24. package/dist/core/token-tracker.js +0 -21
  25. package/dist/core/token-tracker.js.map +1 -1
  26. package/dist/core/types.d.ts +5 -0
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/graph/diagram-renderer.d.ts +83 -0
  29. package/dist/graph/diagram-renderer.d.ts.map +1 -0
  30. package/dist/graph/diagram-renderer.js +294 -0
  31. package/dist/graph/diagram-renderer.js.map +1 -0
  32. package/dist/graph/graph-traversal.d.ts +92 -0
  33. package/dist/graph/graph-traversal.d.ts.map +1 -1
  34. package/dist/graph/graph-traversal.js +440 -2
  35. package/dist/graph/graph-traversal.js.map +1 -1
  36. package/dist/server/http-server.d.ts.map +1 -1
  37. package/dist/server/http-server.js +30 -1
  38. package/dist/server/http-server.js.map +1 -1
  39. package/dist/server/mcp-server.d.ts.map +1 -1
  40. package/dist/server/mcp-server.js +145 -0
  41. package/dist/server/mcp-server.js.map +1 -1
  42. package/dist/server/tools/_meta.d.ts +0 -2
  43. package/dist/server/tools/_meta.d.ts.map +1 -1
  44. package/dist/server/tools/_meta.js +1 -4
  45. package/dist/server/tools/_meta.js.map +1 -1
  46. package/dist/server/tools/check-delete-safe.d.ts +50 -0
  47. package/dist/server/tools/check-delete-safe.d.ts.map +1 -0
  48. package/dist/server/tools/check-delete-safe.js +308 -0
  49. package/dist/server/tools/check-delete-safe.js.map +1 -0
  50. package/dist/server/tools/check-move-safe.d.ts +44 -0
  51. package/dist/server/tools/check-move-safe.d.ts.map +1 -0
  52. package/dist/server/tools/check-move-safe.js +266 -0
  53. package/dist/server/tools/check-move-safe.js.map +1 -0
  54. package/dist/server/tools/check-rename-safe.d.ts +48 -0
  55. package/dist/server/tools/check-rename-safe.d.ts.map +1 -0
  56. package/dist/server/tools/check-rename-safe.js +218 -0
  57. package/dist/server/tools/check-rename-safe.js.map +1 -0
  58. package/dist/server/tools/diff-health-radar.d.ts +44 -0
  59. package/dist/server/tools/diff-health-radar.d.ts.map +1 -0
  60. package/dist/server/tools/diff-health-radar.js +192 -0
  61. package/dist/server/tools/diff-health-radar.js.map +1 -0
  62. package/dist/server/tools/find-cycles.d.ts +31 -0
  63. package/dist/server/tools/find-cycles.d.ts.map +1 -0
  64. package/dist/server/tools/find-cycles.js +85 -0
  65. package/dist/server/tools/find-cycles.js.map +1 -0
  66. package/dist/server/tools/find-implementations.d.ts +47 -0
  67. package/dist/server/tools/find-implementations.d.ts.map +1 -0
  68. package/dist/server/tools/find-implementations.js +167 -0
  69. package/dist/server/tools/find-implementations.js.map +1 -0
  70. package/dist/server/tools/find-untested-symbols.d.ts +52 -0
  71. package/dist/server/tools/find-untested-symbols.d.ts.map +1 -0
  72. package/dist/server/tools/find-untested-symbols.js +308 -0
  73. package/dist/server/tools/find-untested-symbols.js.map +1 -0
  74. package/dist/server/tools/get-architecture-snapshot.d.ts +43 -0
  75. package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -0
  76. package/dist/server/tools/get-architecture-snapshot.js +292 -0
  77. package/dist/server/tools/get-architecture-snapshot.js.map +1 -0
  78. package/dist/server/tools/get-call-hierarchy.d.ts +43 -0
  79. package/dist/server/tools/get-call-hierarchy.d.ts.map +1 -0
  80. package/dist/server/tools/get-call-hierarchy.js +119 -0
  81. package/dist/server/tools/get-call-hierarchy.js.map +1 -0
  82. package/dist/server/tools/get-class-hierarchy.d.ts +36 -0
  83. package/dist/server/tools/get-class-hierarchy.d.ts.map +1 -0
  84. package/dist/server/tools/get-class-hierarchy.js +125 -0
  85. package/dist/server/tools/get-class-hierarchy.js.map +1 -0
  86. package/dist/server/tools/get-complexity-hotspots.d.ts +50 -0
  87. package/dist/server/tools/get-complexity-hotspots.d.ts.map +1 -0
  88. package/dist/server/tools/get-complexity-hotspots.js +282 -0
  89. package/dist/server/tools/get-complexity-hotspots.js.map +1 -0
  90. package/dist/server/tools/get-coupling-map.d.ts +39 -0
  91. package/dist/server/tools/get-coupling-map.d.ts.map +1 -0
  92. package/dist/server/tools/get-coupling-map.js +107 -0
  93. package/dist/server/tools/get-coupling-map.js.map +1 -0
  94. package/dist/server/tools/get-debt-report.d.ts +44 -0
  95. package/dist/server/tools/get-debt-report.d.ts.map +1 -0
  96. package/dist/server/tools/get-debt-report.js +606 -0
  97. package/dist/server/tools/get-debt-report.js.map +1 -0
  98. package/dist/server/tools/get-entry-points.d.ts +79 -0
  99. package/dist/server/tools/get-entry-points.d.ts.map +1 -0
  100. package/dist/server/tools/get-entry-points.js +362 -0
  101. package/dist/server/tools/get-entry-points.js.map +1 -0
  102. package/dist/server/tools/get-public-api.d.ts +53 -0
  103. package/dist/server/tools/get-public-api.d.ts.map +1 -0
  104. package/dist/server/tools/get-public-api.js +218 -0
  105. package/dist/server/tools/get-public-api.js.map +1 -0
  106. package/dist/server/tools/get-savings-stats.d.ts.map +1 -1
  107. package/dist/server/tools/get-savings-stats.js +1 -3
  108. package/dist/server/tools/get-savings-stats.js.map +1 -1
  109. package/dist/server/tools/get-test-coverage-map.d.ts +66 -0
  110. package/dist/server/tools/get-test-coverage-map.d.ts.map +1 -0
  111. package/dist/server/tools/get-test-coverage-map.js +588 -0
  112. package/dist/server/tools/get-test-coverage-map.js.map +1 -0
  113. package/dist/server/tools/get-todos.d.ts +51 -0
  114. package/dist/server/tools/get-todos.d.ts.map +1 -0
  115. package/dist/server/tools/get-todos.js +180 -0
  116. package/dist/server/tools/get-todos.js.map +1 -0
  117. package/dist/server/tools/get-type-graph.d.ts +73 -0
  118. package/dist/server/tools/get-type-graph.d.ts.map +1 -0
  119. package/dist/server/tools/get-type-graph.js +437 -0
  120. package/dist/server/tools/get-type-graph.js.map +1 -0
  121. package/dist/server/tools/health-radar.d.ts +50 -0
  122. package/dist/server/tools/health-radar.d.ts.map +1 -0
  123. package/dist/server/tools/health-radar.js +426 -0
  124. package/dist/server/tools/health-radar.js.map +1 -0
  125. package/dist/server/tools/plan-refactoring.d.ts +74 -0
  126. package/dist/server/tools/plan-refactoring.d.ts.map +1 -0
  127. package/dist/server/tools/plan-refactoring.js +644 -0
  128. package/dist/server/tools/plan-refactoring.js.map +1 -0
  129. package/dist/server/tools/render-call-graph.d.ts +40 -0
  130. package/dist/server/tools/render-call-graph.d.ts.map +1 -0
  131. package/dist/server/tools/render-call-graph.js +215 -0
  132. package/dist/server/tools/render-call-graph.js.map +1 -0
  133. package/dist/server/tools/render-class-hierarchy.d.ts +42 -0
  134. package/dist/server/tools/render-class-hierarchy.d.ts.map +1 -0
  135. package/dist/server/tools/render-class-hierarchy.js +265 -0
  136. package/dist/server/tools/render-class-hierarchy.js.map +1 -0
  137. package/dist/server/tools/render-dep-matrix.d.ts +38 -0
  138. package/dist/server/tools/render-dep-matrix.d.ts.map +1 -0
  139. package/dist/server/tools/render-dep-matrix.js +186 -0
  140. package/dist/server/tools/render-dep-matrix.js.map +1 -0
  141. package/dist/server/tools/render-diagram.d.ts +47 -0
  142. package/dist/server/tools/render-diagram.d.ts.map +1 -0
  143. package/dist/server/tools/render-diagram.js +266 -0
  144. package/dist/server/tools/render-diagram.js.map +1 -0
  145. package/dist/server/tools/render-import-graph.d.ts +41 -0
  146. package/dist/server/tools/render-import-graph.d.ts.map +1 -0
  147. package/dist/server/tools/render-import-graph.js +158 -0
  148. package/dist/server/tools/render-import-graph.js.map +1 -0
  149. package/dist/server/tools/search-ast.d.ts +55 -0
  150. package/dist/server/tools/search-ast.d.ts.map +1 -0
  151. package/dist/server/tools/search-ast.js +279 -0
  152. package/dist/server/tools/search-ast.js.map +1 -0
  153. package/dist/server/tools/search-by-complexity.d.ts +92 -0
  154. package/dist/server/tools/search-by-complexity.d.ts.map +1 -0
  155. package/dist/server/tools/search-by-complexity.js +268 -0
  156. package/dist/server/tools/search-by-complexity.js.map +1 -0
  157. package/dist/server/tools/search-by-decorator.d.ts +48 -0
  158. package/dist/server/tools/search-by-decorator.d.ts.map +1 -0
  159. package/dist/server/tools/search-by-decorator.js +518 -0
  160. package/dist/server/tools/search-by-decorator.js.map +1 -0
  161. package/dist/server/tools/search-by-signature.d.ts +56 -0
  162. package/dist/server/tools/search-by-signature.d.ts.map +1 -0
  163. package/dist/server/tools/search-by-signature.js +200 -0
  164. package/dist/server/tools/search-by-signature.js.map +1 -0
  165. package/dist/ui/assets/BlastRadius-QdgESOL8.js +1 -0
  166. package/dist/ui/assets/{DependencyGraph-CDtBHM0U.js → DependencyGraph-BSMhzwWV.js} +6 -6
  167. package/dist/ui/assets/{NotFound-Cdt6X8pl.js → NotFound-CipFP_s1.js} +1 -1
  168. package/dist/ui/assets/RepoDetail-Dfp5z5Kq.js +1 -0
  169. package/dist/ui/assets/{RepoList-B9LaZvob.js → RepoList-BKtST3hB.js} +1 -1
  170. package/dist/ui/assets/{Search-CLqv2KGV.js → Search-DzhGDViy.js} +1 -1
  171. package/dist/ui/assets/{SymbolView-BlbDR1DU.js → SymbolView-ryVEwAHG.js} +1 -1
  172. package/dist/ui/assets/{index-DADf5y_L.css → index-Ny8gn9F0.css} +1 -1
  173. package/dist/ui/assets/{index-i3Q1XbEh.js → index-nX2chMqi.js} +6 -6
  174. package/dist/ui/assets/{useSearch-mbMk6-M1.js → useSearch-BnBCRKui.js} +1 -1
  175. package/dist/ui/index.html +2 -2
  176. package/dist/version.d.ts +1 -1
  177. package/dist/version.js +1 -1
  178. package/docs/dev/jcodemunch-gap-analysis.md +198 -0
  179. package/package.json +9 -1
  180. package/user-manual.md +2466 -0
  181. package/dist/ui/assets/BlastRadius-BDZWhEk-.js +0 -1
  182. package/dist/ui/assets/RepoDetail-M6WaYbZ3.js +0 -1
@@ -0,0 +1,518 @@
1
+ /**
2
+ * search-by-decorator.ts
3
+ *
4
+ * MCP tool: search_by_decorator
5
+ *
6
+ * Find all symbols (classes, methods, functions, properties) annotated with
7
+ * a specific decorator. Re-parses stored file content via tree-sitter to
8
+ * locate `decorator` AST nodes, then resolves each back to its parent symbol
9
+ * in the index.
10
+ *
11
+ * Three match modes:
12
+ * - exact (default) — decorator name exactly matches the query (case-sensitive)
13
+ * - contains — decorator name contains the query
14
+ * - prefix — decorator name starts with the query
15
+ *
16
+ * Parameter decorators (on function parameters) are excluded — they do not
17
+ * correspond to indexed symbols.
18
+ *
19
+ * Only files backed by a WASM grammar are searched. Regex-only handlers
20
+ * (Perl, Terraform, Protobuf, GraphQL, etc.) are silently skipped.
21
+ */
22
+ import { z } from 'zod';
23
+ import { openDatabase } from '../../core/db/schema.js';
24
+ import { buildMeta } from './_meta.js';
25
+ import { getHandler } from '../../handlers/handler-registry.js';
26
+ import { initParser, parseFile, isInitialized } from '../../core/parse-dispatcher.js';
27
+ export const name = 'search_by_decorator';
28
+ export const description = 'Find all symbols annotated with a specific decorator — e.g. all @Injectable ' +
29
+ 'classes, all @Get route handlers, all @Column properties. Re-parses stored ' +
30
+ 'file content via tree-sitter to locate decorator nodes and resolves each back ' +
31
+ 'to the decorated symbol in the index. ' +
32
+ '\n\nThree match modes:' +
33
+ '\n exact (default) — decorator name must exactly match (e.g. "Injectable")' +
34
+ '\n contains — decorator name contains the query (e.g. "inject" finds @Injectable)' +
35
+ '\n prefix — decorator name starts with the query (e.g. "Get" finds @Get, @GetMapping)' +
36
+ '\n\nExamples:' +
37
+ '\n decoratorName: "Injectable" — all @Injectable classes' +
38
+ '\n decoratorName: "Controller" — all @Controller route handlers' +
39
+ '\n decoratorName: "Column", mode: "prefix" — all @Column, @ColumnType decorators' +
40
+ '\n decoratorName: "test", mode: "contains" — anything with "test" in decorator name';
41
+ export const inputSchema = {
42
+ repoId: z.string().describe('Repository ID returned by index_folder or list_repos'),
43
+ decoratorName: z
44
+ .string()
45
+ .min(1)
46
+ .describe('Decorator name to search for — without the "@" prefix. ' +
47
+ 'Case-sensitive for exact/prefix modes, case-sensitive for contains mode.'),
48
+ matchMode: z
49
+ .enum(['exact', 'contains', 'prefix'])
50
+ .optional()
51
+ .describe('How to match the decorator name: "exact" (default) — name must equal query; ' +
52
+ '"contains" — name must contain query; "prefix" — name must start with query.'),
53
+ language: z
54
+ .string()
55
+ .optional()
56
+ .describe('Restrict search to files of a specific language ' +
57
+ '(e.g. "typescript", "javascript"). ' +
58
+ 'When omitted, all WASM-backed grammar files are searched.'),
59
+ filePath: z
60
+ .string()
61
+ .optional()
62
+ .describe('Restrict search to a specific file path or directory prefix'),
63
+ includeDecoratorText: z
64
+ .boolean()
65
+ .optional()
66
+ .describe('Include the full decorator text in each result (e.g. "@Injectable()" or ' +
67
+ '"@Column({ nullable: false })"). Default true.'),
68
+ limit: z
69
+ .number()
70
+ .int()
71
+ .positive()
72
+ .optional()
73
+ .describe('Maximum number of matches to return (default 50)'),
74
+ };
75
+ // ─── AST helpers ─────────────────────────────────────────────────────────────
76
+ /** Recursively collect all decorator nodes in the tree. */
77
+ function collectDecorators(node, results) {
78
+ if (node.type === 'decorator') {
79
+ results.push(node);
80
+ }
81
+ for (const child of node.children) {
82
+ collectDecorators(child, results);
83
+ }
84
+ }
85
+ /**
86
+ * Extract the decorator's name (without @) from a decorator AST node.
87
+ * Handles:
88
+ * @Foo → "Foo"
89
+ * @Foo() → "Foo"
90
+ * @Foo({ ... }) → "Foo"
91
+ * @Ns.Foo() → "Ns.Foo"
92
+ */
93
+ function extractDecoratorName(decoratorNode, source) {
94
+ for (const child of decoratorNode.children) {
95
+ // Skip the literal "@" token
96
+ if (child.type === '@')
97
+ continue;
98
+ if (child.type === 'comment')
99
+ continue;
100
+ if (child.type === 'identifier') {
101
+ return source.slice(child.startIndex, child.endIndex);
102
+ }
103
+ if (child.type === 'call_expression') {
104
+ // First child of call_expression is the function (callee)
105
+ const callee = child.children[0];
106
+ if (!callee)
107
+ return source.slice(child.startIndex, child.endIndex);
108
+ if (callee.type === 'identifier') {
109
+ return source.slice(callee.startIndex, callee.endIndex);
110
+ }
111
+ if (callee.type === 'member_expression') {
112
+ return source.slice(callee.startIndex, callee.endIndex);
113
+ }
114
+ return source.slice(callee.startIndex, callee.endIndex);
115
+ }
116
+ if (child.type === 'member_expression') {
117
+ return source.slice(child.startIndex, child.endIndex);
118
+ }
119
+ // Fallback: return whatever non-@ text follows
120
+ return source.slice(child.startIndex, child.endIndex).split('(')[0].trim();
121
+ }
122
+ return '';
123
+ }
124
+ /** Node types that are declaration containers (not parameter decorators). */
125
+ const DECLARATION_TYPES = new Set([
126
+ 'class_declaration',
127
+ 'abstract_class_declaration',
128
+ 'function_declaration',
129
+ 'method_definition',
130
+ 'public_field_definition',
131
+ 'property_definition',
132
+ 'lexical_declaration',
133
+ 'variable_declaration',
134
+ 'export_statement',
135
+ ]);
136
+ /** Node types that represent function parameter targets — skip these. */
137
+ const PARAM_TYPES = new Set([
138
+ 'required_parameter',
139
+ 'optional_parameter',
140
+ 'rest_pattern',
141
+ 'formal_parameters',
142
+ ]);
143
+ /**
144
+ * Given a decorator node, return the name of the symbol it decorates
145
+ * and an approximate symbol kind. Returns null if the parent is a
146
+ * parameter (not a symbol we index) or unrecognised.
147
+ *
148
+ * Tree-sitter TypeScript AST structure for decorators:
149
+ * - Class decorator: decorator.parent = export_statement | class_declaration
150
+ * - Method decorator: decorator.parent = class_body (sibling to method_definition)
151
+ * - Property decorator: decorator.parent = public_field_definition (child)
152
+ *
153
+ * Stacked method decorators each appear as siblings in class_body; we walk
154
+ * nextNamedSibling until we reach the method_definition.
155
+ */
156
+ function getDecoratedInfo(decoratorNode, source) {
157
+ const parent = decoratorNode.parent;
158
+ if (!parent)
159
+ return null;
160
+ // Skip parameter decorators
161
+ if (PARAM_TYPES.has(parent.type))
162
+ return null;
163
+ switch (parent.type) {
164
+ // ── Class decorator (exported class) ────────────────────────────────────
165
+ case 'export_statement': {
166
+ // Walk children to find the class or function declaration
167
+ for (const child of parent.children) {
168
+ if (['class_declaration', 'abstract_class_declaration'].includes(child.type)) {
169
+ const nameNode = child.children.find((c) => c.type === 'type_identifier');
170
+ if (nameNode) {
171
+ return {
172
+ name: source.slice(nameNode.startIndex, nameNode.endIndex),
173
+ kind: 'class',
174
+ parentNode: child,
175
+ };
176
+ }
177
+ }
178
+ if (child.type === 'function_declaration') {
179
+ const nameNode = child.children.find((c) => c.type === 'identifier');
180
+ if (nameNode) {
181
+ return {
182
+ name: source.slice(nameNode.startIndex, nameNode.endIndex),
183
+ kind: 'function',
184
+ parentNode: child,
185
+ };
186
+ }
187
+ }
188
+ }
189
+ // Fallback: class_declaration in the nextSibling chain
190
+ let next = decoratorNode.nextNamedSibling;
191
+ while (next && next.type === 'decorator')
192
+ next = next.nextNamedSibling;
193
+ if (next && ['class_declaration', 'abstract_class_declaration'].includes(next.type)) {
194
+ const nameNode = next.children.find((c) => c.type === 'type_identifier');
195
+ if (nameNode) {
196
+ return {
197
+ name: source.slice(nameNode.startIndex, nameNode.endIndex),
198
+ kind: 'class',
199
+ parentNode: next,
200
+ };
201
+ }
202
+ }
203
+ return null;
204
+ }
205
+ // ── Class decorator (non-exported class) ────────────────────────────────
206
+ case 'class_declaration':
207
+ case 'abstract_class_declaration': {
208
+ const nameNode = parent.children.find((c) => c.type === 'type_identifier');
209
+ if (!nameNode)
210
+ return null;
211
+ return {
212
+ name: source.slice(nameNode.startIndex, nameNode.endIndex),
213
+ kind: 'class',
214
+ parentNode: parent,
215
+ };
216
+ }
217
+ // ── Function decorator ───────────────────────────────────────────────────
218
+ case 'function_declaration': {
219
+ const nameNode = parent.children.find((c) => c.type === 'identifier');
220
+ if (!nameNode)
221
+ return null;
222
+ return {
223
+ name: source.slice(nameNode.startIndex, nameNode.endIndex),
224
+ kind: 'function',
225
+ parentNode: parent,
226
+ };
227
+ }
228
+ // ── Method decorator — decorator is a SIBLING inside class_body ─────────
229
+ //
230
+ // @Get('/') ← decorator, parent = class_body
231
+ // @UseGuards(...) ← decorator, parent = class_body (stacked)
232
+ // getUsers(): User[] {} ← method_definition, parent = class_body
233
+ //
234
+ case 'class_body': {
235
+ // Walk nextNamedSiblings to find the decorated method or property,
236
+ // skipping any intermediate stacked decorators.
237
+ let next = decoratorNode.nextNamedSibling;
238
+ while (next && next.type === 'decorator') {
239
+ next = next.nextNamedSibling;
240
+ }
241
+ if (!next)
242
+ return null;
243
+ if (next.type === 'method_definition') {
244
+ const nameNode = next.children.find((c) => ['property_identifier', 'identifier'].includes(c.type));
245
+ if (!nameNode)
246
+ return null;
247
+ const methodName = source.slice(nameNode.startIndex, nameNode.endIndex);
248
+ // Qualify with class name: class_body.parent = class_declaration
249
+ const classDecl = parent.parent;
250
+ if (classDecl && ['class_declaration', 'abstract_class_declaration'].includes(classDecl.type)) {
251
+ const classNameNode = classDecl.children.find((c) => c.type === 'type_identifier');
252
+ if (classNameNode) {
253
+ const className = source.slice(classNameNode.startIndex, classNameNode.endIndex);
254
+ return { name: `${className}.${methodName}`, kind: 'method', parentNode: next };
255
+ }
256
+ }
257
+ return { name: methodName, kind: 'method', parentNode: next };
258
+ }
259
+ // Stacked property definition (rare but handle it)
260
+ if (['public_field_definition', 'property_definition'].includes(next.type)) {
261
+ const nameNode = next.children.find((c) => ['property_identifier', 'identifier'].includes(c.type));
262
+ if (!nameNode)
263
+ return null;
264
+ const fieldName = source.slice(nameNode.startIndex, nameNode.endIndex);
265
+ const classDecl = parent.parent;
266
+ if (classDecl && ['class_declaration', 'abstract_class_declaration'].includes(classDecl.type)) {
267
+ const classNameNode = classDecl.children.find((c) => c.type === 'type_identifier');
268
+ if (classNameNode) {
269
+ const className = source.slice(classNameNode.startIndex, classNameNode.endIndex);
270
+ return { name: `${className}.${fieldName}`, kind: 'const', parentNode: next };
271
+ }
272
+ }
273
+ return { name: fieldName, kind: 'const', parentNode: next };
274
+ }
275
+ return null;
276
+ }
277
+ // ── Property decorator — decorator IS a child of public_field_definition ─
278
+ case 'public_field_definition':
279
+ case 'property_definition': {
280
+ const nameNode = parent.children.find((c) => ['property_identifier', 'identifier'].includes(c.type));
281
+ if (!nameNode)
282
+ return null;
283
+ const fieldName = source.slice(nameNode.startIndex, nameNode.endIndex);
284
+ // Qualify with class name
285
+ const classBody = parent.parent;
286
+ const classDecl = classBody?.parent;
287
+ if (classDecl && ['class_declaration', 'abstract_class_declaration'].includes(classDecl.type)) {
288
+ const classNameNode = classDecl.children.find((c) => c.type === 'type_identifier');
289
+ if (classNameNode) {
290
+ const className = source.slice(classNameNode.startIndex, classNameNode.endIndex);
291
+ return { name: `${className}.${fieldName}`, kind: 'const', parentNode: parent };
292
+ }
293
+ }
294
+ return { name: fieldName, kind: 'const', parentNode: parent };
295
+ }
296
+ // ── Standalone const/let decorator ──────────────────────────────────────
297
+ case 'lexical_declaration':
298
+ case 'variable_declaration': {
299
+ for (const child of parent.children) {
300
+ if (child.type === 'variable_declarator') {
301
+ const nameNode = child.children.find((c) => c.type === 'identifier');
302
+ if (nameNode) {
303
+ return {
304
+ name: source.slice(nameNode.startIndex, nameNode.endIndex),
305
+ kind: 'const',
306
+ parentNode: parent,
307
+ };
308
+ }
309
+ }
310
+ }
311
+ return null;
312
+ }
313
+ // ── Method decorator inside method_definition (grammar variant) ──────────
314
+ case 'method_definition': {
315
+ const nameNode = parent.children.find((c) => ['property_identifier', 'identifier', 'computed_property_name'].includes(c.type));
316
+ if (!nameNode)
317
+ return null;
318
+ const methodName = source.slice(nameNode.startIndex, nameNode.endIndex);
319
+ const classBody = parent.parent;
320
+ const classDecl = classBody?.parent;
321
+ if (classDecl && ['class_declaration', 'abstract_class_declaration'].includes(classDecl.type)) {
322
+ const classNameNode = classDecl.children.find((c) => c.type === 'type_identifier');
323
+ if (classNameNode) {
324
+ const className = source.slice(classNameNode.startIndex, classNameNode.endIndex);
325
+ return { name: `${className}.${methodName}`, kind: 'method', parentNode: parent };
326
+ }
327
+ }
328
+ return { name: methodName, kind: 'method', parentNode: parent };
329
+ }
330
+ default:
331
+ return null;
332
+ }
333
+ }
334
+ /** Count newlines in buf up to (not including) byteOffset. */
335
+ function byteOffsetToLine(buf, byteOffset) {
336
+ let line = 1;
337
+ const end = Math.min(byteOffset, buf.length);
338
+ for (let i = 0; i < end; i++) {
339
+ if (buf[i] === 0x0a)
340
+ line++;
341
+ }
342
+ return line;
343
+ }
344
+ /** Check whether a decorator name matches the query under the given mode. */
345
+ function nameMatches(decoratorName, query, mode) {
346
+ switch (mode) {
347
+ case 'exact': return decoratorName === query;
348
+ case 'contains': return decoratorName.includes(query);
349
+ case 'prefix': return decoratorName.startsWith(query);
350
+ }
351
+ }
352
+ // ─── Handler ──────────────────────────────────────────────────────────────────
353
+ export async function handler(args) {
354
+ const t0 = Date.now();
355
+ const { repoId, decoratorName, matchMode = 'exact', language, filePath, includeDecoratorText = true, limit = 50, } = args;
356
+ if (!decoratorName || decoratorName.trim().length === 0) {
357
+ return {
358
+ content: [{
359
+ type: 'text',
360
+ text: JSON.stringify({ error: 'decoratorName must be a non-empty string' }),
361
+ }],
362
+ isError: true,
363
+ };
364
+ }
365
+ const db = openDatabase(repoId);
366
+ try {
367
+ // ── Verify repo exists ─────────────────────────────────────────────────
368
+ const repoRow = db.prepare('SELECT id FROM repos WHERE id = ?').get(repoId);
369
+ if (!repoRow) {
370
+ return {
371
+ content: [{
372
+ type: 'text',
373
+ text: JSON.stringify({ error: `Repository not found: ${repoId}` }),
374
+ }],
375
+ isError: true,
376
+ };
377
+ }
378
+ // ── Resolve language filter to allowed extensions ──────────────────────
379
+ let allowedExtensions = null;
380
+ if (language) {
381
+ const langToExt = {
382
+ typescript: ['.ts', '.tsx'],
383
+ javascript: ['.js', '.jsx', '.mjs', '.cjs'],
384
+ python: ['.py'],
385
+ go: ['.go'],
386
+ rust: ['.rs'],
387
+ java: ['.java'],
388
+ kotlin: ['.kt', '.kts'],
389
+ csharp: ['.cs'],
390
+ cpp: ['.cpp', '.cc', '.cxx', '.hpp', '.hxx', '.hh'],
391
+ c: ['.c', '.h'],
392
+ php: ['.php'],
393
+ ruby: ['.rb'],
394
+ };
395
+ const exts = langToExt[language.toLowerCase()] ?? [];
396
+ allowedExtensions = new Set(exts);
397
+ }
398
+ // ── Query files with raw content ──────────────────────────────────────
399
+ const conditions = ['repo_id = @repoId', 'raw_content IS NOT NULL'];
400
+ const params = { repoId };
401
+ if (filePath) {
402
+ conditions.push('(path = @filePath OR path LIKE @filePathPrefix)');
403
+ params['filePath'] = filePath;
404
+ params['filePathPrefix'] = `${filePath}%`;
405
+ }
406
+ const fileRows = db.prepare(`SELECT path, raw_content FROM files WHERE ${conditions.join(' AND ')} ORDER BY path`).all(params);
407
+ // ── Initialize tree-sitter (idempotent) ───────────────────────────────
408
+ if (!isInitialized()) {
409
+ await initParser();
410
+ }
411
+ // ── Walk files and collect matches ────────────────────────────────────
412
+ const matches = [];
413
+ const skippedFiles = [];
414
+ let truncated = false;
415
+ for (const row of fileRows) {
416
+ if (!row.raw_content || truncated)
417
+ break;
418
+ const fPath = row.path;
419
+ const content = row.raw_content;
420
+ // ── Extension filter ───────────────────────────────────────────────
421
+ const ext = fPath.includes('.')
422
+ ? `.${fPath.split('.').pop().toLowerCase()}`
423
+ : '';
424
+ if (allowedExtensions && !allowedExtensions.has(ext))
425
+ continue;
426
+ // ── Require WASM-backed grammar ────────────────────────────────────
427
+ const h = getHandler(fPath);
428
+ if (!h || h.grammarPath() === null) {
429
+ if (h)
430
+ skippedFiles.push(fPath);
431
+ continue;
432
+ }
433
+ // ── Parse file ────────────────────────────────────────────────────
434
+ let tree;
435
+ try {
436
+ tree = await parseFile(content, h);
437
+ }
438
+ catch {
439
+ skippedFiles.push(fPath);
440
+ continue;
441
+ }
442
+ const sourceStr = content.toString('utf8');
443
+ // ── Collect and filter decorator nodes ────────────────────────────
444
+ const decorators = [];
445
+ collectDecorators(tree.rootNode, decorators);
446
+ // Pre-load symbols for this file to enable fast cross-referencing
447
+ const fileSymbols = db.prepare(`SELECT id, name, kind, start_byte, signature, summary
448
+ FROM symbols
449
+ WHERE repo_id = ? AND file_path = ?`).all(repoId, fPath);
450
+ // Build a map from name (lower) → first matching symbol for quick lookup
451
+ const symbolByName = new Map();
452
+ for (const sym of fileSymbols) {
453
+ symbolByName.set(sym.name, sym);
454
+ }
455
+ for (const decoratorNode of decorators) {
456
+ const dName = extractDecoratorName(decoratorNode, sourceStr);
457
+ if (!dName)
458
+ continue;
459
+ if (!nameMatches(dName, decoratorName, matchMode))
460
+ continue;
461
+ // Get the decorated symbol info from the AST
462
+ const decorated = getDecoratedInfo(decoratorNode, sourceStr);
463
+ if (!decorated)
464
+ continue;
465
+ // Cross-reference with the symbols table
466
+ const dbSymbol = symbolByName.get(decorated.name);
467
+ const startLine = byteOffsetToLine(content, decoratorNode.startIndex);
468
+ const dText = includeDecoratorText
469
+ ? sourceStr.slice(decoratorNode.startIndex, decoratorNode.endIndex).replace(/\s+/g, ' ').trim()
470
+ : undefined;
471
+ matches.push({
472
+ symbolId: dbSymbol?.id,
473
+ symbolName: decorated.name,
474
+ symbolKind: dbSymbol?.kind ?? decorated.kind,
475
+ filePath: fPath,
476
+ startLine,
477
+ decoratorName: dName,
478
+ decoratorText: dText,
479
+ signature: dbSymbol?.signature,
480
+ summary: dbSymbol?.summary,
481
+ });
482
+ if (matches.length >= limit) {
483
+ truncated = true;
484
+ break;
485
+ }
486
+ }
487
+ }
488
+ // ── Token estimate ─────────────────────────────────────────────────────
489
+ const responseBytes = matches.reduce((sum, m) => sum +
490
+ m.symbolName.length +
491
+ m.filePath.length +
492
+ (m.decoratorText?.length ?? 0) +
493
+ (m.signature?.length ?? 0) +
494
+ (m.summary?.length ?? 0) +
495
+ 60, 0);
496
+ const tokenEstimate = Math.ceil(responseBytes / 4);
497
+ return {
498
+ content: [{
499
+ type: 'text',
500
+ text: JSON.stringify({
501
+ matches,
502
+ totalFound: matches.length,
503
+ truncated,
504
+ decoratorQueried: decoratorName,
505
+ matchMode,
506
+ filesSearched: fileRows.length - skippedFiles.length,
507
+ skippedFiles: skippedFiles.length > 0 ? skippedFiles : undefined,
508
+ _tokenEstimate: tokenEstimate,
509
+ _meta: buildMeta({ timingMs: Date.now() - t0 }),
510
+ }, null, 2),
511
+ }],
512
+ };
513
+ }
514
+ finally {
515
+ db.close();
516
+ }
517
+ }
518
+ //# sourceMappingURL=search-by-decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-by-decorator.js","sourceRoot":"","sources":["../../../src/server/tools/search-by-decorator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * search-by-signature.ts
3
+ *
4
+ * MCP tool: search_by_signature
5
+ *
6
+ * Find all symbols whose type signature matches a pattern — e.g. all functions
7
+ * returning `Promise<void>`, all functions accepting a `Request` parameter,
8
+ * all async functions.
9
+ *
10
+ * Implementation: pure SQL against the `symbols.signature` column.
11
+ * Three modes:
12
+ * - contains → WHERE signature LIKE '%pattern%' (default)
13
+ * - startsWith → WHERE signature LIKE 'pattern%'
14
+ * - regex → user-defined REGEXP function via better-sqlite3
15
+ *
16
+ * No AST re-parsing needed — signatures are stored as one-line strings.
17
+ */
18
+ import { z } from 'zod';
19
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
20
+ export declare const name = "search_by_signature";
21
+ export declare const description: string;
22
+ export declare const inputSchema: {
23
+ repoId: z.ZodString;
24
+ pattern: z.ZodString;
25
+ mode: z.ZodOptional<z.ZodEnum<{
26
+ startsWith: "startsWith";
27
+ contains: "contains";
28
+ regex: "regex";
29
+ }>>;
30
+ kind: z.ZodOptional<z.ZodEnum<{
31
+ function: "function";
32
+ method: "method";
33
+ class: "class";
34
+ const: "const";
35
+ type: "type";
36
+ interface: "interface";
37
+ enum: "enum";
38
+ component: "component";
39
+ composable: "composable";
40
+ hook: "hook";
41
+ route: "route";
42
+ decorator: "decorator";
43
+ middleware: "middleware";
44
+ }>>;
45
+ filePath: z.ZodOptional<z.ZodString>;
46
+ limit: z.ZodOptional<z.ZodNumber>;
47
+ };
48
+ export declare function handler(args: {
49
+ repoId: string;
50
+ pattern: string;
51
+ mode?: 'contains' | 'startsWith' | 'regex';
52
+ kind?: string;
53
+ filePath?: string;
54
+ limit?: number;
55
+ }): Promise<CallToolResult>;
56
+ //# sourceMappingURL=search-by-signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-by-signature.d.ts","sourceRoot":"","sources":["../../../src/server/tools/search-by-signature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAIzE,eAAO,MAAM,IAAI,wBAAwB,CAAC;AAE1C,eAAO,MAAM,WAAW,QAYkD,CAAC;AAE3E,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;CA8BvB,CAAC;AAgCF,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0I1B"}