# Запуск Claude Code

> Запускайте Claude Code від імені будь-якого облікового запису через ccam <name|number>, ccam run або вікно вибору ccam; аргументи передаються в claude без змін, а --dry-run показує команду.

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

`ccam work` запускає Claude Code від імені облікового запису `work`, і все, що йде після назви, передається в `claude` як є. Використовуйте його всюди, де ви ввели б `claude`: у терміналі, у скрипті або з введенням через конвеєр.

## Використання

```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
```

Вкажіть назву облікового запису або його номер із `ccam list`. ccam не читає аргументи після назви, тож `ccam work --help` показує довідку Claude Code. `--` після назви необов'язковий. Стандартне введення, код виходу та сигнали поводяться так само, як із `claude`.

Коли перший аргумент починається з `-` і не є одним із власних прапорців ccam, ccam запускає обліковий запис за замовчуванням з усіма аргументами. Обліковий запис за замовчуванням — це той, який задано через `ccam use`, або обліковий запис із найменшим номером, якщо ви його не задали.

### Вікно вибору

`ccam` без аргументів відкриває вікно вибору, коли стандартне введення та виведення є терміналом, а в інших випадках виводить `ccam list`. Воно показує номер, електронну пошту, 5-годинне використання, останнє використання та спільні елементи кожного облікового запису; дані про використання з'являються, щойно відповідає кожен обліковий запис.

| Клавіша | Дія |
| --- | --- |
| `Enter` | Запустити Claude Code від імені вибраного облікового запису |
| `1` до `9` | Запустити обліковий запис із цим номером |
| `Up`/`Down`, `k`/`j` | Перемістити виділення |
| `a` | Закрити вікно вибору й запустити майстер `ccam add` |
| `s` | Змінити спільні елементи вибраного облікового запису (`Space` або `x` перемикає, `Enter` застосовує, `Esc` повертає назад) |
| `d` | Зробити вибраний обліковий запис обліковим записом за замовчуванням |
| `r` | Знову отримати дані про використання, оминаючи короткочасний кеш |
| `q`, `Esc`, `Ctrl+C` | Вийти |

Вікно вибору закривається, перш ніж діяти, тож термінал відновлюється до запуску Claude Code. Після `d` або зміни спільного використання воно відкривається знову. Зміна спільного використання спершу показує план і запитує підтвердження, як це робить `ccam share`.

## Параметри

| Параметр | Дія | За замовчуванням |
| --- | --- | --- |
| `--dry-run` | Вивести середовище й команду, які виконав би ccam, і завершитися | вимкнено |
| `-v`, `--version` | Вивести `ccam <version>` (лише як перший аргумент) | |
| `-h`, `--help` | Довідка ccam, як `ccam --help` або `ccam run --help` | |

Правила для аргументів:

- ccam читає власні прапорці лише перед назвою облікового запису. Після назви кожен аргумент належить Claude Code, зокрема `--dry-run` і `--help`.
- `--dry-run` працює як `ccam --dry-run work`, `ccam run --dry-run work` і `ccam --dry-run` (обліковий запис за замовчуванням). Його враховують, а не відхиляють.
- `ccam run <name|number> [claude args]` — повна форма `ccam <name>`. `ccam run` без назви використовує обліковий запис за замовчуванням.
- Назви облікових записів не можуть збігатися з назвами команд ccam, як-от `add`, `list`, `run` чи `usage`, тож `ccam <word>` ніколи не буває неоднозначним.

Пробний запуск виводить один рядок, який можна вставити в оболонку:

```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'
```

## Як це працює

Кожен запуск проходить ті самі кроки, від командного рядка до `exec`:

Кожен блок підсвічується, коли виконується його крок, а рядки під ним — це середовище й аргументи, з якими запускається Claude Code.

