Communityライティング&編集github.com

Invertebrate — Greptileスタイルのコードレビュー

Invertebrateは、PR、ブランチ、またはワーキングツリーの差分に対して、Greptileスタイルのコードレビューを提供します。変更されたシンボルすべてをコードベース全体(呼び出し元、呼び出し先、実装側)でトレースし、ファイルをまたがるバグを検出。平易な言葉でのサマリー、0-5の信頼度スコア、発見テーブル、適切なmermaid図、インラインコメント(重要度P0/P1/P2、ロジック/構文/スタイル種別、修正案の差分)を出力します。

Invertebrate — Greptileスタイルのコードレビュー とは?

Invertebrateは、Greptileスタイルの高度なコードレビュー機能を提供するAIエージェントスキルです。このスキルは、プルリクエスト(PR)、ブランチ、またはワーキングツリーの差分を分析し、単なるリンターでは見逃されるような、コードベース全体にわたるコンテキスト依存のバグを発見します。例えば、リネームによって複数の呼び出し元が壊れるケース、新しいエンドポイントに必要な認証デコレータが欠落しているケース、一見最適化に見えて呼び出し元の処理を無効化するケースなどを検出できます。レビューは、変更された各シンボル(関数、メソッド、クラス、型、エクスポートされた定数、ルート、DBカラム、設定キー、環境変数など)の呼び出し元、呼び出し先、および類似実装をリポジトリ全体から検索し、データフローを追跡することで実現されます。発見された問題は、重要度P0(修正必須)・P1(修正推奨)・P2(検討)の3段階、タイプはロジック(バグ)・構文(コンパイルエラー)・スタイル(品質)で分類され、設定ファイル(.invertebrate/ または .greptile/)に基づきフィルタリングされます。また、レビュー結果には0-5の信頼度スコアと適切なmermaid図(シーケンス図、ER図、クラス図、フローチャート)が含まれ、各発見には実際のコードに適用可能な最小限の修正案がdiff形式で提示されます。このスキルは、Claude CodeやCursorなどのAIエージェントプラットフォームで利用でき、GitHubとの連携機能も備えています。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/sedricedwards/invertebrate/tree/HEAD/skills/invertebrate

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Invertebrate — Greptileスタイルのレビュー

Greptileがリンターよりも優れている点はコンテキストです。リポジトリ全体のグラフに対して差分をレビューするため、リネームによって3つの呼び出し元が壊れている、新しいエンドポイントにすべての類似エンドポイントが持つ認証デコレータが欠けている、「最適化」によって呼び出し元が無効化される、といった問題をキャッチします。それを再現してください。差分だけを読むレビューはこのスキルではありません。

2つ目の優位点はシグナルです。すべてのコメントは具体的で検証可能なバグとその修正案であり、スタイルに関するエッセイではありません。チームは「狼が来た」と叫ぶレビュワーを無効にします。疑わしい場合は、コメントしないでください。

1. ターゲットの解決

ユーザーが指定したもの差分のソース
PR番号/URLgh pr view <n> --json title,body,baseRefName,headRefName,files + gh pr diff <n>
ブランチgit diff <base>...HEAD (三点ドット = マージベースからの差分;base = main/master/develop、存在する方)
なしgit diff HEAD (ステージ済み+未ステージ);空の場合は、現在のブランチとそのベースとの差分
.diff/.patchファイルそのファイル;ワーキングツリーは変更後のリポジトリ

利用可能な場合はPRのタイトル/説明を読んでください(ghから、またはユーザーが指定した説明ファイル)。「セキュリティPRが修正なしで出荷される」は実際のGreptileのキャッチです。説明が主張する各主張(「Xを修正」「Yの検証を追加」)をリストアップし、差分が実際にそれを実現しているか確認してください。主張された修正が差分にない場合、それが修正すると主張するバグの重大度で発見として報告します。

クリーンなPRは有効な結果です。検証で発見事項がない場合は、そう述べ、スコアを4-5/5にし、停止してください。徹底的に見せようとして問題をでっち上げることは、レビュワーがミュートされる最も早い方法です。

2. レビュー設定の読み込み

設定フォルダは.invertebrate/です。すでにGreptileを使用しているチームとの互換性のため、.greptile/は同一の形式を使用し、.invertebrate/が存在しない場所で読み込まれます。ディレクトリごとに解決:各ディレクトリで、存在すれば.invertebrate/、そうでなければ.greptile/ — 1つのディレクトリから両方を決して使用しないでください。リポジトリルートおよび変更されたファイルを含むすべてのディレクトリをチェックします(モノレポ:スカラー設定には最も近いものが優先され、リスト/指示は親から蓄積されます)。また、同じフィールドを持つレガシールートgreptile.jsonも受け入れます。これらのフォルダを作成または変更しないでください — これらは読み取り専用の入力です。

  • config.json:
    • strictness 1|2|3(デフォルト2) — §5のフィルタリングを参照
    • commentTypes(デフォルト ["logic","syntax","style"]) — リストにないタイプの発見をドロップ
    • ignorePatterns(gitignore構文、改行区切り) — 一致するファイルをスキップ
    • instructions — 自由形式のレビュアーガイダンス、これに従う
    • rules[] — {id, rule, scope[glob], severity: low|medium|high, enabled};scopeが一致する場合のみ適用;disabledRulesは継承されたIDを削除
  • rules.md — そのディレクトリツリー用のプレーンマークダウンのルール
  • files.json — {files:[{path, description, scope}]}:scopeが一致した場合(またはスコープがない場合は常に)これらのファイルをコンテキストとして読み込む

どちらのフォルダもどこにもない?代わりにCLAUDE.md / AGENTS.md / CONTRIBUTING.mdのコーディング標準をルールとして使用します。レポートにどの設定が適用されたかを記載します。

ルール違反は、そのルールを引用する発見になります(Rule: <id または最初の単語>)。ルールの重大度マッピング:high→P1、medium→P2、low→P2。

3. コンテキストグラフの構築(重要な部分)

変更されたハンクごとに、それが定義、削除、リネーム、またはシグネチャ/セマンティクスを変更するシンボル(関数、メソッド、クラス、型、エクスポートされた定数、ルート、DBカラム、設定キー、環境変数、イベント名)を特定します。

そのようなシンボルごとに、変更されたファイルだけでなくリポジトリ全体を検索します:

  • 呼び出し元/参照 — 古い名前と新しい名前をGrep検索。削除/リネームされたシンボルに生き残った参照がある場合、それは確実なバグです。
  • 類似実装 — 同じ種類のことを行うコード(ルーター内の他のエンドポイント、同じインターフェースの他のハンドラ、他のマイグレーション)。すべての類似実装が従うパターン(認証デコレータ、監査ログ、バリデーション、トランザクション、ロック、await)を新しいコードがスキップする場合、それはGreptileのトップキャッチです。
  • 呼び出し先 — 新しいコードが呼び出すもので、その契約が重要なものの実装を読みます(スローするか?nullを返すか?すでにロックしているか?非同期か?)。
  • データフロー — 入力の由来(ユーザー制御?URLパラメータ?)と、その行き先(SQL/HogQL、シェル、ファイルシステムパス、動的コード実行、HTML)。

短いリストを保持:シンボル → それに依存するファイル → 変更がそれらに与える影響。発見事項の作成に使用します。レポートにダンプしないでください。

4. ハンティング

コンテキストグラフを手に、差分をウォークします。Greptileが実際に報告するカテゴリと実際の例:

  • ロジック — ループが早期終了し部分的な状態を残す;フラグ/条件が反転;エイリアス化された値がチェックをすり抜ける;警告がユーザーに届かない。
  • リファクタリング — リネームで呼び出し元が未定義になる;移動されたコードが副作用を失う。
  • セキュリティ — 新しいエンドポイントに認証/認可がない;ユーザー入力からクエリ/シェル/パスへのインジェクション;サンドボックス/スコープエスケープ(シンボリックリンク、マウント、~、変数展開);null/欠落フィールドがガードをバイパス。
  • バリデーション — 空/不正な入力を有効として受け入れる;有効な入力を拒否;アンカーなしの正規表現。
  • ランタイム/構文 — 未定義メソッドへの呼び出し;awaitの欠落;間違った引数数;型の不一致;コンパイルできないコード。
  • エラーハンドリング — 例外の飲み込み;生のトレースバック/秘密がクライアントに漏洩;エラーパスで間違った/未定義のハンドルでリソースがクローズされる。
  • 並行性 — チェック・アンド・アクト、リード・モディファイ・ライトの競合;タスク/スレッド間の共有可変状態;起動順序によりイベントがドロップされる。
  • データ損失/整合性 — 非アトミック書き込み;リプレイ時の二重適用;静かな切り詰め;削除されたデータが再出現。
  • パフォーマンス — N+1クエリ、ホットパス上のO(n²)、無言のノーオペレーションである「最適化」。
  • アライメント/リーク — 機密情報や秘密が状態/デバッグエンドポイントやログを通じて露出。

保持する前にすべての候補を検証してください。 正確な行、それをトリガーする具体的な入力/状態、そして間違った結果を示せなければなりません。失敗を構築できない場合は、ドロップしてください。周囲のコードを読み直してください — もっともらしいバグの半分は3行後で処理されています。

5. 分類とフィルタリング

各発見には以下が付与されます:

  • 重要度 — P0 マージ前に修正必須(セキュリティホール、データ損失、一般的なパスでのクラッシュ、ビルド破壊)。P1 修正すべき(間違った動作、壊れたエッジケース、高重要度のルール違反)。P2 検討(メンテナンス性、マイナーパフォーマンス、低重要度のルール)。
  • タイプ — logic(バグ、動作、エッジケース)、syntax(コンパイル/実行不可、言語の誤用)、style(品質、命名、慣行)。

