Cursor でコードレビューする方法

話題の AI コーディングツール「Cursor」を使って、コードレビューのプロセスを効率化できるか試してみました。
本記事では、実際の使い方や使用感を簡単に紹介します。

## ルールを書く

`Cursor Setting > Rules >  Project Rules` からファイルを追加し、コードレビュー用のルールを記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/9b8d22f4-ad2f-4956-ac55-cd3647d956fa.png)

今回記載したルールは、Cursorに以下のようにプロンプトを投げて生成してもらいました。

```
XXX 配下でコードレビュー用の Cursor rules を作りたい。
```

### 作成物

```md
# AI Chat App コードレビューガイドライン

## アーキテクチャとディレクトリ構造
- `src/` - アプリケーションのコアロジック
- `components/` - 再利用可能なVueコンポーネント
- `pages/` - ルーティング用のページコンポーネント
- `server/` - バックエンドAPIエンドポイント
- `plugins/` - Nuxt.jsプラグイン
- `constants/` - 定数定義
- `public/` - 静的アセット

## コーディング規約
1. コンポーネント命名規則
   - PascalCaseを使用（例：`ChatMessage.vue`）
   - コンポーネントファイルは単数形
   - ディレクトリは複数形

2. TypeScript
   - 型定義を必ず行う
   - `any`型の使用は避ける
   - インターフェースは`I`プレフィックスを使用（例：`IChatMessage`）
   - `console.log`を入れないこと

3. Vue.js
   - Composition APIを使用
   - コンポーネントは単一責任の原則に従う
   - Propsは型定義を必須とする

4. スタイリング
   - Tailwind CSSのユーティリティクラスを優先
   - カスタムCSSは`<style scoped>`を使用
   - グローバルスタイルは`assets/`に配置

## セキュリティ
- 環境変数は`.env`で管理
- APIキーはサーバーサイドでのみ使用
- ユーザー入力は必ずバリデーション

## パフォーマンス
- 画像は最適化して使用
- コンポーネントは必要に応じて遅延ロード
- バンドルサイズの最適化

## テスト
- ユニットテストは`__tests__`ディレクトリに配置
- コンポーネントテストは`__tests__/components`に配置
- E2Eテストは`__tests__/e2e`に配置

## ドキュメント
- 複雑なロジックにはコメントを追加
- READMEは最新の状態に保つ
- APIエンドポイントはOpenAPI/Swaggerで文書化

## レビューチェックリスト
- [ ] コードはコーディング規約に準拠しているか
- [ ] 型定義は適切か
- [ ] エラーハンドリングは適切か
- [ ] パフォーマンスへの影響は考慮されているか
- [ ] セキュリティリスクはないか
- [ ] テストは適切に書かれているか
- [ ] ドキュメントは更新されているか
```

本来であれば、ここで自分のプロジェクトに合わせて手直しをすると思いますが、今回は割愛します。

## コードレビューをする。

@ を押して Git から `@PR (Diff with Main Branch)` を選択すると、PR の diff を Cursor でレビューできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/d1bfcc0f-3c37-485a-b6c5-c02cf3782b7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/7ee74296-e070-4e60-be34-fac469842942.png)


さらに、先ほど作ったコードレビュー用のルールである `.mdc` ファイルを追加しておくと、ルールに沿ったレビューが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/d918ca80-c17c-45ee-b47b-0e41f63de71f.png)


上記のように記載し、実行してみるとこのようなレビューが返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/135185c6-440c-4c9f-9d81-78fee7780c48.png)

Apply をすることでコード修正も同時に可能です。

<details><summary>全量</summary>


PRのコードレビューを行います。主な変更点はVuetifyの導入とUIの改善に関するものですね。

### 主な変更点の分析

1. **Vuetifyの導入**
- ✅ 適切なバージョン（3.8.0）が選択されています
- ✅ 必要な依存関係（@mdi/font, sass）が追加されています
- ✅ プラグインの設定が適切に行われています

2. **UIコンポーネントの改善**
- ✅ Vuetifyのコンポーネントを使用して、より洗練されたUIに
- ✅ レスポンシブデザインの実装
- ✅ アクセシビリティの向上（ラベル、バリアントの適切な使用）

3. **スタイリング**
- ✅ スコープ付きCSSの使用
- ✅ Vuetifyのテーマ設定の実装
- ✅ カラーパレットの定義

### 改善提案

1. **パフォーマンス最適化**
```typescript
// vite.config.tsに以下を追加することを推奨
export default defineConfig({
  // ... 既存の設定
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          'vuetify': ['vuetify']
        }
      }
    }
  }
});
```

2. **エラーハンドリング**
```vue
// ChatInterface.vueにエラー状態の表示を追加
<v-alert
  v-if="error"
  type="error"
  class="mb-4"
>
  {{ error }}
</v-alert>
```

3. **アクセシビリティのさらなる改善**
```vue
// キーボードナビゲーションのサポート
<v-textarea
  @keydown.enter.prevent="sendMessage"
  @keydown.ctrl.enter="newLine"
  // ... 既存のprops
></v-textarea>
```

### セキュリティチェック

- ✅ 環境変数の適切な管理
- ✅ ユーザー入力のバリデーション
- ✅ XSS対策（Vueのテンプレート構文による自動エスケープ）

### テスト推奨事項

