code-refactor
README.md
<div align="center">
# 代码重构助手
**把遗留代码重构为现代规范代码,保持原有接口与行为不变**
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/)
[](https://nodejs.org/)
[](https://modelcontextprotocol.io/)
[](https://www.npmjs.com/package/workbuddy-code-refactor-connector)
一个基于本地大模型的代码重构服务。输入一段源代码和一句重构要求,输出重构后的完整代码。
**代码不离开你的机器** —— 核心版通过本地 Ollama 推理,无任何数据上传。
[快速开始](#-快速开始) · [功能](#-功能) · [使用方式](#-使用方式) · [定价](#-开源版与托管版) · [贡献](#-贡献)
</div>
---
## 这是什么
历史项目里总有些代码:能跑,但没人愿意碰。变量叫 `a`、`tmp1`、`data2`,三层嵌套的 `if` 里塞着业务逻辑,同一个校验规则在五个地方各写了一遍。
这个项目做的就是把这些代码改造好。它**不修复 bug、不添加功能**,只改结构——让代码好读、好改,同时保证外部行为完全不变。
核心能力由本地 [Ollama](https://ollama.com/) 上的代码模型(默认 `deepseek-coder`)驱动,可以以 **MCP Server**、**HTTP API**、**技能包** 等多种形态接入你现有的工作流。
## 功能
| 能力 | 说明 |
|---|---|
| **命名规范化** | 把 `f`、`a`、`tmp1` 改为能表达意图的命名 |
| **重复逻辑提取** | 识别重复代码片段,提取为独立函数或方法 |
| **控制流简化** | 嵌套条件改为提前返回(卫语句),合并冗余分支 |
| **类型标注补充** | 为 Python、TypeScript 补充类型标注 |
| **文档注释生成** | 按语言惯例补充 docstring / JSDoc / Javadoc |
| **语法现代化** | 回调改 `async/await`、`var` 改 `let/const`、循环改推导式 |
**支持语言**:Python · JavaScript · TypeScript · Java · Go · Rust · C · C++
### 设计原则
重构这件事,改坏比不改更糟。所以本项目有两条硬约束:
1. **不改公共接口** —— 函数名、类名、参数签名、返回值结构保持原样(除非你明确要求改)
2. **保持行为等价** —— 重构后逻辑与原代码一致,不顺手修 bug
## 快速开始
### 前置条件
- Python 3.11+ 或 Node.js 18+
- [Ollama](https://ollama.com/download) 已安装并运行
- 已拉取代码模型:`ollama pull deepseek-coder`
### 方式一:本地 Python 直接调用
```bash
git clone https://github.com/zhouhengchang/code-refactor.git
cd code-refactor
python shared/refactor_core.py # 内置自测,会先检查服务再跑一个示例
```
也可以在自己的代码里调用:
```python
# -*- coding: utf-8 -*-
"""最小调用示例。"""
from shared.refactor_core import refactor_code, check_ollama_status
# 先确认环境就绪
print(check_ollama_status())
# 执行重构
result = refactor_code(
code="def f(a):\n r = []\n for i in a:\n if i % 2 == 0:\n r.append(i * i)\n return r\n",
task="重命名为有意义的函数名与变量名,补充类型标注与中文注释",
language="python",
)
if result["ok"]:
print(result["code"])
else:
print("失败:", result["error"])
```
### 方式二:作为 MCP Server 接入(Claude Desktop / WorkBuddy / 任意 MCP 客户端)
已发布到 npm,**不用克隆仓库**,直接在 MCP 客户端配置里引用:
```json
{
"mcpServers": {
"code-refactor": {
"command": "npx",
"args": ["-y", "workbuddy-code-refactor-connector"],
"env": {
"REFACTOR_BACKEND": "ollama",
"OLLAMA_HOST": "http://localhost:11434",
"OLLAMA_MODEL": "deepseek-coder"
}
}
}
}
```
> npm 包:[workbuddy-code-refactor-connector](https://www.npmjs.com/package/workbuddy-code-refactor-connector)
也可以从源码运行,便于自己改代码:
```bash
cd workbuddy-connector/server
npm install
```
然后把上面的 `command` 改成 `node`,`args` 改成 `["/绝对路径/to/workbuddy-connector/server/index.js"]` 即可。
重启客户端后即可使用 `refactor_code` 和 `check_status` 两个工具。
### 方式三:Docker 部署 HTTP 服务
```bash
docker build -t code-refactor-xpack:1.0.0 -f xpack-server/Dockerfile .
docker run -p 8000:8000 \
-e OLLAMA_HOST=http://host.docker.internal:11434 \
-e OLLAMA_MODEL=deepseek-coder \
code-refactor-xpack:1.0.0
```
调用:
```bash
curl -X POST http://localhost:8000/refactor \
-H "Content-Type: application/json" \
-d '{
"code": "def f(a):\n return [i*i for i in a if i % 2 == 0]\n",
"task": "函数名与变量名改为有意义的命名,补充类型标注",
"language": "python"
}'
```
## 使用方式
### 输入
| 参数 | 必填 | 说明 |
|---|---|---|
| `code` | 是 | 待重构代码,≤ 20000 字符 |
| `task` | 是 | 重构要求,越具体效果越好 |
| `language` | 否 | 语言标识,不填自动判断 |
### 输出
```json
{
"ok": true,
"code": "重构后的完整代码",
"model": "deepseek-coder",
"language": "python",
"elapsed_ms": 3820
}
```
失败时返回 `{"ok": false, "error": "可读中文错误信息", "error_type": "..."}`,**不抛异常、不暴露堆栈**。
### `task` 怎么写
这是影响结果质量最大的一个变量。
| 别这样写 | 换成这样 |
|---|---|
| 「优化一下」 | 「把五层嵌套 if 改为提前返回,提取重复的参数校验为独立函数」 |
| 「太乱了」 | 「统一命名规范,拆分超过 50 行的函数,补充中文注释」 |
| 「改写好点」 | 「把回调写法改为 async/await,保留原有的错误处理分支」 |
### 使用建议
- **一次一个目标。** 「重构 + 加功能」拆成两步做。
- **长代码分批。** 单次 ≤ 300 行为宜,按函数粒度提交。
- **结果先验证再应用。** 跑一遍现有测试再替换生产代码。
## 配置
全部通过环境变量注入,**代码中不含任何密钥**。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
| `REFACTOR_BACKEND` | `ollama` | 推理后端:`ollama`(本地)或 `openai`(任意 OpenAI 兼容接口) |
| `OLLAMA_HOST` | `http://127.0.0.1:11434` | Ollama 服务地址 |
| `OLLAMA_MODEL` | `deepseek-coder` | 本地模型 |
| `OPENAI_BASE_URL` | `https://api.deepseek.com/v1` | 云端接口地址(`REFACTOR_BACKEND=openai` 时生效) |
| `OPENAI_API_KEY` | — | 云端密钥,**仅从环境变量读取,永不写进代码** |
| `OPENAI_MODEL` | `deepseek-flash` | 云端模型(DeepSeek 官方在列:`deepseek-flash` / `deepseek-v4-pro`) |
| `REFACTOR_TIMEOUT` | `180` | 超时秒数(Python) |
| `REFACTOR_TIMEOUT_MS` | `180000` | 超时毫秒数(Node.js) |
本地和云端两套后端**同一份代码**,切换只改环境变量:
```bash
# 改用云端 OpenAI 兼容接口
export REFACTOR_BACKEND=openai
export OPENAI_API_KEY=sk-xxxx
```
> 超时默认给到 180 秒,是因为在纯 CPU 的低配机器上本地推理可能需要 1 分钟以上。如果你的机器有 GPU,可以调小。
想用更小更快的本地模型:`OLLAMA_MODEL=qwen2.5-coder:1.5b`。
## 运维工具
`tools/` 下有两个自检脚本,改完配置或轮换密钥后建议跑一遍,避免"改完才发现用不了":
| 脚本 | 作用 |
|---|---|
| `tools/rotate_key.py` | 密钥轮换:先校验**鉴权 / 余额 / 真实调用**三关,全过才允许写入;替换前自动备份,可一键回滚 |
| `tools/verify_online.py` | 线上体检:依次请求 `/healthz`、`/status`、`/refactor`,确认新配置在生产环境真正生效 |
```bash
# 只验证,不改任何文件
python tools/rotate_key.py --check --key sk-xxxx
# 验证通过后写入 .env
python tools/rotate_key.py --apply --key sk-xxxx
# 线上实例体检
python tools/verify_online.py https://your-host/
```
> `rotate_key.py` 只改 `.env` 里 `OPENAI_API_KEY` 一行,其余配置原样保留。
## 项目结构
```
code-refactor/
├── shared/refactor_core.py # 核心逻辑(唯一真源)
├── workbuddy-connector/ # WorkBuddy / MCP 连接器
├── xpack-server/ # OpenAPI + FastAPI + Dockerfile
├── coze-skill/ # 扣子技能包
├── skillhub-skill/ # SkillHub Pay Skill
├── alipay-ai/ # 支付宝 AI收 接入配置
├── xinghuo-agent/ # 讯飞星火智能体配置
├── tools/ # 密钥轮换与线上体检脚本
└── github-repo/ # 本文档所在的开源仓库
```
## 开源版与托管版
本项目采用 **Freemium** 模式:核心能力完全开源免费,托管服务面向不想自己部署的用户。
| | **开源版(MIT)** | **托管版 Pro** |
|---|---|---|
| 价格 | 免费 | ¥29/月(含 200 次调用)<br>或 ¥1/次按需付费 |
| 部署 | 自己部署 Ollama | 无需部署,开箱即用 |
| 模型 | 你自己选的模型 | 更大的代码模型,效果更好 |
| 速度 | 取决于你的硬件 | GPU 加速,平均 3-5 秒响应 |
| 语言支持 | 8 种 | 8 种 + 优先级支持 |
| 批量重构 | 需自行封装 | 支持仓库级批量重构 |
| 私有部署 | — | 支持 |
| 支持 | 社区 Issue | 优先工单响应 |
**该选哪个?**
- 代码不能出内网 / 想完全掌控 → **开源版**,直接克隆部署
- 本机没有 GPU、不想折腾环境、需要更好的重构质量 → **托管版**
👉 **托管版入口:** <https://code-refactor.app.workbuddy.host>
> 托管版同样承诺:**代码仅用于本次推理,不留存、不用于模型训练。**
## 在各大平台使用
本服务已适配以下平台,可按需取用对应目录下的配置文件:
| 平台 | 形态 | 配置 / 入口 |
|---|---|---|
| **npm** | 可执行 MCP Server(已上线) | `npx -y workbuddy-code-refactor-connector` |
| WorkBuddy 开放平台 | Connector / MCP Server | `workbuddy-connector/` |
| XPack MCP 交易平台 | OpenAPI → MCP 服务 | `xpack-server/openapi.json` |
| 扣子(Coze) | 技能商店 Skill | `coze-skill/skill.json` |
| SkillHub | Pay Skill | `skillhub-skill/manifest.json` |
| 支付宝 AI收 | 按调用即时收款 | `alipay-ai/alipay-ai-config.json` |
| 讯飞星火 | 智能体 / 独立 API | `xinghuo-agent/agent-config.json` |
## 常见问题
**Q:为什么非要本地跑?云端 API 不是更方便?**
代码是核心资产。本地推理意味着你的代码一个字节都不会离开你的机器——这对企业代码库往往是硬性要求。想省事就用托管版。
**Q:重构会不会改坏我的代码?**
设计上不会改变外部行为,但这不构成保证。**上生产前请务必跑测试。** 项目的第一原则就是"不改接口、不改行为",但模型输出总有不确定性,代码审查不可省。
**Q:支持多大的代码?**
单次 20000 字符以内,建议 300 行以内。更大的文件按函数拆分。
**Q:能只重构一个函数吗?**
可以,只把那个函数贴进来就行。
**Q:为什么用 `deepseek-coder`?**
在代码任务上表现稳定,是本地小体量模型里性价比较好的选择。你可以通过 `OLLAMA_MODEL` 换成任何 Ollama 模型。
> 注意:Ollama 上的 `deepseek-coder` 标签实际是 **约 776MB 的小体量版本**,并不是原版的 6.7B。算力允许的话,换成 `qwen2.5-coder:7b` 效果会明显更好。
**Q:响应慢怎么办?**
换更小的模型(`qwen2.5-coder:1.5b`)、缩小单次重构范围、或确认本机没有其他任务在抢 GPU。用托管版也能绕开本地算力限制。
## 贡献
欢迎 Issue 和 PR。特别需要这些方向的帮助:
- **新的重构模式** —— 你反复手动做的事,可能就是下一个内置能力
- **语言适配** —— 目前对 Kotlin、Swift、PHP 的支持还比较弱
- **测试用例** —— 尤其是"重构后行为保持一致"的验证用例
提 PR 前请确认:代码有中文注释、不含硬编码密钥、通过现有测试。
## 许可证
[MIT](LICENSE) —— 可自由商用、修改、分发。
---
<div align="center">
**如果这个项目帮你省下了清理遗留代码的时间,给个 ⭐ 是最好的鼓励。**
[赞助这个项目](https://github.com/sponsors/zhouhengchang) · [提交 Issue](https://github.com/zhouhengchang/code-refactor/issues)
</div>
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessUnresponsive