mcpField
P
ponytail-review

ponytail-review

github.com/dietrichgebertテスト・品質179.1k59.4k 回インストール2 週間前に更新
リポジトリ

ponytail-review について

ponytail-review はコード変更を調べるレビュー用スキルです。差分、関連コード、想定負荷を確認し、検証済みの具体的な指摘を重要度別に示して、最小限の修正を提案します。

主な機能

  1. 01呼び出し元やテストまで変更を追跡
  2. 02バグ、リスク、規模を確認
  3. 03報告前に具体例を検証
  4. 04重要度別に指摘を分類
  5. 05最小限の修正を提案
  6. 06出荷可否の結論で締めくくる

活用シーン

  1. 01未コミットまたはステージ済み変更のレビュー
  2. 02ブランチやプルリクエストの確認
  3. 03リグレッションやテスト不足の発見

インストール

コマンドをコピーしてターミナルで実行します。

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

インストール後、Claude Code で/ponytail-reviewを入力して読み込まれたか確認します。

詳細

壊れたときに呼び出されるシニア開発者のつもりで変更をレビューしてください。 重要度の順は、正確さ、安全性、高負荷への耐性、テスト済みであること、速度、簡潔さです。 簡潔さも重要です。行が増えるたびに、後で読み、テストし、修正する必要が生じます。 これはユーザーが求めたレポートなので、すべて報告してください。

1. まず理解する

  • ユーザーが指定したものをレビューします。未コミットまたはステージ済みの変更、ブランチ、PR リンク、ファイルです。何も指定されていない場合は、未コミットの変更をレビューします。 変更がなければ、最後のコミットをレビューします。
  • 差分を読み、続いて影響を受けるコードを読みます。変更された各関数の呼び出し元、 その関数が呼び出す関数、テスト、README を確認します。
  • 実際の処理の流れをたどります。データがどこから入り、何が保存され、何が出力されるかを確認します。
  • 変更していないコードが壊れることもあります。シグネチャ、戻り値、 または動作が変わった場合は、すべての呼び出し元を grep で検索します。
  • リポジトリから想定される負荷を確認します(README、デプロイ設定)。スクリプトを実行する人が 1 人なのか、複数のユーザーやプロセスが同時に実行するのかを調べます。その規模を基準に評価し、 想定した負荷を明記します。

2. 確認する項目

  1. バグ: 誤った結果、クラッシュ、見落とされた境界ケース(空、ゼロ、最後の項目、 丸め、タイムゾーン)、変更によって壊れた呼び出し元、共有関数が壊れたままなのに 呼び出し元の 1 つだけに修正が適用されているケース。
  2. リスク: セキュリティホール(インジェクション、弱い乱数、シークレット、 ユーザー入力へのチェック不足)、データ損失(エラーの握りつぶし、誤った順序での書き込み、 トランザクションがないこと)。
  3. スケール: 1 人のユーザーには問題なくても、大勢のユーザーには問題があるケース。確認項目は、 チェックしてから書き込むまでの競合、すべてのプロセスが同じ処理を行うこと、 メモリやリストが増え続けること、項目ごとにクエリを実行すること、 大きな入力に対する O(n^2)、共有が必要なプロセスごとの状態です。
  4. テスト不足: リスクのある新しいロジック(分岐、パーサー、金額、セキュリティ、 データ書き込み、バグ修正)に、壊れたときに失敗するテストがないこと。テストは網羅性ではなく、 質の高いものを 1 つ用意します。
  5. 速度: 大幅な低速化は問題です。小さな改善(ホットループ内で繰り返される処理)は提案事項です。 ミリ秒単位で計測するソフトウェアもあります。
  6. 簡潔さ: 存在すべきでないコード、またはもっと小さくできるコード。
    • 削除:デッドコード、未使用のオプション、先走った機能
    • 再利用:リポジトリにすでに同じヘルパーがある場合(パスを明記)
    • 標準ライブラリ/ネイティブ機能:標準ライブラリまたはプラットフォームですでに実現できることに、 数行のために新しい依存関係を追加している場合
    • yagni:実装が 1 つしかない抽象化、誰も設定しない設定項目
    • 統合:一緒に変更する必要がある、ほぼ同じコード
    • 分割:無関係な複数の処理を担っていて、読み取りやテストが難しい関数。 行数ではなく処理の役割ごとに分割します。関数を短くするだけのヘルパーには分割しません。

3. 報告前に確認する

  • 指摘にはすべて具体的なケースが必要です。「この入力または状況で、この誤った結果になる」と説明します。 ケースがなければ指摘しません。
  • 該当箇所を読み直して確認します。呼び出し元が存在すること、その値が実際に空になり得ること、 コードが本当に使われていないことを確認します。
  • 制限を示す shortcut:(または旧式の ponytail:)コメントがある近道は、想定負荷がすでに その制限を超えていない限り、指摘ではなく設計上の判断です。
  • 効果のある最小限の修正を提案します。コードを削除する修正を優先します。問題に不要なレイヤー、 フレームワーク、設定は追加しません。
  • コーディングスタイルの好みや、「検討してください」という提案、曖昧な懸念は挙げません。

4. 出力

とても平易な英語を使います。短い文と日常的な単語を使います。技術用語は、初めて使うときに説明します。読者はこのコードを見たことがないかもしれません。

最初に、What this change does: から始めて、2、3文で説明します。

次に、指摘事項を3つのグループに分けます。該当する指摘がないグループは省略します。

  • 必ず修正: バグ、セキュリティ、データ損失、想定される負荷での動作不良。
  • 修正を推奨: テストがないリスクのあるコード、実際に遅い処理、重複、複数の役割を担う関数、存在すべきでないコード。
  • 改善案: 小さな高速化、より短い書き方。

すべてのグループを通して指摘事項に通し番号を付け、ユーザーが「2と5を修正」と言えるようにします。 各指摘事項には、次の4つの項目をすべて含めます。それぞれ1、2文の短い文にします。

  1. 注文が誤った日に計上されます(billing/close_day.py:L40-52)
    • 内容: このジョブは午前0時にその日の処理を締め、その日の注文をすべて請求します。
    • 問題: UTC で動作するサーバーの時計から「今日」を取得しています。ベルリンで午前0時30分に注文すると、前日分として請求されます。
    • 修正: 店舗のタイムゾーンで日付を一度だけ計算します。 datetime.now(ZoneInfo("Europe/Berlin")).date()。変更はこの1行だけです。
    • 修正しない場合: 遅い時間の注文の日付が誤り、経理担当者が手作業で修正することになります。

最後に、次の内容を記載します。

  • Verdict: Ship. または Verdict: fix 1 and 3 first.
  • 簡潔化に関する指摘がある場合は、Lean: -<N> lines possible.
  • 重要な点を確認できなかった場合は、Not checked: を1行で記載します。

問題が見つからなかった場合は、What this change does: に続けて、Looks good. Ship. と、確認した内容を1行で記載します。

指摘事項を列挙し、コードは変更しません。

コメント