أذونات Claude Code: قواعد allow وdeny وask مشروحة
جولة إطارًا بإطار في كيفية طلب Claude Code الإذن: الخيارات الثلاثة في النافذة، وقواعد allow المحفوظة في settings.local.json، وترتيب التقييم الذي يقدّم deny، وأوضاع الأذونات، ووصفات تقلل الترقب في الكود اليومي وفي الـ CI — مع ملء كل ما تركه الفيديو من الوثائق الرسمية.
أذونات Claude Code في 60 ثانية
- يستفسر Claude Code قبل Bash وEdit وWebFetch وWrite؛ أما Read وGlob وGrep وLS فتعمل دون سؤال.
- اختيار "Yes, and don't ask again" يحفظ قاعدة مثل Bash(git add:*) في .claude/settings.local.json — دفتر قواعدك الشخصي المستثنى من git لهذا المستودع.
- تُقيَّم القواعد بترتيب deny ثم ask ثم allow: أي deny من أي ملف إعدادات يفوز، ولا يمكن لأي قاعدة allow أن تحفر استثناءً فيه.
- الأوضاع تضبط مستوى الثقة: acceptEdits (alt+m) للعمل الكثيف بالتعديلات، وplan للاستطلاع للقراءة فقط، وbypassPermissions للـ CI عبر --permission-mode — وقيم defaultMode مثل auto وbypassPermissions لا تنفذ إلا من الإعدادات الشخصية أو المُدارة.
Claude Code Tutorial #4 - Tools & Permissions
القناة:The Net Ninja4:55
Permission Modes Head to Head
القناة:ttywood6:20
Permissions — Claude Code documentation
الوثائق:code.claude.com
Settings files — Claude Code documentation
الوثائق:code.claude.com
كل لقطة ثابتة مأخوذة من تسجيل Net Ninja، وهو التقاط شاشة نظيف بلا كاميرا أو طبقات. وقد استُخدمت حلقة ttywood التي تقارن أوضاع الأذونات وجهاً لوجه مرجعًا متقاطعًا لقسمي الأوضاع والوصفات دون أي إطارات منها — إذ تحمل إطاراتها تعليقات مطبوعة. صيغة القواعد وترتيب التقييم وسلوك الأوضاع وأولوية ملفات الإعدادات مدققة مقابل صفحتي الوثائق الرسميتين.
الفيديوهات © The Net Ninja وttywood، ومذكورة روابط فقط. الوثائق © Anthropic. اللقطات مستشهد بها في هذا الدليل لأغراض التعليق.
اضبط أذونات Claude Code خطوة خطوة
عم يسأل Claude Code قبل أن يتحرك
- 1
اعرف أي الأدوات تطلق نافذة إذن
يختار Claude Code أدواته بنفسه — Read لفتح الملفات وEdit لتعديلها وBash لأوامر الشل. تمنح وثائق الإعدادات من Anthropic كلًا منها عمود Permission Required: يتوقف Bash وEdit وWebFetch وWrite ليسألوا، بينما تنفذ Read وGlob وGrep وLS مباشرة. لن تكتب أسماء الأدوات بنفسك أبدًا؛ المهم أن تعرف سلفًا أي الإجراءات ستتوقف بانتظارك.

تسرُد وثائق إعدادات Claude Code كل أداة مدمجة مع حكم Permission Required الخاص بها.شاهد عند 1:05 - 2
اطلب تعديلًا وراقبه وهو يقرأ أولًا
الطلب في الفيديو صغير عمدًا: إضافة متغير --highlight بالأصفر الباستيلي إلى src/app/globals.css. يقرأ Claude Code الملف أولًا — فـ Read لا يحتاج إذنًا قط — ولا يتوقف إلا قبل تعديله. هذا الانفصال هو نموذج الأذونات كله مصغرًا: النظر مجاني، واللمس يستلزم إذنًا.

