New:Socket for Asana Is Now Available.Learn more
Get Started

@chiway/contextweaver

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@chiway/contextweaver

A context weaving tool for LLMs

Source
npmnpm
Version
1.5.0
Version published
Maintainers
1
Created
Source

ContextWeaver

🧵 为 AI Agent 精心编织的代码库上下文引擎

Semantic Code Retrieval for AI Agents — Hybrid Search • Graph Expansion • Token-Aware Packing

ContextWeaver 是一个专为 AI 代码助手设计的语义检索引擎,采用混合搜索(向量 + 词法)、智能上下文扩展和 Token 感知打包策略,为 LLM 提供精准、相关且上下文完整的代码片段。

ContextWeaver 架构概览

✨ 核心特性

🔍 混合检索引擎

  • 向量召回 (Vector Retrieval):基于语义相似度的深度理解
  • 词法召回 (Lexical/FTS):精确匹配函数名、类名等技术术语
  • RRF 融合 (Reciprocal Rank Fusion):智能融合多路召回结果

🧠 AST 语义分片

  • Tree-sitter 解析:支持 TypeScript、JavaScript、Python、Go、Java、Rust、C、C++、C# 等语言
  • Dual-Text 策略displayCode 用于展示,vectorText 用于 Embedding
  • Gap-Aware 合并:智能处理代码间隙,保持语义完整性
  • Breadcrumb 注入:向量文本包含层级路径,提升检索召回率
  • UTF-16 字符域归一:在写入 metadata 前用 SourceAdapter.toCharOffset 统一偏移,避免多字节字符切片错位(v1.4.0+)

📊 三阶段上下文扩展

  • E1 邻居扩展:同文件前后相邻 chunks,保证代码块完整性
  • E2 面包屑补全:同一类/函数下的其他方法,理解整体结构
  • E3 Import 解析:跨文件依赖追踪(可配置开关)

🎯 智能截断策略 (Smart TopK)

  • Anchor & Floor:动态阈值 + 绝对下限双保险
  • Delta Guard:防止 Top1 outlier 场景的误判
  • Safe Harbor:前 N 个结果只检查下限,保证基本召回

🔌 MCP 原生支持

  • MCP Server 模式:一键启动 Model Context Protocol 服务端
  • 意图与术语分离:LLM 友好的 API 设计
  • 自动索引:首次查询自动触发索引,增量更新透明无感

🛡️ Crash-Safe 数据架构 (v1.4.0+)

  • 正文唯一源:LanceDB 仅存向量与定位元数据,正文回查 files.content,索引体积降低 30-50%
  • 跨库事务补偿:LanceDB → FTS+outbox → SQLite mark 三阶段写入,任一失败自动回滚或重放
  • 迁移状态机pending/done/aborted 三态持久化,崩溃恢复自动重建
  • 跨进程互斥:advisory lock 防止 MCP server 与 CLI 并发触发 LanceDB 迁移
  • chunk_id 去重:写入前预删除,防止 retry 场景产生重复行

📦 快速开始

环境要求

  • Node.js >= 20
  • pnpm (推荐) 或 npm

安装

# 全局安装
npm install -g @chiway/contextweaver

# 或使用 pnpm
pnpm add -g @chiway/contextweaver

初始化配置

# 初始化配置文件(创建 ~/.contextweaver/.env)
contextweaver init
# 或简写
cw init

编辑 ~/.contextweaver/.env,填入你的 API Key:

# Embedding API 配置(必需)
EMBEDDINGS_API_KEY=your-api-key-here
EMBEDDINGS_BASE_URL=https://api.siliconflow.cn/v1/embeddings
EMBEDDINGS_MODEL=BAAI/bge-m3
EMBEDDINGS_MAX_CONCURRENCY=10
EMBEDDINGS_DIMENSIONS=1024

