ה-hook PermissionRequest של Claude Code רץ ברגע ש-Claude Code עומד להציג לכם בקשת הרשאה, והוא יכול לענות עליה במקומכם. כדי לאשר, ה-hook יוצא עם 0 ומדפיס {"hookSpecificOutput": {"hookEventName": "PermissionRequest", "decision": {"behavior": "allow"}}}; כדי לדחות, הוא משתמש ב-"behavior": "deny" עם message עבור Claude. הוא מתאים לפי שם הכלי, לא יכול לעקוף את כללי ה-deny שלכם, וקוד יציאה 2 לא עושה כלום באירוע הזה. אם ה-hook לא מדפיס החלטה, בקשת ההרשאה הרגילה מוצגת.
01השוואה בין PermissionRequest ל-PreToolUse ול-Notification
שלושה אירועי hook קשורים להרשאות, ולכל אחד תפקיד אחר:
PreToolUseלפני כל קריאה לכלי, בין אם היא דורשת הרשאה ובין אם לאכן: allow, deny, ask או deferPermissionRequestרק כש-Claude Code עומד לשאול אתכםכן: allow או denyNotification (permission_prompt)אחרי שבקשה המתינה כשש שניות בזמן שאתם לא ליד המחשבלאהשתמשו ב-PermissionRequest כשחשובות לכם הבקשות עצמן: לענות עליהן, לתעד אותן או לשלוח אותן למקום אחר. הוא מופעל מיד, בלי השהיה של שש שניות. השתמשו ב-PreToolUse לכללים שצריכים לחול על כל קריאה, כמו "לעולם אל תריץ rm -rf", כי הוא רץ גם כשלא הייתה מוצגת שום בקשה. המדריך ל-Notification hook מסביר את התזמון של האירוע הזה.
02מה ה-hook מקבל
מלבד השדות המשותפים, hook של PermissionRequest מקבל את tool_name ו-tool_input של הקריאה ש-Claude רוצה לבצע, ומערך אופציונלי permission_suggestions:
{
"session_id": "abc123",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "PermissionRequest",
"tool_name": "Bash",
"tool_input": {
"command": "rm -rf node_modules",
"description": "Remove node_modules directory"
},
"permission_suggestions": [
{
"type": "addRules",
"rules": [{ "toolName": "Bash", "ruleContent": "rm -rf node_modules" }],
"behavior": "allow",
"destination": "localSettings"
}
]
}
permission_suggestions מכיל את שינויי הכללים ש-Claude Code היה מציע עבור הבקשה הזו. זה לא העתק מדויק של האפשרויות בחלון, כי כל חלון בונה את האפשרויות שלו.
03אובייקט ההחלטה
החזירו decision בתוך hookSpecificOutput:
behavior"allow" או "deny"updatedInputב-allow בלבד. מחליף את כל הקלט של הכלי, אז יש לכלול גם שדות שלא השתנוupdatedPermissionsב-allow בלבד. שינויי הרשאות להחלה, כמו הוספת כלל או שינוי מצבmessageב-deny בלבד. מסביר ל-Claude למהinterruptב-deny בלבד. true גם עוצר את Claudeשני כללים שכדאי לזכור:
- כללי deny ו-ask עדיין חלים. hook שמחזיר
"allow"לא עוקף כלל deny תואם בהגדרות, וקלט שעבר שינוי נבדק שוב מול אותם כללים. - קוד יציאה
2לא נלקח כאן בחשבון. ברוב האירועים יציאה עם2חוסמת, אבל hook שלPermissionRequestשיוצא עם2בלי אובייקטdecisionמשאיר את ה-prompt כמו שהוא. כדי לדחות, צריך להחזיר את ההחלטה.
04דוגמה: אישור אוטומטי של prompt אחד
הדוגמה של Anthropic עצמה מאשרת את ExitPlanMode, ה-prompt שמופיע כש-Claude מסיים לבנות תוכנית, כך שלא תישאלו על זה בכל פעם:
{
"hooks": {
"PermissionRequest": [
{
"matcher": "ExitPlanMode",
"hooks": [
{
"type": "command",
"command": "echo '{\"hookSpecificOutput\": {\"hookEventName\": \"PermissionRequest\", \"decision\": {\"behavior\": \"allow\"}}}'"
}
]
}
]
}
}
כדאי לשמור על matchers צרים. matcher ריק או .* עם allow גורף יאשרו כל prompt, כולל כתיבת קבצים ופקודות shell.
05דוגמה: החלטה לפי הפקודה
הסקריפט הזה (דורש jq) דוחה כל דבר שנוגע ב-git push עם סיבה ש-Claude יכול לקרוא, ומשאיר לכם כל prompt אחר בכך שהוא לא מדפיס כלום:
#!/bin/bash
# ~/.claude/hooks/permission-check.sh
input=$(cat)
cmd=$(jq -r '.tool_input.command // empty' <<<"$input")
case "$cmd" in
*"git push"*)
jq -nc '{hookSpecificOutput: {hookEventName: "PermissionRequest",
decision: {behavior: "deny",
message: "Pushing is not allowed from this session. Commit and stop."}}}'
;;
esac
exit 0
{
"hooks": {
"PermissionRequest": [
{
"matcher": "Bash",
"hooks": [{ "type": "command", "command": "~/.claude/hooks/permission-check.sh" }]
}
]
}
}
בנו את ה-JSON עם jq ולא בשרשור מחרוזות, כדי שמירכאות בהודעה לא ישברו אותו. ודאו גם ששום דבר אחר לא מודפס ל-stdout. אם פרופיל ה-shell מדפיס שורה, Claude Code לא יקרא את ההחלטה.
06דוגמה: אישור וזכירה לכל הסשן
כדי לאשר בקשה ולמנוע מ-Claude לשאול שוב עד סוף הסשן, מוסיפים רשומת updatedPermissions עם destination: "session". ה-hook יכול להחזיר אחת מה-permission_suggestions שקיבל, ולשנות רק את היעד:
#!/bin/bash
input=$(cat)
jq -c '{hookSpecificOutput: {hookEventName: "PermissionRequest",
decision: {behavior: "allow",
updatedPermissions: [(.permission_suggestions // [])[]
| select(.type == "addRules")
| .destination = "session"]}}}' <<<"$input"
כפי שהוא כתוב, הסקריפט מאשר כל בקשה שהוא רואה, אז שלבו אותו עם matcher צר. היעד יכול להיות גם localSettings, projectSettings או userSettings, שכותבים את הכלל לקובץ הגדרות במקום לשמור אותו בזיכרון.
07לעיתים קרובות כלל הרשאה הוא הכלי המתאים יותר
אם התשובה אף פעם לא משתנה, אין צורך ב-hook. שימו את הכלל ב-settings.json ו-Claude Code יחיל אותו בלי להריץ כלום:
{
"permissions": {
"allow": ["Bash(npm run *)"],
"deny": ["Bash(git push *)"]
}
}
הכללים נבדקים בסדר הזה: קודם deny, אחר כך ask ואז allow. hook מצדיק את עצמו כשההחלטה תלויה במשהו שכלל לא רואה, כמו השעה ביום, ה-branch שאתם עליו, או אדם שעונה ממקום אחר. הסבר על מצבי ההרשאות מכסה את שאר האפשרויות המובנות.
08דברים שמפילים אנשים
- הרצות לא אינטראקטיביות. עם
claude -pאין למי להציג prompt. hooks שלPermissionRequestעדיין רצים, ואם אף אחד מהם לא מחזיר החלטה, הקריאה נדחית. - Timeouts. command hook יכול לרוץ עד 600 שניות כברירת מחדל, ו-Claude מחכה. הגדירו
timeout(בשניות) אם ה-hook מחכה למשהו איטי, למשל לאדם. - חלק מה-prompts לא מפעילים אותו. בקשת רשת של פקודה ב-sandbox לא מריצה את
PermissionRequest. לשם כך השתמשו בסוג ההתראהpermission_prompt. - אבטחה. hook שמחזיר
"allow"מאשר פעולות בשמכם ועם ההרשאות של המשתמש שלכם. בדקו אותו כמו כל קוד אחר שיכול להריץ פקודות.
09איפה Claude Code Notifier נכנס לתמונה
הסיבה הנפוצה ביותר לכתוב hook של PermissionRequest היא לענות על prompts כשאתם לא ליד המקלדת. בגרסת DIY ה-hook צריך לשלוח את הבקשה לאנשהו, לחכות לתשובה ולהחזיר אותה לפני ה-timeout. זה אפשרי, ויש מי שבונים את זה עם צ'אט בוט.
Claude Code Notifier עושה את זה בשבילכם. כלי שורת הפקודה החינמי שלו, ccn, רץ על Mac, Windows ו-Linux ומתקין את ה-hooks שלו ב-~/.claude/settings.json. כשאפליקציית ה-iPhone או ה-Android מצומדת, בקשת הרשאה מגיעה לטלפון ואפשר לאשר פעם אחת, לאשר לכל הסשן או לדחות; ccn מחזיר את ההחלטה הזו מה-hook של PermissionRequest. אם הקלדתם ב-30 השניות האחרונות, אין המתנה וה-terminal שואל כרגיל. אם אתם לא ליד המחשב, ה-terminal מחכה לטלפון עד תקרה שתבחרו (hold_ceiling_seconds, ברירת מחדל 600), ומפסיק לחכות ברגע שנוגעים במקלדת. זהו כלי עצמאי שלא פותח על ידי Anthropic. ראו אישור הרשאות מהטלפון לתהליך העבודה ו-האם אישור מרחוק בטוח? לצד האבטחה.
10שאלות נפוצות
איך מאשרים הרשאות אוטומטית עם hook?
הוסיפו hook של PermissionRequest עם matcher צר, וגרמו לו להדפיס החלטת JSON עם "behavior": "allow" בתוך hookSpecificOutput, ואז לצאת עם 0. אם אותה פקודה תמיד צריכה להיות מאושרת, כלל permissions.allow ב-settings.json פשוט יותר ולא דורש hook.
למה קוד יציאה 2 לא דוחה את הבקשה?
PermissionRequest הוא אחד האירועים שבהם יציאה עם 2 לא מכובדת. Claude Code מתעלם ממנה ומציג את ה-prompt הרגיל. במקום זאת, החזירו "behavior": "deny" באובייקט ההחלטה.
האם hook של PermissionRequest יכול לעקוף את כללי ה-deny שלי?
לא. כללי deny ו-ask עדיין נבדקים, כך ש-"allow" מ-hook לא עובר כלל deny תואם. גם כל updatedInput שתחזירו נבדק מול הכללים האלה.
מה ההבדל בין PermissionRequest ל-PreToolUse?
PreToolUse רץ לפני כל קריאה לכלי ויכול לאשר, לדחות, לשאול או לדחות את ההחלטה הלאה. PermissionRequest רץ רק כש-Claude Code עומד להציג prompt, ויכול לאשר או לדחות אותו. השתמשו ב-PreToolUse למדיניות, וב-PermissionRequest למענה על prompts.
מה קורה אם ה-hook לא מדפיס כלום?
שום דבר לא משתנה. Claude Code מציג את prompt ההרשאה הרגיל ב-terminal, כאילו ה-hook לא קיים.