はじめに

Cursorは、自然言語で要件を伝えるだけで実装コードを生成するAI駆動開発の中核機能を提供します。単純なコード補完を超え、プロジェクトのコンテキストを理解した上で、規約に沿った品質の高いコードを生成できます。

本記事では、Cursorを使った効率的なコード生成の方法を解説します。この記事を読むことで、以下のことができるようになります。

  • 機能要件から具体的な実装コードを生成できる
  • 既存コードパターンに沿った一貫性のあるコードを作成できる
  • 複数ファイルにまたがる実装をAgentで自動化できる
  • Rulesを活用してプロジェクト規約を遵守したコードを生成できる
  • 生成されたコードをレビューし、適切に修正できる

実行環境と前提条件

実行環境

項目 要件
オペレーティングシステム Windows 10以上、macOS 10.15以上、Ubuntu 20.04以上
Cursor バージョン 2.3以降(2026年1月時点の安定版)
インターネット接続 必須(AIモデル利用に必要)
料金プラン Hobby(無料)以上

前提条件

  • Cursorがインストールされ、アカウントでログイン済みであること
  • Cursor Agentの基本操作を理解していること
  • 対象プロジェクトがワークスペースとして開かれていること

期待される結果

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

  • 自然言語で機能要件を伝え、実装コードを効率的に生成できる
  • プロジェクトの既存パターンに一致したコードが自動生成される
  • Rulesによってコーディング規約が自動的に適用される
  • 生成コードの品質を適切に評価・修正できる

機能要件からのコード生成

Cursorの最も基本的なコード生成は、機能要件を自然言語で伝えることから始まります。

効果的なプロンプトの書き方

コード生成の品質は、プロンプト(指示文)の書き方に大きく依存します。以下の要素を含めると、より正確なコードが生成されます。

要素 説明
目的 何を実現したいか ユーザー認証機能を実装したい
入力 処理に必要なデータ メールアドレスとパスワード
出力 期待する結果 JWTトークンを返す
制約 守るべきルール パスワードはbcryptでハッシュ化

基本的なコード生成の例

Agent(Ctrl+IまたはCmd+I)を開き、以下のように機能要件を伝えます。

1
2
3
4
5
6
7
指示例:
ユーザー登録APIのエンドポイントを作成してください。
- POST /api/users で呼び出し
- リクエストボディにemail、password、nameを含む
- パスワードはbcryptでハッシュ化して保存
- 成功時は201ステータスとユーザー情報を返す
- メールアドレスの重複チェックを行う

この指示を受けると、Agentはプロジェクトの構成を分析し、適切なファイルに以下のようなコードを生成します。

 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
// src/controllers/user.controller.ts
import { Request, Response } from 'express';
import bcrypt from 'bcrypt';
import { UserService } from '../services/user.service';

export class UserController {
  constructor(private userService: UserService) {}

  async register(req: Request, res: Response): Promise<void> {
    const { email, password, name } = req.body;

    // メールアドレスの重複チェック
    const existingUser = await this.userService.findByEmail(email);
    if (existingUser) {
      res.status(409).json({ error: 'Email already exists' });
      return;
    }

    // パスワードのハッシュ化
    const hashedPassword = await bcrypt.hash(password, 10);

    // ユーザー作成
    const user = await this.userService.create({
      email,
      password: hashedPassword,
      name,
    });

    // パスワードを除いたユーザー情報を返す
    const { password: _, ...userWithoutPassword } = user;
    res.status(201).json(userWithoutPassword);
  }
}

コンテキストの提供

@メンションを使って関連ファイルを明示的に指定すると、生成コードの精度が向上します。

1
2
3
4
5
6
コンテキストを含めた指示例:
@src/services/user.service.ts と @src/models/user.model.ts を参考に、
パスワードリセット機能を実装してください。
- ランダムなトークンを生成
- 有効期限は1時間
- 既存のUserServiceのパターンに従う

既存コードパターンに沿った新規実装