# Reranker 配置(必需)
RERANK_API_KEY=your-api-key-here
RERANK_BASE_URL=https://api.siliconflow.cn/v1/rerank
RERANK_MODEL=BAAI/bge-reranker-v2-m3
RERANK_TOP_N=20

# 忽略模式(可选,逗号分隔)
# IGNORE_PATTERNS=.venv,node_modules

索引代码库

# 在代码库根目录执行
contextweaver index

# 指定路径
contextweaver index /path/to/your/project

# 强制重新索引
contextweaver index --force

本地搜索

# 语义搜索
cw search --information-request "用户认证流程是如何实现的?"

# 带精确术语
cw search --information-request "数据库连接逻辑" --technical-terms "DatabasePool,Connection"

启动 MCP 服务器

# 启动 MCP 服务端(供 Claude 等 AI 助手使用)
contextweaver mcp

索引管理 (v1.4.0+)

# 查看 LanceDB 迁移状态
contextweaver migrate

# 解除 aborted 状态:清空 LanceDB 并触发全量重建
# 触发时机:抽样校验失败后 Indexer 拒绝写入;运行此命令后再次 index 即可
contextweaver migrate --reset

# 指定项目路径
contextweaver migrate --path /path/to/project

🔧 MCP 集成配置

Claude Desktop 配置

在 Claude Desktop 的配置文件中添加:

{
  "mcpServers": {
    "contextweaver": {
      "command": "contextweaver",
      "args": ["mcp"]
    }
  }
}

MCP 工具说明

ContextWeaver 提供一个核心 MCP 工具:codebase-retrieval

参数说明

参数类型必需描述
repo_pathstring代码库根目录的绝对路径
information_requeststring自然语言形式的语义意图描述
technical_termsstring[]精确技术术语(类名、函数名等)

设计理念

  • 意图与术语分离information_request 描述「做什么」,technical_terms 过滤「叫什么」
  • 同文件上下文优先:默认提供同文件上下文,跨文件探索由 Agent 自主发起
  • 回归代理本能:工具只负责定位,跨文件探索由 Agent 按需触发

🏗️ 架构设计

flowchart TB
    subgraph Interface["CLI / MCP Interface"]
        CLI[contextweaver CLI]
        MCP[MCP Server]
    end

    subgraph Search["SearchService"]
        VR[Vector Retrieval]
        LR[Lexical Retrieval]
        RRF[RRF Fusion + Rerank]
        VR --> RRF
        LR --> RRF
    end

    subgraph Expand["Context Expansion"]
        GE[GraphExpander]
        CP[ContextPacker]
        GE --> CP
    end

    subgraph Storage["Storage Layer"]
        VS[(VectorStore<br/>LanceDB)]
        DB[(SQLite<br/>FTS5)]
    end

    subgraph Index["Indexing Pipeline"]
        CR[Crawler<br/>fdir] --> SS[SemanticSplitter<br/>Tree-sitter] --> IX[Indexer<br/>Batch Embedding]
    end

    Interface --> Search
    RRF --> GE
    Search <--> Storage
    Expand <--> Storage
    Index --> Storage

核心模块说明

模块职责
SearchService混合搜索核心,协调向量/词法召回、RRF 融合、Rerank 精排
GraphExpander上下文扩展器,执行 E1/E2/E3 三阶段扩展策略
ContextPacker上下文打包器,负责段落合并和 Token 预算控制
ChunkContentLoader(path, start_index, end_index)files.content 批量切片(v1.4.0+)
VectorStoreLanceDB 适配层,仅暴露纯 vector 操作
Database (SQLite)元数据存储 + FTS5 全文索引,schema_version=3
Bootstrap跨库初始化协调器:pending_marks 重放 + LanceDB schema 迁移(v1.4.0+)
SemanticSplitterAST 语义分片器,基于 Tree-sitter 解析,写入时统一到 UTF-16 字符域

数据架构 (v1.4.0+)

