メインコンテンツまでスキップ

Cursor Composer:実際に機能する複数ファイル編集

ほとんどのCursorユーザーは通常のチャットに留まっています。関数を尋ね、出力をコピーしてファイルに貼り付け、繰り返します。小さな作業には機能します。しかし、1つの機能を追加するために5つのファイルを変更する必要があるとき、そのワークフローは崩壊します。

ComposerはCursorがこの問題に対して出した答えです。これは別のパネルで、変更したいことを説明すると、Cursorが一度に複数のファイルにわたる編集を提案します。確認して、各変更を承認または拒否し、次に進みます。コピーアンドペーストなし。コンテキスト切り替えなし。

このガイドでは、Cursorフォーラムからの実際のワークフローをカバーします。マーケティングトークはなし。実際に機能するものだけです。

Composer panel overview

Composer vs 通常のチャット:実際の違い

通常のチャットはQ&Aです。尋ねて、Cursorが答えます。コードをファイルに移すのは依然としてあなたの仕事です。

Composerはアクションです。目標を説明すると、Cursorがどのファイルに触れ、何を変更すべきかを把握します。diffを提示し、あなたがどれを採用するか決めます。

機能通常のチャットComposer
コードを提案するはいはい
ファイルを直接編集するいいえはい
複数ファイルの変更いいえはい
適用前にdiffを表示いいえはい
チェックポイント/ロールバックいいえはい
最適な用途質問、単一スニペットリファクタリング、機能開発、一括更新

重要な機能はチェックポイントです。Composerは変更を加える前にスナップショットを保存します。編集がうまくいかなくなった場合、1クリックでチェックポイントに戻れます。通常のチャットには安全網がありません。

Composerの開き方

Cmd/Ctrl + I を押すか、左サイドバーのComposerアイコンをクリックします。チャットとは別のパネルです — 混同しないでください。

Composerを使う場面

Composerは、1つのタスクが複数のファイルに触れるときに真価を発揮します。一般的なシナリオ:

  • リファクタリング — コンポーネント間でprop名を変更する、共有ユーティリティを抽出する
  • 機能開発 — 新しいAPIエンドポイントを追加するには、route、controller、service、テストファイルの変更が必要
  • パターン更新 — どこでも fetch をカスタムの apiClient に切り替える
  • 型の変更 — 10のファイルに波及するインターフェースを更新する
  • インポートの整理 — モジュール構造を再編成する

チャットからコードをコピーして2つ以上のファイルに貼り付けているなら、やめてComposerを使いましょう。

Composerは万能ではありません

素早い質問、1行のコード、または「この正規表現を説明して」 — 通常のチャットの方が速いです。Composerにはオーバーヘッドがあります。複数ファイルの作業のために取っておきましょう。

実際のワークフロー1:複数ファイルにまたがるリファクタリング

types.tsUser 型があります。displayName フィールドを追加するため、namefullName に変更したいとします。命名が混乱してきました。

これは以下に触れます:

  • src/types.ts — 型定義
  • src/components/UserCard.tsx — 名前を表示
  • src/components/UserProfile.tsx — これも名前を表示
  • src/api/users.ts — このフィールドを送受信するAPI呼び出し
  • src/lib/validators.ts — ユーザー検証のZodスキーマ

ステップ1: Composerを開きます(Cmd/Ctrl + I)。

ステップ2: 変更内容を説明します:

User型の `name` フィールドを `fullName` に変更し、コードベース全体の使用箇所を更新してください。動作は一切変更しないでください — これは純粋なリネームです。

ステップ3: 提案されたdiffを確認します。Composerは各ファイルの変更をハイライト表示します。以下を確認してください:

  • ユーザーに関連する name のみがリネームされている(他の name propは変更されていない)
  • API層が正しいデータを送受信している
  • ロジックの変更が紛れ込んでいない

ステップ4: ファイルごとに承認または拒否します。1つのファイルが間違っている場合は、そのファイルだけ拒否して手動で修正します。

