Funkcje
Kopiowanie istniejącej konfiguracji
Ta strona została przetłumaczona maszynowo z angielskiego. Poprawki są mile widziane. Edytuj tę stronę na GitHub
Jeśli używałeś Claude Code przed ccam, twoja konfiguracja jest w ~/.claude i ~/.claude.json. ccam migrate kopiuje ją do grupy współdzielenia, więc każde konto, które współdzieli te elementy przez grupę, zaczyna z konfiguracją, którą już masz. Folder źródłowy jest tylko odczytywany, a zwykłe claude działa jak dotąd. Uruchom polecenie raz po pierwszym ccam add i ponownie za każdym razem, gdy jakieś konto zacznie współdzielić serwery MCP.
Użycie
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 workW terminalu, bez opcji elementów i bez --yes, ccam najpierw pokazuje listę wyboru:
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 cancelSpacja (lub x) przełącza element pod kursorem, strzałki lub j/k przesuwają kursor, Enter pokazuje plan, a Esc, q lub Ctrl+C wypisuje Cancelled.. Elementy, dla których źródło nic nie zawiera, są oznaczone jako not found. Jeśli odznaczysz wszystko, ccam wypisuje Nothing selected. i kończy działanie.
Następnie ccam wypisuje plan i pyta o zgodę przed kopiowaniem:
$ 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, workGrupa dociera tylko do kont, które współdzielą przez nią dany element, więc podsumowanie wymienia je osobno dla każdego elementu. Dla kont, które tego nie robią, ccam wypisuje polecenia ccam share <name> --<item> on, które włączają współdzielenie.
Opcje
| Opcja | Działanie | Domyślnie |
|---|---|---|
[folder] |
Folder Claude Code, z którego kopiować | ~/.claude |
--settings |
Kopiuje settings.json |
wyłączone |
--memory |
Kopiuje globalny CLAUDE.md |
wyłączone |
--extensions |
Kopiuje agents/, commands/, skills/, plugins/, output-styles/, rules/ |
wyłączone |
--mcp |
Kopiuje serwery MCP użytkownika (mcpServers w .claude.json) |
wyłączone |
--history |
Kopiuje historię rozmów (projects/, history.jsonl) |
wyłączone |
-g, --group string |
Grupa współdzielenia, do której kopiować | default |
-y, --yes |
Kopiuje bez pytania; przy konflikcie zachowywana jest kopia grupy | wyłączone |
--dry-run (globalna) |
Wypisuje plan i zatrzymuje się przed jakimkolwiek pytaniem lub kopiowaniem | wyłączone |
Bez opcji elementów w terminalu decyduje lista wyboru. Poza terminalem albo z --yes ccam kopiuje wszystko oprócz historii rozmów. Historia jest domyślnie pomijana, bo projects/ może być duże.
--group on oznacza default. --group off i --group local są odrzucane komunikatem --group takes a group name, not "off". ccam migrate respektuje --dry-run, a lista wyboru pojawia się także przy próbnym uruchomieniu, więc możesz podejrzeć wybór.
Jak to działa
internal/cli/migrate.go wybiera elementy, a potem migrate.Build odczytuje źródło i grupę i zwraca plan. Nic nie jest zapisywane przed Plan.Apply, czyli przed twoim potwierdzeniem.
- Znalezienie źródła.
checkSourceodrzuca ścieżkę, która nie istnieje, nie jest folderem albo nie zawiera żadnego znanego wpisu Claude Code.migrate.ClaudeJSONznajduje.claude.jsonnależący do folderu: w jego wnętrzu albo, dla~/.claudebez takiego pliku w środku,~/.claude.jsonobok niego. Tam Claude Code trzyma ten plik, gdyCLAUDE_CONFIG_DIRnie jest ustawione. - Przypisanie elementów do ścieżek. Każda ścieżka pochodzi z
share.Layout, tej samej listy dozwolonych ścieżek, której używaccam share. Serwery MCP są odczytywane z.claude.jsonprzezmcp.LocalServers, które używa skaneraprofile.TopLevelValuezamiast parsować cały plik. - Kopiowanie, nigdy przenoszenie. Pliki trafiają do
~/.local/share/ccam/groups/<group>/przezfsutil.AtomicWritelubfsutil.CopyFile; serwery MCP trafiają domcp.jsongrupy.
Każdy element przypisuje jedną ścieżkę źródłową do jednej ścieżki grupy:
Dwa wiersze historii są przerywane, bo są kopiowane tylko z --history. .credentials.json i .claude.json znajdują się w share.Never i nigdy nie trafiają do grupy: Build zwraca błąd wewnętrzny, jeśli któryś z nich kiedykolwiek pojawi się w układzie, a przeglądanie folderu pomija je po nazwie.
buildEntry nadaje każdej ścieżce stan, który opisuje odpowiedni wiersz planu:
- Missing: nie ma jej w źródle albo jest plikiem tam, gdzie oczekiwano folderu. Wymieniana raz na element jako
not found, skipped. - Linked: ścieżka źródłowa już prowadzi do kopii grupy, na przykład gdy źródłem jest folder profilu ccam.
- Same: grupa ma już identyczną zawartość.
- New: grupa jej nie ma, więc jest kopiowana w całości.
- Merge: folder po obu stronach.
copyMissingdodaje tylko pliki, których grupa nie ma; pliki, które się różnią, zostają w wersji grupy, a plan podajegroup copies kept. Dlaplugins/rejestryinstalled_plugins.jsoniknown_marketplaces.jsonsą scalane, a bezwzględne ścieżki wtyczek przepisywane tak, żeby wskazywały folder grupy. - Conflict: plik po obu stronach z różną zawartością. Wybierasz dla każdego pliku:
keep group,use mine, a do tegomerge JSONdla plików.json(głębokie scalenie, w którym przy sprzecznych wartościach wygrywa grupa) lubmerge by linedlahistory.jsonl. Serwer MCP o innej definicji też jest konfliktem, z wyboremkeep grouplubuse mine. Pierwszy wymieniony wybór jest domyślny po naciśnięciu Enter;--yeszawsze zachowuje kopię grupy.
Sama lista wyboru to tui.MigratePicker, zbudowany na komponencie checklist, którego używa ccam add; migrate.Found oznacza brakujące elementy na podstawie wywołań lstat i listy serwerów MCP.
Logowania MCP
Serwery MCP logujące się przez OAuth przechowują swoje tokeny w pliku logowania, .credentials.json pod kluczem mcpOAuth, a nie na liście serwerów. Claude Code tworzy klucz każdego wpisu jako <name>| plus pierwsze 16 znaków skrótu sha256 z type, url i headers serwera. Klucz nie zależy od folderu, więc skopiowany wpis działa na innym koncie, o ile definicja serwera jest identyczna. Dlatego buildLogins w internal/migrate/logins.go kopiuje tylko wpisy serwerów, które ostatecznie trafią do grupy w definicji ze źródła: nowych, już identycznych albo w konflikcie, w którym wybrałeś use mine. Logowania serwerów wtyczek (klucze zaczynające się od plugin:) są kopiowane razem z rozszerzeniami, gdy źródło ma plugins/.
Wpisy trafiają do własnego .credentials.json każdego konta odbierającego, zapisywanego przez fsutil.AtomicWrite z uprawnieniami 0600. Nigdy nie trafiają do grupy. Konto dostaje je tylko wtedy, gdy współdzieli mcp (albo, dla serwerów wtyczek, extensions) przez grupę docelową, i dodawane są tylko klucze, których nie ma: wpisy, które już ma, być może nowsze, zostają. Wiersz planu sign-ins wymienia serwery, konta odbierające i konta pominięte. ccam pomija konto i podaje jego nazwę z przyczyną, gdy konto:
- jest zarejestrowane w miejscu przez
ccam import, bo zwykłeclaudemoże używać jego pliku logowania; - jest uruchomione, bo Claude Code przepisuje jego plik logowania (sprawdzane ponownie tuż przed zapisem, zgłaszane jako
started meanwhile); - nie jest jeszcze zalogowane;
- przechowuje login w pęku kluczy macOS, do którego ccam nie zapisuje.
Na pominiętym koncie zaloguj się do serwerów przez /mcp. Konto, które zacznie współdzielić serwery MCP później, dostanie logowania, gdy ponownie uruchomisz ccam migrate; podsumowanie przypomina o tym komunikatem Then run `ccam migrate` again to give them the MCP sign-ins too.
Bezpieczeństwo i przypadki brzegowe
- Źródło jest tylko odczytywane. Żaden plik w nim nie jest przenoszony, linkowany ani zmieniany, a login źródła nigdy nie jest zapisywany, także na macOS, gdzie może być odczytywany z pęku kluczy.
- Zanim plik grupy zostanie zastąpiony, przez
use mine, scalenie albo nowe serwery MCP w istniejącymmcp.json, kopia grupy jest zapisywana w<group>/.ccam-backup/<time>/. Nazwa folderu jest unikalna dla każdego uruchomienia, więc dwa uruchomienia w tej samej sekundzie nie nadpisują sobie kopii zapasowych. Podsumowanie wypisuje ścieżkę. - Z
--yeskażdy konflikt zachowuje kopię grupy, a ccam podpowiada, jak zamiast tego wybrać: uruchom to samo polecenie bez--yes. - Jeśli nic by się nie zmieniło, ccam wypisuje
Nothing to copy.; jeśli każdy konflikt zachowuje kopię grupy,Nothing to copy: the group keeps its own copies. - Jeśli kopiowanie przerwie się w połowie, ccam zatrzymuje się z komunikatem
The source folder was not changed. Group files replaced so far are saved in, po którym następuje folder kopii zapasowej. - Brak źródła kończy się komunikatem
no Claude Code folder at <path>. Give the folder to copy from: ccam migrate <folder>.