طلب متغير التمييز مكتوب في حقل إدخال Claude Code داخل VS Code.شاهد عند 1:45 - 3
اقرأ الخيارات الثلاثة قبل أن تجيب
كل نافذة تعديل تقدم ثلاثة أجوبة. 1. Yes يوافق على هذا التعديل وحده. 2. Yes, and don't ask again this session يوافق بقيّة تعديلات الجلسة (alt+m في النسخة المعروضة). 3. No, and tell Claude what to do differently (esc) يرفض التغيير ويترك لك القيادة. الخيار الثالث ليس فشلًا — إنه طريقتك لتصحيح المسار قبل أن يهبط الكود.

نافذة تعديل globals.css والخيارات الثلاثة للأذونات ظاهرة كاملة.شاهد عند 2:17
قل نعم مرة واحدة: احفظ قاعدة allow
- 4
توقع نافذة لكل تعديل لا لكل مهمة
الموافقة لا تمتد إلى التغيير التالي. احتاج العرض ثلاث ضغطات Yes لثلاثة تعديلات منفصلة على الملف نفسه، وتغيّر تالٍ سأل من جديد. الموافقة على كل شيء تعمل، لكنها تتدهور بعد مهمة من سطرين — ولهذا وُجدت قواعد allow والأوضاع أصلًا.

تعديل ثانٍ على globals.css يستدعي نافذة من جديد بعد الموافقة على الأول بقليل.شاهد عند 2:32 - 5
أوامر Bash تسأل ببوابة منفصلة
لأوامر الشل بوابتها الخاصة. حين طُلب من Claude في العرض إجراء commit، ظل Bash(git add src/app/globals.css) في حالة Waiting بانتظارك. نعم لأمر واحد ليست نعم للأمر التالي — فـ git commit اللاحق يسأل من جديد باسمه.

أمر git add معلق بانتظار الموافقة، وفوقه يمر ناتج git السابق.شاهد عند 3:16 - 6
دع "لا تسأل مجددًا" يكتب القاعدة عنك
اختيار Yes, and don't ask again لأوامر git add ينجز أمرين معًا: يطلق الأمر الحالي ويحفظ قاعدة. الملف الذي ينشئه هو .claude/settings.local.json في جذر المستودع، وفيه كائن permissions بمصفوفة allow — هنا "Bash(git add:*)" — إضافة إلى مصفوفتي deny وask فارغتين. من الآن يعمل كل git add قادم في هذا المشروع دون أي سؤال.

أنشئ settings.local.json تحت .claude مع حفظ قاعدة allow وهي Bash(git add:*).شاهد عند 3:40 - 7
عدّل القواعد يدويًا حين تعجز النافذة
مصفوفة allow مجرد JSON، فبوسعك إضافة القواعد بنفسك. استخدم نصًا مطابقًا للأمر الواحد — Bash(npm run test) — ولاحقة :* لكل ما يبدأ بنفس الطريقة — Bash(npm run test:*). تؤكد الوثائق أن :* هي الاختصار للبديل الذيلي. أبقِ الملف شخصيًا: يستثني Claude Code ملف settings.local.json تلقائيًا من git، والفيديو يقول المثل — إنه لسير عملك أنت لا للمستودع.

القاعدة المحفوظة محددة داخل permissions.allow أثناء تعديل الملف يدويًا.شاهد عند 4:22
اضبط درجة التفويض بالأوضاع
- 8
انتقل إلى accept edits في فترات التعديل الكثيف
alt+m (وتدور الأوضاع في النسخ الحديثة بـ shift+tab) يحوّل شارة الجلسة إلى accept edits on. تسقط تعديلات الملفات بعد ذلك دون نوافذ، وتضيف الوثائق أن أوامر نظام الملفات الشائعة — mkdir وtouch وmv وcp — تُقبل تلقائيًا أيضًا. هذه السماحة محصورة بالجلسة: افتح جلسة جديدة وتعود النوافذ لكل تعديل حتى تعيد التفعيل.

