İçindekiler
- Hangi durum için hangi hook
- Gerekenler
- Adım 1 — İki kanal oluşturun
- Adım 2 — Hook'ları ekleyin
- Adım 3 — Gerçek bir istem beklemeden test edin
- Adım 4 — Takıldı kanalını çaldırın
- Bildirim bombardımanından kaçınmak
- Claude Code'u uzaktan veya CI'da çalıştırmak
- Sorun giderme
- Sık sorulan sorular
- Claude Code izin istediğinde nasıl bildirim alırım?
- Claude Code bir görevi bitirdiğinde nasıl anlarım?
- Bildirim Rahatsız Etmeyin'i aşabilir mi?
- Bu, web üzerindeki Claude Code'da veya uzak oturumlarda çalışır mı?
- Webhook URL'sini settings.json içine koymak güvenli mi?
- Özet
- İlgili yazılar
Claude Code önemli iki durumda durur: ya sizi beklerken tıkanmıştır (izin istemi, bir soru) ya da işi bitirmiştir. Terminale bakmıyorsanız ikisi de aynı görünür — hiçbir şey olmaz ve oturum siz dönene kadar boşta bekler. Çözüm bir hook: settings.json içinde, bu iki durumdan biri gerçekleştiği anda telefonunuza webhook gönderen birkaç satır.
Bu rehber kopyalayabileceğiniz yapılandırmayı veriyor, hangi durumda hangi hook olayının kullanılacağını açıklıyor ve sistemin güvenilir çalışmasını sağlayan ayrıntıları ele alıyor: hook girdisini okumak, kabuk tırnaklaması ve kendinizi bildirim yağmuruna boğmamak.
Hangi durum için hangi hook
Claude Code, yaşam döngüsü olaylarında hook çalıştırır. Bu sorunu iki tanesi kapsıyor (hook'lar başvuru belgesi):
| Şunu bilmek istiyorsunuz… | Hook olayı | Matcher / filtre |
|---|---|---|
| Claude bir izin kararı bekliyor | Notification | permission_prompt |
| Claude boşta ve girdinizi bekliyor | Notification | idle_prompt |
| Claude yanıtını tamamladı | Stop | gerekmez |
Notification hook'unun matcher değeri bildirim türüne göre filtreler; böylece telefonunuza hangi bildirimlerin ulaşacağını tam olarak seçebilirsiniz. Girdi stdin üzerinden JSON olarak gelir ve notification_type, message, cwd ve session_id alanlarını içerir. Notification hook'ları hiçbir şeyi engelleyemez ya da değiştiremez — yalnızca gözlemcidir ve burada istediğiniz de budur.
Stop girdisi, Claude'un ürettiği son metin olan last_assistant_message alanını içerir. Bildirim için hazır bir özet satırı demek.
Gerekenler
- Telefonunuzda Echobell (App Store / Google Play)
- Claude Code'u çalıştıran makinede
curlvejq - İki dakika
Adım 1 — İki kanal oluşturun
Her şeyi tek bir kanala göndermeyin. Echobell'de şunları oluşturun:
- Claude Takıldı, türü Time Sensitive veya Calling — izin istemleri için; ajan durmuş durumdadır ve geçen her dakika boşa giden hesaplama gücü ve zamandır
- Claude Bitti, türü Normal — istediğiniz zaman okuyabileceğiniz sıradan bir anlık bildirim
Her kanalın webhook URL'sini kopyalayın. Şuna benzer: https://hook.echobell.one/t/<channel-token>. Bir parola gibi davranın: elinde bu URL olan herkes telefonunuzu çaldırabilir.
İkisini de ortam değişkeni olarak saklayın; böylece commit edilen bir yapılandırma dosyasına girmezler:
export ECHOBELL_CLAUDE_BLOCKED_URL="https://hook.echobell.one/t/<blocked-token>"
export ECHOBELL_CLAUDE_DONE_URL="https://hook.echobell.one/t/<done-token>"
Bunları kabuk profilinize ekleyin ki Claude Code onları devralsın.
Adım 2 — Hook'ları ekleyin
Her projede geçerli olması için ~/.claude/settings.json dosyasına, tek bir depo için ise .claude/settings.local.json dosyasına şunu ekleyin:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{
"type": "command",
"command": "jq -c '{title: \"Claude izin istiyor\", body: .message, project: (.cwd | split(\"/\") | last)}' | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- \"$ECHOBELL_CLAUDE_BLOCKED_URL\""
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "jq -c '{title: \"Claude bitirdi\", body: (.last_assistant_message // \"Tamamlandı\" | .[0:200]), project: (.cwd | split(\"/\") | last)}' | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- \"$ECHOBELL_CLAUDE_DONE_URL\""
}
]
}
]
}
}
Her parçanın işlevi:
jq -c '{...}'hook'un stdin'den gelen JSON'unu okur ve küçük bir payload oluşturur; böylece Echobell hook belgesinin tamamını değil, tam olarak istediğiniz alanları alır..cwd | split("/") | last,/home/me/code/apiyolunuapi'ye çevirir; bildirim hangi projenin sizi çağırdığını söyler..[0:200]son mesajı kısaltır. Bildirim gövdeleri Echobell worker'ı tarafından 1500 bayt ile sınırlandırılır ve kilit ekranı zaten çok daha azını gösterir.-m 10,curl'e 10 saniyelik zaman aşımı verir; böylece bir ağ sorunu Claude Code'u hook'unuzu beklerken asılı bırakmaz.
Echobell gönderdiğiniz anahtarları kanalın şablonlarıyla işler ve yeni bir kanalda bunları okuyan bir şablon yoktur — kanal ayarlarında başlık şablonunu {{title}}, gövde şablonunu {{body}} olarak ayarlayın. Proje adının görünmesini istiyorsanız birine {{project}} ekleyin, örneğin {{title}} ({{project}}).
Adım 3 — Gerçek bir istem beklemeden test edin
Aynı işlem hattını sahte bir hook payload'ıyla elle çalıştırın:
echo '{"message":"Bash kullanımı için Claude izin bekliyor","cwd":"/home/me/code/api","notification_type":"permission_prompt"}' \
| jq -c '{title: "Claude izin istiyor", body: .message, project: (.cwd | split("/") | last)}' \
| curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- "$ECHOBELL_CLAUDE_BLOCKED_URL"
Telefonunuz çalıyorsa Echobell tarafı sorunsuzdur ve kalan sorun Claude Code'un yapılandırmayı nasıl okuduğundadır. Claude Code'da /hooks komutunu çalıştırarak hook'ların yüklendiğini doğrulayın; oturum çalışırken yapılan ayar değişikliklerinin geçerli olması için hook menüsüne uğramanız ya da yeniden başlatmanız gerekebilir.
Adım 4 — Takıldı kanalını çaldırın
Anlık bildirim Rahatsız Etmeyin'e yenilir. Calling kanalı gelen arama gibi davranır ve iOS Odak modunu aşar; bu, uzun bir görev başlatıp akşam için ortadan kaybolduğunuzda en çok işe yarar. Yalnızca bazı istemlerde rahatsız edilmek istiyorsanız hook'u değiştirmek yerine gönderdiğiniz değişkenler üzerinde bir Echobell kanal koşulu kullanın, örneğin project == "api". Değişkenlerin tam listesi için koşullar referansına bakın.
Bildirim bombardımanından kaçınmak
Yoğun bir oturum çok sayıda Stop olayı tetikleyebilir — her yanıt bir tanesiyle biter. Sinyali korumanın üç yolu:
Stopolayını çalan bir kanala göndermeyin. Tamamlanma acil değildir; Normal'de tutun.Stopyerineidle_promptkullanın; her yanıttan sonra değil, yalnızca Claude durup sizi beklediğinde haberdar olmak istiyorsanız.- Bir koşulla projeye göre daraltın; böylece deneme amaçlı bir depo sizi hiç bildirimle rahatsız etmez.
Claude Code'u uzaktan veya CI'da çalıştırmak
Aynı yaklaşım bulut veya uzak ortamlarda da çalışır, çünkü hook yalnızca giden bir HTTPS isteğidir. İnternetten erişilebilir olması gereken hiçbir şey yoktur. İki ortam değişkenini kabuk profili yerine ortamın gizli değerlerine (secrets) tanımlayın; oturum nerede çalışırsa çalışsın bildirim telefonunuza ulaşır.
Sorun giderme
Hiçbir şey gelmiyor ve elle test de başarısız. URL değişkeninin Claude Code'u başlatan kabukta tanımlı olduğunu kontrol edin: echo "$ECHOBELL_CLAUDE_BLOCKED_URL". Boş bir değişken curl'ün sessizce başarısız olmasına yol açar.
Elle test çalışıyor ama hook tetiklenmiyor. Matcher'ı doğrulayın: permission_prompt ve idle_prompt birbirinden farklıdır ve eşleşmeyen bir matcher hiç çalışmaz. /hooks komutunu çalıştırın ve JSON'un geçerli olduğunu kontrol edin — sondaki bir virgül, ayar dosyasındaki tüm hook'ları devre dışı bırakır.
Bildirim gövdesi boş. jq filtresi o olayda bulunmayan bir alana başvurmuş. message alanı Notification girdisinde, last_assistant_message alanı Stop girdisinde bulunur. Yukarıdaki yapılandırmada olduğu gibi varsayılan değer vermek için // kullanın.
Çok sık tetikleniyor. Yukarıdaki bölüme bakın — Stop yerine idle_prompt kullanın ya da bir koşul ekleyin.
Sık sorulan sorular
Claude Code izin istediğinde nasıl bildirim alırım?
permission_prompt matcher'lı bir Notification hook'u ekleyin ve bir kanala webhook göndersin. Echobell bu isteği telefonunuzda anlık bildirime ya da arama tarzı bir uyarıya dönüştürür.
Claude Code bir görevi bitirdiğinde nasıl anlarım?
Bir Stop hook'u ekleyin. Claude yanıtını tamamladığında çalışır ve girdisi, bildirim gövdesi olarak kullanabileceğiniz last_assistant_message alanını içerir.
Bildirim Rahatsız Etmeyin'i aşabilir mi?
Alıcı kanal bir Calling kanalıysa evet. Gelen arama gibi davranır ve iOS Odak modu buna izin verir. Herhangi bir uygulamadan gelen normal bir anlık bildirim aşamaz.
Bu, web üzerindeki Claude Code'da veya uzak oturumlarda çalışır mı?
Evet. Hook yalnızca giden bir HTTPS isteği yaptığı için oturumun internete eriştiği her yerde çalışır. Kanal URL'lerini ortamın gizli değerleri (secrets) üzerinden sağlayın.
Webhook URL'sini settings.json içine koymak güvenli mi?
Token bir depoya commit edilmesin diye yukarıda gösterildiği gibi ortam değişkeni tercih edin. Sızarsa yeni bir kanal oluşturup eskisini kullanımdan kaldırın.
Özet
İki kanal, iki hook ve bir jq | curl işlem hattı: permission_prompt için Calling veya Time Sensitive bir kanal, Stop için Normal bir kanal. Bundan sonra uzun bir ajan görevi başlatıp odadan çıkabilir ve yalnızca ajan gerçekten size ihtiyaç duyduğunda geri çağrılabilirsiniz.
Echobell'i iPhone için indirin ya da Google Play'den edinin; ardından uzun bir görevi bu yola emanet etmeden önce yukarıdaki elle testi çalıştırın.