Funkcje
Zarządzanie kontami
Ta strona została przetłumaczona maszynowo z angielskiego. Poprawki są mile widziane. Edytuj tę stronę na GitHub
Każde konto ccam to osobny folder konfiguracji Claude Code z własnym loginem. Te polecenia tworzą konta, logują do nich, wyświetlają je, zmieniają ich nazwy i je usuwają, a także rejestrują foldery, które już masz.
Użycie
ccam add # wizard on a terminal: name, shared items, shortcut, login
ccam add work --shortcut ccwork # no wizard: log in, then create the ccwork command
ccam add side --no-login --share history=team
ccam login side # run claude auth login inside the account
ccam logout side # remove the login token
ccam list # table of accounts; ccam ls is the same
ccam list --json # machine-readable
ccam use 2 # make slot 2 the default account
ccam rename side personal
ccam remove personal # asks, then moves the folder to the trash
ccam import # find ~/.claude and ~/.claude-* and ask about each
ccam import ~/.claude-ops --name ops
ccam completion zsh > "${fpath[1]}/_ccam"Gdy polecenie przyjmuje <name|number>, możesz podać nazwę konta albo jego numer slotu, czyli kolumnę # w wyniku ccam list.
ccam add uruchomione w terminalu bez opcji otwiera kreator. Pyta o nazwę, potem pokazuje listę współdzielonych elementów do zaznaczenia (zaznaczone jest wszystko oprócz historii rozmów), następnie pyta Create a shortcut command for work? [y/N], a po odpowiedzi y także Shortcut name [ccwork]:. Każda z opcji --share, --shortcut lub --no-login, albo potok zamiast terminala, pomija kreator; wtedy nazwa jest wymagana, a skrót powstaje tylko wtedy, gdy podasz go w --shortcut.
ccam list pokazuje slot, nazwę, skrót, adres e-mail, współdzielone elementy i ostatnie użycie, z * przed domyślnym kontem:
$ ccam list
# Name Shortcut Email Shared Last used
* 1 work ccwork user@example.com mcp settings md ext -
2 personal - me@side.dev settings md ext history@team -Z --json każde konto jest obiektem z polami slot, shortcut, name, email, default, dir, last_used (pomijanym, gdy konto nigdy nie było uruchomione) i share. share przypisuje każdy element (mcp, settings, memory, extensions, history) do nazwy jego grupy albo do "local".
Opcje
| Opcja | Działanie | Domyślnie |
|---|---|---|
ccam add --no-login |
Tworzy konto bez logowania; zalogujesz się później przez ccam login <name> |
wyłączone |
ccam add --share <item=group> |
Współdzieli element z grupą albo, z item=local, zostawia go prywatnym. Można powtarzać |
mcp, settings, memory, extensions w default; history lokalnie |
ccam add --shortcut <command> |
Tworzy też to polecenie skrótu w ~/.local/bin |
brak |
ccam list --json |
Wypisuje konta jako JSON | wyłączone |
ccam remove -y, --yes |
Usuwa bez pytania | wyłączone |
ccam import --name <name> |
Nazwa konta dla podanego folderu | wyprowadzona z nazwy folderu |
ccam import -y, --yes |
Importuje każdy znaleziony folder bez pytania | wyłączone |
--dry-run |
Respektowana przez ccam list i ccam completion, które niczego nie zmieniają. Odrzucana przez add, login, logout, use, rename, remove i import komunikatem --dry-run is not supported by `ccam add`; nothing was changed (z nazwą polecenia) |
wyłączone |
ccam login, ccam logout, ccam use i ccam rename nie mają własnych opcji. ccam completion przyjmuje bash lub zsh; wszystko inne kończy się błędem only bash and zsh are supported.
Nazwy kont mają od 1 do 32 znaków spośród a-z, 0-9, - i _ i zaczynają się literą lub cyfrą. Nazwa nie może składać się z samych cyfr, bo ccam 2 oznacza slot 2. Nie może też być poleceniem ccam (add, list, ls, run, use, next, usage, u, share, mcp, login, logout, rename, remove, rm, import, migrate, doctor, shims, shortcut, completion, help, version, statusline, update), więc ccam <name> nigdy nie jest niejednoznaczne. Ta lista to config.Reserved w internal/config.
Jak to działa
ccam add work --shortcut ccwork wykonuje te kroki w addProfile (internal/cli/profiles.go):
config.ValidateNamesprawdza nazwę, ashim.Checksprawdza skrót, zanim cokolwiek zostanie utworzone.profile.Addtworzy~/.local/share/ccam/profiles/work/z uprawnieniami0700i nadaje kontu najniższy wolny numer slotu (Config.NextSlot), więc numer usuniętego konta jest używany ponownie. Pierwsze konto staje się domyślnym.applySharelinkuje nowy, pusty folder do jego grup współdzielenia przezshare.Build, a potemApply, na przykładsettings.jsondogroups/default/settings.json. Jeśli to się nie uda, nowy folder jest usuwany, bo pozostawiony folder blokowałby każdą kolejną próbę błędemfolder already exists.- Konto jest zapisywane w
~/.config/ccam/config.tomlprzezfsutil.AtomicWrite: plik tymczasowy,fsync, potemrename, więc awaria nigdy nie zostawia połowy konfiguracji. runLoginuruchamiaclaude auth loginzCLAUDE_CONFIG_DIRustawionym na folder konta. Jeśli logowanie się nie powiedzie, konto zostaje, a ccam wypisuje błąd i każe później uruchomićccam login work.profile.ReadEmailodczytujeoauthAccount.emailAddresszprofiles/work/.claude.json. Ten plik może mieć kilka megabajtów, więcTopLevelValuewyszukuje jeden klucz zamiast parsować cały plik.shim.Installlinkuje~/.local/bin/ccworkdo pliku binarnego ccam, który przy starcie szukaargv[0]wconfig.toml.
Logowanie może trwać minuty, a w tym czasie inny ccam może zapisać konfigurację. Dlatego polecenia, które czekają, zapisują przez env.update, które ponownie wczytuje config.toml, stosuje jedną zmianę (tutaj adres e-mail) i zapisuje. Z tego samego powodu ccam remove wczytuje konfigurację ponownie po pytaniu.
ccam login wykonuje kroki 5 i 6 dla istniejącego konta. ccam logout uruchamia claude auth logout na koncie i czyści zapisany adres e-mail. ccam use zmienia tylko default w config.toml.
Logowanie na zdalnej maszynie
Przez SSH część claude auth login działająca w przeglądarce może zawieść. Claude Code czeka na zalogowanie na serwerze zwrotnym pod http://localhost:<port>/callback na serwerze, ale przeglądarka, która kończy logowanie, działa na twoim komputerze, gdzie ten adres prowadzi donikąd, więc przeglądarka pokazuje błąd taki jak ERR_CONNECTION_REFUSED. Adres nadal zawiera jednorazowy kod, więc ccam może go dostarczyć:
runLogin nie oddaje twojego terminala Claude Code. Podłącza standardowe wejście Claude Code do potoku, a relayLogin kopiuje do niego każdy wpisany przez ciebie wiersz, więc kod wklejony przy monicie Paste code here w Claude Code nadal dociera. Gdy wiersz jest adresem zwrotnym, callbackURL akceptuje go tylko wtedy, gdy host to localhost, 127.0.0.1 lub [::1], podano port, ścieżka to /callback i obecne są zarówno code, jak i state; http:// można pominąć. deliverCallback wysyła wtedy żądanie pod ten adres na serwerze z limitem 10 sekund i bez podążania za przekierowaniami, tak jak zrobiłaby to przeglądarka. Żądanie trafia do serwera zwrotnego oczekującego claude auth login (linia przerywana na diagramie). Claude Code otrzymuje kod i zapisuje login, na Linux w .credentials.json w folderze konta. Wklejony wiersz nigdy nie może sprawić, że ccam połączy się z innym hostem.
Przed rozpoczęciem logowania ccam wypisuje:
On a remote machine? If the browser ends on a http://localhost:…/callback page that does not load, paste that address here.Po powodzeniu wypisuje → Passed the sign-in to Claude Code on this machine.
Zmiana nazwy, usuwanie i import
ccam rename i ccam remove działają na folderze konta i na tym, co ccam przechowuje pod nazwą konta w innych miejscach. nameState wymienia te ścieżki: ~/.local/state/ccam/last-used/<name>, ~/.local/state/ccam/mcp/<name> oraz pamięci podręczne użycia ~/.local/state/ccam/usage/<name>.json i <name>.statusline.json. ccam remove work obsługuje je w tej kolejności:
ccam remove najpierw odmawia, jeśli konto jest uruchomione, a potem pyta. Jeśli konto współdzieli rozszerzenia, RewritePluginPaths przepisuje installed_plugins.json i known_marketplaces.json grupy, bo Claude Code przechowuje bezwzględne ścieżki wtyczek, które mogą prowadzić przez folder tego konta. profile.Trash przenosi folder do ~/.local/share/ccam/trash/<name>-<time>/, konto znika z config.toml, ścieżki nameState są usuwane, żeby późniejsze konto o tej samej nazwie ich nie odziedziczyło, a link skrótu jest usuwany. Aby odzyskać konto, przenieś folder z kosza z powrotem.
ccam rename zmienia nazwę folderu, przepisuje ścieżki wtyczek w jego plugins/ ze starego folderu na nowy, przenosi status domyślnego konta i przenosi ścieżki nameState pod nową nazwę. Polecenie skrótu zachowuje swoją nazwę. Jeśli przepisanie ścieżek wtyczek się nie powiedzie, folder wraca do starej nazwy, bo konfiguracja nie zostaje zapisana.
ccam import rejestruje folder tam, gdzie jest, jako dir w config.toml. Nigdy go nie przenosi ani nie kopiuje: skopiowany token odświeżania sprawiłby, że kopie nawzajem by się wylogowywały. Bez argumentu z folderem szuka niezarejestrowanych folderów ~/.claude i ~/.claude-* i pyta o każdy; nazwy pochodzą od folderu (~/.claude to main, ~/.claude-work to work, ~/.claude-2 to acct2), a folder, z którego nie da się wyprowadzić nazwy, jest wypisywany razem z poleceniem --name do użycia. Bez CLAUDE_CONFIG_DIR Claude Code trzyma .claude.json w folderze domowym obok ~/.claude, więc gdy importujesz ~/.claude, a nie ma on własnego .claude.json, ccam tworzy link ~/.claude/.claude.json do ~/.claude.json. Zwykłe claude i ccam main widzą wtedy to samo konto. Zaimportowane konta niczego nie współdzielą, dopóki nie uruchomisz ccam share, i nie powstaje dla nich skrót.
ccam completion bash|zsh wypisuje skrypt uzupełniania, który uzupełnia też nazwy kont.
Bezpieczeństwo i przypadki brzegowe
ccam renameiccam removeodmawiają działania, gdy konto jest uruchomione (refuseRunning), z komunikatemwork is running; quit its Claude Code session first, bo sesja dalej zapisuje do folderu.ccam removena zaimportowanym koncie tylko je wyrejestrowuje:✓ main unregistered (folder ... left in place). Twój~/.claudenie trafia do kosza.ccam addodrzuca nazwę, której folder już istnieje wprofiles/, i wskazujeccam import.ccam importodrzuca folder, który jest już zarejestrowany, ścieżkę, która nie jest folderem, i zajętą nazwę.ccam logouticcam loginnie sprawdzają, czy konto jest uruchomione.- Jeśli przekazanie nie może dotrzeć do Claude Code, na przykład po zakończeniu logowania, ccam wypisuje
ccam: could not pass the sign-in to Claude Code:z przyczyną. Błąd HTTP zwykle oznacza, że kod wygasł; zacznij logowanie od nowa.