انتقل إلى المحتوى الرئيسي

الوحدة 7 — الأذونات وأوضاع التنفيذ وsandbox وملفّات الإعدادات

بيّنت الوحدة 6 أنّ skill تُوافق مسبقًا على بضع أدوات لتور. تعتني هذه الوحدة بالطبقة الأدنى: القواعد العامّة التي تُقرِّر، لكامل الجلسة، ما يمكن لـClaude قراءته وكتابته وتنفيذه ووصله. هي الطبقة التي تُوضع فور فتح مستودع: تحمي .env، وتترك make test يعمل دون تأكيد، وتعزل أوامر Bash عبر sandbox، وتُقرّر من يُوافق على أفعال Claude — أنت، مصنِّف، أو لا أحد.

نموذج الأذونات

قاعدة الإذن لها الصيغة Outil أو Outil(spécificateur). تعيش في قائمة permissions.allow أو permissions.ask أو permissions.deny في ملفّ إعدادات، أو في flag CLI (--allowedTools، --disallowedTools، --permission-mode). تُقيَّم القواعد deny أوّلًا، ثمّ ask، ثمّ allow؛ أوّل مطابقة تحسم. لا يقبل deny استثناءً، وask عامّ يفرض السؤال حتّى مع تطابق allow أخصّ.