1. コンポーネントテストの追加
```typescript
// __tests__/components/ChatInterface.spec.ts
describe('ChatInterface', () => {
  test('メッセージ送信機能', () => {
    // テストコード
  });
});
```

2. E2Eテストの追加
```typescript
// __tests__/e2e/chat.spec.ts
describe('チャット機能', () => {
  test('メッセージの送受信', () => {
    // テストコード
  });
});
```

### 総評

このPRは全体的に良く実装されており、以下の点が特に評価できます：

1. モダンなUIフレームワークの適切な導入
2. コードの可読性と保守性の向上
3. アクセシビリティへの配慮
4. パフォーマンスへの考慮

推奨される改善点を実装することで、さらに品質の高いコードになると考えられます。

レビューチェックリストの結果：
- [x] コードはコーディング規約に準拠
- [x] 型定義は適切
- [x] エラーハンドリングは基本的に実装済み
- [x] パフォーマンスへの影響は考慮されている
- [x] セキュリティリスクは最小限
- [ ] テストの追加が必要
- [x] ドキュメントは更新されている


</details>

今回のPRにはテストが含まれていなかったため、このチェックリスト結果も納得感があります。

## 実験

さて、ちょっと試しにコードを修正してみましょう。
`console.log` を追加し、`any` 型を無理やり入れてみました。

すると…


<details><summary>詳細</summary>
コードレビューを行います。主な変更点を分析し、コーディング規約に基づいて評価していきます。

### 主な変更点の概要
1. Vuetifyの導入とUIコンポーネントの実装
2. スタイリングの改善
3. プロジェクト設定の更新

### 詳細なレビュー

#### 1. アーキテクチャとディレクトリ構造
✅ コーディング規約に準拠しています：
- `plugins/`ディレクトリにVuetifyの設定を適切に配置
- コンポーネントは`components/`ディレクトリに配置
- スタイルは`src/styles/`に配置

#### 2. TypeScript
⚠️ 改善が必要な点：
- `server/api/chat.post.ts`で`any`型の使用が見られます：
```typescript
const body: any = await readBody(event);
```
- インターフェースの定義が不足しています

#### 3. Vue.js
✅ 良い点：
- Composition APIを使用
- コンポーネントの単一責任の原則を遵守
- Vuetifyコンポーネントを適切に使用

#### 4. スタイリング
✅ コーディング規約に準拠：
- Vuetifyのユーティリティクラスを活用
- スコープ付きスタイルを使用
- グローバルスタイルは`src/styles/`に配置

#### 5. セキュリティ
⚠️ 改善が必要な点：
- `server/api/chat.post.ts`に`console.log`が残っています：
```typescript
console.log(123123);
```

#### 6. パフォーマンス
✅ 良い点：
- Vuetifyの最適化設定が適切に行われています
- コンポーネントの遅延ロードが可能な構造

### 推奨される改善点

1. TypeScriptの型定義の改善：
```typescript
interface ChatRequest {
  message: string;
  model: string;
}

const body: ChatRequest = await readBody(event);
```

2. デバッグ用の`console.log`の削除

3. エラーハンドリングの強化：
- APIキーのバリデーション
- エラーメッセージの国際化対応

### 総合評価
全体的にコーディング規約に準拠しており、UIの改善が適切に行われています。TypeScriptの型安全性とセキュリティ面で若干の改善が必要ですが、大きな問題は見られません。

レビューチェックリストの評価：
- [x] コードはコーディング規約に準拠しているか
- [ ] 型定義は適切か
- [x] エラーハンドリングは適切か
- [x] パフォーマンスへの影響は考慮されているか
- [ ] セキュリティリスクはないか
- [x] テストは適切に書かれているか
- [x] ドキュメントは更新されているか

これらの改善点を修正することで、より堅牢なコードベースになると考えられます。

</details>

**以下抜粋**

> ⚠️ 改善が必要な点：
>  - `server/api/chat.post.ts`に`console.log`が残っています：


> ⚠️ 改善が必要な点：
> - `server/api/chat.post.ts`で`any`型の使用が見られます：
> ```typescript
> const body: any = await readBody(event);
> ```

おおー！ちゃんと見てくれてますね。

> レビューチェックリストの評価：
> - [x] コードはコーディング規約に準拠しているか
> - [ ] 型定義は適切か
> - [x] エラーハンドリングは適切か
> - [x] パフォーマンスへの影響は考慮されているか
> - [ ] セキュリティリスクはないか
> - [x] テストは適切に書かれているか
> - [x] ドキュメントは更新されているか

ちゃんと最後のチェックリストにもチェックが入っていなかったです。

# 総評

いかがでしたでしょうか。
Cursor を使ってコードレビューすると、ちゃんとレビューしてくれます。

セルフレビュー代わりとして使うだけでも、かなり有用だと感じました。
もちろん、途中にも書いた通り、チームや会社独自のコーディングルールに合わせてルールを作成しておくことで、プロジェクト固有のコンテキストに沿ったコードレビューが可能になると思います。
そのため、より的確で実用的なフィードバックが得られるようになり、実務でもかなり役立つと感じました。

# 最後に

まだ Cursor を使い始めて日が浅いので、もっといいやり方があるなどあれば積極的にご意見いただけたら幸いです！！

# 参考

https://qiita.com/punkshiraishi/items/629753be2e4d08fd1f42