Skip to main content
BlogAI

Hooks Claude Code: Guardrail Agen yang Deterministik

Bagaimana hooks Claude Code menjalankan perintah shell pada event lifecycle untuk memaksa format, memblokir tulisan berisiko, dan menahan tugas sampai tes lulus.

Matthews Wong

Software Engineer

Agustus 20269 menit baca
Hooks Claude Code: Guardrail Agen yang Deterministik

Ringkasan Utama

Hooks Claude Code adalah perintah shell yang berjalan otomatis pada titik-titik tetap dalam lifecycle agen, seperti sebelum sebuah tool dipanggil atau saat sebuah tugas selesai. Karena berjalan sebagai kode deterministik alih-alih saran model, hooks memaksa jaminan yang bisa dilupakan model: memformat setiap suntingan, memblokir tulisan ke path terlindungi, dan menjalankan tes sebagai gerbang mutu.

Meminta agen untuk selalu menjalankan formatter berhasil sampai satu kali ia lupa, dan pada agen coding satu kali itu mendarat di diff Anda. Instruksi dalam prompt adalah saran yang mungkin diikuti model, mungkin juga tidak. Hooks adalah kebalikannya: perintah shell yang dijalankan runtime untuk Anda, setiap saat, terlepas dari apa yang diputuskan model.

Panduan ini menjelaskan apa itu hooks Claude Code, event lifecycle mana yang bisa Anda kaitkan, pola guardrail mana yang layak ditambahkan lebih dulu, dan bagaimana sebuah hook memblokir tindakan berbahaya sebelum berjalan. Mekanismenya khusus Claude Code, tetapi gagasan gerbang deterministik di sekitar agen yang non-deterministik bersifat universal.

Apa itu hook sebenarnya

Hook adalah perintah shell yang dijalankan Claude Code otomatis ketika event tertentu terpicu, dikonfigurasi di settings.json Anda alih-alih di prompt. Model tidak pernah memutuskan apakah sebuah hook berjalan; runtime yang memutuskan. Sifat tunggal itulah yang membuat hooks berguna, karena ia mengubah harapan menjadi jaminan: bukan tolong lint ini, melainkan ini sudah di-lint.

Hooks menerima JSON terstruktur tentang event pada standard input, sehingga sebuah skrip hook bisa memeriksa persis tool mana yang akan berjalan dan dengan argumen apa. Tiga hal membedakannya dari mekanisme steering lain:

  • Hooks bersifat deterministik. Event yang sama selalu memicu perintah yang sama, sehingga perilaku tidak bergeser sepanjang sesi panjang seperti yang bisa terjadi pada instruksi prompt.
  • Hooks menjalankan kode Anda sendiri, jadi pemeriksaan apa pun yang bisa Anda ungkapkan sebagai skrip shell atau program bisa menjadi gerbang, mulai dari formatter sampai mesin kebijakan buatan sendiri.
  • Hooks terpicu pada event lifecycle, bukan pada penilaian model, itulah sebabnya hooks adalah tool yang tepat ketika Anda butuh sesuatu terjadi tanpa gagal.

Event lifecycle yang bisa Anda kaitkan

Hooks dikelompokkan berdasarkan event di settings.json. Yang paling sering dipakai adalah PreToolUse, yang berjalan sebelum sebuah tool dipanggil dan bisa memblokirnya; PostToolUse, yang berjalan setelah sebuah tool berhasil dan ideal untuk memformat atau me-lint berkas yang baru saja berubah; dan Stop, yang berjalan saat Claude selesai merespons dan menjadi gerbang mutu yang alami. Ada juga event untuk pengiriman prompt, notifikasi, dan awal sesi.

Setup awal yang umum memformat setiap berkas yang disunting dan menyaring tiap perintah Bash melalui skrip penjaga kecil:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "npx prettier --write \"$CLAUDE_FILE_PATHS\"" }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": ".claude/guard-bash.sh" }
        ]
      }
    ]
  }
}

Cocokkan hooks secara sempit. Matcher PostToolUse untuk Edit atau Write sebaiknya memformat hanya berkas yang benar-benar berubah, memakai path yang diberikan Claude Code di payload event, alih-alih memformat ulang seluruh repositori pada setiap suntingan dan mengubur diff Anda dalam keriuhan.

Pola guardrail yang layak ditambahkan lebih dulu

Anda tidak butuh banyak hooks untuk merasakan manfaatnya. Beberapa yang dipilih dengan baik sudah menutup kesalahan yang paling sering dibuat agen.

  • Format otomatis saat menulis: hook PostToolUse yang menjalankan Prettier, gofmt, atau Black pada berkas yang berubah, sehingga gaya tidak pernah menjadi tugas model.
  • Path terlindungi: hook PreToolUse yang memblokir suntingan ke lockfile, kode ter-generate, atau konfigurasi CI, dengan menolak tulisan alih-alih mempercayai model membiarkannya.
  • Gerbang tes di Stop: hook Stop yang menjalankan perintah tes cepat Anda dan melaporkan kegagalan, memberi agen sinyal otomatis untuk terus bekerja alih-alih mendeklarasikan menang terlalu dini.
  • Log audit: hook yang menambahkan tiap perintah Bash ke sebuah berkas, sehingga Anda bisa meninjau setelahnya persis apa yang dijalankan agen.

