@side-quest/kit 0.0.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 (127) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +54 -352
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +156 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +8 -2509
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/ast/index.d.ts +11 -0
  12. package/dist/lib/ast/index.d.ts.map +1 -0
  13. package/dist/lib/ast/index.js +15 -0
  14. package/dist/lib/ast/index.js.map +1 -0
  15. package/dist/lib/ast/languages.d.ts +55 -0
  16. package/dist/lib/ast/languages.d.ts.map +1 -0
  17. package/dist/lib/ast/languages.js +146 -0
  18. package/dist/lib/ast/languages.js.map +1 -0
  19. package/dist/lib/ast/pattern.d.ts +84 -0
  20. package/dist/lib/ast/pattern.d.ts.map +1 -0
  21. package/dist/lib/ast/pattern.js +268 -0
  22. package/dist/lib/ast/pattern.js.map +1 -0
  23. package/dist/lib/ast/searcher.d.ts +89 -0
  24. package/dist/lib/ast/searcher.d.ts.map +1 -0
  25. package/dist/lib/ast/searcher.js +316 -0
  26. package/dist/lib/ast/searcher.js.map +1 -0
  27. package/dist/lib/ast/types.d.ts +93 -0
  28. package/dist/lib/ast/types.d.ts.map +1 -0
  29. package/dist/lib/ast/types.js +23 -0
  30. package/dist/lib/ast/types.js.map +1 -0
  31. package/dist/lib/commands/callers.d.ts +20 -0
  32. package/dist/lib/commands/callers.d.ts.map +1 -0
  33. package/dist/lib/commands/callers.js +162 -0
  34. package/dist/lib/commands/callers.js.map +1 -0
  35. package/dist/lib/commands/find.d.ts +15 -0
  36. package/dist/lib/commands/find.d.ts.map +1 -0
  37. package/dist/lib/commands/find.js +113 -0
  38. package/dist/lib/commands/find.js.map +1 -0
  39. package/dist/lib/commands/overview.d.ts +6 -0
  40. package/dist/lib/commands/overview.d.ts.map +1 -0
  41. package/dist/lib/commands/overview.js +52 -0
  42. package/dist/lib/commands/overview.js.map +1 -0
  43. package/dist/lib/commands/prime.d.ts +16 -0
  44. package/dist/lib/commands/prime.d.ts.map +1 -0
  45. package/dist/lib/commands/prime.js +168 -0
  46. package/dist/lib/commands/prime.js.map +1 -0
  47. package/dist/lib/commands/search.d.ts +20 -0
  48. package/dist/lib/commands/search.d.ts.map +1 -0
  49. package/dist/lib/commands/search.js +111 -0
  50. package/dist/lib/commands/search.js.map +1 -0
  51. package/dist/lib/errors.d.ts +80 -0
  52. package/dist/lib/errors.d.ts.map +1 -0
  53. package/dist/lib/errors.js +189 -0
  54. package/dist/lib/errors.js.map +1 -0
  55. package/dist/lib/formatters/output.d.ts +5 -0
  56. package/dist/lib/formatters/output.d.ts.map +1 -0
  57. package/dist/lib/formatters/output.js +5 -0
  58. package/dist/lib/formatters/output.js.map +1 -0
  59. package/dist/lib/formatters.d.ts +29 -0
  60. package/dist/lib/formatters.d.ts.map +1 -0
  61. package/dist/lib/formatters.js +141 -0
  62. package/dist/lib/formatters.js.map +1 -0
  63. package/dist/lib/index-tools.d.ts +108 -0
  64. package/dist/lib/index-tools.d.ts.map +1 -0
  65. package/dist/lib/index-tools.js +311 -0
  66. package/dist/lib/index-tools.js.map +1 -0
  67. package/dist/lib/index.d.ts +21 -0
  68. package/dist/lib/index.d.ts.map +1 -0
  69. package/dist/lib/index.js +42 -0
  70. package/dist/lib/index.js.map +1 -0
  71. package/dist/lib/kit-wrapper.d.ts +70 -0
  72. package/dist/lib/kit-wrapper.d.ts.map +1 -0
  73. package/dist/lib/kit-wrapper.js +462 -0
  74. package/dist/lib/kit-wrapper.js.map +1 -0
  75. package/dist/lib/logger.d.ts +28 -0
  76. package/dist/lib/logger.d.ts.map +1 -0
  77. package/dist/lib/logger.js +39 -0
  78. package/dist/lib/logger.js.map +1 -0
  79. package/dist/lib/types.d.ts +179 -0
  80. package/dist/lib/types.d.ts.map +1 -0
  81. package/dist/lib/types.js +48 -0
  82. package/dist/lib/types.js.map +1 -0
  83. package/dist/lib/utils/args.d.ts +40 -0
  84. package/dist/lib/utils/args.d.ts.map +1 -0
  85. package/dist/lib/utils/args.js +58 -0
  86. package/dist/lib/utils/args.js.map +1 -0
  87. package/dist/lib/utils/git.d.ts +23 -0
  88. package/dist/lib/utils/git.d.ts.map +1 -0
  89. package/dist/lib/utils/git.js +50 -0
  90. package/dist/lib/utils/git.js.map +1 -0
  91. package/dist/lib/utils/index-parser.d.ts +155 -0
  92. package/dist/lib/utils/index-parser.d.ts.map +1 -0
  93. package/dist/lib/utils/index-parser.js +252 -0
  94. package/dist/lib/utils/index-parser.js.map +1 -0
  95. package/dist/lib/validators.d.ts +138 -0
  96. package/dist/lib/validators.d.ts.map +1 -0
  97. package/dist/lib/validators.js +302 -0
  98. package/dist/lib/validators.js.map +1 -0
  99. package/dist/mcp/index.d.ts +19 -0
  100. package/dist/mcp/index.d.ts.map +1 -0
  101. package/dist/mcp/index.js +769 -0
  102. package/dist/mcp/index.js.map +1 -0
  103. package/package.json +5 -2
  104. package/src/cli.ts +170 -0
  105. package/src/lib/ast/index.ts +32 -0
  106. package/src/lib/ast/languages.ts +172 -0
  107. package/src/lib/ast/pattern.ts +299 -0
  108. package/src/lib/ast/searcher.ts +381 -0
  109. package/src/lib/ast/types.ts +99 -0
  110. package/src/lib/commands/callers.ts +226 -0
  111. package/src/lib/commands/find.ts +159 -0
  112. package/src/lib/commands/overview.ts +73 -0
  113. package/src/lib/commands/prime.ts +271 -0
  114. package/src/lib/commands/search.ts +146 -0
  115. package/src/lib/errors.ts +221 -0
  116. package/src/lib/formatters/output.ts +9 -0
  117. package/src/lib/formatters.ts +189 -0
  118. package/src/lib/index-tools.ts +471 -0
  119. package/src/lib/index.ts +122 -0
  120. package/src/lib/kit-wrapper.ts +675 -0
  121. package/src/lib/logger.ts +57 -0
  122. package/src/lib/types.ts +228 -0
  123. package/src/lib/utils/args.ts +72 -0
  124. package/src/lib/utils/git.ts +65 -0
  125. package/src/lib/utils/index-parser.ts +350 -0
  126. package/src/lib/validators.ts +437 -0
  127. package/src/mcp/index.ts +144 -79
