Claude Code PermissionRequest hook'u, Claude Code size bir izin prompt'u göstermek üzereyken çalışır ve bu prompt'u sizin yerinize yanıtlayabilir. İzin vermek için hook 0 ile çıkar ve {"hookSpecificOutput": {"hookEventName": "PermissionRequest", "decision": {"behavior": "allow"}}} yazdırır; reddetmek için Claude'a yönelik bir message ile birlikte "behavior": "deny" kullanır. Tool adına göre eşleşir, deny kurallarınızı geçersiz kılamaz ve bu event'te 2 exit code'unun hiçbir etkisi yoktur. Hook bir karar yazdırmazsa normal prompt görünür.
01PermissionRequest, PreToolUse ve Notification karşılaştırması
İzinlerle ilgili üç hook event'i vardır ve her biri farklı bir iş görür:
PreToolUseİzin gerekip gerekmediğine bakılmaksızın her tool çağrısından önceEvet: allow, deny, ask veya deferPermissionRequestYalnızca Claude Code size sormak üzereykenEvet: allow veya denyNotification (permission_prompt)Siz uzaktayken bir prompt yaklaşık altı saniye bekledikten sonraHayırPrompt'ların kendisiyle ilgileniyorsanız (yanıtlamak, loglamak veya bir yere iletmek) PermissionRequest kullanın. Altı saniyelik gecikme olmadan hemen tetiklenir. "Asla rm -rf çalıştırma" gibi her çağrıya uygulanması gereken kurallar için PreToolUse kullanın, çünkü hiçbir prompt görünmeyecek olsa bile çalışır. Bu event'in zamanlaması Notification hook rehberinde açıklanıyor.
02Hook'un aldığı veriler
Ortak alanların yanı sıra bir PermissionRequest hook'u, Claude'un yapmak istediği çağrının tool_name ve tool_input değerlerini ve isteğe bağlı bir permission_suggestions dizisini alır:
{
"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'un bu istek için önereceği kural değişikliklerini içerir. Her diyalog kendi seçeneklerini oluşturduğu için diyalogdaki seçeneklerin birebir kopyası değildir.
03Decision nesnesi
hookSpecificOutput içinde bir decision döndürün:
behavior"allow" veya "deny"updatedInputYalnızca allow. Tool'un tüm input'unu değiştirir, bu yüzden değişmeyen alanları da ekleyinupdatedPermissionsYalnızca allow. Uygulanacak izin değişiklikleri, örneğin kural eklemek veya modu değiştirmekmessageYalnızca deny. Claude'a nedenini söylerinterruptYalnızca deny. true olursa Claude'u da durdururAkılda tutmanız gereken iki kural:
- Deny ve ask kuralları yine geçerlidir.
"allow"döndüren bir hook, ayarlarınızdaki eşleşen bir deny kuralını geçersiz kılmaz; değiştirilmiş girdi de bu kurallara göre yeniden kontrol edilir. - Burada
2çıkış kodu yok sayılır. Çoğu olayda2ile çıkmak işlemi engeller, ancakdecisionnesnesi olmadan2ile çıkan birPermissionRequesthook'u prompt'u olduğu gibi bırakır. Reddetmek için kararı döndürün.
04Örnek: tek bir prompt'u otomatik onaylamak
Anthropic'in kendi örneği, Claude bir planı bitirdiğinde çıkan ExitPlanMode prompt'unu onaylar; böylece her seferinde size sorulmaz:
{
"hooks": {
"PermissionRequest": [
{
"matcher": "ExitPlanMode",
"hooks": [
{
"type": "command",
"command": "echo '{\"hookSpecificOutput\": {\"hookEventName\": \"PermissionRequest\", \"decision\": {\"behavior\": \"allow\"}}}'"
}
]
}
]
}
}
Matcher'ları dar tutun. Boş bir matcher ya da genel bir allow ile birlikte .*, dosya yazma ve shell komutları dahil her prompt'u onaylar.
05Örnek: komuta bakarak karar vermek
Bu script (jq gerektirir) git push içeren her şeyi, Claude'un okuyabileceği bir gerekçeyle reddeder; diğer tüm prompt'ları ise hiçbir şey yazdırmayarak size bırakır:
#!/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" }]
}
]
}
}
Mesajdaki tırnak işaretleri bozulmaya yol açmasın diye JSON'u string birleştirerek değil, jq ile oluşturun. Ayrıca stdout'a başka hiçbir şeyin yazılmadığından emin olun. Shell profiliniz bir satır yazdırırsa Claude Code kararı okuyamaz.
06Örnek: izin vermek ve oturum boyunca hatırlamak
Bir isteği onaylayıp Claude'un oturum bitene kadar tekrar sormasını engellemek için destination: "session" içeren bir updatedPermissions girdisi ekleyin. Hook, aldığı permission_suggestions öğelerinden birini yalnızca destination'ı değiştirerek geri döndürebilir:
#!/bin/bash
input=$(cat)
jq -c '{hookSpecificOutput: {hookEventName: "PermissionRequest",
decision: {behavior: "allow",
updatedPermissions: [(.permission_suggestions // [])[]
| select(.type == "addRules")
| .destination = "session"]}}}' <<<"$input"
Bu haliyle gördüğü her isteğe izin verir, bu yüzden dar bir matcher ile kullanın. Destination ayrıca localSettings, projectSettings veya userSettings olabilir; bunlar kuralı bellekte tutmak yerine bir ayar dosyasına yazar.
07Çoğu zaman permission kuralı daha iyi bir araçtır
Cevap hiç değişmiyorsa hook'a ihtiyacınız yok. Kuralı settings.json dosyasına ekleyin, Claude Code hiçbir şey çalıştırmadan uygular:
{
"permissions": {
"allow": ["Bash(npm run *)"],
"deny": ["Bash(git push *)"]
}
}
Kurallar önce deny, sonra ask, sonra allow sırasıyla değerlendirilir. Hook, kararın bir kuralın göremeyeceği bir şeye bağlı olduğu durumlarda işe yarar: günün saati, bulunduğunuz branch ya da başka bir yerden yanıt veren bir kişi gibi. Diğer yerleşik seçenekler için Permission modları açıklaması yazısına bakın.
08Sık yapılan hatalar
- Etkileşimsiz çalıştırmalar.
claude -pile soru sorulacak kimse yoktur.PermissionRequesthook'ları yine çalışır ve hiçbiri karar döndürmezse çağrı reddedilir. - Zaman aşımları. Bir command hook'u varsayılan olarak 600 saniyeye kadar çalışabilir ve Claude bekler. Hook'unuz bir kişi gibi yavaş bir şeyi bekliyorsa
timeoutdeğerini (saniye cinsinden) ayarlayın. - Bazı prompt'lar onu tetiklemez. Sandbox içindeki bir komutun ağ isteği
PermissionRequestçalıştırmaz. Bunun içinpermission_promptbildirim türünü kullanın. - Güvenlik.
"allow"döndüren bir hook, sizin adınıza ve kullanıcınızın yetkileriyle işlemleri onaylıyor demektir. Komut çalıştırabilen diğer kodlar gibi onu da gözden geçirin.
09Claude Code Notifier'ın yeri
PermissionRequest hook'u yazmanın en yaygın nedeni, klavyenin başında değilken prompt'ları yanıtlamaktır. Kendi yapacağınız bir çözümde hook'un isteği bir yere göndermesi, yanıtı beklemesi ve zaman aşımından önce döndürmesi gerekir. Bu yapılabilir; bazıları bunu bir chat bot ile kuruyor.
Claude Code Notifier bunu sizin için yapar. Ücretsiz komut satırı aracı ccn, Mac, Windows ve Linux üzerinde çalışır ve hook'larını ~/.claude/settings.json dosyasına kurar. iPhone veya Android uygulaması eşleştirildiğinde permission isteği telefona gelir; bir kez izin verebilir, oturum boyunca izin verebilir ya da reddedebilirsiniz. ccn bu kararı PermissionRequest hook'undan döndürür. Son 30 saniye içinde bir şey yazdıysanız beklenmez ve terminal her zamanki gibi sorar. Uzaktaysanız terminal, belirlediğiniz üst sınıra kadar (hold_ceiling_seconds, varsayılan 600) telefonu bekler ve klavyeye dokunduğunuz anda beklemeyi bırakır. Bağımsız bir araçtır, Anthropic tarafından yapılmamıştır. İş akışı için izinleri telefonunuzdan onaylama, güvenlik tarafı için uzaktan onay güvenli mi? yazılarına bakın.
10SSS
İzinleri bir hook ile nasıl otomatik onaylarım?
Dar bir matcher ile bir PermissionRequest hook'u ekleyin; hookSpecificOutput içinde "behavior": "allow" bulunan bir JSON kararı yazdırsın ve 0 ile çıksın. Aynı komuta her zaman izin verilecekse, settings.json içindeki bir permissions.allow kuralı daha basittir ve hook gerektirmez.
2 çıkış kodu neden isteği reddetmiyor?
PermissionRequest, 2 ile çıkışın dikkate alınmadığı olaylardan biridir. Claude Code bunu yok sayar ve normal prompt'u gösterir. Bunun yerine karar nesnesinde "behavior": "deny" döndürün.
Bir PermissionRequest hook'u deny kurallarımı geçersiz kılabilir mi?
Hayır. Deny ve ask kuralları yine değerlendirilir; bu nedenle hook'tan gelen bir "allow", eşleşen bir deny kuralını aşamaz. Döndürdüğünüz her updatedInput da bu kurallara göre kontrol edilir.
PermissionRequest ile PreToolUse arasındaki fark nedir?
PreToolUse her araç çağrısından önce çalışır ve allow, deny, ask veya defer yapabilir. PermissionRequest yalnızca Claude Code bir prompt göstermek üzereyken çalışır ve ona izin verebilir ya da reddedebilir. Politika için PreToolUse, prompt'ları yanıtlamak için PermissionRequest kullanın.
Hook'um hiçbir şey yazdırmazsa ne olur?
Hiçbir şey değişmez. Claude Code, hook hiç yokmuş gibi terminalde normal permission prompt'unu gösterir.