Funkcje
Współdzielenie między kontami
Ta strona została przetłumaczona maszynowo z angielskiego. Poprawki są mile widziane. Edytuj tę stronę na GitHub
Każde konto ma własny folder, ale większość jego zawartości nie musi być osobna. ccam share włącza lub wyłącza współdzielenie dla jednego konta i jednego elementu naraz: plik lub folder konta jest przenoszony do folderu grupy i zastępowany dowiązaniem symbolicznym, więc każde konto w grupie czyta i zapisuje tę samą kopię. Używaj go po ccam add, żeby zmienić, co konto współdzieli, albo żeby umieścić kilka kont w osobnej grupie.
Użycie
ccam share work # show what work shares, and with which group
ccam share work --history on # share conversation history with the default group
ccam share side --history team # share it with the group team instead
ccam share work --settings off # give work its own copy of settings.json again
ccam share work --memory off --fresh # stop sharing CLAUDE.md and start with no file
ccam share work --settings on --yes --prefer merge # no questions; merge JSON on conflicts
ccam --dry-run share work --history on # print the plan, change nothingBez opcji elementów ccam share wypisuje bieżący stan:
$ ccam share work
Sharing for work
MCP servers shared (group default) --mcp
settings.json shared (group default) --settings
global CLAUDE.md shared (group default) --memory
agents, commands, skills, plugins shared (group default) --extensions
conversation history local --historyZ opcjami ccam wypisuje plan, pyta o każdy plik, który różni się od kopii grupy, i pyta Proceed? [y/N], zanim cokolwiek zmieni. Nowe konto współdzieli wszystko oprócz historii rozmów; Współdzielenie serwerów MCP, ustawień i historii opisuje każdy element z perspektywy użytkownika.
Opcje
| Opcja | Działanie | Domyślnie |
|---|---|---|
--mcp <on|off|group> |
serwery MCP | bez zmian |
--settings <on|off|group> |
settings.json |
bez zmian |
--memory <on|off|group> |
globalny CLAUDE.md |
bez zmian |
--extensions <on|off|group> |
agents/, commands/, skills/, plugins/, output-styles/, rules/ |
bez zmian |
--history <on|off|group> |
projects/ i history.jsonl |
bez zmian |
--fresh |
przy wyłączaniu współdzielenia zaczyna od pustego stanu zamiast kopiować zawartość grupy | wyłączone |
--prefer <group|mine|merge> |
jak rozstrzygać konflikty | pytanie; z --yes domyślny wybór każdego elementu |
-y, --yes |
działa bez pytania; konflikty są rozstrzygane według --prefer |
wyłączone |
-h, --help |
pomoc dla share |
|
--dry-run (globalna) |
respektowana: pyta o konflikty, wypisuje plan, niczego nie zmienia | wyłączone |
Wartość on oznacza grupę default, off oznacza lokalnie (bez współdzielenia), a każda inna wartość to nazwa grupy. Nazwy grup stają się nazwami folderów w ~/.local/share/ccam/groups/, więc ccam share side --history ../x kończy się błędem invalid group name: "../x". Konto podaje się nazwą lub numerem, a zmieniają się tylko wymienione elementy.
Jak to działa
Pliki, których to dotyczy:
~/.config/ccam/config.toml: tabela[profile.share]każdego konta, jedna wartość na element.~/.local/share/ccam/profiles/<name>/:CLAUDE_CONFIG_DIRkonta.~/.local/share/ccam/groups/<group>/: współdzielone kopie.
internal/cli/share.goodczytuje konfigurację, stosuje każdą wartość--<item>do kopii ustawień konta przezconfig.Share.Seti odmawia, jeśli konto jest uruchomione.share.Buildporównuje bieżące ustawienia z docelowymi i wypisuje kroki. Tylko odczytuje dysk:os.Lstatios.Readlinkdla każdej ścieżki zshare.Layout. Plan to lista operacji: przeniesienie do pustego miejsca w grupie (przejęcie), przeniesienie plików, których grupa nie ma (scalenie folderu), zapisanie rozstrzygniętego konfliktu w grupie, kopia zapasowa, usunięcie linku, utworzenie linku, skopiowanie z powrotem, przepisanie ścieżek wtyczek i scalenie rejestru wtyczek.- Konflikty są rozstrzygane, przez pytanie lub przez
--prefer. Plan.Describewypisuje plan, a ccam pyta o zgodę.- Docelowe ustawienia są zapisywane w
config.toml, zanim cokolwiek zostanie przeniesione. JeśliPlan.Applyprzerwie się w połowie,ccam doctor --fixi ponowne uruchomienie budują plan względem zapisanego celu i kończą zmianę. Plan.Applywykonuje kroki po kolei. Każdy krok przenosi dane do grupy albo do folderu kopii zapasowej; nic nie jest usuwane.
share.Layout to lista dozwolonych ścieżek, które obejmuje każdy element. Nic spoza niej nigdy nie trafi do grupy. share.Never wymienia .credentials.json i .claude.json, a Build zatrzymuje się z błędem wewnętrznym, jeśli któryś z nich kiedykolwiek pojawi się w układzie. Element mcp nie ma ścieżek: lista serwerów jest w .claude.json, więc współdzielenie MCP działa zamiast tego przez mcp.json grupy, a --mcp zmienia tylko ustawienie.
Oto co dzieje się z jednym folderem, projects/, gdy side włącza historię, a grupa ma już zawartość:
Jeśli grupa nie ma jeszcze niczego pod tą ścieżką, konto jest pierwszym, które ją współdzieli, a jego folder zostaje tam przeniesiony bez zmian, bez kopii zapasowej. W przeciwnym razie mergeDir przenosi do grupy każdy plik, którego grupa nie ma, a pliki istniejące po obu stronach zostają w folderze konta, więc zachowywana jest wersja grupy. Folder konta trafia następnie do .ccam-backup/<time>/ w folderze konta, a os.Symlink wstawia na jego miejsce link. Pliki rozmów mają nazwy według identyfikatora sesji, więc historie z kilku kont łączą się bez konfliktów.
Przenoszenie używa rename(2), a między systemami plików przechodzi na kopiowanie i usuwanie. Względny link wewnątrz przenoszonego drzewa, który wskazywał poza nie, jest przepisywany na link bezwzględny (fsutil.PortableLink), więc nadal działa z nowego miejsca. Rejestry plugins/ (installed_plugins.json, known_marketplaces.json) przechowują ścieżki bezwzględne prowadzące przez folder konta; ccam przestawia je na folder grupy, a gdy grupa ma już rejestr, scala z nim wpisy konta.
Wyłączenie elementu odwraca link:
ccam usuwa link tylko wtedy, gdy wskazuje do folderu grup, a potem kopiuje bieżącą zawartość grupy do konta przez CopyTree. Z --fresh kopiowanie jest pomijane, a konto zaczyna bez niczego pod tą ścieżką. Grupa zachowuje swoją zawartość dla pozostałych kont. Przeniesienie elementu z jednej grupy do innej usuwa link i tworzy link do nowej grupy, zostawiając starą grupę bez zmian; plan informuje o tym w wierszu Note:.
Pojedynczy plik, który istnieje po obu stronach z różną zawartością, to konflikt:
share.NewConflict wymienia wybory pasujące do pliku. history.jsonl oferuje merge by line, keep group i use mine, ze scalaniem na pierwszym miejscu. Inne pliki .json oferują keep group, use mine i merge JSON. Wszystkie pozostałe oferują keep group i use mine. Pierwszy wybór jest domyślny:
history.jsonl differs from the group's copy.
mine: ~/.local/share/ccam/profiles/side/history.jsonl
group: ~/.local/share/ccam/groups/default/history.jsonl
1) merge by line
2) keep group
3) use mine
Choice [1]:merge JSON (MergeJSONBytes) scala obiekty rekurencyjnie, łączy tablice bez duplikatów i zachowuje wartość grupy, gdy obie strony ustawiają ten sam klucz inaczej, więc pozostałe konta nie widzą zmiany w działaniu. merge by line zachowuje wiersze grupy, a potem dodaje twoje wiersze, których grupa nie ma. Każdy wybór oprócz keep group najpierw zapisuje kopię grupy w .ccam-backup/<time>/group/ w folderze konta, a potem zapisuje wynik przez fsutil.AtomicWrite. Twój własny plik zawsze trafia do kopii zapasowej.
--prefer group, mine lub merge rozstrzyga każdy konflikt bez pytania; merge oznacza merge JSON lub merge by line, w zależności od tego, co oferuje plik, a plik, który nie oferuje żadnego z nich, zachowuje wybór domyślny. Samo --yes przyjmuje domyślny wybór każdego pliku.
Przy każdym uruchomieniu share.Check porównuje każdą ścieżkę z układu z ustawieniem, używając tylko lstat i readlink, dzięki czemu jest wystarczająco tanie dla ścieżki uruchamiania. Brakujący link jest tworzony od razu, bo nie ma nic do stracenia. Zwykły plik tam, gdzie powinien być link, link w złe miejsce albo nieaktualny link zatrzymują uruchomienie:
ccam: stopped because of share link problems:
~/.local/share/ccam/profiles/work/CLAUDE.md: set to shared but is a real file, not a link
Repair them with `ccam doctor --fix`, then run againccam doctor --fix uruchamia share.Build z zapisanymi ustawieniami po obu stronach, co wyprowadza każdy krok z tego, co jest na dysku, zachowuje zawartość grupy przy konfliktach i robi kopię zapasową wszystkiego, co zastępuje.
Bezpieczeństwo i przypadki brzegowe
- Działające konta. ccam odmawia zmiany współdzielenia, gdy Claude Code działa jako to konto (
account work is running; quit it first, then change its sharing), bo sesja dalej zapisuje do przenoszonych plików, a wiersze dopisane w tym czasie zostałyby utracone.--dry-runnadal wypisuje plan. - Kopie zapasowe. Każdy plan dostaje własny folder
.ccam-backup/<time>/w folderze konta, z numerowanym przyrostkiem, gdy dwa plany zaczynają się w tej samej sekundzie. ccam nigdy ich nie usuwa. - Częściowe niepowodzenia. Jeśli krok się nie powiedzie, ccam wypisuje błąd i miejsce, w którym są oryginały, i każe dokończyć poleceniem
ccam doctor --fix. Cel jest już zapisany, więc naprawa kontynuuje w jego kierunku. - Twoje własne linki. Jeśli ścieżka jest już linkiem, który sam utworzyłeś, na przykład do repozytorium dotfiles, a grupa jest pusta, ccam kopiuje cel linku do grupy, a sam link przenosi do kopii zapasowej. Cel nie jest ruszany.
- Pliki logowania.
.credentials.jsoni.claude.jsonnigdy nie są linkowane, przenoszone ani kopiowane do grupy. - Dwa konta w jednym folderze. Konta, które współdzielą historię, zapisują do tych samych plików. Gdy drugie konto z tej samej grupy historii startuje w folderze, w którym jedno już działa, ccam ostrzega i pyta, zanim będzie kontynuować.