شو صار، وليش ممكن يصير معك
مهندس معروف خلّى Claude Code يرتّب السيرفرات تبع منصّته. كان ناقصه ملف صغير بالإعدادات، فالأداة نفّذت أمر هدم (destroy) وراحت قاعدة البيانات كلها، ومعها النسخ الاحتياطية اللي كانت بنفس الحساب. والمؤلم إنه Claude كان نصحه من الأول ما يدمج المشروعين، وهو كمّل. مزوّد السحابة رجّعله البيانات بعد يوم تقريباً، بس مش كل مرة رح تكون محظوظ.
كل قاعدة إلها أداة جوّا Claude Code. هون شو بتعمل فعلاً، وشو ما بتعمل.
نسخة احتياطية قبل أي شي (وشو بيرجّع /rewind)
- الكود: قبل أي شغل كبير اعمل commit بـ git (أو انسخ المجلد كله). الرجوع بـ git مضمون، الرجوع بأي شي تاني مش مضمون.
- قاعدة البيانات: خلّي نسخة احتياطية برّا نفس الحساب ونفس السيرفر. بالقصة، النسخ الاحتياطية راحت مع القاعدة لأنها كانت بنفس المكان.
- السيرفرات: أي أمر على بنية حقيقية (terraform، kubectl، أوامر الاستضافة) جرّبه على بيئة تجربة أول.
شو بيرجّع /rewind فعلاً؟
الأمر /rewind (أو Esc مرتين والخانة فاضية، وإله اسمين تانيين: /checkpoint و/undo) بيفتح قائمة الرجوع. منها خيار Restore code، وهاد حدوده بالضبط:
واللقطات محفوظة لآخر 100 نقطة رجوع بس، وبتنمسح بعد حوالي 30 يوم. يعني /rewind شبكة أمان للكود جوّا الجلسة، مش بديل عن النسخة الاحتياطية.
خلّيه يخطط بالأول… وإنت بتوافق
بوضع التخطيط (plan mode) Claude بيقرأ الملفات، وبيشغّل أوامر قراءة بس عشان يفهم المشروع، وبيكتبلك خطة. ما بيعدّل أي ملف قبل ما توافق على الخطة. لما توافق بيطلع من وضع التخطيط وبينفّذ، وإذا بدك تعدّل الخطة بإيدك قبل الموافقة اضغط Ctrl+G.
ملف settings.json: انسخه زي ما هو
اعمل ملف .claude/settings.json جوّا مجلد مشروعك والصق فيه هاد. deny يعني ممنوع نهائياً، وask يعني لازم يسألك كل مرة:
.claude/settings.json
{
"permissions": {
"defaultMode": "plan",
"deny": [
"Bash(rm -rf *)",
"Bash(rm -fr *)",
"Bash(rm -r *)",
"Bash(git push --force *)",
"Bash(git reset --hard *)",
"Bash(terraform destroy *)",
"Read(./.env)",
"Read(./.env.*)",
"Edit(/prod/**)"
],
"ask": [
"Bash(rm *)",
"Bash(git push *)",
"Bash(terraform apply *)"
]
}
}
بعد ما تحفظه، افتح Claude Code بالمشروع واكتب /permissions: بتشوف كل القواعد ومن أي ملف جاية، وبتقدر تضيف أو تشيل من هناك، حتى والجلسة شغّالة.
شو بتعني كل قاعدة، ووين بتحط الملف
| السطر | شو بيعمل |
|---|---|
| "defaultMode": "plan" | كل جلسة بهالمشروع بتبلّش بوضع التخطيط. القيم المقبولة: default (Manual)، acceptEdits، plan، dontAsk. أما auto وbypassPermissions بينطنّشوا لو حطيتهم بملف المشروع. |
| Bash(rm -rf *) · rm -fr · rm -r | الحذف الجماعي ممنوع بكل صيغه. الكتابة القديمة Bash(rm -rf:*) لسا شغّالة وبتعني نفس الشي (بس كنجمة بآخر النمط). |
| Bash(git push --force *) · git reset --hard | الأمرين اللي بيضيّعوا شغل الفريق أو شغلك المحلي بدون رجعة. |
| Bash(terraform destroy *) | أمر الهدم اللي بالقصة. ضيف جنبه أوامر أداتك إنت (مثلاً Bash(kubectl delete *)). |
| Read(./.env) · Read(./.env.*) | ملفات الأسرار. قاعدة Read بتمنع القراءة والتعديل والإنشاء لهالمسار. المسار نسبة لمجلد المشروع، وبصيغة gitignore. |
| Edit(/prod/**) | ممنوع يعدّل أي ملف تحت مجلد prod/ بالمشروع. لحماية المسارات استعمل Edit(...): قواعد Write(...) ما بتنطبق أبداً. |
| ask: Bash(rm *) | أي حذف تاني بيسألك عليه. ومعه git push وterraform apply: مسموحين بس بعد ما تقرأ وتوافق. |
الترتيب: deny ← ask ← allow
القواعد بتتقيّم بهالترتيب: المنع أول، بعدين السؤال، بعدين السماح. يعني أي deny بأي ملف بيغلب أي allow، حتى لو كان الـ allow بملف تاني.
وين بتحط الملف؟
| الملف | لمين |
|---|---|
| .claude/settings.json | مشروع واحد، وبيتشارك مع فريقك (ارفعه على git). المنع والسؤال بيشتغلوا فوراً عند زملائك؛ السماح بيستنى لحد ما يوثّقوا المجلد. |
| .claude/settings.local.json | إلك إنت بس بهالمشروع، ومش مرفوع على git. مكانه عند جذر مستودع git. |
| ~/.claude/settings.json | كل مشاريعك على الجهاز (على Windows: %USERPROFILE%\.claude\settings.json). |
- «Yes, and don't ask again»: لما تكبسها على أمر Bash، بينحفظ سماح دائم لهالأمر (حسب بدايته) بملف settings.local.json عند جذر المستودع، وما رح يسألك عنه مرة تانية بهالمشروع. الموافقات على تعديل الملفات ما بتنحفظ، بتخلص مع الجلسة.
- إضافة VS Code: إلها إعدادها الخاص claudeCode.initialPermissionMode (القيم: default، plan، acceptEdits، bypassPermissions)، وبتقرأه من إعدادات المستخدم بـ VS Code بس، مش من إعدادات مساحة العمل ولا من settings.json تبع Claude.
وضعين لازم تتجنبهم على مشروع حقيقي
قواعد settings.json بتمسك الأمر حسب نصّه. الطبقتين هدول بيمسكوا اللي بيفلت منها.
Hook بيوقف الأمر الخطر قبل ما يتنفّذ
الـ hook سكربت صغير بيشتغل قبل كل أمر Bash، بيقرأ نص الأمر كامل، وإذا لقى فيه نمط خطر بيرفضه وبيحكي لـ Claude ليش. ولأنه بيفحص النص كله، بيمسك /bin/rm -rf وbash -c "rm -rf …" اللي بتفلت من قواعد الإذن. وبيشتغل قبل قواعد الإذن: حتى لو في allow بيطابق الأمر، الـ hook بيوقفه.
1. ضيف هاد لملف .claude/settings.json (جنب permissions)
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-destructive.sh"
}
]
}
]
}
}
2. اعمل السكربت .claude/hooks/block-destructive.sh (بده jq مثبّت، وبعدها chmod +x)
#!/bin/bash
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -qE 'rm -rf|rm -fr|rm -r |terraform destroy|git push --force|git reset --hard'; then
echo "Blocked by hook: destructive command. Ask the owner first." >&2
exit 2
fi
exit 0
- كيف بيشتغل: Claude Code بيبعث للسكربت JSON فيه الأمر بالحقل tool_input.command. الخروج برقم 2 بيمنع الأمر، والرسالة اللي على stderr بتوصل لـ Claude فبيفهم ليش وبيدوّر على طريقة تانية.
- ضيف أنماطك: حط أوامر أداتك جوّا الـ grep (مثلاً kubectl delete أو DROP TABLE).
- Windows: السكربت بصيغة bash. شغّله من WSL2 أو Git Bash؛ على PowerShell مباشرة ما جرّبته.
الـ Sandbox: منع على مستوى الجهاز
الـ sandbox بيحبس أوامر الـ shell بنظام التشغيل نفسه، مش بفحص النص. فعّله بالأمر /sandbox من جوّا الجلسة، أو بالإعدادات:
{
"sandbox": {
"enabled": true,
"failIfUnavailable": true
}
}
على Linux وWSL2 بده أداتين مثبّتات: bubblewrap وsocat.
شو ما بتمسكه القواعد
التوثيق واضح: قاعدة المنع «بتغطي الطريقة اللي عادةً Claude بيكتب فيها الأمر، ومش حدود أمان حول البرنامج». شوف الفرق:
| مع قاعدة Bash(rm *) | النتيجة |
|---|---|
| rm -rf build/ | بتنمسك ✅ |
| /bin/rm -rf build/ | ما بتنمسك: المسار الكامل غير «rm» ❌ |
| bash -c 'rm -rf build/' | ما بتنمسك: الأمر جوّا نص ❌ |
| timeout 5 rm -rf build/ | بتنمسك: timeout وnice وnohup بينشالوا قبل المطابقة ✅ |
| npx … rm -rf · docker exec … rm -rf | ما بتنمسك: الأغلفة هاي ما بتنشال ❌ |
| npm test && rm -rf build/ | بتنمسك: قواعد المنع والسؤال بتنطبق على كل جزء بالأمر المركّب (&&، ;، |) ✅ |
لهيك الترتيب: القواعد بتمنع الغلط العادي، الـ hook بيمسك اللي بيلفّ عليها بالنص، والـ sandbox بيمنع على مستوى الجهاز. والسكربت اللي بيفتح الملف لحاله (python، node) ما بتمسكه إلا بالـ sandbox.
أخطاء شائعة
- تشغّله على السيرفر الحقيقي من أول تجربة: جرّب على نسخة أو بيئة تجربة أول.
- تفكّر إن القواعد قفل كامل: هي حماية من الغلط، مش جدار أمان. القسم 8 فوق.
- تحط "defaultMode": "auto" بملف المشروع: بينطنّش. أوضاع auto وbypass بتتحط بإعدادات المستخدم أو المدارة بس.