strictnessでフィルタリング:

  • 1 — P0、P1、P2を保持。
  • 2(デフォルト) — P0、P1を保持;P2は明示的な設定ルールに違反する場合のみ保持。
  • 3 — P0を保持、さらに以下のP1を保持:セキュリティ、ユーザー入力から到達可能なクラッシュ/500エラー、高重要度の設定ルール違反。Strictness 3は「誰かにページを送るか、チームが明示的に求めたもののみ」を意味し、リモートでトリガー可能なクラッシュは該当します。

その後、commentTypesにないタイプをドロップします。フォーマッターが修正する純粋な書式は、決して報告しないでください。

6. 信頼度スコア(0-5)

スコア意味
5/5プロダクション準備完了 — マージ可能
4/5軽微な仕上げ — 小さな修正後にマージ(P2のみ)
3/5実装上の問題 — まずフィードバックに対処(P1がある)
2/5重大なバグ — 再作業が必要(複数のP1、または修正が簡単なP0が1つ)
0-1/5クリティカルな問題 — 再考が必要(P0のセキュリティ/データ損失、または設計が間違っている)

スコアは文脈に依存します:ペイメント/認証/マイグレーションの同じバグは、内部スクリプトのものより低いスコアになります。1文の正当性を示してください。

7. 図

変更内容に基づいて選択;些細な差分(ドキュメント、設定のバンプ、~20行未満のローカルロジック)はスキップ:

  • sequenceDiagram — マルチコンポーネントのインタラクション、API/リクエストフロー、非同期/並行処理の順序(競合があれば表示)
  • erDiagram — スキーマ/データモデルの変更
  • classDiagram — クラス/インターフェース階層の変更
  • flowchart — 制御フロー/ビジネスロジックの変更

システム全体ではなく、変更を図にしてください。約15ノード以内に抑えてください。バグのあるステップをNote/ラベルでマークしてください。

8. 出力

以下の構造を正確に使用してください(セクションは記載されている場合のみ省略可能):

## Invertebrate Review — <PRタイトルまたはブランチ>

### Summary
<2-4文、平易な言葉:変更の内容、誰に/何に影響するか、理由。その後、1文で主なリスク。>

### Confidence Score: N/5
<1文で理由>

### Findings
| # | Sev | Type | Location | Issue |
|---|---|---|---|---|
| 1 | P0 | logic | `path/file.ts:42` | <短いタイトル> |
(ない場合:「問題は見つかりませんでした。」)

### Diagram
```mermaid
...
```
(些細な変更ではセクションを省略)

### Inline Comments

#### 1. [P0 · logic] <短いタイトル>
`path/file.ts:42`

<何が問題か、具体的な失敗シナリオ、そしてファイルをまたがる場合、どの他のファイルが壊れるのか、その理由。2-5文。>

```diff
- 古い行
+ 修正された行
```

#### 2. ...

---
<sub>レビューしたファイル数 <N> · 設定: <.invertebrate または .greptile パス | CLAUDE.md | デフォルト> · strictness <n> · <コミットSHA(既知の場合)></sub>

修正案の差分は、実際のコードに適用可能で、最小限かつ現実的でなければなりません。修正が複数ファイルにまたがる場合は、各ファイルのハンクをパスをヘッダー行として表示します。安全な 1 ハンクの修正が存在しない場合は、でっち上げる代わりに説明してください。

レポートの後、「fix all、fix P0、またはfix #2と言えば適用します。」と提案してください。プロンプトなしで修正を適用しないでください。

9. GitHubへの投稿(明示的に要求された場合のみ:--post、「投稿して」、「PRにコメントして」)

投稿は外部向けです — そのPRに対する明示的な要求があった場合のみ行ってください。

  1. owner/repo(gh repo view --json nameWithOwner -q .nameWithOwner)とhead sha(gh pr view <n> --json headRefOid -q .headRefOid)を取得します。
  2. インラインコメントは、PRの差分に存在する行(RIGHT側、新しい行番号)のみを対象にできます。差分の外にある行の発見は、サマリー本文にのみ含めます。
  3. レビューJSONを一時ファイルに書き込み、1回の呼び出しで投稿します:
{
  "commit_id": "<head sha>",
  "event": "COMMENT",
  "body": "<§8のインラインコメントセクションを除いた完全なマークダウンレポート>",
  "comments": [
    {"path": "src/file.ts", "line": 42, "side": "RIGHT",
     "body": "**P0 · logic** — <タイトル>\n\n<説明>\n\n```suggestion\n<行42の正確な置き換え>\n```"}
  ]
}
gh api repos/<owner>/<repo>/pulls/<n>/reviews --method POST --input review.json

置き換えがコメントされた行(複数行の場合はstart_line + lineを使用)を正確にカバーする場合のみ、GitHubの```suggestionブロックを使用してください。それ以外の場合は```diffブロックを使用してください。ユーザーが要求しない限り、REQUEST_CHANGES/APPROVEを使用しないでください。レスポンスからレビューURLを報告してください。

関連スキル