قابلیت‌ها

اشتراک‌گذاری بین حساب‌ها

آخرین به‌روزرسانی: ۲۷ مهر ۱۴۰۵
بررسی‌شده با ccam 0.6.0 و Claude Code 2.1.302

این صفحه به‌صورت ماشینی از انگلیسی ترجمه شده است. پیشنهاد اصلاح را با کمال میل می‌پذیریم. ویرایش این صفحه در 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>/: نسخه‌های مشترک.
  1. internal/cli/share.go پیکربندی را می‌خواند، هر مقدار --<item> را با config.Share.Set روی یک کپی از تنظیمات حساب اعمال می‌کند و اگر حساب در حال اجرا باشد، کار را رد می‌کند.
  2. share.Build تنظیمات فعلی را با تنظیمات هدف مقایسه می‌کند و گام‌ها را فهرست می‌کند. فقط دیسک را می‌خواند: os.Lstat و os.Readlink برای هر مسیر در share.Layout. برنامه فهرستی از عملیات است: انتقال به یک جایگاه خالی در گروه (adopt)، انتقال فایل‌هایی که گروه ندارد (merge dir)، نوشتن یک تعارض حل‌شده در گروه، پشتیبان‌گیری، حذف پیوند، پیوند دادن، کپی برگشتی، بازنویسی مسیرهای plugin و ادغام رجیستری pluginها.
  3. درباره تعارض‌ها تصمیم گرفته می‌شود، با پرسش یا با --prefer.
  4. Plan.Describe برنامه را چاپ می‌کند و ccam از شما می‌پرسد.
  5. تنظیمات هدف پیش از جابه‌جایی هر چیزی در config.toml نوشته می‌شوند. اگر Plan.Apply در میانه کار متوقف شود، ccam doctor --fix و اجرای دوباره، برنامه خود را به سمت هدف ذخیره‌شده می‌سازند و تغییر را کامل می‌کنند.
  6. Plan.Apply گام‌ها را به ترتیب اجرا می‌کند. هر گام داده را به گروه یا به پوشه پشتیبان منتقل می‌کند؛ هیچ چیزی حذف نمی‌شود.

share.Layout فهرست مجاز مسیرهایی است که هر مورد پوشش می‌دهد. هر چیزی که در آن نباشد هرگز به یک گروه نمی‌رسد. share.Never نام .credentials.json و .claude.json را می‌آورد و اگر هر کدام از آن‌ها روزی در layout ظاهر شود، 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 پیوند را فقط وقتی حذف می‌کند که به پوشه groups اشاره کند، سپس محتوای فعلی گروه را با 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 هر مسیر در layout را فقط با 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 again

ccam doctor --fix فرمان share.Build را با تنظیمات ذخیره‌شده در هر دو طرف اجرا می‌کند، که هر گام را از آنچه روی دیسک است به دست می‌آورد، در تعارض‌ها محتوای گروه را نگه می‌دارد و از هر چیزی که جایگزین می‌کند نسخه پشتیبان می‌گیرد.

ایمنی و موارد خاص

  • حساب‌های در حال اجرا. تا وقتی Claude Code با آن حساب در حال اجراست، ccam از تغییر اشتراک‌گذاری خودداری می‌کند (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 هشدار می‌دهد و پیش از ادامه می‌پرسد.