code-auditor-mcp 1.0.0 → 1.1.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/README.md +72 -2
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +229 -22
- package/dist/cli.js.map +1 -1
- package/dist/codeIndexDb.d.ts +150 -0
- package/dist/codeIndexDb.d.ts.map +1 -0
- package/dist/codeIndexDb.js +847 -0
- package/dist/codeIndexDb.js.map +1 -0
- package/dist/codeIndexService.d.ts +66 -0
- package/dist/codeIndexService.d.ts.map +1 -0
- package/dist/codeIndexService.js +201 -0
- package/dist/codeIndexService.js.map +1 -0
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +17 -1
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +9 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +9 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +14 -0
- package/dist/constants.js.map +1 -0
- package/dist/functionScanner.d.ts +30 -0
- package/dist/functionScanner.d.ts.map +1 -0
- package/dist/functionScanner.js +264 -0
- package/dist/functionScanner.js.map +1 -0
- package/dist/generators/AWSQConfigGenerator.d.ts +8 -0
- package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -0
- package/dist/generators/AWSQConfigGenerator.js +33 -0
- package/dist/generators/AWSQConfigGenerator.js.map +1 -0
- package/dist/generators/AiderConfigGenerator.d.ts +8 -0
- package/dist/generators/AiderConfigGenerator.d.ts.map +1 -0
- package/dist/generators/AiderConfigGenerator.js +23 -0
- package/dist/generators/AiderConfigGenerator.js.map +1 -0
- package/dist/generators/BaseConfigGenerator.d.ts +51 -0
- package/dist/generators/BaseConfigGenerator.d.ts.map +1 -0
- package/dist/generators/BaseConfigGenerator.js +67 -0
- package/dist/generators/BaseConfigGenerator.js.map +1 -0
- package/dist/generators/ClaudeConfigGenerator.d.ts +14 -0
- package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -0
- package/dist/generators/ClaudeConfigGenerator.js +70 -0
- package/dist/generators/ClaudeConfigGenerator.js.map +1 -0
- package/dist/generators/ClineConfigGenerator.d.ts +9 -0
- package/dist/generators/ClineConfigGenerator.d.ts.map +1 -0
- package/dist/generators/ClineConfigGenerator.js +26 -0
- package/dist/generators/ClineConfigGenerator.js.map +1 -0
- package/dist/generators/CodeiumConfigGenerator.d.ts +8 -0
- package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -0
- package/dist/generators/CodeiumConfigGenerator.js +30 -0
- package/dist/generators/CodeiumConfigGenerator.js.map +1 -0
- package/dist/generators/ConfigGeneratorFactory.d.ts +35 -0
- package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -0
- package/dist/generators/ConfigGeneratorFactory.js +77 -0
- package/dist/generators/ConfigGeneratorFactory.js.map +1 -0
- package/dist/generators/ContinueConfigGenerator.d.ts +12 -0
- package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -0
- package/dist/generators/ContinueConfigGenerator.js +99 -0
- package/dist/generators/ContinueConfigGenerator.js.map +1 -0
- package/dist/generators/CopilotConfigGenerator.d.ts +12 -0
- package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -0
- package/dist/generators/CopilotConfigGenerator.js +77 -0
- package/dist/generators/CopilotConfigGenerator.js.map +1 -0
- package/dist/generators/CursorConfigGenerator.d.ts +12 -0
- package/dist/generators/CursorConfigGenerator.d.ts.map +1 -0
- package/dist/generators/CursorConfigGenerator.js +80 -0
- package/dist/generators/CursorConfigGenerator.js.map +1 -0
- package/dist/generators/JetBrainsConfigGenerator.d.ts +8 -0
- package/dist/generators/JetBrainsConfigGenerator.d.ts.map +1 -0
- package/dist/generators/JetBrainsConfigGenerator.js +36 -0
- package/dist/generators/JetBrainsConfigGenerator.js.map +1 -0
- package/dist/generators/VSCodeConfigGenerator.d.ts +8 -0
- package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -0
- package/dist/generators/VSCodeConfigGenerator.js +29 -0
- package/dist/generators/VSCodeConfigGenerator.js.map +1 -0
- package/dist/generators/index.d.ts +13 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +14 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/mcp-standalone.js +0 -0
- package/dist/mcp.js +483 -2
- package/dist/mcp.js.map +1 -1
- package/dist/search/QueryParser.d.ts +60 -0
- package/dist/search/QueryParser.d.ts.map +1 -0
- package/dist/search/QueryParser.js +330 -0
- package/dist/search/QueryParser.js.map +1 -0
- package/dist/search/index.d.ts +7 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +6 -0
- package/dist/search/index.js.map +1 -0
- package/dist/test-multi-strategy-search.d.ts +3 -0
- package/dist/test-multi-strategy-search.d.ts.map +1 -0
- package/dist/test-multi-strategy-search.js +170 -0
- package/dist/test-multi-strategy-search.js.map +1 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/InteractivePrompts.d.ts +37 -0
- package/dist/ui/InteractivePrompts.d.ts.map +1 -0
- package/dist/ui/InteractivePrompts.js +147 -0
- package/dist/ui/InteractivePrompts.js.map +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/jsDocParser.d.ts +84 -0
- package/dist/utils/jsDocParser.d.ts.map +1 -0
- package/dist/utils/jsDocParser.js +366 -0
- package/dist/utils/jsDocParser.js.map +1 -0
- package/package.json +31 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryParser.d.ts","sourceRoot":"","sources":["../../src/search/QueryParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAwD9B;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAgBtB;IAEX;;;;OAIG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAyExC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAetB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA4E5B;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IA+BhB;;;;OAIG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB1C;;;;OAIG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAK1C;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryParser - Parses search queries into structured format with tokenization and synonym expansion
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Multi-word queries with intelligent tokenization
|
|
6
|
+
* - Exact phrase matching with quotes
|
|
7
|
+
* - Excluded terms with minus operator
|
|
8
|
+
* - Special operators (type:, param:, return:, etc.)
|
|
9
|
+
* - Synonym expansion for common programming terms
|
|
10
|
+
* - Fuzzy search and stemming flags
|
|
11
|
+
*/
|
|
12
|
+
export class QueryParser {
|
|
13
|
+
// Comprehensive synonym mappings for programming terms
|
|
14
|
+
static SYNONYMS = {
|
|
15
|
+
// Common programming verbs
|
|
16
|
+
'get': ['fetch', 'retrieve', 'obtain', 'find', 'query', 'load', 'read'],
|
|
17
|
+
'set': ['update', 'save', 'store', 'write', 'assign', 'modify', 'change'],
|
|
18
|
+
'create': ['make', 'new', 'generate', 'build', 'construct', 'initialize', 'init'],
|
|
19
|
+
'delete': ['remove', 'destroy', 'drop', 'clear', 'purge', 'erase'],
|
|
20
|
+
'add': ['append', 'insert', 'push', 'attach', 'include'],
|
|
21
|
+
'remove': ['delete', 'pop', 'detach', 'exclude', 'eliminate'],
|
|
22
|
+
// Data structures
|
|
23
|
+
'array': ['list', 'vector', 'collection', 'arr'],
|
|
24
|
+
'object': ['obj', 'dict', 'dictionary', 'map', 'hash', 'record'],
|
|
25
|
+
'string': ['str', 'text', 'chars', 'characters'],
|
|
26
|
+
'number': ['num', 'int', 'integer', 'float', 'double', 'numeric'],
|
|
27
|
+
'boolean': ['bool', 'flag', 'true/false'],
|
|
28
|
+
// Common patterns
|
|
29
|
+
'validate': ['check', 'verify', 'test', 'ensure', 'confirm'],
|
|
30
|
+
'handler': ['listener', 'callback', 'processor', 'controller'],
|
|
31
|
+
'util': ['utility', 'helper', 'tools', 'utils'],
|
|
32
|
+
'config': ['configuration', 'settings', 'options', 'conf'],
|
|
33
|
+
'auth': ['authentication', 'authorization', 'authenticate', 'authorize'],
|
|
34
|
+
'user': ['users', 'person', 'account', 'member', 'client'],
|
|
35
|
+
'error': ['err', 'exception', 'fault', 'failure', 'problem'],
|
|
36
|
+
'log': ['logger', 'logging', 'trace', 'debug', 'console'],
|
|
37
|
+
// HTTP/API related
|
|
38
|
+
'api': ['endpoint', 'route', 'service', 'rest', 'graphql'],
|
|
39
|
+
'request': ['req', 'http', 'call', 'fetch'],
|
|
40
|
+
'response': ['res', 'reply', 'result', 'output'],
|
|
41
|
+
// Database related
|
|
42
|
+
'database': ['db', 'storage', 'datastore', 'repository'],
|
|
43
|
+
'query': ['sql', 'search', 'find', 'select'],
|
|
44
|
+
'table': ['collection', 'entity', 'model', 'schema'],
|
|
45
|
+
// React/Frontend specific
|
|
46
|
+
'component': ['comp', 'widget', 'element', 'view'],
|
|
47
|
+
'render': ['display', 'show', 'present', 'draw'],
|
|
48
|
+
'state': ['status', 'data', 'store', 'context'],
|
|
49
|
+
'props': ['properties', 'attributes', 'params', 'arguments'],
|
|
50
|
+
// Async patterns
|
|
51
|
+
'async': ['asynchronous', 'promise', 'await', 'concurrent'],
|
|
52
|
+
'sync': ['synchronous', 'blocking', 'sequential'],
|
|
53
|
+
'callback': ['cb', 'handler', 'listener', 'oncomplete'],
|
|
54
|
+
// Testing
|
|
55
|
+
'test': ['tests', 'spec', 'suite', 'unit', 'integration', 'e2e'],
|
|
56
|
+
'mock': ['stub', 'fake', 'spy', 'double'],
|
|
57
|
+
// Common abbreviations
|
|
58
|
+
'fn': ['function', 'func', 'method'],
|
|
59
|
+
'param': ['parameter', 'arg', 'argument'],
|
|
60
|
+
'return': ['returns', 'output', 'result'],
|
|
61
|
+
'doc': ['documentation', 'docs', 'comment', 'jsdoc']
|
|
62
|
+
};
|
|
63
|
+
// Special operators that can be used in queries
|
|
64
|
+
static OPERATORS = {
|
|
65
|
+
'type:': 'fileType',
|
|
66
|
+
'file:': 'filePath',
|
|
67
|
+
'path:': 'filePath',
|
|
68
|
+
'lang:': 'language',
|
|
69
|
+
'language:': 'language',
|
|
70
|
+
'param:': 'parameters',
|
|
71
|
+
'parameter:': 'parameters',
|
|
72
|
+
'return:': 'returnType',
|
|
73
|
+
'returns:': 'returnType',
|
|
74
|
+
'complexity:': 'complexity',
|
|
75
|
+
'jsdoc:': 'hasJsDoc',
|
|
76
|
+
'doc:': 'hasJsDoc',
|
|
77
|
+
'since:': 'dateRange',
|
|
78
|
+
'before:': 'dateRange',
|
|
79
|
+
'after:': 'dateRange'
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Parse a search query string into a structured ParsedQuery object
|
|
83
|
+
* @param query The raw search query string
|
|
84
|
+
* @returns ParsedQuery object with extracted terms, filters, and options
|
|
85
|
+
*/
|
|
86
|
+
parse(query) {
|
|
87
|
+
const result = {
|
|
88
|
+
terms: [],
|
|
89
|
+
originalTerms: [],
|
|
90
|
+
phrases: [],
|
|
91
|
+
excludedTerms: [],
|
|
92
|
+
filters: {},
|
|
93
|
+
searchFields: undefined,
|
|
94
|
+
fuzzy: false,
|
|
95
|
+
stemming: false
|
|
96
|
+
};
|
|
97
|
+
if (!query || query.trim().length === 0) {
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
// Extract exact phrases (quoted strings) first
|
|
101
|
+
const phrases = this.extractPhrases(query);
|
|
102
|
+
result.phrases = phrases.map(p => p.value);
|
|
103
|
+
// Remove phrases from query for further processing
|
|
104
|
+
let remainingQuery = query;
|
|
105
|
+
phrases.forEach(phrase => {
|
|
106
|
+
remainingQuery = remainingQuery.replace(phrase.original, ' ');
|
|
107
|
+
});
|
|
108
|
+
// Extract operators and their values
|
|
109
|
+
const { operators, cleanedQuery } = this.extractOperators(remainingQuery);
|
|
110
|
+
this.applyOperatorFilters(operators, result);
|
|
111
|
+
// Process remaining tokens
|
|
112
|
+
const tokens = this.tokenize(cleanedQuery);
|
|
113
|
+
for (const token of tokens) {
|
|
114
|
+
if (token.startsWith('-')) {
|
|
115
|
+
// Excluded term
|
|
116
|
+
const term = token.slice(1);
|
|
117
|
+
if (term.length > 0) {
|
|
118
|
+
result.excludedTerms.push(term);
|
|
119
|
+
// Also add synonyms to excluded terms
|
|
120
|
+
const synonyms = this.getSynonyms(term);
|
|
121
|
+
result.excludedTerms.push(...synonyms);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (token === '~' || token === 'fuzzy') {
|
|
125
|
+
// Enable fuzzy search
|
|
126
|
+
result.fuzzy = true;
|
|
127
|
+
}
|
|
128
|
+
else if (token === 'stem' || token === 'stemming') {
|
|
129
|
+
// Enable stemming
|
|
130
|
+
result.stemming = true;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Regular search term
|
|
134
|
+
result.originalTerms.push(token);
|
|
135
|
+
result.terms.push(token);
|
|
136
|
+
// Add synonyms for the term
|
|
137
|
+
const synonyms = this.getSynonyms(token);
|
|
138
|
+
result.terms.push(...synonyms);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Remove duplicates
|
|
142
|
+
result.originalTerms = [...new Set(result.originalTerms)];
|
|
143
|
+
result.terms = [...new Set(result.terms)];
|
|
144
|
+
result.excludedTerms = [...new Set(result.excludedTerms)];
|
|
145
|
+
result.phrases = [...new Set(result.phrases)];
|
|
146
|
+
// Set default search fields if not specified
|
|
147
|
+
if (!result.searchFields || result.searchFields.length === 0) {
|
|
148
|
+
result.searchFields = ['name', 'signature', 'jsDoc', 'purpose', 'context'];
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Extract quoted phrases from the query
|
|
154
|
+
* @param query The query string
|
|
155
|
+
* @returns Array of phrase objects with original and cleaned value
|
|
156
|
+
*/
|
|
157
|
+
extractPhrases(query) {
|
|
158
|
+
const phrases = [];
|
|
159
|
+
const phraseRegex = /["']([^"']+)["']/g;
|
|
160
|
+
let match;
|
|
161
|
+
while ((match = phraseRegex.exec(query)) !== null) {
|
|
162
|
+
phrases.push({
|
|
163
|
+
original: match[0],
|
|
164
|
+
value: match[1].trim()
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return phrases;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Extract operators and their values from the query
|
|
171
|
+
* @param query The query string
|
|
172
|
+
* @returns Object with operators map and cleaned query
|
|
173
|
+
*/
|
|
174
|
+
extractOperators(query) {
|
|
175
|
+
const operators = new Map();
|
|
176
|
+
let cleanedQuery = query;
|
|
177
|
+
// Match operator:value patterns
|
|
178
|
+
const operatorRegex = /(\w+):(\S+)/g;
|
|
179
|
+
let match;
|
|
180
|
+
while ((match = operatorRegex.exec(query)) !== null) {
|
|
181
|
+
const operator = match[1].toLowerCase() + ':';
|
|
182
|
+
const value = match[2];
|
|
183
|
+
if (operator in QueryParser.OPERATORS) {
|
|
184
|
+
operators.set(operator, value);
|
|
185
|
+
cleanedQuery = cleanedQuery.replace(match[0], ' ');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { operators, cleanedQuery: cleanedQuery.trim() };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Apply operator filters to the parsed query
|
|
192
|
+
* @param operators Map of operators and values
|
|
193
|
+
* @param parsedQuery The parsed query object to update
|
|
194
|
+
*/
|
|
195
|
+
applyOperatorFilters(operators, parsedQuery) {
|
|
196
|
+
operators.forEach((value, operator) => {
|
|
197
|
+
const filterKey = QueryParser.OPERATORS[operator];
|
|
198
|
+
switch (filterKey) {
|
|
199
|
+
case 'fileType':
|
|
200
|
+
parsedQuery.filters.fileType = value;
|
|
201
|
+
break;
|
|
202
|
+
case 'filePath':
|
|
203
|
+
parsedQuery.filters.filePath = value;
|
|
204
|
+
break;
|
|
205
|
+
case 'language':
|
|
206
|
+
parsedQuery.filters.language = value;
|
|
207
|
+
break;
|
|
208
|
+
case 'hasJsDoc':
|
|
209
|
+
parsedQuery.filters.hasJsDoc = value.toLowerCase() === 'true' || value === '1';
|
|
210
|
+
break;
|
|
211
|
+
case 'complexity':
|
|
212
|
+
if (value.includes('-')) {
|
|
213
|
+
const [min, max] = value.split('-').map(v => parseInt(v.trim(), 10));
|
|
214
|
+
if (!isNaN(min) && !isNaN(max)) {
|
|
215
|
+
parsedQuery.filters.complexity = { min, max };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const complexityValue = parseInt(value, 10);
|
|
220
|
+
if (!isNaN(complexityValue)) {
|
|
221
|
+
parsedQuery.filters.complexity = {
|
|
222
|
+
min: complexityValue,
|
|
223
|
+
max: complexityValue
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
case 'dateRange':
|
|
229
|
+
if (!parsedQuery.filters.dateRange) {
|
|
230
|
+
parsedQuery.filters.dateRange = {};
|
|
231
|
+
}
|
|
232
|
+
const date = new Date(value);
|
|
233
|
+
if (!isNaN(date.getTime())) {
|
|
234
|
+
if (operator === 'since:' || operator === 'after:') {
|
|
235
|
+
parsedQuery.filters.dateRange.start = date;
|
|
236
|
+
}
|
|
237
|
+
else if (operator === 'before:') {
|
|
238
|
+
parsedQuery.filters.dateRange.end = date;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
case 'parameters':
|
|
243
|
+
// Add parameter search to search fields
|
|
244
|
+
if (!parsedQuery.searchFields) {
|
|
245
|
+
parsedQuery.searchFields = [];
|
|
246
|
+
}
|
|
247
|
+
parsedQuery.searchFields.push('parameters');
|
|
248
|
+
parsedQuery.terms.push(value);
|
|
249
|
+
break;
|
|
250
|
+
case 'returnType':
|
|
251
|
+
// Add return type to search fields
|
|
252
|
+
if (!parsedQuery.searchFields) {
|
|
253
|
+
parsedQuery.searchFields = [];
|
|
254
|
+
}
|
|
255
|
+
parsedQuery.searchFields.push('returnType');
|
|
256
|
+
parsedQuery.terms.push(value);
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Tokenize a string into individual words
|
|
263
|
+
* @param text The text to tokenize
|
|
264
|
+
* @returns Array of tokens
|
|
265
|
+
*/
|
|
266
|
+
tokenize(text) {
|
|
267
|
+
// Split on whitespace and common delimiters, but preserve hyphenated words
|
|
268
|
+
const tokens = text
|
|
269
|
+
.toLowerCase()
|
|
270
|
+
.split(/\s+/)
|
|
271
|
+
.filter(token => token.length > 0);
|
|
272
|
+
// Further split camelCase and snake_case
|
|
273
|
+
const expandedTokens = [];
|
|
274
|
+
for (const token of tokens) {
|
|
275
|
+
// Split camelCase
|
|
276
|
+
const camelCaseTokens = token.split(/(?=[A-Z])/).filter(t => t.length > 0);
|
|
277
|
+
if (camelCaseTokens.length > 1) {
|
|
278
|
+
expandedTokens.push(token); // Keep original
|
|
279
|
+
expandedTokens.push(...camelCaseTokens.map(t => t.toLowerCase()));
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// Split snake_case
|
|
283
|
+
const snakeCaseTokens = token.split('_').filter(t => t.length > 0);
|
|
284
|
+
if (snakeCaseTokens.length > 1) {
|
|
285
|
+
expandedTokens.push(token); // Keep original
|
|
286
|
+
expandedTokens.push(...snakeCaseTokens);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
expandedTokens.push(token);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return [...new Set(expandedTokens)];
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get synonyms for a given term
|
|
297
|
+
* @param term The term to find synonyms for
|
|
298
|
+
* @returns Array of synonyms (not including the original term)
|
|
299
|
+
*/
|
|
300
|
+
getSynonyms(term) {
|
|
301
|
+
const synonyms = [];
|
|
302
|
+
const lowerTerm = term.toLowerCase();
|
|
303
|
+
// Check if term is a direct key
|
|
304
|
+
if (QueryParser.SYNONYMS[lowerTerm]) {
|
|
305
|
+
synonyms.push(...QueryParser.SYNONYMS[lowerTerm]);
|
|
306
|
+
}
|
|
307
|
+
// Check if term is a value in any synonym group
|
|
308
|
+
for (const [key, values] of Object.entries(QueryParser.SYNONYMS)) {
|
|
309
|
+
if (values.includes(lowerTerm)) {
|
|
310
|
+
synonyms.push(key);
|
|
311
|
+
// Add other synonyms from the same group
|
|
312
|
+
synonyms.push(...values.filter(v => v !== lowerTerm));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return [...new Set(synonyms)];
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Expand a query with synonyms (utility method)
|
|
319
|
+
* @param query The original query
|
|
320
|
+
* @returns Expanded query with synonyms
|
|
321
|
+
*/
|
|
322
|
+
expandQuery(query) {
|
|
323
|
+
const parsed = this.parse(query);
|
|
324
|
+
const allTerms = [...new Set([...parsed.terms, ...parsed.phrases])];
|
|
325
|
+
return allTerms.join(' ');
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Export a singleton instance for convenience
|
|
329
|
+
export const queryParser = new QueryParser();
|
|
330
|
+
//# sourceMappingURL=QueryParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryParser.js","sourceRoot":"","sources":["../../src/search/QueryParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-multi-strategy-search.d.ts","sourceRoot":"","sources":["../src/test-multi-strategy-search.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { CodeIndexDB } from './codeIndexDB.js';
|
|
3
|
+
import { QueryParser } from './search/QueryParser.js';
|
|
4
|
+
async function testMultiStrategySearch() {
|
|
5
|
+
const db = new CodeIndexDB('./.code-index/test.db');
|
|
6
|
+
const queryParser = new QueryParser();
|
|
7
|
+
try {
|
|
8
|
+
await db.initialize();
|
|
9
|
+
console.log('Database initialized');
|
|
10
|
+
// Add some test functions
|
|
11
|
+
const testFunctions = [
|
|
12
|
+
{
|
|
13
|
+
name: 'getUserData',
|
|
14
|
+
signature: 'getUserData(userId: string): Promise<User>',
|
|
15
|
+
purpose: 'Fetch user information from the database',
|
|
16
|
+
context: 'Part of the user management module',
|
|
17
|
+
filePath: '/src/services/userService.ts',
|
|
18
|
+
language: 'typescript',
|
|
19
|
+
startLine: 10,
|
|
20
|
+
endLine: 20,
|
|
21
|
+
dependencies: ['database', 'logger'],
|
|
22
|
+
jsDoc: {
|
|
23
|
+
description: 'Retrieves user data from the database by user ID',
|
|
24
|
+
params: [{ name: 'userId', type: 'string', description: 'The unique user identifier' }],
|
|
25
|
+
returns: { type: 'Promise<User>', description: 'A promise that resolves to user data' }
|
|
26
|
+
},
|
|
27
|
+
parameters: [
|
|
28
|
+
{ name: 'userId', type: 'string', description: 'The unique user identifier' }
|
|
29
|
+
],
|
|
30
|
+
returnType: 'Promise<User>',
|
|
31
|
+
complexity: 5
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'createUser',
|
|
35
|
+
signature: 'createUser(data: CreateUserDto): Promise<User>',
|
|
36
|
+
purpose: 'Create a new user in the system',
|
|
37
|
+
context: 'User registration process',
|
|
38
|
+
filePath: '/src/services/userService.ts',
|
|
39
|
+
language: 'typescript',
|
|
40
|
+
startLine: 25,
|
|
41
|
+
endLine: 45,
|
|
42
|
+
dependencies: ['database', 'validator', 'bcrypt'],
|
|
43
|
+
jsDoc: {
|
|
44
|
+
description: 'Creates a new user with validation and password hashing',
|
|
45
|
+
params: [{ name: 'data', type: 'CreateUserDto', description: 'User creation data' }],
|
|
46
|
+
returns: { type: 'Promise<User>', description: 'The created user object' }
|
|
47
|
+
},
|
|
48
|
+
parameters: [
|
|
49
|
+
{ name: 'data', type: 'CreateUserDto', description: 'User creation data' }
|
|
50
|
+
],
|
|
51
|
+
returnType: 'Promise<User>',
|
|
52
|
+
complexity: 8
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'validateUserInput',
|
|
56
|
+
signature: 'validateUserInput(input: any): ValidationResult',
|
|
57
|
+
purpose: 'Validate user input data',
|
|
58
|
+
context: 'Input validation utilities',
|
|
59
|
+
filePath: '/src/utils/validation.ts',
|
|
60
|
+
language: 'typescript',
|
|
61
|
+
startLine: 5,
|
|
62
|
+
endLine: 25,
|
|
63
|
+
dependencies: ['joi', 'validator'],
|
|
64
|
+
jsDoc: {
|
|
65
|
+
description: 'Validates user input against defined schema rules',
|
|
66
|
+
params: [{ name: 'input', type: 'any', description: 'Input to validate' }],
|
|
67
|
+
returns: { type: 'ValidationResult', description: 'Validation result with errors if any' }
|
|
68
|
+
},
|
|
69
|
+
parameters: [
|
|
70
|
+
{ name: 'input', type: 'any', description: 'Input to validate' }
|
|
71
|
+
],
|
|
72
|
+
returnType: 'ValidationResult',
|
|
73
|
+
complexity: 6
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'logError',
|
|
77
|
+
signature: 'logError(error: Error, context?: string): void',
|
|
78
|
+
purpose: 'Log application errors with context',
|
|
79
|
+
context: 'Error handling and logging',
|
|
80
|
+
filePath: '/src/utils/logger.ts',
|
|
81
|
+
language: 'typescript',
|
|
82
|
+
startLine: 15,
|
|
83
|
+
endLine: 20,
|
|
84
|
+
dependencies: ['winston', 'sentry'],
|
|
85
|
+
jsDoc: {
|
|
86
|
+
description: 'Logs errors to console and external monitoring services',
|
|
87
|
+
params: [
|
|
88
|
+
{ name: 'error', type: 'Error', description: 'The error object' },
|
|
89
|
+
{ name: 'context', type: 'string', description: 'Optional context information' }
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
parameters: [
|
|
93
|
+
{ name: 'error', type: 'Error', description: 'The error object' },
|
|
94
|
+
{ name: 'context', type: 'string', description: 'Optional context information' }
|
|
95
|
+
],
|
|
96
|
+
returnType: 'void',
|
|
97
|
+
complexity: 3
|
|
98
|
+
}
|
|
99
|
+
];
|
|
100
|
+
// Register test functions
|
|
101
|
+
for (const func of testFunctions) {
|
|
102
|
+
await db.registerFunction(func);
|
|
103
|
+
}
|
|
104
|
+
console.log('Test functions registered');
|
|
105
|
+
// Test 1: Multi-word query (should use AND logic)
|
|
106
|
+
console.log('\n=== Test 1: Multi-word query "get user" ===');
|
|
107
|
+
const parsed1 = queryParser.parse('get user');
|
|
108
|
+
const results1 = await db.searchFunctions({ parsedQuery: parsed1 });
|
|
109
|
+
console.log(`Query terms: ${parsed1.terms.join(', ')}`);
|
|
110
|
+
console.log(`Found ${results1.totalCount} results:`);
|
|
111
|
+
results1.functions.forEach(f => {
|
|
112
|
+
console.log(` - ${f.name} (score: ${f.score}) - ${f.purpose}`);
|
|
113
|
+
});
|
|
114
|
+
// Test 2: Exact phrase matching
|
|
115
|
+
console.log('\n=== Test 2: Exact phrase "user data" ===');
|
|
116
|
+
const parsed2 = queryParser.parse('"user data"');
|
|
117
|
+
const results2 = await db.searchFunctions({ parsedQuery: parsed2 });
|
|
118
|
+
console.log(`Phrases: ${parsed2.phrases.join(', ')}`);
|
|
119
|
+
console.log(`Found ${results2.totalCount} results:`);
|
|
120
|
+
results2.functions.forEach(f => {
|
|
121
|
+
console.log(` - ${f.name} (score: ${f.score}) - ${f.purpose}`);
|
|
122
|
+
});
|
|
123
|
+
// Test 3: Excluded terms
|
|
124
|
+
console.log('\n=== Test 3: Query "user -create" (exclude create) ===');
|
|
125
|
+
const parsed3 = queryParser.parse('user -create');
|
|
126
|
+
const results3 = await db.searchFunctions({ parsedQuery: parsed3 });
|
|
127
|
+
console.log(`Terms: ${parsed3.terms.join(', ')}, Excluded: ${parsed3.excludedTerms.join(', ')}`);
|
|
128
|
+
console.log(`Found ${results3.totalCount} results:`);
|
|
129
|
+
results3.functions.forEach(f => {
|
|
130
|
+
console.log(` - ${f.name} (score: ${f.score}) - ${f.purpose}`);
|
|
131
|
+
});
|
|
132
|
+
// Test 4: Synonym expansion
|
|
133
|
+
console.log('\n=== Test 4: Query "fetch" (should find get via synonym) ===');
|
|
134
|
+
const parsed4 = queryParser.parse('fetch');
|
|
135
|
+
const results4 = await db.searchFunctions({ parsedQuery: parsed4 });
|
|
136
|
+
console.log(`Expanded terms: ${parsed4.terms.join(', ')}`);
|
|
137
|
+
console.log(`Found ${results4.totalCount} results:`);
|
|
138
|
+
results4.functions.forEach(f => {
|
|
139
|
+
console.log(` - ${f.name} (score: ${f.score}) - ${f.purpose}`);
|
|
140
|
+
});
|
|
141
|
+
// Test 5: Complex query with operators
|
|
142
|
+
console.log('\n=== Test 5: Complex query "validate lang:typescript complexity:5-10" ===');
|
|
143
|
+
const parsed5 = queryParser.parse('validate lang:typescript complexity:5-10');
|
|
144
|
+
const results5 = await db.searchFunctions({ parsedQuery: parsed5 });
|
|
145
|
+
console.log(`Terms: ${parsed5.terms.join(', ')}`);
|
|
146
|
+
console.log(`Filters:`, parsed5.filters);
|
|
147
|
+
console.log(`Found ${results5.totalCount} results:`);
|
|
148
|
+
results5.functions.forEach(f => {
|
|
149
|
+
console.log(` - ${f.name} (score: ${f.score}) - complexity: ${f.complexity}`);
|
|
150
|
+
});
|
|
151
|
+
// Test 6: Fuzzy search
|
|
152
|
+
console.log('\n=== Test 6: Fuzzy search "usr ~" ===');
|
|
153
|
+
const parsed6 = queryParser.parse('usr ~');
|
|
154
|
+
const results6 = await db.searchFunctions({ parsedQuery: parsed6 });
|
|
155
|
+
console.log(`Terms: ${parsed6.terms.join(', ')}, Fuzzy: ${parsed6.fuzzy}`);
|
|
156
|
+
console.log(`Found ${results6.totalCount} results:`);
|
|
157
|
+
results6.functions.forEach(f => {
|
|
158
|
+
console.log(` - ${f.name} (score: ${f.score}) - ${f.purpose}`);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.error('Test failed:', error);
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
await db.close();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Run tests
|
|
169
|
+
testMultiStrategySearch();
|
|
170
|
+
//# sourceMappingURL=test-multi-strategy-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-multi-strategy-search.js","sourceRoot":"","sources":["../src/test-multi-strategy-search.ts"],"names":[],"mappings":"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"}
|