diffを注意深く確認してください

Composerは時々、手を出しすぎることがあります。コンテキストが似ていると、無関係なコンポーネントの name propもリネームする可能性があります。承認する前に必ずdiffを確認してください。

実際のワークフロー2:複数ファイルにまたがる機能追加

アプリに「ユーザーロール」を追加したいとします。管理者ユーザーには追加のUI要素が表示され、追加のAPIエンドポイントにアクセスできます。

関与するファイル:

  • src/types.ts — Userに role: 'user' | 'admin' を追加
  • src/api/auth.ts — JWTペイロードにroleを含める
  • src/components/Navbar.tsx — 管理者のみadminリンクを表示
  • src/components/AdminPanel.tsx — 新しいコンポーネント
  • src/hooks/useAuth.tsisAdmin フラグを公開
  • src/middleware/auth.ts — adminロールをチェックする新しいミドルウェア

ステップ1: Composerを開きます。

ステップ2: 計画を与えます。単なる願いではなく:

アプリにユーザーロールを追加してください:

1. src/types.ts のUser型に `role: 'user' | 'admin'` を追加
2. src/api/auth.ts のログインレスポンスを更新し、JWTペイロードにroleを含める
3. src/hooks/useAuth.ts に `isAdmin` 計算値を追加
4. Navbar.tsxを更新し、isAdminがtrueのときに「Admin」リンクを条件付きで表示
5. src/components/AdminPanel.tsx を作成し、プレースホルダーの管理者ダッシュボードを配置
6. src/middleware/auth.ts を作成し、JWTのroleをチェックするrequireAdminミドルウェアを記述

コードベースの既存のパターンを使用してください。他のAPIファイルと同じエラーハンドリングスタイルに従ってください。

ステップ3: Composerが複数ファイルのdiffを生成します。各ファイルを確認します。

ステップ4: 新しい AdminPanel.tsx が間違っている場合は、それを拒否し、残りは保持します。Composerの編集は粒度が細かいです。

先に計画を尋ねる

Composerにコーディングさせる前に、計画の概要を尋ねてください。「編集を行う前に、変更するファイルとその理由をリストしてください」と追加します。これにより、誤解を早期に捉えられ、コストはかかりません。

実際のワークフロー3:API呼び出しの一括更新

フロントエンドに散らばった生の fetch 呼び出しから始めました。今では、認証ヘッダー、エラーハンドリング、base URL設定済みのカスタム apiClient があります。すべてを移行する必要があります。

ファイル:数十ものAPI呼び出し箇所の可能性があります。

ステップ1: apiClient が存在し、1つのファイルで正しくインポートされていることを先に確認してください。Composerは、参照実装があるときに機能が向上します。

ステップ2: Composerを開き、タスクの範囲を限定します:

src/ 内のすべての生の `fetch` 呼び出しを、src/lib/apiClient.ts の `apiClient` に置き換えてください。

ルール:
- 既存の `apiClient.get`、`.post`、`.put`、`.delete` メソッドを使用
- 手動のJSON.stringifyとresponse.json()処理を削除 — apiClientがこれを行う
- 同じエンドポイントパスを保持
- apiClientにまだないカスタムヘッダーは保持

src/api/ ディレクトリから始め、必要に応じて src/hooks/ も処理してください。

ステップ3: バッチごとに確認します。20ファイルを一度に見ずに承認しないでください。Composerは優れていますが、完璧ではありません。

ステップ4: 承認後にテストスイートを実行します。diffがきれいに見えても、型エラーやランタイム動作が分岐する可能性があります。

すべてを一度に移行しない

50ファイル以上ある場合は、チャンクに分割します。「まず src/api/ を移行する」。次に「src/hooks/ を移行する」。大きなバッチはレビューが難しく、ミスも起きやすくなります。

Composer + Agentモード:強力なコンボ