1. `cmd/ccam/main.go` викликає `app.Main`. Якщо ccam запущено під іншою назвою, це [коротка команда](https://ccam.dev/uk/features/shortcuts.md), і виклик іде безпосередньо до засобу запуску.
2. `app.parse` переглядає `os.Args` ще до cobra. Лише `ccam` без нічого (вікно вибору), назва команди ccam (`config.Reserved`), `-h`/`--help` і `-v`/`--version` потрапляють до `cli.Execute`. Усе інше є запуском.
3. `launcher.Launch` читає `~/.config/ccam/config.toml`, єдиний файл, який він розбирає.
4. `launcher.Prepare` знаходить обліковий запис за назвою або номером, відкидає один початковий `--` і знаходить виконуваний файл `claude` через `ResolveClaude`. Результат пошуку в PATH кешується в `~/.local/state/ccam/claude-path` разом із часом зміни файлу, тож ccam не шукає в `PATH` під час кожного запуску. Змінений або відсутній файл запускає новий пошук. Шлях `claude_bin` у `config.toml` використовується як є. ccam відхиляє `claude`, який є самим ccam (порівняння за inode), бо це спричинило б зациклення.
5. `checkLinks` порівнює теку облікового запису `~/.local/share/ccam/profiles/<name>/` з її налаштуваннями спільного використання через `share.Check`, який викликає лише `lstat` і `readlink`, один або два системні виклики на елемент. Відсутнє посилання створюється одразу. Усе, що може призвести до втрати даних, зупиняє запуск.
6. `applyMCP` додає спільні сервери MCP (див. нижче).
7. `session.Register` реєструє сеанс. ccam записує позначку з назвою за своїм PID, що містить час запуску процесу, у `$XDG_RUNTIME_DIR/ccam/profile-<name>/<pid>` (або в `~/.local/state/ccam/locks/` без `XDG_RUNTIME_DIR`). Для облікового запису, який спільно використовує історію розмов, `historyCheck` спершу шукає запущений сеанс у `history-<group>-<hash>`, де хеш обчислено від поточної теки, і реєструється й там. `exec` зберігає PID, тож позначка потім вказує на сам процес Claude Code. Саме позначка, а не утримуване блокування, бо процеси, які запускає Claude Code, успадкували б блокування й утримували б його після завершення сеансу.
8. `Plan.Exec` встановлює заголовок термінала `claude · <name>` (коли стандартний потік помилок є терміналом), записує час запуску в `~/.local/state/ccam/last-used/<name>` без `fsync` і викликає `syscall.Exec`.

Claude Code працює зі змінною `CLAUDE_CONFIG_DIR`, що вказує на теку облікового запису, і `CCAM_PROFILE`, що містить назву облікового запису. ccam видаляє будь-які успадковані значення цих змінних. Для теки `~/.claude`, зареєстрованої через `ccam import` на macOS, він також встановлює `CLAUDE_SECURESTORAGE_CONFIG_DIR` у порожнє значення, щоб обліковий запис і звичайний `claude` використовували той самий вхід у в'язці ключів.

### Чому exec

`syscall.Exec` замінює процес ccam на `claude`, тож ccam не залишається в пам'яті, натискання клавіш, сигнали й код виходу належать самому Claude Code, а аргументи залишаються масивом і ніколи не стають рядком оболонки. Робота після сеансу, як-от виявлення серверів, доданих через `claude mcp add`, відбувається під час наступного запуску: ccam порівнює час зміни `.claude.json` з `~/.local/state/ccam/mcp/<name>/seen` і розбирає файл лише тоді, коли він змінився.

### Як маршрутизується командний рядок

Три командні рядки, три маршрути через `internal/app`:

Коротка команда розпізнається за `argv[0]`, `ccam <name>` — за першим аргументом, і обидва маршрути закінчуються `syscall.Exec`. Лише команда ccam, як-от `ccam usage`, доходить до cobra.

### Спільні сервери MCP

За стратегії `flag`, що діє за замовчуванням, ccam передає сервери MCP групи в Claude Code як аргумент, розміщений перед вашими:

`mcp.FlagArgs` повертає аргумент, лише якщо існує `mcp.json` групи, а `Plan.InsertArgs` ставить його одразу після `claude`. Ваші власні `--mcp-config` чи `--strict-mcp-config` після цього все одно застосовуються поверх нього. Це один аргумент, `--mcp-config=<path>`, бо `--mcp-config` у Claude Code приймає кілька значень: якби його записали як два аргументи, наступний запит також було б прочитано як файл конфігурації.

З `mcp_strategy = "sync"` у `config.toml` ccam натомість записує сервери в `.claude.json` облікового запису й пропускає цей крок, якщо обліковий запис уже запущено.

### Бюджет у 10 мс

ccam додає не більше 10 мс (p95) до запуску Claude Code. Шлях запуску ніколи не будує дерево команд cobra, не запускає Bubble Tea і не відкриває мережевих з'єднань, а `TestPackageInitIsCheap` не проходить, якщо функції пакетів `init()` разом займають понад 5 мс. `scripts/perf-check.sh` вимірює `ccam --dry-run work`, `ccam work` і коротку команду за допомогою `hyperfine` і завершується помилкою, якщо час перевищує 10 мс, а `BenchmarkLaunchPath` в `internal/launcher` виконує ці кроки в циклі. Щоб побачити час кожного кроку, задайте `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)
```

## Безпека та граничні випадки

- Невідома назва чи номер зупиняє запуск із повідомленням `no account "<name>"` і відсилає до `ccam list`. Якщо облікових записів немає взагалі, ccam пропонує додати обліковий запис через `ccam add <name>`.
- Якщо спільний шлях став звичайним файлом або вказує не туди, ccam зупиняється з повідомленням `stopped because of share link problems:`, перелічує проблеми й просить виконати `ccam doctor --fix`. На шляху запуску він не переміщує дані.
- Якщо в тій самій теці працює інший Claude Code, який спільно використовує історію розмов із цим обліковим записом (та сама група), ccam попереджає, що історія може змішатися, і запитує `Run anyway? [y/N]`. Без термінала він показує попередження й продовжує.
- `--dry-run` пропускає синхронізацію MCP, повідомлення про нові сервери, перевірку історії, позначку сеансу, заголовок і час останнього використання, а також не виконує exec. Він усе одно перевіряє спільні посилання й створює відсутнє посилання, як звичайний запуск.
- З `mcp_strategy = "sync"` невдала синхронізація виводить `ccam: MCP sync failed (launching anyway): …`, і Claude Code запускається з тими серверами, які вже мав.

## Пов'язані сторінки

- [Короткі команди](https://ccam.dev/uk/features/shortcuts.md)
- [Керування обліковими записами](https://ccam.dev/uk/features/accounts.md)
- [Довідник команд](https://ccam.dev/uk/docs/commands.md)
- [Спільні сервери MCP, налаштування та історія](https://ccam.dev/uk/docs/sharing.md)
- [Як працює CLAUDE_CONFIG_DIR](https://ccam.dev/uk/guides/claude-config-dir.md)
