היקפי הגדרות
יש שלושה היקפי הגדרות, המוערכים לפי סדר עדיפויות:
כאשר failproofai מקבל אירוע hook, הוא טוען ומוזג את כל שלושת הקובצים שקיימים בספריית העבודה הנוכחית.
כללי מיזוג
enabledPolicies - האיחוד של כל שלושת ההיקפים. מדיניות שמופעלת בכל רמה פעילה.
policyParams - ההיקף הראשון שמגדיר פרמטרים לmדיניות מסוימת מנצח לחלוטין. אין מיזוג עמוק של ערכים בתוך הפרמטרים של המדיניות.
customPoliciesPath - ההיקף הראשון שמגדיר אותו מנצח.
llm - ההיקף הראשון שמגדיר אותו מנצח.
פורמט קובץ הגדרות
התייחסות לשדות
enabledPolicies
סוג: string[]
רשימת שמות המדיניות שיש להפעיל. השמות חייבים להתאים בדיוק לזהויות המדיניות המוצגות על ידי failproofai policies. ראה Built-in Policies לקבלת הרשימה המלאה.
מדיניות שלא בenabledPolicies אינן פעילות, גם אם יש להן רשומות בpolicyParams.
policyParams
סוג: Record<string, Record<string, unknown>>
עקיפות פרמטרים לכל מדיניות. המפתח החיצוני הוא שם המדיניות; המפתחות הפנימיים ספציפיים למדיניות. כל מדיניות מתעדת את הפרמטרים הזמינים שלה בBuilt-in Policies.
אם למדיניות יש פרמטרים אך אתה לא מציין אותם, משמשים ברירות המחדל המובנות של המדיניות. משתמשים שאינם מגדירים את policyParams כלל מקבלים התנהגות זהה לגרסאות קודמות.
מפתחות לא ידועים בתוך בלוק הפרמטרים של מדיניות מתעלמים בשקט בזמן הפעלת hook אך מסומנים כאזהרות כאשר אתה מריץ failproofai policies.
hint (חוצה פעולות)
סוג: string (בחירה)
הודעה שצורפה לסיבה כאשר מדיניות מחזירה deny או instruct. השתמש בה כדי לתן לClaude הדרכה פעולה ישירה ללא שינוי המדיניות עצמה.
עובד עם כל סוג מדיניות — מובנה, מותאם אישית (custom/), מוסכמת פרויקט (.failproofai-project/), או מוסכמת משתמש (.failproofai-user/).
block-force-push מסרב, Claude רואה: “Force-pushing is blocked. Try creating a fresh branch instead.”
ערכים שאינם מחרוזות ומחרוזות ריקות מתעלמים בשקט. אם hint לא מוגדר, ההתנהגות לא משתנה (תאימות לאחור).
customPoliciesPath
סוג: string (נתיב מוחלט)
נתיב לקובץ JavaScript המכיל מדיניות hook מותאמת אישית. זה מוגדר באופן אוטומטי על ידי failproofai policies --install --custom <path> (הנתיב מוחזר לערך מוחלט לפני שנשמר).
הקובץ נטען מחדש בכל אירוע hook - אין caching. ראה Custom Policies לפרטי כתיבה.
מדיניות מבוססת מוסכמה
בנוסף לעקיפה ההפנייהcustomPoliciesPath, failproofai גילוי ויוטען באופן אוטומטי קובצי מדיניות מתיקיות .failproofai/policies/:
התאמת קובץ: רק קובצים התואמים ל
*policies.{js,mjs,ts} נטענים (לדוגמה security-policies.mjs, workflow-policies.js). קובצים אחרים בספרייה מתעלמים.
אין צורך בהגדרה: מדיניות מוסכמה אינה דורשת רשומות בpolicies-config.json. פשוט שים קובצים בספרייה והם אוסף בהתקדמות hook הבא.
טעינה איחוד: גם ספריות מוסכמה של פרויקט וגם משתמש סרוקות. כל קובצים תואמים משתי הרמות נטענים (שלא כמו customPoliciesPath אשר משתמש בראשון-היקף-מנצח).
ראה Custom Policies לפרטים נוספים וודוגמאות.
llm
סוג: object (בחירה)
הגדרות לקוח LLM למדיניות שמבצעות קריאות AI. לא נדרש לרוב ההגדרות.
ניהול הגדרות מ-CLI
הפקודותpolicies --install וpolicies --uninstall כותבות לקובץ הגדרות hook של ה-CLI של ה-agent (נקודות הכניסה של hook), בעוד שpolicies-config.json הוא הקובץ שאתה מנהל ישירות. שניהם נפרדים:
- הגדרות Agent CLI — אומרות ל-agent להתקשר ל
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 משתמשות בשדות פקודהbash/powershellשל Copilot עם מפתח OS עם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). ההתקנה מושכת שים של תוספון שנוצר בזריעה שקוראות ב-subprocess את הבינארי failproofai ומתרגמת את התגובה JSON בעיצוב Claude של הבינארי חזרה לסמנטיקה של תוספון:throw new Error()עבור deny של אירוע כלי (מבטל את קריאת הכלי),client.session.prompt(...)עבור instruct וגם עבור deny שלStop/SubagentStop(משדרת את סיבת הreject כהודעת המשתמש הבאה — הערוץ היחיד כלומל-retry מכיוון שsession.idleהוא התראה בלבד ו-throwing ממנו הוא no-op), ו-no-op עבור allow. השם מנרמל גם שמות כלים (אותיות קטנות → 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 של 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/המכוסה שלה. ההרחבה מחתום פנימית על אירועיtool_call/user_bash/input/session_startשל Pi ופורקתfailproofai --hook <Event> --cli pi; המטפל מנרמל underscore_lower_snake_case → PascalCase דרךPI_EVENT_MAPכך שמדיניות מובנות קיימות נשרפות ללא שינוי. טיעון קלט כלי מנורמל גם דרךPI_TOOL_INPUT_MAP(Read / Write / Edit של Pi משדרותpathולאfile_path; מיפוי המפתח ברמה העליונה מאפשר לblock-env-filesוblock-secrets-writeנשרפות —block-read-outside-cwdכבר היה פנייה חוזרת שלpath). תמיכת Pi היא beta בזמן שה-API הרחבה של Pi וסכימת יומן הישיבה מתייצבות. - Hermes (hermes-agent):
~/.hermes/config.yaml(היקף משתמש בלבד — Hermes אין לו תצורת פרויקט/מקומית). Hermes הוא שער Slack/Telegram, כך שהתקנה אחת מיירטת קריאות כלים מכל פלטפורמה (Slack/Telegram/cli/cron) וגם תוך-אג’נטים. רשומות Hook הן זוג{command, timeout}(timeout בשניות) תחת מפתhooks:שבאופן events snake_case של Hermes (pre_tool_call/post_tool_call/on_session_start/on_session_end/subagent_stop); המטפל מנרמל אירועים דרךHERMES_EVENT_MAPוגם שמות כלים דרךHERMES_TOOL_MAPכך שמדיניות מובנות נשרפות ללא שינוי. התצורה נערכת דרך תעודת YAML דורכת-שומרת-הערותDocumentכך שהגדרות אחרות של המנהל שורדות, והתקנה מוגדרתhooks_auto_accept: trueכך השער חסר-TTY מריץ את ה-hooks ללא בקשת הסכמה. המעריך משדרת חוזה{"decision":"block","reason"}stdout של Hermes (Hermes מתעלם מקודי יציאה). מגבלות: Hermes אין להשקע stopStopשל turn-end, כך שהrequire-*-before-stopמובנה לעולם לא נשרפים עבורו (בלא הגבלה, לא שבור);instructמדרדר ל-allow-עם-logged-note (אין ערוץ הקשר נוסף); ו-redaction-secret של פלט (sanitize-*) לא יכול לשכתב פלט כלים דרך חוזה shell-hook. Hermes הוא גם מקור ביקורת offline — הדשבורד קורא ישיבות שער שלו ישירות מ~/.hermes/state.db.
- Claude Code:
policies-config.json— אומר ל-failproofai איזו מדיניות להעריך ועם אילו פרמטרים (משותף על פני כל ה-CLI של ה-agent)
--cli claude|codex|copilot|cursor|opencode|pi|hermes למטרה סוכן ספציפי (space-separated או חוזר לכל תת-קבוצה):
--cli מושמט, failproofai מגלה אילו CLI של agent מותקנות (which claude / which codex / which copilot / which cursor-agent / which opencode / which pi / which hermes):
- CLI אחד זוהה — בחירה אוטומטית של ה-CLI הזה ללא הנחיות.
- מספר CLI זוהו בטרמינל אינטראקטיבי — מציג הנחיות בחירה חד-בחירה בחצי-מקלדת מקובצות לחלק
Detected (N)(עם שורה מצומצמתInstall for all N detected+ כל CLI זוהה בנפרד) וחלקNot installed (M) · install hooks ahead of timeהרשום כל CLI לא זוהה שנתמך כאפשרות התקנה קדימה (↑↓ להזיז, Enter בחר, ^C יצא). זרימת ההסרה מציגה רק את החלק Detected. - מספר CLI זוהו בריצה לא אינטראקטיבית (CI, ללא TTY) — מתקנת את כל CLI זוהה ללא הנחיות.
- אף אחד לא זוהה — יורדת חזרה ל
claude, עם אזהרה שלא מצא בינארי agent ב-PATH; פקודת ה-hook עדיין נכתבה כך היא מופעלת ברגע שתתקין אחד.
policies-config.json ישירות בכל עת; השינויים נכנסים לתוקף מיד באירוע hook הבא ללא צורך בהפעלה מחדש.
דוגמה: תצורה ברמת פרויקט עם ברירות ברירת מחדל לצוות
Commit.failproofai/policies-config.json למאגר שלך:
.failproofai/policies-config.local.json (מתוך gitignore) לעקיפות אישיות ללא הפרת עמיתים.
