多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【Claude Code】实战利器 review:减少代码 bug 与代码自动审核的配置验证

【Claude Code】实战利器 review:减少代码 bug 与代码自动审核的配置验证 1. 为什么 AI 写的代码提交后还是被打回我最近在一个中型项目里连续踩了同一个坑功能跑通、单测全绿、本地自测也没问题结果一提交 PR 就被 reviewer 打回。理由五花八门——SQL 拼接没做参数化、日志里把手机号明文打出来了、循环里反复查数据库、边界条件漏了空数组。写代码的是 AI审代码的也是 AI为什么还会漏核心原因就一句话同一个上下文里的 agent 审自己的代码天然会「护短」。它写的时候已经形成了一套自洽的逻辑再让它 review它会默认自己是对的只会挑些无关痛痒的格式问题。这跟人一样你刚写完一段代码让你立刻自查你也会觉得「没问题啊」。所以真正有效的 review 工作流必须满足两个条件换一个干净的上下文以及有一套明确的审核规则。Claude Code 的 review 能力正好能落这两点但前提是配置要对、调用方式要对。这篇就把我在真实项目里跑通的这套流程完整拆开从 settings 配置、skills 目录结构到一次完整的验证动作再到常见的报错排查。适合谁看已经在用 Claude Code 写业务代码、想让提交前多一道自动审核、又不想增加人工负担的开发者。下面所有配置都可以直接复制改掉路径就能用。2. TaoToken 前置准备把 Claude Code 的请求通道配好Claude Code 本身是个客户端它需要一个稳定的模型请求入口。我这边用的是 TaoToken 作为统一接入层好处是 Base URL、Key、Model ID 三件套集中管理换模型不用改代码。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。先说清楚它解决什么问题Claude Code 在 review 时会频繁发起多轮请求读文件、分析 diff、生成建议如果请求通道不稳定review 跑到一半断掉你会以为是配置错了其实是网络层的问题。统一走一个入口排障时变量少很多。你需要准备三样东西Base URLhttps://taotoken.net/apiAPI Key在控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里创建格式通常是一串sk-开头的字符串Model ID比如claude-sonnet-4-5这类具体模型标识在模型列表里能看到创建 Key 的入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进去点新建复制出来存好页面关掉就看不到了。这里有个我踩过的坑很多人把 Key 直接写进项目里的.env然后提交了。千万别。Claude Code 的配置应该放在用户级目录跟项目代码物理隔离。项目级的.claude/settings.json只放审核规则不放凭证。如果你还想让 Claude Code 直接跑在终端里做长任务可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。不过这篇的重点是 review 工作流通道配好就够了。配好之后先别急着写规则用一次最简单的对话验证通道是否通https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里选个模型发一句「你好」能正常返回就说明 Base URL 和 Key 没问题。这一步能帮你把「通道问题」和「配置问题」提前分开。3. 可复制的 settings 与 review skills 配置这一节是全文的核心配置分两块通道配置和审核规则配置。两块分开存放互不干扰。3.1 通道配置settings.jsonClaude Code 读取配置的优先级是项目级.claude/settings.json 用户级~/.claude/settings.json。凭证这种敏感信息放用户级。文件路径macOS/Linux~/.claude/settings.jsonWindowsC:\Users\你的用户名\.claude\settings.json。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key粘贴在这里, ANTHROPIC_MODEL: claude-sonnet-4-5 } }三件套对应关系要记牢ANTHROPIC_BASE_URL是请求入口ANTHROPIC_API_KEY是身份凭证ANTHROPIC_MODEL是具体模型。任何一个写错review 都会失败而且报错信息不一定直白。如果你用的是 Codex 系的工具配置在~/.codex/auth.json结构类似{ base_url: https://taotoken.net/api, api_key: sk-你的Key粘贴在这里, model: claude-sonnet-4-5 }Cline 这类插件则是在 MCP 配置里填 Base URL Key Model ID三件套一个都不能少。不管哪个客户端逻辑都一样入口、凭证、模型。3.2 审核规则配置review skillsClaude Code 的 skills 机制允许你把一套审核规则写成文件调用时按规则执行。目录结构建议这样项目根目录/ ├── .claude/ │ └── settings.json # 项目级配置不放凭证 └── .agents/ └── skills/ └── review/ └── SKILL.md # 审核规则正文SKILL.md里写什么直接决定 review 的质量。我实测下来规则越具体误报越少。下面是我在用的版本你可以直接抄# Review Skill ## 审核范围 只审核 git diff 中未提交的改动不审核历史代码。 ## 必须检查的维度 ### 1. 安全 - SQL 是否使用参数化查询禁止字符串拼接 - 日志/异常信息是否泄露手机号、身份证、密码、Token - 用户输入是否做了校验和转义 - 文件路径是否可被用户控制路径穿越 ### 2. 规范 - 函数是否超过 50 行 - 是否有未使用的变量和 import - 命名是否符合项目约定camelCase / snake_case ### 3. 性能 - 循环内是否有数据库查询或网络请求 - 是否有 N1 查询 - 大数组操作是否考虑分页 ### 4. 业务 - 边界条件空数组、null、0、负数 - 并发场景是否有竞态 - 事务边界是否正确 ## 输出格式 按严重程度分组严重 / 警告 / 建议。 每条给出文件:行号、问题描述、修复建议。注意最后那个输出格式强制分组能让你一眼看到哪些必须改、哪些可以缓。没有这个约束模型会把所有问题平铺出来你反而不知道先动哪个。3.3 调用方式另起一个干净窗口这是原文里最关键的一条避雷经验我完全认同review 必须另起一个终端窗口。原因前面说过同一个上下文里 agent 会护短。新窗口意味着全新的上下文它看到的是「别人写的代码」审核会更客观。调用命令.agents/skills/review 审查一下未提交的代码在 Claude Code 的交互界面里输入这行它会读取 skill 规则然后对git diff的内容逐条审核。4. 验证请求跑一次完整的 review 看结果配置写完不验证等于没配。这一节给你一个完整的验证动作从造一个有问题的改动开始到看到审核结果为止。4.1 造一个「有坑」的改动先写一段故意有问题的代码方便观察 review 能不能抓到。新建demo.pyimport sqlite3 def get_user(username): conn sqlite3.connect(app.db) cursor conn.cursor() # 问题1SQL 字符串拼接 sql SELECT * FROM users WHERE name username cursor.execute(sql) result cursor.fetchall() # 问题2日志泄露敏感信息 print(f查询用户: {username}, 结果: {result}) return result def get_all_orders(user_ids): conn sqlite3.connect(app.db) cursor conn.cursor() orders [] # 问题3循环内查询N1 for uid in user_ids: cursor.execute(SELECT * FROM orders WHERE user_id ?, (uid,)) orders.extend(cursor.fetchall()) return orders这段代码有三个明显问题SQL 注入、日志泄露、N1 查询。正好对应 skill 里的三个维度。4.2 另起窗口执行 review打开一个新的终端窗口进入项目目录启动 Claude Code然后输入.agents/skills/review 审查一下未提交的代码4.3 预期结果正常情况下它会输出类似这样的分组结果## 严重 - demo.py:8 SQL 字符串拼接存在注入风险。建议改为参数化查询 cursor.execute(SELECT * FROM users WHERE name ?, (username,)) ## 警告 - demo.py:11 日志打印了完整查询结果可能泄露用户敏感信息。建议只打印数量或脱敏字段。 - demo.py:19 循环内执行数据库查询存在 N1 问题。建议改为 IN 查询一次性取出。 ## 建议 - demo.py:5 连接未关闭建议使用 with 语句或 try/finally。看到这个结果说明你的配置链路是通的settings 里的通道正常、skill 规则被正确加载、review 逻辑生效。4.4 挨个解决拿到结果后直接在同一个 review 窗口里说「按严重程度依次修复」它会逐条改。改完再跑一次 review确认问题清零。这个「审核 → 修复 → 复审」的循环就是降低缺陷率的核心动作。如果你想让 review 更贴近团队规范可以在 skill 里加上项目特有的规则比如「所有对外接口必须加限流注解」「数据库操作必须走 DAO 层」。规则越贴合业务拦截的 bug 越有价值。5. 常见报错排查401、proxy failed、choices 为空配置过程中最容易卡在几个固定报错上。这一节按真实报错逐条对照帮你快速定位。5.1 401 UnauthorizedAPI Error: 401 Unauthorized这是最高频的报错原因基本是 Key 的问题。排查顺序第一检查 Key 有没有复制完整。从控制台复制时容易漏掉尾部字符或者多带了空格。重新去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 复制一次。第二检查settings.json里的字段名。必须是ANTHROPIC_API_KEY写成API_KEY或ANTHROPIC_KEY都不认。第三检查 Key 是否已失效或被删除。控制台里能看到 Key 的状态。5.2 local proxy failed / connection refusedError: local proxy failed to connect这个报错通常不是 Key 的问题而是 Base URL 写错了或者本地有残留的代理配置在拦截请求。排查第一确认ANTHROPIC_BASE_URL是https://taotoken.net/api注意结尾不要多加/v1或斜杠。第二检查系统环境变量里有没有HTTP_PROXY/HTTPS_PROXY这类残留配置。如果有Claude Code 会优先走它们导致请求发不出去。临时清掉unset HTTP_PROXY unset HTTPS_PROXYWindows 下用set HTTP_PROXY清空。5.3 reading choices 报错TypeError: Cannot read properties of undefined (reading choices)这个报错说明请求发出去了但返回结构不符合预期。常见原因是 Model ID 写错了或者模型名在当前通道下不存在。去 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 核对一下可用模型列表把ANTHROPIC_MODEL改成列表里真实存在的 ID。5.4 OAuth 相关报错OAuth error: invalid_grant如果你之前登录过官方账号本地可能残留了 OAuth 凭证Claude Code 会优先用它们而不是你的 API Key。解决办法是清掉本地凭证缓存路径通常在~/.claude/下找到credentials.json之类的文件删掉重启 Claude Code。5.5 review 结果为空配置都对但 review 跑完什么都没输出。这种情况多半是git diff为空——你的改动已经 commit 了。review skill 只审未提交的改动先git status确认有未暂存的修改。如果改动已经 commit 但还没 push可以临时git reset --soft HEAD~1把改动退回来再 review。排查的核心思路先分清是通道问题还是规则问题。401 和 proxy failed 属于通道层choices 和 OAuth 属于凭证层结果为空属于规则层。分层定位比盲目改配置快得多。6. 把 review 变成日常习惯接入与进阶配置跑通只是第一步真正降低缺陷率靠的是把它变成肌肉记忆。我的做法是每次git add之前先另起窗口跑一次 review把严重级别的问题当场改掉警告级别的记下来排期。这样提交的 PR 质量明显提升reviewer 的驳回率下降了一大截。如果你还没配好通道先去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 拿 Key接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里有各客户端的详细步骤。想先验证模型效果可以直接在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里对话试试。如果你打算把 review 接进 CI 或者做长期的 Agent 工作流Coding Plan 会更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后分享一个我用了很久的小技巧把 review skill 里的规则按「团队踩过的坑」持续追加。每被驳回一次就把那条规则写进去。三个月后这个 skill 就成了你们团队最懂业务的审核员比任何通用规则都管用。
返回列表