Возможности
Общий доступ между аккаунтами
Эта страница переведена с английского машинным способом. Исправления приветствуются. Редактировать эту страницу на 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 предупреждает и спрашивает, прежде чем продолжить.