@side-quest/kit 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +54 -352
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +156 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -2509
- package/dist/index.js.map +1 -0
- package/dist/lib/ast/index.d.ts +11 -0
- package/dist/lib/ast/index.d.ts.map +1 -0
- package/dist/lib/ast/index.js +15 -0
- package/dist/lib/ast/index.js.map +1 -0
- package/dist/lib/ast/languages.d.ts +55 -0
- package/dist/lib/ast/languages.d.ts.map +1 -0
- package/dist/lib/ast/languages.js +146 -0
- package/dist/lib/ast/languages.js.map +1 -0
- package/dist/lib/ast/pattern.d.ts +84 -0
- package/dist/lib/ast/pattern.d.ts.map +1 -0
- package/dist/lib/ast/pattern.js +268 -0
- package/dist/lib/ast/pattern.js.map +1 -0
- package/dist/lib/ast/searcher.d.ts +89 -0
- package/dist/lib/ast/searcher.d.ts.map +1 -0
- package/dist/lib/ast/searcher.js +316 -0
- package/dist/lib/ast/searcher.js.map +1 -0
- package/dist/lib/ast/types.d.ts +93 -0
- package/dist/lib/ast/types.d.ts.map +1 -0
- package/dist/lib/ast/types.js +23 -0
- package/dist/lib/ast/types.js.map +1 -0
- package/dist/lib/commands/callers.d.ts +20 -0
- package/dist/lib/commands/callers.d.ts.map +1 -0
- package/dist/lib/commands/callers.js +162 -0
- package/dist/lib/commands/callers.js.map +1 -0
- package/dist/lib/commands/find.d.ts +15 -0
- package/dist/lib/commands/find.d.ts.map +1 -0
- package/dist/lib/commands/find.js +113 -0
- package/dist/lib/commands/find.js.map +1 -0
- package/dist/lib/commands/overview.d.ts +6 -0
- package/dist/lib/commands/overview.d.ts.map +1 -0
- package/dist/lib/commands/overview.js +52 -0
- package/dist/lib/commands/overview.js.map +1 -0
- package/dist/lib/commands/prime.d.ts +16 -0
- package/dist/lib/commands/prime.d.ts.map +1 -0
- package/dist/lib/commands/prime.js +168 -0
- package/dist/lib/commands/prime.js.map +1 -0
- package/dist/lib/commands/search.d.ts +20 -0
- package/dist/lib/commands/search.d.ts.map +1 -0
- package/dist/lib/commands/search.js +111 -0
- package/dist/lib/commands/search.js.map +1 -0
- package/dist/lib/errors.d.ts +80 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +189 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/formatters/output.d.ts +5 -0
- package/dist/lib/formatters/output.d.ts.map +1 -0
- package/dist/lib/formatters/output.js +5 -0
- package/dist/lib/formatters/output.js.map +1 -0
- package/dist/lib/formatters.d.ts +29 -0
- package/dist/lib/formatters.d.ts.map +1 -0
- package/dist/lib/formatters.js +141 -0
- package/dist/lib/formatters.js.map +1 -0
- package/dist/lib/index-tools.d.ts +108 -0
- package/dist/lib/index-tools.d.ts.map +1 -0
- package/dist/lib/index-tools.js +311 -0
- package/dist/lib/index-tools.js.map +1 -0
- package/dist/lib/index.d.ts +21 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +42 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/kit-wrapper.d.ts +70 -0
- package/dist/lib/kit-wrapper.d.ts.map +1 -0
- package/dist/lib/kit-wrapper.js +462 -0
- package/dist/lib/kit-wrapper.js.map +1 -0
- package/dist/lib/logger.d.ts +28 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +39 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/types.d.ts +179 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +48 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils/args.d.ts +40 -0
- package/dist/lib/utils/args.d.ts.map +1 -0
- package/dist/lib/utils/args.js +58 -0
- package/dist/lib/utils/args.js.map +1 -0
- package/dist/lib/utils/git.d.ts +23 -0
- package/dist/lib/utils/git.d.ts.map +1 -0
- package/dist/lib/utils/git.js +50 -0
- package/dist/lib/utils/git.js.map +1 -0
- package/dist/lib/utils/index-parser.d.ts +155 -0
- package/dist/lib/utils/index-parser.d.ts.map +1 -0
- package/dist/lib/utils/index-parser.js +252 -0
- package/dist/lib/utils/index-parser.js.map +1 -0
- package/dist/lib/validators.d.ts +138 -0
- package/dist/lib/validators.d.ts.map +1 -0
- package/dist/lib/validators.js +302 -0
- package/dist/lib/validators.js.map +1 -0
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +769 -0
- package/dist/mcp/index.js.map +1 -0
- package/package.json +5 -2
- package/src/cli.ts +170 -0
- package/src/lib/ast/index.ts +32 -0
- package/src/lib/ast/languages.ts +172 -0
- package/src/lib/ast/pattern.ts +299 -0
- package/src/lib/ast/searcher.ts +381 -0
- package/src/lib/ast/types.ts +99 -0
- package/src/lib/commands/callers.ts +226 -0
- package/src/lib/commands/find.ts +159 -0
- package/src/lib/commands/overview.ts +73 -0
- package/src/lib/commands/prime.ts +271 -0
- package/src/lib/commands/search.ts +146 -0
- package/src/lib/errors.ts +221 -0
- package/src/lib/formatters/output.ts +9 -0
- package/src/lib/formatters.ts +189 -0
- package/src/lib/index-tools.ts +471 -0
- package/src/lib/index.ts +122 -0
- package/src/lib/kit-wrapper.ts +675 -0
- package/src/lib/logger.ts +57 -0
- package/src/lib/types.ts +228 -0
- package/src/lib/utils/args.ts +72 -0
- package/src/lib/utils/git.ts +65 -0
- package/src/lib/utils/index-parser.ts +350 -0
- package/src/lib/validators.ts +437 -0
- 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"}
|