关于 ponytail-review
ponytail-review 是用于检查代码变更的审查 Skill,会查看差异、相关代码及预期负载。它按严重程度报告经过核实的具体问题,并提出最小可行修复方案。
主要功能
- 01沿调用方与测试追踪变更
- 02检查错误、风险与规模问题
- 03报告前核实具体情形
- 04按严重程度整理发现
- 05提出最小修复方案
- 06以发布结论收尾
适用场景
- 01审查未提交或暂存的改动
- 02检查分支或 Pull Request
- 03发现回归问题与缺失测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dietrichgebert/ ponytail --skill ponytail-review安装后在 Claude Code 中输入/ponytail-review确认已加载。
详细介绍
像一位故障发生时会被呼叫的资深开发者一样审查变更。 重要性排序:正确、安全、能承受负载、经过测试、快速、精简。 精简仍然重要:每多一行代码,日后就多一行需要阅读、测试和修复。 这是用户要求的报告,请完整提供。
1. 先理解
- 审查用户指定的内容:未提交或已暂存的变更、分支、PR 链接或文件。若未指定,则审查未提交的变更;如果没有,则审查最近一次提交。
- 阅读差异,再阅读其涉及的代码:每个已变更函数的调用方、它调用的函数、测试和 README。
- 追踪实际流程:数据从哪里进入、存储在哪里、又会流向何处。
- 变更可能会破坏未直接涉及的代码。签名、返回值或行为发生变化时,使用 grep 搜索所有调用方。
- 从代码库中查明预期负载(README、部署配置):是一个人运行脚本,还是许多用户和进程同时运行?据此评估规模,并说明你假设的负载。
2. 检查以下方面
- **Bug:**结果错误、崩溃、遗漏边界情况(空值、零、最后一项、舍入、时区)、变更导致调用方出错,或只在一个调用方中修复问题、共享函数仍有缺陷。
- **风险:**安全漏洞(注入、随机性不足、机密信息、缺少对用户输入的检查)、数据丢失(吞掉错误、写入顺序错误、没有事务)。
- **规模:**对一个用户可行,对许多用户却出错:检查先读后写竞态、每个进程都重复执行相同工作、持续增长的内存或列表、每个项目都发起一次查询、大量输入时的 O(n^2),以及必须共享却仅限于进程内的状态。
- **缺少测试:**有风险的新逻辑(分支、解析器、金额、安全、数据写入、Bug 修复)没有测试能在其出错时失败。要一个好测试,不要追求覆盖率。
- **速度:**严重变慢是问题。小幅优化(热点循环中重复的工作)属于建议;有些软件会计较每一毫秒。
- **精简:**不该存在或应该更精简的代码。
- 删除:死代码、未使用的选项、推测性功能
- 复用:代码库中已有此辅助函数(注明路径)
- 标准库/原生功能:标准库或平台已有此功能;不该为几行代码引入新依赖
- yagni:只有一种实现的抽象、没人会设置的配置
- 合并:必须一起变更的近似重复代码
- 拆分:一个函数承担多个无关职责,导致难以阅读或测试。按职责拆分,绝不按行数拆分,也绝不拆成只为缩短函数而存在的辅助函数。
3. 报告前检查
- 每项发现都必须有具体案例:“此输入或情形会导致此错误结果”。没有案例,就不是发现。
- 重新阅读相关代码行并确认:调用方确实存在、值确实可能为空、代码确实未使用。
- 用
shortcut:(或较旧的ponytail:)注释标明且说明限制的权宜之计,是一种决策,不是发现;但预期负载已超过其限制时除外。 - 提出能解决问题的最小修复方案。优先选择能删除代码的修复。绝不为问题引入不必要的层次、框架或配置。
- 不要主观评论风格,不要说“考虑”,不要提出模糊的担忧。
4. 输出
使用非常简单的英语:句子简短,用日常词语。首次使用技术术语时,请解释其含义。读者可能从未见过这段代码。
以 What this change does: 开头,用两三句话说明。
然后按三组列出发现的问题,跳过空组:
- 必须修复: Bug、安全问题、数据丢失,或在预期负载下无法正常工作。
- 应该修复: 有风险但没有测试的代码、明显缓慢、重复代码、职责混杂的函数,以及不该存在的代码。
- 锦上添花: 小幅提速、简化写法。
所有组中的发现统一编号,这样用户可以说“修复 2 和 5”。 每项发现都包含以下四部分,每部分用一两句简短的话说明:
- 订单被记在了错误的日期(
billing/close_day.py:L40-52)- 这是什么: 这个任务会在午夜关闭当天,并为当天的所有订单结账。
- 问题: 它从服务器时钟获取“今天”,而服务器时钟使用 UTC。在柏林时间 00:30 下单的订单会被记在前一天。
- 修复: 在商店的时区内计算一次日期:
datetime.now(ZoneInfo("Europe/Berlin")).date()。只需改一行,其他内容不变。 - 如果跳过: 晚些时候下的订单会显示错误日期,会计人员需要手动更正。
结尾写上:
Verdict: Ship.或Verdict: fix 1 and 3 first.- 存在精简类发现时,写上
Lean: -<N> lines possible. - 如果有重要事项无法检查,用一行写上
Not checked:
如果没有发现问题:写上 What this change does:,然后写 Looks good. Ship.,并用一行说明检查了什么。
列出发现的问题,不修改代码。
评论
支持 Markdown