title: التكوين description: “تنسيق ملف الإعدادات، نظام النطاقات الثلاثة، وقواعد الدمج” icon: gear
يستخدم failproofai ملفات تكوين JSON للتحكم في السياسات النشطة وسلوكها وموقع تحميل السياسات المخصصة. تم تصميم التكوين ليكون سهل المشاركة مع فريقك - قم بإرساله إلى مستودع المشروع وسيحصل كل مطور على نفس شبكة الأمان للوكيل.نطاقات التكوين
هناك ثلاثة نطاقات تكوين، يتم تقييمها بترتيب الأولوية:| النطاق | مسار الملف | الغرض |
|---|---|---|
| المشروع | .failproofai/policies-config.json | إعدادات لكل مستودع، مرسلة للتحكم بالإصدار |
| محلي | .failproofai/policies-config.local.json | تجاوزات شخصية لكل مستودع، مُضافة لـ gitignore |
| عام | ~/.failproofai/policies-config.json | الإعدادات الافتراضية على مستوى المستخدم عبر جميع المشاريع |
قواعد الدمج
enabledPolicies - اتحاد جميع النطاقات الثلاثة. السياسة المفعلة في أي مستوى تكون نشطة.
policyParams - النطاق الأول الذي يحدد معاملات السياسة يفوز بالكامل. لا يوجد دمج عميق للقيم داخل معاملات السياسة.
customPoliciesPath - النطاق الأول الذي يحدده يفوز.
llm - النطاق الأول الذي يحدده يفوز.
تنسيق ملف الإعدادات
مرجع الحقول
enabledPolicies
النوع: string[]
قائمة بأسماء السياسات المراد تفعيلها. يجب أن تطابق الأسماء بالضبط معرّفات السياسة التي يعرضها failproofai policies. انظر السياسات المدمجة للحصول على القائمة الكاملة.
السياسات غير الموجودة في enabledPolicies غير نشطة، حتى لو كانت لديها إدخالات في policyParams.
policyParams
النوع: Record<string, Record<string, unknown>>
تجاوزات معاملات كل سياسة. المفتاح الخارجي هو اسم السياسة؛ المفاتيح الداخلية خاصة بكل سياسة. توثق كل سياسة المعاملات المتاحة لديها في السياسات المدمجة.
إذا كانت السياسة تحتوي على معاملات ولم تحددها، يتم استخدام القيم الافتراضية المدمجة للسياسة. المستخدمون الذين لا يقومون بتكوين policyParams على الإطلاق سيحصلون على سلوك متطابق مع الإصدارات السابقة.
المفاتيح المجهولة داخل كتلة معاملات السياسة يتم تجاهلها بصمت في وقت تشغيل hook لكن يتم وضع علامة عليها كتحذيرات عند تشغيل failproofai policies.
hint (العام)
النوع: string (اختياري)
رسالة يتم إلحاقها بالسبب عندما تُرجع السياسة deny أو instruct. استخدمه لإعطاء Claude إرشادات قابلة للتنفيذ دون تعديل السياسة نفسها.
يعمل مع أي نوع سياسة - مدمج، مخصص (custom/)، اتفاقية المشروع (.failproofai-project/)، أو اتفاقية المستخدم (.failproofai-user/).
block-force-push برفض، يرى Claude: “دفع القوة مُحظور. حاول إنشاء فرع طازج بدلاً من ذلك.”
القيم غير النصية والنصوص الفارغة يتم تجاهلها بصمت. إذا لم يتم تعيين hint، يبقى السلوك بدون تغيير (متوافق للخلف).
customPoliciesPath
النوع: string (مسار مطلق)
مسار ملف JavaScript يحتوي على سياسات hook مخصصة. يتم تعيينه تلقائياً بواسطة failproofai policies --install --custom <path> (يتم حل المسار إلى مطلق قبل تخزينه).
يتم تحميل الملف بشكل جديد في كل حدث hook - لا يوجد تخزين مؤقت. انظر السياسات المخصصة لتفاصيل التأليف.
سياسات قائمة على الاتفاقيات
بالإضافة إلىcustomPoliciesPath الصريح، يقوم failproofai بالكشف التلقائي وتحميل ملفات السياسة من مجلدات .failproofai/policies/:
| المستوى | المجلد | النطاق |
|---|---|---|
| المشروع | .failproofai/policies/ | مشترك مع الفريق عبر التحكم بالإصدار |
| المستخدم | ~/.failproofai/policies/ | شخصي، ينطبق على جميع المشاريع |
*policies.{js,mjs,ts} (على سبيل المثال security-policies.mjs, workflow-policies.js). يتم تجاهل الملفات الأخرى في المجلد.
لا يلزم التكوين: سياسات الاتفاقيات لا تتطلب إدخالات في policies-config.json. قم فقط بإسقاط الملفات في المجلد وسيتم التقاطها في حدث hook التالي.
تحميل الاتحاد: يتم مسح كل من مجلدات الاتفاقيات للمشروع والمستخدم. يتم تحميل جميع الملفات المطابقة من كلا المستويين (بخلاف customPoliciesPath الذي يستخدم أولوية النطاق الأول).
انظر السياسات المخصصة لمزيد من التفاصيل والأمثلة.
llm
النوع: object (اختياري)
تكوين عميل LLM للسياسات التي تجري استدعاءات AI. غير مطلوب لمعظم الإعدادات.
إدارة التكوين من سطر الأوامر
تقوم أوامرpolicies --install و policies --uninstall بالكتابة إلى ملف إعدادات hook الخاص بـ agent CLI (نقاط دخول hook)، بينما policies-config.json هو الملف الذي تديره مباشرة. الاثنان منفصلان:
- إعدادات Agent CLI — يخبر الوكيل باستدعاء
failproofai --hook <event>في كل استخدام أداة:- Claude Code:
~/.claude/settings.json(مستخدم)،<cwd>/.claude/settings.json(مشروع)،<cwd>/.claude/settings.local.json(محلي) - OpenAI Codex:
~/.codex/hooks.json(مستخدم)،<cwd>/.codex/hooks.json(مشروع) — Codex لا يحتوي على نطاقlocal - GitHub Copilot CLI (beta):
~/.copilot/hooks/failproofai.json(مستخدم)،<cwd>/.github/hooks/failproofai.json(مشروع) — Copilot لا يحتوي على نطاقlocal. إدخالات Hook تستخدم حقول أوامر Copilot المفتاحية للنظام التشغيليbash/powershellمعtimeoutSec؛ يحمل الملف علامةversion: 1على المستوى الأعلى. دعم Copilot CLI في beta بينما نتحقق من مخطط سجلevents.jsonl(الذي لا توفره الوثائق العامة) مقابل جلسات حقيقية أكثر. - Cursor Agent (beta):
~/.cursor/hooks.json(مستخدم)،<cwd>/.cursor/hooks.json(مشروع) — Cursor لا يحتوي على نطاقlocal. إدخالات Hook تستخدم نموذج Claude{type, command, timeout}(بدون تقسيمbash/powershell)، لكن مخزنة تحت مفاتيح الأحداث بـ camelCase (preToolUse,beforeSubmitPrompt, …) في مصفوفة مسطحة وفقاً لـ مخطط hooks الخاص بـ Cursor؛ يحمل الملف علامةversion: 1على المستوى الأعلى. يقوم المعالج بتشريع camelCase → PascalCase عبرCURSOR_EVENT_MAPبحيث تطلق السياسات المدمجة الموجودة بدون تغيير. دعم Cursor Agent في beta بينما نتحقق من نص Cursor على القرص (غير محدد في الوثائق العامة) مقابل تثبيتات حقيقية أكثر. - OpenCode (beta):
~/.config/opencode/opencode.json+~/.config/opencode/plugins/failproofai.mjs(مستخدم)،<cwd>/.opencode/opencode.json+<cwd>/.opencode/plugins/failproofai.mjs(مشروع) — OpenCode لا يحتوي على نطاقlocal. بخلاف CLI الستة الأخرى، OpenCode ليس لديه نظام hook أوامر خارجية: يقوم بتحميل مكونات JS/TS في العملية والمسجلة بشكل صريح عبر مصفوفةplugin: []فيopencode.json(الاكتشاف التلقائي من.opencode/plugins/ليس كيفية تحميل المكونات الإضافية على opencode v1.14.33). يسقط التثبيت shim مكون إضافي صغير مُولّد يستدعي ثنائي failproofai بـ subprocess ويترجم استجابة JSON على شكل Claude للثنائي مرة أخرى إلى دلالات المكون الإضافي:throw new Error()لأداة-حدث deny (يلغي استدعاء الأداة)،client.session.prompt(...)لـ instruct وStop/SubagentStopdeny (يرسل سبب الرفض كرسالة المستخدم التالية — قناة إعادة المحاولة الوحيدة لأنsession.idleهي إشعار فقط والرمي منها هو no-op)، و no-op للسماح. يقوم Shim بتشريع أسماء الأدوات (lowercase → PascalCase عبرOPENCODE_TOOL_MAP) ومفاتيح إدخال الأداة (camelCase → snake_case عبرOPENCODE_TOOL_INPUT_MAPلـRead/Write/Edit، على سبيل المثالfilePath→file_path,oldString→old_string) قبل الإرسال إلى الثنائي، بحيث يطلق التحقق من المسار المدمج مثلblock-read-outside-cwd,block-env-files, وblock-secrets-writeبدون تغيير على استدعاءات أدوات OpenCode. تعيش الجلسات في SQLite DB الخاص بـ opencode على~/.local/share/opencode/opencode.db؛ عارض الجلسات للوحة المعلومات يقرأها عبرopencode db --format jsonوopencode export <id>. دعم OpenCode في beta بينما نتحقق من السلوك عبر الإصدارات ومقابل جلسات حقيقية أكثر. انظر وثائق مكونات OpenCode. - Pi (beta):
~/.pi/agent/settings.json(مستخدم)،<cwd>/.pi/settings.json(مشروع) — Pi لا يحتوي على نطاقlocal. يقوم Pi بتحميل حزم ملحقات TypeScript عند البدء؛ ملف الإعدادات هو مصفوفة سلسلة مسطحة{"packages": ["./relative/path", …]}. يكتب failproofai إدخال مصفوفة حزم واحد يشير إلى مجلدpi-extension/المجمع الخاص به. يشترك الملحق داخلياً في أحداث Pitool_call/user_bash/input/session_startويستدعيfailproofai --hook <Event> --cli pi؛ يقوم المعالج بتشريع underscore_lower_snake_case → PascalCase عبرPI_EVENT_MAPبحيث تطلق السياسات المدمجة الموجودة بدون تغيير. تتم مراجعة معاملات إدخال الأداة أيضاً عبرPI_TOOL_INPUT_MAP(Pi’s Read / Write / Edit تسلمpathبدلاً منfile_path؛ تعيين المفتاح على المستوى الأعلى يسمح لـblock-env-filesوblock-secrets-writeبالتطبيق —block-read-outside-cwdكان بالفعل لديه احتياطيpath). دعم Pi في beta بينما تستقر API ملحق Pi ومخطط سجل الجلسة. - Gemini CLI (beta):
~/.gemini/settings.json(مستخدم)،<cwd>/.gemini/settings.json(مشروع) — Gemini لا يحتوي على نطاقlocal(يوثق نطاقsystemفي/etc/gemini-cli/settings.jsonالذي لا يعرضه failproofai). إدخالات Hook تستخدم نموذج Claude{type, command, timeout}ملفوف في مخطط matcher Gemini{matcher, hooks: [...]}معmatcher: "*"بشكل افتراضي. الأحداث بـ PascalCase (SessionStart,BeforeAgent,AfterAgent,BeforeModel,AfterModel,BeforeToolSelection,BeforeTool,AfterTool,PreCompress,Notification,SessionEnd)؛ يقوم المعالج بالتعيين إلى أسماء Claude الأساسية عبرGEMINI_EVENT_MAP. أسماء الأدوات بـ snake_case (run_shell_command,read_file,write_file,replace, …) — يقوم المعالج بالتشريع عبرGEMINI_TOOL_MAPبحيث تطلق السياسات المدمجة الموجودة بدون تغيير. يصدر محقق السياسة نموذج Gemini المسطح{decision: "deny", reason}(المفضل وفقاً لقاعدة Gemini الذهبية exit-0)،{hookSpecificOutput: {hookEventName, additionalContext}}لحقن السياق في BeforeAgent / AfterTool / SessionStart، و{decision: "block", reason}في AfterAgent لدلالات إعادة المحاولة الإجبارية. دعم Gemini CLI في beta بينما نوسع التغطية الحقيقية. انظر وثائق hooks Gemini CLI.
- Claude Code:
policies-config.json— يخبر failproofai بالسياسات المراد تقييمها والمعاملات التي تستخدمها (مشترك عبر جميع CLI الوكيل)
--cli claude|codex|copilot|cursor|opencode|pi|gemini لاستهداف وكيل معين (مفصول بمسافات أو متكرر لأي مجموعة فرعية):
--cli، يكتشف failproofai أي CLI وكيل مثبت (which claude / which codex / which copilot / which cursor-agent / which opencode / which pi / which gemini):
- يتم الكشف عن CLI واحد — يختار تلك CLI تلقائياً بدون مطالبة.
- يتم الكشف عن عدة CLI في جهاز طرفي تفاعلي — يعرض موجه اختيار واحد مع مفاتيح الأسهم معروض بمجموعات في قسم
Detected (N)(مع صف إجماليInstall for all N detected+ كل CLI يتم الكشف عنها بشكل فردي) وقسمNot installed (M) · install hooks ahead of timeيسرد كل CLI مدعومة لم يتم اكتشافها كخيار تثبيت مسبق (↑↓ للتحرك، Enter للتحديد، ^C للخروج). يعرض تدفق الإلغاء القسم المكتشف فقط. - يتم الكشف عن عدة CLI في تشغيل غير تفاعلي (CI، بدون TTY) — يثبت لجميع CLI المكتشفة بدون مطالبة.
- لم يتم الكشف عن أي — يرجع إلى
claude، مع تحذير من أن لم يتم العثور على ثنائي وكيل في PATH؛ أمر hook لا يزال مكتوباً بحيث ينشط بمجرد تثبيت واحد.
policies-config.json مباشرة في أي وقت؛ تصبح التغييرات فعالة فوراً في حدث hook التالي بدون الحاجة إلى إعادة تشغيل.
مثال: تكوين على مستوى المشروع مع قيم افتراضية الفريق
قم بإرسال.failproofai/policies-config.json إلى المستودع:
.failproofai/policies-config.local.json (مضاف لـ gitignore) للتجاوزات الشخصية دون التأثير على زملاء الفريق.