Cursorは、プロジェクト内の既存コードを分析し、そのパターンに沿った新規コードを生成できます。

パターン認識の仕組み

Cursorのコードベースインデックス機能により、以下のパターンが自動的に認識されます。

flowchart LR
    A[コードベース分析] --> B[アーキテクチャパターン]
    A --> C[命名規則]
    A --> D[エラーハンドリング]
    A --> E[ディレクトリ構造]
    B --> F[一貫性のあるコード生成]
    C --> F
    D --> F
    E --> F

既存パターンを活用した生成

既存のサービスクラスがある場合、新しいサービスを作成する際に自動的にパターンが適用されます。

1
2
3
指示例:
既存のUserServiceと同じパターンで、ProductServiceを作成してください。
CRUD操作と検索機能を含めてください。

Agentは既存のUserServiceを分析し、同じ構造でProductServiceを生成します。

 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
// src/services/product.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, FindOptionsWhere, Like } from 'typeorm';
import { Product } from '../entities/product.entity';
import { CreateProductDto, UpdateProductDto } from '../dto/product.dto';

@Injectable()
export class ProductService {
  constructor(
    @InjectRepository(Product)
    private productRepository: Repository<Product>,
  ) {}

  async create(dto: CreateProductDto): Promise<Product> {
    const product = this.productRepository.create(dto);
    return this.productRepository.save(product);
  }

  async findAll(): Promise<Product[]> {
    return this.productRepository.find();
  }

  async findById(id: string): Promise<Product | null> {
    return this.productRepository.findOne({ where: { id } });
  }

  async update(id: string, dto: UpdateProductDto): Promise<Product | null> {
    await this.productRepository.update(id, dto);
    return this.findById(id);
  }

  async delete(id: string): Promise<boolean> {
    const result = await this.productRepository.delete(id);
    return result.affected !== 0;
  }

  async search(query: string): Promise<Product[]> {
    return this.productRepository.find({
      where: [
        { name: Like(`%${query}%`) },
        { description: Like(`%${query}%`) },
      ],
    });
  }
}

類似ファイルの参照

@Codebaseメンションを使うと、プロジェクト全体から類似のパターンを検索して参照します。

1
2
3
指示例:
@Codebase 認証ミドルウェアの実装パターンを参考に、
APIレート制限のミドルウェアを作成してください。

複数ファイルにまたがる編集

実際の開発では、新機能の追加が複数のファイルに影響することがほとんどです。Cursor Agentはこのような複合的なタスクを自動化します。

Agentによる複数ファイル編集

Agentに包括的な指示を出すと、必要なすべてのファイルを自動的に作成・編集します。

1
2
3
4
5
6
7
指示例:
注文管理機能を実装してください。
- Order エンティティ(id, userId, items, totalAmount, status, createdAt)
- OrderService(CRUD操作、ステータス更新)
- OrderController(REST API)
- 注文作成時にユーザーの在庫チェックを行う
- 必要なDTOとバリデーションを含める

この指示により、Agentは以下のファイルを順次作成・編集します。

flowchart TD
    A[指示を解析] --> B[必要なファイルを特定]
    B --> C[entities/order.entity.ts]
    B --> D[dto/order.dto.ts]
    B --> E[services/order.service.ts]
    B --> F[controllers/order.controller.ts]
    B --> G[modules/order.module.ts]
    C --> H[依存関係を解決]
    D --> H
    E --> H
    F --> H
    G --> H
    H --> I[既存ファイルを更新<br/>app.module.ts など]

編集の確認と適用

Agentが生成した変更は、適用前に差分プレビューで確認できます。

操作 説明
Accept 変更を適用する
Reject 変更を却下する
Edit 変更内容を手動で調整する

複数ファイルの変更がある場合、ファイルごとに個別に確認することも、一括で適用することもできます。

チェックポイントの活用

複数ファイルにまたがる大きな変更を行う前に、チェックポイントを作成しておくと安全です。

