skill-creator 1.0.0 → 1.1.1
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 +14 -5
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -29
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.js +2 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/core/chromaSearch.d.ts +2 -2
- package/dist/core/chromaSearch.d.ts.map +1 -1
- package/dist/core/chromaSearch.js +11 -9
- package/dist/core/chromaSearch.js.map +1 -1
- package/dist/core/skillCreator.d.ts +2 -2
- package/dist/core/skillCreator.d.ts.map +1 -1
- package/dist/core/skillCreator.js +39 -116
- package/dist/core/skillCreator.js.map +1 -1
- package/dist/core/templateManager.d.ts +2 -1
- package/dist/core/templateManager.d.ts.map +1 -1
- package/dist/core/templateManager.js +19 -13
- package/dist/core/templateManager.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/SKILL.md +193 -0
- package/templates/SKILL.zh-CN.md +193 -0
- package/templates/skill-creator.md +6 -4
- package/templates/skill-creator.zh-CN.md +9 -4
- package/dist/commands/initCc.d.ts +0 -5
- package/dist/commands/initCc.d.ts.map +0 -1
- package/dist/commands/initCc.js +0 -26
- package/dist/commands/initCc.js.map +0 -1
- package/dist/commands/updateContext7.d.ts +0 -5
- package/dist/commands/updateContext7.d.ts.map +0 -1
- package/dist/commands/updateContext7.js +0 -28
- package/dist/commands/updateContext7.js.map +0 -1
- package/dist/core/chromaLocalSearch.d.ts +0 -26
- package/dist/core/chromaLocalSearch.d.ts.map +0 -1
- package/dist/core/chromaLocalSearch.js +0 -212
- package/dist/core/chromaLocalSearch.js.map +0 -1
- package/dist/core/chromaLocalSimple.d.ts +0 -24
- package/dist/core/chromaLocalSimple.d.ts.map +0 -1
- package/dist/core/chromaLocalSimple.js +0 -216
- package/dist/core/chromaLocalSimple.js.map +0 -1
- package/dist/core/chromaSearchImproved.d.ts +0 -29
- package/dist/core/chromaSearchImproved.d.ts.map +0 -1
- package/dist/core/chromaSearchImproved.js +0 -259
- package/dist/core/chromaSearchImproved.js.map +0 -1
- package/dist/core/fuseSearch.d.ts +0 -25
- package/dist/core/fuseSearch.d.ts.map +0 -1
- package/dist/core/fuseSearch.js +0 -198
- package/dist/core/fuseSearch.js.map +0 -1
- package/dist/core/fuzzySearch.d.ts +0 -66
- package/dist/core/fuzzySearch.d.ts.map +0 -1
- package/dist/core/fuzzySearch.js +0 -271
- package/dist/core/fuzzySearch.js.map +0 -1
- package/dist/core/searchEngine.d.ts +0 -25
- package/dist/core/searchEngine.d.ts.map +0 -1
- package/dist/core/searchEngine.js +0 -198
- package/dist/core/searchEngine.js.map +0 -1
- package/dist/core/simpleLocalSearch.d.ts +0 -50
- package/dist/core/simpleLocalSearch.d.ts.map +0 -1
- package/dist/core/simpleLocalSearch.js +0 -406
- package/dist/core/simpleLocalSearch.js.map +0 -1
- package/dist/core/simpleSearch.d.ts +0 -21
- package/dist/core/simpleSearch.d.ts.map +0 -1
- package/dist/core/simpleSearch.js +0 -113
- package/dist/core/simpleSearch.js.map +0 -1
- package/dist/test/testFuzzy.d.ts +0 -3
- package/dist/test/testFuzzy.d.ts.map +0 -1
- package/dist/test/testFuzzy.js +0 -72
- package/dist/test/testFuzzy.js.map +0 -1
- package/dist/test-fuzzy.d.ts +0 -6
- package/dist/test-fuzzy.d.ts.map +0 -1
- package/dist/test-fuzzy.js +0 -65
- package/dist/test-fuzzy.js.map +0 -1
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 优化后的 ChromaDB-based search engine with local file storage support
|
|
3
|
-
*/
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
6
|
-
import { glob } from 'glob';
|
|
7
|
-
import { createHash } from 'node:crypto';
|
|
8
|
-
export class ChromaSearchEngine {
|
|
9
|
-
client = null;
|
|
10
|
-
collection = null;
|
|
11
|
-
options;
|
|
12
|
-
embeddingFunction = null;
|
|
13
|
-
mode = 'http';
|
|
14
|
-
constructor(options) {
|
|
15
|
-
this.options = {
|
|
16
|
-
mode: 'auto',
|
|
17
|
-
...options
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
async initializeEmbeddingFunction() {
|
|
21
|
-
if (!this.embeddingFunction) {
|
|
22
|
-
const { DefaultEmbeddingFunction } = await import('@chroma-core/default-embed');
|
|
23
|
-
this.embeddingFunction = new DefaultEmbeddingFunction();
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async initializeClient() {
|
|
27
|
-
await this.initializeEmbeddingFunction();
|
|
28
|
-
const { ChromaClient } = await import('chromadb');
|
|
29
|
-
// 尝试 HTTP 模式(优先)
|
|
30
|
-
if (this.options.mode === 'http' || this.options.mode === 'auto') {
|
|
31
|
-
try {
|
|
32
|
-
console.log('🔗 尝试 HTTP 模式: http://localhost:8000');
|
|
33
|
-
this.client = new ChromaClient({
|
|
34
|
-
path: 'http://localhost:8000',
|
|
35
|
-
});
|
|
36
|
-
// 测试连接
|
|
37
|
-
await this.client.heartbeat();
|
|
38
|
-
this.mode = 'http';
|
|
39
|
-
console.log('✅ HTTP 模式连接成功');
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
catch (httpError) {
|
|
43
|
-
console.log('❌ HTTP 模式连接失败:', httpError.message);
|
|
44
|
-
if (this.options.mode === 'http') {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// 尝试本地文件存储模式
|
|
50
|
-
if (!this.client && (this.options.mode === 'local' || this.options.mode === 'auto')) {
|
|
51
|
-
try {
|
|
52
|
-
console.log('🔧 尝试本地文件存储模式:', this.options.dbPath);
|
|
53
|
-
// 确保目录存在
|
|
54
|
-
if (!existsSync(this.options.dbPath)) {
|
|
55
|
-
mkdirSync(this.options.dbPath, { recursive: true });
|
|
56
|
-
}
|
|
57
|
-
this.client = new ChromaClient({
|
|
58
|
-
path: this.options.dbPath
|
|
59
|
-
});
|
|
60
|
-
// 初始化客户端
|
|
61
|
-
await this.client.init();
|
|
62
|
-
this.mode = 'local';
|
|
63
|
-
console.log('✅ 本地文件存储模式初始化成功');
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
catch (localError) {
|
|
67
|
-
console.log('❌ 本地文件存储模式失败:', localError.message);
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
console.log('❌ 所有 ChromaDB 模式都失败');
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
async getCollection() {
|
|
75
|
-
if (!this.client) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
this.collection = await this.client.getOrCreateCollection({
|
|
80
|
-
name: this.options.collectionName,
|
|
81
|
-
embeddingFunction: this.embeddingFunction,
|
|
82
|
-
});
|
|
83
|
-
console.log('✅ Collection 创建/获取成功');
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
catch (collectionError) {
|
|
87
|
-
console.log('❌ Collection 操作失败:', collectionError.message);
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
async initializeIfNeeded() {
|
|
92
|
-
if (!this.client || !this.collection) {
|
|
93
|
-
const clientOk = await this.initializeClient();
|
|
94
|
-
if (!clientOk) {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
const collectionOk = await this.getCollection();
|
|
98
|
-
if (!collectionOk) {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
async buildIndex(referencesDir, hashFile) {
|
|
105
|
-
try {
|
|
106
|
-
if (!await this.initializeIfNeeded()) {
|
|
107
|
-
throw new Error('ChromaDB 初始化失败');
|
|
108
|
-
}
|
|
109
|
-
// Get all markdown files
|
|
110
|
-
const files = await glob('**/*.md', { cwd: referencesDir });
|
|
111
|
-
if (files.length === 0) {
|
|
112
|
-
console.log('ℹ️ 没有找到文档文件来建立索引');
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
// Calculate current hash
|
|
116
|
-
const fileContents = files.map(file => {
|
|
117
|
-
const content = readFileSync(join(referencesDir, file), 'utf-8');
|
|
118
|
-
return `${file}:${content}`;
|
|
119
|
-
});
|
|
120
|
-
const h = createHash('sha256');
|
|
121
|
-
h.update(fileContents.join('\n'));
|
|
122
|
-
const currentHash = h.digest('hex');
|
|
123
|
-
// Check if we need to rebuild
|
|
124
|
-
if (existsSync(hashFile)) {
|
|
125
|
-
const lastHash = readFileSync(hashFile, 'utf-8');
|
|
126
|
-
if (lastHash === currentHash) {
|
|
127
|
-
console.log('ℹ️ 索引是最新的');
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
console.log(`🔄 正在索引 ${files.length} 个文档 (模式: ${this.mode})...`);
|
|
132
|
-
// Clear existing data
|
|
133
|
-
try {
|
|
134
|
-
await this.collection.delete();
|
|
135
|
-
}
|
|
136
|
-
catch (deleteError) {
|
|
137
|
-
console.log('⚠️ 清理现有数据时出错:', deleteError.message);
|
|
138
|
-
}
|
|
139
|
-
// Process and add documents
|
|
140
|
-
const documents = [];
|
|
141
|
-
const metadatas = [];
|
|
142
|
-
const ids = [];
|
|
143
|
-
for (const file of files) {
|
|
144
|
-
const content = readFileSync(join(referencesDir, file), 'utf-8');
|
|
145
|
-
const sections = this.splitIntoSections(content);
|
|
146
|
-
for (let i = 0; i < sections.length; i++) {
|
|
147
|
-
const section = sections[i];
|
|
148
|
-
const docId = `${file.replace(/[^a-zA-Z0-9._-]/g, '_')}_${i}`;
|
|
149
|
-
documents.push(section.content);
|
|
150
|
-
metadatas.push({
|
|
151
|
-
source: file,
|
|
152
|
-
section: i,
|
|
153
|
-
title: section.title || `Section ${i + 1}`,
|
|
154
|
-
totalSections: sections.length,
|
|
155
|
-
mode: this.mode
|
|
156
|
-
});
|
|
157
|
-
ids.push(docId);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
if (documents.length > 0) {
|
|
161
|
-
await this.collection.add({
|
|
162
|
-
ids,
|
|
163
|
-
documents,
|
|
164
|
-
metadatas
|
|
165
|
-
});
|
|
166
|
-
console.log(`✅ 成功索引 ${documents.length} 个文档片段`);
|
|
167
|
-
}
|
|
168
|
-
// Save hash
|
|
169
|
-
writeFileSync(hashFile, currentHash);
|
|
170
|
-
console.log('✅ 索引哈希已保存');
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
173
|
-
console.log('❌ 索引构建失败:', error.message);
|
|
174
|
-
throw error;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
async search(query, topK = 5, where) {
|
|
178
|
-
try {
|
|
179
|
-
if (!await this.initializeIfNeeded()) {
|
|
180
|
-
throw new Error('ChromaDB 不可用');
|
|
181
|
-
}
|
|
182
|
-
const results = await this.collection.query({
|
|
183
|
-
queryTexts: [query],
|
|
184
|
-
nResults: topK,
|
|
185
|
-
where: where
|
|
186
|
-
});
|
|
187
|
-
return results.ids.map((id, index) => ({
|
|
188
|
-
id,
|
|
189
|
-
title: results.metadatas[index]?.title || `Document ${index + 1}`,
|
|
190
|
-
content: results.documents[index],
|
|
191
|
-
source: results.metadatas[index]?.source || 'unknown',
|
|
192
|
-
score: results.distances[index],
|
|
193
|
-
metadata: {
|
|
194
|
-
...results.metadatas[index],
|
|
195
|
-
distance: results.distances[index],
|
|
196
|
-
embeddingDimension: results.embeddings?.[0]?.length || 0,
|
|
197
|
-
searchEngine: 'chroma',
|
|
198
|
-
mode: this.mode
|
|
199
|
-
}
|
|
200
|
-
}));
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
console.log('❌ ChromaDB 搜索失败:', error.message);
|
|
204
|
-
throw error;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
async searchByPriority(query, topK = 5) {
|
|
208
|
-
return this.search(query, topK);
|
|
209
|
-
}
|
|
210
|
-
async getStats() {
|
|
211
|
-
try {
|
|
212
|
-
if (!await this.initializeIfNeeded()) {
|
|
213
|
-
return { totalDocuments: 0 };
|
|
214
|
-
}
|
|
215
|
-
const count = await this.collection.count();
|
|
216
|
-
return { totalDocuments: count };
|
|
217
|
-
}
|
|
218
|
-
catch (error) {
|
|
219
|
-
console.log('❌ 获取统计信息失败:', error.message);
|
|
220
|
-
return { totalDocuments: 0 };
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
splitIntoSections(content) {
|
|
224
|
-
const lines = content.split('\n');
|
|
225
|
-
const sections = [];
|
|
226
|
-
let currentSection = { title: '', content: [] };
|
|
227
|
-
for (const line of lines) {
|
|
228
|
-
const trimmedLine = line.trim();
|
|
229
|
-
// Check if line is a header (starts with #)
|
|
230
|
-
if (trimmedLine.startsWith('#')) {
|
|
231
|
-
// Save previous section if it has content
|
|
232
|
-
if (currentSection.content.length > 0) {
|
|
233
|
-
sections.push({
|
|
234
|
-
title: currentSection.title,
|
|
235
|
-
content: currentSection.content.join('\n').trim()
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
// Start new section
|
|
239
|
-
const title = trimmedLine.replace(/^#+\s*/, '').trim();
|
|
240
|
-
currentSection = { title, content: [] };
|
|
241
|
-
if (title) {
|
|
242
|
-
currentSection.content.push(line); // Include the header line
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
currentSection.content.push(line);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
// Add the last section if it has content
|
|
250
|
-
if (currentSection.content.length > 0) {
|
|
251
|
-
sections.push({
|
|
252
|
-
title: currentSection.title,
|
|
253
|
-
content: currentSection.content.join('\n').trim()
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
return sections;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
//# sourceMappingURL=chromaSearchImproved.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chromaSearchImproved.js","sourceRoot":"","sources":["../../src/core/chromaSearchImproved.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enhanced search engine with Fuse.js integration
|
|
3
|
-
* Provides fuzzy matching, better scoring, and improved search experience
|
|
4
|
-
*/
|
|
5
|
-
import type { SearchResult } from '../types/index.js';
|
|
6
|
-
export interface FuseSearchOptions {
|
|
7
|
-
referencesDir: string;
|
|
8
|
-
collectionName: string;
|
|
9
|
-
}
|
|
10
|
-
export declare class FuseSearchEngine {
|
|
11
|
-
private options;
|
|
12
|
-
private documents;
|
|
13
|
-
private fuse;
|
|
14
|
-
constructor(options: FuseSearchOptions);
|
|
15
|
-
buildIndex(referencesDir: string, hashFile: string): Promise<void>;
|
|
16
|
-
private initializeFuse;
|
|
17
|
-
search(query: string, topK?: number, where?: Record<string, any>): Promise<SearchResult[]>;
|
|
18
|
-
searchByPriority(query: string, topK?: number): Promise<SearchResult[]>;
|
|
19
|
-
getStats(): Promise<{
|
|
20
|
-
totalDocuments: number;
|
|
21
|
-
}>;
|
|
22
|
-
private normalizeFuseScore;
|
|
23
|
-
private splitIntoSections;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=fuseSearch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fuseSearch.d.ts","sourceRoot":"","sources":["../../src/core/fuseSearch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,SAAS,CAOV;IACP,OAAO,CAAC,IAAI,CAAyB;gBAEzB,OAAO,EAAE,iBAAiB;IAIhC,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CxE,OAAO,CAAC,cAAc;IA+BhB,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC;IAoEpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAW1E,QAAQ,IAAI,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAIrD,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,iBAAiB;CA+C1B"}
|
package/dist/core/fuseSearch.js
DELETED
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enhanced search engine with Fuse.js integration
|
|
3
|
-
* Provides fuzzy matching, better scoring, and improved search experience
|
|
4
|
-
*/
|
|
5
|
-
import Fuse from 'fuse.js';
|
|
6
|
-
import { join } from 'node:path';
|
|
7
|
-
import { readFileSync } from 'node:fs';
|
|
8
|
-
import { glob } from 'glob';
|
|
9
|
-
export class FuseSearchEngine {
|
|
10
|
-
options;
|
|
11
|
-
documents = [];
|
|
12
|
-
fuse = null;
|
|
13
|
-
constructor(options) {
|
|
14
|
-
this.options = options;
|
|
15
|
-
}
|
|
16
|
-
async buildIndex(referencesDir, hashFile) {
|
|
17
|
-
console.log('Building enhanced fuzzy search index with Fuse.js...');
|
|
18
|
-
// Get all markdown files
|
|
19
|
-
const files = await glob('**/*.md', { cwd: referencesDir });
|
|
20
|
-
if (files.length === 0) {
|
|
21
|
-
console.log('No documentation files found to index');
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
console.log(`Indexing ${files.length} documents with fuzzy search capabilities...`);
|
|
25
|
-
// Load all documents
|
|
26
|
-
this.documents = [];
|
|
27
|
-
for (const file of files) {
|
|
28
|
-
const content = readFileSync(join(referencesDir, file), 'utf-8');
|
|
29
|
-
const sections = this.splitIntoSections(content);
|
|
30
|
-
for (let i = 0; i < sections.length; i++) {
|
|
31
|
-
const { title, content: sectionContent } = sections[i];
|
|
32
|
-
if (!sectionContent.trim())
|
|
33
|
-
continue;
|
|
34
|
-
const docId = `${file.replace(/\//g, '_')}_${i}`;
|
|
35
|
-
this.documents.push({
|
|
36
|
-
id: docId,
|
|
37
|
-
title,
|
|
38
|
-
content: sectionContent,
|
|
39
|
-
source: file.startsWith('user/') ? 'user' : 'context7',
|
|
40
|
-
file_path: file,
|
|
41
|
-
metadata: {
|
|
42
|
-
section_index: i,
|
|
43
|
-
total_sections: sections.length,
|
|
44
|
-
file_name: file.split('/').pop() || file,
|
|
45
|
-
priority: file.startsWith('user/') ? 10 : 1,
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Initialize Fuse.js with optimized options
|
|
51
|
-
this.initializeFuse();
|
|
52
|
-
console.log(`✅ Enhanced search index built with ${this.documents.length} sections`);
|
|
53
|
-
}
|
|
54
|
-
initializeFuse() {
|
|
55
|
-
const fuseOptions = {
|
|
56
|
-
keys: [
|
|
57
|
-
{
|
|
58
|
-
name: 'title',
|
|
59
|
-
weight: 3.0, // Title matches are most important
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
name: 'content',
|
|
63
|
-
weight: 1.0, // Content matches are important but less than title
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: 'metadata.file_name',
|
|
67
|
-
weight: 2.0, // File name matches are moderately important
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
threshold: 0.3, // Fuzzy matching threshold (0.0 = exact, 1.0 = match anything)
|
|
71
|
-
distance: 100, // Maximum distance between matched characters
|
|
72
|
-
ignoreLocation: false,
|
|
73
|
-
includeScore: true,
|
|
74
|
-
includeMatches: true,
|
|
75
|
-
minMatchCharLength: 2,
|
|
76
|
-
useExtendedSearch: true,
|
|
77
|
-
findAllMatches: true,
|
|
78
|
-
ignoreFieldNorm: false,
|
|
79
|
-
fieldNormWeight: 0.7,
|
|
80
|
-
};
|
|
81
|
-
this.fuse = new Fuse(this.documents, fuseOptions);
|
|
82
|
-
}
|
|
83
|
-
async search(query, topK = 5, where) {
|
|
84
|
-
if (!this.fuse) {
|
|
85
|
-
console.warn('Search index not built. Call buildIndex() first.');
|
|
86
|
-
return [];
|
|
87
|
-
}
|
|
88
|
-
// Filter documents by source if specified
|
|
89
|
-
let searchDocs = this.documents;
|
|
90
|
-
if (where?.source) {
|
|
91
|
-
searchDocs = searchDocs.filter(doc => doc.source === where.source);
|
|
92
|
-
}
|
|
93
|
-
// If no documents match the filter, return empty
|
|
94
|
-
if (searchDocs.length === 0) {
|
|
95
|
-
return [];
|
|
96
|
-
}
|
|
97
|
-
// Create a temporary Fuse instance with filtered documents
|
|
98
|
-
const fuseOptions = {
|
|
99
|
-
keys: [
|
|
100
|
-
{ name: 'title', weight: 3.0 },
|
|
101
|
-
{ name: 'content', weight: 1.0 },
|
|
102
|
-
{ name: 'metadata.file_name', weight: 2.0 },
|
|
103
|
-
],
|
|
104
|
-
threshold: 0.3,
|
|
105
|
-
distance: 100,
|
|
106
|
-
ignoreLocation: false,
|
|
107
|
-
includeScore: true,
|
|
108
|
-
includeMatches: true,
|
|
109
|
-
minMatchCharLength: 2,
|
|
110
|
-
useExtendedSearch: true,
|
|
111
|
-
findAllMatches: true,
|
|
112
|
-
ignoreFieldNorm: false,
|
|
113
|
-
fieldNormWeight: 0.7,
|
|
114
|
-
};
|
|
115
|
-
const filteredFuse = new Fuse(searchDocs, fuseOptions);
|
|
116
|
-
// Perform fuzzy search
|
|
117
|
-
const fuseResults = filteredFuse.search(query, { limit: topK * 2 }); // Get more results to allow for filtering
|
|
118
|
-
// Convert Fuse results to SearchResult format
|
|
119
|
-
const results = fuseResults.map((result, index) => {
|
|
120
|
-
const doc = result.item;
|
|
121
|
-
const score = this.normalizeFuseScore(result.score || 0);
|
|
122
|
-
return {
|
|
123
|
-
id: doc.id,
|
|
124
|
-
title: doc.title,
|
|
125
|
-
content: doc.content,
|
|
126
|
-
source: doc.source,
|
|
127
|
-
file_path: doc.file_path,
|
|
128
|
-
score,
|
|
129
|
-
metadata: {
|
|
130
|
-
...doc.metadata,
|
|
131
|
-
matches: result.matches,
|
|
132
|
-
fuseScore: result.score,
|
|
133
|
-
matchRank: index + 1,
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
});
|
|
137
|
-
// Sort by score (descending) and limit to topK
|
|
138
|
-
return results
|
|
139
|
-
.sort((a, b) => b.score - a.score)
|
|
140
|
-
.slice(0, topK);
|
|
141
|
-
}
|
|
142
|
-
async searchByPriority(query, topK = 5) {
|
|
143
|
-
// First try user content, then context7
|
|
144
|
-
const userResults = await this.search(query, topK, { source: 'user' });
|
|
145
|
-
const contextResults = await this.search(query, topK - userResults.length, { source: 'context7' });
|
|
146
|
-
return [...userResults, ...contextResults].slice(0, topK);
|
|
147
|
-
}
|
|
148
|
-
async getStats() {
|
|
149
|
-
return { totalDocuments: this.documents.length };
|
|
150
|
-
}
|
|
151
|
-
normalizeFuseScore(fuseScore) {
|
|
152
|
-
// Fuse.js scores are 0 (perfect match) to 1 (poor match)
|
|
153
|
-
// Convert to a more intuitive 1.0 (perfect) to 0.0 (poor) scale
|
|
154
|
-
return Math.max(0, 1 - fuseScore);
|
|
155
|
-
}
|
|
156
|
-
splitIntoSections(content) {
|
|
157
|
-
const sections = [];
|
|
158
|
-
const lines = content.split('\n');
|
|
159
|
-
let currentSection = { title: 'Introduction', content: '' };
|
|
160
|
-
let sectionContent = [];
|
|
161
|
-
const headingPattern = /^(#{1,6})\s+(.+)$/;
|
|
162
|
-
for (let i = 0; i < lines.length; i++) {
|
|
163
|
-
const line = lines[i];
|
|
164
|
-
const match = headingPattern.exec(line);
|
|
165
|
-
if (match) {
|
|
166
|
-
// Save previous section if it has content
|
|
167
|
-
if (sectionContent.length > 0) {
|
|
168
|
-
currentSection.content = sectionContent.join('\n').trim();
|
|
169
|
-
// Only add section if it meets minimum content threshold
|
|
170
|
-
if (currentSection.content.length > 50) {
|
|
171
|
-
sections.push({ ...currentSection });
|
|
172
|
-
}
|
|
173
|
-
sectionContent = [];
|
|
174
|
-
}
|
|
175
|
-
// Start new section
|
|
176
|
-
currentSection = {
|
|
177
|
-
title: match[2].trim(),
|
|
178
|
-
content: '',
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
// Add non-heading lines to current section
|
|
183
|
-
if (line.trim() || sectionContent.length > 0) {
|
|
184
|
-
sectionContent.push(line);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// Add the last section
|
|
189
|
-
if (sectionContent.length > 0) {
|
|
190
|
-
currentSection.content = sectionContent.join('\n').trim();
|
|
191
|
-
if (currentSection.content.length > 50) {
|
|
192
|
-
sections.push({ ...currentSection });
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return sections.length > 0 ? sections : [{ title: 'Introduction', content }];
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
//# sourceMappingURL=fuseSearch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fuseSearch.js","sourceRoot":"","sources":["../../src/core/fuseSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type { SearchResult } from '../types/index';
|
|
2
|
-
export interface FuzzySearchOptions {
|
|
3
|
-
/**
|
|
4
|
-
* Threshold for fuzzy matching (0-1)
|
|
5
|
-
* Lower values = more lenient matching
|
|
6
|
-
*/
|
|
7
|
-
fuzzyThreshold?: number;
|
|
8
|
-
/**
|
|
9
|
-
* Whether to prioritize exact matches
|
|
10
|
-
*/
|
|
11
|
-
prioritizeExact?: boolean;
|
|
12
|
-
/**
|
|
13
|
-
* Maximum number of results to return
|
|
14
|
-
*/
|
|
15
|
-
maxResults?: number;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Enhanced search result with additional metadata
|
|
19
|
-
*/
|
|
20
|
-
export interface EnhancedSearchResult extends SearchResult {
|
|
21
|
-
relativePath: string;
|
|
22
|
-
preview?: string;
|
|
23
|
-
fullContent?: string;
|
|
24
|
-
matchRanges?: number[][];
|
|
25
|
-
}
|
|
26
|
-
export declare class FuzzySearchEngine {
|
|
27
|
-
private options;
|
|
28
|
-
private documents;
|
|
29
|
-
constructor(options?: FuzzySearchOptions);
|
|
30
|
-
/**
|
|
31
|
-
* Enhanced fuzzy search function that returns both indices and detailed info
|
|
32
|
-
*/
|
|
33
|
-
private fuzzySearchWithInfo;
|
|
34
|
-
buildIndex(referencesDir: string, hashFile: string): Promise<void>;
|
|
35
|
-
search(query: string, topK?: number, where?: Record<string, any>): Promise<SearchResult[]>;
|
|
36
|
-
/**
|
|
37
|
-
* Calculate fuzzy search score based on uFuzzy info
|
|
38
|
-
*/
|
|
39
|
-
private calculateFuzzyScore;
|
|
40
|
-
/**
|
|
41
|
-
* Smart content selection based on score
|
|
42
|
-
*/
|
|
43
|
-
private selectContent;
|
|
44
|
-
/**
|
|
45
|
-
* Extract preview based on match ranges
|
|
46
|
-
*/
|
|
47
|
-
private extractRangePreview;
|
|
48
|
-
searchByPriority(query: string, topK?: number): Promise<SearchResult[]>;
|
|
49
|
-
/**
|
|
50
|
-
* Get statistics about the search index
|
|
51
|
-
*/
|
|
52
|
-
getStats(): {
|
|
53
|
-
totalDocuments: number;
|
|
54
|
-
userDocuments: number;
|
|
55
|
-
context7Documents: number;
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Check if the search index is built
|
|
59
|
-
*/
|
|
60
|
-
isBuilt(): boolean;
|
|
61
|
-
/**
|
|
62
|
-
* Clear the search index
|
|
63
|
-
*/
|
|
64
|
-
clearIndex(): void;
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=fuzzySearch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzySearch.d.ts","sourceRoot":"","sources":["../../src/core/fuzzySearch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAA;AAK/D,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAA;CACzB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,SAAS,CAOV;gBAEK,OAAO,GAAE,kBAAuB;IAS5C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2BrB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDlE,MAAM,CACV,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC;IAoI1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuBrB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkBhF;;OAEG;IACH,QAAQ;;;;;IAWR;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,UAAU;CAGX"}
|