はじめに#
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)で素早く行えます。
- 修正したい箇所を選択
Ctrl+K を押下
- 修正内容を自然言語で指示
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の計画を確認できます。
- 指示を入力
- Agentが実行計画を表示
- 計画をレビュー
- 問題なければ実行を承認
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でコーディング規約を自動適用
- レビューと修正: 差分プレビューでの確認と追加指示による品質向上
これらのテクニックを組み合わせることで、開発効率を大幅に向上させながら、品質の高いコードを継続的に生成できます。
参考リンク#