الصيغةالأثر
Bash أو Bash(*)كلّ أمر Bash. في deny، تُزيل الأداة من السياق.
Bash(npm run *)كلّ أمر يبدأ بـnpm run، بما فيه npm run وحده.
Bash(git *)كلّ أمر git — يُغطّي كذلك git push.
Edit(app/**)تحرير تحت app/ (بأسلوب gitignore، مربوط بمصدر الإعدادات).
Edit(/src/**)مربوط بجذر المشروع في إعدادات المشروع. // وحيد يربط بجذر النظام.
Read(./.env)يحجب قراءة .env الجاري؛ يحجب كذلك Edit وWrite على هذا المسار (v2.1.208+/v2.1.228+).
WebFetch(domain:example.com)fetch نحو example.com. domain:*.example.com يُغطّي النطاقات الفرعيّة.
mcp__github__get_*أدوات MCP التي يبدأ اسمها بـget_ على خادم github.
Agent(Explore)وكيل فرعيّ اسمه Explore.
Cd(~/code/**)وجهة مسموح بها لـ/cd. allow يُبدِّل /cd إلى وضع allowlist.

قاعدتان تُحفَظان بشأن Bash: * تطابق أيّ نصّ بما فيه المسافات، وClaude Code يعرف عوامل shellBash(safe-cmd *) في allow لا يُغطّي safe-cmd && rm -rf .. الفواصل المتعرَّف عليها هي && و|| و; و| و|& و& والانتقال إلى سطر جديد. لـ> fichier، يمرّ المسار المستهدف بقواعد Edit وبالمسارات المحميّة.

يفتح أمر /permissions حوارًا تفاعليًّا نرى فيه كلّ قاعدة ونطاقها وملفّها الأصل؛ تُطبَّق التعديلات على أوّل استدعاء أداة قادم في التور نفسه (v2.1.234+).

الأوضاع الستّة للتنفيذ

يُقرِّر وضع التنفيذ من يُوافق على استدعاءات الأدوات التي لا تحسمها القواعد. ستّ قيم مُعرَّضة عبر permissions.defaultMode أو flag --permission-mode.

الوضعما يعمل دون طلب
default (المُلقَّب Manual)القراءات فقط. طلب على كلّ تحرير وكلّ Bash خارج قائمة read-only المدمجة.
acceptEditsالقراءات، والتحريرات داخل مجلّدات العمل، بالإضافة إلى mkdir وtouch وmv وcp وrm وrmdir وsed.
planقراءة واستكشاف فقط، بلا تحرير. يُمرِّر المصنِّف أوامر shell إن كان auto متاحًا.
autoكلّ شيء، مع مصنِّف (نموذج صغير) يرفض الأفعال الخطرة. افتراضيًّا على Pro/Max/Team منذ v2.1.228 (macOS/Linux/WSL).
dontAskفقط allow الصريحة وأوامر القراءة فقط؛ الباقي مرفوض. مثاليّ لـCI.
bypassPermissionsكلّ شيء، باستثناء بعض الحواجز (المسارات الحرجة). يُحفَظ للحاويات المعزولة. --dangerously-skip-permissions يكافئه.

Shift+Tab يُدوِّر الأوضاع في الـCLI؛ يظهر auto حين يكون متاحًا؛ ولا يظهر bypassPermissions إلّا بعد إطلاق صريح. في الإعدادات المُدارة، permissions.disableBypassPermissionsMode وpermissions.disableAutoMode بقيمة "disable" يحجبان bypass وauto على التوالي. قيمة auto في defaultMode لا تُقبَل في .claude/settings.json ولا .local.json — يجب وضعها في ~/.claude/settings.json أو في الإعدادات المُدارة.

المسارات المحميّة والحرجة

مجموعتان من المسارات لا تُوافَق عليها تلقائيًّا أبدًا، ما لم يكن الوضع bypassPermissions.

  • المسارات المحميّة.git، .claude (باستثناء .claude/worktrees.vscode، .idea، .husky، .devcontainer، .gitconfig، .bashrc، .zshrc، .npmrc، .mcp.json، .claude.json، إلخ. كتابة تسأل في Manual/acceptEdits، وتمرّ عبر المصنِّف في auto، وتُرفض في dontAsk.
  • المسارات الحرجة لـrm/rmdir — الجذر /، المجلّدات من المستوى الأوّل (/usr، /etc…)، المسار الشخصيّ، C:\، المسار الجاري وآباؤه. لا allow ولا hook PreToolUse يستطيعان الموافقة على rm -rf على هذه المسارات.

sandbox Bash

sandbox هو مُكمِّل OS للقواعد: يُطبِّق جدار حماية filesystem وشبكة على كلّ أمر shell وأبنائه. على macOS يستعمل Seatbelt (لا شيء يُثبَّت)؛ على Linux وWSL2 يستند إلى bubblewrap وsocat (يجب تثبيتهما). Windows الأصيل غير مدعوم — مرّ عبر WSL2.

يفتح /sandbox لوحة بثلاث تبويبات (Mode، Overrides، Config)، بالإضافة إلى Dependencies إن غابت حزمة. يذهب الاختيار إلى .claude/settings.local.json. للتفعيل في كلّ مكان، sandbox.enabled: true في ~/.claude/settings.json.

وضعان لـsandbox، مستقلّان عن وضع الأذونات:

  • Auto-allow: تعمل الأوامر القابلة للـsandbox دون طلب؛ والأخرى (مضيف غير مُدرَج في allowlist، عدم توافق) تسقط في التدفّق العاديّ. Bash(*) في ask يُتجاهَل للأوامر المُعزَّلة (باستثناء plan).
  • Regular permissions: يعزل sandbox، لكن يمرّ كلّ أمر بتدفّق الأذونات.

افتراضيًّا، يكتب أمر مُعزَّل في مسار العمل، وtmp الجلسة، والمجلّدات المُضافة (--add-dir، permissions.additionalDirectories). نُوسّع بـsandbox.filesystem.allowWrite؛ ونُقيّد بـdenyWrite وdenyRead. الشبكة مُدرَجة في allowlist بحسب المجال عبر sandbox.network.allowedDomains، ومدخلاتها تندمج بين النطاقات عوضًا عن أن يستبدل أحدها الآخر.

أمر لا يمكن حقًّا عزله يمكن إعادة محاولته بالمعامل dangerouslyDisableSandbox (« unsandboxed retry »)؛ في Manual يسأل، وفي auto يحكم المصنِّف. لقطع هذا المخرج: sandbox.allowUnsandboxedCommands: false.

ملفّات الإعدادات والأسبقيّة

يقرأ Claude Code إعداداته من خمسة مصادر، بترتيب صارم — أوّل من يُعرِّف مفتاحًا يفوز.

الرتبةالمصدرالمسار أو الأصلالنطاق
1Managedmanaged-settings.json، MDM، console claude.aiمؤسّسة (لا يُبدَّل، باستثناءات)
2CLI --settingsJSON inline أو ملفّهذه الجلسة
3مشروع محلّيّ.claude/settings.local.jsonأنت، هذا المشروع (غير مُودَع)
4مشروع مشترك.claude/settings.jsonكلّ الفريق (يُودَع)
5مستخدم~/.claude/settings.jsonأنت، كلّ مشاريعك

متغيّرات البيئة ليست مستوى: لكلّ سلوك، تُوضّح الوثائق إن كان المتغيّر يفوز (ANTHROPIC_MODEL يفوز على model) أو يتنازل (ANTHROPIC_DEFAULT_MODEL لا يُقبَل إلّا إن لم يُعرِّف أيّ ملفّ model). deny في أيّ نطاق يحجب allow من نطاق آخر: أسبقيّة deny > ask > allow تنطبق عبر النطاقات؛ --allowedTools لا يُناقض deny مُدارًا.

المفاتيح الرئيسيّة لـpermissions: allow وask وdeny وadditionalDirectories وblockReadsOutsideWorkingDirectories وdefaultMode وdisableBypassPermissionsMode وdisableAutoMode. allowManagedPermissionRulesOnly يحصر القواعد بالإعدادات المُدارة. مفاتيح أخرى مفيدة: apiKeyHelper (أمر shell يُولّد مفتاح API)، awsAuthRefresh (يُنعش Bedrock)، env (متغيّرات مضخوخة)، skillOverrides (رؤية skills)، sandbox.*. أمر /config clé=valeur (v2.1.181+) يكتب مفتاحًا دون فتح القائمة.

ملفّ .claude/settings.local.json مُودَع يفقد وضعه الشخصيّ ويصبح مصدر مشروع؛ تبقى قواعده في الانتظار ما لم تُمنح ثقة فضاء العمل. المِثل إن كان .claude رابطًا رمزيًّا.

متغيّرات البيئة المفتاحيّة

  • CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 — يُعطّل الوكلاء الفرعيّين في الخلفيّة وbackground: true.
  • CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1 — يُنظّف بيئة العمليّات الفرعيّة (مفيد في sandbox Linux).
  • CLAUDE_CODE_USE_BEDROCK=1، CLAUDE_CODE_USE_VERTEX=1 — يُفعّلان Bedrock/Vertex ويُظهران /setup-bedrock و/setup-vertex.
  • CLAUDE_CONFIG_DIR — ينقل مجلّد الإعدادات خارج ~/.claude.
  • DISABLE_DOCTOR_COMMAND=1 — يُخفي /doctor.

الخيط الأحمر: إحكام Kiosque

بعد ثلاث وحدات على Kiosque بلا شبكة أمان، نضع أذونات. الملفّ المشترك (.claude/settings.json، مُودَع) يُعرِّف ما يجب أن يمتلكه كلّ الفريق؛ الملفّ الشخصيّ المحلّيّ يُصقِل.

acme-kiosque/.claude/settings.json
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"defaultMode": "acceptEdits",
"additionalDirectories": ["../kiosque-migrations"],
"allow": [
"Bash(make test)",
"Bash(make lint)",
"Bash(make dev)",
"Bash(pytest *)",
"Bash(ruff *)",
"Bash(mypy *)",
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(gh pr *)",
"Edit(app/**)",
"Edit(tests/**)",
"Edit(web/src/**)",
"WebFetch(domain:fastapi.tiangolo.com)",
"WebFetch(domain:docs.python.org)"
],
"ask": [
"Bash(git push *)",
"Bash(alembic upgrade *)"
],
"deny": [
"Read(./.env)",
"Read(./secrets/**)",
"Edit(./migrations/**)",
"Bash(rm -rf *)",
"Bash(git push --force*)",
"Bash(git push -f *)",
"Bash(git reset --hard *)"
]
},
"sandbox": {
"enabled": true,
"network": {
"allowedDomains": ["*.pypi.org", "registry.npmjs.org", "*.github.com"]
}
}
}

يفتح كريم المشروع ويقبل ثقة فضاء العمل. في Manual صرف، اليوم سيكون مؤلمًا؛ acceptEdits يترك التحريرات تمرّ داخل مجلّدات العمل. تُحجَب pushes القسريّة تمامًا، ويطلب git push عاديّ التأكيد، وتبقى هجرات SQL محجوبة على التحرير. لدى ليا ملفّها الشخصيّ للواجهة الأماميّة:

acme-kiosque/.claude/settings.local.json
{
"permissions": {
"allow": ["Bash(npm run *)", "Bash(pnpm *)", "WebFetch(domain:vitejs.dev)"]
}
}

بعد أسبوع، تدقيق /permissions يعرض اثنَي عشر حظرًا على Bash(alembic downgrade *). نُكمل ask عوضًا عن فتح كلّ شيء، ونُودع. عند الشكّ، يعرض claude doctor القواعد المرفوضة، ويشرح --debug رفضًا.

ملفّ .claude/settings.local.json مُودَع يُغيِّر وضعه

بمجرّد إيداعه (أو حين يكون .claude رابطًا رمزيًّا)، يعامله Claude Code كمصدر مشروع ويحفظ قواعده حتّى تُمنح ثقة فضاء العمل — حماية ضدّ مستودع يُصرِّح لنفسه بـBash(*).

الخلاصة

  • قواعد الأذونات لها الصيغة Outil(spécificateur) وتُقيَّم deny > ask > allow؛ deny من نطاق يحجب allow من نطاق آخر.
  • الأوضاع الستّةdefault (Manual)، acceptEdits، plan، auto، dontAsk، bypassPermissions — تُقرّر من يُوافق. Shift+Tab يُدوِّر، و--permission-mode يُثبِّت عند الإطلاق.
  • المسارات المحميّة (.git، .claude، .env، .mcp.json…) والمسارات الحرجة (rm -rf /، ~، المسار الجاري) لا تُوافَق عليها تلقائيًّا أبدًا، باستثناء bypassPermissions.
  • sandbox Bash يُطبِّق جدار حماية OS على أوامر shell وأبنائها: sandbox.enabled، sandbox.filesystem.allow/denyWrite، sandbox.network.allowedDomains. وضعان: auto-allow وregular.
  • أسبقيّة الإعدادات: managed > CLI --settings > مشروع محلّيّ > مشروع مشترك > مستخدم. defaultMode: "auto" في .claude/settings.json لا يُقبَل — يجب أن يكون في مستخدم أو managed.
  • /permissions يُعدِّل مباشرةً، و**/status** يعرض المصادر المحمَّلة، و**claude doctor** يعرض القواعد المرفوضة.

الوحدة التالية: وضع plan، وcheckpoints، والجلسات، وworktrees: العمل بلا خوف — شبكات الأمان على جانب المحادثة والشيفرة وgit التي تجعل التجريب قابلاً للرجوع.