1
2
3
指示例:
まずチェックポイントを作成してから、
決済モジュールを実装してください。

問題が発生した場合、チェックポイントから復元できます。

Rulesを活用したプロジェクト規約の遵守

Cursorの Rules 機能を使うと、プロジェクト固有のコーディング規約をAIに教えられます。

Project Rules の設定

.cursor/rules ディレクトリにルールファイルを作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
description: TypeScript コーディング規約
globs: ["**/*.ts", "**/*.tsx"]
alwaysApply: true
---

# TypeScript コーディング規約

## 命名規則
- クラス名: PascalCase(例: UserService)
- 関数名・変数名: camelCase(例: getUserById)
- 定数: UPPER_SNAKE_CASE(例: MAX_RETRY_COUNT)
- インターフェース名: I接頭辞なし(例: User, not IUser)

## エラーハンドリング
- カスタム例外クラスを使用する(HttpException継承)
- エラーメッセージは日本語でユーザーフレンドリーに
- ログにはスタックトレースを含める

## コメント
- 関数にはJSDocコメントを必須とする
- 複雑なロジックには理由を説明するコメントを追加
- TODOコメントには担当者と期限を記載

Rules が適用されたコード生成

Rules を設定した状態でコード生成を行うと、規約に沿ったコードが自動的に生成されます。

1
2
指示例:
ユーザーのプロフィール更新機能を実装してください。

Rules が適用されると、以下のような規約に準拠したコードが生成されます。

 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
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from '../entities/user.entity';
import { UpdateProfileDto } from '../dto/update-profile.dto';

/**
 * ユーザープロフィール管理サービス
 * ユーザーのプロフィール情報の更新と取得を担当する
 */
@Injectable()
export class ProfileService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  /**
   * ユーザーのプロフィールを更新する
   * @param userId - 更新対象のユーザーID
   * @param dto - 更新するプロフィール情報
   * @returns 更新されたユーザー情報
   * @throws NotFoundException ユーザーが見つからない場合
   */
  async updateProfile(userId: string, dto: UpdateProfileDto): Promise<User> {
    const user = await this.userRepository.findOne({ where: { id: userId } });

    if (!user) {
      throw new NotFoundException('指定されたユーザーが見つかりません');
    }

    // 更新可能なフィールドのみを適用
    Object.assign(user, {
      displayName: dto.displayName,
      bio: dto.bio,
      avatarUrl: dto.avatarUrl,
      updatedAt: new Date(),
    });

    return this.userRepository.save(user);
  }
}

言語・フレームワーク別の Rules

フロントエンドとバックエンドで異なるルールを適用することも可能です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
---
description: React コンポーネント規約
globs: ["src/components/**/*.tsx", "src/pages/**/*.tsx"]
alwaysApply: true
---

# React コンポーネント規約

## コンポーネント構造
- 関数コンポーネントを使用(クラスコンポーネント禁止)
- Props は型定義を必須とする
- デフォルトエクスポートを使用

## Hooks
- カスタムHooksは use 接頭辞で命名
- useEffectには依存配列を必ず指定
- 状態管理は useState または Context API を使用

## スタイリング
- CSS Modules または Tailwind CSS を使用
- インラインスタイルは禁止

生成コードのレビューと修正

AIが生成したコードは、必ずレビューしてから適用することが重要です。

レビューのポイント

生成コードをレビューする際は、以下のポイントをチェックします。

カテゴリ チェック項目
正確性 要件を満たしているか
セキュリティ SQL インジェクション、XSS 等の脆弱性がないか
パフォーマンス 非効率なクエリやループがないか
可読性 変数名やロジックが理解しやすいか
テスタビリティ 単体テストが書きやすい構造か

差分プレビューの活用

Agentが提案した変更は、差分プレビューで詳細を確認できます。

1
2
3
4
5
変更前(赤):
-  const user = await db.query('SELECT * FROM users WHERE id = ' + id);

変更後(緑):
+  const user = await db.query('SELECT * FROM users WHERE id = ?', [id]);

