内容
# 代码检查
**一款在真实代码库中发现未测试且存在风险的代码的代理,并解释其重要性。**
代码检查会扫描Python、Java或JavaScript代码库,识别出没有对应测试的函数和类,并解释*为什么*不测试它们是有风险的(基于代码实际执行的内容,而非通用模板)。它还可以为其草拟测试桩。此外,它还可以回答有关代码库的一般问题,并在需要时编写符合项目现有约定新代码。
所有内容都基于通过检索增强生成(RAG)从实际检索的源代码中获取——代理永远不会根据内存猜测代码的作用。
---
## 为什么存在
"与代码库聊天"是一个饱和的类别。该项目故意狭隘和具体:**它发现测试空白并解释风险**,使用AST级分块(不是天真的固定大小文本分割),因此检索的代码始终是一个完整且有意义的单元——整个函数,而不是其中的一半。
## 功能
- 🔍 **一键空白扫描** — 查找未测试的函数/类/方法,附带文件:行引用
- 🧠 **基于真实代码的风险解释** — 分析特定函数的作用(变更状态、涉及身份验证/输入/输出等),而非模板
- ✍️ **测试草拟** — 生成pytest/JUnit存根为文本(从不自动写入文件)
- 💬 **一般问答** — "在哪里处理X?", 以及为新功能提供基于代码的生成
- 🌐 **多语言** — Python、Java和JavaScript(包括React/JSX组件)
- 🆓 **默认零成本** — 在Groq和Gemini的免费层运行,并具有自动故障转移;如果您有API积分,Claude支持作为直接升级
- 🖥️ **Streamlit UI** — 聊天视图、一键扫描视图、应用内代码库索引和透明的"推理跟踪",显示代理进行的每个工具调用
## 架构
```
用户(Streamlit或CLI)
│
▼
代理(Groq/Gemini/Claude,通过工具使用循环)
│
决定调用哪些工具
│
┌────┴─────────────┬──────────────────┐
▼ ▼ ▼
MCP服务器工具: MCP服务器工具: MCP服务器工具:
search_code(查询) read_file(路径) find_untested(路径)
│ │ │
▼ ▼ ▼
Chroma向量数据库 直接文件 Chroma元数据
(语义搜索) 从磁盘读取 过滤(has_test)
│
▼
代理解释风险,引用文件:行,草拟测试为文本
```
**索引管道** (通过`index_repo.py`每个代码库运行一次):
```
代码库文件夹 → walker.py(查找源/测试文件,跳过构建工件)
→ chunkers/*.py(tree-sitter AST解析 → 函数/类块)
→ test_linkage.py(名称匹配启发式 → has_test标志)
→ sentence-transformers(嵌入每个块)
→ ChromaDB(存储向量 + 元数据)
```
## 技术栈
| 层 | 技术 |
|---|---|
| 分块 | `tree-sitter`(跨Python/Java/JS的统一AST解析) |
| 嵌入 | `sentence-transformers`(`all-MiniLM-L6-v2`,本地,免费) |
| 向量存储 | ChromaDB |
| 工具协议 | MCP(模型上下文协议) |
| LLM后端 | Groq,Gemini(免费层,带故障转移)— Claude可选 |
| UI | Streamlit |
## 设置
```bash
git clone <此代码库>
cd codecheck
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
```
创建`.env`文件(参见`.env.example`):
```
GROQ_API_KEY=您的groq密钥 # console.groq.com — 免费,无需信用卡
GEMINI_API_KEY=您的gemini密钥 # aistudio.google.com/apikey — 免费,无需信用卡
# ANTHROPIC_API_KEY=您的密钥 # 可选,用于agent.py代替agent_multi.py
```
## 使用
**1.索引代码库** (每个代码库一次,在代码发生重大变化后重新运行):
```bash
python index_repo.py path/to/your/repo
```
**2.通过CLI提问** :
```bash
python agent_multi.py "此代码库中哪些是未测试且有风险的?"
python agent_multi.py "为calculate_refund草拟pytest存根"
```
**3.或启动UI:**
```bash
streamlit run app.py
```
直接从侧边栏索引新的代码库,一键扫描空白,或自由聊天 — 初始设置后无需CLI。
## 项目结构
```
chunkers/ # 每个语言的AST块提取器(Python/Java/JS)
walker.py # 代码库目录遍历器,源/测试文件分类
test_linkage.py # 每个语言的has_test启发式
index_repo.py # 独立索引脚本
retrieval.py # search_code / find_untested / read_file
mcp_server.py # MCP服务器通过工具公开上述内容
providers.py # Groq/Gemini适配器 + 故障转移逻辑
agent.py # 代理循环(Claude)
agent_multi.py # 代理循环(带有故障转移的Groq/Gemini)
app.py # Streamlit UI
```