skill-creator 0.0.0 → 1.0.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 (145) hide show
  1. package/README.md +148 -19
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +265 -260
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/addContent.d.ts +5 -0
  6. package/dist/commands/addContent.d.ts.map +1 -0
  7. package/dist/commands/addContent.js +74 -0
  8. package/dist/commands/addContent.js.map +1 -0
  9. package/dist/commands/buildIndex.d.ts +5 -0
  10. package/dist/commands/buildIndex.d.ts.map +1 -0
  11. package/dist/commands/buildIndex.js +17 -0
  12. package/dist/commands/buildIndex.js.map +1 -0
  13. package/dist/commands/downloadContext7.d.ts +5 -0
  14. package/dist/commands/downloadContext7.d.ts.map +1 -0
  15. package/dist/commands/downloadContext7.js +62 -0
  16. package/dist/commands/downloadContext7.js.map +1 -0
  17. package/dist/commands/init.d.ts +5 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +89 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/initCc.d.ts +5 -0
  22. package/dist/commands/initCc.d.ts.map +1 -0
  23. package/dist/commands/initCc.js +26 -0
  24. package/dist/commands/initCc.js.map +1 -0
  25. package/dist/commands/listContent.d.ts +5 -0
  26. package/dist/commands/listContent.d.ts.map +1 -0
  27. package/dist/commands/listContent.js +35 -0
  28. package/dist/commands/listContent.js.map +1 -0
  29. package/dist/commands/searchContent.d.ts +5 -0
  30. package/dist/commands/searchContent.d.ts.map +1 -0
  31. package/dist/commands/searchContent.js +98 -0
  32. package/dist/commands/searchContent.js.map +1 -0
  33. package/dist/commands/shared.d.ts +23 -0
  34. package/dist/commands/shared.d.ts.map +1 -0
  35. package/dist/commands/shared.js +92 -0
  36. package/dist/commands/shared.js.map +1 -0
  37. package/dist/commands/updateContext7.d.ts +5 -0
  38. package/dist/commands/updateContext7.d.ts.map +1 -0
  39. package/dist/commands/updateContext7.js +28 -0
  40. package/dist/commands/updateContext7.js.map +1 -0
  41. package/dist/core/autoSearchAdapter.d.ts +42 -0
  42. package/dist/core/autoSearchAdapter.d.ts.map +1 -0
  43. package/dist/core/autoSearchAdapter.js +116 -0
  44. package/dist/core/autoSearchAdapter.js.map +1 -0
  45. package/dist/core/chromaLocalSearch.d.ts +26 -0
  46. package/dist/core/chromaLocalSearch.d.ts.map +1 -0
  47. package/dist/core/chromaLocalSearch.js +212 -0
  48. package/dist/core/chromaLocalSearch.js.map +1 -0
  49. package/dist/core/chromaLocalSimple.d.ts +24 -0
  50. package/dist/core/chromaLocalSimple.d.ts.map +1 -0
  51. package/dist/core/chromaLocalSimple.js +216 -0
  52. package/dist/core/chromaLocalSimple.js.map +1 -0
  53. package/dist/core/chromaSearchAdapter.d.ts +86 -0
  54. package/dist/core/chromaSearchAdapter.d.ts.map +1 -0
  55. package/dist/core/chromaSearchAdapter.js +477 -0
  56. package/dist/core/chromaSearchAdapter.js.map +1 -0
  57. package/dist/core/chromaSearchImproved.d.ts +29 -0
  58. package/dist/core/chromaSearchImproved.d.ts.map +1 -0
  59. package/dist/core/chromaSearchImproved.js +259 -0
  60. package/dist/core/chromaSearchImproved.js.map +1 -0
  61. package/dist/core/chromaServerManager.d.ts +64 -0
  62. package/dist/core/chromaServerManager.d.ts.map +1 -0
  63. package/dist/core/chromaServerManager.js +186 -0
  64. package/dist/core/chromaServerManager.js.map +1 -0
  65. package/dist/core/contentManager.d.ts +1 -0
  66. package/dist/core/contentManager.d.ts.map +1 -1
  67. package/dist/core/contentManager.js +75 -21
  68. package/dist/core/contentManager.js.map +1 -1
  69. package/dist/core/fuseSearch.d.ts +25 -0
  70. package/dist/core/fuseSearch.d.ts.map +1 -0
  71. package/dist/core/fuseSearch.js +198 -0
  72. package/dist/core/fuseSearch.js.map +1 -0
  73. package/dist/core/fuzzySearch.d.ts +66 -0
  74. package/dist/core/fuzzySearch.d.ts.map +1 -0
  75. package/dist/core/fuzzySearch.js +271 -0
  76. package/dist/core/fuzzySearch.js.map +1 -0
  77. package/dist/core/fuzzySearchAdapter.d.ts +33 -0
  78. package/dist/core/fuzzySearchAdapter.d.ts.map +1 -0
  79. package/dist/core/fuzzySearchAdapter.js +185 -0
  80. package/dist/core/fuzzySearchAdapter.js.map +1 -0
  81. package/dist/core/portUtils.d.ts +51 -0
  82. package/dist/core/portUtils.d.ts.map +1 -0
  83. package/dist/core/portUtils.js +120 -0
  84. package/dist/core/portUtils.js.map +1 -0
  85. package/dist/core/runScript.d.ts +1 -1
  86. package/dist/core/runScript.d.ts.map +1 -1
  87. package/dist/core/runScript.js +27 -210
  88. package/dist/core/runScript.js.map +1 -1
  89. package/dist/core/searchAdapter.d.ts +48 -0
  90. package/dist/core/searchAdapter.d.ts.map +1 -0
  91. package/dist/core/searchAdapter.js +6 -0
  92. package/dist/core/searchAdapter.js.map +1 -0
  93. package/dist/core/searchEngineFactory.d.ts +30 -0
  94. package/dist/core/searchEngineFactory.d.ts.map +1 -0
  95. package/dist/core/searchEngineFactory.js +41 -0
  96. package/dist/core/searchEngineFactory.js.map +1 -0
  97. package/dist/core/simpleLocalSearch.d.ts +50 -0
  98. package/dist/core/simpleLocalSearch.d.ts.map +1 -0
  99. package/dist/core/simpleLocalSearch.js +406 -0
  100. package/dist/core/simpleLocalSearch.js.map +1 -0
  101. package/dist/core/skillCreator.d.ts +0 -2
  102. package/dist/core/skillCreator.d.ts.map +1 -1
  103. package/dist/core/skillCreator.js +20 -92
  104. package/dist/core/skillCreator.js.map +1 -1
  105. package/dist/core/unifiedSearch.d.ts +57 -11
  106. package/dist/core/unifiedSearch.d.ts.map +1 -1
  107. package/dist/core/unifiedSearch.js +88 -29
  108. package/dist/core/unifiedSearch.js.map +1 -1
  109. package/dist/index.d.ts +4 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +3 -1
  112. package/dist/index.js.map +1 -1
  113. package/dist/search_format/enhancedFormatter.d.ts +109 -0
  114. package/dist/search_format/enhancedFormatter.d.ts.map +1 -0
  115. package/dist/search_format/enhancedFormatter.js +262 -0
  116. package/dist/search_format/enhancedFormatter.js.map +1 -0
  117. package/dist/search_format/index.d.ts +10 -0
  118. package/dist/search_format/index.d.ts.map +1 -0
  119. package/dist/search_format/index.js +22 -0
  120. package/dist/search_format/index.js.map +1 -0
  121. package/dist/search_format/listFormatter.d.ts +16 -0
  122. package/dist/search_format/listFormatter.d.ts.map +1 -0
  123. package/dist/search_format/listFormatter.js +51 -0
  124. package/dist/search_format/listFormatter.js.map +1 -0
  125. package/dist/search_format/types.d.ts +69 -0
  126. package/dist/search_format/types.d.ts.map +1 -0
  127. package/dist/search_format/types.js +5 -0
  128. package/dist/search_format/types.js.map +1 -0
  129. package/dist/test/testFuzzy.d.ts +3 -0
  130. package/dist/test/testFuzzy.d.ts.map +1 -0
  131. package/dist/test/testFuzzy.js +72 -0
  132. package/dist/test/testFuzzy.js.map +1 -0
  133. package/dist/test-fuzzy.d.ts +6 -0
  134. package/dist/test-fuzzy.d.ts.map +1 -0
  135. package/dist/test-fuzzy.js +65 -0
  136. package/dist/test-fuzzy.js.map +1 -0
  137. package/dist/types/index.d.ts +5 -0
  138. package/dist/types/index.d.ts.map +1 -1
  139. package/dist/utils/package.d.ts +17 -0
  140. package/dist/utils/package.d.ts.map +1 -1
  141. package/dist/utils/package.js +51 -14
  142. package/dist/utils/package.js.map +1 -1
  143. package/package.json +9 -8
  144. package/templates/skill-creator.md +65 -153
  145. package/templates/skill-creator.zh-CN.md +93 -0
