Claude Code متعدّد الملفات الشخصية، v2: بنية XDG نظيفة
بعد شهر على الأسلوب القديم القائم على الـ alias، أعدت بناء إعداد Claude Code متعدّد الملفات الشخصية لديّ إلى بنية متوافقة مع XDG تحت ~/.config/claude-profiles/. لم يكن السبب الحقيقي هو الترتيب — بل اكتشاف أن ~/.claude.json ملف منفصل في جذر الـ home، تعيش فيه بصمت خوادم MCP المُضافة عبر --scope user.
قبل شهر نشرت تدوينة عن تشغيل حسابَي Claude Code جنبًا إلى جنب على جهاز واحد — شخصي وعمل، عبر CLAUDE_CONFIG_DIR وalias في الـ shell. نجح الأسلوب. فعل كل شيء ما كان يُفترض أن يفعله.
لكن بعد شهر من الاستخدام الحقيقي اصطدمت ببضع مشكلات جوهرية لم تغطّها تلك التدوينة. أكبرها — خاصية غريبة خفية في Claude Code تعثّرت بها مصادفةً، حين أضفت Gmail MCP فـ «اختفى» من ملفي بعد خمس دقائق. اليوم أعدت بناء الأمر كله إلى بنية جديدة — متوافقة مع XDG، مع symlink ومنتقٍ تفاعلي للملفات عبر gum. هذه هي v2 — تطوّر نابع من تجربة حقيقية، لا تحسين نظري.
ما بدأ يزعجني
أربعة أمور. الثلاثة الأولى عن الترتيب والوضوح والتوسّع. والرابع هو المطبّ المعماري الحقيقي الذي لم أره فورًا. سأمرّ عليها بالترتيب، لأن الرابع هو الذي فرض إعادة البناء في النهاية.
١. مجلدان منفصلان في $HOME — فوضى
~/.claude و~/.claude-promova — مجلدا نقطة متجاوران في جذر $HOME. تقول مواصفة XDG Base Directory إن الإعدادات مكانها ~/.config/. مجلدات النقطة المبعثرة مباشرةً في الـ home نمط مضاد يحوّل $HOME تدريجيًا إلى درج للنفايات. تجميلي، صحيح، لكنه كان يضايقني في كل مرة أرى فيها ls -la ~.
٢. لا تأكيد بصري للملف النشط
أشغّل claude ولا أدري أيُّ ملفٍ نشط — إلى أن أنفّذ claude config list داخل الجلسة. وإن نسيت أي طرفية شغّلت أين، اضطررت للتحقّق. أمر صغير، لكن مع تشغيل الشخصي والعمل بالتوازي عبر تبويبَين يتراكم.
٣. الـ aliases لا تتوسّع
ملفان — claude وclaude-promova — لا بأس. أضف ثالثًا (عميل مستقل) — تحتاج alias ثالثًا. ورابعًا — رابعًا. بعد ستة أشهر لن أتذكّر أيّ aliases أنشأت فعلًا.
٤. الفخ الخفي في ~/.claude.json
وهذا هو السبب الحقيقي لإعادة البناء. لدى Claude Code مكانان مختلفان للإعداد، والتوثيق لا يصرخ بذلك: ~/.claude/ — المجلد الذي يحوي projects/ وsessions/ وhooks/ وskills/. وبشكل منفصل — ~/.claude.json، ملف يقع مباشرةً في جذر $HOME، وفيه يعيش oauthAccount وmcpServers وتاريخ projects وskillUsage ونحو 40 حقلًا آخر من الحالة الحيّة الفعلية.
الأمر claude mcp add --scope user يكتب في ذلك ~/.claude.json في جذر الـ home، لا في ~/.claude/.claude.json ولا في مجلد الملف. لم أكن أعلم ذلك. إلى أن اصطدمت به في يوم من الأيام.
الاكتشاف: لماذا «اختفى» Gmail MCP
هذا الصباح كنت أُعِدّ Gmail MCP في Claude Code. إعداد قياسي: مشروع Google Cloud، بيانات اعتماد OAuth، claude mcp add gmail --scope user -- npx -y @gongrzhe/server-gmail-autoauth-mcp. كل شيء على ما يرام. أعدت تشغيل الجلسة — يعمل، أقرأ البريد وأردّ على الرسائل. بعد ساعة بدأنا نعيد هيكلة الـ aliases إلى دالة مع منتقي ملفات عبر gum، ثم نقلنا كل شيء إلى XDG. نفّذت mv ~/.claude → ~/.config/claude-profiles/personal، وأعدت تشغيل CC، واخترت personal من القائمة. وفي الجلسة الجديدة فتحت /mcp:
figma (failed)
playwright-test
claude.ai Notionلا gmail. لا vaultforge. ثلاثة خوادم فقط، وأحدها حتى فشل. وأنا لتوّي أضفت Gmail. وفي الوقت نفسه كانت جلسة في طرفية أخرى (ملف العمل) تعرض Gmail وVaultforge دون أي مشكلة.
بدأت أنبش فوجدت أن لديّ ثلاثة ملفات مختلفة على جهازي باسم .claude.json:
| Path | Size | mcpServers |
|---|---|---|
~/.claude.json (home root) | 113 KB | figma, gmail, vaultforge |
~/.config/claude-profiles/personal/.claude.json | 29 KB | figma, playwright-test |
~/.config/claude-profiles/promova/.claude.json | 40 KB | figma, playwright-test, vaultforge |
ها هو. هذا هو المطبّ المعماري:
claude mcp add --scope userيكتب دائمًا في~/.claude.jsonفي جذر الـ home، بغضّ النظر عنCLAUDE_CONFIG_DIR- حين يكون
CLAUDE_CONFIG_DIRمعيّنًا، يقرأ Claude Code الملف$CLAUDE_CONFIG_DIR/.claude.json— أي الملف داخل ملف التعريف - مدخلات «MCP بنطاق المستخدم» ومدخلات «MCP ملف التعريف» تعيش في ملفين مختلفين بالاسم نفسه — ويسهل الخلط بينهما
في حالتي كان ~/.claude.json (جذر الـ home، 113 كيلوبايت) هو الحالة الحيّة الراهنة — مع gmail وvaultforge وجلسة OAuth، كل شيء. أما ~/.config/claude-profiles/personal/.claude.json (29 كيلوبايت) فاتّضح أنه لقطة قديمة كانت قابعة في الـ ~/.claude/ القديم من قبل — ربما كتبتها نسخة CC أقدم، وربما مكوّن إضافي. أظهر jq -r 'keys[]' على الملفين أن نسخة جذر الـ home فيها 41 مفتاحًا فريدًا غائبًا عن اللقطة.
وهذه المفاتيح الـ 41 ليست نفايات. إنها الحالة الفعلية لـ Claude Code:
skillUsage— إحصاءات استخدام المهاراتgithubRepoPaths— مستودعات مخزّنة للتنقّل في المشاريعcachedGrowthBookFeatures+cachedStatsigGates— أعلام الميزات (بدونها يجلب CC نسخًا جديدة عند كل إقلاع)hasShownOpus45NoticeوhasShownOpus46NoticeوhasShownS1MWelcomeV2— أعلام واجهة (بدونها تعود النوافذ المنبثقة عند التشغيل التالي)lastPlanModeUseوfeedbackSurveyStateوinstallMethod— حالة التهيئة وتجربة الاستخدام
إن نفّذت فقط mv ~/.claude ~/.config/claude-profiles/personal دون دمج، تفقد كل ذلك. تعود نوافذ الترحيب، ويعمل بحث githubRepoPaths من جديد، وترجع كل مطالبات الاستبيان. وهو ما كدت أفعله.
البنية الجديدة
كل شيء يعيش تحت مجلد أب واحد في ~/.config/، كما يريد XDG. كل ملف تعريف قائم بذاته — يحمل حالته الكاملة بما فيها .claude.json الخاص به. ويبقى ~/.claude بوصفه symlink إلى الملف الشخصي من أجل التوافق مع الخلف.
~/.config/claude-profiles/
├── personal/
│ ├── .claude.json ← full live state + MCP list (113 KB)
│ ├── projects/, sessions/, hooks/, skills/, ...
│ └── CLAUDE.md
└── promova/
├── .claude.json ← work state + work MCPs (41 KB)
└── projects/, sessions/, agents/, skills/, ...
~/.claude → symlink to ~/.config/claude-profiles/personal/لا .claude.json في جذر $HOME. كل ملف تعريف مجلد معزول منفصل يحوي كل شيء: مجلدات projects/sessions والملف نفسه بخوادم MCP ورموز OAuth. مصدر واحد للحقيقة لكل ملف تعريف.
لماذا يشير الـ symlink إلى personal
كل ما يثبّت مسار ~/.claude/ بشكل صلب — السكربتات القديمة، والمكوّنات الإضافية، وإضافات Claude Code لبيئات التطوير، وإعدادات شريط الحالة مثل claude-powerline.json — يستمر في العمل دون تغيير. يُحلّ الـ symlink إلى الملف الشخصي. وإن شغّلت بالخطأ command claude (متجاوزًا الدالة الغلاف)، فإنك تصل أيضًا إلى personal عبر البحث بالمسار الافتراضي. يصبح personal هو «الافتراضي الهادئ» كما كان، لكنه الآن يعيش فيزيائيًا في موقع XDG.
منتقٍ تفاعلي عند التشغيل — دالة + gum
بدل الـ aliases — دالة claude() في ~/.zshrc تعرض قائمة بأسهم لوحة المفاتيح عبر gum (أداة TUI من Charm). تعترض الدالة نداء claude على مستوى الـ shell، وتدعك تختار ملفًا، ثم تشغّل command claude بـ CLAUDE_CONFIG_DIR المطابق. command مهمة هنا — فهي تتجاوز الدالة الغلاف وتستدعي الملف الثنائي الحقيقي.
# brew install gum
# Claude Code: profile picker on launch
claude() {
local profile
profile=$(gum choose \
--header "Claude profile:" \
--cursor "▸ " \
--selected.foreground 212 \
--cursor.foreground 212 \
--header.foreground 244 \
"personal" "promova") || return
case "$profile" in
personal) CLAUDE_CONFIG_DIR="$HOME/.config/claude-profiles/personal" command claude "$@" ;;
promova) CLAUDE_CONFIG_DIR="$HOME/.config/claude-profiles/promova" command claude "$@" ;;
esac
}هكذا يبدو عند التشغيل:
Claude profile:
▸ personal
promova↑↓ للتنقّل، Enter للاختيار، Esc للإلغاء (فلا يبدأ Claude ببساطة). الملف مرئي دائمًا — يستحيل أن يفوتك.
من الصفر (لا يوجد v1 لترحيله)
إذا كنت قد شغّلت من قبل حيلة المجلدين القديمة مع الـ alias، فانتقل مباشرةً إلى سكربت الترحيل في الأسفل. هذا القسم هو البناء النظيف من الصفر — جهاز جديد، أو مجرد ~/.claude الافتراضي الناتج عن الاستخدام العادي. حدّد الشكل أولًا: حساب واحد بعدّة ملفات تعريف (لعزل المشاريع ومجموعات MCP الخاصة بها — وهي الحالة الشائعة)، أو حسابات مختلفة فعلًا لكل ملف تعريف (شخصي مقابل عمل).
١. رتّب المجلدات
# prerequisites
brew install gum jq
# 1. XDG parent for all profiles
mkdir -p ~/.config/claude-profiles
# 2. fold an existing default install in as your first profile (no-ops on a fresh machine)
if [ -d ~/.claude ] && [ ! -L ~/.claude ]; then
mv ~/.claude ~/.config/claude-profiles/personal
[ -f ~/.claude.json ] && mv ~/.claude.json ~/.config/claude-profiles/personal/.claude.json
fi
# 3. one directory = one profile
mkdir -p ~/.config/claude-profiles/personal ~/.config/claude-profiles/work
# 4. these files will hold OAuth tokens — lock them down
chmod 600 ~/.config/claude-profiles/*/.claude.json 2>/dev/nullمجلد واحد لكل ملف تعريف تحت أب XDG واحد. إذا كنت قد استخدمت Claude Code من قبل، فإن المقتطف يدمج ~/.claude الحالي بوصفه personal، ويحمل معه الحالة الحيّة من ~/.claude.json في جذر الـ home؛ وعلى جهاز جديد تمامًا لا تفعل هذه الأسطر شيئًا. كل ما تبقّى هو مجلدات فارغة تملأ نفسها عند أول تشغيل — وchmod 600 مهم، لأن هذه الملفات ينتهي بها الأمر بحمل رموز OAuth.
٢. وثّق كل ملف تعريف
# launch each profile once and authenticate it
CLAUDE_CONFIG_DIR=~/.config/claude-profiles/work claude
# → run /login in the session, sign in, done.
# Same account for every profile? One /login is enough — macOS keeps it in the
# shared Keychain, so the other profiles are already authenticated.شغّل كل ملف تعريف مرة واحدة بـ CLAUDE_CONFIG_DIR الخاص به ونفّذ /login. التفصيلة الأساسية: إذا كان كل ملف تعريف يستخدم الحساب نفسه، فأنت تسجّل الدخول مرة واحدة فقط — يحفظ macOS بيانات الاعتماد في مدخل Keychain مشترك واحد، وبذلك يُوثَّق كل ملف تعريف آخر تلقائيًا.
حسابات مختلفة لكل ملف تعريف هو المسار الأصعب: مدخل Keychain المشترك ذاك يحمل تسجيل دخول واحدًا، لذا فإن إدخال حساب ثانٍ إلى ملف تعريف آخر قد يطمس الأول. إذا كانت هذه حالتك، فاتّبع الشرح المخصّص في تشغيل حسابَي Claude على جهاز واحد، وتحقّق من عزل بيانات الاعتماد على نسختك من Claude Code قبل أن تعتمد عليه.
٣. الـ Symlink والمنتقي
# personal becomes the default target of ~/.claude (back-compat)
ln -s ~/.config/claude-profiles/personal ~/.claude
# add the claude() gum picker from the architecture section to ~/.zshrc, then:
source ~/.zshrc
claude # ← now shows the profile menu on every launchوجّه ~/.claude إلى ملف التعريف الشخصي كي يستمر كل ما يثبّت هذا المسار بشكل صلب في العمل، ثم ضَع منتقي gum الخاص بدالة claude() من قسم البنية أعلاه داخل ~/.zshrc. بعد إعادة التحميل يعرض claude قائمة الملفات عند كل تشغيل — الحالة النهائية نفسها كإعداد الترحيل، لكن مبنية من جديد.
٤. نسّق MCP كل ملف تعريف
أخيرًا، امنح كل ملف تعريف الأدوات التي ينبغي أن يراها فقط: عيّن disableClaudeAiConnectors: true في settings.json الخاص بذلك الملف، وأضف ما يحتاجه عبر claude mcp add، تمامًا كما في قسم الموصّلات أعلاه. هذا ما يحوّل عشرة ملفات تعريف قابلة للتبديل إلى عشرة مصمّمة لغرض محدّد.
سكربت الترحيل
لكل من يقرأ هذا ويريد الانتقال عن المخطّط القديم. أكثر الخطوات حرجًا هي الثانية: تدمج ~/.claude.json من جذر الـ home مع ما هو موجود أصلًا في الملف الشخصي، جامعةً قائمتَي mcpServers. بدون هذه الخطوة يفقد الملف كلًّا من MCP الخاصة به وكامل حالته الحيّة.
# 1. Move existing dotfolders into a new XDG-style parent.
# APFS mv is an inode rename — safe even if claude --resume is open in
# another terminal, file descriptors stay alive on the same inode.
mkdir -p ~/.config/claude-profiles
mv ~/.claude ~/.config/claude-profiles/personal
mv ~/.claude-promova ~/.config/claude-profiles/promova # rename as needed
# 2. CRITICAL: merge ~/.claude.json (the live state — likely 100+ KB) into
# the personal profile, unioning mcpServers so no MCP is dropped.
jq -s '.[0] * {mcpServers: (.[0].mcpServers + .[1].mcpServers)}' \
~/.claude.json \
~/.config/claude-profiles/personal/.claude.json \
> /tmp/personal-merged.json
mv /tmp/personal-merged.json ~/.config/claude-profiles/personal/.claude.json
# 3. Fix permissions — jq+mv inherits umask (likely 644), but this file
# holds OAuth tokens. Tighten to 600 immediately.
chmod 600 ~/.config/claude-profiles/personal/.claude.json
# 4. Back up the orphaned home-root file (delete once verified)
mv ~/.claude.json ~/.claude.json.migrated.bak
# 5. Symlink for backward compatibility (statusline configs, IDE plugins,
# anything that hardcodes ~/.claude/ keeps working unchanged)
ln -s ~/.config/claude-profiles/personal ~/.claudeالخطوة الثالثة عن الأذونات أمر مهم بذاته. jq | mv ينشئ ملفًا بـ umask 644 (قابل للقراءة من الجميع). وفيه رموز OAuth. chmod 600 فور الدمج إلزامي.
بعد الترحيل — أغلق كل جلسات Claude النشطة وأعد فتحها، وأعد تحميل الـ shell (source ~/.zshrc أو طرفية جديدة)، وشغّل claude، واختر ملفًا، وتحقّق عبر claude mcp list من وجود كل MCP في مكانها. إن كان كل شيء جيدًا — احذف ~/.claude.json.migrated.bak. وإن كان ثمة خلل — التراجع بسيط: mv ~/.claude.json.migrated.bak ~/.claude.json وإزالة الـ symlink.
إضافة: موصّلات MCP لكل ملف تعريف (حين تشاركها مؤسستك)
تفتح البنية أعلاه محورًا ثانيًا للعزل — وقد صار الأمر الذي أستخدمه فعليًا أكثر من غيره. إذا كان حساب Claude الخاص بك تابعًا لمؤسسة، فبإمكان المؤسسة توزيع مجموعة مشتركة من موصّلات MCP البعيدة (Figma، متتبّع تذاكر، خلفية للمقاييس، بوابة قاعدة بيانات، نظام CMS…). يجلب Claude Code تلقائيًا كل موصّل فعّلته المؤسسة داخل كل جلسة، لأنها مرتبطة بالحساب لا بالمجلد الذي شغّلت منه.
مع موصّلين أو ثلاثة يكون هذا مقبولًا. أما مع عشرة مشاريع واثني عشر موصّلًا مؤسسيًا فيتوقّف عن كونه مقبولًا: كل جلسة تحمّل أدوات لا شأن لها بها. هذا ضجيج في قائمة أدوات النموذج، وهو هدر للسياق، والجزء الذي يؤذي فعلًا — أنه يتيح لجلسة أن تصل إلى نظام يخصّ مشروعًا آخر. موصّل المشروع A ينبغي ألا يكون موجودًا أصلًا وأنت تعمل على المشروع B.
عطّل الجلب التلقائي ثم نسّق
الرافعة إعداد واحد فقط، disableClaudeAiConnectors (Claude Code v2.1.182+). يعيش في أي نطاق للإعدادات — بما في ذلك settings.json الخاص بملف التعريف نفسه — لذا فهو لكل CLAUDE_CONFIG_DIR. عيّنه إلى true فيتوقّف ذلك الملف عن جلب موصّلات المؤسسة تلقائيًا تمامًا:
{
"disableClaudeAiConnectors": true
}ثم أعد إضافة الموصّلات التي يحتاجها ذلك الملف فعلًا فقط. الخوادم التي تضيفها صراحةً لا يمسّها العَلَم، فتُحمَّل بشكل طبيعي — والنتيجة مجموعة فرعية منسّقة، ملفًا تلو الآخر:
# add back only what this profile uses — writes to the profile's own .claude.json
claude mcp add --scope user --transport http figma https://<your-figma-connector>/mcp
claude mcp add --scope user --transport http linear https://<your-linear-connector>/mcp| ملف التعريف | ما يحمّله |
|---|---|
frontend | Figma, Linear, Sentry |
backend | Postgres, Grafana, Linear |
content | Notion, Figma, Linear |
الحساب نفسه، وكتالوج المؤسسة نفسه — لكن كل ملف تعريف يرى شريحته فقط، إضافةً إلى ما تختار تكراره من الموصّلات المشتركة (متتبّع التذاكر عادةً يستحق مكانه في كل مكان).
اختبرته قبل أن أثق به
لم أرد أن آخذ كلام التوثيق كمسلّمة، لذا أجريت اختبار A/B نظيفًا على ملف تعريف واحد — الحساب نفسه، ورمز OAuth نفسه، والفرق الوحيد هو ذلك الـ settings.json:
profile WITHOUT the flag
/mcp → Figma, Linear, Grafana, Postgres, Notion, Sentry, … (entire org catalog)
same account, profile WITH disableClaudeAiConnectors: true
/mcp → (nothing auto-loaded)
…then claude mcp add Figma + Linear
/mcp → Figma, Linear (exactly the curated subset)يفعل بالضبط ما يدّعيه. تحفّظان يستحقان المعرفة قبل أن تعتمد عليه:
- إعادة إضافة موصّل OAuth تحتاج تسجيل دخول تفاعلي واحدًا. الموصّلات التي توثّق بمفتاح داخل الـ URL تعود تلقائيًا بالكامل عبر
claude mcp add. أما الموصّلات خلف OAuth فتطلب توثيقًا واحدًا عبر المتصفح في أول مرة تستخدمها فيها ضمن ذلك الملف. claude mcp listلا يعرض موصّلات المؤسسة إطلاقًا — بل الخوادم المعرّفة محليًا والمُضافة صراحةً فقط. أما المجلوبة تلقائيًا فلا تظهر إلا داخل جلسة حيّة عبر/mcp. لا تفزع حين يبدوmcp listخاليًا منها.
ما الذي تحصل عليه
- مجلد أب واحد بدل مجلدَي نقطة في $HOME — متوافق مع XDG
- يحفظ الـ symlink التوافق مع كل ما يثبّت
~/.claude/بشكل صلب - كل ملف تعريف قائم بذاته — حالته الكاملة وMCP الخاصة به تعيش في
.claude.jsonالخاص به - مصدر واحد للحقيقة لكل ملف تعريف — لا مزيد من إعداد يتيم في جذر الـ home ينحرف بصمت عن إعداد الملف
- البيانات الحساسة (oauthAccount، الرموز) مضمون لها أذونات 600
- تأكيد بصري للملف النشط عند كل تشغيل — يستحيل أن تنسى أيّ ملف نشط
- إضافة ملف تعريف ثالث = إضافة سطر واحد إلى
caseداخل الدالة، لا استنساخ alias جديد وتذكّر اسمه
أين يقصّر
أريد أن أكون صريحًا. هذا ليس تحسينًا مجانيًا — رافقته بضع مقايضات، ومن الجدير معرفتها سلفًا.
gumاعتمادية إضافية (brew install gum، نحو 13 ميغابايت). إن كنت لا تريد تثبيتها إطلاقًا — ارجع إلىselectفي zsh أوreadبسيط. يعمل، لكنه لا يبدو بالجمال نفسه ولا تنقّل بالأسهم فيه.- ضغطة Enter واحدة عند كل تشغيل. لمن يشعلون
claudeعشرات المرات يوميًا، قد يصير مزعجًا. البديل في الأسفل (direnv). - الـ symlink
~/.claude → personalيجعل personal هو الافتراضي. إن أردت ملف العمل افتراضيًا، عليك إعادة توجيه الـ symlink (ln -sf). ليس صعبًا، لكنه ليس «انسه ولا شيء ينكسر». - قد ينكسر الـ symlink نظريًا إن أعادت أداةٌ ما كتابة
~/.claude.jsonذرّيًا عبر نمط temp+rename (write-file-atomic). عمليًا لا يفعل Claude Code ذلك بنفسه، لكن إن ثبّتّ مكوّنات طرف ثالث — تحقّق. - إن كان لديك حسابات Anthropic مختلفة على ملفات مختلفة بخطط مختلفة — فقد يكون هناك تأخّر دون الثانية بعد التبديل بينما يزامن Claude Code حالة OAuth. في استخدامي غير ملحوظ، لكنه ليس صفرًا.
بدائل نظرت فيها
direnv — يعيّن CLAUDE_CONFIG_DIR تلقائيًا بناءً على .envrc في جذر كل مشروع. صفر تفاعل، صفر نقرات. العيب: عليك وضع .envrc في كل جذر عمل، وإن شغّلت claude في مجلد غير معروف، تحصل على الملف الافتراضي (وقد لا يكون الذي تريده). لمن يعيشون داخل مجموعة صغيرة من جذور العمل ويريدون ألا ينقروا شيئًا أبدًا، فإن direnv أفضل فعلًا.
التبديل القائم على الـ symlink (ملف نشط واحد عبر إعادة توجيه symlink الـ ~/.claude) نظرت فيه أيضًا وأسقطته فورًا. لا يمكنك أن تفتح طرفيتين بملفين مختلفين في آنٍ واحد — فـ «الحالي» العام واحد فقط. بالنسبة لي هذا مانع قاطع.
الخلاصة
v2 ليست مجرد تجربة استخدام أفضل فوق v1. إنها إقرار بأن لدى Claude Code سلوكًا معماريًا شاذًّا (~/.claude.json بوصفه ملفًا منفصلًا في جذر الـ home، تكتبه أوامر --scope user بغضّ النظر عن CLAUDE_CONFIG_DIR) عليك أن تحسب حسابها إن أردت عزلًا حقيقيًا بين الملفات. الأسلوب الأول (~/.claude + ~/.claude-promova + alias) نجح بنسبة 80%، لكن الـ 20% الباقية ظهرت في صورة انحراف صامت للحالة بين الملفات. الآن صار محسوبًا. إن كنت تبدأ للتوّ — ابدأ بـ v2 مباشرةً. وإن كنت أصلًا على v1 — سكربت الترحيل في الأعلى، والنقل يستغرق خمس دقائق ولا يكسر شيئًا (دمج jq بالذات هو الخطوة التي تنقذك من فقدان الحالة).