@@ -0,0 +1,89 @@
1
+ /**
2
+ * AST Searcher
3
+ *
4
+ * Searches files using tree-sitter AST patterns.
5
+ * Ported from Kit's ASTSearcher class in ast_search.py.
6
+ *
7
+ * Performance optimizations:
8
+ * - Uses fs/promises for non-blocking I/O
9
+ * - Parses files in parallel chunks to maximize throughput
10
+ */
11
+ import { type ASTSearchOptions, type ASTSearchResult } from './types.js';
12
+ /**
13
+ * ASTSearcher performs AST-based code search using tree-sitter.
14
+ *
15
+ * It traverses the file system, parses supported files, and matches
16
+ * AST nodes against the given pattern.
17
+ */
18
+ export declare class ASTSearcher {
19
+ private readonly repoPath;
20
+ /**
21
+ * Create a new AST searcher.
22
+ *
23
+ * @param repoPath - Repository path to search (defaults to KIT_DEFAULT_PATH or cwd)
24
+ */
25
+ constructor(repoPath?: string);
26
+ /**
27
+ * Search for AST patterns in the repository.
28
+ *
29
+ * Files are parsed in parallel chunks for better performance.
30
+ *
31
+ * @param options - Search options
32
+ * @returns Search results with matching AST nodes
33
+ */
34
+ searchPattern(options: ASTSearchOptions): Promise<ASTSearchResult>;
35
+ /**
36
+ * Get all files matching the pattern.
37
+ *
38
+ * @param filePattern - Optional glob pattern to filter files
39
+ * @returns Array of absolute file paths
40
+ */
41
+ private getMatchingFiles;
42
+ /**
43
+ * Recursively walk directory and collect matching files.
44
+ * Uses async fs methods to avoid blocking the event loop.
45
+ */
46
+ private walkDirectory;
47
+ /**
48
+ * Check if a file matches the given pattern.
49
+ * Uses Bun.Glob for proper glob pattern matching.
50
+ */
51
+ private matchesFilePattern;
52
+ /**
53
+ * Search a single file for pattern matches.
54
+ *
55
+ * @param filePath - Absolute path to the file
56
+ * @param pattern - AST pattern to match
57
+ * @returns Array of matches found in the file
58
+ */
59
+ private searchFile;
60
+ /**
61
+ * Recursively search AST nodes for pattern matches.
62
+ */
63
+ private searchNode;
64
+ /**
65
+ * Create an ASTMatch from a matching node.
66
+ */
67
+ private createMatch;
68
+ /**
69
+ * Get context information about a matched node.
70
+ */
71
+ private getContext;
72
+ /**
73
+ * Get the name of a named node (function, class, etc.).
74
+ */
75
+ private getNodeName;
76
+ /**
77
+ * Check if a node type is a function.
78
+ */
79
+ private isFunctionNode;
80
+ /**
81
+ * Check if a node type is a class.
82
+ */
83
+ private isClassNode;
84
+ /**
85
+ * Truncate text to maximum length.
86
+ */
87
+ private truncateText;
88
+ }
89
+ //# sourceMappingURL=searcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/searcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,EAGN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAEpB,MAAM,YAAY,CAAA;AA0CnB;;;;;GAKG;AACH,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IAEjC;;;;OAIG;gBACS,QAAQ,CAAC,EAAE,MAAM;IAI7B;;;;;;;OAOG;IACG,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA8CxE;;;;;OAKG;YACW,gBAAgB;IAM9B;;;OAGG;YACW,aAAa;IAiE3B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;OAMG;YACW,UAAU;IAmBxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAsBlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,YAAY;CAIpB"}
@@ -0,0 +1,316 @@
1
+ /**
2
+ * AST Searcher
3
+ *
4
+ * Searches files using tree-sitter AST patterns.
5
+ * Ported from Kit's ASTSearcher class in ast_search.py.
6
+ *
7
+ * Performance optimizations:
8
+ * - Uses fs/promises for non-blocking I/O
9
+ * - Parses files in parallel chunks to maximize throughput
10
+ */
11
+ import { readdir, readFile, stat } from 'node:fs/promises';
12
+ import { join, relative } from 'node:path';
13
+ import { processInParallelChunks } from '@side-quest/core/concurrency';
14
+ import { getAstLogger } from '../logger.js';
15
+ import { getDefaultKitPath } from '../types.js';
16
+ import { detectLanguage, getParser, isSupported } from './languages.js';
17
+ import { ASTPattern } from './pattern.js';
18
+ import { SearchMode, } from './types.js';
19
+ /**
20
+ * Maximum file size to parse (5MB).
21
+ * Larger files are skipped to prevent memory issues.
22
+ */
23
+ const MAX_FILE_SIZE = 5 * 1024 * 1024;
24
+ /**
25
+ * Maximum text length to include in match results.
26
+ */
27
+ const MAX_TEXT_LENGTH = 500;
28
+ /**
29
+ * Number of files to parse in parallel.
30
+ * Balances throughput vs memory usage.
31
+ */
32
+ const PARALLEL_CHUNK_SIZE = 10;
33
+ /**
34
+ * Directories to skip during traversal.
35
+ */
36
+ const SKIP_DIRS = new Set([
37
+ 'node_modules',
38
+ '.git',
39
+ '.svn',
40
+ '.hg',
41
+ '__pycache__',
42
+ '.pytest_cache',
43
+ '.mypy_cache',
44
+ 'dist',
45
+ 'build',
46
+ '.next',
47
+ '.nuxt',
48
+ 'coverage',
49
+ '.coverage',
50
+ 'venv',
51
+ '.venv',
52
+ 'env',
53
+ '.env',
54
+ ]);
55
+ /**
56
+ * ASTSearcher performs AST-based code search using tree-sitter.
57
+ *
58
+ * It traverses the file system, parses supported files, and matches
59
+ * AST nodes against the given pattern.
60
+ */
61
+ export class ASTSearcher {
62
+ repoPath;
63
+ /**
64
+ * Create a new AST searcher.
65
+ *
66
+ * @param repoPath - Repository path to search (defaults to KIT_DEFAULT_PATH or cwd)
67
+ */
68
+ constructor(repoPath) {
69
+ this.repoPath = repoPath ?? getDefaultKitPath();
70
+ }
71
+ /**
72
+ * Search for AST patterns in the repository.
73
+ *
74
+ * Files are parsed in parallel chunks for better performance.
75
+ *
76
+ * @param options - Search options
77
+ * @returns Search results with matching AST nodes
78
+ */
79
+ async searchPattern(options) {
80
+ const { pattern, mode = SearchMode.SIMPLE, filePattern, maxResults = 100, } = options;
81
+ const astPattern = new ASTPattern(pattern, mode);
82
+ // Get all files to search (async directory traversal)
83
+ const files = await this.getMatchingFiles(filePattern);
84
+ // Debug logging for MCP issues
85
+ const logger = getAstLogger();
86
+ logger.debug('File search results', {
87
+ fileCount: files.length,
88
+ repoPath: this.repoPath,
89
+ filePattern,
90
+ firstFiles: files.slice(0, 3),
91
+ });
92
+ // Process files in parallel chunks using core utility
93
+ const matches = await processInParallelChunks({
94
+ items: files,
95
+ chunkSize: PARALLEL_CHUNK_SIZE,
96
+ maxResults,
97
+ processor: (filePath) => this.searchFile(filePath, astPattern),
98
+ onError: (filePath, error) => {
99
+ logger.error('Error parsing file', {
100
+ filePath,
101
+ error: error.message,
102
+ });
103
+ return [];
104
+ },
105
+ });
106
+ return {
107
+ count: matches.length,
108
+ matches,
109
+ pattern,
110
+ mode,
111
+ path: this.repoPath,
112
+ };
113
+ }
114
+ /**
115
+ * Get all files matching the pattern.
116
+ *
117
+ * @param filePattern - Optional glob pattern to filter files
118
+ * @returns Array of absolute file paths
119
+ */
120
+ async getMatchingFiles(filePattern) {
121
+ const files = [];
122
+ await this.walkDirectory(this.repoPath, files, filePattern);
123
+ return files;
124
+ }
125
+ /**
126
+ * Recursively walk directory and collect matching files.
127
+ * Uses async fs methods to avoid blocking the event loop.
128
+ */
129
+ async walkDirectory(dir, files, filePattern) {
130
+ const logger = getAstLogger();
131
+ let entries;
132
+ try {
133
+ entries = await readdir(dir);
134
+ }
135
+ catch (error) {
136
+ // Directory doesn't exist or can't be read
137
+ logger.warn('Failed to read directory', {
138
+ dir,
139
+ error: error instanceof Error ? error.message : String(error),
140
+ });
141
+ return;
142
+ }
143
+ // Process entries in parallel for faster traversal
144
+ await Promise.all(entries.map(async (entry) => {
145
+ // Skip hidden and ignored directories
146
+ if (SKIP_DIRS.has(entry) || entry.startsWith('.'))
147
+ return;
148
+ const fullPath = join(dir, entry);
149
+ let stats;
150
+ try {
151
+ stats = await stat(fullPath);
152
+ }
153
+ catch (error) {
154
+ logger.debug('Failed to stat entry', {
155
+ path: fullPath,
156
+ error: error instanceof Error ? error.message : String(error),
157
+ });
158
+ return;
159
+ }
160
+ if (stats.isDirectory()) {
161
+ await this.walkDirectory(fullPath, files, filePattern);
162
+ }
163
+ else if (stats.isFile()) {
164
+ // Skip large files
165
+ if (stats.size > MAX_FILE_SIZE) {
166
+ logger.warn('Skipping large file', {
167
+ path: fullPath,
168
+ size: stats.size,
169
+ maxSize: MAX_FILE_SIZE,
170
+ });
171
+ return;
172
+ }
173
+ // Check if file is supported for parsing
174
+ if (!isSupported(fullPath))
175
+ return;
176
+ // Apply file pattern filter if provided
177
+ if (filePattern && !this.matchesFilePattern(fullPath, filePattern)) {
178
+ return;
179
+ }
180
+ files.push(fullPath);
181
+ }
182
+ }));
183
+ }
184
+ /**
185
+ * Check if a file matches the given pattern.
186
+ * Uses Bun.Glob for proper glob pattern matching.
187
+ */
188
+ matchesFilePattern(filePath, pattern) {
189
+ const relativePath = relative(this.repoPath, filePath);
190
+ // Use Bun.Glob for proper glob matching
191
+ const glob = new Bun.Glob(pattern);
192
+ return glob.match(relativePath);
193
+ }
194
+ /**
195
+ * Search a single file for pattern matches.
196
+ *
197
+ * @param filePath - Absolute path to the file
198
+ * @param pattern - AST pattern to match
199
+ * @returns Array of matches found in the file
200
+ */
201
+ async searchFile(filePath, pattern) {
202
+ const language = detectLanguage(filePath);
203
+ if (!language)
204
+ return [];
205
+ const parser = await getParser(language);
206
+ const source = await readFile(filePath, 'utf8');
207
+ const tree = parser.parse(source);
208
+ // Handle parse failure
209
+ if (!tree)
210
+ return [];
211
+ const matches = [];
212
+ this.searchNode(tree.rootNode, source, pattern, filePath, matches);
213
+ return matches;
214
+ }
215
+ /**
216
+ * Recursively search AST nodes for pattern matches.
217
+ */
218
+ searchNode(node, source, pattern, filePath, matches) {
219
+ // Check if this node matches the pattern
220
+ if (pattern.matches(node, source)) {
221
+ const match = this.createMatch(node, source, filePath);
222
+ matches.push(match);
223
+ }
224
+ // Recurse into children
225
+ for (let i = 0; i < node.childCount; i++) {
226
+ const child = node.child(i);
227
+ if (child) {
228
+ this.searchNode(child, source, pattern, filePath, matches);
229
+ }
230
+ }
231
+ }
232
+ /**
233
+ * Create an ASTMatch from a matching node.
234
+ */
235
+ createMatch(node, source, filePath) {
236
+ return {
237
+ file: relative(this.repoPath, filePath),
238
+ line: node.startPosition.row + 1,
239
+ column: node.startPosition.column,
240
+ nodeType: node.type,
241
+ text: this.truncateText(source.substring(node.startIndex, node.endIndex)),
242
+ context: this.getContext(node, source),
243
+ };
244
+ }
245
+ /**
246
+ * Get context information about a matched node.
247
+ */
248
+ getContext(node, source) {
249
+ const context = { nodeType: node.type };
250
+ // Walk up the tree to find parent function or class
251
+ let parent = node.parent;
252
+ while (parent) {
253
+ if (this.isFunctionNode(parent.type)) {
254
+ context.parentFunction = this.getNodeName(parent, source);
255
+ break;
256
+ }
257
+ if (this.isClassNode(parent.type)) {
258
+ context.parentClass = this.getNodeName(parent, source);
259
+ break;
260
+ }
261
+ parent = parent.parent;
262
+ }
263
+ return context;
264
+ }
265
+ /**
266
+ * Get the name of a named node (function, class, etc.).
267
+ */
268
+ getNodeName(node, source) {
269
+ // Try named children first
270
+ const nameChild = node.childForFieldName('name');
271
+ if (nameChild) {
272
+ return source.substring(nameChild.startIndex, nameChild.endIndex);
273
+ }
274
+ // Look for identifier children
275
+ for (let i = 0; i < node.childCount; i++) {
276
+ const child = node.child(i);
277
+ if (child &&
278
+ (child.type === 'identifier' || child.type === 'type_identifier')) {
279
+ return source.substring(child.startIndex, child.endIndex);
280
+ }
281
+ }
282
+ return undefined;
283
+ }
284
+ /**
285
+ * Check if a node type is a function.
286
+ */
287
+ isFunctionNode(type) {
288
+ return [
289
+ 'function_declaration',
290
+ 'function_definition',
291
+ 'function_expression',
292
+ 'arrow_function',
293
+ 'method_definition',
294
+ 'generator_function_declaration',
295
+ ].includes(type);
296
+ }
297
+ /**
298
+ * Check if a node type is a class.
299
+ */
300
+ isClassNode(type) {
301
+ return [
302
+ 'class_declaration',
303
+ 'class_definition',
304
+ 'class_expression',
305
+ ].includes(type);
306
+ }
307
+ /**
308
+ * Truncate text to maximum length.
309
+ */
310
+ truncateText(text) {
311
+ if (text.length <= MAX_TEXT_LENGTH)
312
+ return text;
313
+ return `${text.slice(0, MAX_TEXT_LENGTH - 3)}...`;
314
+ }
315
+ }
316
+ //# sourceMappingURL=searcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../../src/lib/ast/searcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * AST Search Types
3
+ *
4
+ * Type definitions for AST-based code search using tree-sitter.
5
+ */
6
+ /**
7
+ * Search mode for AST patterns.
8
+ *
9
+ * - `simple`: Natural language patterns like "async function", "class"
10
+ * - `pattern`: JSON object criteria like {"type": "function_declaration"}
11
+ */
12
+ export declare enum SearchMode {
13
+ /** Natural language patterns: "async function", "class", "try" */
14
+ SIMPLE = "simple",
15
+ /** JSON criteria: {"type": "function_declaration", "async": true} */
16
+ PATTERN = "pattern"
17
+ }
18
+ /**
19
+ * A single AST match found during search.
20
+ */
21
+ export interface ASTMatch {
22
+ /** File path relative to repository root */
23
+ file: string;
24
+ /** Line number (1-indexed) */
25
+ line: number;
26
+ /** Column number (0-indexed) */
27
+ column: number;
28
+ /** Tree-sitter node type (e.g., "function_declaration") */
29
+ nodeType: string;
30
+ /** Matched source text (truncated to 500 chars) */
31
+ text: string;
32
+ /** Context about where the match was found */
33
+ context: ASTMatchContext;
34
+ }
35
+ /**
36
+ * Context information for an AST match.
37
+ */
38
+ export interface ASTMatchContext {
39
+ /** The tree-sitter node type */
40
+ nodeType: string;
41
+ /** Parent function name, if match is inside a function */
42
+ parentFunction?: string;
43
+ /** Parent class name, if match is inside a class */
44
+ parentClass?: string;
45
+ }
46
+ /**
47
+ * Options for AST search.
48
+ */
49
+ export interface ASTSearchOptions {
50
+ /** Search pattern (natural language or JSON depending on mode) */
51
+ pattern: string;
52
+ /** Search mode: 'simple' or 'pattern' */
53
+ mode?: SearchMode;
54
+ /** File glob pattern (default: all supported files) */
55
+ filePattern?: string;
56
+ /** Repository path to search */
57
+ path?: string;
58
+ /** Maximum results to return (default: 100) */
59
+ maxResults?: number;
60
+ }
61
+ /**
62
+ * Result of an AST search operation.
63
+ */
64
+ export interface ASTSearchResult {
65
+ /** Number of matches found */
66
+ count: number;
67
+ /** Array of AST matches */
68
+ matches: ASTMatch[];
69
+ /** The search pattern used */
70
+ pattern: string;
71
+ /** The search mode used */
72
+ mode: SearchMode;
73
+ /** Repository path searched */
74
+ path: string;
75
+ }
76
+ /**
77
+ * Criteria for pattern mode matching.
78
+ */
79
+ export interface PatternCriteria {
80
+ /** Tree-sitter node type to match */
81
+ type?: string;
82
+ /** Whether node should be async */
83
+ async?: boolean;
84
+ /** Text that must appear in the node */
85
+ textMatch?: string;
86
+ /** Name of the symbol to match */
87
+ name?: string;
88
+ }
89
+ /**
90
+ * Timeout for AST search operations (ms).
91
+ */
92
+ export declare const AST_SEARCH_TIMEOUT = 60000;
93
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,oBAAY,UAAU;IACrB,kEAAkE;IAClE,MAAM,WAAW;IACjB,qEAAqE;IACrE,OAAO,YAAY;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;IAChB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,OAAO,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAA;IACnB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,IAAI,EAAE,UAAU,CAAA;IAChB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAQ,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * AST Search Types
3
+ *
4
+ * Type definitions for AST-based code search using tree-sitter.
5
+ */
6
+ /**
7
+ * Search mode for AST patterns.
8
+ *
9
+ * - `simple`: Natural language patterns like "async function", "class"
10
+ * - `pattern`: JSON object criteria like {"type": "function_declaration"}
11
+ */
12
+ export var SearchMode;
13
+ (function (SearchMode) {
14
+ /** Natural language patterns: "async function", "class", "try" */
15
+ SearchMode["SIMPLE"] = "simple";
16
+ /** JSON criteria: {"type": "function_declaration", "async": true} */
17
+ SearchMode["PATTERN"] = "pattern";
18
+ })(SearchMode || (SearchMode = {}));
19
+ /**
20
+ * Timeout for AST search operations (ms).
21
+ */
22
+ export const AST_SEARCH_TIMEOUT = 60000;
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/ast/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,CAAN,IAAY,UAKX;AALD,WAAY,UAAU;IACrB,kEAAkE;IAClE,+BAAiB,CAAA;IACjB,qEAAqE;IACrE,iCAAmB,CAAA;AACpB,CAAC,EALW,UAAU,KAAV,UAAU,QAKrB;AA8ED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Callers command - Find who calls a function
3
+ *
4
+ * Uses kit grep to find all call sites of a function, filtering out the
5
+ * definition itself to show only actual usage locations.
6
+ */
7
+ import { OutputFormat } from '../formatters/output';
8
+ /**
9
+ * Execute callers command
10
+ *
11
+ * Finds all locations where a function is called by:
12
+ * 1. Looking up the function definition in PROJECT_INDEX.json
13
+ * 2. Using kit grep to find all occurrences
14
+ * 3. Filtering out the definition line to show only call sites
15
+ *
16
+ * @param functionName - Name of the function to find callers for
17
+ * @param format - Output format (markdown or JSON)
18
+ */
19
+ export declare function executeCallers(functionName: string, format: OutputFormat): Promise<void>;
20
+ //# sourceMappingURL=callers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callers.d.ts","sourceRoot":"","sources":["../../../src/lib/commands/callers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAS,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAoF1D;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAwHf"}