Можливості
Спільне використання між обліковими записами
Цю сторінку перекладено з англійської машинним способом. Виправлення вітаються. Редагувати цю сторінку на GitHub
Кожен обліковий запис має власну теку, але більша частина її вмісту не мусить бути окремою. ccam share вмикає або вимикає спільне використання для одного облікового запису й одного елемента за раз: файл або теку облікового запису переміщують до теки групи й замінюють символьним посиланням, тож кожен обліковий запис у групі читає й записує ту саму копію. Використовуйте цю команду після ccam add, щоб змінити, що обліковий запис використовує спільно, або щоб виділити кілька облікових записів в окрему групу.
Використання
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 nothingБез параметрів елементів ccam share виводить поточний стан:
$ 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 --historyЗ параметрами ccam виводить план, запитує про кожен файл, що відрізняється від копії групи, і запитує Proceed? [y/N], перш ніж щось змінити. Новий обліковий запис спільно використовує все, крім історії розмов; сторінка Спільні сервери MCP, налаштування та історія описує кожен елемент з погляду користувача.
Параметри
| Параметр | Дія | За замовчуванням |
|---|---|---|
--mcp <on|off|group> |
Сервери MCP | без змін |
--settings <on|off|group> |
settings.json |
без змін |
--memory <on|off|group> |
глобальний CLAUDE.md |
без змін |
--extensions <on|off|group> |
agents/, commands/, skills/, plugins/, output-styles/, rules/ |
без змін |
--history <on|off|group> |
projects/ і history.jsonl |
без змін |
--fresh |
під час вимкнення спільного використання почати з порожнього стану замість копіювання вмісту групи | вимкнено |
--prefer <group|mine|merge> |
як вирішувати конфлікти | запитувати; з --yes — варіант за замовчуванням для кожного елемента |
-y, --yes |
виконати без запитань; конфлікти вирішуються згідно з --prefer |
вимкнено |
-h, --help |
довідка для share |
|
--dry-run (глобальний) |
враховується: запитує про конфлікти, виводить план, нічого не змінює | вимкнено |
Значення on означає групу default, off означає локальний стан (без спільного використання), а будь-яке інше значення є назвою групи. Назви груп стають назвами тек у ~/.local/share/ccam/groups/, тож ccam share side --history ../x завершується помилкою invalid group name: "../x". Обліковий запис указують за назвою або за номером, і змінюються лише ті елементи, які ви назвали.
Як це працює
Задіяні файли:
~/.config/ccam/config.toml: таблиця[profile.share]кожного облікового запису, по одному значенню на елемент.~/.local/share/ccam/profiles/<name>/:CLAUDE_CONFIG_DIRоблікового запису.~/.local/share/ccam/groups/<group>/: спільні копії.
internal/cli/share.goчитає конфігурацію, застосовує кожне значення--<item>до копії налаштувань облікового запису черезconfig.Share.Setі відмовляє, якщо обліковий запис запущено.share.Buildпорівнює поточні налаштування з цільовими й перелічує кроки. Він лише читає диск:os.Lstatіos.Readlinkдля кожного шляху вshare.Layout. План — це список операцій: перемістити в порожнє місце групи (adopt), перемістити файли, яких бракує групі (merge dir), записати вирішений конфлікт до групи, створити резервну копію, видалити посилання, створити посилання, скопіювати назад, переписати шляхи до плагінів і об'єднати реєстр плагінів.- Конфлікти вирішуються через запитання або через
--prefer. Plan.Describeвиводить план, і ccam запитує підтвердження.- Цільові налаштування записуються в
config.tomlдо того, як щось переміщується. ЯкщоPlan.Applyзупиняється посередині,ccam doctor --fixі повторний запуск будують свій план до збереженої цілі й завершують зміну. Plan.Applyвиконує кроки по черзі. Кожен крок переміщує дані до групи або до теки резервних копій; нічого не видаляється.
share.Layout — це список дозволених шляхів, які охоплює кожен елемент. Усе, чого в ньому немає, ніколи не може потрапити до групи. share.Never називає .credentials.json і .claude.json, і Build зупиняється з внутрішньою помилкою, якщо хтось із них колись з'явиться в структурі. Елемент mcp не має шляхів: список серверів зберігається всередині .claude.json, тож спільне використання MCP натомість працює через mcp.json групи, а --mcp лише змінює налаштування.
Ось що відбувається з однією текою, projects/, коли side вмикає історію, а група вже має вміст:
Якщо в групі за цим шляхом ще нічого немає, обліковий запис першим спільно використовує його, і його теку переміщують туди як є, без резервної копії. Інакше mergeDir переміщує до групи кожен файл, якого їй бракує, а файли, що є з обох боків, залишаються в теці облікового запису, тож версія групи зберігається. Потім тека облікового запису переходить до .ccam-backup/<time>/ усередині теки облікового запису, а os.Symlink ставить на її місце посилання. Файли розмов мають назви за ідентифікатором сеансу, тож історії з кількох облікових записів об'єднуються без конфліктів.
Для переміщення використовується rename(2), а між різними файловими системами — копіювання й видалення. Відносне посилання всередині переміщеного дерева, що вказувало за його межі, переписується як абсолютне (fsutil.PortableLink), тож воно й далі розв'язується з нового місця. Реєстри plugins/ (installed_plugins.json, known_marketplaces.json) зберігають абсолютні шляхи через теку облікового запису; ccam спрямовує їх на теку групи, а коли група вже має реєстр, об'єднує з ним записи облікового запису.
Вимкнення елемента змінює посилання у зворотний бік:
ccam видаляє посилання, лише якщо воно вказує всередину теки груп, а потім копіює поточний вміст групи до облікового запису через CopyTree. З --fresh копіювання пропускається, і обліковий запис починає без нічого за цим шляхом. Група зберігає свій вміст для інших облікових записів. Перенесення елемента з однієї групи до іншої видаляє посилання й пов'язує його з новою групою, залишаючи стару групу як є; план повідомляє про це рядком Note:.
Окремий файл, що є з обох боків із різним вмістом, є конфліктом:
share.NewConflict перелічує варіанти, що підходять для файлу. history.jsonl пропонує merge by line, keep group і use mine, з об'єднанням на першому місці. Інші файли .json пропонують keep group, use mine і merge JSON. Усе інше пропонує keep group і use mine. Перший варіант діє за замовчуванням:
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) рекурсивно об'єднує об'єкти, з'єднує масиви без дублікатів і зберігає значення групи, коли обидві сторони задають той самий ключ по-різному, тож інші облікові записи не бачать змін у поведінці. merge by line зберігає рядки групи, а потім додає ваші рядки, яких у ній немає. Кожен варіант, крім keep group, спершу зберігає копію групи до .ccam-backup/<time>/group/ у теці облікового запису, а потім записує результат через fsutil.AtomicWrite. Ваш власний файл завжди потрапляє до резервної копії.
--prefer group, mine або merge вирішує кожен конфлікт без запитань; merge означає merge JSON або merge by line, залежно від того, що пропонує файл, а файл, який не пропонує жодного з них, отримує варіант за замовчуванням. Сам лише --yes бере варіант за замовчуванням для кожного файлу.
Під час кожного запуску share.Check порівнює кожен шлях у структурі з налаштуванням, використовуючи лише lstat і readlink, тож перевірка досить дешева для шляху запуску. Відсутнє посилання створюється одразу, бо втрачати нічого. Справжній файл там, де має бути посилання, посилання не туди або застаріле посилання зупиняє запуск:
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 запускає share.Build зі збереженими налаштуваннями з обох боків, що виводить кожен крок із того, що є на диску, зберігає вміст групи в разі конфліктів і створює резервну копію всього, що замінює.
Безпека та граничні випадки
- Запущені облікові записи. ccam не змінює спільне використання, поки Claude Code працює від імені облікового запису (
account work is running; quit it first, then change its sharing), бо сеанс і далі записує у файли, які переміщуються, і рядки, які він тим часом допише, було б утрачено.--dry-runусе одно виводить план. - Резервні копії. Кожен план отримує власну теку
.ccam-backup/<time>/у теці облікового запису, з числовим суфіксом, коли два плани починаються в ту саму секунду. ccam ніколи їх не видаляє. - Часткові збої. Якщо крок зазнає невдачі, ccam виводить помилку й місце, де лежать оригінали, і радить завершити через
ccam doctor --fix. Ціль уже збережено, тож виправлення продовжується до неї. - Ваші власні посилання. Якщо шлях уже є посиланням, яке ви створили, наприклад на репозиторій dotfiles, а група порожня, ccam копіює ціль посилання до групи, а саме посилання переміщує до резервної копії. Ціль не змінюється.
- Файли входу.
.credentials.jsonі.claude.jsonніколи не пов'язуються з групою, не переміщуються й не копіюються до неї. - Два облікові записи в одній теці. Облікові записи, які спільно використовують історію, записують ті самі файли. Коли другий обліковий запис тієї самої групи історії запускається в теці, де вже працює перший, ccam попереджає й запитує, перш ніж продовжити.