الأذونات
تحكّم في الإجراءات التي تتطلب موافقة قبل تنفيذها.
يستخدم OpenCode إعداد permission لتحديد ما إذا كان إجراءٌ ما سيُنفّذ تلقائيًا، أو سيطلب موافقتك، أو سيتم حظره.
اعتبارًا من v1.1.1، تم إهمال إعداد tools القديم (المنطقي) ودمجه ضمن permission. ولا يزال إعداد tools القديم مدعومًا للتوافق مع الإصدارات السابقة.
الإجراءات
يؤول كل حكم أذونات إلى إحدى القيم التالية:
"allow"— تشغيل دون موافقة"ask"— طلب الموافقة"deny"— حظر الإجراء
الإعداد
يمكنك تعيين الأذونات بشكل عام (باستخدام *) ثم تجاوزها لأدوات محددة.
{ "$schema": "https://opencode.ai/config.json", "permission": { "*": "ask", "bash": "allow", "edit": "deny" }}يمكنك أيضًا تعيين جميع الأذونات دفعة واحدة:
{ "$schema": "https://opencode.ai/config.json", "permission": "allow"}قواعد دقيقة (صيغة الكائن)
في معظم الأذونات، يمكنك استخدام كائن لتطبيق إجراءات مختلفة بناءً على مُدخلات الأداة.
{ "$schema": "https://opencode.ai/config.json", "permission": { "bash": { "*": "ask", "git *": "allow", "npm *": "allow", "rm *": "deny", "grep *": "allow" }, "edit": { "*": "deny", "packages/web/src/content/docs/*.mdx": "allow" } }}تُقيَّم القواعد عبر مطابقة الأنماط، مع كون آخر قاعدة مطابقة هي التي تُطبَّق. من الشائع وضع قاعدة الشمول "*" أولًا ثم القواعد الأكثر تحديدًا بعدها.
أحرف البدل
تستخدم أنماط الأذونات مطابقة بسيطة لأحرف البدل:
*يطابق صفرًا أو أكثر من أي حرف?يطابق حرفًا واحدًا بالضبط- جميع الأحرف الأخرى تُطابق حرفيًا
توسيع مجلد المنزل
يمكنك استخدام ~ أو $HOME في بداية النمط للإشارة إلى مجلد المنزل. هذا مفيد خصوصًا لقواعد external_directory.
~/projects/*->/Users/username/projects/*$HOME/projects/*->/Users/username/projects/*~->/Users/username
الأدلة الخارجية
استخدم external_directory للسماح باستدعاءات الأدوات التي تلمس مسارات خارج دليل العمل الذي بدأ منه OpenCode. ينطبق ذلك على أي أداة تأخذ مسارًا كمدخل (مثل read وedit وlist وglob وgrep والعديد من أوامر bash).
توسيع المنزل (مثل ~/...) يؤثر فقط على طريقة كتابة النمط. لا يجعل ذلك المسار الخارجي جزءًا من مساحة العمل الحالية، لذا يجب السماح بالمسارات خارج دليل العمل عبر external_directory أيضًا.
على سبيل المثال، يتيح هذا الوصول إلى كل ما يقع تحت ~/projects/personal/:
{ "$schema": "https://opencode.ai/config.json", "permission": { "external_directory": { "~/projects/personal/**": "allow" } }}أي دليل مسموح به هنا يرث نفس القيم الافتراضية لمساحة العمل الحالية. وبما أن read افتراضيًا هو allow، فإن عمليات القراءة تكون مسموحة أيضًا للعناصر ضمن external_directory ما لم يتم تجاوز ذلك. أضِف قواعد صريحة عندما يجب تقييد أداة ما في هذه المسارات، مثل حظر التعديلات مع الإبقاء على القراءة:
{ "$schema": "https://opencode.ai/config.json", "permission": { "external_directory": { "~/projects/personal/**": "allow" }, "edit": { "~/projects/personal/**": "deny" } }}اجعل القائمة مقتصرة على المسارات الموثوقة، ثم أضِف طبقات إضافية من قواعد allow أو deny حسب الحاجة لأدوات أخرى (مثل bash).
الأذونات المتاحة
تُعرَّف أذونات OpenCode بأسماء الأدوات، بالإضافة إلى بعض حواجز الأمان:
read— قراءة ملف (يطابق مسار الملف)edit— جميع تعديلات الملفات (يشملeditوwriteوpatchوmultiedit)glob— مطابقة أسماء الملفات (يطابق نمط الـ glob)grep— البحث في المحتوى (يطابق نمط regex)list— سرد الملفات في دليل (يطابق مسار الدليل)bash— تشغيل أوامر shell (يطابق الأوامر المُحلَّلة مثلgit status --porcelain)task— تشغيل وكلاء فرعيين (يطابق نوع الوكيل الفرعي)skill— تحميل مهارة (يطابق اسم المهارة)lsp— تشغيل استعلامات LSP (حاليًا دون قواعد دقيقة)todoread,todowrite— قراءة/تحديث قائمة المهامwebfetch— جلب عنوان URL (يطابق الـ URL)websearch,codesearch— بحث الويب/الكود (يطابق الاستعلام)external_directory— يُفعَّل عندما تلمس أداة مسارات خارج دليل عمل المشروعdoom_loop— يُفعَّل عندما يتكرر نفس استدعاء الأداة 3 مرات مع نفس المُدخلات
القيم الافتراضية
إذا لم تحدد شيئًا، يبدأ OpenCode بقيم افتراضية متساهلة:
- معظم الأذونات افتراضيًا تكون
"allow". doom_loopوexternal_directoryافتراضيًا تكون"ask".readهو"allow"، لكن ملفات.envتكون مرفوضة افتراضيًا:
{ "permission": { "read": { "*": "allow", "*.env": "deny", "*.env.*": "deny", "*.env.example": "allow" } }}ماذا تفعل "ask"
عندما يطلب OpenCode الموافقة، تعرض الواجهة ثلاث نتائج ممكنة:
once— الموافقة على هذا الطلب فقطalways— الموافقة على الطلبات المستقبلية المطابقة للأنماط المقترحة (لباقي جلسة OpenCode الحالية)reject— رفض الطلب
مجموعة الأنماط التي ستوافق عليها always تُوفَّر من الأداة نفسها (على سبيل المثال، موافقات bash عادةً ما تُدرج بادئة أمر آمنة في القائمة البيضاء مثل git status*).
الوكلاء
يمكنك تجاوز الأذونات لكل وكيل. تُدمَج أذونات الوكلاء مع الإعداد العام، وتكون قواعد الوكيل هي ذات الأولوية. تعرّف أكثر على أذونات الوكلاء.
{ "$schema": "https://opencode.ai/config.json", "permission": { "bash": { "*": "ask", "git *": "allow", "git commit *": "deny", "git push *": "deny", "grep *": "allow" } }, "agent": { "build": { "permission": { "bash": { "*": "ask", "git *": "allow", "git commit *": "ask", "git push *": "deny", "grep *": "allow" } } } }}يمكنك أيضًا ضبط أذونات الوكيل في Markdown:
---description: Code review without editsmode: subagentpermission: edit: deny bash: ask webfetch: deny---
Only analyze code and suggest changes.