Siapkan hook pertama Anda
Cara tercepat untuk membuat hook adalah melalui menu interaktif/hooks di Claude Code. Panduan ini membuat hook notifikasi desktop, sehingga Anda mendapat peringatan kapan pun Claude menunggu input Anda daripada menonton terminal.
Buka menu hooks
Ketik
/hooks di CLI Claude Code. Anda akan melihat daftar semua acara hook yang tersedia, ditambah opsi untuk menonaktifkan semua hooks. Setiap acara sesuai dengan titik dalam siklus hidup Claude di mana Anda dapat menjalankan kode khusus. Pilih Notification untuk membuat hook yang aktif ketika Claude memerlukan perhatian Anda.Konfigurasi matcher
Menu menampilkan daftar matcher, yang memfilter kapan hook aktif. Atur matcher ke
* untuk aktif pada semua jenis notifikasi. Anda dapat mempersempit nanti dengan mengubah matcher ke nilai spesifik seperti permission_prompt atau idle_prompt.Tambahkan perintah Anda
Pilih
+ Add new hook…. Menu meminta Anda untuk perintah shell yang akan dijalankan ketika acara aktif. Hooks menjalankan perintah shell apa pun yang Anda berikan, jadi Anda dapat menggunakan alat notifikasi bawaan platform Anda. Salin perintah untuk OS Anda:- macOS
- Linux
- Windows (PowerShell)
Menggunakan
osascript untuk memicu notifikasi macOS asli melalui AppleScript:Pilih lokasi penyimpanan
Menu menanyakan di mana menyimpan konfigurasi hook. Pilih
User settings untuk menyimpannya di ~/.claude/settings.json, yang menerapkan hook ke semua proyek Anda. Anda juga dapat memilih Project settings untuk membatasi ke proyek saat ini. Lihat Konfigurasi lokasi hook untuk semua cakupan yang tersedia.Apa yang dapat Anda otomatisasi
Hooks memungkinkan Anda menjalankan kode pada titik-titik kunci dalam siklus hidup Claude Code: format file setelah edit, blokir perintah sebelum dijalankan, kirim notifikasi ketika Claude memerlukan input, injeksi konteks saat awal sesi, dan banyak lagi. Untuk daftar lengkap acara hook, lihat referensi Hooks. Setiap contoh mencakup blok konfigurasi siap pakai yang Anda tambahkan ke file pengaturan. Pola paling umum:- Dapatkan notifikasi ketika Claude memerlukan input
- Format kode otomatis setelah edit
- Blokir edit ke file yang dilindungi
- Injeksi ulang konteks setelah pemadatan
- Audit perubahan konfigurasi
Dapatkan notifikasi ketika Claude memerlukan input
Dapatkan notifikasi desktop kapan pun Claude selesai bekerja dan memerlukan input Anda, sehingga Anda dapat beralih ke tugas lain tanpa memeriksa terminal. Hook ini menggunakan acaraNotification, yang aktif ketika Claude menunggu input atau izin. Setiap tab di bawah menggunakan perintah notifikasi asli platform. Tambahkan ini ke ~/.claude/settings.json, atau gunakan panduan interaktif di atas untuk mengonfigurasinya dengan /hooks:
- macOS
- Linux
- Windows (PowerShell)
Format kode otomatis setelah edit
Jalankan Prettier secara otomatis pada setiap file yang Claude edit, sehingga pemformatan tetap konsisten tanpa intervensi manual. Hook ini menggunakan acaraPostToolUse dengan matcher Edit|Write, sehingga hanya berjalan setelah alat pengeditan file. Perintah mengekstrak jalur file yang diedit dengan jq dan meneruskannya ke Prettier. Tambahkan ini ke .claude/settings.json di akar proyek Anda:
Contoh Bash di halaman ini menggunakan
jq untuk penguraian JSON. Instal dengan brew install jq (macOS), apt-get install jq (Debian/Ubuntu), atau lihat unduhan jq.Blokir edit ke file yang dilindungi
Cegah Claude dari memodifikasi file sensitif seperti.env, package-lock.json, atau apa pun di .git/. Claude menerima umpan balik yang menjelaskan mengapa edit diblokir, sehingga dapat menyesuaikan pendekatannya.
Contoh ini menggunakan file skrip terpisah yang dipanggil oleh hook. Skrip memeriksa jalur file target terhadap daftar pola yang dilindungi dan keluar dengan kode 2 untuk memblokir edit.
Buat skrip dapat dieksekusi (macOS/Linux)
Skrip hook harus dapat dieksekusi agar Claude Code dapat menjalankannya:
Injeksi ulang konteks setelah pemadatan
Ketika jendela konteks Claude penuh, pemadatan merangkum percakapan untuk membebaskan ruang. Ini dapat kehilangan detail penting. Gunakan hookSessionStart dengan matcher compact untuk injeksi ulang konteks kritis setelah setiap pemadatan.
Teks apa pun yang ditulis perintah Anda ke stdout ditambahkan ke konteks Claude. Contoh ini mengingatkan Claude tentang konvensi proyek dan pekerjaan terbaru. Tambahkan ini ke .claude/settings.json di akar proyek Anda:
echo dengan perintah apa pun yang menghasilkan output dinamis, seperti git log --oneline -5 untuk menampilkan commit terbaru. Untuk injeksi konteks pada setiap awal sesi, pertimbangkan menggunakan CLAUDE.md sebagai gantinya. Untuk variabel lingkungan, lihat CLAUDE_ENV_FILE dalam referensi.
Audit perubahan konfigurasi
Lacak ketika file pengaturan atau skills berubah selama sesi. AcaraConfigChange aktif ketika proses eksternal atau editor memodifikasi file konfigurasi, sehingga Anda dapat mencatat perubahan untuk kepatuhan atau memblokir modifikasi yang tidak sah.
Contoh ini menambahkan setiap perubahan ke log audit. Tambahkan ini ke ~/.claude/settings.json:
user_settings, project_settings, local_settings, policy_settings, atau skills. Untuk memblokir perubahan agar tidak berlaku, keluar dengan kode 2 atau kembalikan {"decision": "block"}. Lihat referensi ConfigChange untuk skema input lengkap.
Cara kerja hooks
Acara hook aktif pada titik-titik siklus hidup spesifik di Claude Code. Ketika acara aktif, semua hook yang cocok berjalan secara paralel, dan perintah hook yang identik secara otomatis dideduplikasi. Tabel di bawah menunjukkan setiap acara dan kapan dipicu:| Event | When it fires |
|---|---|
SessionStart | When a session begins or resumes |
UserPromptSubmit | When you submit a prompt, before Claude processes it |
PreToolUse | Before a tool call executes. Can block it |
PermissionRequest | When a permission dialog appears |
PostToolUse | After a tool call succeeds |
PostToolUseFailure | After a tool call fails |
Notification | When Claude Code sends a notification |
SubagentStart | When a subagent is spawned |
SubagentStop | When a subagent finishes |
Stop | When Claude finishes responding |
TeammateIdle | When an agent team teammate is about to go idle |
TaskCompleted | When a task is being marked as completed |
InstructionsLoaded | When a CLAUDE.md or .claude/rules/*.md file is loaded into context. Fires at session start and when files are lazily loaded during a session |
ConfigChange | When a configuration file changes during a session |
WorktreeCreate | When a worktree is being created via --worktree or isolation: "worktree". Replaces default git behavior |
WorktreeRemove | When a worktree is being removed, either at session exit or when a subagent finishes |
PreCompact | Before context compaction |
SessionEnd | When a session terminates |
type yang menentukan cara menjalankannya. Sebagian besar hooks menggunakan "type": "command", yang menjalankan perintah shell. Tiga jenis lainnya tersedia:
"type": "http": POST data acara ke URL. Lihat HTTP hooks."type": "prompt": evaluasi LLM satu putaran. Lihat Hooks berbasis prompt."type": "agent": verifikasi multi-putaran dengan akses alat. Lihat Hooks berbasis agent.
Baca input dan kembalikan output
Hooks berkomunikasi dengan Claude Code melalui stdin, stdout, stderr, dan kode keluar. Ketika acara aktif, Claude Code meneruskan data khusus acara sebagai JSON ke stdin skrip Anda. Skrip Anda membaca data itu, melakukan pekerjaan, dan memberi tahu Claude Code apa yang harus dilakukan selanjutnya melalui kode keluar.Input hook
Setiap acara mencakup bidang umum sepertisession_id dan cwd, tetapi setiap jenis acara menambahkan data berbeda. Misalnya, ketika Claude menjalankan perintah Bash, hook PreToolUse menerima sesuatu seperti ini di stdin:
UserPromptSubmit mendapatkan teks prompt sebagai gantinya, hook SessionStart mendapatkan source (startup, resume, clear, compact), dan seterusnya. Lihat Bidang input umum dalam referensi untuk bidang bersama, dan bagian setiap acara untuk skema khusus acara.
Output hook
Skrip Anda memberi tahu Claude Code apa yang harus dilakukan selanjutnya dengan menulis ke stdout atau stderr dan keluar dengan kode spesifik. Misalnya, hookPreToolUse yang ingin memblokir perintah:
- Exit 0: tindakan berlanjut. Untuk hook
UserPromptSubmitdanSessionStart, apa pun yang Anda tulis ke stdout ditambahkan ke konteks Claude. - Exit 2: tindakan diblokir. Tulis alasan ke stderr, dan Claude menerimanya sebagai umpan balik sehingga dapat menyesuaikan.
- Kode keluar lainnya: tindakan berlanjut. Stderr dicatat tetapi tidak ditampilkan ke Claude. Alihkan mode verbose dengan
Ctrl+Ountuk melihat pesan ini dalam transkrip.
Output JSON terstruktur
Kode keluar memberi Anda dua opsi: izinkan atau blokir. Untuk kontrol lebih, keluar 0 dan cetak objek JSON ke stdout sebagai gantinya.Gunakan exit 2 untuk memblokir dengan pesan stderr, atau exit 0 dengan JSON untuk kontrol terstruktur. Jangan campur: Claude Code mengabaikan JSON ketika Anda exit 2.
PreToolUse dapat menolak panggilan alat dan memberi tahu Claude mengapa, atau meningkatkannya ke pengguna untuk persetujuan:
permissionDecision dan membatalkan panggilan alat, kemudian memberi umpan balik permissionDecisionReason kembali ke Claude. Tiga opsi ini khusus untuk PreToolUse:
"allow": lanjutkan tanpa menampilkan prompt izin"deny": batalkan panggilan alat dan kirim alasan ke Claude"ask": tampilkan prompt izin kepada pengguna seperti biasa
PostToolUse dan Stop menggunakan bidang decision: "block" tingkat atas, sementara PermissionRequest menggunakan hookSpecificOutput.decision.behavior. Lihat tabel ringkasan dalam referensi untuk rincian lengkap menurut acara.
Untuk hook UserPromptSubmit, gunakan additionalContext sebagai gantinya untuk injeksi teks ke dalam konteks Claude. Hooks berbasis prompt (type: "prompt") menangani output secara berbeda: lihat Hooks berbasis prompt.
Filter hooks dengan matchers
Tanpa matcher, hook aktif pada setiap kemunculan acaranya. Matchers memungkinkan Anda mempersempit itu. Misalnya, jika Anda ingin menjalankan formatter hanya setelah edit file (bukan setelah setiap panggilan alat), tambahkan matcher ke hookPostToolUse Anda:
"Edit|Write" adalah pola regex yang cocok dengan nama alat. Hook hanya aktif ketika Claude menggunakan alat Edit atau Write, bukan ketika menggunakan Bash, Read, atau alat lainnya.
Setiap jenis acara cocok pada bidang spesifik. Matchers mendukung string tepat dan pola regex:
| Acara | Apa yang difilter matcher | Contoh nilai matcher |
|---|---|---|
PreToolUse, PostToolUse, PostToolUseFailure, PermissionRequest | nama alat | Bash, Edit|Write, mcp__.* |
SessionStart | cara sesi dimulai | startup, resume, clear, compact |
SessionEnd | mengapa sesi berakhir | clear, logout, prompt_input_exit, bypass_permissions_disabled, other |
Notification | jenis notifikasi | permission_prompt, idle_prompt, auth_success, elicitation_dialog |
SubagentStart | jenis agent | Bash, Explore, Plan, atau nama agent khusus |
PreCompact | apa yang memicu pemadatan | manual, auto |
SubagentStop | jenis agent | nilai yang sama seperti SubagentStart |
ConfigChange | sumber konfigurasi | user_settings, project_settings, local_settings, policy_settings, skills |
UserPromptSubmit, Stop, TeammateIdle, TaskCompleted, WorktreeCreate, WorktreeRemove | tidak ada dukungan matcher | selalu aktif pada setiap kemunculan |
- Catat setiap perintah Bash
- Cocokkan alat MCP
- Bersihkan saat akhir sesi
Cocokkan hanya panggilan alat
Bash dan catat setiap perintah ke file. Acara PostToolUse aktif setelah perintah selesai, jadi tool_input.command berisi apa yang berjalan. Hook menerima data acara sebagai JSON di stdin, dan jq -r '.tool_input.command' mengekstrak hanya string perintah, yang >> tambahkan ke file log:Konfigurasi lokasi hook
Di mana Anda menambahkan hook menentukan cakupannya:| Lokasi | Cakupan | Dapat Dibagikan |
|---|---|---|
~/.claude/settings.json | Semua proyek Anda | Tidak, lokal ke mesin Anda |
.claude/settings.json | Proyek tunggal | Ya, dapat dikomit ke repo |
.claude/settings.local.json | Proyek tunggal | Tidak, gitignored |
| Pengaturan kebijakan terkelola | Seluruh organisasi | Ya, dikendalikan admin |
Plugin hooks/hooks.json | Ketika plugin diaktifkan | Ya, dikemas dengan plugin |
| Skill atau agent frontmatter | Saat skill atau agent aktif | Ya, didefinisikan dalam file komponen |
/hooks di Claude Code untuk menambah, menghapus, dan melihat hooks secara interaktif. Untuk menonaktifkan semua hooks sekaligus, gunakan toggle di bagian bawah menu /hooks atau atur "disableAllHooks": true dalam file pengaturan Anda.
Hooks yang ditambahkan melalui menu /hooks berlaku segera. Jika Anda mengedit file pengaturan secara langsung saat Claude Code berjalan, perubahan tidak akan berlaku sampai Anda meninjau dalam menu /hooks atau memulai ulang sesi Anda.
Hooks berbasis prompt
Untuk keputusan yang memerlukan penilaian daripada aturan deterministik, gunakan hookstype: "prompt". Daripada menjalankan perintah shell, Claude Code mengirim prompt Anda dan data input hook ke model Claude (Haiku secara default) untuk membuat keputusan. Anda dapat menentukan model berbeda dengan bidang model jika Anda memerlukan kemampuan lebih.
Satu-satunya pekerjaan model adalah mengembalikan keputusan ya/tidak sebagai JSON:
"ok": true: tindakan berlanjut"ok": false: tindakan diblokir."reason"model diberi umpan balik ke Claude sehingga dapat menyesuaikan.
Stop untuk menanyakan kepada model apakah semua tugas yang diminta selesai. Jika model mengembalikan "ok": false, Claude terus bekerja dan menggunakan reason sebagai instruksi berikutnya:
Hooks berbasis agent
Ketika verifikasi memerlukan inspeksi file atau menjalankan perintah, gunakan hookstype: "agent". Tidak seperti hooks prompt yang membuat panggilan LLM tunggal, hooks agent menelurkan subagent yang dapat membaca file, mencari kode, dan menggunakan alat lain untuk memverifikasi kondisi sebelum mengembalikan keputusan.
Hooks agent menggunakan format respons "ok" / "reason" yang sama seperti hooks prompt, tetapi dengan timeout default lebih lama 60 detik dan hingga 50 putaran penggunaan alat.
Contoh ini memverifikasi bahwa tes lulus sebelum memungkinkan Claude berhenti:
HTTP hooks
Gunakan hookstype: "http" untuk POST data acara ke endpoint HTTP daripada menjalankan perintah shell. Endpoint menerima JSON yang sama yang diterima hook perintah di stdin, dan mengembalikan hasil melalui badan respons HTTP menggunakan format JSON yang sama.
HTTP hooks berguna ketika Anda ingin server web, fungsi cloud, atau layanan eksternal menangani logika hook: misalnya, layanan audit bersama yang mencatat acara penggunaan alat di seluruh tim.
Contoh ini memposting setiap penggunaan alat ke layanan logging lokal:
hookSpecificOutput yang sesuai. Kode status HTTP saja tidak dapat memblokir tindakan.
Nilai header mendukung interpolasi variabel lingkungan menggunakan sintaks $VAR_NAME atau ${VAR_NAME}. Hanya variabel yang tercantum dalam array allowedEnvVars yang diselesaikan; semua referensi $VAR lainnya tetap kosong.
HTTP hooks harus dikonfigurasi dengan mengedit JSON pengaturan Anda secara langsung. Menu interaktif
/hooks hanya mendukung penambahan hooks perintah.Batasan dan pemecahan masalah
Batasan
- Hooks perintah berkomunikasi melalui stdout, stderr, dan kode keluar saja. Mereka tidak dapat memicu perintah atau panggilan alat secara langsung. HTTP hooks berkomunikasi melalui badan respons sebagai gantinya.
- Timeout hook adalah 10 menit secara default, dapat dikonfigurasi per hook dengan bidang
timeout(dalam detik). - Hook
PostToolUsetidak dapat membatalkan tindakan karena alat sudah dieksekusi. - Hook
PermissionRequesttidak aktif dalam mode non-interaktif (-p). Gunakan hooksPreToolUseuntuk keputusan izin otomatis. - Hook
Stopaktif kapan pun Claude selesai merespons, bukan hanya saat penyelesaian tugas. Mereka tidak aktif pada interupsi pengguna.
Hook tidak aktif
Hook dikonfigurasi tetapi tidak pernah dieksekusi.- Jalankan
/hooksdan konfirmasi hook muncul di bawah acara yang benar - Periksa bahwa pola matcher cocok dengan nama alat dengan tepat (matchers peka huruf besar-kecil)
- Verifikasi Anda memicu jenis acara yang benar (misalnya,
PreToolUseaktif sebelum eksekusi alat,PostToolUseaktif setelah) - Jika menggunakan hooks
PermissionRequestdalam mode non-interaktif (-p), beralih kePreToolUsesebagai gantinya
Kesalahan hook dalam output
Anda melihat pesan seperti “PreToolUse hook error: …” dalam transkrip.- Skrip Anda keluar dengan kode non-nol secara tidak terduga. Uji secara manual dengan menyalurkan JSON sampel:
- Jika Anda melihat “command not found”, gunakan jalur absolut atau
$CLAUDE_PROJECT_DIRuntuk mereferensikan skrip - Jika Anda melihat “jq: command not found”, instal
jqatau gunakan Python/Node.js untuk penguraian JSON - Jika skrip tidak berjalan sama sekali, buatnya dapat dieksekusi:
chmod +x ./my-hook.sh
/hooks menunjukkan tidak ada hooks yang dikonfigurasi
Anda mengedit file pengaturan tetapi hooks tidak muncul dalam menu.
- Mulai ulang sesi Anda atau buka
/hooksuntuk memuat ulang. Hooks yang ditambahkan melalui menu/hooksberlaku segera, tetapi edit file manual memerlukan reload. - Verifikasi JSON Anda valid (koma trailing dan komentar tidak diizinkan)
- Konfirmasi file pengaturan berada di lokasi yang benar:
.claude/settings.jsonuntuk hooks proyek,~/.claude/settings.jsonuntuk hooks global
Hook Stop berjalan selamanya
Claude terus bekerja dalam loop tak terbatas daripada berhenti. Skrip hook Stop Anda perlu memeriksa apakah sudah memicu kelanjutan. Uraikan bidangstop_hook_active dari input JSON dan keluar lebih awal jika true:
Validasi JSON gagal
Claude Code menampilkan kesalahan penguraian JSON meskipun skrip hook Anda menampilkan JSON yang valid. Ketika Claude Code menjalankan hook, ia menelurkan shell yang bersumber dari profil Anda (~/.zshrc atau ~/.bashrc). Jika profil Anda berisi pernyataan echo tanpa syarat, output itu ditambahkan ke JSON hook Anda:
$- berisi flag shell, dan i berarti interaktif. Hooks berjalan di shell non-interaktif, jadi echo dilewati.
Teknik debug
Alihkan mode verbose denganCtrl+O untuk melihat output hook dalam transkrip, atau jalankan claude --debug untuk detail eksekusi lengkap termasuk hooks mana yang cocok dan kode keluar mereka.
Pelajari lebih lanjut
- Referensi Hooks: skema acara lengkap, format output JSON, hooks asinkron, dan hooks alat MCP
- Pertimbangan keamanan: tinjau sebelum menerapkan hooks di lingkungan bersama atau produksi
- Contoh validator perintah Bash: implementasi referensi lengkap