~/.contextweaver/<projectId>/
├── index.db                 # SQLite
│   ├── files                # 文件元数据 + 完整正文(content 列,文本切片唯一来源)
│   ├── files_fts            # 外部内容表,倒排索引指向 files
│   ├── chunks_fts           # chunk 级倒排索引,per-file 整体替换
│   ├── metadata             # schema_version / lancedb_migration_state / lock
│   └── pending_marks        # outbox:vector_index_hash 标记失败时启动重放
└── vectors.lance/           # LanceDB chunks 表(仅向量 + 定位元数据,不存正文)

关键不变量

  • 正文唯一源是 files.contentChunkContentLoaderstart_index/end_index 切片(与 displayCode 同源)
  • 所有 LanceDB 偏移字段都在 UTF-16 字符域,多字节文件不会切错
  • 跨库写入顺序:LanceDB → (FTS + outbox 单事务) → SQLite mark + 清 outbox
  • LanceDB 迁移状态 pending/done/aborted 持久化,跨进程用 advisory lock 互斥

📁 项目结构

contextweaver/
├── src/
│   ├── index.ts              # CLI 入口(init / index / search / mcp / migrate)
│   ├── config.ts             # 配置管理(环境变量)
│   ├── api/                  # 外部 API 封装
│   │   ├── embedding.ts      # Embedding API
│   │   └── reranker.ts       # Reranker API
│   ├── chunking/             # 语义分片
│   │   ├── SemanticSplitter.ts   # AST 语义分片器
│   │   ├── SourceAdapter.ts      # 源码适配器(UTF-16/UTF-8 域归一)
│   │   ├── LanguageSpec.ts       # 语言规范定义
│   │   ├── ParserPool.ts         # Tree-sitter 解析器池
│   │   └── types.ts              # 分片类型定义
│   ├── scanner/              # 文件扫描
│   │   ├── crawler.ts        # 文件系统遍历
│   │   ├── processor.ts      # 文件处理
│   │   ├── filter.ts         # 过滤规则
│   │   ├── hash.ts           # 文件 hash
│   │   └── language.ts       # 语言识别
│   ├── indexer/              # 索引器
│   │   └── index.ts          # 三阶段事务(LanceDB → FTS+outbox → SQLite mark)
│   ├── vectorStore/          # 向量存储
│   │   └── index.ts          # LanceDB 适配层(纯 vector 操作)
│   ├── db/                   # 数据库
│   │   ├── index.ts          # SQLite + FTS5 + pending_marks + 迁移状态机
│   │   └── bootstrap.ts      # 跨库初始化协调(v1.4.0+)
│   ├── search/               # 搜索服务
│   │   ├── SearchService.ts      # 核心搜索服务
│   │   ├── GraphExpander.ts      # 上下文扩展器
│   │   ├── ContextPacker.ts      # 上下文打包器
│   │   ├── ChunkContentLoader.ts # 按 (path, start_index, end_index) 切片(v1.4.0+)
│   │   ├── fts.ts                # 全文搜索(per-file 整体替换)
│   │   ├── config.ts             # 搜索配置
│   │   ├── types.ts              # 类型定义
│   │   ├── utils.ts              # token overlap 评分
│   │   └── resolvers/            # 多语言 Import 解析器
│   │       ├── JsTsResolver.ts
│   │       ├── PythonResolver.ts
│   │       ├── GoResolver.ts
│   │       ├── JavaResolver.ts
│   │       ├── RustResolver.ts
│   │       ├── CppResolver.ts
│   │       └── CSharpResolver.ts
│   ├── mcp/                  # MCP 服务端
│   │   ├── server.ts         # MCP 服务器实现
│   │   ├── main.ts           # MCP 入口
│   │   └── tools/
│   │       └── codebaseRetrieval.ts  # 代码检索工具
│   └── utils/                # 工具函数
│       ├── logger.ts         # 日志系统
│       ├── encoding.ts       # 编码检测
│       └── lock.ts           # 文件锁
├── tests/                    # 单测 + 集成测试(109 测试用例)
│   ├── chunking/             # SourceAdapter / 分片
│   ├── db/                   # 迁移、outbox、advisory lock
│   ├── indexer/              # 事务补偿、GC、aborted 守卫
│   ├── integration/          # 真实 LanceDB 端到端
│   ├── search/               # FTS、ChunkContentLoader、Packer
│   └── vectorStore/          # chunk_id 去重、抽样校验
├── package.json
└── tsconfig.json

