はじめに

Cursor Rulesは、AIがプロジェクトのコンテキストを理解するための強力な機能です。基本的なルール設定については別記事で解説しましたが、本記事ではより高度な活用方法に焦点を当てます。

フロントマターの詳細設定、Apply Intelligentlyによる自動適用、GitHubからのリモートルールインポートなど、チーム開発での効率化に役立つテクニックを解説します。

本記事を読むことで、以下のことができるようになります。

  • RULE.mdのフロントマター設定を使いこなし、ルールの適用条件を細かく制御できる
  • Apply Intelligentlyを活用して、AIが自動的に適切なルールを選択する環境を構築できる
  • GitHubからルールをインポートし、チーム間でルールを共有できる
  • Agent Skillsと連携した高度なルール設定を実現できる

実行環境と前提条件

本記事の内容を実践するための環境要件は以下のとおりです。

項目 要件
オペレーティングシステム Windows 10以上、macOS 10.15以上、Ubuntu 20.04以上/Debian 10以上
Cursor バージョン 2.3以降
プラン Pro以上(一部機能はBusinessプラン推奨)
インターネット接続 必須

前提条件

  • Cursorの基本操作に習熟していること
  • Project Rules(.cursor/rules)の基本的な作成方法を理解していること
  • Gitの基本操作を理解していること(リモートルールインポート時)

期待される結果

本記事の手順を完了すると、以下の状態になります。

  • ファイルパターンや関連性に基づいてルールが自動適用される
  • GitHubリポジトリからルールを同期し、最新の状態を維持できる
  • チーム全体で統一されたコーディング規約がAIに適用される
  • Agent Skillsを活用した動的なルール適用が実現できる

RULE.mdフロントマターの詳細設定

RULE.mdファイルのフロントマターには、ルールの適用方法を制御するための重要なメタデータを記述します。これらの設定を適切に使用することで、ルールの適用範囲と条件を細かく制御できます。

フロントマターフィールド一覧

フィールド 説明
description string ルールの説明。Apply Intelligentlyで使用される
globs string[] ルールを適用するファイルパターン
alwaysApply boolean 常にルールを適用するかどうか

ルールタイプの決定フロー

フロントマターの設定値によって、ルールの適用タイプが決まります。

flowchart TD
    A[ルール設定] --> B{alwaysApply?}
    B -->|true| C[Always Apply<br/>常に適用]
    B -->|false| D{globs設定?}
    D -->|あり| E[File Pattern<br/>特定ファイルに適用]
    D -->|なし| F{description設定?}
    F -->|あり| G[Apply Intelligently<br/>自動判断で適用]
    F -->|なし| H[Manual Only<br/>手動適用のみ]

Always Apply(常に適用)

すべてのチャットセッションで自動的に適用されるルールです。プロジェクト全体で遵守すべき基本規約に使用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
---
description: "プロジェクト全体のコーディング規約"
alwaysApply: true
---

## 基本ルール

- TypeScriptを使用する(JavaScriptファイルは禁止)
- 変数名・関数名は英語のcamelCaseを使用
- コメントは日本語で記述
- すべての公開関数にはJSDocコメントを付ける

## 禁止事項

- `any`型の使用
- `console.log`の本番コードへのコミット
- グローバル変数の定義

使用場面:

  • コーディング規約
  • 命名規則
  • 禁止事項の明示
  • 必須のドキュメント形式

Apply to Specific Files(特定ファイルに適用)

globsフィールドで指定したパターンに一致するファイルにのみ適用されるルールです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
---
description: "Reactコンポーネントの実装ガイドライン"
globs: ["src/components/**/*.tsx", "src/features/**/*.tsx"]
alwaysApply: false
---

## コンポーネント設計

- 関数コンポーネントのみを使用(クラスコンポーネント禁止)
- Propsには必ずTypeScript型定義を付ける
- デフォルトエクスポートを使用

## ファイル構成

各コンポーネントディレクトリの構成:

