@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.
- package/CHANGELOG.md +36 -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,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PROJECT_INDEX.json parser and query utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides TypeScript-based queries to replace jq dependencies.
|
|
5
|
+
* Supports git-style directory search to find index from any subdirectory.
|
|
6
|
+
*/
|
|
7
|
+
import { dirname, join, resolve } from 'node:path';
|
|
8
|
+
import { findUpSync, pathExistsSync } from '@side-quest/core/fs';
|
|
9
|
+
/**
|
|
10
|
+
* Search up directory tree for PROJECT_INDEX.json (git-style)
|
|
11
|
+
*
|
|
12
|
+
* Note: Delegates to @sidequest/core/fs findUpSync for the file search.
|
|
13
|
+
*
|
|
14
|
+
* @param startDir - Directory to start searching from (default: process.cwd())
|
|
15
|
+
* @returns Absolute path to PROJECT_INDEX.json
|
|
16
|
+
* @throws Error if index not found
|
|
17
|
+
*/
|
|
18
|
+
export async function findProjectIndex(startDir = process.cwd()) {
|
|
19
|
+
const indexPath = findUpSync('PROJECT_INDEX.json', startDir);
|
|
20
|
+
if (indexPath) {
|
|
21
|
+
return indexPath;
|
|
22
|
+
}
|
|
23
|
+
throw new Error('PROJECT_INDEX.json not found in current directory or any parent directory.\n' +
|
|
24
|
+
'Run: bun run src/cli.ts prime');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve explicit path to PROJECT_INDEX.json
|
|
28
|
+
*
|
|
29
|
+
* Handles three cases:
|
|
30
|
+
* 1. Path to PROJECT_INDEX.json file directly
|
|
31
|
+
* 2. Path to directory containing PROJECT_INDEX.json
|
|
32
|
+
* 3. Relative path that needs resolution
|
|
33
|
+
*
|
|
34
|
+
* @param explicitPath - Explicit path provided by user
|
|
35
|
+
* @returns Absolute path to PROJECT_INDEX.json
|
|
36
|
+
* @throws Error if index not found at specified path
|
|
37
|
+
*/
|
|
38
|
+
export function resolveExplicitIndexPath(explicitPath) {
|
|
39
|
+
const resolved = resolve(explicitPath);
|
|
40
|
+
// Case 1: Direct path to PROJECT_INDEX.json
|
|
41
|
+
if (resolved.endsWith('PROJECT_INDEX.json')) {
|
|
42
|
+
if (pathExistsSync(resolved)) {
|
|
43
|
+
return resolved;
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`PROJECT_INDEX.json not found at: ${resolved}`);
|
|
46
|
+
}
|
|
47
|
+
// Case 2: Directory containing PROJECT_INDEX.json
|
|
48
|
+
const indexInDir = join(resolved, 'PROJECT_INDEX.json');
|
|
49
|
+
if (pathExistsSync(indexInDir)) {
|
|
50
|
+
return indexInDir;
|
|
51
|
+
}
|
|
52
|
+
throw new Error(`PROJECT_INDEX.json not found at: ${indexInDir}\n` +
|
|
53
|
+
'Specify either:\n' +
|
|
54
|
+
' - Path to PROJECT_INDEX.json file\n' +
|
|
55
|
+
' - Directory containing PROJECT_INDEX.json');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Load and parse PROJECT_INDEX.json
|
|
59
|
+
*
|
|
60
|
+
* @param explicitPath - Optional explicit path to index file or directory
|
|
61
|
+
* @returns Parsed project index
|
|
62
|
+
* @throws Error if index not found or invalid JSON
|
|
63
|
+
*/
|
|
64
|
+
export async function loadProjectIndex(explicitPath) {
|
|
65
|
+
const indexPath = explicitPath
|
|
66
|
+
? resolveExplicitIndexPath(explicitPath)
|
|
67
|
+
: await findProjectIndex();
|
|
68
|
+
const file = Bun.file(indexPath);
|
|
69
|
+
return (await file.json());
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Find symbols by name across all files
|
|
73
|
+
*
|
|
74
|
+
* @param index - Project index
|
|
75
|
+
* @param symbolName - Symbol name to search for (exact match)
|
|
76
|
+
* @returns Array of matching symbols with their file paths
|
|
77
|
+
*/
|
|
78
|
+
export function findSymbol(index, symbolName) {
|
|
79
|
+
const results = [];
|
|
80
|
+
for (const [file, symbols] of Object.entries(index.symbols)) {
|
|
81
|
+
for (const symbol of symbols) {
|
|
82
|
+
if (symbol.name === symbolName) {
|
|
83
|
+
results.push({ file, symbol });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Find symbols by fuzzy name matching (case-insensitive substring)
|
|
91
|
+
*
|
|
92
|
+
* @param index - Project index
|
|
93
|
+
* @param query - Search query (substring, case-insensitive)
|
|
94
|
+
* @returns Array of matching symbols with their file paths
|
|
95
|
+
*/
|
|
96
|
+
export function findSymbolFuzzy(index, query) {
|
|
97
|
+
const results = [];
|
|
98
|
+
const lowerQuery = query.toLowerCase();
|
|
99
|
+
for (const [file, symbols] of Object.entries(index.symbols)) {
|
|
100
|
+
for (const symbol of symbols) {
|
|
101
|
+
const lowerName = symbol.name.toLowerCase();
|
|
102
|
+
// Exact match (highest score)
|
|
103
|
+
if (lowerName === lowerQuery) {
|
|
104
|
+
results.push({ file, symbol, score: 100 });
|
|
105
|
+
}
|
|
106
|
+
// Starts with (high score)
|
|
107
|
+
else if (lowerName.startsWith(lowerQuery)) {
|
|
108
|
+
results.push({ file, symbol, score: 75 });
|
|
109
|
+
}
|
|
110
|
+
// Contains (lower score)
|
|
111
|
+
else if (lowerName.includes(lowerQuery)) {
|
|
112
|
+
results.push({ file, symbol, score: 50 });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Sort by score descending, then by name
|
|
117
|
+
return results.sort((a, b) => {
|
|
118
|
+
if (b.score !== a.score)
|
|
119
|
+
return b.score - a.score;
|
|
120
|
+
return a.symbol.name.localeCompare(b.symbol.name);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get all symbols in a file
|
|
125
|
+
*
|
|
126
|
+
* @param index - Project index
|
|
127
|
+
* @param filePath - File path (can be relative or absolute)
|
|
128
|
+
* @returns Array of symbols in the file
|
|
129
|
+
*/
|
|
130
|
+
export function getFileSymbols(index, filePath) {
|
|
131
|
+
// Try exact match first
|
|
132
|
+
if (index.symbols[filePath]) {
|
|
133
|
+
return index.symbols[filePath];
|
|
134
|
+
}
|
|
135
|
+
// Try finding by filename (if relative path provided)
|
|
136
|
+
for (const [path, symbols] of Object.entries(index.symbols)) {
|
|
137
|
+
if (path.endsWith(filePath)) {
|
|
138
|
+
return symbols;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get all files with their symbol counts
|
|
145
|
+
*
|
|
146
|
+
* @param index - Project index
|
|
147
|
+
* @returns Array of files with symbol counts
|
|
148
|
+
*/
|
|
149
|
+
export function getFileStats(index) {
|
|
150
|
+
const stats = [];
|
|
151
|
+
for (const [file, symbols] of Object.entries(index.symbols)) {
|
|
152
|
+
stats.push({ file, symbolCount: symbols.length });
|
|
153
|
+
}
|
|
154
|
+
// Sort by symbol count descending
|
|
155
|
+
return stats.sort((a, b) => b.symbolCount - a.symbolCount);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get symbol distribution by type
|
|
159
|
+
*
|
|
160
|
+
* @param index - Project index
|
|
161
|
+
* @returns Record of symbol types to counts
|
|
162
|
+
*/
|
|
163
|
+
export function getSymbolTypeDistribution(index) {
|
|
164
|
+
const distribution = {
|
|
165
|
+
function: 0,
|
|
166
|
+
class: 0,
|
|
167
|
+
interface: 0,
|
|
168
|
+
type: 0,
|
|
169
|
+
constant: 0,
|
|
170
|
+
variable: 0,
|
|
171
|
+
};
|
|
172
|
+
for (const symbols of Object.values(index.symbols)) {
|
|
173
|
+
for (const symbol of symbols) {
|
|
174
|
+
distribution[symbol.type] = (distribution[symbol.type] || 0) + 1;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return distribution;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get all exported symbols (heuristic: uppercase or common export patterns)
|
|
181
|
+
*
|
|
182
|
+
* Note: Kit index doesn't have explicit "exported" flag, so we use naming conventions
|
|
183
|
+
*
|
|
184
|
+
* @param index - Project index
|
|
185
|
+
* @returns Array of likely exported symbols
|
|
186
|
+
*/
|
|
187
|
+
export function getExportedSymbols(index) {
|
|
188
|
+
const exported = [];
|
|
189
|
+
for (const [file, symbols] of Object.entries(index.symbols)) {
|
|
190
|
+
// Skip test files
|
|
191
|
+
if (file.includes('.test.') || file.includes('.spec.')) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
for (const symbol of symbols) {
|
|
195
|
+
// Heuristic: likely exported if:
|
|
196
|
+
// 1. Starts with uppercase (classes, types, interfaces)
|
|
197
|
+
// 2. Exported by naming convention
|
|
198
|
+
const firstChar = symbol.name[0];
|
|
199
|
+
if (firstChar && firstChar === firstChar.toUpperCase()) {
|
|
200
|
+
exported.push({ file, symbol });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return exported;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Group symbols by directory
|
|
208
|
+
*
|
|
209
|
+
* @param index - Project index
|
|
210
|
+
* @returns Record of directory paths to symbol counts
|
|
211
|
+
*/
|
|
212
|
+
export function groupSymbolsByDirectory(index) {
|
|
213
|
+
const dirCounts = {};
|
|
214
|
+
for (const [file, symbols] of Object.entries(index.symbols)) {
|
|
215
|
+
const dir = dirname(file);
|
|
216
|
+
dirCounts[dir] = (dirCounts[dir] || 0) + symbols.length;
|
|
217
|
+
}
|
|
218
|
+
return dirCounts;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get directory with most symbols (complexity hotspot)
|
|
222
|
+
*
|
|
223
|
+
* @param index - Project index
|
|
224
|
+
* @param topN - Number of top directories to return
|
|
225
|
+
* @returns Array of directories sorted by symbol count
|
|
226
|
+
*/
|
|
227
|
+
export function getComplexityHotspots(index, topN = 10) {
|
|
228
|
+
const dirCounts = groupSymbolsByDirectory(index);
|
|
229
|
+
const sorted = Object.entries(dirCounts)
|
|
230
|
+
.map(([directory, symbolCount]) => ({ directory, symbolCount }))
|
|
231
|
+
.sort((a, b) => b.symbolCount - a.symbolCount);
|
|
232
|
+
return sorted.slice(0, topN);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get all symbols of a specific type
|
|
236
|
+
*
|
|
237
|
+
* @param index - Project index
|
|
238
|
+
* @param type - Symbol type to filter by
|
|
239
|
+
* @returns Array of matching symbols with file paths
|
|
240
|
+
*/
|
|
241
|
+
export function getSymbolsByType(index, type) {
|
|
242
|
+
const results = [];
|
|
243
|
+
for (const [file, symbols] of Object.entries(index.symbols)) {
|
|
244
|
+
for (const symbol of symbols) {
|
|
245
|
+
if (symbol.type === type) {
|
|
246
|
+
results.push({ file, symbol });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return results;
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=index-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-parser.js","sourceRoot":"","sources":["../../../src/lib/utils/index-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kit Plugin Validators
|
|
3
|
+
*
|
|
4
|
+
* Input validation and security utilities for safe Kit CLI operations.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Result of path validation.
|
|
8
|
+
*/
|
|
9
|
+
export interface PathValidationResult {
|
|
10
|
+
/** Whether the path is valid */
|
|
11
|
+
valid: boolean;
|
|
12
|
+
/** Normalized absolute path (only if valid) */
|
|
13
|
+
path?: string;
|
|
14
|
+
/** Error message (only if invalid) */
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate a path for Kit operations.
|
|
19
|
+
*
|
|
20
|
+
* Checks:
|
|
21
|
+
* - Path exists
|
|
22
|
+
* - Path is a directory (for search operations)
|
|
23
|
+
* - No path traversal attacks (.. sequences escaping base)
|
|
24
|
+
*
|
|
25
|
+
* @param inputPath - Path to validate
|
|
26
|
+
* @param options - Validation options
|
|
27
|
+
* @returns Validation result with normalized path or error
|
|
28
|
+
*/
|
|
29
|
+
export declare function validatePath(inputPath: string, options?: {
|
|
30
|
+
/** Base directory to restrict access within (optional) */
|
|
31
|
+
basePath?: string;
|
|
32
|
+
/** Whether the path must be a directory (default: true) */
|
|
33
|
+
mustBeDirectory?: boolean;
|
|
34
|
+
/** Whether the path must exist (default: true) */
|
|
35
|
+
mustExist?: boolean;
|
|
36
|
+
}): PathValidationResult;
|
|
37
|
+
/**
|
|
38
|
+
* Validate a number is a positive integer within bounds.
|
|
39
|
+
* @deprecated Use validateInteger from @sidequest/core/validation instead
|
|
40
|
+
* @param value - Value to validate
|
|
41
|
+
* @param options - Validation options
|
|
42
|
+
* @returns Validation result
|
|
43
|
+
*/
|
|
44
|
+
export declare function validatePositiveInt(value: unknown, options: {
|
|
45
|
+
/** Field name for error messages */
|
|
46
|
+
name: string;
|
|
47
|
+
/** Minimum allowed value (default: 1) */
|
|
48
|
+
min?: number;
|
|
49
|
+
/** Maximum allowed value (default: 10000) */
|
|
50
|
+
max?: number;
|
|
51
|
+
/** Default value if undefined */
|
|
52
|
+
defaultValue?: number;
|
|
53
|
+
}): {
|
|
54
|
+
valid: boolean;
|
|
55
|
+
value?: number;
|
|
56
|
+
error?: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Validate all inputs for a grep search operation.
|
|
60
|
+
* @param inputs - Grep inputs to validate
|
|
61
|
+
* @returns Combined validation result
|
|
62
|
+
*/
|
|
63
|
+
export declare function validateGrepInputs(inputs: {
|
|
64
|
+
pattern: string;
|
|
65
|
+
path?: string;
|
|
66
|
+
include?: string;
|
|
67
|
+
exclude?: string;
|
|
68
|
+
maxResults?: number;
|
|
69
|
+
}): {
|
|
70
|
+
valid: boolean;
|
|
71
|
+
errors: string[];
|
|
72
|
+
validated?: {
|
|
73
|
+
pattern: string;
|
|
74
|
+
path: string;
|
|
75
|
+
include?: string;
|
|
76
|
+
exclude?: string;
|
|
77
|
+
maxResults: number;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Validate all inputs for a semantic search operation.
|
|
82
|
+
* @param inputs - Semantic search inputs to validate
|
|
83
|
+
* @returns Combined validation result
|
|
84
|
+
*/
|
|
85
|
+
export declare function validateSemanticInputs(inputs: {
|
|
86
|
+
query: string;
|
|
87
|
+
path?: string;
|
|
88
|
+
topK?: number;
|
|
89
|
+
}): {
|
|
90
|
+
valid: boolean;
|
|
91
|
+
errors: string[];
|
|
92
|
+
validated?: {
|
|
93
|
+
query: string;
|
|
94
|
+
path: string;
|
|
95
|
+
topK: number;
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Validate all inputs for a symbol usages operation.
|
|
100
|
+
* @param inputs - Usages inputs to validate
|
|
101
|
+
* @returns Combined validation result
|
|
102
|
+
*/
|
|
103
|
+
export declare function validateUsagesInputs(inputs: {
|
|
104
|
+
path?: string;
|
|
105
|
+
symbolName: string;
|
|
106
|
+
symbolType?: string;
|
|
107
|
+
}): {
|
|
108
|
+
valid: boolean;
|
|
109
|
+
errors: string[];
|
|
110
|
+
validated?: {
|
|
111
|
+
path: string;
|
|
112
|
+
symbolName: string;
|
|
113
|
+
symbolType?: string;
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Validate all inputs for an AST search operation.
|
|
118
|
+
* @param inputs - AST search inputs to validate
|
|
119
|
+
* @returns Combined validation result
|
|
120
|
+
*/
|
|
121
|
+
export declare function validateAstSearchInputs(inputs: {
|
|
122
|
+
pattern: string;
|
|
123
|
+
mode?: string;
|
|
124
|
+
filePattern?: string;
|
|
125
|
+
path?: string;
|
|
126
|
+
maxResults?: number;
|
|
127
|
+
}): {
|
|
128
|
+
valid: boolean;
|
|
129
|
+
errors: string[];
|
|
130
|
+
validated?: {
|
|
131
|
+
pattern: string;
|
|
132
|
+
mode: 'simple' | 'pattern';
|
|
133
|
+
filePattern?: string;
|
|
134
|
+
path: string;
|
|
135
|
+
maxResults: number;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"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"}
|