# Uruchamianie Claude Code

> Uruchom Claude Code jako dowolne konto przez ccam <name|number>, ccam run lub selektor ccam; argumenty trafiają do claude bez zmian, a --dry-run pokazuje polecenie.

Source: https://ccam.dev/pl/features/launch/ · Updated 2026-10-19

`ccam work` uruchamia Claude Code jako konto `work`, a wszystko po nazwie trafia do `claude` bez zmian. Używaj go wszędzie tam, gdzie wpisałbyś `claude`: w terminalu, w skrypcie albo z wejściem przekazanym potokiem.

## Użycie

```sh
ccam work                        # Claude Code as the account work
ccam 2                           # the account with number 2 (see ccam list)
ccam work --resume               # claude --resume, as work
ccam work -p "fix the tests" --output-format json
cat log.txt | ccam work -p "find the cause"
ccam -p "summarise"              # no name: the default account
ccam use work                    # make work the default account
ccam run work --continue         # same as ccam work --continue
ccam                             # the picker on a terminal, the list otherwise
ccam --dry-run work -p hi        # print the command instead of running it
```

Podaj nazwę konta albo jego numer z `ccam list`. ccam nie odczytuje argumentów po nazwie, więc `ccam work --help` pokazuje pomoc Claude Code. `--` po nazwie jest opcjonalne. Standardowe wejście, kod wyjścia i sygnały działają tak jak w `claude`.

Gdy pierwszy argument zaczyna się od `-` i nie jest żadną z własnych opcji ccam, ccam uruchamia domyślne konto ze wszystkimi argumentami. Domyślne jest konto ustawione przez `ccam use`, a jeśli go nie ustawiłeś, konto z najniższym numerem.

### Selektor

`ccam` bez argumentów otwiera selektor, gdy standardowe wejście i wyjście są terminalem, a w przeciwnym razie wypisuje `ccam list`. Selektor pokazuje numer każdego konta, adres e-mail, użycie 5-godzinne, ostatnie użycie i współdzielone elementy; użycie pojawia się, gdy tylko dane konto odpowie.

| Klawisz | Działanie |
| --- | --- |
| `Enter` | Uruchamia Claude Code jako zaznaczone konto |
| `1` do `9` | Uruchamia konto o tym numerze |
| `Up`/`Down`, `k`/`j` | Przesuwa zaznaczenie |
| `a` | Zamyka selektor i uruchamia kreator `ccam add` |
| `s` | Edytuje współdzielone elementy zaznaczonego konta (`Space` lub `x` przełącza, `Enter` zatwierdza, `Esc` wraca) |
| `d` | Ustawia zaznaczone konto jako domyślne |
| `r` | Pobiera użycie ponownie, z pominięciem krótkiej pamięci podręcznej |
| `q`, `Esc`, `Ctrl+C` | Wyjście |

Selektor zamyka się, zanim cokolwiek zrobi, więc terminal zostaje przywrócony przed startem Claude Code. Po `d` lub zmianie współdzielenia otwiera się ponownie. Zmiana współdzielenia najpierw pokazuje plan i pyta o zgodę, tak jak `ccam share`.

## Opcje

| Opcja | Działanie | Domyślnie |
| --- | --- | --- |
| `--dry-run` | Wypisuje środowisko i polecenie, które ccam by uruchomił, i kończy działanie | wyłączone |
| `-v`, `--version` | Wypisuje `ccam <version>` (tylko jako pierwszy argument) | |
| `-h`, `--help` | Pomoc ccam, jako `ccam --help` lub `ccam run --help` | |

Zasady dotyczące argumentów:

- ccam odczytuje własne opcje tylko przed nazwą konta. Po nazwie każdy argument należy do Claude Code, w tym `--dry-run` i `--help`.
- `--dry-run` działa jako `ccam --dry-run work`, `ccam run --dry-run work` i `ccam --dry-run` (domyślne konto). Jest respektowana, a nie odrzucana.
- `ccam run <name|number> [claude args]` to długa forma `ccam <name>`. `ccam run` bez nazwy używa domyślnego konta.
- Nazwy kont nie mogą być nazwami poleceń ccam, takimi jak `add`, `list`, `run` czy `usage`, więc `ccam <word>` nigdy nie jest niejednoznaczne.

Próbne uruchomienie wypisuje jeden wiersz, który możesz wkleić do powłoki:

```console
$ ccam --dry-run work -p "fix the tests"
CLAUDE_CONFIG_DIR=/home/me/.local/share/ccam/profiles/work /home/me/.local/bin/claude --mcp-config=/home/me/.local/share/ccam/groups/default/mcp.json -p 'fix the tests'
```

## Jak to działa

Każde uruchomienie przechodzi te same kroki, od wiersza poleceń do `exec`:

Każde pole podświetla się, gdy wykonuje się jego krok, a wiersze pod spodem to środowisko i argumenty, z którymi startuje Claude Code.

1. `cmd/ccam/main.go` wywołuje `app.Main`. Jeśli ccam uruchomiono pod inną nazwą, jest to [skrót](https://ccam.dev/pl/features/shortcuts.md) i trafia od razu do programu uruchamiającego.
2. `app.parse` analizuje `os.Args`, zanim w ogóle zaangażuje się cobra. Tylko samo `ccam` (selektor), nazwa polecenia ccam (`config.Reserved`), `-h`/`--help` i `-v`/`--version` trafiają do `cli.Execute`. Wszystko inne to uruchomienie.
3. `launcher.Launch` odczytuje `~/.config/ccam/config.toml`, jedyny plik, który parsuje.
4. `launcher.Prepare` znajduje konto po nazwie lub numerze, odrzuca jedno początkowe `--` i odnajduje plik wykonywalny `claude` przez `ResolveClaude`. Wynik wyszukiwania w PATH jest zapisywany w pamięci podręcznej `~/.local/state/ccam/claude-path` razem z czasem modyfikacji pliku, więc ccam nie przeszukuje `PATH` przy każdym uruchomieniu. Zmieniony lub brakujący plik wywołuje nowe wyszukiwanie. Ścieżka `claude_bin` w `config.toml` jest używana bez zmian. ccam odrzuca `claude`, który jest samym ccam (porównanie po i-węźle), bo powstałaby pętla.
5. `checkLinks` porównuje folder konta `~/.local/share/ccam/profiles/<name>/` z jego ustawieniami współdzielenia przez `share.Check`, które wywołuje tylko `lstat` i `readlink`, jedno lub dwa wywołania systemowe na element. Brakujący link jest tworzony od razu. Wszystko, co mogłoby spowodować utratę danych, zatrzymuje uruchomienie.
6. `applyMCP` dodaje współdzielone serwery MCP (zobacz niżej).
7. `session.Register` rejestruje sesję. ccam zapisuje znacznik nazwany od swojego PID, zawierający czas startu procesu, w `$XDG_RUNTIME_DIR/ccam/profile-<name>/<pid>` (albo w `~/.local/state/ccam/locks/`, gdy nie ma `XDG_RUNTIME_DIR`). Dla konta, które współdzieli historię rozmów, `historyCheck` najpierw szuka działającej sesji w `history-<group>-<hash>`, gdzie skrót jest liczony z bieżącego folderu, i tam też się rejestruje. `exec` zachowuje PID, więc znacznik wskazuje potem sam proces Claude Code. To znacznik, a nie trzymana blokada, bo procesy uruchamiane przez Claude Code odziedziczyłyby blokadę i trzymały ją po zakończeniu sesji.
8. `Plan.Exec` ustawia tytuł terminala na `claude · <name>` (gdy standardowe wyjście błędów jest terminalem), zapisuje czas uruchomienia w `~/.local/state/ccam/last-used/<name>` bez `fsync` i wywołuje `syscall.Exec`.

Claude Code działa z `CLAUDE_CONFIG_DIR` ustawionym na folder konta i `CCAM_PROFILE` ustawionym na nazwę konta. ccam usuwa wszelkie odziedziczone wartości tych zmiennych. Dla folderu `~/.claude` zarejestrowanego przez `ccam import` na macOS ustawia też `CLAUDE_SECURESTORAGE_CONFIG_DIR` na pustą wartość, żeby konto i zwykłe `claude` używały tego samego loginu z pęku kluczy.

### Dlaczego exec

`syscall.Exec` zastępuje proces ccam procesem `claude`, więc ccam nie zostaje w pamięci, naciśnięcia klawiszy, sygnały i kod wyjścia należą do Claude Code, a argumenty pozostają tablicą, nigdy ciągiem dla powłoki. Prace po sesji, takie jak wykrycie serwerów dodanych przez `claude mcp add`, odbywają się przy następnym uruchomieniu: ccam porównuje czas modyfikacji `.claude.json` z `~/.local/state/ccam/mcp/<name>/seen` i parsuje plik tylko wtedy, gdy się zmienił.

### Jak kierowany jest wiersz poleceń

Trzy wiersze poleceń, trzy drogi przez `internal/app`:

Skrót jest rozpoznawany po `argv[0]`, `ccam <name>` po pierwszym argumencie, a obie drogi kończą się na `syscall.Exec`. Tylko polecenie ccam, takie jak `ccam usage`, trafia do cobra.

### Współdzielone serwery MCP

Przy domyślnej strategii `flag` ccam przekazuje serwery MCP grupy do Claude Code jako argument, umieszczony przed twoimi:

`mcp.FlagArgs` zwraca argument tylko wtedy, gdy `mcp.json` grupy istnieje, a `Plan.InsertArgs` wstawia go zaraz po `claude`. Twoje własne `--mcp-config` lub `--strict-mcp-config` nadal obowiązują dodatkowo. To jeden argument, `--mcp-config=<path>`, bo `--mcp-config` w Claude Code przyjmuje kilka wartości: zapisany jako dwa argumenty odczytałby też następujący po nim prompt jako plik konfiguracji.

Z `mcp_strategy = "sync"` w `config.toml` ccam zamiast tego zapisuje serwery w `.claude.json` konta i pomija ten krok, jeśli konto już działa.

### Budżet 10 ms

ccam dodaje najwyżej 10 ms (p95) przed startem Claude Code. Ścieżka uruchamiania nigdy nie buduje drzewa poleceń cobra, nie uruchamia Bubble Tea ani nie otwiera połączenia sieciowego, a `TestPackageInitIsCheap` kończy się niepowodzeniem, jeśli funkcje `init()` pakietów zajmują łącznie więcej niż 5 ms. `scripts/perf-check.sh` mierzy `ccam --dry-run work`, `ccam work` i skrót za pomocą `hyperfine` i zgłasza błąd powyżej 10 ms, a `BenchmarkLaunchPath` w `internal/launcher` wykonuje kroki w pętli. Aby zobaczyć czas każdego kroku, ustaw `CCAM_TRACE=1`:

```console
$ CCAM_TRACE=1 ccam --dry-run work >/dev/null
ccam trace: start                 2.830ms (total 2.830ms)
ccam trace: load config           0.397ms (total 3.227ms)
ccam trace: prepare               0.112ms (total 3.339ms)
ccam trace: check links           0.238ms (total 3.578ms)
ccam trace: prelaunch             0.083ms (total 3.661ms)
```

## Bezpieczeństwo i przypadki brzegowe

- Nieznana nazwa lub numer kończy się komunikatem `no account "<name>"` i wskazaniem `ccam list`. Gdy nie ma żadnych kont, ccam prosi o dodanie konta przez `ccam add <name>`.
- Jeśli współdzielona ścieżka stała się zwykłym plikiem lub wskazuje złe miejsce, ccam zatrzymuje się z komunikatem `stopped because of share link problems:`, wymienia problemy i prosi o uruchomienie `ccam doctor --fix`. Na ścieżce uruchamiania nie przenosi danych.
- Jeśli w tym samym folderze działa inny Claude Code, który współdzieli historię rozmów z tym kontem (ta sama grupa), ccam ostrzega, że historia może się wymieszać, i pyta `Run anyway? [y/N]`. Bez terminala pokazuje ostrzeżenie i kontynuuje.
- `--dry-run` pomija synchronizację MCP, informację o nowych serwerach, sprawdzenie historii, znacznik sesji, tytuł i czas ostatniego użycia, i nie wykonuje exec. Nadal sprawdza linki współdzielenia i tworzy brakujący link tak jak zwykłe uruchomienie.
- Z `mcp_strategy = "sync"` nieudana synchronizacja wypisuje `ccam: MCP sync failed (launching anyway): …`, a Claude Code startuje z serwerami, które już miał.

## Powiązane

- [Polecenia skrótów](https://ccam.dev/pl/features/shortcuts.md)
- [Zarządzanie kontami](https://ccam.dev/pl/features/accounts.md)
- [Opis poleceń](https://ccam.dev/pl/docs/commands.md)
- [Współdzielenie serwerów MCP, ustawień i historii](https://ccam.dev/pl/docs/sharing.md)
- [Jak działa CLAUDE_CONFIG_DIR](https://ccam.dev/pl/guides/claude-config-dir.md)
