Cursorを使ったコードレビュー:実践ガイド
コードレビューはソフトウェア開発で最もレバレッジの効く活動の一つだが、時間もかかる。CursorのAI機能は、レビューをより速く、より抜け目なく行うのに役立つ。このガイドでは、個別のPRからチーム全体のプロセスに至るまで、Cursorをレビューワークフローで使う実践的なテクニックを解説する。
なぜCursorをコードレビューに使うのか
従来のコードレビューには、diffを読み、ロジックを確認し、スタイルを検証し、実行を頭の中でシミュレートする作業が含まれる。Cursorは以下の方法でこれを補強する:
- 馴染みのないコードを平易な言葉で説明する
- 潜在的なバグやエッジケースを特定する
- 既存のパターンとの一貫性をチェックする
- 自分では考えつかない改善案を提案する
Cursorのコードレビュー機能は、人間の判断の代わりになるものではない。レビューをより徹底的で効率的にするツールだ。AIの提案を実行に移す前に必ず検証すること。
コードレビューの準備
レビューを始める前に、Cursorを最適な状態に設定しよう。
1. 対象ブランチを開く
レビューしたいブランチをチェックアウトする:
git fetch origin
git checkout feature-branch-name
Cursorは、レビュー対象の変更を含むコードベース全体をインデックスできるときに最も効果を発揮する。
2. まずdiffを確認する
AIを使う前に、自分でdiffをスキャンして範囲を理解する:
git diff main...feature-branch-name
これによりコンテキストが得られ、Cursorでより良い質問ができるようになる。
3. コードベースをインデックスする
Cursorが最新の変更をインデックスしていることを確認する:
- コマンドパレットを開く(
Ctrl/Cmd + Shift + P) - Cursor: Reindex Codebaseを検索する
- インデックスの完了を待つ
PRが大きい場合は、チャンクに分けてレビューすることを検討しよう。Cursorのコンテキストウィンドウは大きいが無限ではない。一度に2〜3ファイルに焦点を当てる方が、diff全体をチャットに投げ込むよりも良い結果が得られる。
Cursor ChatでPRをレビューする
チャットパネルはコードレビューの主要ツールだ。以下は実証済みのテクニックだ。
高レベルの概要を尋ねる
まず広く、意図を理解するところから始める:
@file.ts このPRは何を変更し、なぜ変更するのか?
またはブランチ全体について:
このブランチのmainからの変更を要約して。この変更はどんな問題を解決するの?
これにより、詳細に入る前に作者の意図を理解できる。
特定の関数やクラスをレビューする
コードを選択して、的を絞った質問をする:
この関数をレビューして:
1. 潜在的なヌルポインタ例外
2. オフバイワンエラー
3. 欠けているエラーハンドリング
4. パフォーマンス問題
プロンプトは具体的にしよう。"このコードをレビューして"は曖昧すぎる。"この関数の競合状態をチェックして"はCursorに明確な方向性を与え、より有用な出力を生む。
セキュリティ問題をチェックする
この認証ハンドラーのセキュリティ問題をレビューして:
- SQLインジェクションの脆弱性
- 不適切な入力検証
- ハードコードされたシークレット
- 安全でない依存関係
Cursorは一般的なセキュリティパターンをフラグできるが、すべてを捉えるわけではない。出力はファーストパスとして扱い、最終的なセキュリティ監査ではないことを念頭に置こう。
ビジネスロジックを検証する
この実装は@spec.mdの要件と一致 しているか?
チェックして:
- 欠けているエッジケース
- 誤った計算
- 欠けている検証
Cursorでバグを見つける
Cursorは、手動レビューで見落としやすいバグを見つけるのに長けている。
チェックすべき一般的なバグパターン
Cursorに特定のカテゴリのバグを探させよう:
| バグカテゴリ | 使うプロンプト |
|---|---|
| ヌル/undefined処理 | "変数がnullまたはundefinedになりうる箇所を見つけて" |
| Async/await問題 | "欠けているawait、未処理のpromise rejection、競合状態をチェックして" |
| リソースリーク | "潜在的なメモリリーク、閉じられていないファイルハンドル、欠けているクリーンアップを見 つけて" |
| 型の不一致 | "TypeScriptが見落としうる型の不整合をチェックして" |
| ロジックエラー | "この関数の条件ロジックを検証して。すべてのケースが処理されているか?" |
例:データ処理関数のレビュー
// レビュー対象のコード
function processUserData(users: User[]) {
const results = [];
for (let i = 0; i <= users.length; i++) {
const user = users[i];
if (user.isActive) {
results.push({
name: user.name.toUpperCase(),
email: user.email
});
}
}
return results;
}
Cursorへのプロンプト:
この関数のバグをレビューして:
Cursorがフラグを立てる可能性があるもの:
- オフバイワンエラー:
i <= users.lengthはi < users.lengthのはず - 潜在的なヌル参照:
nameがnullの場合、user.name.toUpperCase()が失敗する resultsの型欠落:const results: ProcessedUser[] = []のはず
Cursorは明らかなバグを確実に捉えるが、深いドメイン知識を必要とする微妙な問題は見落とす可能性がある。AIレビューと並行して、テストスイートを実行し、自分自身の分析も必ず行うこと。
スタイルの一貫性チェック
コードベース全体で一貫したスタイルを維持するのは面倒だが重要だ。Cursorが助けになる。
既存のパターンと照合する
この新しいコンポーネントは@ExistingComponent.tsxと同じパターンに従っているか?
チェックして:
- 命名規則
- エラーハンドリングのアプローチ
- 状態管理パターン
- Propタイピングスタイル
プロジェクト規約を適用する
プロジェクトにスタイルガイドや.cursorrulesファイルがある場合は、それを参照する:
@.cursorrulesに照らしてこのコードをレビューして。違反があればフラグを立てて。
フォーマットとLint
Cursorはフォーマット修正を提案できるが、この点では自動化ツールの方が信頼できる:
# まずリンターを実行する
npm run lint
npm run format:check
Cursorは意味的なスタイル問題(アーキテクチャ、パターン)に、リンターは構文的なスタイル問題(スペース、引用符、セミコロン)に使おう。
的を絞った質問をする
レビューの質は、質問の質に依存する。以下は効果的なパターンだ。
"何がうまくいかないか"パターン
このコードが本番で失敗しうる方法を3つ挙げて。
これにより、Cursorはエッジケースや障害モードについて考えることを強いられる。
"新人に説明する"パターン
このアルゴリズムを、チームに入ったばかりのジュニア開発者に説明するように解説して。
Cursorの説明が混乱しているなら、コードはより良いコメントやリファクタリングを必要としている可能性がある。
"アプローチを比較する"パターン
作者はforループでこれを実装した。ここでmap/filterアプローチの方が良いか?なぜか、あるいはなぜ違うのか?
これにより、選択されたアプローチが最適かどうかを評価できる。
"欠けているテスト"パターン
この関数に欠けているテストケースは何か?
Cursorは、作者がカバーしなかったエッジケースを提案することが多い。