機能
既存の環境のコピー
このページは英語から機械翻訳されています。修正を歓迎します。 GitHubでこのページを編集
このページの内容
ccamを使う前からClaude Codeを使っていた場合、環境は~/.claudeと~/.claude.jsonにあります。ccam migrateはそれを共有グループにコピーするので、グループを通じてそれらの項目を共有するすべてのアカウントが、これまでと同じ環境で使い始められます。コピー元のフォルダーは読み取るだけで、通常のclaudeもこれまでどおり動作します。最初のccam addの後に一度実行し、アカウントがMCPサーバーの共有を始めるたびにもう一度実行してください。
使い方
ccam migrate # ~/.claude into group default, checklist on a terminal
ccam --dry-run migrate # show the plan, copy nothing
ccam migrate --settings --mcp # only these items, no checklist
ccam migrate --history --yes # conversation history only, no questions
ccam migrate ~/.claude-work --group workターミナルで、項目のフラグも--yesも付けずに実行すると、ccamは最初にチェックリストを表示します。
Copy into group default
From /home/me/.claude
? Choose what to copy (Space to toggle)
› [x] MCP servers
[x] settings.json
[x] global CLAUDE.md
[x] agents, commands, skills
[ ] conversation history
Enter show the plan · Esc cancelSpaceキー(またはx)でカーソル位置の項目を切り替え、矢印キーかj/kで移動し、Enterキーで計画を表示します。Esc、q、Ctrl+Cを押すとCancelled.と表示されます。コピー元に該当するものがない項目にはnot foundと表示されます。すべてのチェックを外すと、ccamはNothing selected.と表示して終了します。
続いてccamは計画を表示し、コピーする前に確認を求めます。
$ ccam migrate --yes
Copy from /home/me/.claude into group default (/home/me/.local/share/ccam/groups/default):
mcp ~/.claude.json new: fs, linear
sign-ins linear → personal; skipped: work (not logged in yet)
settings settings.json new: 61 B
memory CLAUDE.md new: 11 B
extensions agents/ add 1 file the group lacks (6 B)
skills/ add 1 file the group lacks (13 B)
not found, skipped: commands/, plugins/, output-styles/, rules/
Conversation history (projects/, history.jsonl) is not included; add --history to copy it.
✓ Copied into group default: 2 MCP servers, settings.json, CLAUDE.md, agents/, skills/, MCP sign-ins for personal
MCP sign-ins were not copied to: work (not logged in yet). Sign in to those servers there with /mcp.
Accounts that share these through group default:
mcp personal, work
settings personal, work
memory personal, work
extensions personal, workグループの内容が届くのは、そのグループを通じて項目を共有しているアカウントだけなので、概要では項目ごとにそのアカウントを一覧表示します。共有していないアカウントについては、共有を有効にするccam share <name> --<item> onコマンドを表示します。
オプション
| オプション | 効果 | デフォルト |
|---|---|---|
[folder] |
コピー元のClaude Codeのフォルダー | ~/.claude |
--settings |
settings.jsonをコピーします |
オフ |
--memory |
グローバルのCLAUDE.mdをコピーします |
オフ |
--extensions |
agents/、commands/、skills/、plugins/、output-styles/、rules/をコピーします |
オフ |
--mcp |
ユーザーのMCPサーバー(.claude.jsonのmcpServers)をコピーします |
オフ |
--history |
会話履歴(projects/、history.jsonl)をコピーします |
オフ |
-g、--group string |
コピー先の共有グループ | default |
-y、--yes |
確認なしでコピーします。競合した場合はグループのコピーを残します | オフ |
--dry-run(グローバル) |
計画を表示し、確認やコピーの前に終了します | オフ |
項目のフラグを付けない場合、ターミナルではチェックリストで決めます。ターミナル以外の場合や--yesを付けた場合、ccamは会話履歴以外のすべてをコピーします。projects/は大きくなることがあるため、履歴はデフォルトで除外されます。
--group onはdefaultを意味します。--group offと--group localは--group takes a group name, not "off"で拒否されます。ccam migrateは--dry-runに対応しています。ドライランでもチェックリストは表示されるので、選択内容をプレビューできます。
しくみ
internal/cli/migrate.goが項目を選び、migrate.Buildがコピー元とグループを読み取って計画を返します。確認した後のPlan.Applyまで、何も書き込まれません。
- コピー元を見つける。
checkSourceは、存在しないパス、フォルダーではないパス、Claude Codeの既知の項目が1つもないパスを拒否します。migrate.ClaudeJSONは、そのフォルダーに対応する.claude.jsonを見つけます。フォルダー内にあればそれを使い、~/.claudeの中にない場合は、その隣の~/.claude.jsonを使います。CLAUDE_CONFIG_DIRが設定されていない場合、Claude Codeはそこにこのファイルを置きます。 - 項目をパスに対応付ける。 すべてのパスは、
ccam shareが使うのと同じ許可リストであるshare.Layoutから取得します。MCPサーバーはmcp.LocalServersで.claude.jsonから読み取ります。これはファイル全体を解析せず、profile.TopLevelValueスキャナーを使います。 - 移動せず、コピーする。 ファイルは
fsutil.AtomicWriteかfsutil.CopyFileで~/.local/share/ccam/groups/<group>/にコピーし、MCPサーバーはグループのmcp.jsonに入れます。
各項目は、1つのコピー元のパスを1つのグループのパスに対応付けます。
履歴の2行が破線になっているのは、--historyを付けた場合だけコピーされるためです。.credentials.jsonと.claude.jsonはshare.Neverに含まれており、グループに届くことはありません。万一これらがレイアウトに現れた場合、Buildは内部エラーを返します。フォルダーをたどる処理でも、名前でこれらをスキップします。
buildEntryはすべてのパスに状態を割り当てます。計画の各行が説明しているのはこの状態です。
- Missing: コピー元にないか、フォルダーがあるべき場所にファイルがあります。項目ごとに1回、
not found, skippedとして表示されます。 - Linked: コピー元のパスがすでにグループのコピーを指しています。たとえば、コピー元がccamのプロファイルフォルダーの場合です。
- Same: グループにすでに同じ内容があります。
- New: グループにないので、そのまま全体をコピーします。
- Merge: 両方にフォルダーがあります。
copyMissingはグループにないファイルだけを追加します。内容が異なるファイルはグループのまま残り、計画にはgroup copies keptと表示されます。plugins/の場合は、レジストリのinstalled_plugins.jsonとknown_marketplaces.jsonをマージし、プラグインの絶対パスをグループのフォルダーを指すように書き換えます。 - Conflict: 両方に内容の異なるファイルがあります。ファイルごとに
keep groupかuse mineを選びます。.jsonファイルではmerge JSON(値が衝突した場合はグループが優先されるディープマージ)、history.jsonlではmerge by lineも選べます。定義が異なるMCPサーバーも競合として扱われ、keep groupかuse mineを選びます。Enterキーを押したときのデフォルトは、最初に表示される選択肢です。--yesでは常にグループのコピーを残します。
チェックリスト自体はtui.MigratePickerで、ccam addが使うchecklistコンポーネントで作られています。migrate.Foundは、lstatの呼び出しとMCPサーバーの一覧を使って、見つからない項目に印を付けます。
MCPのサインイン情報
OAuthでサインインするMCPサーバーは、トークンをサーバーの一覧ではなく、ログインファイルである.credentials.jsonのmcpOAuthに保存します。Claude Codeは各項目のキーを、<name>|に、サーバーのtype、url、headersのsha256ハッシュの先頭16文字を続けたものにしています。キーはフォルダーに依存しないので、サーバーの定義が同じであれば、コピーした項目は別のアカウントでも機能します。そのため、internal/migrate/logins.goのbuildLoginsは、最終的にグループがコピー元の定義で持つことになるサーバー、つまり新規のもの、すでに同じもの、競合してuse mineを選んだものの項目だけをコピーします。プラグインのサーバーのサインイン情報(キーがplugin:で始まるもの)は、拡張機能をコピーし、コピー元にplugins/がある場合に一緒にコピーされます。
項目は、受け取る各アカウント自身の.credentials.jsonに、fsutil.AtomicWriteを使ってモード0600で書き込まれます。グループに入ることはありません。アカウントが受け取るのは、対象のグループを通じてmcp(プラグインのサーバーの場合はextensions)を共有している場合だけで、追加されるのはそのアカウントにないキーだけです。すでにある項目は、より新しいものかもしれないので残します。計画のsign-insの行には、サーバー、受け取るアカウント、スキップしたアカウントが表示されます。ccamは、次のアカウントをスキップし、その名前と理由を表示します。
ccam importでその場所のまま登録したアカウント。通常のclaudeがそのログインファイルを使っている可能性があるためです。- 実行中のアカウント。Claude Codeがログインファイルを書き換えるためです(書き込む直前にもう一度確認し、
started meanwhileとして報告します)。 - まだログインしていないアカウント。
- ログインをmacOSのキーチェーンに保存しているアカウント。ccamはキーチェーンに書き込みません。
スキップしたアカウントでは、/mcpでサーバーにサインインしてください。あとからMCPサーバーの共有を始めたアカウントには、ccam migrateをもう一度実行するとサインイン情報がコピーされます。概要にはThen run `ccam migrate` again to give them the MCP sign-ins too.と表示されます。
安全性と特殊なケース
- コピー元は読み取るだけです。中のファイルを移動、リンク、変更することはなく、コピー元のログインに書き込むこともありません。キーチェーンから読み取ることがあるmacOSでも同様です。
use mine、マージ、既存のmcp.jsonへの新しいMCPサーバーの追加でグループのファイルを置き換える前に、グループのコピーを<group>/.ccam-backup/<time>/に保存します。フォルダー名は実行ごとに一意なので、同じ秒に2回実行してもバックアップが上書きされることはありません。概要にそのパスが表示されます。--yesではすべての競合でグループのコピーを残し、代わりに選ぶ方法として、同じコマンドを--yesなしで実行するよう案内します。- 何も変わらない場合は
Nothing to copy.と表示し、すべての競合でグループのコピーを残す場合はNothing to copy: the group keeps its own copies.と表示します。 - コピーが途中で失敗した場合、ccamは
The source folder was not changed. Group files replaced so far are saved inに続けてバックアップフォルダーを表示し、終了します。 - コピー元がない場合は
no Claude Code folder at <path>. Give the folder to copy from: ccam migrate <folder>で終了します。