ComposerとAgentモードは、異なる問題を解決します。Composerは、やりたいことが分かっている対象を絞った複数ファイル編集向けです。Agentモードは、AIが探索し、コマンドを実行し、自分で把握する必要があるオープンエンドのタスク向けです。

しかし、両者は連携できます。

パターン:Agentが計画し、Composerが実行する

Agentモードを使って変更の範囲を把握します:

React ContextからZustandに状態管理を移行したいです。AuthContextを使用しているすべてのファイルをリストし、各ファイルにどのような変更が必要か教えてください。

Agentモードはコードベースを検索し、内訳を提供します。次にComposerを開いて、完全なdiffレビューとともにファイルごとに変更を実行します。

パターン:Composerでリファクタリングし、Agentで検証する

大規模なComposerリファクタリングの後、Agentモードに切り替えます:

テストスイートを実行し、最近のリファクタリングによって生じた壊れたインポートや型エラーを修正してください。

Agentモードがクリーンアップを処理している間、あなたはComposerの変更を確認できます。

AgentモードはComposerを使用できる

Agentモードでは、Cursorが複数ファイル編集のために内部的にComposerを開くことがあります。これを直接制御することはできませんが、Agentセッション中にComposerスタイルのdiffが表示されることがあります。同じように確認してください。

よくあるミスとその回避方法

1. 曖昧なプロンプト

悪い例:「認証を良くしてください。」

良い例:「User型に role フィールドを追加し、ログインAPIを更新してJWTに含め、管理者ユーザーにはNavbarにadminリンクを表示してください。」

具体性は驚きを減らします。

2. 確認せずに承認する

Composerのdiffはきれいに見えますが、以下の可能性があります:

  • 残しておきたいコメントを削除する
  • 無関係な行のフォーマットを変更する
  • 1つのファイルでエッジケースを見落とす

必ずdiffを確認してください。30秒かかりますが、やり直しを省けます。

3. 一度に多すぎるファイル

Composerは10〜15ファイル程度なら問題なく処理できます。それを超えると、コンテキストウィンドウが圧迫され品質が低下します。大きなタスクを論理的なチャンクに分割してください。

4. チェックポイントを使わない

大きなComposerセッションを始める前に、チェックポイントボタンを押してください。1クリックです。セッションがうまくいかなくなった場合、ロールバックも1クリックです。これをスキップする言い訳はありません。

チェックポイントはGitコミットではありません

ComposerのチェックポイントはCursor内部に存在します。Gitの代わりにはなりません。大きなComposer作業の前に、gitにもコミットしてください。両方の安全網を使いましょう。

5. 変更後の型エラーを無視する

Composerの編集はおおよそ90%の確率でコンパイルを通ります。残りの10%は、特にリネームやインターフェース変更時に、微妙な型の不一致を引き起こします。変更を承認した後は tsc またはリンターを実行してください。

クイックリファレンス

アクションショートカット
Composerを開くCmd/Ctrl + I
変更を承認Cmd/Ctrl + Y
変更を拒否Cmd/Ctrl + N
チェックポイントを作成Composerパネルのチェックポイントアイコンをクリック
チェックポイントに戻るチェックポイント横の復元アイコンをクリック

まとめ

  • 複数ファイルの編集にはComposerを、質問には通常のチャットを使いましょう。
  • 正確にやりたいことを説明してください。ファイルパスと制約条件を含めます。
  • 承認する前にすべてのdiffを確認してください。
  • 大きなセッションの前にチェックポイントを作成してください。
  • 大きなタスクはチャンクに分割してください。
  • ComposerとAgentモードを組み合わせましょう:Agentが探索し、Composerが実行します。

Composerは魔法ではありません。複数ファイルの作業からコピーアンドペーストの手間を取り除くツールです。正しく使えば、時間を節約できます。不注意に使えば、クリーンアップ作業を生み出します。違いは確認のステップにあります — スキップしないでください。