mcpField
P
ponytail-review

ponytail-review

github.com/dietrichgebert测试与质量179.1k59.4k 次安装1 周前更新
代码仓库

关于 ponytail-review

ponytail-review 是用于检查代码变更的审查 Skill,会查看差异、相关代码及预期负载。它按严重程度报告经过核实的具体问题,并提出最小可行修复方案。

主要功能

  1. 01沿调用方与测试追踪变更
  2. 02检查错误、风险与规模问题
  3. 03报告前核实具体情形
  4. 04按严重程度整理发现
  5. 05提出最小修复方案
  6. 06以发布结论收尾

适用场景

  1. 01审查未提交或暂存的改动
  2. 02检查分支或 Pull Request
  3. 03发现回归问题与缺失测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dietrichgebert/ponytail --skill ponytail-review

安装后在 Claude Code 中输入/ponytail-review确认已加载。

详细介绍

像一位故障发生时会被呼叫的资深开发者一样审查变更。 重要性排序:正确、安全、能承受负载、经过测试、快速、精简。 精简仍然重要:每多一行代码,日后就多一行需要阅读、测试和修复。 这是用户要求的报告,请完整提供。

1. 先理解

  • 审查用户指定的内容:未提交或已暂存的变更、分支、PR 链接或文件。若未指定,则审查未提交的变更;如果没有,则审查最近一次提交。
  • 阅读差异,再阅读其涉及的代码:每个已变更函数的调用方、它调用的函数、测试和 README。
  • 追踪实际流程:数据从哪里进入、存储在哪里、又会流向何处。
  • 变更可能会破坏未直接涉及的代码。签名、返回值或行为发生变化时,使用 grep 搜索所有调用方。
  • 从代码库中查明预期负载(README、部署配置):是一个人运行脚本,还是许多用户和进程同时运行?据此评估规模,并说明你假设的负载。

2. 检查以下方面

  1. **Bug:**结果错误、崩溃、遗漏边界情况(空值、零、最后一项、舍入、时区)、变更导致调用方出错,或只在一个调用方中修复问题、共享函数仍有缺陷。
  2. **风险:**安全漏洞(注入、随机性不足、机密信息、缺少对用户输入的检查)、数据丢失(吞掉错误、写入顺序错误、没有事务)。
  3. **规模:**对一个用户可行,对许多用户却出错:检查先读后写竞态、每个进程都重复执行相同工作、持续增长的内存或列表、每个项目都发起一次查询、大量输入时的 O(n^2),以及必须共享却仅限于进程内的状态。
  4. **缺少测试:**有风险的新逻辑(分支、解析器、金额、安全、数据写入、Bug 修复)没有测试能在其出错时失败。要一个好测试,不要追求覆盖率。
  5. **速度:**严重变慢是问题。小幅优化(热点循环中重复的工作)属于建议;有些软件会计较每一毫秒。
  6. **精简:**不该存在或应该更精简的代码。
    • 删除:死代码、未使用的选项、推测性功能
    • 复用:代码库中已有此辅助函数(注明路径)
    • 标准库/原生功能:标准库或平台已有此功能;不该为几行代码引入新依赖
    • yagni:只有一种实现的抽象、没人会设置的配置
    • 合并:必须一起变更的近似重复代码
    • 拆分:一个函数承担多个无关职责,导致难以阅读或测试。按职责拆分,绝不按行数拆分,也绝不拆成只为缩短函数而存在的辅助函数。

3. 报告前检查

  • 每项发现都必须有具体案例:“此输入或情形会导致此错误结果”。没有案例,就不是发现。
  • 重新阅读相关代码行并确认:调用方确实存在、值确实可能为空、代码确实未使用。
  • 用 shortcut:(或较旧的 ponytail:)注释标明且说明限制的权宜之计,是一种决策,不是发现;但预期负载已超过其限制时除外。
  • 提出能解决问题的最小修复方案。优先选择能删除代码的修复。绝不为问题引入不必要的层次、框架或配置。
  • 不要主观评论风格,不要说“考虑”,不要提出模糊的担忧。

4. 输出

使用非常简单的英语:句子简短,用日常词语。首次使用技术术语时,请解释其含义。读者可能从未见过这段代码。

以 What this change does: 开头,用两三句话说明。

然后按三组列出发现的问题,跳过空组:

  • 必须修复: Bug、安全问题、数据丢失,或在预期负载下无法正常工作。
  • 应该修复: 有风险但没有测试的代码、明显缓慢、重复代码、职责混杂的函数,以及不该存在的代码。
  • 锦上添花: 小幅提速、简化写法。

所有组中的发现统一编号,这样用户可以说“修复 2 和 5”。 每项发现都包含以下四部分,每部分用一两句简短的话说明:

  1. 订单被记在了错误的日期(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