شارة accept edits on بينما تُكمل أوامر git المسموحة الـ commit.شاهد عند 4:35 - 9
اعرف سلّم الأوضاع كاملًا قبل أن تصعد
تحدد الأوضاع الوقفة الافتراضية للجلسة. default يسأل عند أول استخدام لكل أداة؛ plan استكشاف للقراءة فقط لا يعدّل شيئًا؛ acceptEdits يقبل تعديلات الملفات تلقائيًا؛ dontAsk يرفض تلقائيًا كل ما كان سيُسأل عنه؛ auto يوافق استدعاءات الأدوات مع فحوص أمان في الخلفية؛ bypassPermissions يتجاوز النوافذ عدا المجموعة الصغيرة التي لا يجوز لأي وضع الموافقة عليها تلقائيًا. اختر واحدًا لكل جلسة عبر --permission-mode أو ثبّته عبر permissions.defaultMode.
- 10
ضع defaultMode في الملف الصحيح
وثائق الإعدادات صريحة: قيمتا defaultMode وهما auto وbypassPermissions لا تنفذان من إعدادات المشروع أو المحلية — ضعهما في الإعدادات الشخصية (~/.claude/settings.json) أو المُدارة، أو مرّر --permission-mode لجلسة واحدة. يسري ترتيب الأولوية هكذا: managed settings ← CLI --settings ← .claude/settings.local.json ← .claude/settings.json ← الإعدادات الشخصية، وأي deny في أي مستوى يغلب كل allow دونه.
وصفات جاهزة للنسخ لمشاريع حقيقية
- 11
وصفة: اسمح بالاختبارات واحظر التدمير
في ملف .claude/settings.json المشترك بين الفريق، اسمح بحلقة الاختبار عبر "Bash(npm run test:*)" وأسور الأجزاء الخطرة بـ "Bash(rm -rf *)" و"Read(./.env)" كي لا تُقرأ الأسرار قط. وبحث الويب يُضبط بالطريقة نفسها: "WebFetch(domain:example.com)" لنطاق واحد، و"WebFetch(domain:*.example.com)" لنطاق فرعي كامل. ولأن deny يُقيَّم أولًا فلا يمكن لأي قاعدة allow أن تحفر استثناءً فيه.
- 12
وصفة: تخطَّ النوافذ بأمان في الـ CI
تحتاج التشغيلات غير التفاعلية وقفة متعمدة لا عرضية: مرر --permission-mode bypassPermissions في مهمة الـ CI، أو اضبط defaultMode في الإعدادات الشخصية أو المُدارة — فملف المشروع لا يملك منحها. ولجعل الحاجز دائمًا، اضبط permissions.disableBypassPermissionsMode على "disable" في الإعدادات المُدارة، ودقّق أي جهاز عبر /permissions التي تسرد كل قاعدة فعالة والملف الذي جاء منها.
deny → ask → allow: كيف تُقيَّم القواعد فعلًا
تقول وثائق الأذونات بوضوح: تُقيَّم القواعد بالترتيب — deny ثم ask ثم allow — وأول تطابق يحسم النتيجة، ولا تغيّر دقة القاعدة ذلك الترتيب أبدًا. لا يمكن لقاعدة allow أن تحفر استثناءً من قاعدة deny مهما بلغت دقتها.
كما أن deny عالمي عبر الملفات. إذا سمحت الإعدادات الشخصية بأمر ومنعته إعدادات المشروع، فالفوز لـ deny، لأن قواعد deny من أي نطاق تُقيَّم قبل قواعد allow — وdeny في الإعدادات المُدارة لا تتجاوزه حتى أعلام سطر الأوامر. وإنكار اسم أداة عارٍ مثل "Bash" يتقدم خطوة أبعد: تقول الوثائق إنه يزيل الأداة من سياق Claude كليًا.
النتيجة العملية: ضع قواعد أمانك — منع rm، ومنع قراءة .env، ومنع force-push — في ملف .claude/settings.json على مستوى المشروع الذي يسافر مع المستودع، واعتبر قوائم allow وسائل راحة تتراكم فوقها. قوائم allow تُدمج عبر النطاقات بدل أن تتحجّم، فيستطيع settings.local.json الشخصي إضافة تساهلات دون إضعاف منع أي أحد.
ثلاث وصفات تستحق النسخ
كل وصفة تسمي الملف الذي تُكتب فيه. وقاعدة واحدة تحكمها جميعًا: deny يفوز في كل مكان وفي كل وقت.
شغّل الاختبارات بحرية وأبقِ rm و.env مقفولين
في .claude/settings.json: "permissions.allow": ["Bash(npm run test:*)"] (استبدلها بـ "Bash(npx vitest:*)" أو "Bash(uv run pytest:*)" بحسب مجموعتك)، و"permissions.deny": ["Bash(rm -rf *)", "Read(./.env)"]. تعمل الاختبارات وكولباكاتها دون حراسة؛ أما الحذف المدمّر وقراءة الأسرار فيُحجبان قبل أن تصل المتابعة إلى قائمة allow أصلًا.
ثبّت البحث على النطاقات التي تثق بها
للعمل الغارق في الوثائق: "WebFetch(domain:developer.mozilla.org)" و"WebFetch(domain:claude.com)" في allow، أو "WebFetch(domain:*.example.com)" لتغطية نطاق فرعي كامل. وإنكار الأداة العارية "WebFetch" يطفئ قراءة الويب كليًا — وهو مفيد للتشغيلات القابلة لإعادة الإنتاج التي يجب أن تعيش على السياق المحلي وحده.
اجعل الـ CI بلا رأس دون أن يخرج عن اللجام
اجعل مهمة الـ CI تمرر --permission-mode bypassPermissions، أو اضبط "permissions.defaultMode": "bypassPermissions" في الإعدادات الشخصية أو المُدارة — لا يمكن لإعدادات المشروع والمحلية منح ذلك. ولمنع الوضع منعًا قاطعًا، يقفل "permissions.disableBypassPermissionsMode": "disable" في الإعدادات المُدارة الباب على كل مستودع وعلم. وحتى عندها يواصل bypassPermissions حجب القائمة القصيرة من الإجراءات التي لا يجوز لأي وضع الموافقة عليها تلقائيًا.
القاعدة لا تعمل؟ افحص هذه الأربعة
معظم تقارير «قاعدة allow يتم تجاهلها» ترجع إلى الملف الذي سقطت فيه والملف الذي يفوز.
- 1قاعدة صحيحة في ملف خاطئ. موافقات الجلسة تسقط في .claude/settings.local.json؛ وقواعد الفريق موضعها .claude/settings.json؛ وقواعد الجهاز كله في ~/.claude/settings.json. شغّل /permissions — تسرد كل قاعدة فعالة وملف الإعدادات الذي جاءت منه.
- 2ملف أعلى يمنعها. القيم تتجاوز نزولًا، لكن deny من أي مستوى يُقيَّم قبل allow، فلا تنقذ allow على المستوى الشخصي منعًا على مستوى المشروع — والإعدادات المُدارة تغلب كل شيء بما فيها أعلام سطر الأوامر.
- 3قاعدة allow تنتظر الثقة. تنطبق deny وask فورًا، أما قواعد allow القادمة من ملف مشروع مُودَع فلا تنفذ إلا بعد أن توثق مجلد مساحة العمل — بوابة مقصودة للمستودعات المستنسخة.
- 4وضع في ملف خاطئ. تُتجاهل قيمتا defaultMode وهما auto وbypassPermissions من إعدادات المشروع والمحلية (تلاحظ الوثائق أن هذا التغيير منذ v2.1.257 — قبلها كان bypassPermissions ينفذ من أي ملف). انقلها إلى الإعدادات الشخصية أو المُدارة، أو استخدم --permission-mode لجلسة واحدة.