⚙️ 配置详解

环境变量

变量名必需默认值描述
EMBEDDINGS_API_KEY-Embedding API 密钥
EMBEDDINGS_BASE_URL-Embedding API 地址
EMBEDDINGS_MODEL-Embedding 模型名称
EMBEDDINGS_MAX_CONCURRENCY10Embedding 并发数
EMBEDDINGS_DIMENSIONS1024向量维度
RERANK_API_KEY-Reranker API 密钥
RERANK_BASE_URL-Reranker API 地址
RERANK_MODEL-Reranker 模型名称
RERANK_TOP_N20Rerank 返回数量
IGNORE_PATTERNS-额外忽略模式

搜索配置参数

interface SearchConfig {
  // === 召回阶段 ===
  vectorTopK: number;        // 向量召回数量(默认 30)
  vectorTopM: number;        // 送入融合的向量结果数(默认 30)
  ftsTopKFiles: number;      // FTS 召回文件数(默认 15)
  lexChunksPerFile: number;  // 每文件词法 chunks 数(默认 3)
  lexTotalChunks: number;    // 词法总 chunks 数(默认 30)

  // === 融合阶段 ===
  rrfK0: number;             // RRF 平滑常数(默认 60)
  wVec: number;              // 向量权重(默认 1.0)
  wLex: number;              // 词法权重(默认 0.5)
  fusedTopM: number;         // 融合后送 rerank 数量(默认 40)

  // === Rerank ===
  rerankTopN: number;        // Rerank 后保留数量(默认 10)
  maxRerankChars: number;    // Rerank 文本最大字符数(默认 1200)

  // === 扩展策略 ===
  neighborHops: number;      // E1 邻居跳数(默认 2)
  breadcrumbExpandLimit: number;  // E2 面包屑补全数(默认 3)
  importFilesPerSeed: number;     // E3 每 seed 导入文件数(默认 0)
  chunksPerImportFile: number;    // E3 每导入文件 chunks(默认 0)

  // === Smart TopK ===
  enableSmartTopK: boolean;  // 启用智能截断(默认 true)
  smartTopScoreRatio: number;     // 动态阈值比例(默认 0.5)
  smartMinScore: number;          // 绝对下限(默认 0.25)
  smartMinK: number;              // Safe Harbor 数量(默认 2)
  smartMaxK: number;              // 硬上限(默认 15)
}

🌍 多语言支持

ContextWeaver 通过 Tree-sitter 原生支持以下编程语言的 AST 解析:

语言AST 解析Import 解析文件扩展名
TypeScript.ts, .tsx
JavaScript.js, .jsx, .mjs, .cjs
Python.py
Go.go
Java.java
Rust.rs
C.c, .h
C++.cpp, .cc, .cxx, .hpp
C#.cs

其他语言会采用基于行的 Fallback 分片策略,仍可正常索引和搜索。

🔄 工作流程

索引流程

0. Bootstrap   → pending_marks 重放 + LanceDB schema 迁移(首次启动)
1. Crawler     → 遍历文件系统,过滤忽略项
2. Processor   → 读取文件内容,计算 hash
3. Splitter    → AST 解析,语义分片(偏移归一到 UTF-16 字符域)
4. Indexer     → 批量 Embedding
5. 阶段 4-6 伪事务:
   ├─ LanceDB 写入(预删 (path, hash) 防重复 → add → 清旧版本)
   ├─ FTS + outbox 单 SQLite 事务(失败回滚 LanceDB)
   └─ SQLite mark + 清 outbox 单事务(失败时 outbox 保留,下次启动 replay)