\`\`\`
ComponentName/
├── index.tsx        # メインコンポーネント
├── styles.module.css # スタイル
├── types.ts         # 型定義
└── hooks.ts         # カスタムフック(必要な場合)
\`\`\`

## 参照テンプレート

@templates/component-template.tsx

globパターンの記述例

パターン 説明
src/**/*.ts srcディレクトリ以下のすべてのTypeScriptファイル
src/components/**/*.tsx componentsディレクトリ以下のTSXファイル
**/*.test.ts すべてのテストファイル
src/api/*.ts apiディレクトリ直下のTypeScriptファイル
!**/*.d.ts 型定義ファイルを除外(否定パターン)

複数パターンの指定

1
2
3
4
5
6
7
8
---
description: "APIレイヤーの実装ガイドライン"
globs: 
  - "src/api/**/*.ts"
  - "src/services/**/*.ts"
  - "src/repositories/**/*.ts"
alwaysApply: false
---

Apply Intelligently(インテリジェント適用)

descriptionフィールドの内容をもとに、CursorのAIが関連性を判断して自動的に適用するルールです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
---
description: "データベースマイグレーションとスキーマ設計のガイドライン。テーブル作成、カラム追加、インデックス設計、外部キー制約に関する規約を含む。"
alwaysApply: false
---

## マイグレーションファイルの命名

形式: `YYYYMMDDHHMMSS_descriptive_name.ts`

例:
- `20260109120000_create_users_table.ts`
- `20260109120100_add_email_to_users.ts`

## スキーマ設計規約

### カラム命名

- スネークケースを使用: `user_id`, `created_at`
- 外部キーは`_id`サフィックス: `user_id`, `order_id`
- ブール値は`is_`または`has_`プレフィックス: `is_active`, `has_verified`

### 必須カラム

すべてのテーブルに以下のカラムを含める:

\`\`\`sql
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
\`\`\`

### SOFT DELETE

物理削除ではなく論理削除を使用:

\`\`\`sql
deleted_at TIMESTAMP WITH TIME ZONE
\`\`\`

効果的なdescriptionの書き方:

  • 具体的なキーワードを含める
  • ルールが適用される場面を明示する
  • 関連する技術用語を含める

Manual Only(手動適用のみ)

descriptionglobsも設定せず、alwaysApplyがfalseの場合、チャット内で@ルール名として明示的に参照されたときのみ適用されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
---
alwaysApply: false
---

## レガシーコード対応ガイドライン

このルールはレガシーコードのリファクタリング時にのみ使用してください。
通常の開発では適用しないでください。

### 対応方針

1. 既存の命名規則を維持(新規コードの規則に変更しない)
2. 型定義は段階的に追加
3. テストカバレッジを先に確保してからリファクタリング

使用方法:

@legacy-guidelines に従って、このファイルをリファクタリングしてください

効果的なルール設計パターン

チーム開発で有効なルール設計パターンを紹介します。

階層構造によるルール整理

.cursor/rules/
├── 00-project-standards/
│   └── RULE.md           # alwaysApply: true
├── 01-frontend/
│   ├── components/
│   │   └── RULE.md       # globs: ["src/components/**"]
│   └── styles/
│       └── RULE.md       # globs: ["**/*.css", "**/*.scss"]
├── 02-backend/
│   ├── api/
│   │   └── RULE.md       # globs: ["src/api/**"]
│   └── database/
│       └── RULE.md       # description-based
├── 03-testing/
│   └── RULE.md           # globs: ["**/*.test.*", "**/*.spec.*"]
└── 04-documentation/
    └── RULE.md           # globs: ["**/*.md", "docs/**"]

ドメイン別ルールの例

フロントエンド - コンポーネントルール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
---
description: "Reactコンポーネント、フック、スタイリングに関するフロントエンド実装ガイドライン"
globs: ["src/components/**/*.tsx", "src/hooks/**/*.ts"]
alwaysApply: false
---

## コンポーネント実装

### Props定義

\`\`\`typescript
// 良い例
interface ButtonProps {
  variant: 'primary' | 'secondary' | 'danger';
  size?: 'sm' | 'md' | 'lg';
  disabled?: boolean;
  onClick?: () => void;
  children: React.ReactNode;
}

export const Button: React.FC<ButtonProps> = ({
  variant,
  size = 'md',
  disabled = false,
  onClick,
  children,
}) => {
  // ...
};
\`\`\`

### カスタムフック

- `use`プレフィックスを使用
- 単一責任の原則を守る
- 戻り値の型を明示

\`\`\`typescript
interface UseUserReturn {
  user: User | null;
  isLoading: boolean;
  error: Error | null;
  refetch: () => Promise<void>;
}

export function useUser(userId: string): UseUserReturn {
  // ...
}
\`\`\`

バックエンド - APIルール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
---
description: "REST API設計、エンドポイント実装、バリデーション、エラーハンドリングのガイドライン"
globs: ["src/api/**/*.ts", "src/routes/**/*.ts", "src/controllers/**/*.ts"]
alwaysApply: false
---

## エンドポイント設計

### URL命名規則

- リソース名は複数形: `/users`, `/orders`
- ネストは2階層まで: `/users/:id/orders`
- アクションはHTTPメソッドで表現

| 操作 | メソッド | URL例 |
|-----|---------|-------|
| 一覧取得 | GET | `/users` |
| 詳細取得 | GET | `/users/:id` |
| 作成 | POST | `/users` |
| 更新 | PUT/PATCH | `/users/:id` |
| 削除 | DELETE | `/users/:id` |

### レスポンス形式

\`\`\`typescript
// 成功レスポンス
interface ApiResponse<T> {
  data: T;
  meta?: {
    page: number;
    limit: number;
    total: number;
  };
}

// エラーレスポンス
interface ApiError {
  error: {
    code: string;
    message: string;
    details?: Record<string, string[]>;
  };
}
\`\`\`

### バリデーション

- 入力バリデーションにはzodを使用
- バリデーションエラーは422で返す
- エラーメッセージは日本語で記述

テストルール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
---
description: "ユニットテスト、統合テスト、E2Eテストの実装ガイドライン"
globs: ["**/*.test.ts", "**/*.test.tsx", "**/*.spec.ts", "tests/**/*"]
alwaysApply: false
---

## テストファイル構成

### 命名規則

- ユニットテスト: `*.test.ts`
- 統合テスト: `*.integration.test.ts`
- E2Eテスト: `*.e2e.test.ts`

### テスト構造

\`\`\`typescript
describe('UserService', () => {
  describe('createUser', () => {
    it('有効なデータで新規ユーザーを作成できる', async () => {
      // Arrange
      const userData = { name: 'Test User', email: 'test@example.com' };
      
      // Act
      const result = await userService.createUser(userData);
      
      // Assert
      expect(result).toMatchObject({
        id: expect.any(String),
        name: 'Test User',
        email: 'test@example.com',
      });
    });

    it('重複したメールアドレスでエラーを返す', async () => {
      // ...
    });
  });
});
\`\`\`

### モック戦略

- 外部APIは必ずモック
- データベースはテスト用DBまたはモック
- 時間依存のテストは`jest.useFakeTimers()`を使用

GitHubからのリモートルールインポート

Cursorは、GitHubリポジトリからルールを直接インポートする機能を提供しています。これにより、組織全体でルールを共有したり、コミュニティのベストプラクティスを取り込んだりできます。

リモートルールインポートの手順

  1. Cursor Settings(Ctrl + Shift + J / Cmd + Shift + J)を開く
  2. 「Rules, Commands」セクションに移動
  3. 「Project Rules」の横にある「+ Add Rule」をクリック
  4. 「Remote Rule (GitHub)」を選択
  5. GitHubリポジトリのURLを入力

サポートされるリポジトリ形式

形式
パブリックリポジトリ https://github.com/org/rules-repo
プライベートリポジトリ https://github.com/org/private-rules(認証必要)
特定のブランチ https://github.com/org/rules-repo/tree/main
特定のディレクトリ https://github.com/org/rules-repo/tree/main/cursor-rules

リモートルールの同期

インポートしたルールは元のGitHubリポジトリと継続的に同期されます。リポジトリでルールが更新されると、プロジェクトにも自動的に反映されます。

組織用ルールリポジトリの構築例

組織全体で共有するルールリポジトリの構成例です。

company-cursor-rules/
├── README.md
├── general/
│   ├── coding-standards/
│   │   └── RULE.md
│   └── security/
│       └── RULE.md
├── frontend/
│   ├── react/
│   │   └── RULE.md
│   └── vue/
│       └── RULE.md
├── backend/
│   ├── nodejs/
│   │   └── RULE.md
│   └── python/
│       └── RULE.md
└── templates/
    ├── component-template.tsx
    └── api-template.ts

リモートルールのベストプラクティス

推奨事項 説明
バージョン管理 mainブランチは安定版のみ、開発はfeatureブランチで
ドキュメント READMEにルールの概要と使用方法を記載
変更履歴 CHANGELOGでルールの変更を追跡
レビュープロセス ルール変更はPRでレビュー

Agent Skillsとの連携

Agent Skillsは、Cursorが提供する追加の機能セットで、ルールとして読み込むことができます。

Agent Skillsの有効化

  1. Cursor Settings → Rules を開く
  2. 「Import Settings」セクションを見つける
  3. 「Agent Skills」をオンに切り替え

Agent Skillsの動作

Agent Skillsは「エージェント決定ルール」として扱われます。これは、Apply Intelligentlyと同様に、コンテキストに基づいてCursorが関連性を判断し、必要に応じて適用されることを意味します。

Agent Skillsとカスタムルールの組み合わせ

Agent Skillsが提供する機能を補完するカスタムルールを作成できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
description: "Agent Skillsを拡張するプロジェクト固有の設定"
alwaysApply: false
---

## Agent Skills拡張設定

### Web検索の追加コンテキスト

Web検索結果を使用する際は、以下の優先順位で情報源を評価:

1. 公式ドキュメント
2. GitHub Issues/Discussions
3. Stack Overflow(高評価回答のみ)
4. 技術ブログ(信頼性の高いもの)

### ファイル操作の制約

Agent Skillsによるファイル操作時は以下を遵守:

- `node_modules/``dist/``.git/` への書き込み禁止
- 設定ファイル(`.env``*.config.*`)の変更は確認を求める
- 大規模な変更(10ファイル以上)は計画を先に提示

Team Rulesの高度な活用

Team/Enterpriseプランで利用可能なTeam Rulesの高度な活用方法を解説します。

強制ルールとオプションルール

Team Rulesには2つのモードがあります。

モード 説明 使用場面
強制 チームメンバーが無効化できない セキュリティ規約、必須のコーディング標準
オプション メンバーが個別に無効化可能 推奨事項、スタイルガイド

段階的なルール展開戦略

新しいルールをチームに展開する際の推奨アプローチです。

flowchart LR
    A[ドラフト作成] --> B[少人数でテスト]
    B --> C[フィードバック収集]
    C --> D[ルール調整]
    D --> E[オプションとして展開]
    E --> F[効果測定]
    F --> G{効果あり?}
    G -->|Yes| H[強制ルールに昇格]
    G -->|No| I[ルール見直し]
    I --> D

複数チーム間でのルール共有

大規模な組織では、チームごとに異なるルールセットが必要な場合があります。

Organization Rules (全社共通)
├── security-standards        # 強制
├── documentation-standards   # 強制
└── naming-conventions        # オプション

Team A Rules (フロントエンドチーム)
├── react-guidelines          # 強制
├── css-standards            # オプション
└── accessibility-rules      # 強制

Team B Rules (バックエンドチーム)
├── api-design               # 強制
├── database-conventions     # 強制
└── logging-standards        # オプション

ルールの効果測定と改善

ルールの効果を継続的に測定し、改善するためのアプローチを紹介します。

測定指標

指標 測定方法 目標
コードレビュー指摘数 PRコメントの分析 減少
ルール違反検出数 リンター/静的解析 減少
開発者満足度 アンケート 向上
オンボーディング時間 新メンバーの立ち上がり 短縮

フィードバックループの構築

  1. 定期レビュー: 月次でルールの有効性をレビュー
  2. 例外管理: 正当な理由で例外が必要なケースを記録
  3. 更新プロセス: ルール変更のリクエストフローを整備
  4. ドキュメント: ルールの背景と理由を明文化

ルール改善のトリガー

  • 同じ例外リクエストが複数回発生
  • 新しい技術/ライブラリの導入
  • チーム構成の変化
  • プロジェクトフェーズの変化(開発→運用)

まとめ

本記事では、Cursor Rulesの高度な活用方法を解説しました。

  • フロントマター設定: alwaysApplyglobsdescriptionを使い分けることで、ルールの適用条件を細かく制御できる
  • Apply Intelligently: 適切なdescriptionを設定することで、AIが自動的に関連するルールを選択・適用する
  • リモートルールインポート: GitHubからルールをインポートし、チーム間でルールを共有・同期できる
  • Agent Skillsとの連携: Agent Skillsを有効化し、カスタムルールで補完することで、より高度なAI支援が可能になる
  • Team Rules: 強制ルールとオプションルールを使い分け、段階的にチームに展開する

効果的なルール設計により、チーム全体のコーディング品質が向上し、AIがプロジェクトの文脈を理解した的確な支援を提供できるようになります。ルールは一度作成して終わりではなく、継続的に改善していくことが重要です。

参考リンク