上周五下午,我盯着屏幕上一个跑了快两年的老项目,后端代码已经堆了3万多行,各种monkey patch和临时逻辑像蜘蛛网一样缠在一起。我决定——用AI Agent来一次彻底的代码重构。之前试过Cursor和Copilot,但这次我选了Claude Code,配合MCP协议和OpenCode做辅助。3天下来,代码从3.2万行压缩到1.8万行,bug率降了40%,但中间踩的坑差点让我想砸键盘。
一、为什么选Claude Code而不是Cursor?
很多人问我这个问题。坦白说,Cursor在IDE集成上确实强,但它的Agent模式在处理超长上下文(比如重构一个5000行的service文件)时,经常忘记前面的指令。而Claude Code的上下文窗口是100K tokens起步,配合MCP的上下文压缩,能扛住大型重构。
我的具体配置:Claude Code + MCP Server(本地部署)+ OpenCode作为补充Agent。项目是一个Python后端,用FastAPI写的,数据库是PostgreSQL。
二、实操步骤:我是怎么做的
第一天:用MCP给Claude Code“喂”项目结构
直接让Claude Code读整个项目?它会卡死在token限制里。我的做法是:先写一个MCP Server,把项目文件树、依赖关系、数据库schema都压缩成结构化数据,然后通过MCP协议喂给Claude。
# 一个简单的MCP Server示例(Python)
from mcp import MCPServer, Tool, Resource
server = MCPServer("my-project")
@server.resource("project://structure")
def get_structure():
return {
"services": ["auth", "payment", "user", "notification"],
"deps": {"auth": ["user"], "payment": ["user", "notification"]},
"db_tables": ["users", "orders", "transactions"],
"code_lines": 32000
}
server.run()
然后我让Claude Code通过MCP读取这个结构,再一步步拆解任务。它先识别出耦合最严重的模块——支付模块和用户模块互相依赖,导致每次改支付都要改用户。
第一次坑:MCP Server的返回格式太复杂,Claude Code解析了5分钟还没开始干活。后来我把JSON结构拍平,用简单的key-value对,速度立刻快了3倍。
第二天:用OpenCode做“脏活”——批量重构
Claude Code擅长决策,但真正改代码时,它一次只能改一个文件。对于300多个文件的重构,我引入了OpenCode。这是一个开源的Agent框架,可以批量执行任务。
我的流程是:Claude Code制定重构策略(比如“把支付模块的数据库查询全部移到repository层”),然后OpenCode自动遍历所有相关文件,生成diff patch,我review后合并。
# OpenCode批量重构指令示例
agent run --task "move all db queries from payment_service.py to payment_repository.py" \
--include "payment/*.py" \
--exclude "test_*" \
--model claude-3-opus
结果它一口气改了47个文件,但……
第二次坑:OpenCode在改文件时,把一些import语句删错了。因为payment_service.py里有一个函数直接用了
db.session.query,但OpenCode没注意到这个函数也被其他模块调用了。我花了2小时修复这些“误伤”。教训:批量操作前,一定要让Agent先生成依赖图,标记哪些函数是公共接口。
三、第三天:用Hermes Agent做测试和验证
重构完代码,最大的恐惧是“改坏了但没发现”。我用了Hermes Agent来自动生成测试用例并运行。这个Agent能根据代码变化自动补全单元测试,覆盖率从62%提升到89%。
具体做法是:把重构前后的代码diff喂给Hermes,它会分析哪些逻辑变了,然后生成对应的pytest用例。我还让它跑了一遍集成测试,发现了一个隐藏bug——订单状态机的状态迁移少了一个分支。
第三次坑:Hermes Agent生成的测试用例太“乐观”了。它只测试了正常路径,没覆盖异常场景。比如支付超时、数据库连接断开等。我后来手动加了20个异常测试,才敢上线。
四、我遇到的坑(完整版)
除了上面提到的,还有几个值得说的:
- MCP的上下文压缩太激进:Headroom Labs的Headroom项目(GitHub上5.5万星的那个)我试过,它把RAG chunks和日志压缩后再喂给LLM,但压缩率设到60%时,一些关键错误信息被丢了。建议压缩率控制在30%以内。
- Claude Code的“幻觉”问题:它有一次建议我把一个API路由改成WebSocket,理由是“性能更好”。但实际场景下,那个接口一天只调用200次,完全没必要。一定要结合业务数据判断,别盲信Agent的建议。
- 多Agent协作的冲突:Claude Code和OpenCode同时修改同一个文件时,产生了冲突。我后来给它们分配了不同的工作目录:Claude Code只生成计划,OpenCode只执行计划,Hermes只做验证。
五、数据对比:重构前后
| 指标 | 重构前 | 重构后 | 变化 |
|---|---|---|---|
| 代码行数 | 32,000 | 18,000 | -43% |
| 模块耦合度(扇出数) | 8.2 | 3.1 | -62% |
| 单元测试覆盖率 | 62% | 89% | +27% |
| 单次API响应时间(p95) | 320ms | 210ms | -34% |
| 上线后3天bug数 | 7 | 2 | -71% |
六、工具选择建议
如果你也想尝试类似的工作流,我的建议是:
- 小项目(<5000行):直接用Cursor的Agent模式就够了,别折腾MCP。
- 中型项目(5000-20000行):用Claude Code + MCP,但一定要手动控制上下文,别让它自己“放飞”。
- 大型项目(>20000行):强烈建议用OpenCode或bytedance/deer-flow(GitHub上7.5万星的那个)做任务分解。Deer Flow的长时序任务规划能力很强,能自动把重构拆成100多个小步骤。
另外,不要把所有Agent都放在同一个目录下工作。给每个Agent独立的workspace,最后用git merge。我因为没注意这个,吃了大亏。
七、结论:AI Agent重构靠谱吗?
靠谱,但有条件。我的经验是:AI Agent适合做“机械性重构”——比如统一代码风格、提取公共函数、迁移数据库查询方式。但不适合做“架构级决策”——比如要不要从微服务切回单体,或者要不要换数据库。
最后分享一个数字:我用Claude Code + MCP + OpenCode这套组合,3天完成了原来估计要2周的工作。但代价是,我花了整整1天来修复Agent留下的坑。所以实际效率提升大约是3倍,不是10倍。
一句话总结:AI Agent是很好的“高级实习生”,能干活,但需要你盯着。别让它一个人待着,否则它会把你的项目变成“屎山2.0”。
如果你也在用类似的工具,欢迎留言分享你的踩坑经历。下次我准备试试Deer Flow + Hermes Agent的组合,看看能不能把多Agent协作的冲突降到零。
(完)