6. 末尾 GC     → 清理 LanceDB 孤儿 chunks(time budget 5s)

搜索流程

1. Query Parse     → 解析查询,分离语义和术语
2. Hybrid Recall   → 向量 + 词法双路召回
3. RRF Fusion      → Reciprocal Rank Fusion 融合
4. Rerank          → 交叉编码器精排
5. Smart Cutoff    → 智能分数截断
6. Graph Expand    → 邻居/面包屑/导入扩展
7. Context Pack    → 段落合并,Token 预算
8. Format Output   → 格式化返回给 LLM

📊 性能特性

  • 增量索引:只处理变更文件,二次索引速度提升 10x+
  • 批量 Embedding:自适应批次大小,支持并发控制
  • 速率限制恢复:429 错误时自动退避,渐进恢复
  • 连接池复用:Tree-sitter 解析器池化复用
  • 文件索引缓存:GraphExpander 文件路径索引 lazy load

🐛 日志与调试

日志文件位置:~/.contextweaver/logs/app.YYYY-MM-DD.log

设置日志级别:

# 开启 debug 日志
LOG_LEVEL=debug contextweaver search --information-request "..."

🚨 故障排查 (v1.4.0+)

LanceDB 迁移卡死 (aborted 状态)

现象contextweaver index 报错 "LanceDB 处于 aborted 状态,拒绝写入以防止 schema 污染"。

原因:v1.4.0 升级时 LanceDB 旧索引中的 display_code 与当前 files.content 抽样差异 > 1%(通常发生在 chunk 偏移用 UTF-8 字节域旧索引上)。

解决

contextweaver migrate --reset   # 清空 LanceDB chunks 表 + 重置状态为 done
contextweaver index             # 全量重建(新 schema)

跨进程迁移竞争

如果 MCP server 长驻 + 另一终端跑 contextweaver index,两进程会争抢迁移。v1.4.0 引入 10 分钟僵尸阈值的 advisory lock,自动让一个进程跳过迁移、另一个完成。

如锁卡住(process kill -9 后),可手动清理:

sqlite3 ~/.contextweaver/<projectId>/index.db \
  "DELETE FROM metadata WHERE key = 'lancedb_migration_lock';"

重复 embedding 浪费

v1.4.0 已通过 pending_marks outbox 机制解决:FTS 写入成功但 vector_index_hash 标记失败时,下次启动自动 replay,不会触发重复 embedding。

📜 版本历史

  • v1.4.0 (2026-05): 数据架构与跨库一致性大修
    • LanceDB chunks 表移除 display_code/vector_text,正文回查 files.content
    • SemanticSplitter 偏移统一到 UTF-16 字符域
    • schema_version 2 → 3,新增 pending_marks outbox + 三态迁移状态机
    • 新增 contextweaver migrate CLI
    • 跨进程 advisory lock 防止迁移竞争
    • 109 个测试(含真实 LanceDB 端到端集成)
  • v1.3.x: 跨库写入事务性、scan 末尾自动 GC、files_fts 外部内容表
  • v1.2.x: 搜索管道优化、索引内存优化
  • v1.1.x: 智能 TopK 截断、Smart Cutoff
  • v1.0.x: 初始 release

📄 开源协议

本项目采用 MIT 许可证。

🙏 致谢

  • Tree-sitter - 高性能语法解析
  • LanceDB - 嵌入式向量数据库
  • MCP - Model Context Protocol
  • SiliconFlow - 推荐的 Embedding/Reranker API 服务

Made with ❤️ for AI-assisted coding

FAQs

Package last updated on 02 Jun 2026

Related posts