cocoindex-io/cocoindex-code
GitHub: cocoindex-io/cocoindex-code
一款基于 AST 的轻量级语义代码搜索 CLI 工具,专为编程 Agent 设计,可大幅节省 token 并提升代码检索效率。
Stars: 2118 | Forks: 167
基于 AST 的语义化代码搜索,即开即用

一款专为你的代码库设计的轻量级、高效的**(基于 AST)**语义化代码搜索工具。基于 [CocoIndex](https://github.com/cocoindex-io/cocoindex) —— 一个基于 Rust 构建的超高性能数据转换引擎。你可以通过 CLI 使用它,或者通过 [Skill](#skill-recommended) 或 [MCP](#mcp-server) 与 Claude、Codex、Cursor 等任何编程 Agent 集成。
- 立即节省 70% 的 token。
- **1 分钟设置** —— 安装即用,零配置!
[](https://discord.com/invite/zpA9S2DR7s)
[](https://github.com/cocoindex-io/cocoindex)
[](https://cocoindex.io/docs/getting_started/quickstart)
[](https://opensource.org/licenses/Apache-2.0)
[](https://pepy.tech/projects/cocoindex)
[](https://github.com/cocoindex-io/cocoindex/actions/workflows/CI.yml)
[](https://github.com/cocoindex-io/cocoindex/actions/workflows/release.yml)
[Deutsch](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=de) |
[English](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=en) |
[Español](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=es) |
[français](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=fr) |
[日本語](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=ja) |
[한국어](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=ko) |
[Português](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=pt) |
[Русский](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=ru) |
[中文](https://readme-i18n.com/cocoindex-io/cocoindex-code?lang=zh)
## 开始使用 —— 零配置,立即出发!
### 安装
使用 [pipx](https://pipx.pypa.io/stable/installation/):
```
pipx install 'cocoindex-code[full]' # batteries included (local embeddings)
pipx upgrade cocoindex-code # upgrade
```
使用 [uv](https://docs.astral.sh/uv/getting-started/installation/):
```
uv tool install --upgrade 'cocoindex-code[full]'
```
两种安装选项 —— 它们对应同名的 Docker 镜像版本:
- `cocoindex-code[full]` —— 一应俱全。引入 `sentence-transformers`,使本地 embedding(无需 API key)开箱即用。`ccc init` 交互式提示默认使用 [Snowflake/snowflake-arctic-embed-xs](https://huggingface.co/Snowflake/snowflake-arctic-embed-xs)。
- `cocoindex-code` (slim) —— 仅支持 LiteLLM;需要云 embedding 提供商和 API key。当你不需要本地 embedding 依赖(约 1 GB 的 torch + transformers)时使用。
接下来,设置你的[编程 Agent 集成](#coding-agent-integration) —— 或者如果你更喜欢直接控制,可以跳转到[手动 CLI 使用](#manual-cli-usage)。
## 编程 Agent 集成
### Skill(推荐)
安装 `ccc` skill,让你的编程 Agent 在需要时自动使用语义搜索:
```
npx skills add cocoindex-io/cocoindex-code
```
就是这样 —— 不需要执行 `ccc init` 或 `ccc index`。该 skill 会教 Agent 自行处理初始化、索引和搜索。在你工作时,它会自动保持索引最新。
Agent 在有帮助时会自动使用语义搜索。你也可以明确引导它 —— 只需让它搜索代码库,例如*“查找用户会话是如何管理的”*,或者输入 `/ccc` 直接调用该 skill。
适用于 [Claude Code](https://docs.anthropic.com/en/docs/claude-code) 及其他兼容 skill 的 Agent。
#### Claude Code 插件市场
对于 Claude Code 用户,此仓库也是一个[插件市场](https://code.claude.com/docs/en/plugin-marketplaces)。在 Claude Code 中使用以下命令安装该 skill:
```
/plugin marketplace add Roxabi/cocoindex-code
/plugin install cocoindex-code@cocoindex-code
```
这捆绑了相同的 `ccc` skill,支持版本固定以及通过 `/plugin marketplace update` 进行更新。
### MCP 服务器
或者,使用 `ccc mcp` 作为 MCP 服务器运行:
Claude Code
```
claude mcp add cocoindex-code -- ccc mcp
```
Codex
```
codex mcp add cocoindex-code -- ccc mcp
```
OpenCode
```
opencode mcp add
```
输入 MCP 服务器名称:`cocoindex-code`
选择 MCP 服务器类型:`local`
输入运行命令:`ccc mcp`
或者使用 opencode.json:
```
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cocoindex-code": {
"type": "local",
"command": [
"ccc", "mcp"
]
}
}
}
```
配置完成后,Agent 会自动判断何时使用语义代码搜索是有帮助的 —— 例如根据描述查找代码、探索不熟悉的代码库、模糊/概念匹配,或者在不知道确切名称的情况下定位实现。
MCP 工具参考
当作为 MCP 服务器(`ccc mcp`)运行时,会暴露以下工具:
**`search`** —— 使用语义相似度搜索代码库。
```
search(
query: str, # Natural language query or code snippet
limit: int = 5, # Maximum results (1-100)
offset: int = 0, # Pagination offset
refresh_index: bool = True, # Refresh index before querying
languages: list[str] | None = None, # Filter by language (e.g. ["python", "typescript"])
paths: list[str] | None = None, # Filter by path glob (e.g. ["src/utils/*"])
)
```
返回匹配的代码块,包含文件路径、语言、代码内容、行号和相似度得分。
## 手动 CLI 使用
你也可以直接使用 CLI —— 适用于手动控制、在更改设置后运行索引、检查状态或在 Agent 外部进行搜索。
```
ccc init # initialize project (creates settings)
ccc index # build the index
ccc search "authentication logic" # search!
```
后台 daemon 会在首次使用时自动启动。
### CLI 参考
| 命令 | 描述 |
|---------|-------------|
| `ccc init` | 初始化项目 —— 创建设置文件,将 `.cocoindex_code/` 添加到 `.gitignore` |
| `ccc index` | 构建或更新索引(如有需要会自动初始化)。显示流式进度。 |
| `ccc search
` | 跨代码库的语义搜索 |
| `ccc status` | 显示索引统计信息(代码块数、文件数、语言细分) |
| `ccc mcp` | 在 stdio 模式下作为 MCP 服务器运行 |
| `ccc doctor` | 运行诊断 —— 检查设置、daemon、模型、文件匹配和索引健康状况 |
| `ccc reset` | 删除索引数据库。`--all` 同时移除设置。`-f` 跳过确认。 |
| `ccc daemon status` | 显示 daemon 版本、运行时间和已加载的项目 |
| `ccc daemon restart` | 重启后台 daemon |
| `ccc daemon stop` | 停止 daemon |
### 搜索选项
```
ccc search database schema # basic search
ccc search --lang python --lang markdown schema # filter by language
ccc search --path 'src/utils/*' query handler # filter by path
ccc search --offset 10 --limit 5 database schema # pagination
ccc search --refresh database schema # update index first, then search
```
默认情况下,`ccc search` 会将结果范围限制在你当前的工作目录(相对于项目根目录)。使用 `--path` 可进行覆盖。
## Docker
我们为希望获得可重现、无依赖设置的团队提供了 Docker 镜像 —— 宿主机上不需要 Python、`uv` 或任何系统依赖。
推荐的方法是使用**持久化容器**:启动一次,然后使用 `docker exec` 运行 CLI 命令或将 MCP 会话连接到它。内部的 daemon 在跨会话期间保持热状态,因此 embedding 模型只需加载一次。
### 选择镜像
每次发布都会发布两个版本:
| 标签 | 大小 | Embedding 后端 | 适用场景 |
|---|---|---|---|
| `cocoindex/cocoindex-code:latest` (slim,默认) | ~450 MB | LiteLLM(云端:OpenAI、Voyage、Gemini、Ollama 等) | 大多数用户。基于云端的 embedding,镜像更小,拉取速度快。 |
| `cocoindex/cocoindex-code:full` | ~5 GB | sentence-transformers (本地) + LiteLLM | 当你希望在没有 API key 的情况下进行本地 embedding,或者需要一个可离线运行的容器时。由于包含 torch + transformers,体积较大。 |
本节的其余部分使用 `:latest` —— 如果你想要完整版,请在 `image:` / `docker run` 命令中替换为 `:full`。
### 快速开始 —— `docker compose up -d`
一行命令即可启动 —— 无需克隆仓库(bash / zsh):
```
# macOS / Windows
docker compose -f <(curl -L https://raw.githubusercontent.com/cocoindex-io/cocoindex-code/refs/heads/main/docker/docker-compose.yml) up -d
# Linux (将 bind-mounted paths 上的文件所有权与您的主机用户对齐)
PUID=$(id -u) PGID=$(id -g) docker compose -f <(curl -L https://raw.githubusercontent.com/cocoindex-io/cocoindex-code/refs/heads/main/docker/docker-compose.yml) up -d
```
或者下载 [`docker/docker-compose.yml`](./docker/docker-compose.yml) 并在其目录下运行 `docker compose up -d`(适用于任何 shell,包括 Windows cmd / PowerShell)。
默认情况下,你的主目录会被挂载到容器中(设置 `COCOINDEX_HOST_WORKSPACE` 可将其缩小到特定的代码文件夹)。索引数据和 embedding 模型缓存会在重启后持久化保存在 Docker volume 中。位于 `$HOME/.cocoindex_code/global_settings.yml` 的全局设置文件在宿主机上可见且可编辑;修改将在你下一次执行 `ccc` 命令时生效。
### 或者:`docker run`
Docker Desktop (macOS / Windows)
```
docker run -d --name cocoindex-code \
--volume "$HOME:/workspace" \
--volume cocoindex-data:/var/cocoindex \
-e COCOINDEX_CODE_HOST_PATH_MAPPING="/workspace=$HOME" \
cocoindex/cocoindex-code:latest
```
Linux (包含 PUID/PGID)
```
docker run -d --name cocoindex-code \
-e PUID=$(id -u) -e PGID=$(id -g) \
--volume "$HOME:/workspace" \
--volume cocoindex-data:/var/cocoindex \
-e COCOINDEX_CODE_HOST_PATH_MAPPING="/workspace=$HOME" \
cocoindex/cocoindex-code:latest
```
### 用于 `ccc` 命令的 Shell 包装器
将此粘贴到 `~/.bashrc` / `~/.zshrc` 中,以便 `ccc` 在宿主机上感觉像原生的一样,并根据你当前的目录选取正确的项目:
```
ccc() {
docker exec -it -e COCOINDEX_CODE_HOST_CWD="$PWD" cocoindex-code ccc "$@"
}
```
现在 `cd` 进入工作区下的任何项目并运行 `ccc init`、`ccc index`、`ccc search ...`、`ccc status` 等命令 —— 一切就绪。
### 连接你的编程 Agent
Claude Code
在目标项目内部注册 MCP,以便 `$PWD` 指向该项目:
```
claude mcp add cocoindex-code -- docker exec -i \
-e COCOINDEX_CODE_HOST_CWD="$PWD" cocoindex-code ccc mcp
```
或者通过 `.mcp.json`:
```
{
"mcpServers": {
"cocoindex-code": {
"type": "stdio",
"command": "docker",
"args": [
"exec",
"-i",
"-e",
"COCOINDEX_CODE_HOST_CWD=${PWD}",
"cocoindex-code",
"ccc",
"mcp"
]
}
}
}
```
Codex
```
codex mcp add cocoindex-code -- docker exec -i \
-e COCOINDEX_CODE_HOST_CWD="$PWD" cocoindex-code ccc mcp
```
### 从旧版镜像升级
早期版本使用单独的 `cocoindex-db` 和 `cocoindex-model-cache` volume;当前镜像将它们整合到了一个 `cocoindex-data` volume 中。在拉取新镜像之前,删除旧的容器和 volume —— 索引将在你下一次执行 `ccc index` 时重建,而 embedding 模型会在首次启动时自动重新填充:
```
docker rm -f cocoindex-code
docker volume rm cocoindex-db cocoindex-model-cache
```
### 通过环境变量进行配置
使用 `-e` 将配置传递给 `docker run` / compose:
```
# 额外扩展 (例如 Typesafe Config, SBT build files)
-e COCOINDEX_CODE_EXTRA_EXTENSIONS="conf,sbt"
# 排除 build artefacts (Scala/SBT 示例)
-e COCOINDEX_CODE_EXCLUDE_PATTERNS='["**/target/**","**/.bloop/**","**/.metals/**"]'
# 设置 API key
-e VOYAGE_API_KEY=your-key
```
### 在本地构建镜像
```
docker build -t cocoindex-code:local -f docker/Dockerfile .
```
## 功能
- **语义代码搜索**:当 grep 不太好用时,使用自然语言查询查找相关代码,并立即节省 token。
- **超高性能**:⚡ 基于超高性能的 [Rust 索引引擎](https://github.com/cocoindex-io/cocoindex) 构建。仅重新索引已更改的文件,以实现快速更新。
- **多语言支持**:Python、JavaScript/TypeScript、Rust、Go、Java、C/C++、C#、SQL、Shell 等。
- **嵌入式**:便携且开箱即用,无需设置数据库!
- **灵活的 Embedding**:通过 `[full]` 额外依赖包使用本地 SentenceTransformers(免费,无需 API key!),或通过 LiteLLM 使用 100 多个云提供商。
## 配置
有关选择和配置 embedding 模型的详细指南,请参阅 [EMBEDDINGS.md](EMBEDDINGS.md)。
配置存在于两个 YAML 文件中,均由 `ccc init` 自动创建。
### 用户设置 (`~/.cocoindex_code/global_settings.yml`)
在所有项目之间共享。控制 embedding 模型和 daemon 的环境变量。
```
embedding:
provider: sentence-transformers # or "litellm"
model: Snowflake/snowflake-arctic-embed-xs
device: mps # optional: cpu, cuda, mps (auto-detected if omitted)
min_interval_ms: 300 # optional: pace LiteLLM embedding requests to reduce 429s; defaults to 5 for LiteLLM
# Optional extra kwargs passed to the embedder, separately for indexing vs query.
# `ccc init` auto-populates these for known models (e.g. Cohere, Voyage, Nvidia NIM,
# nomic-ai code-retrieval models, Snowflake arctic-embed).
# indexing_params:
# input_type: search_document # litellm: input_type
# query_params:
# input_type: search_query # sentence-transformers: prompt_name
envs: # extra environment variables for the daemon
OPENAI_API_KEY: your-key # only needed if not already in your shell environment
```
#### `indexing_params` / `query_params`
某些 embedding 模型为文档和查询暴露不同的模式(非对称检索)。例如,Cohere 的 v3 模型在 embedding 语料库内容时需要 `input_type: search_document`,在 embedding 用户查询时需要 `input_type: search_query`;一些 SentenceTransformers 模型处于相同目的使用 `prompt_name: passage` / `prompt_name: query`。这些旋钮位于 `indexing_params` 和 `query_params` 下:
```
embedding:
provider: litellm
model: cohere/embed-english-v3.0
indexing_params:
input_type: search_document
query_params:
input_type: search_query
```
`ccc init` 会为它识别的模型自动填充这些内容 —— 包括所有 Cohere v3、Voyage、Nvidia NIM、Gemini embedding(`gemini/gemini-embedding-*`、`gemini/text-embedding-*`、`gemini/embedding-*` —— LiteLLM 自动将 `input_type` 映射为 Gemini 的 `task_type`)、`nomic-ai/CodeRankEmbed`、`nomic-ai/nomic-embed-code`、`nomic-ai/nomic-embed-text-v1`/`v1.5`、`mixedbread-ai/mxbai-embed-large-v1` 以及 `Snowflake/snowflake-arctic-embed-*` 系列 —— 并打印出所选的默认值。对于其他模型,它会在 `embedding:` 下留下一个被注释掉的模板,以便你手动填写。
OpenAI embedding(`text-embedding-3-*`、`text-embedding-ada-002`)有意不在列表中:它们是对称的,没有等效的旋钮。
**接受的键:** `prompt_name` (sentence-transformers) 和 `input_type` (litellm)。其他键会在 daemon 启动时被拒绝并给出明确的错误。注意:`dimensions` 在此处不暴露 —— 输出维度对于索引和查询必须相同,因此它是一个全局模型设置,而不是按端设置的旋钮。
**Doctor 会检查两端。** `ccc doctor` 会分别使用 `indexing_params` 和 `query_params` 测试模型,分别报告为单独的 `Model Check (indexing)` / `Model Check (query)` 条目 —— 这样一侧的配置错误就可以被独立诊断出来,而不会被另一侧掩盖。
**旧版兼容警告:** 如果你从较早的版本升级,并且你的 `global_settings.yml` 使用了 `nomic-ai/CodeRankEmbed` 或 `nomic-ai/nomic-embed-code` 而没有 `indexing_params` / `query_params`,daemon 将继续应用以前的行为(在查询时使用 `prompt_name: query`),并打印一次性警告,要求你明确设置。你可以通过添加一个空块(例如 `query_params: {}`)来消除该警告。
### 项目设置 (`/.cocoindex_code/settings.yml`)
针对特定项目。控制要索引哪些文件。
```
include_patterns:
- "**/*.py"
- "**/*.js"
- "**/*.ts"
- "**/*.rs"
- "**/*.go"
# ... (sensible defaults for 28+ file types)
exclude_patterns:
- "**/.*" # hidden directories
- "**/__pycache__"
- "**/node_modules"
- "**/dist"
# ...
language_overrides:
- ext: inc # treat .inc files as PHP
lang: php
chunkers:
- ext: toml # use a custom chunker for .toml files
module: example_toml_chunker:toml_chunker
```
当你想要在索引之前控制如何将文件类型拆分为代码块时,请使用 `chunkers`。
`module: example_toml_chunker:toml_chunker` 表示:
- `example_toml_chunker` 是一个本地 Python 模块
- `toml_chunker` 是该模块内的函数
在实践中,这通常意味着:
- 你在你的项目中创建了一个 Python 文件,例如 `example_toml_chunker.py`
- 你在该文件中添加了一个函数
- 你使用 `module.path:function_name` 让 `settings.yml` 指向它
该函数应使用此签名:
```
from pathlib import Path
from cocoindex_code.chunking import Chunk
def my_chunker(path: Path, content: str) -> tuple[str | None, list[Chunk]]:
...
```
- `path` 是正在被索引的文件
- `content` 是该文件的完整文本
- 如果你想覆盖语言检测,请返回作为字符串的 `language_override`,例如 `"toml"`
- 如果你想保留检测到的语言,请返回 `None` 作为 `language_override`
- 返回一个包含你想存储在索引中的代码块的 `list[Chunk]`
有关公共类型请参阅 [`src/cocoindex_code/chunking.py`](./src/cocoindex_code/chunking.py),完整示例请参阅 [`tests/example_toml_chunker.py`](./tests/example_toml_chunker.py)。
## Embedding 模型
安装了 `[full]` 额外依赖包后,`ccc init` 默认使用本地 SentenceTransformers 模型([Snowflake/snowflake-arctic-embed-xs](https://huggingface.co/Snowflake/snowflake-arctic-embed-xs)) —— 无需 API key。要使用不同的模型,请编辑 `~/.cocoindex_code/global_settings.yml`。
Ollama (本地)
```
embedding:
model: ollama/nomic-embed-text
```
如果你的 Ollama 服务器不在 `http://localhost:11434`,请在 `envs:` 下设置 `OLLAMA_API_BASE`。
OpenAI
```
embedding:
model: text-embedding-3-small
min_interval_ms: 300 # optional: override the 5ms LiteLLM default
envs:
OPENAI_API_KEY: your-api-key
```
OpenAI 兼容 (自定义 endpoint)
许多提供商(vLLM、LM Studio、LocalAI、Together、Fireworks、DeepInfra 等)都暴露了兼容 OpenAI 的 embedding API。使用 `openai/` 前缀并将 `OPENAI_BASE_URL` 指向你的 endpoint:
```
embedding:
model: openai/your-model-name
envs:
OPENAI_BASE_URL: https://your-endpoint/v1
OPENAI_API_KEY: your-api-key
```
不要在 base URL 后追加 `/embeddings` —— LiteLLM 会自动处理。
Azure OpenAI
```
embedding:
model: azure/your-deployment-name
envs:
AZURE_API_KEY: your-api-key
AZURE_API_BASE: https://your-resource.openai.azure.com
AZURE_API_VERSION: "2024-06-01"
```
Gemini
```
embedding:
model: gemini/gemini-embedding-001
envs:
GEMINI_API_KEY: your-api-key
```
Mistral
```
embedding:
model: mistral/mistral-embed
envs:
MISTRAL_API_KEY: your-api-key
```
Voyage (针对代码优化)
```
embedding:
model: voyage/voyage-code-3
envs:
VOYAGE_API_KEY: your-api-key
```
Cohere
```
embedding:
model: cohere/embed-v4.0
envs:
COHERE_API_KEY: your-api-key
```
AWS Bedrock
```
embedding:
model: bedrock/amazon.titan-embed-text-v2:0
envs:
AWS_ACCESS_KEY_ID: your-access-key
AWS_SECRET_ACCESS_KEY: your-secret-key
AWS_REGION_NAME: us-east-1
```
Nebius
```
embedding:
model: nebius/BAAI/bge-en-icl
envs:
NEBIUS_API_KEY: your-api-key
```
任何 [LiteLLM 支持的模型](https://docs.litellm.ai/docs/embedding/supported_embedding)均可使用。使用 LiteLLM 模型时,请设置 `provider: litellm`(或忽略 `provider` —— 对于非 `sentence-transformers` 模型,LiteLLM 是默认值)。有关每个提供商读取的完整环境变量列表(API key、base URL、区域等),请参阅 LiteLLM 的[设置 API Keys](https://docs.litellm.ai/docs/set_keys)。
### 本地 SentenceTransformers 模型
设置 `provider: sentence-transformers` 并使用任何 [SentenceTransformers](https://www.sbert.net/) 模型(无需 API key)。
**示例 —— 通用文本模型:**
```
embedding:
provider: sentence-transformers
model: nomic-ai/nomic-embed-text-v1.5
```
**GPU 优化的代码检索:**
[`nomic-ai/CodeRankEmbed`](https://huggingface.co/nomic-ai/CodeRankEmbed) 提供了比默认模型显著更好的代码检索效果。它具有 1.37 亿参数,需要约 1 GB 的 VRAM,并具有 8192 token 的上下文窗口。
```
embedding:
provider: sentence-transformers
model: nomic-ai/CodeRankEmbed
```
**注意:** 切换模型需要重新索引你的代码库(`ccc reset && ccc index`),因为向量维度不同。
## 支持的语言
| 语言 | 别名 | 文件扩展名 |
|----------|---------|-----------------|
| c | | `.c` |
| cpp | c++ | `.cpp`, `.cc`, `.cxx`, `.h`, `.hpp` |
| csharp | csharp, cs | `.cs` |
| css | | `.css`, `.scss` |
| dtd | | `.dtd` |
| fortran | f, f90, f95, f03 | `.f`, `.f90`, `.f95`, `.f03` |
| go | golang | `.go` |
| html | | `.html`, `.htm` |
| java | | `.java` |
| javascript | js | `.js` |
| json | | `.json` |
| kotlin | | `.kt`, `.kts` |
| lua | | `.lua` |
| markdown | md | `.md`, `.mdx` |
| pascal | pas, dpr, delphi | `.pas`, `.dpr` |
| php | | `.php` |
| python | | `.py` |
| r | | `.r` |
| ruby | | `.rb` |
| rust | rs | `.rs` |
| scala | | `.scala` |
| solidity | | `.sol` |
| sql | | `.sql` |
| svelte | | `.svelte` |
| swift | | `.swift` |
| toml | | `.toml` |
| tsx | | `.tsx` |
| typescript | ts | `.ts` |
| vue | | `.vue` |
| xml | | `.xml` |
| yaml | | `.yaml`, `.yml` |
### 自定义数据库位置
默认情况下,索引数据库(`cocoindex.db` 和 `target_sqlite.db`)与设置文件一起存放在 `/.cocoindex_code/` 中。在 Docker 中运行时,出于性能考虑(LMDB 在挂载的卷上运行不佳),你可能希望将数据库放置在容器的原生文件系统上,同时将源代码和设置保留在挂载的卷上。
设置 `COCOINDEX_CODE_DB_PATH_MAPPING` 可通过路径前缀重新映射数据库位置:
```
COCOINDEX_CODE_DB_PATH_MAPPING=/workspace=/db-files
```
使用此映射,位于 `/workspace/myrepo` 的项目会将其数据库存储在 `/db-files/myrepo/` 中,而不是 `/workspace/myrepo/.cocoindex_code/`。设置文件将保留在原始位置。
多个映射以逗号分隔并按顺序解析(匹配优先者生效):
```
COCOINDEX_CODE_DB_PATH_MAPPING=/workspace=/db-files,/workspace2=/db-files2
```
源路径和目标路径都必须是绝对路径。如果没有匹配的映射,则使用默认位置。
## 故障排除
运行 `ccc doctor` 来诊断常见问题。它会检查你的设置、daemon 健康状况、embedding 模型、文件匹配和索引状态 —— 所有操作只需一条命令。
### `sqlite3.Connection object has no attribute enable_load_extension`
某些 Python 安装(例如 macOS 上预装的版本)附带的 SQLite 库未启用扩展功能。
**macOS 修复:** 通过 [Homebrew](https://brew.sh/) 安装 Python:
```
brew install python3
```
然后重新安装 cocoindex-code(安装选项请参阅[开始使用](#get-started--zero-config-lets-go)):
使用 pipx:
```
pipx install cocoindex-code # first install
pipx upgrade cocoindex-code # upgrade
```
使用 uv(安装或升级):
```
uv tool install --upgrade cocoindex-code
```
### `MDB_MAP_FULL: Environment mapsize limit reached`
索引存储在 LMDB 数据库中,其最大空间在 daemon 启动时已固定。默认上限为 **4 GiB**,这对大多数项目来说已经足够,但对于非常庞大的代码库(数以万计的文件),特别是使用像 `nomic-ai/CodeRankEmbed` 这样的高维度 embedding 模型时,可能会耗尽空间。
使用 `COCOINDEX_LMDB_MAP_SIZE` 环境变量(值以**字节**为单位)提高上限。LMDB 仅在写入数据时才会增加文件大小,因此设置一个较高的上限并不会预分配磁盘空间 —— 你可以放心地设置得宽裕一些:
```
# ~/.cocoindex_code/global_settings.yml
envs:
COCOINDEX_LMDB_MAP_SIZE: "34359738368" # 32 GiB (= 32 * 1024^3)
```
或者,如果你更喜欢在 shell 环境中设置它(daemon 会继承它):
```
export COCOINDEX_LMDB_MAP_SIZE=$((32 * 1024 * 1024 * 1024)) # 32 GiB
```
map size 是在 daemon 启动时读取的,因此重启它以使更改生效,然后重新索引:
```
ccc daemon restart
ccc index
```
## 旧版:环境变量
如果你之前是通过环境变量配置 `cocoindex-code` 的,`cocoindex-code` 的 MCP 命令仍然会读取它们,并在首次运行时自动迁移到 YAML 设置。对于新的设置,我们建议切换到 YAML 配置。
| 环境变量 | YAML 等效项 |
|---------------------|-----------------|
| `COCOINDEX_CODE_EMBEDDING_MODEL` | `global_settings.yml` 中的 `embedding.model` |
| `COCOINDEX_CODE_DEVICE` | `global_settings.yml` 中的 `embedding.device` |
| `COCOINDEX_CODE_ROOT_PATH` | 改为在你的项目根目录中运行 `ccc init` |
| `COCOINDEX_CODE_EXCLUDED_PATTERNS` | 项目 `settings.yml` 中的 `exclude_patterns` |
| `COCOINDEX_CODE_EXTRA_EXTENSIONS` | 项目 `settings.yml` 中的 `include_patterns` + `language_overrides` |
## 遥测
`cocoindex-code` 通过 CocoIndex 发送匿名的使用遥测数据,以便我们了解该工具的总体使用情况并优先考虑改进方向。这些事件会标明自己为 `application: cocoindex-code`。
我们**绝不会**收集你的源代码、文件路径、查询、搜索结果、embedding、设置或来自你代码库或环境的任何其他内容。
要选择退出,请设置:
```
export COCOINDEX_DISABLE_USAGE_TRACKING=1
```
## 大型代码库 / 企业版
[CocoIndex](https://github.com/cocoindex-io/cocoindex) 是一款极其高效的索引引擎,对于企业的大型代码库,它也能实现规模化运作。在企业场景中,当存在大型或众多代码仓库时,与团队成员共享索引会高效得多。我们还有诸如分支去重等专为企业用户设计的高级功能。
如果你在远程设置方面需要帮助,请发送电子邮件给我们的维护者 linghua@cocoindex.io,很乐意为你提供帮助!
## 贡献
我们欢迎各种形式的贡献!该项目使用 [uv](https://docs.astral.sh/uv/getting-started/installation/) 进行开发,并且每个 PR 都必须通过 CI 中相同的 lint、格式化、类型检查和测试套件。**请在打开 PR 之前在本地运行这些检查** —— pre-commit 检查失败是传入 PR 出现 CI 报错的最常见原因。
### 1. 安装开发依赖
安装 [uv](https://docs.astral.sh/uv/getting-started/installation/) 后,同步项目。这将安装检查所需的所有内容 —— 包括 [prek](https://github.com/j178/prek)(一个快速的 pre-commit 运行器),以及 Ruff、mypy 和 pytest:
```
uv sync
```
### 2. 在每次 PR 之前运行所有检查
对所有文件运行完整的 hook 套件 —— 这正是 CI 运行的内容:
```
uv run prek run --all-files
```
它会运行行尾空格/文件末尾修复、Ruff lint (`--fix`) 和格式化、`uv.lock` 验证、mypy 类型检查以及 pytest 测试套件。修复它报告的任何问题(Ruff 会为你自动修复大多数 lint/格式问题),重新运行直到通过,然后再进行 push。
### 3. (可选)在每次提交时自动运行
要在每次 `git commit` 时运行相同的检查,请安装一次 git hook:
```
uv run prek install
```
有关更多详细信息,请参阅我们的[贡献指南](https://cocoindex.io/docs/contributing/guide)。
## 许可证
Apache-2.0标签:AI编程助手, CLI, MCP, Rust, SOC Prime, WiFi技术, 代码搜索, 可视化界面, 开发工具, 网络流量审计, 请求拦截, 逆向工具