Можливості

Запуск Claude Code

Останнє оновлення 19 жовтня 2026 р.
Перевірено з ccam 0.6.0 і Claude Code 2.1.302

Цю сторінку перекладено з англійської машинним способом. Виправлення вітаються. Редагувати цю сторінку на GitHub

На цій сторінці

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

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

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> ніколи не буває неоднозначним.

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

$ 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 запущено під іншою назвою, це коротка команда, і виклик іде безпосередньо до засобу запуску.
  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 облікового запису й пропускає цей крок, якщо обліковий запис уже запущено.

Remote Control

ccam work rc (або ccam work remote-control) запускає Remote Control з Claude Code від імені облікового запису work. claude remote-control відхиляє --mcp-config перед своєю командою й не приймає його після неї, а його сеанси читають сервери MCP лише з .claude.json облікового запису. Тож стратегія прапорця тут працює інакше:

  1. remoteControl вважає командою Claude Code перший аргумент після облікового запису, що не починається з -. Якщо це remote-control або rc, mcp.FlagArgs нічого не додає.

  2. mcp.Synced порівнює час зміни mcp.json групи з sync-stamp облікового запису. Якщо .claude.json уже містить поточні сервери групи або група їх не має, Remote Control запускається без запитання.

  3. Інакше ccam називає сервери, яких бракуватиме сеансам, і запитує:

    ccam: Remote Control sessions only get MCP servers stored in account work's .claude.json, not the shared MCP servers (ctx, fs).
    Copy them into .claude.json (a backup is kept)? [y/N]
  4. Після відповіді y функція mcp.Sync копіює їх так само, як стратегія sync: під блокуванням Claude Code, після створення резервної копії й зі збереженням власних серверів облікового запису. Після відповіді N або без термінала Remote Control запускається без них, а ccam радить mcp_strategy = "sync", що копіює їх перед кожним запуском.

ccam запитує під час кожного запуску Remote Control, доки сервери не скопійовано, а після копіювання — лише коли mcp.json групи знову зміниться. Копія в .claude.json перемагає --mcp-config під час наступних звичайних запусків, тож ccam mcp add, remove і import оновлюють копії, що є в інших облікових записах (Спільні сервери MCP).

Бюджет у 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:

$ 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. Він усе одно перевіряє спільні посилання й створює відсутнє посилання, як звичайний запуск.
  • ccam work rc, коли work уже запущено, не чіпає .claude.json, повідомляє про це й запускає Remote Control без серверів групи; щоб скопіювати їх, виконайте команду знову після завершення сеансу. З --dry-run вона виводить повідомлення, але нічого не запитує й не копіює.
  • З mcp_strategy = "sync" невдала синхронізація виводить ccam: MCP sync failed (launching anyway): …, і Claude Code запускається з тими серверами, які вже мав.