Thorfin OpenCode School

الدرس 4

الصلاحيات

تحكّم فيما يمكن لـ OpenCode فعله وما لا يمكنه فعله دون أن يسألك.

في درس الإعدادات، ضبطت صلاحيات أساسية بقواعد "ask" للأوامر التدميرية مثل rm وrmdir. لنذهب أبعد الآن — بإضافة حواجز لعمليات Git والتعرّف على التجاوزات الخاصة بكل مشروع.

مستويات الصلاحيات الثلاثة

كل إجراء يتخذه OpenCode تحكمه واحدة من ثلاث قواعد:

المستوىما يحدث
allowيُنفَّذ الإجراء فورًا، دون أي سؤال
askيتوقف OpenCode ويسألك الموافقة قبل المتابعة
denyيُحظر الإجراء تمامًا

لقد رأيت بالفعل allow وask في إعداداتك. مستوى deny يحظر الإجراء مباشرة — ولن يحاول OpenCode حتى تنفيذه. استخدم deny للأشياء التي لا تريد أن تحدث تلقائيًا أبدًا، مثل chmod أو chown.

عندما يطلب OpenCode الإذن

عندما يصطدم OpenCode بقاعدة ask، يتوقف ويعرض عليك ثلاثة خيارات:

  • Allow Once — الموافقة على هذا الإجراء تحديدًا، لهذه المرة فقط
  • Allow Always — الموافقة على هذا الإجراء وما يشبهه لبقية الجلسة
  • Reject — رفض هذا الإجراء تحديدًا

هذا هو المسار الذي ستراه كلما حاول OpenCode تشغيل rm أو rmdir أو أي أمر آخر مقيَّد بقاعدة ask.

لوحة مفاتيح Apple طريفة بثلاثة مفاتيح كبيرة: Allow once وAllow always وReject
إرهاق الموافقات حقيقي.

إضافة حواجز Git

أوامر الملفات التدميرية ليست الشيء الوحيد الذي يستحق الحماية. عمليات Git قد تكون بالقدر نفسه من الخطورة — git push عرضي إلى الفرع الخطأ أو git checkout يتجاهل عملًا غير مُودَع. لنضف قواعد لهذه العمليات.

حدّث كتلة bash في إعداداتك العامة:

"bash": {
  "*": "allow",
  "rm *": "ask",
  "rmdir *": "ask",
  "git push *": "ask",
  "git checkout *": "ask"
}

الآن سيتوقف OpenCode قبل الدفع إلى مستودع بعيد أو الانتقال إلى فرع، ليعطيك فرصة للتأكيد.

صلاحيات لكل مشروع

إعداداتك العامة تنطبق على كل مشروع، لكنك أحيانًا تحتاج قواعد مختلفة لمستودعات مختلفة. يمكنك إنشاء ملف .opencode/opencode.json في أي مجلد مشروع لتجاوز صلاحياتك العامة لذلك المشروع.

مثلًا، إذا كنت تعمل على مشروع تثق بسير عمله وتريد أن يدفع OpenCode بحرية:

{
  "permission": {
    "bash": {
      "git push *": "allow"
    }
  }
}

إعدادات مستوى المشروع تُطبَّق فوق الإعدادات العامة — تتجاوز فقط القواعد المحددة التي تضبطها، وتترك كل شيء آخر دون تغيير.

العمل خارج المشروع

نطاق OpenCode هو المجلد الذي شغّلته منه. إذا احتاج إلى قراءة ملف أو تعديله في مكان آخر على جهازك، تدخل صلاحية external_directory حيّز التنفيذ.

افتراضيًا، تُضبط external_directory على "ask" — سيتوقف OpenCode ويسأل قبل لمس أي شيء خارج المشروع. هذا افتراضي جيد: يمنع الوكيل من التجوّل في مجلدات غير مرتبطة دون علمك.

إذا كنت تعمل بانتظام عبر مستودعات متعددة، يمكنك السماح بمسارات خارجية محددة:

{
  "permission": {
    "external_directory": {
      "~/projects/**": "allow"
    }
  }
}

المسارات المسموح بها عبر external_directory ترث إعدادات الأدوات الافتراضية نفسها لمشروعك. فإذا كانت read مضبوطة على "allow"، تُسمح القراءة أيضًا في تلك المجلدات الخارجية. يمكنك إضافة قواعد فوق ذلك — مثلًا السماح بالقراءة مع حظر التعديل في المسارات الخارجية.

لقائمة الصلاحيات الكاملة وصياغة الأنماط، راجع وثائق الصلاحيات.

بعد أن تضيف قاعدة صلاحية جديدة واحدة على الأقل (مثل "git push *": "ask") إلى إعداداتك العامة، يكتمل هذا الدرس.