Roo CodeからClaude Codeへの移行 — カスタムモードの引き継ぎ方
Roo Codeのカスタムモード(roleDefinition・groups・.roomodes)をClaude CodeのOutput styleとSub-agentsにどう分けて移すかを、対応表と設定例で整理しました。
はじめに
Claude Codeにはカスタムモードに相当する単独の機能はありません。planなどの権限モードはありますが、これはツール権限の動作を切り替えるもので、人格を定義するRoo Codeのモードとは別物です。移行先は1つに決まらず、roleDefinitionやgroupsといったプロパティごとに行き先が分かれます。
最も近いのはclaude --agent <name>(またはagent設定)です。メインスレッド自体がsub-agentのシステムプロンプト・ツール制限・モデルを引き継ぐので、モードを切り替えたときの「人格とツール権限が同時に変わる」動きに重なります。本記事はカスタムモード定義(roleDefinition / groups / .roomodes)を、--agent、Output style、Sub-agentsへ振り分ける手順を設定例つきで示します。
移行ツールはあるか — claude importの対象にRoo Codeは入っていない
Claude Codeには他のコーディングエージェントの設定を取り込むclaude importがあります。v2.1.287のclaude import --helpは、対象を次のように示します。
Usage: claude import [options] [source]
Import config from another AI coding agent into Claude Code
Arguments:
source Which agent to import from (codex, gemini, cursor)
Options:
--dry-run Show what would be imported without writing anything
-h, --help Display help for command
--yes Skip the interactive picker. On headless surfaces, pass
--yes=<digest> from the `/import` preview.取り込めるのはCodex・Gemini CLI・Cursorで、Roo Codeは含まれません。.roomodesや.roo/rules-*を自動で変換する手段は無く、この記事の対応表に沿って手で移すことになります。
1つのモードをどの機能に移すか
Roo Codeのモードはslug / name / description / roleDefinition / whenToUse / customInstructions / groupsの1セットで、切り替えると会話全体の人格とツール権限が変わります。Claude Codeではこの1セットが性質ごとに3つの機能へ分かれます。
モードの性質ごとの移行先
人格もツール権限もまとめて切り替えたい
--agent <name>またはagent設定。セッション起動時に指定し、そのセッション全体に効きます。再開(resume)したときも引き継がれます。口調・文体だけ変えたい
Output style。応答スタイルが変わるだけで、ツール権限は変わりません。
作業を切り出して任せたい
Sub-agentsの通常呼び出し。独立したコンテキストで実行し、要約だけを返します。メインの会話は別の作業を続けられます。
切り替えのタイミングは同じではありません。Roo Codeは会話の途中でモードを切り替えられます。--agentは起動時に指定します。会話の途中で持ち替えるスラッシュコマンドは、コマンド一覧にありません。途中で役割を変えたいときは、メインの会話からSub-agentへ作業を委任します。
Output styleとCLAUDE.md・Skillsの使い分けはClaude Codeのoutput styleとCLAUDE.md・Skillsは何が違うかで扱っています。
1つのモードを移す手順
docs-writerモードを例に、移行の流れを追います。
docs-writerモードの移行
- 1
モードの中身を3つに仕分ける
roleDefinitionとcustomInstructionsは人格(本文)、groupsとfileRegexはツール制限、whenToUseは呼び出し条件です。 - 2
.claude/agents/ にファイルを作る
仕分けた結果を1つのMarkdownファイルにまとめます(次節の例)。モデルを固定したい場合は
modelも書きます。 - 3
--agent で起動して挙動を見る
claude --agent docs-writerで、セッション全体がこのエージェントとして動きます。
Roo CodeにはSticky Modelsがあり、モードごとに最後に使ったモデルを記憶して自動で選びます。Claude Codeのmodelフロントマター(sonnetなど)は、記憶ではなくエージェント定義にモデルを固定する書き方です。
roleDefinitionとcustomInstructionsをOutput styleに移す
口調だけを切り替えたい場合の対応先はOutput styleです。roleDefinition(人格)とcustomInstructions(追加指示)は、Output styleのMarkdown本文にそのまま入ります。
customModes:
- slug: docs-writer
name: "Documentation Writer"
roleDefinition: "You are a technical writer specializing in clear documentation."
whenToUse: "Use this mode for writing and editing documentation."
customInstructions: "Focus on clarity and completeness in documentation."
groups: ["read", "edit"]---
name: Documentation Writer
description: Focus on clarity and completeness in documentation.
keep-coding-instructions: false
---
You are a technical writer specializing in clear documentation.
Focus on clarity and completeness in documentation.nameとdescriptionは/configの選択メニューに表示されます。keep-coding-instructionsはRoo Codeに無いフィールドで、Claude Codeが持つソフトウェア開発向けの組み込み指示を残すかを決めます。省略するとfalseで、スタイルを適用した時点でコードのスコープの絞り方・コメントの書き方・検証の進め方といった指示が外れます。ドキュメント執筆のモードならfalseのままで問題なく、コーディングの進め方は変えずに口調だけ変えるならtrueにします。
切り替えは/output-style <name>(v2.1.269以降)か、/configのOutput styleから行います。旧バージョンでは/configのみです。どちらも選択を.claude/settings.local.jsonに保存します。ターミナルではスタイルファイルを起動時に読み込むため、作成・編集した直後は再起動が必要です。書き方の全体像はClaude Code output styleの切り替えは/configで行うにあります。
groupsとwhenToUseをSub-agentに移す
ツール制限を伴うモードは、.claude/agents/のSub-agentに移します。groupsのread / editはtoolsフロントマターのツール名(Read / Grep / Glob / Edit / Write)に置き換わります。
---
name: docs-writer
description: ドキュメントの執筆・編集を行う。Markdownファイルの新規作成や既存ドキュメントの更新を頼まれたときに使う。
tools: Read, Grep, Glob, Edit, Write
model: sonnet
---
あなたはドキュメント作成に特化したライターです。明快さと網羅性を重視してください。whenToUseはdescriptionに相当します。Roo CodeのwhenToUseは主にモード選択とOrchestratorの振り分けに使う補助情報でしたが、Claude Codeではdescriptionが委任判断の中心です。「〜を頼まれたときに使う」と具体的なトリガーを書いた方が委任の精度が上がり、曖昧な記述は委任されない原因になります。
この1ファイルは通常のSub-agentとしても、--agentの起動先としても使えます。通常の呼び出しでは、タスクだけが別コンテキストで走って結果が返り、メインの会話の人格は変わりません。Roo Codeからの移行者が最初につまずくのは、これを「モード切り替え」と思って使う点です。
fileRegexは3通りの近似で置き換える
Roo CodeはeditグループにfileRegexを付けて、Markdownしか編集できないモードのような制限を作れます。
groups:
- read
- - edit
- fileRegex: \.(md|mdx)$
description: Markdown files onlySub-agentのtoolsはツール名単位の制御で、パスの正規表現は書けません。近似は強制力の違う3つです。
編集を止められる2つの代替
Sub-agentのhooks
PreToolUseフックでEdit・Writeの対象パスを検査し、条件外ならexit code 2でブロックします。任意の正規表現を使えます。
permissions.deny
Edit(**/*.ts)のようなグロブで編集を拒否します。設定は簡単ですが、--agentで起動したエージェントだけでなくセッション全体に効きます。また、denyは拒否するものを並べる仕組みなので、「Markdown以外すべて」を1行では書けません。Edit(**/*.ts)が止めるのは.tsだけです。
もう1つの.claude/rules/*.mdのpathsフロントマターは、対象ファイルを開いたときだけ指示を読み込む仕組みです。「このパスではこう書く」という指針にはなりますが、編集を拒否する強制力はありません。
hooksでfileRegex相当を作る例を示します。フックはJSONを標準入力で受け取り、tool_input.file_pathにパスが入ります。
#!/bin/bash
f=$(jq -r '.tool_input.file_path // empty')
case "$f" in
*.md|*.mdx|"") exit 0 ;;
*) echo "このエージェントが編集できるのはMarkdownだけです: $f" >&2; exit 2 ;;
esac---
name: architect
description: 設計の検討と計画書の作成を行う。コードは編集せず、Markdownだけを書く。
tools: Read, Grep, Glob, Edit, Write
hooks:
PreToolUse:
- matcher: "Edit|Write"
hooks:
- type: command
command: "${CLAUDE_PROJECT_DIR}/.claude/hooks/md-only.sh"
---フックのスクリプトには実行権限が要るので、chmod +x .claude/hooks/md-only.shを実行しておきます。スクリプトは、フックが受け取るJSONをechoで流し込めば単体で試せます。.mdのパスは終了コード0で通り、.tsのパスは終了コード2で止まって、標準エラーに理由が出ました。
echo '{"tool_input":{"file_path":"/x/docs/a.md"}}' | .claude/hooks/md-only.sh; echo $?
echo '{"tool_input":{"file_path":"/x/src/app.ts"}}' | .claude/hooks/md-only.sh; echo $?0
このエージェントが編集できるのはMarkdownだけです: /x/src/app.ts
2組み込みモードの移し先
Roo Codeの組み込み5モードにも、Claude Code側の対応先があります。
| Roo Code(組み込み) | ツールアクセス | Claude Codeでの対応 |
|---|---|---|
| Code | ツールアクセス制限なし | Claude Codeでの対応通常のセッション |
| Ask | ツールアクセスread / mcpのみ | Claude Codeでの対応planモード |
| Architect | ツールアクセスread / mcp + Markdownのみ編集 | Claude Codeでの対応上のarchitectエージェント(--agentでも通常呼び出しでも使える) |
| Debug | ツールアクセス全ツール(分析→絞り込み→ログ追加→修正前に確認の手順) | Claude Codeでの対応デバッグ用のSub-agentを自作 |
| Orchestrator(Boomerang) | ツールアクセス直接のツールなし、new_taskで他モードへ委任 | Claude Codeでの対応メイン会話そのもの |
Debugは、Roo Codeの既定が持つ手順をSub-agentの本文に書き写すと、挙動が近くなります。Orchestratorは専用モードへの切り替えが要らなくなります。Claude Codeではメインの会話が最初からAgentツールでSub-agentに作業を委任できるため、Orchestratorへ切り替える操作は要りません。委任先は、Claudeが各Sub-agentのdescriptionを見て選びます。claude --agentで起動したメインスレッドなら、toolsにAgent(worker, researcher)のように書いて、起動できるSub-agentの種類を絞れます。Orchestratorが委任先のモードを選ぶ動きに近づける手段です。この絞り込みは--agentのメインスレッドだけに効き、Sub-agent定義の中に書いても種類の指定は無視されます。
Roo Codeでは組み込みモードと同じslugのカスタムモードを作ると、その組み込みモードを上書きできます。Claude Codeにも似た仕組みがあり、Exploreという名前のユーザーまたはプロジェクトのSub-agentは組み込みのExploreを置き換えます。たとえばmodel: haikuを書いたExploreを置くと、調査に使うモデルを軽いものに固定できます。
モード別ルールと設定ファイルの置き場所
Roo Codeはモードごとに.roo/rules-{slug}/(単一ファイルなら.roorules-{slug})を持ち、そのモードが有効なときだけ追加の指示を読み込みます。.roo/rules-{slug}/の中はサブディレクトリも含めて再帰的に読まれ、ファイル名のアルファベット順で連結されます。
Claude CodeのSub-agentにこの専用ディレクトリはありません。ルールは本文に直接書くか、複数ファイルに分けていた場合はskillsフィールドでSkillを指定して、起動時にまとめて読み込ませます。全モード共通のルールは次のように対応します。
| Roo Code | Claude Code |
|---|---|
.roomodes(プロジェクト、YAML/JSON) | Claude Code.claude/agents/*.md(1ファイル1エージェント) |
custom_modes.yaml(グローバル) | Claude Code~/.claude/agents/*.md |
.roo/rules-{slug}/*.md | Claude CodeSub-agent本文、またはskillsでのSkill読み込み |
.roo/rules/*.md / .roorules | Claude CodeCLAUDE.md / .claude/rules/*.md |
~/.roo/rules/ | Claude Code~/.claude/rules/ |
| PromptsタブのGlobal Custom Instructions | Claude Code~/.claude/CLAUDE.md |
同名のものが複数あるときの扱いは、Roo Codeでは.roomodesのモードがグローバルの同slugを全プロパティごと置き換えます。Claude Codeはスコープの優先順で1つが選ばれます。高い順にmanaged settings、--agentsフラグ、プロジェクトの.claude/agents/、ユーザーの~/.claude/agents/、プラグインです。プロパティ単位のマージはしないので、部分的に上書きしたいときも定義を丸ごと書きます。
Roo Codeは複数のモードを.roomodes1本の配列にまとめますが、Claude Codeは1エージェント1ファイルです。.claude/agents/は再帰的に走査され、識別に使われるのはフロントマターのnameだけなので、agents/writing/docs-writer.mdのように分類して置けます。同じnameが同じ.claude/agents/配下に2つあると、読み込まれるのは1つだけで、どちらかは保証されません。/doctorで重複を検出できます。Sub-agentの設計はClaude Code Sub-agents完全ガイドで扱っています。
モードの共有 — エクスポート機能の代わり
Roo CodeにはモードをYAML1本にエクスポートしてチームに渡す機能があり、モード専用のルールファイルも一緒に保存されます。Claude Codeのエージェント定義は1ファイルずつのMarkdownなので、共有もファイル単位になります。方法は2つあります。
- リポジトリで共有する:
.claude/agents/と.claude/output-styles/はどちらもMarkdownなので、チェックインすればチーム全員に届く - プラグインで配る: プラグインの
agents/ディレクトリに置けば、有効にした環境で使える。ただし上のとおりフック付きのエージェントには向かない
よくあるつまずき
フック付きのエージェントでは、次の3点が設定時の落とし穴になります。
ブロックが効いていないのに気づかない
プロジェクトの.claude/agents/に置いたエージェントのフックは、そのフォルダのワークスペース信頼ダイアログを承認するまで動きません。承認前もエージェント自体は動くため、ブロックが効いていないことに気づきにくくなります。
プラグインで配ると設定が落ちる
プラグインで配るSub-agentはhooks / mcpServers / permissionModeを無視します。フック付きのエージェントを共有するときは、プラグインではなく.claude/agents/に置きます。
フックのスクリプトが動かない
md-only.shはjqが前提で、実行権限も要ります。jqが無い環境では、パスを取り出せないままEditとWriteが素通りします。
まとめ
最初に移すのは1モードだけにして、claude --agentで起動し、挙動を確かめてから広げます。fileRegexを使っていたモードは、フックがワークスペース信頼の承認後に実際にブロックしているかを先に試します。fileRegexの代わりにセッション全体で拒否してよいなら、permissions.denyでも足ります。