Bagaimana sebuah hook memblokir tindakan berbahaya

Hook PreToolUse adalah titik penegakan. Sebelum Claude Code menjalankan tool yang cocok, ia menjalankan hook Anda dan membaca hasilnya. Jika hook keluar dengan status pemblokir, panggilan tool ditolak dan alasannya diumpankan kembali ke model, yang lalu harus memilih jalur berbeda. Beginilah cara Anda menghentikan sebuah tindakan secara deterministik alih-alih meminta model untuk tidak melakukannya.

Karena hook melihat seluruh input tool sebagai JSON, keputusannya bisa presisi: izinkan perintah Bash yang hanya membaca, tolak yang menyalurkan skrip jarak jauh ke shell, dan biarkan sisanya lewat. Model tidak bisa berkelit melewati sebuah hook, itulah persis alasan aturan yang relevan dengan keamanan berada di sini dan bukan di instruksi CLAUDE.md.

Sebuah hook berjalan dengan izin pengguna penuh Anda dan tanpa prompt konfirmasi, jadi perintah hook yang ceroboh adalah risikonya sendiri. Perlakukan tiap skrip hook seperti kode produksi: beri tanda kutip pada variabel Anda, hindari menyisipkan input tool secara buta ke shell, dan uji skripnya dengan tangan sebelum mengaitkannya ke event yang terpicu pada setiap panggilan tool.

Jaga hooks tetap cepat dan terprediksi

Hooks berada di jalur kritis loop agen, jadi hook yang lambat atau labil membuat seluruh sesi terasa lambat. Beberapa kebiasaan menjaganya tetap tidak mengganggu.

  • Jaga tetap cepat. Hook PostToolUse yang berjalan pada setiap suntingan sebaiknya selesai jauh di bawah satu detik, jadi targetkan berkas yang berubah, bukan build seluruh proyek.
  • Gagal dengan jelas. Ketika sebuah hook memblokir tindakan, cetak alasan singkat ke standard error agar model mendapat penjelasan yang berguna alih-alih kegagalan yang buram.
  • Versikan bersama repo. Commit hooks proyek di settings Anda agar seluruh tim mendapat guardrail yang sama, dan simpan yang pribadi di user settings Anda.

Hooks adalah cara Anda berhenti mengulang koreksi yang sama ke agen. Apa pun yang Anda dapati harus diminta setiap sesi, seperti format ini, jangan sentuh itu, atau jalankan tesnya sebelum berhenti, adalah kandidat untuk hook, dan begitu menjadi hook, ia terjadi entah model mengingatnya atau tidak. Mulailah dengan formatter dan gerbang tes, lalu tambahkan penjaga seiring Anda belajar di mana agen Anda tergelincir.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Apa itu hooks Claude Code?

Hooks Claude Code adalah perintah shell yang dijalankan runtime secara otomatis pada titik-titik tertentu dalam lifecycle agen, seperti sebelum atau sesudah sebuah tool dipanggil, atau saat sebuah tugas selesai. Hooks dikonfigurasi di settings.json alih-alih di prompt, jadi berjalan setiap saat terlepas dari keputusan model. Inilah mekanisme untuk jaminan yang mungkin dilupakan model.

Apa beda hooks dengan instruksi di prompt?

Instruksi prompt adalah saran yang mungkin diikuti model, mungkin juga tidak, dan pengaruhnya bergeser sepanjang sesi panjang. Hook adalah kode deterministik yang dijalankan runtime tanpa syarat, jadi aturan format atau keamanan yang ditegakkan hook terjadi pada setiap event yang cocok. Pakai prompt untuk panduan dan hooks untuk jaminan.

Apakah hook bisa memblokir panggilan tool di Claude Code?

Bisa. Hook PreToolUse berjalan sebelum tool yang cocok dieksekusi, dan jika keluar dengan status pemblokir maka panggilan tool ditolak dan alasannya diumpankan kembali ke model. Karena hook menerima seluruh input tool sebagai JSON, ia bisa mengizinkan perintah aman dan menolak yang berbahaya secara presisi, itulah sebabnya aturan keamanan berada di hooks.

Hook apa yang baik untuk disiapkan lebih dulu?

Mulailah dengan hook PostToolUse yang memformat berkas yang baru disunting, hook PreToolUse yang memblokir tulisan ke lockfile atau kode ter-generate, dan hook Stop yang menjalankan perintah tes cepat Anda sebagai gerbang mutu. Ketiganya menutup kesalahan agen yang paling umum dan hanya butuh beberapa baris settings.json masing-masing.

Apakah hooks Claude Code aman dijalankan?

Hooks berjalan dengan izin pengguna penuh Anda dan tanpa prompt konfirmasi, jadi skrip hook yang ceroboh adalah risiko nyata. Perlakukan skrip hook seperti kode produksi: beri tanda kutip pada variabel, hindari menyisipkan input tool mentah ke shell, dan uji tiap skrip dengan tangan sebelum mengaitkannya ke event yang sering terpicu. Mengommit hooks ke repo juga memungkinkan tim Anda meninjaunya.