機能

既存の環境のコピー

最終更新日: 2026年10月19日
ccam 0.6.0とClaude Code 2.1.302で確認済み

このページは英語から機械翻訳されています。修正を歓迎します。 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 cancel

Spaceキー(または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まで、何も書き込まれません。

  1. コピー元を見つける。 checkSourceは、存在しないパス、フォルダーではないパス、Claude Codeの既知の項目が1つもないパスを拒否します。migrate.ClaudeJSONは、そのフォルダーに対応する.claude.jsonを見つけます。フォルダー内にあればそれを使い、~/.claudeの中にない場合は、その隣の~/.claude.jsonを使います。CLAUDE_CONFIG_DIRが設定されていない場合、Claude Codeはそこにこのファイルを置きます。
  2. 項目をパスに対応付ける。 すべてのパスは、ccam shareが使うのと同じ許可リストであるshare.Layoutから取得します。MCPサーバーはmcp.LocalServersで.claude.jsonから読み取ります。これはファイル全体を解析せず、profile.TopLevelValueスキャナーを使います。
  3. 移動せず、コピーする。 ファイルは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>で終了します。