@lyy0709/contextweaver 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.
package/README.md ADDED
@@ -0,0 +1,475 @@
1
+ # ContextWeaver
2
+
3
+ <p align="center">
4
+ <strong>🧵 为 AI Agent 精心编织的代码库上下文引擎</strong>
5
+ </p>
6
+
7
+ <p align="center">
8
+ <em>Semantic Code Retrieval for AI Agents — Hybrid Search • Graph Expansion • Token-Aware Packing • Prompt Enhancer</em>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="./README.en.md">English</a> | 中文
13
+ </p>
14
+
15
+ ---
16
+
17
+ > **Fork 说明**:本项目 fork 自 [hsingjui/ContextWeaver](https://github.com/hsingjui/ContextWeaver),新增了 **Prompt Enhancer(提示词增强)** 功能,支持 OpenAI / Claude / Gemini 多 LLM 端点、CLI 命令行、Web UI 交互三种使用方式。
18
+
19
+ **ContextWeaver** 是一个专为 AI 代码助手设计的语义检索引擎,采用混合搜索(向量 + 词法)、智能上下文扩展和 Token 感知打包策略,为 LLM 提供精准、相关且上下文完整的代码片段。
20
+
21
+ <p align="center">
22
+ <img src="docs/architecture.png" alt="ContextWeaver 架构概览" width="800" />
23
+ </p>
24
+
25
+ ## ✨ 核心特性
26
+
27
+ ### 🔍 混合检索引擎
28
+ - **向量召回 (Vector Retrieval)**:基于语义相似度的深度理解
29
+ - **词法召回 (Lexical/FTS)**:精确匹配函数名、类名等技术术语
30
+ - **RRF 融合 (Reciprocal Rank Fusion)**:智能融合多路召回结果
31
+
32
+ ### 🧠 AST 语义分片
33
+ - **Tree-sitter 解析**:支持 TypeScript、JavaScript、Python、Go、Java、Rust、C、C++、C# 九大语言
34
+ - **Dual-Text 策略**:`displayCode` 用于展示,`vectorText` 用于 Embedding
35
+ - **Gap-Aware 合并**:智能处理代码间隙,保持语义完整性
36
+ - **Breadcrumb 注入**:向量文本包含层级路径,提升检索召回率
37
+
38
+ ### 📊 三阶段上下文扩展
39
+ - **E1 邻居扩展**:同文件前后相邻 chunks,保证代码块完整性
40
+ - **E2 面包屑补全**:同一类/函数下的其他方法,理解整体结构
41
+ - **E3 Import 解析**:跨文件依赖追踪(可配置开关)
42
+
43
+ ### 🎯 智能截断策略 (Smart TopK)
44
+ - **Anchor & Floor**:动态阈值 + 绝对下限双保险
45
+ - **Delta Guard**:防止 Top1 outlier 场景的误判
46
+ - **Safe Harbor**:前 N 个结果只检查下限,保证基本召回
47
+
48
+ ### 🔌 MCP 原生支持
49
+ - **MCP Server 模式**:一键启动 Model Context Protocol 服务端
50
+ - **Zen Design 理念**:意图与术语分离,LLM 友好的 API 设计
51
+ - **自动索引**:首次查询自动触发索引,增量更新透明无感
52
+
53
+ ### ✏️ Prompt Enhancer(提示词增强)
54
+ - **多 LLM 支持**:OpenAI / Claude / Gemini 一键切换
55
+ - **三种交互方式**:MCP 工具调用、CLI 命令行、Web UI 浏览器交互
56
+ - **自动语言检测**:中文输入自动用中文回复
57
+ - **可自定义模板**:支持自定义增强提示词模板
58
+
59
+ ## 📦 快速开始
60
+
61
+ ### 环境要求
62
+
63
+ - Node.js >= 20
64
+ - pnpm (推荐) 或 npm
65
+
66
+ ### 安装
67
+
68
+ ```bash
69
+ # 全局安装(带 Prompt Enhancer 的增强版)
70
+ npm install -g @lyy0709/contextweaver
71
+
72
+ # 或使用 pnpm
73
+ pnpm add -g @lyy0709/contextweaver
74
+ ```
75
+
76
+ ### 初始化配置
77
+
78
+ ```bash
79
+ # 初始化配置文件(创建 ~/.contextweaver/.env)
80
+ contextweaver init
81
+ # 或简写
82
+ cw init
83
+ ```
84
+
85
+ 编辑 `~/.contextweaver/.env`,填入你的 API Key:
86
+
87
+ ```bash
88
+ # Embedding API 配置(必需)
89
+ EMBEDDINGS_API_KEY=your-api-key-here
90
+ EMBEDDINGS_BASE_URL=https://api.siliconflow.cn/v1/embeddings
91
+ EMBEDDINGS_MODEL=BAAI/bge-m3
92
+ EMBEDDINGS_MAX_CONCURRENCY=10
93
+ EMBEDDINGS_DIMENSIONS=1024
94
+
95
+ # Reranker 配置(必需)
96
+ RERANK_API_KEY=your-api-key-here
97
+ RERANK_BASE_URL=https://api.siliconflow.cn/v1/rerank
98
+ RERANK_MODEL=BAAI/bge-reranker-v2-m3
99
+ RERANK_TOP_N=20
100
+
101
+ # 忽略模式(可选,逗号分隔)
102
+ # IGNORE_PATTERNS=.venv,node_modules
103
+
104
+ # Prompt Enhancer 配置(可选,使用 enhance / enhance-prompt 时需要)
105
+ # PROMPT_ENHANCER_ENDPOINT=openai # 端点:openai / claude / gemini
106
+ # PROMPT_ENHANCER_BASE_URL= # 自定义 API 地址(代理等场景)
107
+ # PROMPT_ENHANCER_TOKEN=your-api-key-here # API 密钥(必填)
108
+ # PROMPT_ENHANCER_MODEL= # 自定义模型
109
+ # PROMPT_ENHANCER_TEMPLATE= # 自定义增强模板文件路径
110
+ ```
111
+
112
+ ### 索引代码库
113
+
114
+ ```bash
115
+ # 在代码库根目录执行
116
+ contextweaver index
117
+
118
+ # 指定路径
119
+ contextweaver index /path/to/your/project
120
+
121
+ # 强制重新索引
122
+ contextweaver index --force
123
+ ```
124
+
125
+ ### 本地搜索
126
+
127
+ ```bash
128
+ # 语义搜索
129
+ cw search --information-request "用户认证流程是如何实现的?"
130
+
131
+ # 带精确术语
132
+ cw search --information-request "数据库连接逻辑" --technical-terms "DatabasePool,Connection"
133
+ ```
134
+
135
+ ### 提示词增强
136
+
137
+ ```bash
138
+ # 默认启动 Web UI 交互式编辑
139
+ cw enhance "帮我实现一个带缓存的语义搜索"
140
+
141
+ # 直接输出到 stdout
142
+ cw enhance "帮我实现一个带缓存的语义搜索" --no-browser
143
+
144
+ # 临时指定端点(openai/claude/gemini)
145
+ cw enhance "帮我实现一个带缓存的语义搜索" --endpoint claude --no-browser
146
+ ```
147
+
148
+ ### 启动 MCP 服务器
149
+
150
+ ```bash
151
+ # 启动 MCP 服务端(供 Claude 等 AI 助手使用)
152
+ contextweaver mcp
153
+ ```
154
+
155
+ ## 🔧 MCP 集成配置
156
+
157
+ ### Claude Desktop / Claude Code 配置
158
+
159
+ 在配置文件中添加:
160
+
161
+ ```json
162
+ {
163
+ "mcpServers": {
164
+ "contextweaver": {
165
+ "command": "contextweaver",
166
+ "args": ["mcp"]
167
+ }
168
+ }
169
+ }
170
+ ```
171
+
172
+ ### MCP 工具说明
173
+
174
+ ContextWeaver 提供两个 MCP 工具:
175
+
176
+ - `codebase-retrieval`:代码库检索(主工具)
177
+ - `enhance-prompt`:提示词增强(可选,需要额外配置外部 LLM API)
178
+
179
+ #### `codebase-retrieval` 参数说明
180
+
181
+ | 参数 | 类型 | 必需 | 描述 |
182
+ |------|------|------|------|
183
+ | `repo_path` | string | ✅ | 代码库根目录的绝对路径 |
184
+ | `information_request` | string | ✅ | 自然语言形式的语义意图描述 |
185
+ | `technical_terms` | string[] | ❌ | 精确技术术语(类名、函数名等) |
186
+
187
+ #### 设计理念 (Zen Design)
188
+
189
+ - **意图与术语分离**:`information_request` 描述「做什么」,`technical_terms` 过滤「叫什么」
190
+ - **黄金默认值**:提供同文件上下文,禁止默认跨文件抓取
191
+ - **回归代理本能**:工具只负责定位,跨文件探索由 Agent 自主发起
192
+
193
+ #### `enhance-prompt` 参数说明
194
+
195
+ | 参数 | 类型 | 必需 | 描述 |
196
+ |------|------|------|------|
197
+ | `prompt` | string | ✅ | 原始提示词 |
198
+ | `conversation_history` | string | ❌ | 对话历史(格式:`User: ...\nAssistant: ...`) |
199
+ | `project_root_path` | string | ❌ | 项目根目录路径 |
200
+
201
+ #### Prompt Enhancer 端点默认值
202
+
203
+ | 端点 | 默认 Base URL | 默认模型 |
204
+ |------|--------------|---------|
205
+ | `openai` | `https://api.openai.com/v1/chat/completions` | `gpt-4o-mini` |
206
+ | `claude` | `https://api.anthropic.com/v1/messages` | `claude-sonnet-4-20250514` |
207
+ | `gemini` | `https://generativelanguage.googleapis.com/v1beta` | `gemini-2.0-flash` |
208
+
209
+ ## 🏗️ 架构设计
210
+
211
+ ```mermaid
212
+ flowchart TB
213
+ subgraph Interface["CLI / MCP Interface"]
214
+ CLI[contextweaver CLI]
215
+ MCP[MCP Server]
216
+ end
217
+
218
+ subgraph Search["SearchService"]
219
+ VR[Vector Retrieval]
220
+ LR[Lexical Retrieval]
221
+ RRF[RRF Fusion + Rerank]
222
+ VR --> RRF
223
+ LR --> RRF
224
+ end
225
+
226
+ subgraph Expand["Context Expansion"]
227
+ GE[GraphExpander]
228
+ CP[ContextPacker]
229
+ GE --> CP
230
+ end
231
+
232
+ subgraph Storage["Storage Layer"]
233
+ VS[(VectorStore<br/>LanceDB)]
234
+ DB[(SQLite<br/>FTS5)]
235
+ end
236
+
237
+ subgraph Index["Indexing Pipeline"]
238
+ CR[Crawler<br/>fdir] --> SS[SemanticSplitter<br/>Tree-sitter] --> IX[Indexer<br/>Batch Embedding]
239
+ end
240
+
241
+ subgraph Enhancer["Prompt Enhancer"]
242
+ PE[enhancePrompt]
243
+ LLM[LLM Adapters<br/>OpenAI / Claude / Gemini]
244
+ WEB[Web UI Server]
245
+ PE --> LLM
246
+ PE --> WEB
247
+ end
248
+
249
+ Interface --> Search
250
+ Interface --> Enhancer
251
+ RRF --> GE
252
+ Search <--> Storage
253
+ Expand <--> Storage
254
+ Index --> Storage
255
+ ```
256
+
257
+ ### 核心模块说明
258
+
259
+ | 模块 | 职责 |
260
+ |------|------|
261
+ | **SearchService** | 混合搜索核心,协调向量/词法召回、RRF 融合、Rerank 精排 |
262
+ | **GraphExpander** | 上下文扩展器,执行 E1/E2/E3 三阶段扩展策略 |
263
+ | **ContextPacker** | 上下文打包器,负责段落合并和 Token 预算控制 |
264
+ | **VectorStore** | LanceDB 适配层,管理向量索引的增删改查 |
265
+ | **SQLite (FTS5)** | 元数据存储 + 全文搜索索引 |
266
+ | **SemanticSplitter** | AST 语义分片器,基于 Tree-sitter 解析 |
267
+ | **Prompt Enhancer** | 提示词增强,多 LLM 适配,Web UI 交互 |
268
+
269
+ ## 📁 项目结构
270
+
271
+ ```
272
+ contextweaver/
273
+ ├── src/
274
+ │ ├── index.ts # CLI 入口
275
+ │ ├── config.ts # 配置管理(环境变量)
276
+ │ ├── api/ # 外部 API 封装
277
+ │ │ ├── embed.ts # Embedding API
278
+ │ │ └── rerank.ts # Reranker API
279
+ │ ├── chunking/ # 语义分片
280
+ │ │ ├── SemanticSplitter.ts # AST 语义分片器
281
+ │ │ ├── SourceAdapter.ts # 源码适配器
282
+ │ │ ├── LanguageSpec.ts # 语言规范定义
283
+ │ │ └── ParserPool.ts # Tree-sitter 解析器池
284
+ │ ├── scanner/ # 文件扫描
285
+ │ │ ├── crawler.ts # 文件系统遍历
286
+ │ │ ├── processor.ts # 文件处理
287
+ │ │ └── filter.ts # 过滤规则
288
+ │ ├── indexer/ # 索引器
289
+ │ │ └── index.ts # 批量索引逻辑
290
+ │ ├── vectorStore/ # 向量存储
291
+ │ │ └── index.ts # LanceDB 适配层
292
+ │ ├── db/ # 数据库
293
+ │ │ └── index.ts # SQLite + FTS5
294
+ │ ├── search/ # 搜索服务
295
+ │ │ ├── SearchService.ts # 核心搜索服务
296
+ │ │ ├── GraphExpander.ts # 上下文扩展器
297
+ │ │ ├── ContextPacker.ts # 上下文打包器
298
+ │ │ ├── fts.ts # 全文搜索
299
+ │ │ ├── config.ts # 搜索配置
300
+ │ │ ├── types.ts # 类型定义
301
+ │ │ └── resolvers/ # 多语言 Import 解析器
302
+ │ ├── enhancer/ # Prompt Enhancer(提示词增强)
303
+ │ │ ├── index.ts # 增强服务编排
304
+ │ │ ├── template.ts # 模板管理
305
+ │ │ ├── detect.ts # 语言检测
306
+ │ │ ├── parser.ts # 响应解析
307
+ │ │ ├── llmClient.ts # LLM 客户端接口 + 工厂
308
+ │ │ ├── server.ts # Web UI HTTP 服务器
309
+ │ │ ├── ui.ts # 前端页面模板
310
+ │ │ ├── browser.ts # 浏览器启动
311
+ │ │ └── adapters/ # LLM API 适配器
312
+ │ │ ├── openai.ts
313
+ │ │ ├── claude.ts
314
+ │ │ └── gemini.ts
315
+ │ ├── mcp/ # MCP 服务端
316
+ │ │ ├── server.ts # MCP 服务器实现
317
+ │ │ ├── main.ts # MCP 入口
318
+ │ │ └── tools/
319
+ │ │ ├── codebaseRetrieval.ts # 代码检索工具
320
+ │ │ └── enhancePrompt.ts # 提示词增强工具
321
+ │ └── utils/ # 工具函数
322
+ │ └── logger.ts # 日志系统
323
+ ├── tests/ # 单元测试
324
+ ├── package.json
325
+ ├── tsconfig.json
326
+ └── vitest.config.ts
327
+ ```
328
+
329
+ ## ⚙️ 配置详解
330
+
331
+ ### 环境变量
332
+
333
+ | 变量名 | 必需 | 默认值 | 描述 |
334
+ |--------|------|--------|------|
335
+ | `EMBEDDINGS_API_KEY` | ✅ | - | Embedding API 密钥 |
336
+ | `EMBEDDINGS_BASE_URL` | ✅ | - | Embedding API 地址 |
337
+ | `EMBEDDINGS_MODEL` | ✅ | - | Embedding 模型名称 |
338
+ | `EMBEDDINGS_MAX_CONCURRENCY` | ❌ | 10 | Embedding 并发数 |
339
+ | `EMBEDDINGS_DIMENSIONS` | ❌ | 1024 | 向量维度 |
340
+ | `RERANK_API_KEY` | ✅ | - | Reranker API 密钥 |
341
+ | `RERANK_BASE_URL` | ✅ | - | Reranker API 地址 |
342
+ | `RERANK_MODEL` | ✅ | - | Reranker 模型名称 |
343
+ | `RERANK_TOP_N` | ❌ | 20 | Rerank 返回数量 |
344
+ | `IGNORE_PATTERNS` | ❌ | - | 额外忽略模式 |
345
+ | `PROMPT_ENHANCER_ENDPOINT` | ❌ | `openai` | 增强端点(openai/claude/gemini) |
346
+ | `PROMPT_ENHANCER_TOKEN` | ❌* | - | 增强 API 密钥(*使用 enhance 时必填) |
347
+ | `PROMPT_ENHANCER_BASE_URL` | ❌ | 按端点 | 自定义增强 API 地址 |
348
+ | `PROMPT_ENHANCER_MODEL` | ❌ | 按端点 | 自定义增强模型 |
349
+ | `PROMPT_ENHANCER_TEMPLATE` | ❌ | - | 自定义增强模板路径 |
350
+
351
+ ### 搜索配置参数
352
+
353
+ ```typescript
354
+ interface SearchConfig {
355
+ // === 召回阶段 ===
356
+ vectorTopK: number; // 向量召回数量(默认 30)
357
+ vectorTopM: number; // 送入融合的向量结果数(默认 30)
358
+ ftsTopKFiles: number; // FTS 召回文件数(默认 15)
359
+ lexChunksPerFile: number; // 每文件词法 chunks 数(默认 3)
360
+ lexTotalChunks: number; // 词法总 chunks 数(默认 30)
361
+
362
+ // === 融合阶段 ===
363
+ rrfK0: number; // RRF 平滑常数(默认 60)
364
+ wVec: number; // 向量权重(默认 1.0)
365
+ wLex: number; // 词法权重(默认 0.5)
366
+ fusedTopM: number; // 融合后送 rerank 数量(默认 40)
367
+
368
+ // === Rerank ===
369
+ rerankTopN: number; // Rerank 后保留数量(默认 10)
370
+ maxRerankChars: number; // Rerank 文本最大字符数(默认 1200)
371
+
372
+ // === 扩展策略 ===
373
+ neighborHops: number; // E1 邻居跳数(默认 2)
374
+ breadcrumbExpandLimit: number; // E2 面包屑补全数(默认 3)
375
+ importFilesPerSeed: number; // E3 每 seed 导入文件数(默认 0)
376
+ chunksPerImportFile: number; // E3 每导入文件 chunks(默认 0)
377
+
378
+ // === Smart TopK ===
379
+ enableSmartTopK: boolean; // 启用智能截断(默认 true)
380
+ smartTopScoreRatio: number; // 动态阈值比例(默认 0.5)
381
+ smartMinScore: number; // 绝对下限(默认 0.25)
382
+ smartMinK: number; // Safe Harbor 数量(默认 2)
383
+ smartMaxK: number; // 硬上限(默认 15)
384
+ }
385
+ ```
386
+
387
+ ## 🌍 多语言支持
388
+
389
+ ContextWeaver 通过 Tree-sitter 原生支持以下编程语言的 AST 解析:
390
+
391
+ | 语言 | AST 解析 | Import 解析 | 文件扩展名 |
392
+ |------|----------|-------------|-----------|
393
+ | TypeScript | ✅ | ✅ | `.ts`, `.tsx` |
394
+ | JavaScript | ✅ | ✅ | `.js`, `.jsx`, `.mjs` |
395
+ | Python | ✅ | ✅ | `.py` |
396
+ | Go | ✅ | ✅ | `.go` |
397
+ | Java | ✅ | ✅ | `.java` |
398
+ | Rust | ✅ | ✅ | `.rs` |
399
+ | C | ✅ | ✅ | `.c`, `.h` |
400
+ | C++ | ✅ | ✅ | `.cpp`, `.hpp`, `.cc`, `.cxx` |
401
+ | C# | ✅ | ✅ | `.cs` |
402
+
403
+ 其他语言会采用基于行的 Fallback 分片策略,仍可正常索引和搜索。
404
+
405
+ ## 🔄 工作流程
406
+
407
+ ### 索引流程
408
+
409
+ ```
410
+ 1. Crawler → 遍历文件系统,过滤忽略项
411
+ 2. Processor → 读取文件内容,计算 hash
412
+ 3. Splitter → AST 解析,语义分片
413
+ 4. Indexer → 批量 Embedding,写入向量库
414
+ 5. FTS Index → 更新全文搜索索引
415
+ ```
416
+
417
+ ### 搜索流程
418
+
419
+ ```
420
+ 1. Query Parse → 解析查询,分离语义和术语
421
+ 2. Hybrid Recall → 向量 + 词法双路召回
422
+ 3. RRF Fusion → Reciprocal Rank Fusion 融合
423
+ 4. Rerank → 交叉编码器精排
424
+ 5. Smart Cutoff → 智能分数截断
425
+ 6. Graph Expand → 邻居/面包屑/导入扩展
426
+ 7. Context Pack → 段落合并,Token 预算
427
+ 8. Format Output → 格式化返回给 LLM
428
+ ```
429
+
430
+ ## 📊 性能特性
431
+
432
+ - **增量索引**:只处理变更文件,二次索引速度提升 10x+
433
+ - **批量 Embedding**:自适应批次大小,支持并发控制
434
+ - **速率限制恢复**:429 错误时自动退避,渐进恢复
435
+ - **连接池复用**:Tree-sitter 解析器池化复用
436
+ - **文件索引缓存**:GraphExpander 文件路径索引 lazy load
437
+
438
+ ## 🧪 测试
439
+
440
+ ```bash
441
+ # 运行测试
442
+ pnpm test
443
+
444
+ # 监听模式
445
+ pnpm test:watch
446
+ ```
447
+
448
+ ## 🐛 日志与调试
449
+
450
+ 日志文件位置:`~/.contextweaver/logs/app.YYYY-MM-DD.log`
451
+
452
+ 设置日志级别:
453
+
454
+ ```bash
455
+ # 开启 debug 日志
456
+ LOG_LEVEL=debug contextweaver search --information-request "..."
457
+ ```
458
+
459
+ ## 📄 开源协议
460
+
461
+ 本项目采用 MIT 许可证。
462
+
463
+ ## 🙏 致谢
464
+
465
+ - [hsingjui/ContextWeaver](https://github.com/hsingjui/ContextWeaver) - 原始项目
466
+ - [Tree-sitter](https://tree-sitter.github.io/tree-sitter/) - 高性能语法解析
467
+ - [LanceDB](https://lancedb.com/) - 嵌入式向量数据库
468
+ - [MCP](https://modelcontextprotocol.io/) - Model Context Protocol
469
+ - [SiliconFlow](https://siliconflow.cn/) - 推荐的 Embedding/Reranker API 服务
470
+
471
+ ---
472
+
473
+ <p align="center">
474
+ <sub>Made with ❤️ for AI-assisted coding</sub>
475
+ </p>