@@ -0,0 +1,271 @@
1
+ import uFuzzy from '@leeoniya/ufuzzy';
2
+ import { glob } from 'glob';
3
+ import { readFileSync } from 'node:fs';
4
+ export class FuzzySearchEngine {
5
+ options;
6
+ documents = [];
7
+ constructor(options = {}) {
8
+ this.options = {
9
+ fuzzyThreshold: 0.5,
10
+ prioritizeExact: true,
11
+ maxResults: 20,
12
+ ...options,
13
+ };
14
+ }
15
+ /**
16
+ * Enhanced fuzzy search function that returns both indices and detailed info
17
+ */
18
+ fuzzySearchWithInfo(haystack, needle) {
19
+ if (!needle || needle.length < 1)
20
+ return { indices: [], info: null };
21
+ if (!haystack || haystack.length === 0)
22
+ return { indices: [], info: null };
23
+ const fuzzy = new uFuzzy({ unicode: true });
24
+ const idxs = fuzzy.filter(haystack, needle);
25
+ if (!idxs || idxs.length === 0) {
26
+ return { indices: [], info: null };
27
+ }
28
+ const info = fuzzy.info(idxs, haystack, needle);
29
+ const order = fuzzy.sort(info, haystack, needle);
30
+ const indices = order.map((sortedIdx) => {
31
+ return info.idx[sortedIdx];
32
+ });
33
+ return { indices, info };
34
+ }
35
+ async buildIndex(referencesDir, hashFile) {
36
+ console.log('Building enhanced fuzzy search index with uFuzzy...');
37
+ // Get all markdown files
38
+ const files = await glob('**/*.md', { cwd: referencesDir });
39
+ if (files.length === 0) {
40
+ console.log('No documentation files found to index');
41
+ return;
42
+ }
43
+ this.documents = [];
44
+ for (const filePath of files) {
45
+ try {
46
+ const fullPath = `${referencesDir}/${filePath}`;
47
+ const content = readFileSync(fullPath, 'utf-8');
48
+ // Extract title from first line or filename
49
+ const lines = content.split('\n');
50
+ const title = lines[0]?.replace(/^#+\s*/, '').trim() ||
51
+ filePath.replace(/\.md$/, '').replace(/[-_]/g, ' ');
52
+ // Determine source based on path
53
+ const source = filePath.includes('context7/') ? 'context7' : 'user';
54
+ const document = {
55
+ id: filePath,
56
+ title: title,
57
+ content: content,
58
+ source: source,
59
+ file_path: fullPath,
60
+ metadata: {
61
+ file_name: filePath,
62
+ file_path: fullPath,
63
+ },
64
+ };
65
+ this.documents.push(document);
66
+ }
67
+ catch (error) {
68
+ console.warn(`Failed to process file ${filePath}:`, error);
69
+ }
70
+ }
71
+ console.log(`✅ Enhanced fuzzy search index built with ${this.documents.length} documents`);
72
+ }
73
+ async search(query, topK = 5, where) {
74
+ // Helper function to safely convert to string
75
+ const safeString = (value) => {
76
+ if (value === null || value === undefined)
77
+ return '';
78
+ if (typeof value === 'string') {
79
+ // Filter out empty strings and very short strings
80
+ return value.trim().length >= 2 ? value.trim() : '';
81
+ }
82
+ if (typeof value === 'number' || typeof value === 'boolean')
83
+ return String(value);
84
+ return '';
85
+ };
86
+ // Sanitize the query
87
+ const sanitizedQuery = safeString(query);
88
+ if (sanitizedQuery.length < 1) {
89
+ console.warn('Query too short or invalid for fuzzy search');
90
+ return [];
91
+ }
92
+ if (this.documents.length === 0) {
93
+ console.warn('Search index not built. Call buildIndex() first.');
94
+ return [];
95
+ }
96
+ // Filter documents by source if specified
97
+ let filteredDocs = this.documents;
98
+ if (where?.source) {
99
+ filteredDocs = this.documents.filter((doc) => doc.source === where.source);
100
+ }
101
+ // If no documents match the filter, return empty
102
+ if (filteredDocs.length === 0) {
103
+ return [];
104
+ }
105
+ const candidates = [];
106
+ // Prepare search arrays
107
+ const titles = filteredDocs.map((doc) => safeString(doc.title)).filter((t) => t.length >= 2);
108
+ const contents = filteredDocs.map((doc) => safeString(doc.content)).filter((c) => c.length >= 2);
109
+ const fileNames = filteredDocs
110
+ .map((doc) => safeString(doc.metadata.file_name))
111
+ .filter((f) => f.length >= 2);
112
+ // Search in titles (highest priority)
113
+ const titleResult = this.fuzzySearchWithInfo(titles, sanitizedQuery);
114
+ titleResult.indices.forEach((idx, i) => {
115
+ const doc = filteredDocs[idx];
116
+ if (doc) {
117
+ candidates.push({
118
+ doc,
119
+ score: this.calculateFuzzyScore(titleResult.info, i),
120
+ matchType: 'title',
121
+ info: titleResult.info,
122
+ ranges: titleResult.info?.ranges,
123
+ });
124
+ }
125
+ });
126
+ // Search in content (medium priority)
127
+ const contentResult = this.fuzzySearchWithInfo(contents, sanitizedQuery);
128
+ contentResult.indices.forEach((idx, i) => {
129
+ const doc = filteredDocs[idx];
130
+ if (doc && !candidates.find((c) => c.doc.id === doc.id)) {
131
+ candidates.push({
132
+ doc,
133
+ score: this.calculateFuzzyScore(contentResult.info, i) * 0.7, // Reduce score for content matches
134
+ matchType: 'content',
135
+ info: contentResult.info,
136
+ ranges: contentResult.info?.ranges,
137
+ });
138
+ }
139
+ });
140
+ // Search in file names (lowest priority)
141
+ const fileNameResult = this.fuzzySearchWithInfo(fileNames, sanitizedQuery);
142
+ fileNameResult.indices.forEach((idx, i) => {
143
+ const doc = filteredDocs[idx];
144
+ if (doc && !candidates.find((c) => c.doc.id === doc.id)) {
145
+ candidates.push({
146
+ doc,
147
+ score: this.calculateFuzzyScore(fileNameResult.info, i) * 0.5, // Reduce score for filename matches
148
+ matchType: 'filename',
149
+ info: fileNameResult.info,
150
+ ranges: fileNameResult.info?.ranges,
151
+ });
152
+ }
153
+ });
154
+ // Sort by score and convert to SearchResult
155
+ const sortedCandidates = candidates.sort((a, b) => b.score - a.score).slice(0, topK);
156
+ const maxScore = sortedCandidates.length > 0 ? sortedCandidates[0].score : 0;
157
+ const averageScore = sortedCandidates.reduce((sum, c) => sum + c.score, 0) / sortedCandidates.length || 0;
158
+ return sortedCandidates.map((candidate) => {
159
+ const { doc, score, matchType } = candidate;
160
+ // Add enhanced metadata for smart content handling
161
+ const enhancedMetadata = {
162
+ ...doc.metadata,
163
+ matchType,
164
+ originalScore: score,
165
+ maxScore,
166
+ averageScore,
167
+ };
168
+ return {
169
+ id: doc.id,
170
+ title: doc.title,
171
+ content: this.selectContent(doc.content, score, maxScore, averageScore, candidate.info?.ranges),
172
+ source: doc.source,
173
+ file_path: doc.file_path,
174
+ score,
175
+ metadata: enhancedMetadata,
176
+ };
177
+ });
178
+ }
179
+ /**
180
+ * Calculate fuzzy search score based on uFuzzy info
181
+ */
182
+ calculateFuzzyScore(info, resultIndex) {
183
+ if (!info)
184
+ return 0;
185
+ const { chars, terms, interIns, intraIns } = info;
186
+ // Base score: exact match ratio
187
+ const exactRatio = (chars[resultIndex] || 0) / (terms[resultIndex] || 1);
188
+ // Penalty for insertions
189
+ const insertionPenalty = (interIns[resultIndex] + intraIns[resultIndex]) * 0.1;
190
+ // Final score (0-1)
191
+ return Math.max(0, Math.min(1, exactRatio - insertionPenalty));
192
+ }
193
+ /**
194
+ * Smart content selection based on score
195
+ */
196
+ selectContent(content, score, maxScore, averageScore, ranges) {
197
+ const showFullContentThreshold = 0.8;
198
+ const minScoreForPreview = 0.3;
199
+ if (score >= maxScore * showFullContentThreshold) {
200
+ // High score: return full content
201
+ return content;
202
+ }
203
+ else if (score >= averageScore * minScoreForPreview) {
204
+ // Medium score: return range-based preview
205
+ return this.extractRangePreview(content, ranges);
206
+ }
207
+ // Low score: return standard preview
208
+ return content.substring(0, 200) + '...';
209
+ }
210
+ /**
211
+ * Extract preview based on match ranges
212
+ */
213
+ extractRangePreview(content, ranges) {
214
+ if (!ranges || ranges.length === 0) {
215
+ return content.substring(0, 100) + '...';
216
+ }
217
+ const lines = content.split('\n');
218
+ const previewLines = [];
219
+ // Extract lines around match ranges
220
+ ranges.forEach(([start, ...end]) => {
221
+ const startLine = Math.floor(start / 50); // Rough estimate of line numbers
222
+ const endLine = Math.floor(end[end.length - 1] / 50);
223
+ for (let i = Math.max(0, startLine - 1); i <= Math.min(lines.length - 1, endLine + 1); i++) {
224
+ if (!previewLines.includes(lines[i])) {
225
+ previewLines.push(lines[i]);
226
+ }
227
+ }
228
+ });
229
+ return previewLines.slice(0, 5).join('\n') + (previewLines.length > 5 ? '\n...' : '');
230
+ }
231
+ async searchByPriority(query, topK = 5) {
232
+ // Search with priority on user documents first
233
+ const userResults = await this.search(query, Math.ceil(topK / 2), { source: 'user' });
234
+ const context7Results = await this.search(query, Math.ceil(topK / 2), { source: 'context7' });
235
+ // Combine and sort by score
236
+ const allResults = [...userResults, ...context7Results]
237
+ .sort((a, b) => {
238
+ // User documents get priority boost
239
+ const aBoost = a.source === 'user' ? 0.2 : 0;
240
+ const bBoost = b.source === 'user' ? 0.2 : 0;
241
+ return b.score + bBoost - (a.score + aBoost);
242
+ })
243
+ .slice(0, topK);
244
+ return allResults;
245
+ }
246
+ /**
247
+ * Get statistics about the search index
248
+ */
249
+ getStats() {
250
+ const userDocs = this.documents.filter((doc) => doc.source === 'user');
251
+ const context7Docs = this.documents.filter((doc) => doc.source === 'context7');
252
+ return {
253
+ totalDocuments: this.documents.length,
254
+ userDocuments: userDocs.length,
255
+ context7Documents: context7Docs.length,
256
+ };
257
+ }
258
+ /**
259
+ * Check if the search index is built
260
+ */
261
+ isBuilt() {
262
+ return this.documents.length > 0;
263
+ }
264
+ /**
265
+ * Clear the search index
266
+ */
267
+ clearIndex() {
268
+ this.documents = [];
269
+ }
270
+ }
271
+ //# sourceMappingURL=fuzzySearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzySearch.js","sourceRoot":"","sources":["../../src/core/fuzzySearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Fuzzy Search Engine Adapter
3
+ * Implements the SearchEngine interface using uFuzzy library
4
+ * Clean, focused implementation - formatting handled by separate formatters
5
+ */
6
+ import type { SearchEngine, SearchResult, SearchOptions } from './searchAdapter';
7
+ /**
8
+ * uFuzzy-based Search Engine Adapter
9
+ * Clean implementation focused only on search functionality
10
+ */
11
+ export declare class FuzzySearchAdapter implements SearchEngine {
12
+ private documents;
13
+ private fuzzy;
14
+ private lastSearchInfo;
15
+ constructor();
16
+ buildIndex(referencesDir: string): Promise<void>;
17
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
18
+ /**
19
+ * Basic fuzzy search using uFuzzy
20
+ */
21
+ private fuzzySearch;
22
+ /**
23
+ * Enhanced fuzzy search that returns both indices and detailed info
24
+ */
25
+ private fuzzySearchWithInfo;
26
+ isBuilt(): boolean;
27
+ getStats(): Promise<{
28
+ totalDocuments: number;
29
+ }>;
30
+ searchByPriority(query: string, topK?: number): Promise<SearchResult[]>;
31
+ clearIndex(): void;
32
+ }
33
+ //# sourceMappingURL=fuzzySearchAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzySearchAdapter.d.ts","sourceRoot":"","sources":["../../src/core/fuzzySearchAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAKhF;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,SAAS,CAOV;IAEP,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,cAAc,CAA8B;;IAS9C,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2ChD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6FjF;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,IAAI,OAAO;IAIZ,QAAQ,IAAI,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAI/C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKhF,UAAU,IAAI,IAAI;CAInB"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Fuzzy Search Engine Adapter
3
+ * Implements the SearchEngine interface using uFuzzy library
4
+ * Clean, focused implementation - formatting handled by separate formatters
5
+ */
6
+ import uFuzzy from '@leeoniya/ufuzzy';
7
+ import { glob } from 'glob';
8
+ import { readFileSync } from 'node:fs';
9
+ import { join, basename } from 'node:path';
10
+ /**
11
+ * uFuzzy-based Search Engine Adapter
12
+ * Clean implementation focused only on search functionality
13
+ */
14
+ export class FuzzySearchAdapter {
15
+ documents = [];
16
+ fuzzy;
17
+ lastSearchInfo = new Map();
18
+ constructor() {
19
+ // Initialize uFuzzy with sensible defaults
20
+ this.fuzzy = new uFuzzy({
21
+ unicode: true,
22
+ });
23
+ }
24
+ async buildIndex(referencesDir) {
25
+ console.log('🔨 Building fuzzy search index with uFuzzy...');
26
+ const files = await glob('**/*.md', { cwd: referencesDir });
27
+ if (files.length === 0) {
28
+ console.log('No documentation files found to index');
29
+ return;
30
+ }
31
+ this.documents = [];
32
+ for (const filePath of files) {
33
+ try {
34
+ const fullPath = join(referencesDir, filePath);
35
+ const content = readFileSync(fullPath, 'utf-8');
36
+ // Extract title from first line or filename
37
+ const lines = content.split('\n');
38
+ const title = lines[0]?.replace(/^#+\s*/, '').trim() || basename(filePath, '.md').replace(/[-_]/g, ' ');
39
+ const source = filePath.includes('context7/') ? 'context7' : 'user';
40
+ this.documents.push({
41
+ id: filePath,
42
+ title,
43
+ content,
44
+ source,
45
+ file_path: fullPath,
46
+ metadata: {
47
+ file_name: basename(filePath),
48
+ file_path: filePath,
49
+ },
50
+ });
51
+ }
52
+ catch (error) {
53
+ console.warn(`Warning: Failed to index file ${filePath}:`, error);
54
+ }
55
+ }
56
+ console.log(`✅ Fuzzy search index built with ${this.documents.length} documents`);
57
+ }
58
+ async search(query, options = {}) {
59
+ const { topK = 5, where } = options;
60
+ if (this.documents.length === 0) {
61
+ console.warn('Search index not built. Call buildIndex() first.');
62
+ return [];
63
+ }
64
+ // Filter documents by source if specified
65
+ let searchableDocs = this.documents;
66
+ if (where?.source) {
67
+ searchableDocs = this.documents.filter((doc) => doc.source === where.source);
68
+ }
69
+ if (searchableDocs.length === 0) {
70
+ return [];
71
+ }
72
+ const results = [];
73
+ const seenIds = new Set();
74
+ // Prepare search arrays
75
+ const titles = searchableDocs.map((doc) => doc.title);
76
+ const contents = searchableDocs.map((doc) => doc.content);
77
+ const fileNames = searchableDocs.map((doc) => doc.metadata.file_name);
78
+ // Search in titles (highest priority - score 1.0)
79
+ const titleMatches = this.fuzzySearch(titles, query);
80
+ titleMatches.forEach((idx) => {
81
+ const doc = searchableDocs[idx];
82
+ if (doc && !seenIds.has(doc.id)) {
83
+ seenIds.add(doc.id);
84
+ results.push({
85
+ id: doc.id,
86
+ title: doc.title,
87
+ content: doc.content,
88
+ source: doc.source,
89
+ file_path: doc.file_path,
90
+ score: 1.0,
91
+ metadata: {
92
+ ...doc.metadata,
93
+ matchType: 'title',
94
+ },
95
+ });
96
+ }
97
+ });
98
+ // Search in content (medium priority - score 0.7)
99
+ const contentMatches = this.fuzzySearch(contents, query);
100
+ contentMatches.forEach((idx) => {
101
+ const doc = searchableDocs[idx];
102
+ if (doc && !seenIds.has(doc.id)) {
103
+ seenIds.add(doc.id);
104
+ results.push({
105
+ id: doc.id,
106
+ title: doc.title,
107
+ content: doc.content,
108
+ source: doc.source,
109
+ file_path: doc.file_path,
110
+ score: 0.7,
111
+ metadata: {
112
+ ...doc.metadata,
113
+ matchType: 'content',
114
+ },
115
+ });
116
+ }
117
+ });
118
+ // Search in file names (lowest priority - score 0.5)
119
+ const fileNameMatches = this.fuzzySearch(fileNames, query);
120
+ fileNameMatches.forEach((idx) => {
121
+ const doc = searchableDocs[idx];
122
+ if (doc && !seenIds.has(doc.id)) {
123
+ seenIds.add(doc.id);
124
+ results.push({
125
+ id: doc.id,
126
+ title: doc.title,
127
+ content: doc.content,
128
+ source: doc.source,
129
+ file_path: doc.file_path,
130
+ score: 0.5,
131
+ metadata: {
132
+ ...doc.metadata,
133
+ matchType: 'filename',
134
+ },
135
+ });
136
+ }
137
+ });
138
+ // Sort by score and limit to topK
139
+ return results.sort((a, b) => b.score - a.score).slice(0, topK);
140
+ }
141
+ /**
142
+ * Basic fuzzy search using uFuzzy
143
+ */
144
+ fuzzySearch(haystack, needle) {
145
+ const result = this.fuzzySearchWithInfo(haystack, needle);
146
+ return result.indices;
147
+ }
148
+ /**
149
+ * Enhanced fuzzy search that returns both indices and detailed info
150
+ */
151
+ fuzzySearchWithInfo(haystack, needle) {
152
+ if (!needle || needle.length < 1)
153
+ return { indices: [], info: null };
154
+ if (!haystack || haystack.length === 0)
155
+ return { indices: [], info: null };
156
+ const idxs = this.fuzzy.filter(haystack, needle);
157
+ if (!idxs || idxs.length === 0) {
158
+ return { indices: [], info: null };
159
+ }
160
+ const info = this.fuzzy.info(idxs, haystack, needle);
161
+ const order = this.fuzzy.sort(info, haystack, needle);
162
+ // Store info for later use
163
+ const searchKey = `${needle}-${JSON.stringify(haystack.slice(0, 3))}`;
164
+ this.lastSearchInfo.set(searchKey, info);
165
+ const indices = order.map((sortedIdx) => {
166
+ return info.idx[sortedIdx];
167
+ });
168
+ return { indices, info };
169
+ }
170
+ isBuilt() {
171
+ return this.documents.length > 0;
172
+ }
173
+ async getStats() {
174
+ return { totalDocuments: this.documents.length };
175
+ }
176
+ async searchByPriority(query, topK = 5) {
177
+ // For fuzzy search, this is the same as regular search
178
+ return this.search(query, { topK });
179
+ }
180
+ clearIndex() {
181
+ this.documents = [];
182
+ this.lastSearchInfo.clear();
183
+ }
184
+ }
185
+ //# sourceMappingURL=fuzzySearchAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzySearchAdapter.js","sourceRoot":"","sources":["../../src/core/fuzzySearchAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,MAAM,MAAM,kBAAkB,CAAA;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAE1C;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,SAAS,GAOZ,EAAE,CAAA;IAEC,KAAK,CAAQ;IACb,cAAc,GAAqB,IAAI,GAAG,EAAE,CAAA;IAEpD;QACE,2CAA2C;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC;YACtB,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,aAAqB;QACpC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;QAE5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAA;QAE3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;YACpD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QAEnB,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;gBAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBAE/C,4CAA4C;gBAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACjC,MAAM,KAAK,GACT,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;gBAE3F,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAA;gBAEnE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAClB,EAAE,EAAE,QAAQ;oBACZ,KAAK;oBACL,OAAO;oBACP,MAAM;oBACN,SAAS,EAAE,QAAQ;oBACnB,QAAQ,EAAE;wBACR,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC;wBAC7B,SAAS,EAAE,QAAQ;qBACpB;iBACF,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAA;YACnE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,CAAA;IACnF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,UAAyB,EAAE;QACrD,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;QAEnC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;YAChE,OAAO,EAAE,CAAA;QACX,CAAC;QAED,0CAA0C;QAC1C,IAAI,cAAc,GAAG,IAAI,CAAC,SAAS,CAAA;QACnC,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;YAClB,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAA;QAC9E,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,OAAO,GAAmB,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QAEjC,wBAAwB;QACxB,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACzD,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QAErE,kDAAkD;QAClD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACpD,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACnB,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE;wBACR,GAAG,GAAG,CAAC,QAAQ;wBACf,SAAS,EAAE,OAAO;qBACnB;iBACF,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,kDAAkD;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACxD,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACnB,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE;wBACR,GAAG,GAAG,CAAC,QAAQ;wBACf,SAAS,EAAE,SAAS;qBACrB;iBACF,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,qDAAqD;QACrD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC1D,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACnB,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE;wBACR,GAAG,GAAG,CAAC,QAAQ;wBACf,SAAS,EAAE,UAAU;qBACtB;iBACF,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,kCAAkC;QAClC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACjE,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,QAAkB,EAAE,MAAc;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACzD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,QAAkB,EAClB,MAAc;QAKd,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACpE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAE1E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAEhD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QAErD,2BAA2B;QAC3B,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACrE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAExC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,SAAiB,EAAE,EAAE;YAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAa,EAAE,OAAe,CAAC;QACpD,uDAAuD;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,UAAU;QACR,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;IAC7B,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * 端口管理工具
3
+ * 用于动态分配和管理 ChromaDB 服务器端口
4
+ */
5
+ /**
6
+ * 查找可用的端口
7
+ * @param startPort 起始端口号
8
+ * @param maxPort 最大端口号
9
+ * @returns 可用的端口号
10
+ */
11
+ export declare function findAvailablePort(): Promise<number>;
12
+ /**
13
+ * 检查端口是否可用
14
+ * @param port 端口号
15
+ * @returns 端口是否可用
16
+ */
17
+ export declare function isPortAvailable(port: number): Promise<boolean>;
18
+ /**
19
+ * 等待端口上的服务启动
20
+ * @param port 端口号
21
+ * @param timeout 超时时间(毫秒)
22
+ * @returns 服务是否成功启动
23
+ */
24
+ export declare function waitForService(port: number, timeout?: number): Promise<boolean>;
25
+ /**
26
+ * 端口管理器类
27
+ */
28
+ export declare class PortManager {
29
+ private usedPorts;
30
+ private basePort;
31
+ constructor(basePort?: number);
32
+ /**
33
+ * 分配一个可用端口
34
+ * @returns 分配的端口号
35
+ */
36
+ allocatePort(): Promise<number>;
37
+ /**
38
+ * 释放端口
39
+ * @param port 要释放的端口号
40
+ */
41
+ releasePort(port: number): void;
42
+ /**
43
+ * 获取当前已使用的端口数量
44
+ */
45
+ getUsedPortCount(): number;
46
+ /**
47
+ * 清理所有端口
48
+ */
49
+ cleanup(): void;
50
+ }
51
+ //# sourceMappingURL=portUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portUtils.d.ts","sourceRoot":"","sources":["../../src/core/portUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAezD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAepE;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAgC5F;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,QAAQ,GAAE,MAAa;IAInC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAYrC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}