WindsurfからClaude Codeへの移行手順 — Devin Desktop化後の設定引き継ぎ
WindsurfはDevin Desktopに改称済みです。.windsurfrulesやmcp_config.jsonをClaude CodeのCLAUDE.md・.mcp.jsonへ移す読み替え表と手順をまとめました。
はじめに
Windsurfは2026年6月2日付でDevin Desktopに改称されました。開発元のCognitionが自社製品をDevinブランドに統一した結果で、エディタ本体・拡張機能・キーバインドはそのまま、名称とロゴだけが置き換わっています。.windsurfrulesやmcp_config.jsonをClaude Codeの設定ファイルへ移す実務手順を、この改称を踏まえて以下に示します。
Windsurfは今どうなっているか
Windsurfというブランド名自体は現在使われていません。アプリ名はmacOSでDevin.app、WindowsでDevin.exe、Linuxでdevinに変わり、設定ファイルの実体パスもWindsurfからDevinへ段階的に移行しています。ただし後方互換のため、旧パス(~/.codeium/windsurf/や.windsurf/)は当面読み込まれ続けます。
エージェント側の変化はさらに大きく影響します。Devin CLIと同じハーネスを共有する「Devin Local」がデフォルトエージェントになり、旧来のチャットエージェント「Cascade」は7月まで併存する扱いです。Devin Localはトークン効率がCascade比で最大30%向上し、サブエージェントの起動やサンドボックス実行に対応する一方、自動生成メモリー(Memories)とワークフローを引き継ぎません。これから移行する読者にとっては、「Windsurfの設定」ではなく「Devin Desktop(Devin Local)の設定」を基準に読み替える必要があります。
設定ファイルの読み替え表
ルールファイルはWindsurf(Devin Desktop)とClaude Codeの両方に存在する概念で、対応関係は比較的素直です。
| Windsurf / Devin Desktop | Claude Code | 備考 |
|---|---|---|
.windsurfrules(ルート直下、単一ファイル) | Claude Code./CLAUDE.md | 備考どちらもプロジェクト直下でチーム共有する前提 |
.windsurf/rules/*.md(複数ファイル) | Claude Code.claude/rules/*.md | 備考1ファイル1トピックの分割方針が共通 |
.devin/rules/(優先。無ければ.windsurf/rules/をフォールバックとして読む) | Claude Code.claude/rules/*.md | 備考Devin Desktop側もルール置き場が.devin/rules/へ移行中 |
~/.codeium/windsurf/memories/global_rules.md | Claude Code~/.claude/CLAUDE.md | 備考全プロジェクト共通の個人設定 |
AGENTS.md | Claude CodeCLAUDE.md(@AGENTS.mdでインポート) | 備考両ツールともAGENTS.mdを認識する数少ない共通フォーマット |
最小の移行手順は次のとおりです。プロジェクト直下に.windsurfrulesがある場合、内容をそのままCLAUDE.mdにコピーすれば動きます。
# .windsurfrules を CLAUDE.md にコピー
cp .windsurfrules CLAUDE.md
git add CLAUDE.mdディレクトリ分割版の.windsurf/rules/*.md(または.devin/rules/)を使っていた場合は、Claude Codeの.claude/rules/に同名でコピーするだけではフロントマターのtriggerが効きません。Windsurf側のtrigger: glob + globs:は、Claude Code側ではpaths:フィールドに書き直す必要があります。
---
paths:
- "src/**/*.test.ts"
---
テストファイルはdescribe/itブロックを使い、外部APIはモックする。Windsurf側は活性化条件をalways_on / model_decision / glob / manualの4種類のfrontmatterキーで指定しますが、Claude Codeの.claude/rules/はこのtrigger系キーを読みません。効くのはpaths:だけで、pathsを書かないファイルは常に常時オン扱いになります。つまりコピーしただけの状態は「グロブ一致のつもりが常時オン」になっている可能性があるため、大きなルールファイルやテスト限定のルールはpathsで明示的に絞り込む書き直しが必須です。
AGENTS.mdはさらに単純です。Windsurf(Devin Desktop)はAGENTS.mdをルートなら常時オン、サブディレクトリなら自動グロブとして読み込みますが、Claude CodeはAGENTS.mdを直接読みません。すでにAGENTS.mdを運用しているリポジトリなら、CLAUDE.mdに1行のインポートを足すだけで両ツールが同じ指示を共有できます。
@AGENTS.md
## Claude Code固有の指示
`src/billing/`配下の変更はplanモードで確認してから実行する。CLAUDE.mdの実用的な書き方はCLAUDE.mdを実用に引き上げる10のパターンにまとめています。
無視ファイルの読み替え
Windsurf(Devin Desktop)には無視ファイルが3種類あります。現行の主ファイルは.devinignoreで、legacy扱いの.codeiumignoreも引き続き読まれ、加えて.windsurfignoreもエージェントが併せて尊重します。いずれもgitignore形式でインデックス対象から外すパスを指定します。Claude Codeには同じ発想の単体ファイルが存在しません。Claude CodeのGlobツールは既定でgitignore対象のファイルも含めて返すため、.gitignoreに載せるだけでは編集・探索対象から外れません。除外するには、.claude/settings.jsonのpermissions.denyを使います。
{
"permissions": {
"deny": [
"Read(./secrets/**)",
"Read(./.env)",
"Edit(./infra/**)"
]
}
}このpermissions.denyは旧来のignorePatterns設定を置き換えたキーで、ReadとEditを別々に拒否できる点がgitignore形式の無視ファイルより細かく制御できます。ファイル探索・検索結果からも該当パスを除外するため、実質的に.windsurfignoreより強い遮断になります。OSレベルでの強制が必要な場合はサンドボックス機能と組み合わせます。設定キー全体の一覧はClaude Code settings.json完全ガイドを参照してください。
MCPサーバー設定の移行
MCPサーバーの設定はもっとも移行コストが低い部分です。Windsurf(Devin Desktop)の~/.codeium/windsurf/mcp_config.jsonとClaude Codeの.mcp.jsonは、どちらもmcpServersオブジェクトの下にcommand / args / envを並べる同じ形式を使っています。
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "<TOKEN>" }
}
}
}このJSONはmcpServersの中身をそのままclaude mcp add-jsonに渡せます。
claude mcp add-json github '{"command":"npx","args":["-y","@modelcontextprotocol/server-github"],"env":{"GITHUB_PERSONAL_ACCESS_TOKEN":"<TOKEN>"}}'チームで共有するなら、プロジェクト直下に.mcp.jsonを作ってmcpServersブロックをそのまま貼り付け、コミットする方法もあります。urlだけが書かれたHTTP/SSEサーバーの場合はtypeフィールドが無いとstdioサーバーとして誤読されるため、"type": "http"を明示してから移す点だけ注意してください。設定コマンドの全体像はClaude Code MCP設定ガイドにまとめています。
Devin Local移行後は挙動が一部変わり、MCPツール呼び出しのたびに承認を求める設定がデフォルトになりました。これはClaude Code側のpermissions.askに近い挙動で、両ツールとも「信頼したサーバーだけ自動承認に格上げする」運用に寄っています。
Hooksの考え方はほぼ共通
Devin Desktopの旧CascadeにはJSON設定でシステムレベル・ユーザーレベル・ワークスペースレベルの3階層に置ける「Hooks」があり、アクション実行前後にシェルコマンドを走らせられます。仕組みはClaude CodeのHooksとほぼ同じで、事前フックがexit code 2を返すとアクションをブロックするという核心部分まで一致しています。
| Windsurf(Cascade)Hooks | Claude Code Hooks |
|---|---|
~/.codeium/windsurf/hooks.json(ユーザー) | Claude Code Hooks~/.claude/settings.jsonのhooksキー |
.windsurf/hooks.json(ワークスペース) | Claude Code Hooks.claude/settings.jsonのhooksキー |
| pre-hook / post-hookの区別 | Claude Code HooksPreToolUse / PostToolUse等のイベント名 |
| stdinにJSONでコンテキストを渡す | Claude Code Hooks同様にJSONをstdin経由で渡す |
| exit code 2でブロック | Claude Code Hooks同じくexit code 2でブロック |
設定ファイルの置き場所がJSON1本かキー1つかの違いはありますが、「シェルコマンドでガードレールを書く」という設計思想はそのまま持ち越せます。lintやフォーマッタを編集後に自動実行するようなフックは、PostToolUseイベントに書き直すだけで移行できます。書き方の実例はClaude Code Hooks完全ガイドにまとめています。
なお、Devin Local(現行のデフォルトエージェント)はCascade Hooksとは別形式のライフサイクルフックを持つため、Windsurf側でも旧Cascade用のhooks.jsonをそのまま使い続けられるとは限りません。移行のタイミングで一度Claude Code側に寄せてしまうほうが、二重管理を避けられます。
権限モデルの読み替え — allow / ask / denyの3段
Devin Local移行後のWindsurf(Devin Desktop)は、旧来の「自動実行レベル」からdeny(拒否)/ ask(都度確認)/ allow(自動承認)の3段ラダー方式に切り替わりました。denyが最優先で、ファイル読み書き・コマンド実行・HTTPフェッチ・MCPツールをそれぞれ個別にスコープできます。
Claude Codeのpermissionsも同じ3段構造(deny → ask → allowの順で評価)を持っており、ルールの書式もTool(specifier)という近い形をしています。
{
"permissions": {
"deny": ["Read(./.env)"],
"ask": ["Bash(git push *)"],
"allow": ["Bash(npm test)"]
}
}「拒否ルールがどのモードでも最優先で効く」という評価順序まで両者は共通しているため、Devin Local側で書いた権限ポリシーの発想はほぼそのままClaude Code側のpermissions.deny / permissions.ask / permissions.allowに置き換えられます。個別のルール構文は/permissionsコマンドで権限ルールを管理するを参照してください。
自動生成メモリーとClaude Codeの自動メモリーの違い
Windsurf(Devin Desktop)のCascadeには、会話中に自動生成される「Memories」があります。ワークスペースに紐づいてローカルに保存され、~/.codeium/windsurf/memories/配下に蓄積される仕組みです。Claude Codeにも同種の「自動メモリー」があり、~/.claude/projects/<project>/memory/配下にMEMORY.mdと話題別ファイルを書き分けます。
両者の設計思想はよく似ていますが、決定的な違いが1つあります。Devin Localはこのメモリー機能を持たず、移行時は「Devin: Open Cascade Migration Wizard」コマンドでSkillsへ手動変換する必要があります。一方Claude Codeの自動メモリーは新しいエージェント(現行のClaude Code本体)でもそのまま機能し続けます。つまりWindsurf側では「エージェントの世代交代でメモリー機能が一度失われる」移行を経験しますが、Claude Code側にはその段差がありません。Cascadeの蓄積メモリーを移す作業が必要なら、要点をCLAUDE.mdに書き写すか、繰り返し使う手順はSub-agents完全ガイドのサブエージェント定義に落とし込むのが現実的です。
よくあるつまずき
「claude importでWindsurfの設定を自動移行できないか」
Claude Codeの/importコマンド(claude import)はOpenAI Codex・Google Gemini CLI・Cursorの3つにのみ対応しており、Windsurf(Devin Desktop)は対象外です。ただし/importとは別に、CLAUDE_CODE_NEW_INIT=1を指定して/initを実行すると、.windsurfrulesや.windsurf/rules/(.devin/rules/を含む)を自動的に読み取ってCLAUDE.mdへ取り込む半自動の経路があります。この経路でカバーしきれない細部は、本記事の読み替え表に沿って手動で補うことになります。
「windsurf.comにアクセスすると別サイトに転送される」
これは不具合ではありません。変更履歴とドキュメントの閲覧がdocs.devin.aiへ移った結果です。エンタープライズ管理者は、ログインとバイナリ配布は引き続きwindsurf.com/enterpriseやcodeiumdata.comで行われる一方、変更履歴とドキュメントの閲覧はdocs.devin.aiに移っている点を社内の許可リスト(allowlist)に反映する必要があります。
「MDMポリシーでアプリがブロックされる」
社内の端末管理ポリシーがアプリ名をWindsurfで許可している場合、名称変更後はDevin.app / Devin.exeとして弾かれることがあります。移行のタイミングでIT部門の許可リストにもDevinを追加してもらう調整が要ります。
「グローバルルールファイルが6,000文字を超えて反映されない」
global_rules.mdは6,000文字、.windsurf/rules/*.mdは1ファイル12,000文字の上限があります。Claude Code側の~/.claude/CLAUDE.mdには文字数上限こそありませんが、長いファイルほどコンテキストを消費し指示への追随度が下がるとされています。上限超過を機に内容を.claude/rules/へ分割する移行は文字数上限の問題を解消しますが、読み込み量そのものを減らせるのはpaths:を指定したルールだけです。pathsの無いルールファイルは起動時に全量読み込まれるため、分割してもファイルを増やしただけになる場合がある点に注意してください。
まとめ
WindsurfからClaude Codeへの移行は、設定ファイルの読み替えだけを見れば.windsurfrules→CLAUDE.md、mcp_config.json→.mcp.jsonという単純な対応で完了します。ただし移行元自体がDevin Desktopへ改称され、内部エージェントもCascadeからDevin Localへ切り替わっている点を踏まえないと、「何を移行しているのか」の前提がずれます。ルールファイルとMCP設定は形式互換に近く移行コストが低い一方、無視ファイルはpermissions.denyへの書き直しが必要で、自動生成メモリーはWindsurf側でも一度Skillsへの手動移行を挟む過渡期にあります。移行の優先順位はこの3段階(ルール→MCP→無視ファイル)で進めるのが取りこぼしの少ない順番です。