الميزات
المشاركة بين الحسابات
تُرجمت هذه الصفحة آليًا من الإنجليزية. التصحيحات مرحب بها. عدّل هذه الصفحة على 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. والخطة قائمة عمليات: النقل إلى خانة فارغة في المجموعة (تبنٍّ)، ونقل الملفات التي لا تملكها المجموعة (دمج مجلد)، وكتابة تعارض محسوم في المجموعة، والنسخ الاحتياطي، وإزالة الرابط، والربط، والنسخ إلى الحساب، وإعادة كتابة مسارات الإضافات، ودمج سجل الإضافات. - تُحسم التعارضات، بالسؤال أو بـ
--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 againيشغّل ccam 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 ويسألك قبل أن يتابع.