Untuk panduan quickstart dengan contoh, lihat Memulai dengan Claude Code hooks.
Konfigurasi
Claude Code hooks dikonfigurasi dalam file pengaturan Anda:~/.claude/settings.json- Pengaturan pengguna.claude/settings.json- Pengaturan proyek.claude/settings.local.json- Pengaturan proyek lokal (tidak di-commit)- Pengaturan kebijakan yang dikelola Enterprise
Struktur
Hooks diorganisir berdasarkan matchers, di mana setiap matcher dapat memiliki beberapa hooks:- matcher: Pola untuk mencocokkan nama alat, peka huruf besar-kecil (hanya berlaku untuk
PreToolUsedanPostToolUse)- String sederhana cocok persis:
Writehanya cocok dengan alat Write - Mendukung regex:
Edit|WriteatauNotebook.* - Gunakan
*untuk mencocokkan semua alat. Anda juga dapat menggunakan string kosong ("") atau membiarkanmatcherkosong.
- String sederhana cocok persis:
- hooks: Array perintah yang akan dijalankan ketika pola cocok
type: Saat ini hanya"command"yang didukungcommand: Perintah bash yang akan dijalankan (dapat menggunakan variabel lingkungan$CLAUDE_PROJECT_DIR)timeout: (Opsional) Berapa lama perintah harus berjalan, dalam detik, sebelum membatalkan perintah tertentu itu.
UserPromptSubmit, Notification, Stop, dan SubagentStop
yang tidak menggunakan matchers, Anda dapat menghilangkan field matcher:
Skrip Hook Khusus Proyek
Anda dapat menggunakan variabel lingkunganCLAUDE_PROJECT_DIR (hanya tersedia ketika
Claude Code menjalankan perintah hook) untuk mereferensikan skrip yang disimpan di proyek Anda,
memastikan mereka bekerja terlepas dari direktori saat ini Claude:
Hooks plugin
Plugin dapat menyediakan hooks yang terintegrasi dengan mulus dengan hooks pengguna dan proyek Anda. Hooks plugin secara otomatis digabungkan dengan konfigurasi Anda ketika plugin diaktifkan. Cara kerja hooks plugin:- Hooks plugin didefinisikan dalam file
hooks/hooks.jsonplugin atau dalam file yang diberikan oleh jalur kustom ke fieldhooks. - Ketika plugin diaktifkan, hooks-nya digabungkan dengan hooks pengguna dan proyek
- Beberapa hooks dari sumber berbeda dapat merespons acara yang sama
- Hooks plugin menggunakan variabel lingkungan
${CLAUDE_PLUGIN_ROOT}untuk mereferensikan file plugin
Hooks plugin menggunakan format yang sama dengan hooks reguler dengan field
description opsional untuk menjelaskan tujuan hook.Hooks plugin berjalan bersama hooks kustom Anda. Jika beberapa hooks cocok dengan acara, semuanya dijalankan secara paralel.
${CLAUDE_PLUGIN_ROOT}: Jalur absolut ke direktori plugin${CLAUDE_PROJECT_DIR}: Direktori root proyek (sama seperti untuk hooks proyek)- Semua variabel lingkungan standar tersedia
Hook Events
PreToolUse
Berjalan setelah Claude membuat parameter alat dan sebelum memproses panggilan alat. Matchers umum:Task- Tugas subagent (lihat dokumentasi subagents)Bash- Perintah shellGlob- Pencocokan pola fileGrep- Pencarian kontenRead- Pembacaan fileEdit- Pengeditan fileWrite- Penulisan fileWebFetch,WebSearch- Operasi web
PostToolUse
Berjalan segera setelah alat selesai dengan sukses. Mengenali nilai matcher yang sama seperti PreToolUse.Notification
Berjalan ketika Claude Code mengirim notifikasi. Notifikasi dikirim ketika:- Claude membutuhkan izin Anda untuk menggunakan alat. Contoh: “Claude membutuhkan izin Anda untuk menggunakan Bash”
- Input prompt telah idle selama minimal 60 detik. “Claude menunggu input Anda”
UserPromptSubmit
Berjalan ketika pengguna mengirimkan prompt, sebelum Claude memprosesnya. Ini memungkinkan Anda untuk menambahkan konteks tambahan berdasarkan prompt/percakapan, memvalidasi prompt, atau memblokir jenis prompt tertentu.Stop
Berjalan ketika agen Claude Code utama selesai merespons. Tidak berjalan jika penghentian terjadi karena gangguan pengguna.SubagentStop
Berjalan ketika subagent Claude Code (panggilan alat Task) selesai merespons.PreCompact
Berjalan sebelum Claude Code akan menjalankan operasi compact. Matchers:manual- Dipanggil dari/compactauto- Dipanggil dari auto-compact (karena jendela konteks penuh)
SessionStart
Berjalan ketika Claude Code memulai sesi baru atau melanjutkan sesi yang ada (yang saat ini memulai sesi baru di bawah tenda). Berguna untuk memuat konteks pengembangan seperti masalah yang ada atau perubahan terbaru pada codebase Anda, menginstal dependensi, atau menyiapkan variabel lingkungan. Matchers:startup- Dipanggil dari startupresume- Dipanggil dari--resume,--continue, atau/resumeclear- Dipanggil dari/clearcompact- Dipanggil dari compact otomatis atau manual.
Mempertahankan variabel lingkungan
Hook SessionStart memiliki akses ke variabel lingkunganCLAUDE_ENV_FILE, yang menyediakan jalur file di mana Anda dapat mempertahankan variabel lingkungan untuk perintah bash berikutnya.
Contoh: Menetapkan variabel lingkungan individual
nvm use), tangkap dan pertahankan semua perubahan dengan membedakan lingkungan:
CLAUDE_ENV_FILE hanya tersedia untuk hook SessionStart. Jenis hook lainnya tidak memiliki akses ke variabel ini.SessionEnd
Berjalan ketika sesi Claude Code berakhir. Berguna untuk tugas pembersihan, pencatatan statistik sesi, atau penyimpanan status sesi. Fieldreason dalam input hook akan menjadi salah satu dari:
clear- Sesi dihapus dengan perintah /clearlogout- Pengguna logoutprompt_input_exit- Pengguna keluar saat input prompt terlihatother- Alasan keluar lainnya
Hook Input
Hooks menerima data JSON melalui stdin yang berisi informasi sesi dan data spesifik acara:PreToolUse Input
Skema tepat untuktool_input tergantung pada alatnya.
PostToolUse Input
Skema tepat untuktool_input dan tool_response tergantung pada alatnya.
Notification Input
UserPromptSubmit Input
Stop dan SubagentStop Input
stop_hook_active adalah true ketika Claude Code sudah melanjutkan sebagai hasil dari
hook stop. Periksa nilai ini atau proses transkrip untuk mencegah Claude Code
berjalan tanpa batas.
PreCompact Input
Untukmanual, custom_instructions berasal dari apa yang dilewatkan pengguna ke
/compact. Untuk auto, custom_instructions kosong.
SessionStart Input
SessionEnd Input
Hook Output
Ada dua cara untuk hooks mengembalikan output kembali ke Claude Code. Output mengkomunikasikan apakah akan memblokir dan umpan balik apa pun yang harus ditampilkan kepada Claude dan pengguna.Sederhana: Exit Code
Hooks mengkomunikasikan status melalui exit codes, stdout, dan stderr:- Exit code 0: Sukses.
stdoutditampilkan kepada pengguna dalam mode transkrip (CTRL-R), kecuali untukUserPromptSubmitdanSessionStart, di mana stdout ditambahkan ke konteks. - Exit code 2: Kesalahan pemblokiran.
stderrdiumpankan kembali ke Claude untuk diproses secara otomatis. Lihat perilaku per-hook-event di bawah. - Exit codes lainnya: Kesalahan non-pemblokiran.
stderrditampilkan kepada pengguna dan eksekusi berlanjut.
Pengingat: Claude Code tidak melihat stdout jika exit code adalah 0, kecuali untuk
hook
UserPromptSubmit di mana stdout disuntikkan sebagai konteks.Perilaku Exit Code 2
| Hook Event | Perilaku |
|---|---|
PreToolUse | Memblokir panggilan alat, menampilkan stderr ke Claude |
PostToolUse | Menampilkan stderr ke Claude (alat sudah berjalan) |
Notification | N/A, menampilkan stderr ke pengguna saja |
UserPromptSubmit | Memblokir pemrosesan prompt, menghapus prompt, menampilkan stderr ke pengguna saja |
Stop | Memblokir penghentian, menampilkan stderr ke Claude |
SubagentStop | Memblokir penghentian, menampilkan stderr ke subagent Claude |
PreCompact | N/A, menampilkan stderr ke pengguna saja |
SessionStart | N/A, menampilkan stderr ke pengguna saja |
SessionEnd | N/A, menampilkan stderr ke pengguna saja |
Lanjutan: JSON Output
Hooks dapat mengembalikan JSON terstruktur dalamstdout untuk kontrol yang lebih canggih:
Field JSON Umum
Semua jenis hook dapat menyertakan field opsional ini:continue adalah false, Claude berhenti memproses setelah hooks berjalan.
- Untuk
PreToolUse, ini berbeda dari"permissionDecision": "deny", yang hanya memblokir panggilan alat tertentu dan memberikan umpan balik otomatis ke Claude. - Untuk
PostToolUse, ini berbeda dari"decision": "block", yang memberikan umpan balik otomatis ke Claude. - Untuk
UserPromptSubmit, ini mencegah prompt dari diproses. - Untuk
StopdanSubagentStop, ini mengambil alih dari apa pun output"decision": "block". - Dalam semua kasus,
"continue" = falsemengambil alih dari apa pun output"decision": "block".
stopReason menemani continue dengan alasan yang ditampilkan kepada pengguna, tidak ditampilkan
ke Claude.
Kontrol Keputusan PreToolUse
Hook PreToolUse dapat mengontrol apakah panggilan alat dilanjutkan.
"allow"melewati sistem izin.permissionDecisionReasonditampilkan kepada pengguna tetapi tidak ke Claude."deny"mencegah panggilan alat dari dijalankan.permissionDecisionReasonadalah ditampilkan ke Claude."ask"meminta pengguna untuk mengkonfirmasi panggilan alat di UI.permissionDecisionReasonditampilkan kepada pengguna tetapi tidak ke Claude.
updatedInput:
updatedInputmemungkinkan Anda untuk memodifikasi parameter input alat sebelum alat dijalankan. Ini adalah objekRecord<string, unknown>yang berisi field yang ingin Anda ubah atau tambahkan.- Ini paling berguna dengan
"permissionDecision": "allow"untuk memodifikasi dan menyetujui panggilan alat.
Field
decision dan reason sudah usang untuk hook PreToolUse.
Gunakan hookSpecificOutput.permissionDecision dan
hookSpecificOutput.permissionDecisionReason sebagai gantinya. Field usang
"approve" dan "block" memetakan ke "allow" dan "deny" masing-masing.Kontrol Keputusan PostToolUse
Hook PostToolUse dapat memberikan umpan balik ke Claude setelah eksekusi alat.
"block"secara otomatis meminta Claude denganreason.undefinedtidak melakukan apa pun.reasondiabaikan."hookSpecificOutput.additionalContext"menambahkan konteks untuk Claude pertimbangkan.
Kontrol Keputusan UserPromptSubmit
Hook UserPromptSubmit dapat mengontrol apakah prompt pengguna diproses.
"block"mencegah prompt dari diproses. Prompt yang dikirimkan dihapus dari konteks."reason"ditampilkan kepada pengguna tetapi tidak ditambahkan ke konteks.undefinedmemungkinkan prompt untuk melanjutkan secara normal."reason"diabaikan."hookSpecificOutput.additionalContext"menambahkan string ke konteks jika tidak diblokir.
Kontrol Keputusan Stop/SubagentStop
Hook Stop dan SubagentStop dapat mengontrol apakah Claude harus melanjutkan.
"block"mencegah Claude dari berhenti. Anda harus mengisireasonuntuk Claude tahu cara melanjutkan.undefinedmemungkinkan Claude untuk berhenti.reasondiabaikan.
Kontrol Keputusan SessionStart
Hook SessionStart memungkinkan Anda untuk memuat konteks di awal sesi.
"hookSpecificOutput.additionalContext"menambahkan string ke konteks.- Nilai
additionalContextdari beberapa hooks digabungkan.
Kontrol Keputusan SessionEnd
Hook SessionEnd berjalan ketika sesi berakhir. Mereka tidak dapat memblokir penghentian sesi
tetapi dapat melakukan tugas pembersihan.
Contoh Exit Code: Validasi Perintah Bash
Contoh JSON Output: UserPromptSubmit untuk Menambahkan Konteks dan Validasi
Untuk hook
UserPromptSubmit, Anda dapat menyuntikkan konteks menggunakan salah satu metode:- Exit code 0 dengan stdout: Claude melihat konteks (kasus khusus untuk
UserPromptSubmit) - JSON output: Memberikan kontrol yang lebih besar atas perilaku
Contoh JSON Output: PreToolUse dengan Persetujuan
Bekerja dengan Alat MCP
Claude Code hooks bekerja dengan mulus dengan Model Context Protocol (MCP) tools. Ketika server MCP menyediakan alat, mereka muncul dengan pola penamaan khusus yang dapat Anda cocokkan di hooks Anda.Penamaan Alat MCP
Alat MCP mengikuti polamcp__<server>__<tool>, misalnya:
mcp__memory__create_entities- Alat create entities server Memorymcp__filesystem__read_file- Alat read file server Filesystemmcp__github__search_repositories- Alat search server GitHub
Mengonfigurasi Hooks untuk Alat MCP
Anda dapat menargetkan alat MCP tertentu atau seluruh server MCP:Contoh
Untuk contoh praktis termasuk pemformatan kode, notifikasi, dan perlindungan file, lihat Lebih Banyak Contoh dalam panduan memulai.
Pertimbangan Keamanan
Penafian
GUNAKAN DENGAN RISIKO ANDA SENDIRI: Claude Code hooks menjalankan perintah shell arbitrer pada sistem Anda secara otomatis. Dengan menggunakan hooks, Anda mengakui bahwa:- Anda sepenuhnya bertanggung jawab atas perintah yang Anda konfigurasi
- Hooks dapat memodifikasi, menghapus, atau mengakses file apa pun yang dapat diakses akun pengguna Anda
- Hooks yang berbahaya atau ditulis dengan buruk dapat menyebabkan kehilangan data atau kerusakan sistem
- Anthropic tidak memberikan garansi dan tidak mengasumsikan tanggung jawab atas kerusakan apa pun yang dihasilkan dari penggunaan hooks
- Anda harus menguji hooks secara menyeluruh di lingkungan yang aman sebelum penggunaan produksi
Praktik Terbaik Keamanan
Berikut adalah beberapa praktik kunci untuk menulis hooks yang lebih aman:- Validasi dan sanitasi input - Jangan pernah mempercayai data input secara membabi buta
- Selalu kutip variabel shell - Gunakan
"$VAR"bukan$VAR - Blokir path traversal - Periksa
..dalam jalur file - Gunakan jalur absolut - Tentukan jalur lengkap untuk skrip (gunakan “$CLAUDE_PROJECT_DIR” untuk jalur proyek)
- Lewati file sensitif - Hindari
.env,.git/, kunci, dll.
Keamanan Konfigurasi
Pengeditan langsung hooks dalam file pengaturan tidak langsung berlaku. Claude Code:- Menangkap snapshot hooks saat startup
- Menggunakan snapshot ini sepanjang sesi
- Memperingatkan jika hooks dimodifikasi secara eksternal
- Memerlukan tinjauan dalam menu
/hooksagar perubahan diterapkan
Detail Eksekusi Hook
- Timeout: Batas eksekusi 60 detik secara default, dapat dikonfigurasi per perintah.
- Timeout untuk perintah individual tidak mempengaruhi perintah lainnya.
- Paralelisasi: Semua hooks yang cocok berjalan secara paralel
- Deduplikasi: Perintah hook identik yang sama secara otomatis dihilangkan duplikatnya
- Lingkungan: Berjalan di direktori saat ini dengan lingkungan Claude Code
- Variabel lingkungan
CLAUDE_PROJECT_DIRtersedia dan berisi jalur absolut ke direktori root proyek (di mana Claude Code dimulai) - Variabel lingkungan
CLAUDE_CODE_REMOTEmenunjukkan apakah hook berjalan di lingkungan jarak jauh (web) ("true") atau lingkungan CLI lokal (tidak diatur atau kosong). Gunakan ini untuk menjalankan logika berbeda berdasarkan konteks eksekusi.
- Variabel lingkungan
- Input: JSON melalui stdin
- Output:
- PreToolUse/PostToolUse/Stop/SubagentStop: Kemajuan ditampilkan dalam transkrip (Ctrl-R)
- Notification/SessionEnd: Dicatat ke debug saja (
--debug) - UserPromptSubmit/SessionStart: stdout ditambahkan sebagai konteks untuk Claude
Debugging
Pemecahan Masalah Dasar
Jika hooks Anda tidak bekerja:- Periksa konfigurasi - Jalankan
/hooksuntuk melihat apakah hook Anda terdaftar - Verifikasi sintaks - Pastikan pengaturan JSON Anda valid
- Uji perintah - Jalankan perintah hook secara manual terlebih dahulu
- Periksa izin - Pastikan skrip dapat dieksekusi
- Tinjau log - Gunakan
claude --debuguntuk melihat detail eksekusi hook
- Kutipan tidak diloloskan - Gunakan
\"di dalam string JSON - Matcher salah - Periksa nama alat cocok persis (peka huruf besar-kecil)
- Perintah tidak ditemukan - Gunakan jalur lengkap untuk skrip
Debugging Lanjutan
Untuk masalah hook yang kompleks:- Inspeksi eksekusi hook - Gunakan
claude --debuguntuk melihat hook terperinci eksekusi - Validasi skema JSON - Uji input/output hook dengan alat eksternal
- Periksa variabel lingkungan - Verifikasi lingkungan Claude Code benar
- Uji kasus tepi - Coba hooks dengan jalur file atau input yang tidak biasa
- Monitor sumber daya sistem - Periksa kelelahan sumber daya selama eksekusi hook
- Gunakan logging terstruktur - Implementasikan logging dalam skrip hook Anda
Contoh Output Debug
Gunakanclaude --debug untuk melihat detail eksekusi hook:
- Hook mana yang berjalan
- Perintah yang dijalankan
- Status sukses/gagal
- Pesan output atau kesalahan