修正の依頼

生成されたコードに問題がある場合、追加の指示で修正を依頼できます。

1
2
3
4
5
6
7
修正指示例:
このコードにはいくつか問題があります:
1. エラーハンドリングが不十分です。try-catchを追加してください
2. 入力値のバリデーションが必要です
3. ログ出力を追加してください

これらを修正してください。

インライン編集との組み合わせ

細かな修正は、インライン編集(Ctrl+K)で素早く行えます。

  1. 修正したい箇所を選択
  2. Ctrl+K を押下
  3. 修正内容を自然言語で指示
1
2
選択範囲に対する指示例:
この関数にnullチェックを追加して

実践的なコード生成ワークフロー

効率的なコード生成のためのワークフローを紹介します。

ワークフロー全体像

flowchart TD
    A[要件を整理] --> B[Rulesを確認/更新]
    B --> C[Agentに指示]
    C --> D{プランの確認}
    D -->|OK| E[コード生成]
    D -->|修正| C
    E --> F[差分プレビュー]
    F --> G{レビュー}
    G -->|問題あり| H[修正指示]
    H --> E
    G -->|OK| I[変更を適用]
    I --> J[テスト実行]
    J --> K{テスト結果}
    K -->|失敗| H
    K -->|成功| L[完了]

段階的な実装アプローチ

大きな機能を実装する場合は、段階的にコードを生成することをお勧めします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
段階的な指示例:

ステップ1:
まずOrderエンティティとDTOを作成してください。
フィールドとバリデーションルールは以下の通りです...

ステップ2:
次にOrderServiceを作成してください。
先ほど作成したエンティティを使用し、CRUD操作を実装してください。

ステップ3:
最後にOrderControllerを作成し、
REST APIエンドポイントとしてServiceを公開してください。

プランモードの活用

Cursor 2.1以降では、プランモードで実行前にAgentの計画を確認できます。

  1. 指示を入力
  2. Agentが実行計画を表示
  3. 計画をレビュー
  4. 問題なければ実行を承認
1
2
3
4
5
6
7
Agentの計画例:
1. src/entities/notification.entity.ts を作成
2. src/dto/notification.dto.ts を作成
3. src/services/notification.service.ts を作成
4. src/controllers/notification.controller.ts を作成
5. src/modules/notification.module.ts を作成
6. src/app.module.ts を更新して NotificationModule をインポート

よくあるトラブルと対処法

生成コードが既存パターンと一致しない

原因と対処法を示します。

原因 対処法
コードベースインデックスが未構築 Settings > Features > Codebase indexing を有効化
参照すべきファイルを指定していない @メンションで明示的にファイルを指定
Rulesが設定されていない Project Rules を作成

複数ファイル編集が途中で停止する

長いタスクでAgentが停止した場合の対処法です。

1
2
3
継続指示例:
続きを実行してください。
OrderControllerの作成から再開してください。

生成コードにエラーがある

構文エラーや型エラーがある場合は、エラーメッセージを共有します。

1
2
3
4
5
エラー修正指示例:
以下のエラーが発生しています:
"Property 'email' does not exist on type 'CreateUserDto'"

このエラーを修正してください。

まとめ

Cursorを使ったコード生成は、自然言語で要件を伝えるだけで高品質な実装コードを得られる強力なAI駆動開発手法です。本記事で解説した内容をまとめます。

  • 機能要件からのコード生成: 目的、入力、出力、制約を明確にしたプロンプトで精度向上
  • 既存パターンの活用: @メンションとコードベースインデックスで一貫性を確保
  • 複数ファイル編集: Agentによる自動的なファイル作成と依存関係解決
  • Rulesによる規約遵守: Project Rulesでコーディング規約を自動適用
  • レビューと修正: 差分プレビューでの確認と追加指示による品質向上

これらのテクニックを組み合わせることで、開発効率を大幅に向上させながら、品質の高いコードを継続的に生成できます。

参考リンク