@crewx/search 0.1.5 → 0.1.7
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/SKILL.md +56 -56
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/src/engine.d.ts +4 -1
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +37 -16
- package/dist/src/engine.js.map +1 -1
- package/package.json +23 -12
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: crewx/search
|
|
3
|
-
description: BM25
|
|
3
|
+
description: BM25-based document/code search skill. Smarter than grep -- compound keywords, relevance scoring, semantic matching.
|
|
4
4
|
metadata:
|
|
5
5
|
version: 0.1.0
|
|
6
6
|
built-in: true
|
|
@@ -8,14 +8,14 @@ metadata:
|
|
|
8
8
|
|
|
9
9
|
# Search BM25 Skill
|
|
10
10
|
|
|
11
|
-
grep
|
|
11
|
+
Smarter than grep -- BM25-based search that understands compound keywords and sorts by relevance score.
|
|
12
12
|
|
|
13
13
|
## When to Use This Skill
|
|
14
14
|
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
- grep
|
|
18
|
-
-
|
|
15
|
+
- Finding specific topics in documents
|
|
16
|
+
- Finding related files in a codebase
|
|
17
|
+
- When grep can't find what you need
|
|
18
|
+
- Searching with multiple keyword combinations
|
|
19
19
|
|
|
20
20
|
## Setup
|
|
21
21
|
|
|
@@ -25,109 +25,109 @@ npm install
|
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
**Dependencies:**
|
|
28
|
-
- wink-bm25-text-search (BM25
|
|
29
|
-
- wink-nlp-utils (
|
|
30
|
-
- gray-matter (
|
|
31
|
-
- glob (
|
|
28
|
+
- wink-bm25-text-search (BM25 search engine)
|
|
29
|
+
- wink-nlp-utils (tokenizer, stemming)
|
|
30
|
+
- gray-matter (markdown frontmatter parsing)
|
|
31
|
+
- glob (file pattern matching)
|
|
32
32
|
|
|
33
33
|
## Quick Start
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
#
|
|
37
|
-
npx search "
|
|
36
|
+
# Search markdown files (default)
|
|
37
|
+
npx search "launcher architecture" .
|
|
38
38
|
|
|
39
|
-
#
|
|
39
|
+
# Specific directory
|
|
40
40
|
npx search "API endpoint" ./docs
|
|
41
41
|
|
|
42
|
-
# JS/TS
|
|
42
|
+
# JS/TS file search
|
|
43
43
|
npx search "authentication" ./src --glob="**/*.{js,ts}"
|
|
44
44
|
|
|
45
|
-
#
|
|
45
|
+
# Limit result count
|
|
46
46
|
npx search "error handling" . --limit=10
|
|
47
47
|
|
|
48
|
-
# JSON
|
|
48
|
+
# JSON output
|
|
49
49
|
npx search "database" . --json
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
## Options
|
|
53
53
|
|
|
54
|
-
|
|
|
55
|
-
|
|
56
|
-
| `--glob=<pattern>` |
|
|
57
|
-
| `--limit=<n>` |
|
|
58
|
-
| `--json` | JSON
|
|
54
|
+
| Option | Description | Default |
|
|
55
|
+
|--------|-------------|---------|
|
|
56
|
+
| `--glob=<pattern>` | File pattern | `**/*.md` |
|
|
57
|
+
| `--limit=<n>` | Limit result count | 20 |
|
|
58
|
+
| `--json` | JSON format output | false |
|
|
59
59
|
|
|
60
60
|
## grep vs search
|
|
61
61
|
|
|
62
62
|
| | grep | search |
|
|
63
63
|
|--|------|--------|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
|
64
|
+
| Exact string | Yes | Yes |
|
|
65
|
+
| Compound keywords | No | Yes |
|
|
66
|
+
| Relevance scoring | No | Yes |
|
|
67
|
+
| Semantic similarity | No | Partial (BM25) |
|
|
68
|
+
| Korean search | Yes | Yes |
|
|
69
69
|
|
|
70
70
|
## Examples
|
|
71
71
|
|
|
72
|
-
###
|
|
72
|
+
### Document Search
|
|
73
73
|
```bash
|
|
74
|
-
#
|
|
74
|
+
# Find documents related to CrewX launcher
|
|
75
75
|
npx search "CrewX launcher electron architecture" ./docs
|
|
76
76
|
|
|
77
|
-
#
|
|
78
|
-
# [17.5
|
|
79
|
-
# [12.3
|
|
77
|
+
# Result:
|
|
78
|
+
# [17.5] docs/launcher/architecture.md
|
|
79
|
+
# [12.3] docs/decisions/2025-12-24-launcher.md
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
###
|
|
82
|
+
### Code Search
|
|
83
83
|
```bash
|
|
84
|
-
#
|
|
84
|
+
# Find authentication-related code
|
|
85
85
|
npx search "authentication JWT token" ./src --glob="**/*.ts"
|
|
86
86
|
|
|
87
|
-
#
|
|
88
|
-
# [15.2
|
|
89
|
-
# [10.8
|
|
87
|
+
# Result:
|
|
88
|
+
# [15.2] src/auth/jwt.service.ts
|
|
89
|
+
# [10.8] src/middleware/auth.middleware.ts
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
###
|
|
92
|
+
### Multi-language Search
|
|
93
93
|
```bash
|
|
94
|
-
#
|
|
95
|
-
npx search "
|
|
94
|
+
# Find error handling content
|
|
95
|
+
npx search "error handling exception" . --glob="**/*.md"
|
|
96
96
|
|
|
97
|
-
#
|
|
98
|
-
# [3
|
|
99
|
-
# [2
|
|
97
|
+
# Result:
|
|
98
|
+
# [3] docs/troubleshooting.md
|
|
99
|
+
# [2] docs/error-handling.md
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
## How It Works
|
|
103
103
|
|
|
104
|
-
1.
|
|
105
|
-
2.
|
|
106
|
-
3.
|
|
107
|
-
4.
|
|
104
|
+
1. **File collection**: Find target files using glob pattern
|
|
105
|
+
2. **Indexing**: Register each file's content in the BM25 engine
|
|
106
|
+
3. **Search**: Tokenize the query and calculate scores
|
|
107
|
+
4. **Sorting**: Output in descending order of relevance score
|
|
108
108
|
|
|
109
|
-
###
|
|
110
|
-
- **TF (Term Frequency)**:
|
|
111
|
-
- **IDF (Inverse Document Frequency)**:
|
|
112
|
-
-
|
|
109
|
+
### Score Calculation (BM25)
|
|
110
|
+
- **TF (Term Frequency)**: Word occurrence frequency
|
|
111
|
+
- **IDF (Inverse Document Frequency)**: Rarer words get higher scores
|
|
112
|
+
- **Document length normalization**: Matches in shorter documents are more significant
|
|
113
113
|
|
|
114
114
|
## Tips
|
|
115
115
|
|
|
116
|
-
1.
|
|
116
|
+
1. **Use multiple keywords**: BM25 also scores partial matches
|
|
117
117
|
```bash
|
|
118
|
-
#
|
|
118
|
+
# Good: multiple related keywords
|
|
119
119
|
search "API authentication JWT refresh token"
|
|
120
120
|
|
|
121
|
-
#
|
|
121
|
+
# Bad: single word only
|
|
122
122
|
search "API"
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
-
2.
|
|
125
|
+
2. **Mixed language search supported**
|
|
126
126
|
```bash
|
|
127
|
-
search "
|
|
127
|
+
search "launcher Electron Tauri architecture"
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
-
3.
|
|
130
|
+
3. **Adjust limit if too many results**
|
|
131
131
|
```bash
|
|
132
132
|
search "config" . --limit=5
|
|
133
133
|
```
|
package/dist/cli.js
CHANGED
|
@@ -137,7 +137,8 @@ For detailed usage guide: search usage
|
|
|
137
137
|
}
|
|
138
138
|
if (require.main === module) {
|
|
139
139
|
loadTracer().then(tracer => {
|
|
140
|
-
|
|
140
|
+
const opts = tracer ? { skillVersion: tracer.getOwnSkillVersion(__dirname) } : {};
|
|
141
|
+
return tracer ? tracer.run('crewx/search', () => main(), opts) : main();
|
|
141
142
|
}).catch(console.error);
|
|
142
143
|
}
|
|
143
144
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/engine.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import type { SearchOptions } from './types';
|
|
1
|
+
import type { SearchOptions, SearchResult } from './types';
|
|
2
2
|
export declare class SearchEngine {
|
|
3
|
+
private collectDocuments;
|
|
4
|
+
private runBm25Search;
|
|
3
5
|
search(opts: SearchOptions): Promise<void>;
|
|
6
|
+
searchAndReturn(opts: SearchOptions): Promise<SearchResult[]>;
|
|
4
7
|
}
|
|
5
8
|
//# sourceMappingURL=engine.d.ts.map
|
package/dist/src/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAY,aAAa,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAY,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKrE,qBAAa,YAAY;YAKT,gBAAgB;IAkD9B,OAAO,CAAC,aAAa;IAwCf,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAoE1C,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAiBpE"}
|
package/dist/src/engine.js
CHANGED
|
@@ -38,16 +38,13 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const glob_1 = require("glob");
|
|
40
40
|
const knowledge_core_1 = require("@crewx/knowledge-core");
|
|
41
|
+
const MAX_BODY_SIZE = 10 * 1024 * 1024;
|
|
41
42
|
class SearchEngine {
|
|
42
|
-
async
|
|
43
|
-
const { query, searchPath: rawPath = '.', glob: globPattern = '**/*.md', limit = 20, json = false, } = opts;
|
|
44
|
-
const searchPath = path.resolve(rawPath);
|
|
43
|
+
async collectDocuments(searchPath, globPattern) {
|
|
45
44
|
const pattern = path.join(searchPath, globPattern);
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
45
|
+
const config = (0, knowledge_core_1.loadDocsConfig)((0, knowledge_core_1.resolveProjectRoot)(searchPath));
|
|
46
|
+
const ignore = (0, knowledge_core_1.buildIgnorePatterns)(config.exclude);
|
|
47
|
+
const files = await (0, glob_1.glob)(pattern, { nodir: true, ignore });
|
|
51
48
|
const docs = [];
|
|
52
49
|
for (const file of files) {
|
|
53
50
|
try {
|
|
@@ -73,16 +70,17 @@ class SearchEngine {
|
|
|
73
70
|
file: relativePath,
|
|
74
71
|
fullPath: file,
|
|
75
72
|
title,
|
|
76
|
-
body: body.substring(0,
|
|
73
|
+
body: body.substring(0, MAX_BODY_SIZE),
|
|
77
74
|
});
|
|
78
75
|
}
|
|
79
76
|
catch {
|
|
80
77
|
}
|
|
81
78
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
79
|
+
return { docs, fileCount: files.length };
|
|
80
|
+
}
|
|
81
|
+
runBm25Search(docs, query, limit) {
|
|
82
|
+
if (docs.length < 3)
|
|
83
|
+
return [];
|
|
86
84
|
const kcEntries = docs.map((doc, idx) => ({
|
|
87
85
|
id: String(idx),
|
|
88
86
|
type: 'document',
|
|
@@ -96,14 +94,28 @@ class SearchEngine {
|
|
|
96
94
|
fullPath: doc.fullPath,
|
|
97
95
|
}));
|
|
98
96
|
const scored = (0, knowledge_core_1.searchEntries)(kcEntries, query, { title: 3, body: 1 });
|
|
99
|
-
|
|
97
|
+
const results = scored.map(entry => ({
|
|
100
98
|
file: entry['file'],
|
|
101
99
|
fullPath: entry['fullPath'],
|
|
102
100
|
title: entry['title'],
|
|
103
101
|
body: entry.body || '',
|
|
104
102
|
score: entry._score,
|
|
105
103
|
}));
|
|
106
|
-
|
|
104
|
+
return results.slice(0, limit);
|
|
105
|
+
}
|
|
106
|
+
async search(opts) {
|
|
107
|
+
const { query, searchPath: rawPath = '.', glob: globPattern = '**/*.md', limit = 20, json = false, } = opts;
|
|
108
|
+
const searchPath = path.resolve(rawPath);
|
|
109
|
+
const { docs, fileCount } = await this.collectDocuments(searchPath, globPattern);
|
|
110
|
+
if (fileCount === 0) {
|
|
111
|
+
console.log(`파일을 찾을 수 없습니다: ${path.join(searchPath, globPattern)}`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
if (docs.length === 0) {
|
|
115
|
+
console.log('읽을 수 있는 파일이 없습니다.');
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
const results = this.runBm25Search(docs, query, limit);
|
|
107
119
|
if (results.length === 0) {
|
|
108
120
|
console.log(`'${query}' 관련 결과를 찾을 수 없습니다.`);
|
|
109
121
|
process.exit(0);
|
|
@@ -116,7 +128,7 @@ class SearchEngine {
|
|
|
116
128
|
})), null, 2));
|
|
117
129
|
}
|
|
118
130
|
else {
|
|
119
|
-
console.log(`\n🔍 검색: "${query}" (${results.length}건, ${
|
|
131
|
+
console.log(`\n🔍 검색: "${query}" (${results.length}건, ${fileCount}개 파일 중)\n`);
|
|
120
132
|
for (const r of results) {
|
|
121
133
|
const title = r.title.substring(0, 60).replace(/\n/g, ' ');
|
|
122
134
|
console.log(`[${r.score}점] ${r.file}`);
|
|
@@ -134,6 +146,15 @@ class SearchEngine {
|
|
|
134
146
|
console.log(searchBlock);
|
|
135
147
|
}
|
|
136
148
|
}
|
|
149
|
+
async searchAndReturn(opts) {
|
|
150
|
+
const { query, searchPath: rawPath = '.', glob: globPattern = '**/*.md', limit = 20, } = opts;
|
|
151
|
+
const searchPath = path.resolve(rawPath);
|
|
152
|
+
const { docs } = await this.collectDocuments(searchPath, globPattern);
|
|
153
|
+
if (docs.length === 0) {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
return this.runBm25Search(docs, query, limit);
|
|
157
|
+
}
|
|
137
158
|
}
|
|
138
159
|
exports.SearchEngine = SearchEngine;
|
|
139
160
|
//# sourceMappingURL=engine.js.map
|
package/dist/src/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,uCAAyB;AACzB,2CAA6B;AAC7B,+BAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crewx/search",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "BM25 full-text search engine for CrewX documents and code",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/src/engine.js",
|
|
@@ -18,23 +18,34 @@
|
|
|
18
18
|
"default": "./dist/cli.js"
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
|
-
"bin": {
|
|
22
|
-
|
|
23
|
-
"scripts": {
|
|
24
|
-
"build": "tsc",
|
|
25
|
-
"dev": "ts-node cli.ts",
|
|
26
|
-
"clean": "rm -rf dist"
|
|
21
|
+
"bin": {
|
|
22
|
+
"search": "./dist/cli.js"
|
|
27
23
|
},
|
|
28
|
-
"
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"SKILL.md"
|
|
27
|
+
],
|
|
28
|
+
"keywords": [
|
|
29
|
+
"crewx",
|
|
30
|
+
"search",
|
|
31
|
+
"bm25",
|
|
32
|
+
"full-text"
|
|
33
|
+
],
|
|
29
34
|
"license": "MIT",
|
|
30
35
|
"dependencies": {
|
|
31
|
-
"
|
|
32
|
-
"@crewx/
|
|
33
|
-
"
|
|
36
|
+
"glob": "^10.0.0",
|
|
37
|
+
"@crewx/shared": "0.0.4",
|
|
38
|
+
"@crewx/knowledge-core": "0.1.4"
|
|
34
39
|
},
|
|
35
40
|
"devDependencies": {
|
|
36
41
|
"@types/node": "^20.0.0",
|
|
37
42
|
"ts-node": "^10.9.0",
|
|
38
43
|
"typescript": "^5.0.0"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc",
|
|
47
|
+
"dev": "ts-node cli.ts",
|
|
48
|
+
"clean": "rm -rf dist",
|
|
49
|
+
"test": "echo no tests"
|
|
39
50
|
}
|
|
40
|
-
}
|
|
51
|
+
}
|