938| `PostCompact` | Tidak | Menampilkan stderr hanya kepada pengguna |938| `PostCompact` | Tidak | Menampilkan stderr hanya kepada pengguna |
939| `PreModelSwitch` | Ya | Memblokir pergantian model dan menampilkan stderr kepada pengguna |939| `PreModelSwitch` | Ya | Memblokir pergantian model dan menampilkan stderr kepada pengguna |
940| `PostModelSwitch` | Tidak | Menampilkan stderr hanya kepada pengguna; model sudah berganti |940| `PostModelSwitch` | Tidak | Menampilkan stderr hanya kepada pengguna; model sudah berganti |
941| `Elicitation` | Ya | Menolak elicitation |941| `Elicitation` | Ya | Menolak permintaan, dan tidak ada dialog yang muncul |
942| `ElicitationResult` | Ya | Memblokir respons (tindakan menjadi decline) |942| `ElicitationResult` | Ya | Memblokir respons (tindakan menjadi decline) |
943| `WorktreeCreate` | Ya | Exit code bukan nol apa pun menyebabkan pembuatan worktree gagal |943| `WorktreeCreate` | Ya | Exit code bukan nol apa pun menyebabkan pembuatan worktree gagal |
944| `WorktreeRemove` | Ya | Exit code bukan nol apa pun menyebabkan penghapusan worktree gagal jika direktori masih ada setelahnya. Lihat [WorktreeRemove](#worktreeremove) untuk apa yang terjadi pada direktori |944| `WorktreeRemove` | Ya | Exit code bukan nol apa pun menyebabkan penghapusan worktree gagal jika direktori masih ada setelahnya. Lihat [WorktreeRemove](#worktreeremove) untuk apa yang terjadi pada direktori |
1095| PermissionDenied | `hookSpecificOutput` | `retry: true` memberi tahu model bahwa model boleh mencoba ulang panggilan tool yang ditolak; Claude Code mengabaikannya untuk [penolakan tanpa putusan](#permissiondenied-decision-control) |1095| PermissionDenied | `hookSpecificOutput` | `retry: true` memberi tahu model bahwa model boleh mencoba ulang panggilan tool yang ditolak; Claude Code mengabaikannya untuk [penolakan tanpa putusan](#permissiondenied-decision-control) |
1096| WorktreeCreate | pengembalian path | Hook perintah mencetak path di stdout; hook HTTP mengembalikan `hookSpecificOutput.worktreePath`. Kegagalan hook atau path yang tidak ada menggagalkan pembuatan |1096| WorktreeCreate | pengembalian path | Hook perintah mencetak path di stdout; hook HTTP mengembalikan `hookSpecificOutput.worktreePath`. Kegagalan hook atau path yang tidak ada menggagalkan pembuatan |
1097| WorktreeRemove | Exit code | Exit code bukan nol apa pun membuat penghapusan gagal jika direktori masih ada setelahnya. Output JSON dibuang |1097| WorktreeRemove | Exit code | Exit code bukan nol apa pun membuat penghapusan gagal jika direktori masih ada setelahnya. Output JSON dibuang |
1098| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (nilai field formulir untuk accept) |1098| Elicitation, ElicitationResult | `hookSpecificOutput` atau `decision` tingkat atas | `action` (accept/decline/cancel), `content` (nilai field formulir). `decision: "block"` juga [menolak](#other-ways-to-decline-an-elicitation) |
1099| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (override nilai field formulir) |
1100| MessageDisplay | `hookSpecificOutput` | `displayContent` menggantikan teks yang ditampilkan di layar. Hanya tampilan: transkrip dan apa yang dilihat Claude tetap mempertahankan teks asli |1099| MessageDisplay | `hookSpecificOutput` | `displayContent` menggantikan teks yang ditampilkan di layar. Hanya tampilan: transkrip dan apa yang dilihat Claude tetap mempertahankan teks asli |
1101| SessionStart, SubagentStart, PostModelSwitch | Hanya konteks | `hookSpecificOutput.additionalContext` menambahkan konteks untuk Claude. SessionStart juga menerima [`initialUserMessage`, `watchPaths`, `sessionTitle`, dan `reloadSkills`](#sessionstart-decision-control). Tidak ada pemblokiran atau kontrol keputusan |1100| SessionStart, SubagentStart, PostModelSwitch | Hanya konteks | `hookSpecificOutput.additionalContext` menambahkan konteks untuk Claude. SessionStart juga menerima [`initialUserMessage`, `watchPaths`, `sessionTitle`, dan `reloadSkills`](#sessionstart-decision-control). Tidak ada pemblokiran atau kontrol keputusan |
1102| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Tidak ada | Tidak ada kontrol keputusan. Digunakan untuk efek samping seperti logging atau pembersihan |1101| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Tidak ada | Tidak ada kontrol keputusan. Digunakan untuk efek samping seperti logging atau pembersihan |
1163 Event hook1162 Event hook
1164</h2>1163</h2>
1165 1164
1166Setiap event berkaitan dengan suatu titik dalam siklus hidup Claude Code tempat hook dapat berjalan. Bagian-bagian di bawah ini diurutkan sesuai siklus hidup tersebut: mulai dari penyiapan sesi, melalui agentic loop, hingga akhir sesi. Setiap bagian menjelaskan kapan event dipicu, matcher apa yang didukungnya, input JSON yang diterimanya, dan cara mengontrol perilaku melalui output.1165Setiap event berkaitan dengan suatu titik dalam siklus hidup Claude Code tempat hook dapat berjalan. Bagian-bagian di bawah ini diurutkan sesuai siklus hidup tersebut: dari penyiapan sesi melalui agentic loop hingga akhir sesi. Setiap bagian menjelaskan kapan event dipicu, matcher apa yang didukungnya, input JSON yang diterimanya, dan cara mengontrol perilaku melalui output.
1167 1166
1168<h3 id="sessionstart">1167<h3 id="sessionstart">
1169 SessionStart1168 SessionStart
1170</h3>1169</h3>
1171 1170
1172Berjalan ketika Claude Code memulai sesi baru atau melanjutkan sesi yang sudah ada. Berguna untuk memuat konteks pengembangan seperti issue yang ada atau perubahan terbaru pada codebase Anda, atau untuk menyiapkan environment variable. Untuk konteks statis yang tidak memerlukan skrip, gunakan [CLAUDE.md](/docs/id/memory) sebagai gantinya.1171Berjalan saat Claude Code memulai sesi baru atau melanjutkan sesi yang sudah ada. Berguna untuk memuat konteks pengembangan seperti issue yang ada atau perubahan terbaru pada codebase Anda, atau untuk menyiapkan environment variable. Untuk konteks statis yang tidak memerlukan skrip, gunakan [CLAUDE.md](/docs/id/memory) sebagai gantinya.
1173 1172
1174SessionStart berjalan pada setiap sesi, jadi jaga agar hook ini tetap cepat. Hanya hook `type: "command"` dan `type: "mcp_tool"` yang didukung. Lihat [Field hook tool MCP](#mcp-tool-hook-fields) untuk mengetahui kapan hook `mcp_tool` berjalan.1173SessionStart berjalan di setiap sesi, jadi jaga agar hook ini tetap cepat. Hanya hook `type: "command"` dan `type: "mcp_tool"` yang didukung. Lihat [field hook tool MCP](#mcp-tool-hook-fields) untuk mengetahui kapan hook `mcp_tool` berjalan.
1175 1174
1176Nilai matcher berkaitan dengan cara sesi dimulai:1175Nilai matcher berkaitan dengan cara sesi dimulai:
1177 1176
1183| `compact` | Compaction otomatis atau manual |1182| `compact` | Compaction otomatis atau manual |
1184| `fork` | Sesi baru yang di-fork dari sesi yang sudah ada: `--fork-session` dengan `--resume` atau `--continue`, salinan latar belakang `/fork`, `/branch`, atau percakapan yang Anda [pindahkan ke latar belakang](/docs/id/agent-view#from-inside-a-session) |1183| `fork` | Sesi baru yang di-fork dari sesi yang sudah ada: `--fork-session` dengan `--resume` atau `--continue`, salinan latar belakang `/fork`, `/branch`, atau percakapan yang Anda [pindahkan ke latar belakang](/docs/id/agent-view#from-inside-a-session) |
1185 1184
1186Sebelum v2.1.214, sesi hasil fork melaporkan source `"resume"`.1185Sebelum v2.1.214, sesi yang di-fork melaporkan source `"resume"`.
1187 1186
1188Ketika Anda memulai sesi interaktif, melanjutkan percakapan saat peluncuran dengan `--continue` atau `--resume`, atau menjalankan `/clear`, hook SessionStart berjalan di latar belakang. Anda dapat langsung mengetik, dan percakapan yang Anda lanjutkan muncul tanpa menunggu hook. Respons pertama Claude tetap menunggu hook selesai, sehingga konteksnya sampai ke Claude.1187Saat Anda memulai sesi interaktif, melanjutkan percakapan saat peluncuran dengan `--continue` atau `--resume`, atau menjalankan `/clear`, hook SessionStart berjalan di latar belakang. Anda dapat langsung mengetik, dan percakapan yang Anda lanjutkan muncul tanpa menunggu hook. Respons pertama Claude tetap menunggu hook selesai, sehingga konteksnya sampai ke Claude.
1189 1188
1190Ketika Anda berpindah percakapan dengan `/resume` di dalam sesi, perpindahan tersebut justru menunggu hook selesai. Jika Anda menjalankan `/clear` atau berpindah ke percakapan lain saat hook latar belakang masih berjalan, apa pun yang dikembalikannya tidak diterapkan ke sesi.1189Saat Anda berpindah percakapan dengan `/resume` di dalam sesi, perpindahan tersebut justru menunggu hook selesai. Jika Anda menjalankan `/clear` atau berpindah ke percakapan lain saat hook latar belakang masih berjalan, apa pun yang dikembalikannya tidak diterapkan ke sesi.
1191 1190
1192Penantian yang sama berlaku saat peluncuran, termasuk sesi yang dilanjutkan: prompt yang Anda kirim saat hook SessionStart masih berjalan tidak akan sampai ke Claude hingga hook tersebut selesai.1191Penantian yang sama berlaku saat peluncuran, termasuk sesi yang dilanjutkan: prompt yang Anda kirim saat hook SessionStart masih berjalan tidak sampai ke Claude hingga hook tersebut selesai.
1193 1192
1194Selama penantian mana pun, tekan `Esc` untuk mengambil kembali prompt ke input tanpa mengirimnya. Hook tetap berjalan.1193Selama salah satu penantian tersebut, tekan `Esc` untuk mengambil kembali prompt ke input tanpa mengirimnya. Hook tetap berjalan.
1195 1194
1196<h4 id="sessionstart-input">1195<h4 id="sessionstart-input">
1197 Input SessionStart1196 Input SessionStart
1202| Field | Deskripsi |1201| Field | Deskripsi |
1203| :- | :- |1202| :- | :- |
1204| `source` | Cara sesi dimulai: `"startup"` untuk sesi baru, `"resume"` untuk sesi yang dilanjutkan, `"clear"` setelah `/clear`, `"compact"` setelah compaction, atau `"fork"` untuk sesi baru yang di-fork dari sesi yang sudah ada |1203| `source` | Cara sesi dimulai: `"startup"` untuk sesi baru, `"resume"` untuk sesi yang dilanjutkan, `"clear"` setelah `/clear`, `"compact"` setelah compaction, atau `"fork"` untuk sesi baru yang di-fork dari sesi yang sudah ada |
1205| `model` | Pengidentifikasi model yang aktif. Field ini dapat dihilangkan, misalnya setelah `/clear` atau ketika sesi dipulihkan melalui pemulihan percakapan, jadi periksa keberadaan field sebelum membacanya |1204| `model` | Pengenal model yang aktif. Field ini dapat dihilangkan, misalnya setelah `/clear` atau saat sesi dipulihkan melalui pemulihan percakapan, jadi periksa keberadaan field sebelum membacanya |
1206| `agent_type` | Nama agent, ada ketika Anda memulai Claude Code dengan `claude --agent <name>` |1205| `agent_type` | Nama agent, ada saat Anda memulai Claude Code dengan `claude --agent <name>` |
1207| `session_title` | Judul kustom sesi, ada ketika judul tersebut diatur, misalnya dengan `--name`, `/rename`, output `sessionTitle` dari hook, atau `renameSession()` dari Agent SDK. Hook yang menghasilkan `sessionTitle` dapat memeriksa field ini terlebih dahulu untuk menghindari penimpaan judul kustom yang sudah ada |1206| `session_title` | Judul kustom sesi, ada saat judul tersebut ditetapkan, misalnya dengan `--name`, `/rename`, output `sessionTitle` dari hook, atau `renameSession()` dari Agent SDK. Hook yang mengeluarkan `sessionTitle` dapat memeriksa field ini terlebih dahulu agar tidak menimpa judul kustom yang sudah ada |
1208 1207
1209Sesi yang belum Anda beri nama tetap dapat memiliki [judul yang dihasilkan](/docs/id/sessions#name-your-sessions). Judul tersebut bukan judul kustom dan tidak muncul di `session_title`.1208Sesi yang belum Anda beri nama tetap dapat memiliki [judul yang dihasilkan](/docs/id/sessions#name-your-sessions). Judul tersebut bukan judul kustom dan tidak muncul di `session_title`.
1210 1209
1211Ketika `source` bernilai `"resume"` atau `"fork"` dan transkrip berisi setidaknya satu respons dari Claude, hook SessionStart juga menerima empat field di bawah ini. Hook Anda dapat menggunakannya untuk melaporkan biaya melanjutkan percakapan yang sudah lama sebelum permintaan pertama, misalnya dalam [`systemMessage`](#json-output). Field ini memerlukan Claude Code v2.1.251 atau yang lebih baru.1210Saat `source` bernilai `"resume"` atau `"fork"` dan transkrip berisi setidaknya satu respons dari Claude, hook SessionStart juga menerima empat field di bawah ini. Hook Anda dapat menggunakannya untuk melaporkan biaya melanjutkan percakapan yang sudah lama sebelum permintaan pertama, misalnya dalam [`systemMessage`](#json-output). Field ini memerlukan Claude Code v2.1.251 atau yang lebih baru.
1212 1211
1213| Field | Deskripsi |1212| Field | Deskripsi |
1214| :- | :- |1213| :- | :- |
1215| `seconds_since_last_response` | Detik waktu nyata sejak respons terakhir dalam transkrip yang dilanjutkan |1214| `seconds_since_last_response` | Detik waktu nyata sejak respons terakhir dalam transkrip yang dilanjutkan |
1216| `context_tokens` | Token yang dikirim ulang oleh permintaan pertama dari sesi yang dilanjutkan sebagai prompt-nya |1215| `context_tokens` | Token yang dikirim ulang oleh permintaan pertama sesi yang dilanjutkan sebagai prompt-nya |
1217| `prompt_cache_likely_expired` | `true` ketika respons terakhir lebih lama dari [masa berlaku prompt cache](/docs/id/prompt-caching#cache-lifetime) sesi atau compaction berikutnya telah menggantikan percakapan yang di-cache |1216| `prompt_cache_likely_expired` | `true` saat respons terakhir lebih lama daripada [masa berlaku prompt cache](/docs/id/prompt-caching#cache-lifetime) sesi atau compaction setelahnya menggantikan percakapan yang di-cache |
1218| `estimated_cache_write_usd` | Estimasi biaya dalam dolar AS untuk menulis `context_tokens` ke prompt cache pada model sesi, tidak termasuk respons |1217| `estimated_cache_write_usd` | Estimasi biaya dalam dolar AS untuk menulis `context_tokens` ke prompt cache pada model sesi, tidak termasuk respons |
1219 1218
1220Contoh ini menunjukkan input untuk sesi yang dilanjutkan 90 menit setelah respons terakhirnya:1219Contoh ini menunjukkan input untuk sesi yang dilanjutkan 90 menit setelah respons terakhirnya:
1242 1241
1243| Field | Deskripsi |1242| Field | Deskripsi |
1244| :- | :- |1243| :- | :- |
1245| `additionalContext` | String yang ditambahkan ke konteks Claude di awal percakapan, sebelum prompt pertama. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk cara teks dikirimkan dan apa yang perlu dimasukkan |1244| `additionalContext` | String yang ditambahkan ke konteks Claude di awal percakapan, sebelum prompt pertama. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk cara teks dikirimkan dan apa yang perlu dimasukkan ke dalamnya |
1246| `initialUserMessage` | String yang digunakan sebagai pesan pengguna pertama dalam sesi. Berlaku dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, tempat string ini menjadi giliran pertama meskipun tidak ada prompt yang diberikan. Jika prompt diberikan, prompt tersebut mengikuti sebagai giliran berikutnya. Tidak seperti `additionalContext`, yang dilampirkan ke giliran yang sudah ada, field ini membuat giliran |1245| `initialUserMessage` | String yang digunakan sebagai pesan pengguna pertama dalam sesi. Berlaku dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, tempat string ini menjadi giliran pertama bahkan jika tidak ada prompt yang diberikan. Jika prompt diberikan, prompt tersebut menyusul sebagai giliran berikutnya. Tidak seperti `additionalContext`, yang melekat pada giliran yang sudah ada, field ini membuat giliran tersebut |
1247| `sessionTitle` | Mengatur judul sesi, dengan efek yang sama seperti `/rename`. Gunakan untuk memberi nama sesi secara otomatis dari folder peluncuran, branch git, atau nama worktree. Berlaku ketika `source` bernilai `"startup"`, `"resume"`, atau `"fork"`; diabaikan pada `"clear"` dan `"compact"` |1246| `sessionTitle` | Menetapkan judul sesi, dengan efek yang sama seperti `/rename`. Gunakan untuk memberi nama sesi secara otomatis dari folder peluncuran, branch git, atau nama worktree. Berlaku saat `source` bernilai `"startup"`, `"resume"`, atau `"fork"`; diabaikan pada `"clear"` dan `"compact"` |
1248| `watchPaths` | Array path absolut yang dipantau untuk event [FileChanged](#filechanged) selama sesi ini |1247| `watchPaths` | Array path absolut yang dipantau untuk event [FileChanged](#filechanged) selama sesi ini |
1249| `reloadSkills` | Boolean. Ketika `true`, Claude Code memindai ulang direktori [skill](/docs/id/skills) dan perintah setelah hook SessionStart selesai, sehingga skill yang dipasang oleh hook tersedia dalam sesi yang sama, mulai dari prompt pertama |1248| `reloadSkills` | Boolean. Saat `true`, Claude Code memindai ulang direktori [skill](/docs/id/skills) dan perintah setelah hook SessionStart selesai, sehingga skill yang dipasang oleh hook tersedia dalam sesi yang sama, dimulai dari prompt pertama |
1250 1249
1251```json theme={null}1250```json theme={null}
1252{1251{
1258}1257}
1259```1258```
1260 1259
1261Karena stdout biasa sudah sampai ke Claude untuk event ini, hook yang hanya memuat konteks dapat mencetak langsung ke stdout tanpa membangun JSON. Gunakan bentuk JSON ketika Anda perlu menggabungkan konteks dengan field lain seperti `sessionTitle`.1260Karena stdout biasa sudah sampai ke Claude untuk event ini, hook yang hanya memuat konteks dapat langsung mencetak ke stdout tanpa membuat JSON. Gunakan bentuk JSON saat Anda perlu menggabungkan konteks dengan field lain seperti `sessionTitle`.
1262 1261
1263Gunakan `reloadSkills` ketika hook SessionStart memasang atau memperbarui skill. Penemuan skill biasanya berjalan sebelum hook SessionStart selesai, sehingga file yang ditulis hook ke `~/.claude/skills/` atau `.claude/skills/` sebaliknya hanya akan muncul di sesi berikutnya. Contoh ini menyinkronkan repositori skill bersama dan meminta pemindaian ulang:1262Gunakan `reloadSkills` saat hook SessionStart memasang atau memperbarui skill. Penemuan skill biasanya berjalan sebelum hook SessionStart selesai, sehingga file yang ditulis hook ke `~/.claude/skills/` atau `.claude/skills/` jika tidak demikian hanya akan muncul di sesi berikutnya. Contoh ini menyinkronkan repositori skill bersama dan meminta pemindaian ulang:
1264 1263
1265```bash theme={null}1264```bash theme={null}
1266#!/bin/bash1265#!/bin/bash
1271echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1270echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1272```1271```
1273 1272
1274URL repositori tersebut adalah placeholder; ganti dengan repositori skill Anda sendiri. Dengan placeholder tersebut, clone gagal dan mencetak pesan `fatal:` ke stderr. Stderr dari hook SessionStart yang keluar dengan 0 hanya bersifat informatif, sehingga permintaan `reloadSkills` tetap berlaku.1273URL repositori tersebut adalah placeholder; ganti dengan repositori skill Anda sendiri. Dengan placeholder tersebut, clone gagal dan mencetak pesan `fatal:` ke stderr. Stderr dari hook SessionStart yang keluar dengan 0 hanya bersifat informasional, sehingga permintaan `reloadSkills` tetap berlaku.
1275 1274
1276<h4 id="persist-environment-variables">1275<h4 id="persist-environment-variables">
1277 Mempertahankan environment variable1276 Mempertahankan environment variable
1279 1278
1280Hook SessionStart memiliki akses ke environment variable `CLAUDE_ENV_FILE`, yang menyediakan path file tempat Anda dapat mempertahankan environment variable untuk perintah Bash berikutnya.1279Hook SessionStart memiliki akses ke environment variable `CLAUDE_ENV_FILE`, yang menyediakan path file tempat Anda dapat mempertahankan environment variable untuk perintah Bash berikutnya.
1281 1280
1282Untuk mengatur environment variable satu per satu, tulis pernyataan `export` ke `CLAUDE_ENV_FILE`. Gunakan append (`>>`) untuk mempertahankan variabel yang diatur oleh hook lain:1281Untuk menetapkan environment variable satu per satu, tulis pernyataan `export` ke `CLAUDE_ENV_FILE`. Gunakan append (`>>`) untuk mempertahankan variabel yang ditetapkan oleh hook lain:
1283 1282
1284```bash theme={null}1283```bash theme={null}
1285#!/bin/bash1284#!/bin/bash
1320 Setup1319 Setup
1321</h3>1320</h3>
1322 1321
1323Hanya dipicu ketika Anda meluncurkan Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Event ini tidak dipicu pada startup normal. Gunakan untuk instalasi dependensi satu kali atau pembersihan terjadwal yang Anda picu secara eksplisit dari CI atau skrip, terpisah dari startup sesi normal. Untuk inisialisasi per sesi, gunakan [SessionStart](#sessionstart) sebagai gantinya.1322Hanya dipicu saat Anda meluncurkan Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Event ini tidak dipicu pada startup normal. Gunakan untuk pemasangan dependensi satu kali atau pembersihan terjadwal yang Anda picu secara eksplisit dari CI atau skrip, terpisah dari startup sesi normal. Untuk inisialisasi per sesi, gunakan [SessionStart](#sessionstart) sebagai gantinya.
1324 1323
1325Nilai matcher berkaitan dengan flag CLI yang memicu hook:1324Nilai matcher berkaitan dengan flag CLI yang memicu hook:
1326 1325
1329| `init` | `claude --init-only` atau `claude -p --init` |1328| `init` | `claude --init-only` atau `claude -p --init` |
1330| `maintenance` | `claude -p --maintenance` |1329| `maintenance` | `claude -p --maintenance` |
1331 1330
1332Ketika Anda menjalankan `claude --init-only`, Claude Code menjalankan hook Setup dan hook `SessionStart` dengan matcher `startup`, lalu keluar tanpa memulai percakapan.1331Saat Anda menjalankan `claude --init-only`, Claude Code menjalankan hook Setup dan hook `SessionStart` dengan matcher `startup`, lalu keluar tanpa memulai percakapan.
1333 1332
1334Ketika Anda memulai atau melanjutkan percakapan dengan `-p`, Anda juga perlu menyediakan prompt, sebagai argumen atau disalurkan melalui stdin. Anda dapat melewatkan prompt ketika hook `SessionStart` menyediakan [`initialUserMessage`](#sessionstart-decision-control) atau ketika Anda melanjutkan sesi dengan [panggilan tool yang ditangguhkan](#defer-a-tool-call-for-later).1333Saat Anda memulai atau melanjutkan percakapan dengan `-p`, Anda juga perlu memberikan prompt, sebagai argumen atau disalurkan melalui stdin. Anda dapat melewati prompt saat hook `SessionStart` memberikan [`initialUserMessage`](#sessionstart-decision-control) atau saat Anda melanjutkan sesi dengan [panggilan tool yang ditangguhkan](#defer-a-tool-call-for-later).
1335 1334
1336Jika berhasil, `--init-only` tidak mencetak apa pun ke terminal. Untuk memastikan hook telah berjalan, mulai dengan `claude --debug-file <path> --init-only`, ganti `<path>` dengan lokasi file log, lalu periksa log untuk entri hook Setup dan SessionStart.1335Jika berhasil, `--init-only` tidak mencetak apa pun ke terminal. Untuk memastikan hook berjalan, mulai dengan `claude --debug-file <path> --init-only`, ganti `<path>` dengan lokasi file log, lalu periksa log untuk entri hook Setup dan SessionStart.
1337 1336
1338Karena Setup tidak dipicu pada setiap peluncuran, plugin yang membutuhkan dependensi terpasang tidak dapat hanya mengandalkan Setup. Pola praktisnya adalah memeriksa dependensi saat penggunaan pertama dan memasangnya jika belum ada, misalnya hook atau skill yang memeriksa `${CLAUDE_PLUGIN_DATA}/node_modules` dan menjalankan `npm install` jika tidak ada. Lihat [direktori data persisten](/docs/id/plugins/components#path-variables-and-persistent-data) untuk lokasi penyimpanan dependensi yang dipasang. Jika Anda mendistribusikan plugin melalui marketplace, Anda mungkin tidak memerlukan pola ini: Claude Code [memasang dependensi paket Node.js yang memenuhi syarat secara otomatis](/docs/id/plugins/loading#node-js-package-dependencies) ketika menyimpan plugin ke cache.1337Karena Setup tidak dipicu di setiap peluncuran, plugin yang memerlukan dependensi terpasang tidak dapat hanya mengandalkan Setup. Pola praktisnya adalah memeriksa dependensi saat penggunaan pertama dan memasangnya jika tidak ada, misalnya hook atau skill yang memeriksa `${CLAUDE_PLUGIN_DATA}/node_modules` dan menjalankan `npm install` jika tidak ada. Lihat [direktori data persisten](/docs/id/plugins/components#path-variables-and-persistent-data) untuk lokasi penyimpanan dependensi yang terpasang. Jika Anda mendistribusikan plugin melalui marketplace, Anda mungkin tidak memerlukan pola ini: Claude Code [memasang dependensi paket Node.js yang memenuhi syarat secara otomatis](/docs/id/plugins/loading#node-js-package-dependencies) saat meng-cache plugin.
1339 1338
1340<h4 id="setup-input">1339<h4 id="setup-input">
1341 Input Setup1340 Input Setup
1357 Kontrol keputusan Setup1356 Kontrol keputusan Setup
1358</h4>1357</h4>
1359 1358
1360Hook Setup tidak dapat memblokir; eksekusi berlanjut pada exit code apa pun. Pada setiap exit code, Claude Code membuang [field output JSON](#json-output) dari hook Setup, seperti `systemMessage`, `continue`, dan `hookSpecificOutput.additionalContext`. Dengan `-p`, stdout, stderr, dan exit code dari hook Setup hanya muncul di output run sebagai [event `hook_response`](/docs/id/headless#read-session-metadata) ketika Anda meluncurkan dengan `--output-format stream-json --verbose`.1359Hook Setup tidak dapat memblokir; eksekusi berlanjut pada exit code apa pun. Pada setiap exit code, Claude Code membuang [field output JSON](#json-output) hook Setup, seperti `systemMessage`, `continue`, dan `hookSpecificOutput.additionalContext`. Dengan `-p`, stdout, stderr, dan exit code hook Setup muncul di output run hanya sebagai [event `hook_response`](/docs/id/headless#read-session-metadata) saat Anda meluncurkan dengan `--output-format stream-json --verbose`.
1361 1360
1362Hook Setup memiliki akses ke `CLAUDE_ENV_FILE`. Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya dalam sesi, seperti pada [hook SessionStart](#persist-environment-variables). Hanya hook `type: "command"` yang berjalan pada `Setup`. Hook `type: "mcp_tool"` pada `Setup` selalu dilewati, seperti dijelaskan di [field hook tool MCP](#mcp-tool-hook-fields).1361Hook Setup memiliki akses ke `CLAUDE_ENV_FILE`. Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya dalam sesi, seperti pada [hook SessionStart](#persist-environment-variables). Hanya hook `type: "command"` yang berjalan pada `Setup`. Hook `type: "mcp_tool"` pada `Setup` selalu dilewati, seperti dijelaskan di [field hook tool MCP](#mcp-tool-hook-fields).
1363 1362
1365 InstructionsLoaded1364 InstructionsLoaded
1366</h3>1365</h3>
1367 1366
1368Dipicu saat file `CLAUDE.md` atau `.claude/rules/*.md` dimuat ke dalam konteks. Event ini dipicu saat sesi dimulai untuk file yang dimuat secara eager dan dipicu lagi nanti saat file dimuat secara lazy, misalnya saat Claude mengakses subdirektori yang berisi `CLAUDE.md` bersarang atau saat aturan kondisional dengan frontmatter `paths:` cocok. Hook ini tidak mendukung pemblokiran atau kontrol keputusan. Hook ini berjalan secara asinkron untuk tujuan observabilitas.1367Dipicu saat file `CLAUDE.md` atau `.claude/rules/*.md` dimuat ke dalam konteks. Event ini dipicu saat awal sesi untuk file yang dimuat secara eager dan dipicu lagi nanti saat file dimuat secara lazy, misalnya saat Claude mengakses subdirektori yang berisi `CLAUDE.md` bersarang atau saat aturan kondisional dengan frontmatter `paths:` cocok. Hook ini tidak mendukung pemblokiran atau kontrol keputusan. Hook ini berjalan secara asinkron untuk keperluan observabilitas.
1369 1368
1370Event ini tidak dipicu ketika Claude [membaca `AGENTS.md` secara langsung](/docs/id/memory#agents-md) melalui pengaturan **Project instructions**. Event ini dipicu ketika `CLAUDE.md` mengimpor `AGENTS.md` Anda, dengan `load_reason` bernilai `include` seperti file impor lainnya, dan ketika `CLAUDE.md` adalah symlink ke file tersebut, sebagai pemuatan `CLAUDE.md` biasa.1369Event ini tidak dipicu saat Claude [membaca `AGENTS.md` secara langsung](/docs/id/memory#agents-md) melalui pengaturan **Project instructions**. Event ini tetap dipicu saat `CLAUDE.md` mengimpor `AGENTS.md` Anda, dengan `load_reason` bernilai `include` seperti file impor lainnya, dan saat `CLAUDE.md` adalah symlink ke file tersebut, sebagai pemuatan `CLAUDE.md` biasa.
1371 1370
1372Matcher dijalankan terhadap `load_reason`. Misalnya, gunakan `"matcher": "session_start"` untuk hanya memicu pada file yang dimuat saat sesi dimulai, atau `"matcher": "path_glob_match|nested_traversal"` untuk hanya memicu pada pemuatan lazy.1371Matcher dijalankan terhadap `load_reason`. Misalnya, gunakan `"matcher": "session_start"` agar hanya dipicu untuk file yang dimuat saat awal sesi, atau `"matcher": "path_glob_match|nested_traversal"` agar hanya dipicu untuk pemuatan lazy.
1373 1372
1374<h4 id="instructionsloaded-input">1373<h4 id="instructionsloaded-input">
1375 Input InstructionsLoaded1374 Input InstructionsLoaded
1381| :- | :- |1380| :- | :- |
1382| `file_path` | Path absolut ke file instruksi yang dimuat |1381| `file_path` | Path absolut ke file instruksi yang dimuat |
1383| `memory_type` | Cakupan file: `"User"`, `"Project"`, `"Local"`, atau `"Managed"` |1382| `memory_type` | Cakupan file: `"User"`, `"Project"`, `"Local"`, atau `"Managed"` |
1384| `load_reason` | Alasan file dimuat: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"`, atau `"compact"`. Nilai `"compact"` dipicu ketika file instruksi dimuat ulang setelah event compaction |1383| `load_reason` | Alasan file dimuat: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"`, atau `"compact"`. Nilai `"compact"` dipicu saat file instruksi dimuat ulang setelah event compaction |
1385| `globs` | Pola glob path dari frontmatter `paths:` file, jika ada. Hanya ada untuk pemuatan `path_glob_match` |1384| `globs` | Pola glob path dari frontmatter `paths:` file, jika ada. Hanya ada untuk pemuatan `path_glob_match` |
1386| `trigger_file_path` | Path ke file yang aksesnya memicu pemuatan ini, untuk pemuatan lazy |1385| `trigger_file_path` | Path ke file yang aksesnya memicu pemuatan ini, untuk pemuatan lazy |
1387| `parent_file_path` | Path ke file instruksi induk yang menyertakan file ini, untuk pemuatan `include` |1386| `parent_file_path` | Path ke file instruksi induk yang menyertakan file ini, untuk pemuatan `include` |
1402 Kontrol keputusan InstructionsLoaded1401 Kontrol keputusan InstructionsLoaded
1403</h4>1402</h4>
1404 1403
1405Hook InstructionsLoaded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir atau memodifikasi pemuatan instruksi. Claude Code membuang [field output JSON](#json-output)-nya, seperti `systemMessage` dan `continue`. Gunakan event ini untuk audit logging, pelacakan kepatuhan, atau observabilitas.1404Hook InstructionsLoaded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir atau memodifikasi pemuatan instruksi. Claude Code membuang [field output JSON](#json-output) hook ini, seperti `systemMessage` dan `continue`. Gunakan event ini untuk logging audit, pelacakan kepatuhan, atau observabilitas.
1406 1405
1407<h3 id="userpromptsubmit">1406<h3 id="userpromptsubmit">
1408 UserPromptSubmit1407 UserPromptSubmit
1409</h3>1408</h3>
1410 1409
1411Berjalan ketika prompt dikirimkan, sebelum Claude memprosesnya. Ini memungkinkan Anda1410Berjalan saat prompt dikirimkan, sebelum Claude memprosesnya. Ini memungkinkan Anda
1412menambahkan konteks tambahan berdasarkan prompt/percakapan, memvalidasi prompt, atau1411menambahkan konteks tambahan berdasarkan prompt/percakapan, memvalidasi prompt, atau
1413memblokir jenis prompt tertentu.1412memblokir jenis prompt tertentu.
1414 1413
1418* [Subagent latar belakang](/docs/id/sub-agents#run-subagents-in-foreground-or-background) yang melapor kembali ke sesi yang memulainya1417* [Subagent latar belakang](/docs/id/sub-agents#run-subagents-in-foreground-or-background) yang melapor kembali ke sesi yang memulainya
1419* [Pesan yang dikirim sesi lain](/docs/id/cross-session-messaging) ke percakapan utama Anda1418* [Pesan yang dikirim sesi lain](/docs/id/cross-session-messaging) ke percakapan utama Anda
1420 1419
1421Hook `UserPromptSubmit` memiliki timeout default 30 detik untuk jenis `command`, `http`, dan `mcp_tool`, lebih pendek daripada default 600 detik untuk jenis tersebut pada sebagian besar event lainnya. Karena hook ini berjalan sebelum setiap prompt dan memblokir pemrosesan model hingga selesai, hook yang macet akan menghentikan sesi. Jika hook Anda membutuhkan waktu lebih lama, atur field `timeout` dalam entri hook.1420Hook `UserPromptSubmit` memiliki timeout default 30 detik untuk jenis `command`, `http`, dan `mcp_tool`, lebih pendek daripada default 600 detik untuk jenis tersebut pada sebagian besar event lain. Karena hook ini berjalan sebelum setiap prompt dan memblokir pemrosesan model hingga selesai, hook yang macet akan menghentikan sesi. Jika hook Anda memerlukan waktu lebih lama, tetapkan field `timeout` dalam entri hook.
1422 1421
1423Selain hook perintah yang Anda jalankan dengan [`async: true`](#run-hooks-in-the-background), hook perintah, HTTP, atau tool MCP `UserPromptSubmit` yang mencapai timeout-nya akan dibatalkan dan output-nya, termasuk `additionalContext` apa pun, dibuang. Prompt tetap sampai ke Claude tanpa konteks tersebut. Transkrip menampilkan pemberitahuan yang menyebutkan nama hook, timeout yang terpicu, dan bahwa output telah dibuang.1422Selain hook perintah yang Anda jalankan dengan [`async: true`](#run-hooks-in-the-background), hook perintah, HTTP, atau tool MCP `UserPromptSubmit` yang mencapai timeout-nya dibatalkan dan output-nya, termasuk `additionalContext` apa pun, dibuang. Prompt tetap sampai ke Claude tanpa konteks tersebut. Transkrip menampilkan pemberitahuan yang menyebutkan nama hook, timeout yang dipicu, dan bahwa output telah dibuang.
1424 1423
1425[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `UserPromptSubmit` yang mencapai timeout-nya akan memblokir prompt dengan pesan yang menyebutkan nama hook dan timeout, karena callback di sana dapat bertindak sebagai gerbang kebijakan yang tidak boleh gagal dalam keadaan terbuka. Sesi tetap berlanjut. Sebelum v2.1.208, timeout callback pada event tersebut mengakhiri giliran dengan error eksekusi.1424[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `UserPromptSubmit` yang mencapai timeout-nya memblokir prompt dengan pesan yang menyebutkan nama hook dan timeout-nya, karena callback di sana dapat berfungsi sebagai gerbang kebijakan yang tidak boleh gagal dalam keadaan terbuka. Sesi tetap berlanjut. Sebelum v2.1.208, timeout callback pada event tersebut mengakhiri giliran dengan error eksekusi.
1426 1425
1427<h4 id="userpromptsubmit-input">1426<h4 id="userpromptsubmit-input">
1428 Input UserPromptSubmit1427 Input UserPromptSubmit
1429</h4>1428</h4>
1430 1429
1431Selain [field input umum](#common-input-fields), hook UserPromptSubmit menerima field `prompt` yang berisi teks yang dikirimkan. Konten tempelan yang diringkas menjadi placeholder `[Pasted text #N]` tiba dalam keadaan sudah diperluas di tempatnya. Dalam sesi di mana Claude Code [menandai teks tempelan untuk Claude](/docs/id/terminal-config#how-claude-treats-pasted-text), konten yang diperluas tersebut berada di antara baris `<pasted_content id="…">` dan baris `</pasted_content id="…">`, jadi perhitungkan baris-baris tersebut jika hook Anda mengurai prompt.1430Selain [field input umum](#common-input-fields), hook UserPromptSubmit menerima field `prompt` yang berisi teks yang dikirimkan. Konten tempelan yang diciutkan menjadi placeholder `[Pasted text #N]` tiba dalam keadaan diperluas di tempatnya. Dalam sesi tempat Claude Code [menandai teks tempelan untuk Claude](/docs/id/terminal-config#how-claude-treats-pasted-text), konten yang diperluas tersebut berada di antara baris `<pasted_content id="…">` dan baris `</pasted_content id="…">`, jadi perhitungkan baris-baris tersebut jika hook Anda mem-parse prompt.
1432 1431
1433Hook UserPromptSubmit juga menerima `session_title` ketika sesi memiliki judul kustom, dengan arti yang sama seperti [field `session_title` SessionStart](#sessionstart-input).1432Hook UserPromptSubmit juga menerima `session_title` saat sesi memiliki judul kustom, dengan makna yang sama seperti [field `session_title` SessionStart](#sessionstart-input).
1434 1433
1435```json theme={null}1434```json theme={null}
1436{1435{
1447 Kontrol keputusan UserPromptSubmit1446 Kontrol keputusan UserPromptSubmit
1448</h4>1447</h4>
1449 1448
1450Hook `UserPromptSubmit` dapat mengontrol apakah prompt yang dikirimkan diproses dan dapat menambahkan konteks. Semua [field output JSON](#json-output) tersedia.1449Hook `UserPromptSubmit` dapat mengontrol apakah prompt yang dikirimkan diproses dan menambahkan konteks. Semua [field output JSON](#json-output) tersedia.
1451 1450
1452Ada dua cara untuk menambahkan konteks ke percakapan pada exit code 0:1451Ada dua cara untuk menambahkan konteks ke percakapan pada exit code 0:
1453 1452
1454* **Stdout teks biasa**: Claude Code menambahkan stdout yang [diperlakukannya sebagai teks biasa](#exit-code-0) ke konteks Claude1453* **Stdout teks biasa**: Claude Code menambahkan stdout yang [diperlakukannya sebagai teks biasa](#exit-code-0) ke konteks Claude
1455* **JSON dengan `additionalContext`**: gunakan format JSON di bawah untuk kontrol lebih. Field `additionalContext` ditambahkan sebagai konteks1454* **JSON dengan `additionalContext`**: gunakan format JSON di bawah ini untuk kontrol yang lebih besar. Field `additionalContext` ditambahkan sebagai konteks
1456 1455
1457Tidak satu pun saluran tersebut menghasilkan entri transkrip yang terlihat. Stdout biasa dan nilai `additionalContext` masing-masing disisipkan sebagai system reminder yang diawali dengan nama hook; Claude membaca keduanya. Untuk memastikan pengiriman, periksa [log debug](#debug-hooks).1456Tidak satu pun saluran ini menghasilkan entri transkrip yang terlihat. Stdout biasa dan nilai `additionalContext` masing-masing disisipkan sebagai system reminder yang diawali dengan nama hook; Claude membaca keduanya. Untuk memastikan pengiriman, periksa [log debug](#debug-hooks).
1458 1457
1459Untuk memblokir prompt, kembalikan objek JSON dengan `decision` bernilai `"block"`:1458Untuk memblokir prompt, kembalikan objek JSON dengan `decision` bernilai `"block"`:
1460 1459
1461| Field | Deskripsi |1460| Field | Deskripsi |
1462| :- | :- |1461| :- | :- |
1463| `decision` | `"block"` menghentikan prompt sebelum sampai ke Claude. Hilangkan untuk mengizinkan prompt berlanjut |1462| `decision` | `"block"` menghentikan prompt sebelum sampai ke Claude. Hilangkan untuk membiarkan prompt berlanjut |
1464| `reason` | Ditampilkan kepada pengguna ketika `decision` bernilai `"block"`. Tidak ditambahkan ke konteks |1463| `reason` | Ditampilkan kepada pengguna saat `decision` bernilai `"block"`. Tidak ditambahkan ke konteks |
1465| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang dikirimkan. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |1464| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang dikirimkan. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
1466| `sessionTitle` | Mengatur judul sesi. Gunakan untuk memberi nama sesi secara otomatis berdasarkan konten prompt |1465| `sessionTitle` | Menetapkan judul sesi. Gunakan untuk memberi nama sesi secara otomatis berdasarkan konten prompt |
1467| `suppressOriginalPrompt` | Jika `true` ketika hook memblokir prompt, teks prompt tidak dimasukkan ke pesan blokir. Lihat [Apa yang ditinggalkan oleh prompt yang diblokir](#what-a-blocked-prompt-leaves-behind) |1466| `suppressOriginalPrompt` | Jika `true` saat hook memblokir prompt, teks prompt tidak dimasukkan ke pesan pemblokiran. Lihat [Apa yang ditinggalkan prompt yang diblokir](#what-a-blocked-prompt-leaves-behind) |
1468 1467
1469Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna, dan teks tersebut tidak ditambahkan ke konteks.1468Hook yang memblokir dengan keluar menggunakan 2 diarahkan dengan cara yang sama seperti `reason`: pesan pemblokiran menampilkan teks stderr kepada pengguna, dan teks tersebut tidak ditambahkan ke konteks.
1470 1469
1471```json theme={null}1470```json theme={null}
1472{1471{
1482```1481```
1483 1482
1484<h4 id="what-a-blocked-prompt-leaves-behind">1483<h4 id="what-a-blocked-prompt-leaves-behind">
1485 Apa yang ditinggalkan oleh prompt yang diblokir1484 Apa yang ditinggalkan prompt yang diblokir
1486</h4>1485</h4>
1487 1486
1488Prompt yang diblokir tidak pernah sampai ke Claude, tetapi teksnya tidak dihapus dari semua tempat. Secara default, pesan blokir yang ditampilkan kepada pengguna diakhiri dengan `Original prompt:` diikuti teks yang dikirimkan, dan Claude Code menulis pesan tersebut ke file transkrip sesi di disk. Untuk menghilangkan teks tersebut dari pesan, cetak JSON dengan `"suppressOriginalPrompt": true` di dalam `hookSpecificOutput`. Ini berfungsi baik saat hook memblokir dengan `decision: "block"` maupun dengan keluar dengan kode 2.1487Prompt yang diblokir tidak pernah sampai ke Claude, tetapi teksnya tidak dihapus di semua tempat. Secara default, pesan pemblokiran yang ditampilkan kepada pengguna diakhiri dengan `Original prompt:` diikuti teks yang dikirimkan, dan Claude Code menulis pesan tersebut ke file transkrip sesi di disk. Untuk menghilangkan teks dari pesan, cetak JSON dengan `"suppressOriginalPrompt": true` di dalam `hookSpecificOutput`. Ini berfungsi baik saat hook memblokir dengan `decision: "block"` maupun dengan keluar menggunakan 2.
1489 1488
1490`suppressOriginalPrompt` hanya mengubah pesan blokir. Teks yang dikirimkan masih dapat muncul di file lokal seperti transkrip sesi dan riwayat prompt Anda, sehingga hook yang memblokir bukanlah cara untuk menjaga rahasia agar tidak tersimpan di disk. Untuk membatasi atau menghapus file tersebut, lihat [Penyimpanan plaintext](/docs/id/claude-directory#plaintext-storage) dan [Menghapus data lokal](/docs/id/claude-directory#clear-local-data).1489`suppressOriginalPrompt` hanya mengubah pesan pemblokiran. Teks yang dikirimkan tetap dapat muncul di file lokal seperti transkrip sesi dan riwayat prompt Anda, jadi hook pemblokir bukan cara untuk mencegah rahasia tersimpan di disk. Untuk membatasi atau menghapus file tersebut, lihat [Penyimpanan plaintext](/docs/id/claude-directory#plaintext-storage) dan [Menghapus data lokal](/docs/id/claude-directory#clear-local-data).
1491 1490
1492<h3 id="userpromptexpansion">1491<h3 id="userpromptexpansion">
1493 UserPromptExpansion1492 UserPromptExpansion
1494</h3>1493</h3>
1495 1494
1496Berjalan ketika perintah yang diketik pengguna diperluas menjadi prompt sebelum sampai ke Claude. Gunakan ini untuk memblokir perintah tertentu agar tidak dipanggil secara langsung, menyisipkan konteks untuk skill tertentu, atau mencatat perintah mana yang dipanggil pengguna. Misalnya, hook yang cocok dengan `deploy` dapat memblokir `/deploy` kecuali ada file persetujuan, atau hook yang cocok dengan skill review dapat menambahkan daftar periksa review tim sebagai `additionalContext`.1495Berjalan saat perintah yang diketik pengguna diperluas menjadi prompt sebelum sampai ke Claude. Gunakan ini untuk memblokir perintah tertentu dari pemanggilan langsung, menyisipkan konteks untuk skill tertentu, atau mencatat perintah mana yang dipanggil pengguna. Misalnya, hook yang cocok dengan `deploy` dapat memblokir `/deploy` kecuali ada file persetujuan, atau hook yang cocok dengan skill review dapat menambahkan daftar periksa review tim sebagai `additionalContext`.
1497 1496
1498Event ini mencakup jalur yang tidak dicakup `PreToolUse`: hook `PreToolUse` yang cocok dengan tool `Skill` hanya dipicu ketika Claude memanggil tool tersebut, tetapi mengetik `/skillname` secara langsung melewati `PreToolUse`. `UserPromptExpansion` dipicu pada jalur langsung tersebut.1497Event ini mencakup jalur yang tidak dicakup `PreToolUse`: hook `PreToolUse` yang cocok dengan tool `Skill` hanya dipicu saat Claude memanggil tool tersebut, tetapi mengetik `/skillname` secara langsung melewati `PreToolUse`. `UserPromptExpansion` dipicu pada jalur langsung tersebut.
1499 1498
1500Mencocokkan pada `command_name`. Biarkan matcher kosong untuk memicu pada setiap perintah jenis prompt.1499Dicocokkan pada `command_name`. Biarkan matcher kosong agar dipicu pada setiap perintah berjenis prompt.
1501 1500
1502<h4 id="userpromptexpansion-input">1501<h4 id="userpromptexpansion-input">
1503 Input UserPromptExpansion1502 Input UserPromptExpansion
1528 1527
1529| Field | Deskripsi |1528| Field | Deskripsi |
1530| :- | :- |1529| :- | :- |
1531| `decision` | `"block"` mencegah perintah diperluas. Hilangkan untuk mengizinkannya berlanjut |1530| `decision` | `"block"` mencegah perintah diperluas. Hilangkan untuk membiarkannya berlanjut |
1532| `reason` | Ditampilkan kepada pengguna ketika `decision` bernilai `"block"` |1531| `reason` | Ditampilkan kepada pengguna saat `decision` bernilai `"block"` |
1533| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang diperluas. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |1532| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang diperluas. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
1534 1533
1535Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna.1534Hook yang memblokir dengan keluar menggunakan 2 diarahkan dengan cara yang sama seperti `reason`: pesan pemblokiran menampilkan teks stderr kepada pengguna.
1536 1535
1537```json theme={null}1536```json theme={null}
1538{1537{
1549 MessageDisplay1548 MessageDisplay
1550</h3>1549</h3>
1551 1550
1552Berjalan saat pesan asisten di-stream ke layar. Claude Code menampilkan pesan secara bertahap: setiap kali sekumpulan baris yang baru selesai siap untuk dirender, hook berjalan sekali dengan baris-baris tersebut dan Claude Code merender teks pengganti dari hook di tempatnya. Pesan panjang menghasilkan beberapa panggilan; pesan pendek mungkin hanya menghasilkan satu.1551Berjalan saat pesan asisten di-streaming ke layar. Claude Code menampilkan pesan secara bertahap: setiap kali sekelompok baris yang baru selesai siap dirender, hook berjalan sekali dengan baris-baris tersebut dan Claude Code merender teks pengganti dari hook di tempatnya. Pesan yang panjang menghasilkan beberapa panggilan; pesan yang pendek mungkin hanya menghasilkan satu.
1553 1552
1554Gunakan MessageDisplay untuk:1553Gunakan MessageDisplay untuk:
1555 1554
1556* menghapus markdown untuk tampilan minimal1555* menghapus markdown untuk tampilan minimal
1557* mengubah teks yang ditampilkan aplikasi Agent SDK kepada penggunanya1556* mentransformasi teks yang ditampilkan aplikasi Agent SDK kepada penggunanya
1558* menyamarkan kunci API atau hostname internal dari respons Claude1557* menyamarkan kunci API atau hostname internal dari respons Claude
1559 1558
1560Claude Code menahan setiap kumpulan hingga hook Anda kembali, jadi jaga agar hook tetap cepat. Jika hook gagal atau mengalami timeout, Claude Code menampilkan teks asli. Timeout default untuk event ini adalah 10 detik; jika hook Anda membutuhkan waktu lebih lama, atur field `timeout` dalam entri hook.1559Claude Code menahan setiap kelompok hingga hook Anda kembali, jadi jaga agar hook tetap cepat. Jika hook gagal atau mencapai timeout, Claude Code menampilkan teks asli. Timeout default untuk event ini adalah 10 detik; jika hook Anda memerlukan waktu lebih lama, tetapkan field `timeout` dalam entri hook.
1561 1560
1562MessageDisplay hanya untuk tampilan: teks pengganti hanya mengubah apa yang dirender di layar. Transkrip dan apa yang dilihat Claude tetap menggunakan teks asli, sehingga Claude tidak pernah melihat penggantinya, dan mode verbose menampilkan teks asli. Hook hanya menerima teks pesan asisten, sehingga hasil tool dan teks yang Anda ketik dirender tanpa perubahan.1561MessageDisplay hanya untuk tampilan: teks pengganti hanya mengubah apa yang dirender di layar. Transkrip dan apa yang dilihat Claude tetap menyimpan teks asli, sehingga Claude tidak pernah melihat penggantinya, dan mode verbose menampilkan teks asli. Hook hanya menerima teks pesan asisten, sehingga hasil tool dan teks yang Anda ketik dirender tanpa perubahan.
1563 1562
1564MessageDisplay tidak mendukung matcher dan dipicu untuk setiap pesan asisten yang men-stream teks; pesan tanpa teks, seperti respons yang hanya berisi panggilan tool, tidak memicunya.1563MessageDisplay tidak mendukung matcher dan dipicu untuk setiap pesan asisten yang men-streaming teks; pesan tanpa teks, seperti respons yang hanya berisi panggilan tool, tidak memicunya.
1565 1564
1566Dalam run non-interaktif, termasuk kueri Agent SDK dan `claude -p`, MessageDisplay berjalan sekali per pesan asisten, bukan sekali per kumpulan baris. Panggilan tunggal tersebut tiba setelah pesan selesai dan membawa seluruh teks pesan: `index` bernilai `0`, `final` bernilai `true`, dan `delta` berisi seluruh pesan. Hook yang mengumpulkan teks `delta` untuk setiap pesan menerima total teks yang sama di kedua mode.1565Dalam run non-interaktif, termasuk kueri Agent SDK dan `claude -p`, MessageDisplay berjalan sekali per pesan asisten, bukan sekali per kelompok baris. Panggilan tunggal tersebut tiba setelah pesan selesai dan membawa teks pesan lengkap: `index` bernilai `0`, `final` bernilai `true`, dan `delta` berisi seluruh pesan. Hook yang mengumpulkan teks `delta` untuk setiap pesan menerima total teks yang sama di kedua mode.
1567 1566
1568<h4 id="messagedisplay-input">1567<h4 id="messagedisplay-input">
1569 Input MessageDisplay1568 Input MessageDisplay
1570</h4>1569</h4>
1571 1570
1572Selain [field input umum](#common-input-fields), hook MessageDisplay menerima pengidentifikasi untuk giliran dan pesan, posisi panggilan ini di dalam pesan, dan teks baru dalam `delta`. Batas kumpulan bergantung pada cara teks di-stream, jadi gunakan `index` dan `final` untuk melacak kemajuan dalam pesan alih-alih mengharapkan baris dikelompokkan dengan cara tertentu.1571Selain [field input umum](#common-input-fields), hook MessageDisplay menerima pengenal untuk giliran dan pesan, posisi panggilan ini dalam pesan, dan teks baru di `delta`. Batas kelompok bergantung pada cara teks di-streaming, jadi gunakan `index` dan `final` untuk melacak kemajuan melalui pesan alih-alih mengharapkan baris dikelompokkan dengan cara tertentu.
1573 1572
1574| Field | Deskripsi |1573| Field | Deskripsi |
1575| :- | :- |1574| :- | :- |
1576| `turn_id` | UUID dari giliran saat ini |1575| `turn_id` | UUID giliran saat ini |
1577| `message_id` | UUID dari pesan asisten yang sedang ditampilkan. Stabil di setiap kumpulan dari pesan yang sama. Ini bukan id `msg_…` API, sehingga tidak dapat dikorelasikan dengan id pesan transkrip |1576| `message_id` | UUID pesan asisten yang sedang ditampilkan. Stabil di setiap kelompok dari pesan yang sama. Ini bukan id `msg_…` dari API, sehingga tidak dapat dikorelasikan dengan id pesan transkrip |
1578| `index` | Indeks berbasis nol dari kumpulan ini di dalam pesan |1577| `index` | Indeks berbasis nol dari kelompok ini dalam pesan |
1579| `final` | `true` pada kumpulan terakhir pesan. Setiap pesan memiliki tepat satu kumpulan final |1578| `final` | `true` pada kelompok terakhir pesan. Setiap pesan memiliki tepat satu kelompok final |
1580| `delta` | Baris-baris yang baru selesai sejak kumpulan sebelumnya, termasuk baris baru penutup. Selalu berupa baris utuh, kecuali kumpulan final yang dapat berakhir di tengah baris. Dalam run interaktif, delta kumpulan final kosong ketika pesan berakhir dengan baris baru, jadi perlakukan `final`, bukan delta yang tidak kosong, sebagai sinyal akhir pesan. Dalam run Agent SDK dan `claude -p`, panggilan tunggal membawa seluruh pesan |1579| `delta` | Baris yang baru selesai sejak kelompok sebelumnya, termasuk baris baru penutupnya. Selalu berupa baris utuh, kecuali kelompok final yang dapat berakhir di tengah baris. Dalam run interaktif, delta kelompok final kosong saat pesan berakhir dengan baris baru, jadi perlakukan `final`, bukan delta yang tidak kosong, sebagai sinyal akhir pesan. Dalam run Agent SDK dan `claude -p`, panggilan tunggal membawa seluruh pesan |
1581 1580
1582```json theme={null}1581```json theme={null}
1583{1582{
1603| :- | :- |1602| :- | :- |
1604| `displayContent` | Teks yang ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan teks asli |1603| `displayContent` | Teks yang ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan teks asli |
1605 1604
1606Hook MessageDisplay tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir pesan atau mengubah apa yang disimpan di transkrip atau dikirim ke Claude. Claude Code menindaklanjuti `displayContent` dari output JSON-nya dan membuang `systemMessage` dan `continue`.1605Hook MessageDisplay tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir pesan atau mengubah apa yang disimpan dalam transkrip atau dikirim ke Claude. Claude Code menindaklanjuti `displayContent` dari output JSON-nya dan membuang `systemMessage` serta `continue`.
1607 1606
1608Contoh ini menghapus format markdown dari respons Claude untuk tampilan teks biasa. Skrip membaca setiap kumpulan dari stdin, menghapus penanda tebal dan backtick kode inline dari `delta`, dan mengembalikan hasilnya sebagai `displayContent`.1607Contoh ini menghapus format markdown dari respons Claude untuk tampilan teks biasa. Skrip membaca setiap kelompok dari stdin, menghapus penanda tebal dan backtick kode inline dari `delta`, lalu mengembalikan hasilnya sebagai `displayContent`.
1609 1608
1610<Tabs>1609<Tabs>
1611 <Tab title="macOS/Linux">1610 <Tab title="macOS/Linux">
1612 Daftarkan hook perintah untuk event tersebut di file pengaturan Anda:1611 Daftarkan hook perintah untuk event ini di file pengaturan Anda:
1613 1612
1614 ```json theme={null}1613 ```json theme={null}
1615 {1614 {
1664 }1663 }
1665 ```1664 ```
1666 1665
1667 Flag `-NoProfile` melewati pemuatan profil PowerShell Anda agar hook dimulai dengan cepat, dan `-ExecutionPolicy Bypass` memungkinkan PowerShell menjalankan file skrip lokal.1666 Flag `-NoProfile` melewati pemuatan profil PowerShell Anda sehingga hook dimulai dengan cepat, dan `-ExecutionPolicy Bypass` memungkinkan PowerShell menjalankan file skrip lokal.
1668 1667
1669 Simpan skrip ini ke `.claude/hooks/plain-display.ps1` di proyek Anda:1668 Simpan skrip ini ke `.claude/hooks/plain-display.ps1` di proyek Anda:
1670 1669
1681 </Tab>1680 </Tab>
1682</Tabs>1681</Tabs>
1683 1682
1684Kumpulan tanpa markdown diteruskan tanpa perubahan. Jika skrip gagal, misalnya karena `jq` tidak ada, Claude Code menampilkan teks asli dan mencatat kegagalan hanya di [output debug](#debug-hooks), bukan di sesi.1683Kelompok tanpa markdown diteruskan tanpa perubahan. Jika skrip gagal, misalnya karena `jq` tidak ada, Claude Code menampilkan teks asli dan mencatat kegagalan hanya di [output debug](#debug-hooks), bukan di sesi.
1685 1684
1686<h3 id="pretooluse">1685<h3 id="pretooluse">
1687 PreToolUse1686 PreToolUse
1688</h3>1687</h3>
1689 1688
1690Berjalan setelah Claude membuat parameter tool dan sebelum memproses panggilan tool. Mencocokkan nama tool apa pun kecuali `EndConversation`: tool bawaan seperti `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion`, dan `ExitPlanMode`, serta [nama tool MCP](#match-mcp-tools) apa pun.1689Berjalan setelah Claude membuat parameter tool dan sebelum memproses panggilan tool. Dicocokkan pada nama tool apa pun kecuali `EndConversation`: tool bawaan seperti `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion`, dan `ExitPlanMode`, serta [nama tool MCP](#match-mcp-tools) apa pun.
1691 1690
1692Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged) alih-alih mencocokkan tool pengedit file berdasarkan nama. Tidak seperti PreToolUse, Claude Code menjalankan hook FileChanged setelah perubahan terjadi, dan hook tersebut tidak memiliki kontrol keputusan, sehingga tidak dapat memblokir penulisan.1691Untuk menjalankan hook saat file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged) alih-alih mencocokkan tool pengedit file berdasarkan nama. Tidak seperti PreToolUse, Claude Code menjalankan hook FileChanged setelah perubahan, dan hook tersebut tidak memiliki kontrol keputusan, sehingga tidak dapat memblokir penulisan.
1693 1692
1694<Warning>1693<Warning>
1695 PreToolUse hanya berjalan ketika Claude memanggil tool. File yang Anda [referensikan dengan `@` di prompt Anda](/docs/id/common-workflows#reference-files-and-directories) ditambahkan tanpa panggilan tool apa pun: Claude Code menyisipkan isinya saat membangun prompt, sehingga tidak ada hook PreToolUse yang dipicu untuk file tersebut, termasuk hook yang cocok dengan `Read`. Untuk memblokir path tertentu dari referensi `@`, gunakan [aturan deny `Read`](/docs/id/permissions#read-and-edit) sebagai gantinya.1694 PreToolUse hanya berjalan saat Claude memanggil tool. File yang Anda [referensikan dengan `@` dalam prompt](/docs/id/common-workflows#reference-files-and-directories) ditambahkan tanpa panggilan tool apa pun: Claude Code menyisipkan kontennya saat menyusun prompt, sehingga tidak ada hook PreToolUse yang dipicu untuk file tersebut, termasuk hook yang cocok dengan `Read`. Untuk memblokir path tertentu dari referensi `@`, gunakan [aturan deny `Read`](/docs/id/permissions#read-and-edit) sebagai gantinya.
1696 1695
1697 PreToolUse juga tidak dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).1696 PreToolUse juga tidak dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).
1698</Warning>1697</Warning>
1699 1698
1700Gunakan [kontrol keputusan PreToolUse](#pretooluse-decision-control) untuk mengizinkan, menolak, meminta konfirmasi, atau menangguhkan panggilan tool.1699Gunakan [kontrol keputusan PreToolUse](#pretooluse-decision-control) untuk mengizinkan, menolak, meminta konfirmasi, atau menangguhkan panggilan tool.
1701 1700
1702[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `PreToolUse` yang melebihi timeout-nya akan memblokir panggilan tool, dan Claude menerima hasil error yang menyebutkan timeout tersebut. Deny eksplisit yang dikembalikan oleh hook lain tetap diutamakan.1701[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `PreToolUse` yang melebihi timeout-nya memblokir panggilan tool, dan Claude menerima hasil error yang menyebutkan timeout tersebut. Penolakan eksplisit yang dikembalikan oleh hook lain tetap diutamakan.
1703 1702
1704<h4 id="pretooluse-input">1703<h4 id="pretooluse-input">
1705 Input PreToolUse1704 Input PreToolUse
1707 1706
1708Selain [field input umum](#common-input-fields), hook PreToolUse menerima `tool_name`, `tool_input`, dan `tool_use_id`.1707Selain [field input umum](#common-input-fields), hook PreToolUse menerima `tool_name`, `tool_input`, dan `tool_use_id`.
1709 1708
1710Untuk [tool MCP](#match-mcp-tools), input juga membawa `mcp_server`, sebuah objek dengan `name` server dan `source` yang menyatakan asal definisi server tersebut. Nilai `source` mencakup `plugin`, `sdk`, dan cakupan konfigurasi seperti `user` dan `project`. [`McpServerProvenance`](/docs/id/agent-sdk/typescript#mcpserverprovenance) dalam referensi Agent SDK mencantumkan semuanya dan menjelaskan cara menangani nilai yang tidak Anda kenali. Dasarkan keputusan kepercayaan pada `source`, bukan pada `name` atau prefiks nama tool `mcp__<server>__`. Field `mcp_server` memerlukan Claude Code v2.1.274 atau yang lebih baru.1709Untuk [tool MCP](#match-mcp-tools), input juga membawa `mcp_server`, sebuah objek dengan `name` server dan `source` yang menyatakan dari mana definisi server berasal. Nilai `source` mencakup `plugin`, `sdk`, dan cakupan konfigurasi seperti `user` dan `project`. [`McpServerProvenance`](/docs/id/agent-sdk/typescript#mcpserverprovenance) dalam referensi Agent SDK mencantumkan semuanya dan menjelaskan cara memperlakukan nilai yang tidak Anda kenali. Dasarkan keputusan kepercayaan pada `source`, bukan pada `name` atau prefiks nama tool `mcp__<server>__`. Field `mcp_server` memerlukan Claude Code v2.1.274 atau yang lebih baru.
1711 1710
1712Untuk tool file `Write`, `Edit`, dan `Read`, `tool_input.file_path` selalu absolut:1711Untuk tool file `Write`, `Edit`, dan `Read`, `tool_input.file_path` selalu absolut:
1713 1712
1714* Claude Code memperluas `~` dan path relatif sebelum hook berjalan, sehingga hook yang mencocokkan path tidak dapat dilewati melalui `~` atau penulisan relatif dari path yang sama1713* Claude Code memperluas `~` dan path relatif sebelum hook berjalan, sehingga hook yang mencocokkan path tidak dapat dilewati melalui `~` atau penulisan relatif dari path yang sama
1715* Di Windows, path tiba dengan pemisah backslash, bahkan ketika hook Anda berjalan di bawah Git Bash tempat `$PWD` terlihat seperti `/c/project`1714* Di Windows, path tiba dengan pemisah backslash, bahkan saat hook Anda berjalan di Git Bash tempat `$PWD` terlihat seperti `/c/project`
1716* Perbandingan yang ditulis dengan garis miring maju, seperti pemeriksaan `/src/`, tidak pernah cocok dengan path backslash, dan panggilan tool berlanjut seolah-olah hook tidak memiliki apa pun untuk diblokir1715* Perbandingan yang ditulis dengan garis miring maju, seperti pemeriksaan `/src/`, tidak pernah cocok dengan path backslash, dan panggilan tool berlanjut seolah-olah hook tidak memiliki apa pun untuk diblokir
1717* Normalisasikan pemisah sebelum membandingkan: `FILE_PATH="${FILE_PATH//\\//}"` di Bash, atau `file_path.replace("\\", "/")` di Python, lalu cocokkan segmen path seperti `/src/` alih-alih menjangkar dengan `^`, karena path bersifat absolut1716* Normalisasikan pemisah sebelum membandingkan: `FILE_PATH="${FILE_PATH//\\//}"` di Bash, atau `file_path.replace("\\", "/")` di Python, lalu cocokkan segmen path seperti `/src/` alih-alih menjangkar dengan `^`, karena path bersifat absolut
1718 1717
1744| :- | :- | :- | :- |1743| :- | :- | :- | :- |
1745| `command` | string | `"npm test"` | Perintah shell yang akan dijalankan |1744| `command` | string | `"npm test"` | Perintah shell yang akan dijalankan |
1746| `description` | string | `"Run test suite"` | Deskripsi opsional tentang apa yang dilakukan perintah |1745| `description` | string | `"Run test suite"` | Deskripsi opsional tentang apa yang dilakukan perintah |
1747| `timeout` | number | `120000` | Timeout opsional dalam milidetik. Nilai di atas [maksimum](/docs/id/tools-reference#bash-tool-behavior) dikurangi menjadi nilai maksimum alih-alih ditolak |1746| `timeout` | number | `120000` | Timeout opsional dalam milidetik. Nilai di atas [maksimum](/docs/id/tools-reference#bash-tool-behavior) dikurangi menjadi maksimum alih-alih ditolak |
1748| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |1747| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |
1749 1748
1750Ketika perintah Bash mengubah file di repositori Git, Claude Code dapat merekam apa yang berubah. Claude Code merekam perubahan di setiap mode izin ketika pengaturan [`bashEditDiffEnabled`](/docs/id/settings-reference#basheditdiffenabled) mengaktifkan perekaman; entri pengaturan tersebut menyebutkan file mana yang dapat mengaturnya. Jika tidak, perubahan hanya direkam dalam auto mode dan mode `bypassPermissions`, dan hanya ketika Claude Code mengarahkan Claude untuk mengedit file melalui Bash. Atur `bashEditDiffEnabled` ke `false` untuk mematikan perekaman. Perintah latar belakang dan perintah read-only tidak membawa diff.1749Saat perintah Bash mengubah file dalam repositori Git, Claude Code dapat merekam apa yang berubah. Claude Code merekam perubahan di setiap mode izin saat pengaturan [`bashEditDiffEnabled`](/docs/id/settings-reference#basheditdiffenabled) mengaktifkan perekaman; entri pengaturan tersebut menjelaskan file mana yang dapat menetapkannya. Jika tidak, Claude Code merekamnya hanya dalam auto mode dan mode `bypassPermissions`, dan hanya saat Claude Code mengarahkan Claude untuk mengedit file melalui Bash. Tetapkan `bashEditDiffEnabled` ke `false` untuk mematikan perekaman. Perintah latar belakang dan perintah read-only tidak membawa diff.
1751 1750
1752[Hook PostToolUse](#posttooluse) Anda kemudian menerima file yang berubah di `tool_response.bashEditDiff`. Daftar tersebut mencakup apa yang berubah di bawah repositori selama perintah berjalan. File yang diabaikan Git dan file di submodule tidak dicantumkan. Memerlukan Claude Code v2.1.269 atau yang lebih baru.1751[Hook PostToolUse](#posttooluse) Anda kemudian menerima file yang berubah di `tool_response.bashEditDiff`. Daftar tersebut mencakup apa yang berubah di bawah repositori saat perintah berjalan. File yang diabaikan Git dan file di submodule tidak dicantumkan. Memerlukan Claude Code v2.1.269 atau yang lebih baru.
1753 1752
1754<Note>1753<Note>
1755 Daftar ini bersifat upaya terbaik dan dalam beta publik. Claude Code dapat melewatkan perubahan, menyertakan file yang diubah oleh proses lain pada saat yang sama, atau berhenti pada batas ukurannya. Bentuk field dapat berubah. Gunakan daftar ini untuk menemukan apa yang perlu ditinjau, bukan untuk menegakkan kebijakan.1754 Daftar ini bersifat best effort dan dalam beta publik. Claude Code dapat melewatkan perubahan, menyertakan file yang diubah proses lain pada saat yang sama, atau berhenti pada batas ukurannya. Bentuk field dapat berubah. Gunakan daftar ini untuk menemukan apa yang perlu ditinjau, bukan untuk menegakkan kebijakan.
1756</Note>1755</Note>
1757 1756
1758`changedFiles` dan `files` mencantumkan apa yang diubah perintah; field lainnya menyatakan seberapa lengkap dan seberapa andal daftar tersebut.1757`changedFiles` dan `files` mencantumkan apa yang diubah perintah; field lainnya menyatakan seberapa lengkap dan seberapa andal daftar tersebut.
1759 1758
1760| Field | Tipe | Contoh | Deskripsi |1759| Field | Tipe | Contoh | Deskripsi |
1761| :- | :- | :- | :- |1760| :- | :- | :- | :- |
1762| `changedFiles` | array | `["/path/to/src/app.ts"]` | Path absolut dari file yang diubah perintah, paling banyak 200. Ada setiap kali `files` berisi diff atau `moreFiles` lebih dari nol |1761| `changedFiles` | array | `["/path/to/src/app.ts"]` | Path absolut file yang diubah perintah, paling banyak 200. Ada setiap kali `files` berisi diff atau `moreFiles` di atas nol |
1763| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff dari hingga 5 file yang berubah, untuk ditampilkan. `created` atau `deleted` bernilai `true` untuk file yang ditambahkan atau dihapus perintah |1762| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff hingga 5 file yang berubah, untuk ditampilkan. `created` atau `deleted` bernilai `true` untuk file yang ditambahkan atau dihapus oleh perintah |
1764| `moreFiles` | number | `2` | Jumlah file yang berubah tanpa diff di `files` |1763| `moreFiles` | number | `2` | Jumlah file yang berubah tanpa diff di `files` |
1765| `unavailable` | boolean | `true` | Diatur ketika diff tidak lengkap atau tidak dapat diambil |1764| `unavailable` | boolean | `true` | Ditetapkan saat diff tidak lengkap atau tidak dapat diambil |
1766| `skipped` | boolean | `true` | Diatur untuk perintah Git yang memindahkan working tree, seperti `git checkout` atau `git stash`, sehingga Claude Code tidak mengambil diff |1765| `skipped` | boolean | `true` | Ditetapkan untuk perintah Git yang memindahkan working tree, seperti `git checkout` atau `git stash`, sehingga Claude Code tidak mengambil diff |
1767| `shared` | boolean | `true` | Diatur ketika panggilan tool Bash lain, seperti milik subagent, berjalan di repositori yang sama pada saat yang sama, sehingga beberapa perubahan yang tercantum mungkin berasal dari perintah tersebut |1766| `shared` | boolean | `true` | Ditetapkan saat panggilan tool Bash lain, seperti milik subagent, berjalan di repositori yang sama pada saat yang sama, sehingga beberapa perubahan yang dicantumkan mungkin berasal dari perintah tersebut |
1768 1767
1769<a id="powershell" />1768<a id="powershell" />
1770 1769
1783| `timeout` | number | `120000` | Timeout opsional dalam milidetik |1782| `timeout` | number | `120000` | Timeout opsional dalam milidetik |
1784| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |1783| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |
1785 1784
1786Cocokkan `Bash|PowerShell` dalam hook yang memeriksa perintah shell, agar mencakup kedua tool:1785Cocokkan `Bash|PowerShell` dalam hook yang memeriksa perintah shell, sehingga hook tersebut mencakup kedua tool:
1787 1786
1788* Di Windows, di mana pun tool PowerShell diaktifkan, Claude memperlakukan PowerShell sebagai shell utama dan mengarahkan perintah shell melaluinya.1787* Di Windows, di mana pun tool PowerShell diaktifkan, Claude memperlakukan PowerShell sebagai shell utama dan mengarahkan perintah shell melaluinya.
1789* Di Windows tanpa Git Bash, tool ini diaktifkan secara otomatis dan Claude Code sama sekali tidak mendaftarkan tool Bash.1788* Di Windows tanpa Git Bash, tool ini diaktifkan secara otomatis dan Claude Code sama sekali tidak mendaftarkan tool Bash.
1834| Field | Tipe | Contoh | Deskripsi |1833| Field | Tipe | Contoh | Deskripsi |
1835| :- | :- | :- | :- |1834| :- | :- | :- | :- |
1836| `pattern` | string | `"**/*.ts"` | Pola glob untuk mencocokkan file |1835| `pattern` | string | `"**/*.ts"` | Pola glob untuk mencocokkan file |
1837| `path` | string | `"/path/to/dir"` | Direktori opsional untuk pencarian. Default-nya adalah direktori kerja saat ini |1836| `path` | string | `"/path/to/dir"` | Direktori opsional tempat pencarian. Default-nya adalah direktori kerja saat ini |
1838 1837
1839<h5 id="grep">1838<h5 id="grep">
1840 Grep1839 Grep
1841</h5>1840</h5>
1842 1841
1843Mencari konten file dengan regular expression.1842Mencari konten file dengan ekspresi reguler.
1844 1843
1845| Field | Tipe | Contoh | Deskripsi |1844| Field | Tipe | Contoh | Deskripsi |
1846| :- | :- | :- | :- |1845| :- | :- | :- | :- |
1847| `pattern` | string | `"TODO.*fix"` | Pola regular expression yang akan dicari |1846| `pattern` | string | `"TODO.*fix"` | Pola ekspresi reguler yang akan dicari |
1848| `path` | string | `"/path/to/dir"` | File atau direktori opsional untuk pencarian |1847| `path` | string | `"/path/to/dir"` | File atau direktori opsional tempat pencarian |
1849| `glob` | string | `"*.ts"` | Pola glob opsional untuk memfilter file |1848| `glob` | string | `"*.ts"` | Pola glob opsional untuk memfilter file |
1850| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"`, atau `"count"`. Default-nya adalah `"files_with_matches"` |1849| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"`, atau `"count"`. Default-nya adalah `"files_with_matches"` |
1851| `-i` | boolean | `true` | Pencarian tidak peka huruf besar-kecil |1850| `-i` | boolean | `true` | Pencarian tanpa membedakan huruf besar/kecil |
1852| `multiline` | boolean | `false` | Mengaktifkan pencocokan multibaris |1851| `multiline` | boolean | `false` | Mengaktifkan pencocokan multibaris |
1853 1852
1854<h5 id="webfetch">1853<h5 id="webfetch">
1859 1858
1860| Field | Tipe | Contoh | Deskripsi |1859| Field | Tipe | Contoh | Deskripsi |
1861| :- | :- | :- | :- |1860| :- | :- | :- | :- |
1862| `url` | string | `"https://example.com/api"` | URL untuk mengambil konten |1861| `url` | string | `"https://example.com/api"` | URL tempat konten diambil |
1863| `prompt` | string | `"Extract the API endpoints"` | Prompt yang dijalankan pada konten yang diambil |1862| `prompt` | string | `"Extract the API endpoints"` | Prompt yang dijalankan pada konten yang diambil |
1864 1863
1865<h5 id="websearch">1864<h5 id="websearch">
1887| `subagent_type` | string | `"Explore"` | Jenis agent khusus yang akan digunakan |1886| `subagent_type` | string | `"Explore"` | Jenis agent khusus yang akan digunakan |
1888| `model` | string | `"sonnet"` | Alias model opsional untuk menimpa default |1887| `model` | string | `"sonnet"` | Alias model opsional untuk menimpa default |
1889 1888
1890Ketika panggilan Agent latar depan selesai, [hook PostToolUse](#posttooluse) Anda menerima hasil subagent dan telemetri run di `tool_response`. Baca field ini untuk memeriksa run; untuk rekapitulasi token dan biaya di seluruh subagent, gunakan [penghitung token dan biaya](/docs/id/monitoring-usage#token-counter) yang difilter ke `query_source` `"subagent"`, karena `totalTokens` dan `usage` hanya mencakup permintaan terakhir:1889Saat panggilan Agent di latar depan selesai, [hook PostToolUse](#posttooluse) Anda menerima hasil subagent dan telemetri run di `tool_response`. Baca field ini untuk memeriksa run; untuk rekapitulasi token dan biaya di seluruh subagent, gunakan [penghitung token dan biaya](/docs/id/monitoring-usage#token-counter) yang difilter ke `query_source` `"subagent"`, karena `totalTokens` dan `usage` hanya mencakup permintaan terakhir:
1891 1890
1892| Field | Tipe | Contoh | Deskripsi |1891| Field | Tipe | Contoh | Deskripsi |
1893| :- | :- | :- | :- |1892| :- | :- | :- | :- |
1894| `status` | string | `"completed"` | `"completed"` untuk subagent latar depan, `"async_launched"` untuk subagent latar belakang. Subagent berjalan di latar belakang secara default, sehingga panggilan Agent yang menghilangkan `run_in_background` juga menghasilkan `"async_launched"` |1893| `status` | string | `"completed"` | `"completed"` untuk subagent latar depan, `"async_launched"` untuk subagent latar belakang. Subagent berjalan di latar belakang secara default, sehingga panggilan Agent yang menghilangkan `run_in_background` juga menghasilkan `"async_launched"` |
1895| `agentId` | string | `"a4d2c8f1e0b3a297"` | Pengidentifikasi untuk run subagent |1894| `agentId` | string | `"a4d2c8f1e0b3a297"` | Pengenal untuk run subagent |
1896| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Blok teks terakhir subagent, atau, untuk subagent yang laporannya melalui `SubagentHandback`, catatan singkat tentang penyerahan tersebut sebagai penggantinya |1895| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Blok teks akhir subagent, atau, untuk subagent yang laporannya melalui `SubagentHandback`, catatan singkat tentang penyerahan tersebut sebagai gantinya |
1897| `resolvedModel` | string | `"claude-sonnet-4-5"` | Model tempat subagent dimulai, yang mungkin berbeda dari model yang diminta |1896| `resolvedModel` | string | `"claude-sonnet-4-5"` | Model tempat subagent dimulai, yang mungkin berbeda dari model yang diminta |
1898| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Model yang digunakan secara berurutan, dengan pengulangan berturut-turut diciutkan; hanya diatur ketika model diganti di tengah run. Memerlukan Claude Code v2.1.212 atau yang lebih baru |1897| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Model yang digunakan secara berurutan, dengan pengulangan berturut-turut diciutkan; hanya ditetapkan saat model ditukar di tengah run. Memerlukan Claude Code v2.1.212 atau yang lebih baru |
1899| `totalTokens` | number | `12450` | Jumlah token dari permintaan API terakhir subagent: token input, output, dan cache digabungkan. Ini bukan total di seluruh run |1898| `totalTokens` | number | `12450` | Jumlah token dari permintaan API terakhir subagent: token input, output, dan cache digabungkan. Ini bukan total di seluruh run |
1900| `totalDurationMs` | number | `48211` | Durasi waktu nyata dari run subagent |1899| `totalDurationMs` | number | `48211` | Durasi waktu nyata run subagent |
1901| `totalToolUseCount` | number | `7` | Jumlah panggilan tool yang dilakukan subagent |1900| `totalToolUseCount` | number | `7` | Jumlah panggilan tool yang dilakukan subagent |
1902| `usage` | object | `{"input_tokens": 8320, ...}` | Rincian token per jenis dari permintaan API terakhir: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1901| `usage` | object | `{"input_tokens": 8320, ...}` | Rincian token per jenis dari permintaan API terakhir: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1903 1902
1904Pada Claude Code v2.1.271 atau yang lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference), yang disediakan Claude Code dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), mengirimkan laporannya melalui tool tersebut alih-alih mengembalikannya sebagai teks. Field `content` dari hasil `completed`-nya kemudian membawa catatan singkat tentang penyerahan tersebut, bukan laporan itu sendiri. Untuk membaca laporan, cocokkan hook `PreToolUse` atau `PostToolUse` pada `SubagentHandback` dan baca `tool_input.message`.1903Pada Claude Code v2.1.271 atau yang lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference), yang disediakan Claude Code dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), mengirimkan laporannya melalui tool tersebut alih-alih mengembalikannya sebagai teks. Field `content` dari hasil `completed`-nya kemudian membawa catatan singkat tentang penyerahan tersebut, bukan laporan itu sendiri. Untuk membaca laporan, cocokkan hook `PreToolUse` atau `PostToolUse` pada `SubagentHandback` dan baca `tool_input.message`.
1905 1904
1906Untuk subagent latar belakang, tool kembali ketika tugas berpindah ke latar belakang, sehingga `tool_response` tidak membawa field penggunaan: peluncuran latar belakang kembali segera, dan tugas latar depan yang dipindahkan Claude Code ke latar belakang di tengah run kembali pada transisi tersebut. Field-nya adalah `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile`, dan `resolvedModel`.1905Untuk subagent latar belakang, tool kembali saat tugas berpindah ke latar belakang, sehingga `tool_response` tidak membawa field penggunaan: peluncuran latar belakang langsung kembali, dan tugas latar depan yang dipindahkan Claude Code ke latar belakang di tengah run kembali pada transisi tersebut. Respons ini memiliki `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile`, dan `resolvedModel`.
1907 1906
1908Pada respons `completed`, `resolvedModel` menyebutkan model tempat subagent dimulai, yang dapat berbeda dari nilai `model` di `tool_input`, seperti ketika `availableModels` atau override lain berlaku. Pada respons `async_launched`, `resolvedModel` menyebutkan model yang digunakan ketika agent berpindah ke latar belakang, sehingga penggantian yang terjadi sebelum pemindahan ke latar belakang tercermin di sana. `modelsUsed` dan perilaku `resolvedModel` saat pemindahan ke latar belakang memerlukan Claude Code v2.1.212 atau yang lebih baru.1907Pada respons `completed`, `resolvedModel` menyebutkan model tempat subagent dimulai, yang dapat berbeda dari nilai `model` di `tool_input`, seperti saat `availableModels` atau override lain berlaku. Pada respons `async_launched`, `resolvedModel` menyebutkan model yang digunakan saat agent berpindah ke latar belakang, sehingga penukaran yang terjadi sebelum dipindahkan ke latar belakang tercermin di sana. `modelsUsed` dan perilaku `resolvedModel` pada saat pemindahan ke latar belakang memerlukan Claude Code v2.1.212 atau yang lebih baru.
1909 1908
1910<a id="askuserquestion" />1909<a id="askuserquestion" />
1911 1910
1918| Field | Tipe | Contoh | Deskripsi |1917| Field | Tipe | Contoh | Deskripsi |
1919| :- | :- | :- | :- |1918| :- | :- | :- | :- |
1920| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Pertanyaan yang akan disajikan, masing-masing dengan string `question`, `header` singkat, array `options`, dan flag `multiSelect` opsional |1919| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Pertanyaan yang akan disajikan, masing-masing dengan string `question`, `header` singkat, array `options`, dan flag `multiSelect` opsional |
1921| `answers` | object | `{"Which framework?": "React"}` | Opsional. Memetakan teks pertanyaan ke label opsi yang dipilih. Jawaban multi-pilihan menggabungkan label dengan koma. Claude tidak mengatur field ini; berikan melalui `updatedInput` untuk menjawab secara terprogram |1920| `answers` | object | `{"Which framework?": "React"}` | Opsional. Memetakan teks pertanyaan ke label opsi yang dipilih. Jawaban multi-pilihan menggabungkan label dengan koma. Claude tidak menetapkan field ini; berikan melalui `updatedInput` untuk menjawab secara terprogram |
1922 1921
1923<h5 id="exitplanmode">1922<h5 id="exitplanmode">
1924 ExitPlanMode1923 ExitPlanMode
1932| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Path ke file rencana. Disisipkan |1931| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Path ke file rencana. Disisipkan |
1933| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Deprecated. Claude Code menerima field ini tetapi mengabaikannya. Sebelum v2.1.205, field ini membawa izin berbasis prompt yang diminta Claude untuk mengimplementasikan rencana |1932| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Deprecated. Claude Code menerima field ini tetapi mengabaikannya. Sebelum v2.1.205, field ini membawa izin berbasis prompt yang diminta Claude untuk mengimplementasikan rencana |
1934 1933
1935Dalam `PostToolUse`, `tool_response` adalah objek dengan field `plan` dan `filePath` yang berisi rencana yang disetujui, ditambah flag status internal. Baca `tool_response.plan` untuk konten rencana alih-alih membaca ulang file dari disk.1934Di `PostToolUse`, `tool_response` adalah objek dengan field `plan` dan `filePath` yang berisi rencana yang disetujui, ditambah flag status internal. Baca `tool_response.plan` untuk konten rencana alih-alih membaca ulang file dari disk.
1936 1935
1937<h4 id="pretooluse-decision-control">1936<h4 id="pretooluse-decision-control">
1938 Kontrol keputusan PreToolUse1937 Kontrol keputusan PreToolUse
1942 1941
1943| Field | Deskripsi |1942| Field | Deskripsi |
1944| :- | :- |1943| :- | :- |
1945| `permissionDecision` | `"allow"` melewati permintaan izin, kecuali untuk [tindakan yang tidak disetujui otomatis oleh mode apa pun](/docs/id/permission-modes#actions-no-mode-auto-approves) dan untuk `AskUserQuestion` dan `ExitPlanMode`, yang memerlukan [`updatedInput` yang dipasangkan dengannya](#allow-with-updatedinput). `"deny"` mencegah panggilan tool. `"ask"` meminta pengguna untuk mengonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi terlepas dari apa yang dikembalikan hook |1944| `permissionDecision` | `"allow"` melewati permintaan izin, kecuali untuk [tindakan yang tidak disetujui otomatis oleh mode apa pun](/docs/id/permission-modes#actions-no-mode-auto-approves) dan untuk `AskUserQuestion` serta `ExitPlanMode`, yang memerlukan [`updatedInput` yang dipasangkan dengannya](#allow-with-updatedinput). `"deny"` mencegah panggilan tool. `"ask"` meminta pengguna untuk mengonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi apa pun yang dikembalikan hook |
1946| `permissionDecisionReason` | Untuk `"ask"`, ditampilkan kepada pengguna dalam permintaan izin. Ketika Claude Code [menolak panggilan](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) dalam run `-p` tempat tidak ada yang dapat menjawab permintaan tersebut, Claude membaca alasannya di hasil tool sebagai gantinya. Untuk `"deny"`, ditampilkan kepada Claude. Untuk `"allow"` dan `"defer"`, hanya ditulis ke [log debug](#debug-hooks) |1945| `permissionDecisionReason` | Untuk `"ask"`, ditampilkan kepada pengguna dalam permintaan izin. Saat Claude Code [menolak panggilan](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) dalam run `-p` tempat tidak ada yang dapat menjawab permintaan tersebut, Claude membaca alasan tersebut di hasil tool sebagai gantinya. Untuk `"deny"`, ditampilkan kepada Claude. Untuk `"allow"` dan `"defer"`, hanya ditulis ke [log debug](#debug-hooks) |
1947| `updatedInput` | Memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan field yang tidak berubah bersama field yang dimodifikasi. Claude Code mengevaluasi aturan izin dan [kelayakan auto-background](/docs/id/tools-reference#foreground-commands-that-move-to-the-background) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Gabungkan dengan `"allow"` untuk menyetujui otomatis, atau `"ask"` untuk menampilkan input yang dimodifikasi kepada pengguna. Untuk `"defer"`, diabaikan |1946| `updatedInput` | Memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan field yang tidak berubah bersama field yang dimodifikasi. Claude Code mengevaluasi aturan izin dan [kelayakan latar belakang otomatis](/docs/id/tools-reference#foreground-commands-that-move-to-the-background) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Gabungkan dengan `"allow"` untuk menyetujui secara otomatis, atau `"ask"` untuk menampilkan input yang dimodifikasi kepada pengguna. Untuk `"defer"`, diabaikan |
1948| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Diabaikan ketika `permissionDecision` bernilai `"defer"`. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |1947| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Diabaikan saat `permissionDecision` bernilai `"defer"`. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
1949 1948
1950Ketika beberapa hook PreToolUse mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `defer` > `ask` > `allow`.1949Saat beberapa hook PreToolUse mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `defer` > `ask` > `allow`.
1951 1950
1952Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `"deny"`: Claude melihat pesan stderr sebagai alasan penolakan.1951Hook yang memblokir dengan keluar menggunakan 2 diarahkan dengan cara yang sama seperti `"deny"`: Claude melihat pesan stderr sebagai alasan penolakan.
1953 1952
1954Ketika hook mengembalikan `"ask"`, permintaan izin yang ditampilkan kepada pengguna menyertakan label yang mengidentifikasi asal hook: `[settings]` untuk hook dari file pengaturan mana pun atau dari frontmatter agent, `[plugin:<name>]` untuk hook plugin, atau `[skill]` untuk hook dari frontmatter skill. Ini membantu pengguna memahami sumber konfigurasi mana yang meminta konfirmasi.1953Saat hook mengembalikan `"ask"`, permintaan izin yang ditampilkan kepada pengguna menyertakan label yang mengidentifikasi asal hook: `[settings]` untuk hook dari file pengaturan mana pun atau dari frontmatter agent, `[plugin:<name>]` untuk hook plugin, atau `[skill]` untuk hook dari frontmatter skill. Ini membantu pengguna memahami sumber konfigurasi mana yang meminta konfirmasi.
1955 1954
1956`"ask"` dari hook juga memaksa permintaan izin dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode): pengklasifikasi masih dapat menolak panggilan tool, tetapi tidak dapat menyetujui panggilan tersebut secara diam-diam. Sebelum v2.1.211, pengklasifikasi dapat menyetujui perintah Bash yang berjalan di luar [sandbox](/docs/id/sandboxing) tanpa menampilkan permintaan yang diminta hook; pengklasifikasi tetap menerapkan aturan keamanannya sendiri pada perintah tersebut, dan `"deny"` dari hook selalu dihormati.1955`"ask"` dari hook juga memaksa permintaan izin dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode): pengklasifikasi tetap dapat menolak panggilan tool, tetapi tidak dapat menyetujuinya secara diam-diam. Sebelum v2.1.211, pengklasifikasi dapat menyetujui perintah Bash yang berjalan di luar [sandbox](/docs/id/sandboxing) tanpa menampilkan permintaan yang diminta hook; pengklasifikasi tetap menerapkan aturan keamanannya sendiri pada perintah tersebut, dan `"deny"` dari hook selalu dihormati.
1957 1956
1958```json theme={null}1957```json theme={null}
1959{1958{
1977 Tool yang memerlukan interaksi pengguna1976 Tool yang memerlukan interaksi pengguna
1978</h4>1977</h4>
1979 1978
1980`AskUserQuestion` dan `ExitPlanMode` memerlukan interaksi pengguna. Dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, Claude Code hanya menawarkannya ketika run memiliki [permission host](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) untuk menerima permintaan tersebut, seperti callback `canUseTool` Agent SDK.1979`AskUserQuestion` dan `ExitPlanMode` memerlukan interaksi pengguna. Dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, Claude Code hanya menawarkannya saat run memiliki [host izin](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) untuk menerima permintaan, seperti callback `canUseTool` Agent SDK.
1981 1980
1982Hook `PreToolUse` memenuhi persyaratan tersebut ketika melakukan hal berikut:1981Hook `PreToolUse` memenuhi persyaratan tersebut saat melakukan hal berikut:
1983 1982
19841. Membaca input tool dari stdin19831. Membaca input tool dari stdin
19852. Mengumpulkan jawaban melalui UI Anda sendiri19842. Mengumpulkan jawaban melalui UI Anda sendiri
2009}2008}
2010```2009```
2011 2010
2012Tool MCP yang ditandai server-nya dengan [`_meta["anthropic/requiresUserInteraction"]`](/docs/id/mcp#require-approval-for-a-specific-tool) lebih ketat: hook tidak dapat melewati permintaan persetujuannya dengan `"allow"`, dengan atau tanpa `updatedInput`, karena Claude Code tidak dapat memastikan bahwa hook telah mengumpulkan interaksi yang dibutuhkan tool tersebut.2011Tool MCP yang ditandai server-nya dengan [`_meta["anthropic/requiresUserInteraction"]`](/docs/id/mcp#require-approval-for-a-specific-tool) lebih ketat: hook tidak dapat melewati permintaan persetujuannya dengan `"allow"`, dengan atau tanpa `updatedInput`, karena Claude Code tidak dapat memastikan bahwa hook telah mengumpulkan interaksi yang dibutuhkan tool.
2013 2012
2014<h4 id="defer-a-tool-call-for-later">2013<h4 id="defer-a-tool-call-for-later">
2015 Menangguhkan panggilan tool untuk nanti2014 Menangguhkan panggilan tool untuk nanti
2017 2016
2018`"defer"` ditujukan untuk integrasi yang menjalankan `claude -p` sebagai subproses dan membaca output JSON-nya, seperti aplikasi Agent SDK atau UI kustom yang dibangun di atas Claude Code. Ini memungkinkan proses pemanggil tersebut menjeda Claude pada panggilan tool, mengumpulkan input melalui antarmukanya sendiri, dan melanjutkan dari titik terakhir. Claude Code hanya menghormati nilai ini dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Dalam sesi interaktif, Claude Code mencatat peringatan dan mengabaikan hasil hook.2017`"defer"` ditujukan untuk integrasi yang menjalankan `claude -p` sebagai subproses dan membaca output JSON-nya, seperti aplikasi Agent SDK atau UI kustom yang dibangun di atas Claude Code. Ini memungkinkan proses pemanggil tersebut menjeda Claude pada panggilan tool, mengumpulkan input melalui antarmukanya sendiri, dan melanjutkan dari titik terakhir. Claude Code hanya menghormati nilai ini dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Dalam sesi interaktif, Claude Code mencatat peringatan dan mengabaikan hasil hook.
2019 2018
2020Tool `AskUserQuestion` adalah kasus yang umum: Claude ingin menanyakan sesuatu kepada pengguna, tetapi tidak ada terminal untuk menjawabnya. Run `-p` hanya menawarkan `AskUserQuestion` ketika memiliki [host izin](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs), seperti tool MCP yang Anda teruskan dengan `--permission-prompt-tool`, jadi mulai run dengan salah satunya. Alur bolak-baliknya bekerja seperti ini:2019Tool `AskUserQuestion` adalah kasus yang umum: Claude ingin menanyakan sesuatu kepada pengguna, tetapi tidak ada terminal untuk menjawabnya. Run `-p` hanya menawarkan `AskUserQuestion` saat memiliki [host izin](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs), seperti tool MCP yang Anda teruskan dengan `--permission-prompt-tool`, jadi mulai run dengan salah satunya. Perjalanan bolak-baliknya bekerja seperti ini:
2021 2020
20221. Claude memanggil `AskUserQuestion`. Hook `PreToolUse` dipicu.20211. Claude memanggil `AskUserQuestion`. Hook `PreToolUse` dipicu.
20232. Hook mengembalikan `permissionDecision: "defer"`. Tool tidak dieksekusi. Proses keluar dengan `stop_reason: "tool_deferred"` dan panggilan tool yang tertunda disimpan di transkrip.20222. Hook mengembalikan `permissionDecision: "defer"`. Tool tidak dieksekusi. Proses keluar dengan `stop_reason: "tool_deferred"` dan panggilan tool yang tertunda dipertahankan dalam transkrip.
20243. Proses pemanggil membaca `deferred_tool_use` dari hasil SDK, menampilkan pertanyaan di UI-nya sendiri, dan menunggu jawaban.20233. Proses pemanggil membaca `deferred_tool_use` dari hasil SDK, menampilkan pertanyaan di UI-nya sendiri, dan menunggu jawaban.
20254. Proses pemanggil menjalankan `claude -p --resume <session-id>` dengan host izin yang sama. Panggilan tool yang sama memicu `PreToolUse` lagi.20244. Proses pemanggil menjalankan `claude -p --resume <session-id>` dengan host izin yang sama. Panggilan tool yang sama memicu `PreToolUse` lagi.
20265. Hook mengembalikan `permissionDecision: "allow"` dengan jawaban di `updatedInput`. Tool dieksekusi dan Claude melanjutkan.20255. Hook mengembalikan `permissionDecision: "allow"` dengan jawaban di `updatedInput`. Tool dieksekusi dan Claude melanjutkan.
2027 2026
2028Field `deferred_tool_use` membawa `id`, `name`, dan `input` dari tool. `input` adalah parameter yang dihasilkan Claude untuk panggilan tool, yang ditangkap sebelum eksekusi:2027Field `deferred_tool_use` membawa `id`, `name`, dan `input` tool. `input` adalah parameter yang dihasilkan Claude untuk panggilan tool, yang ditangkap sebelum eksekusi:
2029 2028
2030```json theme={null}2029```json theme={null}
2031{2030{
2041}2040}
2042```2041```
2043 2042
2044Tidak ada timeout atau batas retry. Sesi tetap tersimpan di disk hingga Anda melanjutkannya, dengan tunduk pada pembersihan retensi [`cleanupPeriodDays`](/docs/id/settings-reference#cleanupperioddays), yang menghapus file sesi setelah 30 hari secara default, mengikuti [aturan pembersihan retensi](/docs/id/claude-directory#cleaned-up-automatically). Jika jawaban belum siap saat Anda melanjutkan, hook dapat mengembalikan `"defer"` lagi dan proses keluar dengan cara yang sama. Proses pemanggil mengontrol kapan memutus perulangan dengan pada akhirnya mengembalikan `"allow"` atau `"deny"` dari hook.2043Tidak ada timeout atau batas retry. Sesi tetap berada di disk hingga Anda melanjutkannya, dengan tunduk pada pembersihan retensi [`cleanupPeriodDays`](/docs/id/settings-reference#cleanupperioddays), yang menghapus file sesi setelah 30 hari secara default, mengikuti [aturan pembersihan retensi](/docs/id/claude-directory#cleaned-up-automatically). Jika jawaban belum siap saat Anda melanjutkan, hook dapat mengembalikan `"defer"` lagi dan proses keluar dengan cara yang sama. Proses pemanggil mengontrol kapan memutus loop dengan akhirnya mengembalikan `"allow"` atau `"deny"` dari hook.
2045 2044
2046`"defer"` hanya berfungsi ketika Claude melakukan satu panggilan tool dalam giliran tersebut. Jika Claude melakukan beberapa panggilan tool sekaligus, `"defer"` diabaikan dengan peringatan dan tool berlanjut melalui alur izin normal. Batasan ini ada karena resume hanya dapat menjalankan ulang satu tool: tidak ada cara untuk menangguhkan satu panggilan dari sekumpulan panggilan tanpa membiarkan yang lain tidak terselesaikan.2045`"defer"` hanya berfungsi saat Claude melakukan satu panggilan tool dalam giliran tersebut. Jika Claude melakukan beberapa panggilan tool sekaligus, `"defer"` diabaikan dengan peringatan dan tool berlanjut melalui alur izin normal. Batasan ini ada karena resume hanya dapat menjalankan ulang satu tool: tidak ada cara untuk menangguhkan satu panggilan dari sekelompok panggilan tanpa membiarkan yang lain tidak terselesaikan.
2047 2046
2048Jika tool yang ditangguhkan tidak lagi tersedia saat Anda melanjutkan, proses keluar dengan `stop_reason: "tool_deferred_unavailable"` dan `is_error: true` sebelum hook dipicu. Ini terjadi ketika server MCP yang menyediakan tool tidak terhubung untuk sesi yang dilanjutkan. Payload `deferred_tool_use` tetap disertakan sehingga Anda dapat mengidentifikasi tool mana yang hilang.2047Jika tool yang ditangguhkan tidak lagi tersedia saat Anda melanjutkan, proses keluar dengan `stop_reason: "tool_deferred_unavailable"` dan `is_error: true` sebelum hook dipicu. Ini terjadi saat server MCP yang menyediakan tool tidak terhubung untuk sesi yang dilanjutkan. Payload `deferred_tool_use` tetap disertakan sehingga Anda dapat mengidentifikasi tool mana yang hilang.
2049 2048
2050<Note>2049<Note>
2051 Untuk melanjutkan sesi yang ditangguhkan dalam plan mode, teruskan [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags) bersama `--resume` agar Claude Code dapat menyajikan rencana untuk disetujui. Jika Anda meneruskan flag peluncuran tertentu lainnya, run yang dilanjutkan tidak kembali ke plan mode; lihat [Melanjutkan dalam plan mode dengan `-p`](/docs/id/sessions#resume-in-plan-mode-with-p). Memerlukan Claude Code v2.1.246 atau yang lebih baru.2050 Untuk melanjutkan sesi yang ditangguhkan dalam plan mode, teruskan [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags) bersama `--resume` sehingga Claude Code dapat menyajikan rencana untuk disetujui. Jika Anda meneruskan flag peluncuran tertentu lainnya, run yang dilanjutkan tidak kembali ke plan mode; lihat [Melanjutkan dalam plan mode dengan `-p`](/docs/id/sessions#resume-in-plan-mode-with-p). Memerlukan Claude Code v2.1.246 atau yang lebih baru.
2052 2051
2053 Ketika Anda melanjutkan dengan `-p`, Claude Code tidak memulihkan mode izin tersimpan lainnya. Claude Code memulai run dalam mode izin yang akan digunakan oleh run `claude -p` baru, jadi teruskan `--permission-mode` atau `--dangerously-skip-permissions` lagi jika sesi yang ditangguhkan menggunakannya. Ketika Anda melanjutkan dengan `claude --resume <session-id>` tanpa `-p`, Claude Code memulihkan mode izin yang tersimpan, dengan pengecualian yang tercantum di [mode izin saat resume](/docs/id/sessions#permission-mode-on-resume).2052 Saat Anda melanjutkan dengan `-p`, Claude Code tidak memulihkan mode izin tersimpan lainnya. Claude Code memulai run dalam mode izin yang akan digunakan oleh run `claude -p` baru, jadi teruskan `--permission-mode` atau `--dangerously-skip-permissions` lagi jika sesi yang ditangguhkan menggunakannya. Saat Anda melanjutkan dengan `claude --resume <session-id>` tanpa `-p`, Claude Code memulihkan mode izin yang tersimpan, dengan pengecualian yang tercantum di [mode izin saat resume](/docs/id/sessions#permission-mode-on-resume).
2054</Note>2053</Note>
2055 2054
2056<h3 id="permissionrequest">2055<h3 id="permissionrequest">
2057 PermissionRequest2056 PermissionRequest
2058</h3>2057</h3>
2059 2058
2060Berjalan ketika Claude Code akan meminta izin Anda untuk menggunakan tool. Dalam sesi yang tidak dapat menampilkan permintaan, seperti subagent latar belakang dalam [mode non-interaktif](/docs/id/headless), Claude Code tetap menjalankan hook ini, dan jika tidak ada hook yang mengembalikan keputusan, Claude Code menolak panggilan tool. Untuk panggilan yang mencapai `--permission-prompt-tool` atau [callback `canUseTool`](/docs/id/agent-sdk/permissions) Agent SDK, hook berjalan bersama host Anda, dan mana pun yang memutuskan lebih dulu yang berlaku.2059Berjalan saat Claude Code akan meminta izin Anda untuk menggunakan tool. Dalam sesi yang tidak dapat menampilkan permintaan, seperti subagent latar belakang dalam [mode non-interaktif](/docs/id/headless), Claude Code tetap menjalankan hook ini, dan jika tidak ada hook yang mengembalikan keputusan, Claude Code menolak panggilan tool. Untuk panggilan yang mencapai `--permission-prompt-tool` atau [callback `canUseTool`](/docs/id/agent-sdk/permissions) Agent SDK, hook berjalan bersama host Anda, dan mana pun yang memutuskan lebih dulu yang berlaku.
2061Gunakan [kontrol keputusan PermissionRequest](#permissionrequest-decision-control) untuk mengizinkan atau menolak atas nama pengguna.2060Gunakan [kontrol keputusan PermissionRequest](#permissionrequest-decision-control) untuk mengizinkan atau menolak atas nama pengguna.
2062 2061
2063Gunakan event ini ketika Anda membutuhkan sinyal pada saat Claude meminta izin untuk menggunakan tool. Claude Code menjalankan hook [Notification](#notification) dengan jenis `permission_prompt` hanya setelah permintaan menunggu sekitar enam detik.2062Gunakan event ini saat Anda memerlukan sinyal tepat ketika Claude meminta izin untuk menggunakan tool. Claude Code menjalankan hook [Notification](#notification) dengan jenis `permission_prompt` hanya setelah permintaan menunggu sekitar enam detik.
2064 2063
2065Claude Code tidak menjalankan hook PermissionRequest untuk [permintaan jaringan](/docs/id/sandboxing#network-isolation) dari perintah yang di-sandbox. Untuk mendapatkan sinyal untuk permintaan tersebut, gunakan jenis notifikasi `permission_prompt`.2064Claude Code tidak menjalankan hook PermissionRequest untuk [permintaan jaringan](/docs/id/sandboxing#network-isolation) dari perintah yang berjalan di sandbox. Untuk mendapatkan sinyal bagi permintaan tersebut, gunakan jenis notifikasi `permission_prompt`.
2066 2065
2067Mencocokkan pada nama tool, dengan nilai yang sama seperti PreToolUse.2066Dicocokkan pada nama tool, dengan nilai yang sama seperti PreToolUse.
2068 2067
2069<h4 id="permissionrequest-input">2068<h4 id="permissionrequest-input">
2070 Input PermissionRequest2069 Input PermissionRequest
2072 2071
2073Hook PermissionRequest menerima field `tool_name` dan `tool_input` seperti hook PreToolUse, tetapi tanpa `tool_use_id`. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input). Array `permission_suggestions` opsional berisi [pembaruan izin](#permission-update-entries) yang disarankan Claude Code untuk permintaan ini, seperti menambahkan aturan allow atau mengubah mode izin.2072Hook PermissionRequest menerima field `tool_name` dan `tool_input` seperti hook PreToolUse, tetapi tanpa `tool_use_id`. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input). Array `permission_suggestions` opsional berisi [pembaruan izin](#permission-update-entries) yang disarankan Claude Code untuk permintaan ini, seperti menambahkan aturan allow atau mengubah mode izin.
2074 2073
2075Array `permission_suggestions` bukanlah daftar persis dari opsi yang Anda lihat, karena setiap dialog izin membangun opsinya sendiri. Beberapa dialog, seperti dialog untuk pengeditan file, sama sekali tidak membaca array tersebut dan menurunkan opsinya dari permintaan itu sendiri. Dialog yang membacanya masih dapat menahan opsi yang sarannya tetap ada di array, misalnya ketika [`allowManagedPermissionRulesOnly`](/docs/id/settings-reference#allowmanagedpermissionrulesonly) menyembunyikan opsi penyimpanan aturan. Dialog juga dapat menawarkan opsi yang tidak memiliki entri saran, seperti [**Yes, and switch to auto mode**](/docs/id/permission-modes#switch-permission-modes), yang mengubah mode izin secara langsung alih-alih melalui pembaruan izin.2074Array `permission_suggestions` bukan daftar persis dari opsi yang Anda lihat, karena setiap dialog izin membangun opsinya sendiri. Beberapa dialog, seperti dialog untuk pengeditan file, sama sekali tidak membaca array tersebut dan menurunkan opsinya dari permintaan itu sendiri. Dialog yang membacanya tetap dapat menahan opsi yang sarannya tetap ada di array, misalnya saat [`allowManagedPermissionRulesOnly`](/docs/id/settings-reference#allowmanagedpermissionrulesonly) menyembunyikan opsi penyimpanan aturan. Dialog juga dapat menawarkan opsi yang tidak memiliki entri saran, seperti [**Yes, and switch to auto mode**](/docs/id/permission-modes#switch-permission-modes), yang mengubah mode izin secara langsung alih-alih melalui pembaruan izin.
2076 2075
2077Hook PreToolUse berjalan sebelum setiap panggilan tool, baik memerlukan izin maupun tidak. Hook PermissionRequest hanya berjalan ketika Claude Code akan meminta izin Anda, atau ketika Claude Code sebaliknya akan menolak otomatis panggilan yang tidak dapat menampilkan permintaan. Tidak satu pun event tersebut dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).2076Hook PreToolUse berjalan sebelum setiap panggilan tool, terlepas dari apakah panggilan tersebut memerlukan izin. Hook PermissionRequest hanya berjalan saat Claude Code akan meminta izin Anda, atau saat Claude Code jika tidak demikian akan menolak otomatis panggilan yang tidak dapat menampilkan permintaan. Tidak satu pun event ini dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).
2078 2077
2079```json theme={null}2078```json theme={null}
2080{2079{
2113| `message` | Hanya untuk `"deny"`: memberi tahu Claude mengapa izin ditolak |2112| `message` | Hanya untuk `"deny"`: memberi tahu Claude mengapa izin ditolak |
2114| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |2113| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |
2115 2114
2116Hook yang keluar dengan kode 2 tanpa objek `decision` membiarkan alur izin tidak berubah, dan stderr-nya dibuang. Hanya objek `decision` yang dapat memberikan atau menolak permintaan.2115Hook yang keluar dengan 2 tanpa objek `decision` membiarkan alur izin tidak berubah, dan stderr-nya dibuang. Hanya objek `decision` yang dapat memberikan atau menolak permintaan.
2117 2116
2118```json theme={null}2117```json theme={null}
2119{2118{
2133 Entri pembaruan izin2132 Entri pembaruan izin
2134</h4>2133</h4>
2135 2134
2136Field output `updatedPermissions` dan [field input `permission_suggestions`](#permissionrequest-input) keduanya menggunakan array objek entri yang sama. Setiap entri memiliki `type` yang menentukan field lainnya, dan `destination` yang mengontrol tempat perubahan ditulis.2135Field output `updatedPermissions` dan [field input `permission_suggestions`](#permissionrequest-input) sama-sama menggunakan array objek entri yang sama. Setiap entri memiliki `type` yang menentukan field lainnya, serta `destination` yang mengontrol ke mana perubahan ditulis.
2137 2136
2138| `type` | Field | Efek |2137| `type` | Field | Efek |
2139| :- | :- | :- |2138| :- | :- | :- |
2140| `addRules` | `rules`, `behavior`, `destination` | Menambahkan aturan izin. `rules` adalah array objek `{toolName, ruleContent?}`. Hilangkan `ruleContent` untuk mencocokkan seluruh tool. `behavior` bernilai `"allow"`, `"deny"`, atau `"ask"` |2139| `addRules` | `rules`, `behavior`, `destination` | Menambahkan aturan izin. `rules` adalah array objek `{toolName, ruleContent?}`. Hilangkan `ruleContent` untuk mencocokkan seluruh tool. `behavior` adalah `"allow"`, `"deny"`, atau `"ask"` |
2141| `replaceRules` | `rules`, `behavior`, `destination` | Mengganti semua aturan dengan `behavior` yang diberikan di `destination` dengan `rules` yang disediakan |2140| `replaceRules` | `rules`, `behavior`, `destination` | Mengganti semua aturan dengan `behavior` yang diberikan di `destination` dengan `rules` yang disediakan |
2142| `removeRules` | `rules`, `behavior`, `destination` | Menghapus aturan yang cocok dengan `behavior` yang diberikan |2141| `removeRules` | `rules`, `behavior`, `destination` | Menghapus aturan yang cocok dengan `behavior` yang diberikan |
2143| `setMode` | `mode`, `destination` | Mengubah mode izin. Mode yang valid adalah `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, dan `manual` sebagai alias untuk `default` |2142| `setMode` | `mode`, `destination` | Mengubah mode izin. Mode yang valid adalah `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, dan `manual` sebagai alias untuk `default` |
2145| `removeDirectories` | `directories`, `destination` | Menghapus direktori kerja |2144| `removeDirectories` | `directories`, `destination` | Menghapus direktori kerja |
2146 2145
2147<Note>2146<Note>
2148 `setMode` dengan `bypassPermissions` hanya berlaku jika Anda meluncurkan sesi dengan mode bypass yang sudah tersedia: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions`, atau `permissions.defaultMode: "bypassPermissions"` di [pengaturan pengguna, `--settings`, atau pengaturan terkelola](/docs/id/settings-reference#permissions-defaultmode). Jika tidak, pembaruan tersebut tidak berpengaruh apa pun. Pembaruan tersebut juga tidak berpengaruh ketika [`permissions.disableBypassPermissionsMode`](/docs/id/permissions#managed-settings) menonaktifkan mode tersebut, atau ketika sesi dimulai dalam [mode terbatas](/docs/id/cli-reference#cli-flags).2147 `setMode` dengan `bypassPermissions` hanya berlaku jika Anda meluncurkan sesi dengan mode bypass yang sudah tersedia: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions`, atau `permissions.defaultMode: "bypassPermissions"` di [pengaturan pengguna, `--settings`, atau pengaturan terkelola](/docs/id/settings-reference#permissions-defaultmode). Jika tidak, pembaruan tidak berpengaruh apa pun. Pembaruan juga tidak berpengaruh ketika [`permissions.disableBypassPermissionsMode`](/docs/id/permissions#managed-settings) menonaktifkan mode tersebut, atau ketika sesi dimulai dalam [mode terbatas](/docs/id/cli-reference#cli-flags).
2149 2148
2150 `bypassPermissions` tidak pernah disimpan sebagai `defaultMode` terlepas dari `destination`.2149 `bypassPermissions` tidak pernah disimpan sebagai `defaultMode` terlepas dari `destination`.
2151</Note>2150</Note>
2154 2153
2155| `destination` | Menulis ke |2154| `destination` | Menulis ke |
2156| :- | :- |2155| :- | :- |
2157| `session` | hanya di memori, dibuang ketika sesi berakhir |2156| `session` | hanya di memori, dibuang saat sesi berakhir |
2158| `localSettings` | `.claude/settings.local.json` |2157| `localSettings` | `.claude/settings.local.json` |
2159| `projectSettings` | `.claude/settings.json` |2158| `projectSettings` | `.claude/settings.json` |
2160| `userSettings` | `~/.claude/settings.json` |2159| `userSettings` | `~/.claude/settings.json` |
2167 2166
2168Berjalan segera setelah sebuah tool selesai dengan sukses.2167Berjalan segera setelah sebuah tool selesai dengan sukses.
2169 2168
2170Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2169Mencocokkan nama tool, dengan nilai yang sama seperti PreToolUse.
2171 2170
2172Cocokkan secara lebih luas ketika nama tool bukan filter yang tepat:2171Gunakan pencocokan yang lebih luas ketika nama tool bukan filter yang tepat:
2173 2172
2174* Untuk menjalankan hook setelah tool apa pun selesai dengan sukses, hilangkan `matcher` atau atur ke `"*"`. Hook Anda kemudian dapat menemukan sendiri apa yang berubah, misalnya dengan menjalankan `git status --porcelain`, yang juga mencantumkan file yang tidak terlacak yang terlewat oleh `git diff`. Untuk panggilan tool yang gagal, tambahkan hook yang sama di bawah [PostToolUseFailure](#posttoolusefailure).2173* Untuk menjalankan hook setelah tool apa pun selesai dengan sukses, hilangkan `matcher` atau setel ke `"*"`. Hook Anda kemudian dapat menemukan sendiri apa yang berubah, misalnya dengan menjalankan `git status --porcelain`, yang juga mencantumkan file yang tidak terlacak yang terlewat oleh `git diff`. Untuk panggilan tool yang gagal, tambahkan hook yang sama di bawah [PostToolUseFailure](#posttoolusefailure).
2175* Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged). Claude Code tidak menjalankan hook `PostToolUse` yang mencocokkan `Edit|Write` ketika perintah `Bash` atau proses di luar Claude Code menulis ulang file yang sama.2174* Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged). Claude Code tidak menjalankan hook `PostToolUse` yang mencocokkan `Edit|Write` ketika perintah `Bash` atau proses di luar Claude Code menulis ulang file yang sama.
2176 2175
2177<h4 id="posttooluse-input">2176<h4 id="posttooluse-input">
2178 Input PostToolUse2177 Input PostToolUse
2179</h4>2178</h4>
2180 2179
2181Hook `PostToolUse` dipicu setelah sebuah tool sudah dieksekusi dengan sukses. Input mencakup `tool_input`, yaitu argumen yang dikirim ke tool, dan `tool_response`, yaitu hasil yang dikembalikannya. Skema persis untuk keduanya bergantung pada tool. Path `tool_input` untuk tool file tiba dalam format yang sama seperti untuk [PreToolUse](#pretooluse-input): selalu absolut, dengan pemisah native platform, jadi backslash di Windows. Untuk tool MCP, input juga membawa objek [`mcp_server`](#pretooluse-input).2180Hook `PostToolUse` dipicu setelah sebuah tool berhasil dieksekusi. Input mencakup `tool_input`, yaitu argumen yang dikirim ke tool, dan `tool_response`, yaitu hasil yang dikembalikannya. Skema persis untuk keduanya bergantung pada tool. Path `tool_input` untuk tool file tiba dalam format yang sama seperti untuk [PreToolUse](#pretooluse-input): selalu absolut, dengan pemisah bawaan platform, sehingga menggunakan backslash di Windows. Untuk tool MCP, input juga membawa objek [`mcp_server`](#pretooluse-input).
2182 2181
2183```json theme={null}2182```json theme={null}
2184{2183{
2214| Field | Deskripsi |2213| Field | Deskripsi |
2215| :- | :- |2214| :- | :- |
2216| `decision` | `"block"` menambahkan `reason` di samping hasil tool. Claude tetap melihat output asli; untuk menggantinya, gunakan `updatedToolOutput` |2215| `decision` | `"block"` menambahkan `reason` di samping hasil tool. Claude tetap melihat output asli; untuk menggantinya, gunakan `updatedToolOutput` |
2217| `reason` | Penjelasan yang ditampilkan kepada Claude ketika `decision` bernilai `"block"` |2216| `reason` | Penjelasan yang ditampilkan kepada Claude ketika `decision` adalah `"block"` |
2218| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |2217| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
2219| `classifierContext` | Catatan singkat tentang hasil panggilan ini untuk pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan untuk Claude. Lihat [Menganotasi hasil untuk pengklasifikasi auto mode](#annotate-a-result-for-the-auto-mode-classifier). Memerlukan Claude Code v2.1.236 atau yang lebih baru |2218| `classifierContext` | Catatan singkat tentang hasil panggilan ini untuk pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan untuk Claude. Lihat [Menganotasi hasil untuk pengklasifikasi auto mode](#annotate-a-result-for-the-auto-mode-classifier). Memerlukan Claude Code v2.1.236 atau lebih baru |
2220| `updatedToolOutput` | Mengganti output tool dengan nilai yang diberikan sebelum dikirim ke Claude. Nilai harus sesuai dengan bentuk output tool |2219| `updatedToolOutput` | Mengganti output tool dengan nilai yang diberikan sebelum dikirim ke Claude. Nilai harus sesuai dengan bentuk output tool |
2221| `updatedMCPToolOutput` | Mengganti output hanya untuk [tool MCP](#match-mcp-tools). Utamakan `updatedToolOutput`, yang berfungsi untuk semua tool |2220| `updatedMCPToolOutput` | Mengganti output hanya untuk [tool MCP](#match-mcp-tools). Sebaiknya gunakan `updatedToolOutput`, yang berfungsi untuk semua tool |
2222 2221
2223Contoh di bawah ini mengganti output dari panggilan `Bash`. Nilai pengganti sesuai dengan bentuk output tool `Bash`:2222Contoh di bawah ini mengganti output dari panggilan `Bash`. Nilai pengganti sesuai dengan bentuk output tool `Bash`:
2224 2223
2238```2237```
2239 2238
2240<Warning>2239<Warning>
2241 `updatedToolOutput` hanya mengubah apa yang dilihat Claude. Tool sudah berjalan pada saat hook dipicu, sehingga setiap file yang ditulis, perintah yang dieksekusi, atau permintaan jaringan yang dikirim sudah berlaku. Telemetri seperti span tool OpenTelemetry dan event analitik juga menangkap output asli sebelum hook berjalan. Untuk mencegah atau memodifikasi panggilan tool sebelum berjalan, gunakan hook [PreToolUse](#pretooluse) sebagai gantinya.2240 `updatedToolOutput` hanya mengubah apa yang dilihat Claude. Tool sudah berjalan pada saat hook dipicu, sehingga file apa pun yang ditulis, perintah yang dieksekusi, atau permintaan jaringan yang dikirim sudah berlaku. Telemetri seperti span tool OpenTelemetry dan event analitik juga menangkap output asli sebelum hook berjalan. Untuk mencegah atau memodifikasi panggilan tool sebelum dijalankan, gunakan hook [PreToolUse](#pretooluse).
2242 2241
2243 Nilai pengganti harus sesuai dengan bentuk output tool. Tool bawaan mengembalikan objek terstruktur, bukan string biasa. Misalnya, `Bash` mengembalikan objek dengan field `stdout`, `stderr`, `interrupted`, dan `isImage`. Untuk tool bawaan, nilai yang tidak sesuai dengan skema output tool akan diabaikan dan output asli yang digunakan. Output tool MCP diteruskan tanpa validasi skema. Menghapus detail error yang dibutuhkan Claude dapat menyebabkannya melanjutkan berdasarkan asumsi yang salah.2242 Nilai pengganti harus sesuai dengan bentuk output tool. Tool bawaan mengembalikan objek terstruktur, bukan string biasa. Misalnya, `Bash` mengembalikan objek dengan field `stdout`, `stderr`, `interrupted`, dan `isImage`. Untuk tool bawaan, nilai yang tidak sesuai dengan skema output tool akan diabaikan dan output asli yang digunakan. Output tool MCP diteruskan tanpa validasi skema. Menghapus detail error yang dibutuhkan Claude dapat menyebabkannya melanjutkan berdasarkan asumsi yang salah.
2244</Warning>2243</Warning>
2247 Menganotasi hasil untuk pengklasifikasi auto mode2246 Menganotasi hasil untuk pengklasifikasi auto mode
2248</h4>2247</h4>
2249 2248
2250Kembalikan `classifierContext` untuk mengirim catatan singkat tentang hasil panggilan tool ke pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan ke Claude. Pengklasifikasi [tidak pernah menerima hasil tool itu sendiri](/docs/id/permission-modes#how-the-classifier-evaluates-actions), sehingga field ini adalah cara yang didukung untuk memberi tahu sesuatu tentang apa yang dikembalikan oleh sebuah panggilan sebelum pengklasifikasi meninjau tindakan berikutnya. Field ini memerlukan Claude Code v2.1.236 atau yang lebih baru.2249Kembalikan `classifierContext` untuk mengirim catatan singkat tentang hasil panggilan tool ke pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan ke Claude. Pengklasifikasi [tidak pernah menerima hasil tool itu sendiri](/docs/id/permission-modes#how-the-classifier-evaluates-actions), sehingga field ini adalah cara yang didukung untuk memberi tahu pengklasifikasi sesuatu tentang apa yang dikembalikan oleh sebuah panggilan sebelum meninjau tindakan berikutnya. Field ini memerlukan Claude Code v2.1.236 atau lebih baru.
2251 2250
2252Contoh di bawah ini memberi tahu pengklasifikasi dari mana output sebuah kueri berasal:2251Contoh di bawah ini memberi tahu pengklasifikasi dari mana output sebuah query berasal:
2253 2252
2254```json theme={null}2253```json theme={null}
2255{2254{
2260}2259}
2261```2260```
2262 2261
2263Seberapa besar bobot yang diberikan pengklasifikasi pada catatan tersebut bergantung pada tempat Anda mengonfigurasi hook:2262Seberapa besar bobot yang diberikan pengklasifikasi pada catatan tersebut bergantung pada di mana Anda mengonfigurasi hook:
2264 2263
2265* **Hook yang dikonfigurasi di Claude Code**: untuk hook dari file pengaturan, plugin, skill, dan frontmatter agent, pengklasifikasi memperlakukan catatan sebagai konteks yang belum terverifikasi dan disediakan oleh aplikasi. Catatan tidak pernah menetapkan niat pengguna, dan jika catatan mengklaim bahwa Anda menyetujui atau meminta sesuatu, pengklasifikasi memeriksa klaim tersebut terhadap pesan Anda sendiri dalam percakapan2264* **Hook yang dikonfigurasi di Claude Code**: untuk hook dari file pengaturan, plugin, skill, dan frontmatter agent, pengklasifikasi memperlakukan catatan sebagai konteks yang disediakan aplikasi dan belum diverifikasi. Catatan tersebut tidak pernah menetapkan niat pengguna, dan jika catatan mengklaim bahwa Anda menyetujui atau meminta sesuatu, pengklasifikasi memeriksa klaim tersebut terhadap pesan Anda sendiri dalam percakapan
2266* **Callback Agent SDK in-process**: ketika aplikasi yang menyematkan Claude Code mendaftarkan hook sebagai [callback TypeScript SDK](/docs/id/agent-sdk/hooks) dan mengembalikan catatan selama sesi aktif, pengklasifikasi dapat menganggap pernyataan pengguna yang diteruskan dalam catatan sebagai niat pengguna. Pernyataan semacam itu dapat memenuhi persyaratan persetujuan yang akan diterima pengklasifikasi dari pesan yang Anda kirim, tetapi tidak pernah mencabut blokir yang juga tidak dapat dicabut oleh pesan Anda sendiri. Setelah sesi dilanjutkan, Claude Code memperlakukan catatan yang dipulihkan sebagai konteks yang belum terverifikasi. Ketika hook dari kedua kelompok menganotasi panggilan yang sama, pengklasifikasi memperlakukan gabungan catatan sebagai belum terverifikasi2265* **Callback Agent SDK dalam proses**: ketika aplikasi yang menyematkan Claude Code mendaftarkan hook sebagai [callback TypeScript SDK](/docs/id/agent-sdk/hooks) dan mengembalikan catatan selama sesi aktif, pengklasifikasi dapat menimbang pernyataan pengguna yang diteruskan dalam catatan sebagai niat pengguna. Pernyataan semacam itu dapat memenuhi persyaratan persetujuan yang akan diterima pengklasifikasi dari pesan yang Anda kirim, tetapi tidak pernah mencabut blokir yang juga tidak dapat dicabut oleh pesan Anda sendiri. Setelah sesi dilanjutkan, Claude Code memperlakukan catatan yang dipulihkan sebagai konteks yang belum diverifikasi. Ketika hook dari kedua kelompok menganotasi panggilan yang sama, pengklasifikasi memperlakukan catatan gabungan sebagai belum diverifikasi
2267 2266
2268Claude Code menerapkan batasan berikut saat mengirimkan catatan:2267Claude Code menerapkan batasan berikut saat menyampaikan catatan:
2269 2268
2270* **Panjang**: Claude Code membatasi catatan untuk satu panggilan tool hingga 2.000 karakter dan memotong sisanya. Batas ini dibagi di antara setiap hook yang merespons panggilan tersebut2269* **Panjang**: Claude Code membatasi catatan untuk satu panggilan tool hingga 2.000 karakter dan memotong sisanya. Batas ini dibagi di antara setiap hook yang merespons panggilan tersebut
2271* **Hanya respons sinkron**: Claude Code mengabaikan field ini dalam respons hook yang [berjalan di latar belakang](#run-hooks-in-the-background), karena respons tersebut tiba setelah Claude Code mencatat hasil tool2270* **Hanya respons sinkron**: Claude Code mengabaikan field ini dalam respons hook yang [berjalan di latar belakang](#run-hooks-in-the-background), karena respons tersebut tiba setelah Claude Code mencatat hasil tool
2272* **Panggilan yang tidak dicatat oleh pengklasifikasi**: transkrip pengklasifikasi menghilangkan pencarian read-only seperti pembacaan file dan penelusuran. Claude Code membuang catatan yang dilampirkan pada salah satu panggilan tersebut2271* **Panggilan yang tidak dicatat pengklasifikasi**: transkrip pengklasifikasi menghilangkan pencarian read-only seperti pembacaan file dan pencarian. Claude Code membuang catatan yang dilampirkan pada salah satu panggilan tersebut
2273* **Interaksi dengan penulisan ulang**: ketika catatan menjelaskan output yang Anda ganti dengan `updatedToolOutput`, kembalikan kedua field dalam respons hook yang sama. Claude Code membuang catatan jika penulisan ulang tersebut ditolak atau penulisan ulang dari hook lain menggantikannya. Claude Code mengirimkan catatan yang Anda kembalikan tanpa penulisan ulang bahkan ketika hook lain menulis ulang output2272* **Interaksi dengan penulisan ulang**: ketika catatan menjelaskan output yang Anda ganti dengan `updatedToolOutput`, kembalikan kedua field dalam respons hook yang sama. Claude Code membuang catatan jika penulisan ulang tersebut ditolak atau penulisan ulang dari hook lain menggantikannya. Claude Code menyampaikan catatan yang Anda kembalikan tanpa penulisan ulang meskipun hook lain menulis ulang output
2274 2273
2275<Warning>2274<Warning>
2276 Pengklasifikasi membaca konten yang Anda tempatkan di `classifierContext` sebagai informasi dari aplikasi yang meng-host sesi, jadi jangan menyalin output tool yang tidak tepercaya atau teks pihak ketiga ke dalamnya. Batasi catatan pada pernyataan singkat tentang satu panggilan ini, seperti fakta tentang asal-usulnya atau pernyataan pengguna tentangnya; jangan gunakan field ini untuk mengirimkan pesan yang tidak terkait atau aliran event.2275 Pengklasifikasi membaca konten yang Anda tempatkan di `classifierContext` sebagai informasi dari aplikasi yang meng-host sesi, jadi jangan salin output tool yang tidak tepercaya atau teks pihak ketiga ke dalamnya. Batasi catatan pada pernyataan singkat tentang satu panggilan ini, seperti fakta tentang asalnya atau pernyataan pengguna tentangnya; jangan gunakan field ini untuk menyampaikan pesan yang tidak terkait atau serangkaian event.
2277</Warning>2276</Warning>
2278 2277
2279<h3 id="posttoolusefailure">2278<h3 id="posttoolusefailure">
2280 PostToolUseFailure2279 PostToolUseFailure
2281</h3>2280</h3>
2282 2281
2283Berjalan ketika sebuah tool yang mulai dieksekusi gagal: tool melemparkan error, atau tool MCP mengembalikan hasil error. Gunakan ini untuk mencatat kegagalan, mengirim peringatan, atau memberikan umpan balik korektif kepada Claude.2282Berjalan ketika tool yang mulai dieksekusi gagal: tool melempar error, atau tool MCP mengembalikan hasil error. Gunakan ini untuk mencatat kegagalan, mengirim peringatan, atau memberikan umpan balik korektif kepada Claude.
2284 2283
2285Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2284Mencocokkan nama tool, dengan nilai yang sama seperti PreToolUse.
2286 2285
2287<Note>2286<Note>
2288 Event ini tidak dipicu untuk panggilan tool yang ditolak sebelum eksekusi: nama tool yang tidak dikenal, input yang gagal validasi skema atau validasi khusus tool, atau penolakan izin. Penolakan validasi dikembalikan sebagai hasil `tool_use_error` dan terjadi sebelum hook berjalan, sehingga tidak memicu `PreToolUse` maupun `PostToolUseFailure`. Penolakan izin memicu `PreToolUse` tetapi tidak memicu event ini; lihat [PermissionDenied](#permissiondenied).2287 Event ini tidak dipicu untuk panggilan tool yang ditolak sebelum eksekusi: nama tool yang tidak dikenal, input yang gagal validasi skema atau validasi khusus tool, atau penolakan izin. Penolakan validasi dikembalikan sebagai hasil `tool_use_error` dan terjadi sebelum hook berjalan, sehingga tidak memicu `PreToolUse` maupun `PostToolUseFailure`. Penolakan izin memicu `PreToolUse` tetapi tidak memicu event ini; lihat [PermissionDenied](#permissiondenied).
2292 Input PostToolUseFailure2291 Input PostToolUseFailure
2293</h4>2292</h4>
2294 2293
2295Hook PostToolUseFailure menerima field `tool_name` dan `tool_input` yang sama seperti PostToolUse, beserta informasi error sebagai field tingkat atas. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input). Misalnya, perintah `npm test` yang gagal mungkin mengirimkan:2294Hook PostToolUseFailure menerima field `tool_name` dan `tool_input` yang sama seperti PostToolUse, beserta informasi error sebagai field tingkat atas. Untuk tool MCP, hook juga menerima objek [`mcp_server`](#pretooluse-input). Misalnya, perintah `npm test` yang gagal mungkin mengirimkan:
2296 2295
2297```json theme={null}2296```json theme={null}
2298{2297{
2316| Field | Deskripsi |2315| Field | Deskripsi |
2317| :- | :- |2316| :- | :- |
2318| `error` | String yang menjelaskan apa yang salah. Formatnya bergantung pada tool yang gagal |2317| `error` | String yang menjelaskan apa yang salah. Formatnya bergantung pada tool yang gagal |
2319| `is_interrupt` | Boolean opsional. True ketika kegagalan mencapai Claude Code sebagai pembatalan, bukan sebagai error yang dilaporkan tool. Membatalkan tool yang sedang berjalan tidak memicu hook ini; hasil tool membawa pesan interupsi sebagai gantinya |2318| `is_interrupt` | Boolean opsional. True ketika kegagalan mencapai Claude Code sebagai pembatalan (abort), bukan sebagai error yang dilaporkan tool. Membatalkan tool yang sedang berjalan tidak memicu hook ini; hasil tool membawa pesan interupsi sebagai gantinya |
2320| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Tidak termasuk waktu yang dihabiskan dalam permintaan izin dan hook PreToolUse |2319| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Tidak termasuk waktu yang dihabiskan dalam permintaan izin dan hook PreToolUse |
2321 2320
2322String `error` umumnya merupakan teks yang sama dengan yang diterima Claude sebagai hasil tool yang gagal. Formatnya bervariasi menurut tool dan kegagalan. Dasarkan hook Anda pada `tool_name`, `is_interrupt`, dan baris pertama `Exit code N`; perlakukan sisa string sebagai teks tampilan, bukan format yang stabil.2321String `error` umumnya adalah teks yang sama yang diterima Claude sebagai hasil tool yang gagal. Formatnya bervariasi menurut tool dan kegagalan. Dasarkan hook Anda pada `tool_name`, `is_interrupt`, dan baris pertama `Exit code N`; perlakukan sisa string sebagai teks tampilan, bukan format yang stabil.
2323 2322
2324* Untuk Bash dan PowerShell, perintah yang berjalan lalu keluar menghasilkan baris pertama `Exit code N`, lalu output apa pun yang dihasilkan perintah sebagai satu blok dengan stdout dan stderr yang diselingi2323* Untuk Bash dan PowerShell, perintah yang berjalan dan keluar menghasilkan baris pertama `Exit code N`, lalu output apa pun yang dihasilkan perintah sebagai satu blok dengan stdout dan stderr yang saling berselang-seling
2325* Sebuah payload juga dapat membawa pesan kegagalan polos tanpa baris exit code, ketika Claude Code tidak dapat memulai proses shell itu sendiri2324* Payload juga dapat membawa pesan kegagalan polos tanpa baris exit code, ketika Claude Code tidak dapat memulai proses shell itu sendiri
2326* Claude Code memotong bagian tengah string panjang di sekitar penanda `... [N characters truncated] ...`, dan dapat menyisipkan baris miliknya sendiri, seperti `Command timed out after 2m 0s`2325* Claude Code memotong bagian tengah string panjang di sekitar penanda `... [N characters truncated] ...`, dan dapat menyisipkan barisnya sendiri, seperti `Command timed out after 2m 0s`
2327 2326
2328<h4 id="posttoolusefailure-decision-control">2327<h4 id="posttoolusefailure-decision-control">
2329 Kontrol keputusan PostToolUseFailure2328 Kontrol keputusan PostToolUseFailure
2348 PostToolBatch2347 PostToolBatch
2349</h3>2348</h3>
2350 2349
2351Berjalan sekali setelah setiap panggilan tool dalam satu batch telah selesai, sebelum Claude Code mengirim permintaan berikutnya ke model. `PostToolUse` dipicu sekali per tool, yang berarti hook tersebut dipicu secara bersamaan ketika Claude melakukan panggilan tool paralel. `PostToolBatch` dipicu tepat sekali dengan batch lengkap, sehingga ini adalah tempat yang tepat untuk menyisipkan konteks yang bergantung pada kumpulan tool yang berjalan, bukan pada satu tool saja. Tidak ada matcher untuk event ini.2350Berjalan sekali setelah setiap panggilan tool dalam satu batch selesai, sebelum Claude Code mengirim permintaan berikutnya ke model. `PostToolUse` dipicu sekali per tool, yang berarti dipicu secara bersamaan ketika Claude melakukan panggilan tool paralel. `PostToolBatch` dipicu tepat sekali dengan batch lengkap, sehingga ini adalah tempat yang tepat untuk menyuntikkan konteks yang bergantung pada kumpulan tool yang berjalan, bukan pada satu tool tertentu. Tidak ada matcher untuk event ini.
2352 2351
2353<h4 id="posttoolbatch-input">2352<h4 id="posttoolbatch-input">
2354 Input PostToolBatch2353 Input PostToolBatch
2380}2379}
2381```2380```
2382 2381
2383`tool_response` berisi konten yang sama dengan yang diterima model dalam blok `tool_result` yang bersesuaian. Nilainya adalah string terserialisasi atau array content-block, persis seperti yang dikeluarkan tool. Untuk `Read`, itu berarti teks berawalan nomor baris, bukan konten file mentah. Respons bisa berukuran besar, jadi parse hanya field yang Anda butuhkan.2382`tool_response` berisi konten yang sama yang diterima model dalam blok `tool_result` yang bersesuaian. Nilainya adalah string terserialisasi atau array content-block, persis seperti yang dikeluarkan tool. Untuk `Read`, artinya teks yang diawali nomor baris, bukan konten file mentah. Respons bisa berukuran besar, jadi parse hanya field yang Anda butuhkan.
2384 2383
2385<Note>2384<Note>
2386 Bentuk `tool_response` berbeda dari milik `PostToolUse`. `PostToolUse` meneruskan objek `Output` terstruktur milik tool, seperti `{filePath: "...", type: "create"}` untuk `Write`; `PostToolBatch` meneruskan konten `tool_result` terserialisasi yang dilihat model.2385 Bentuk `tool_response` berbeda dari milik `PostToolUse`. `PostToolUse` meneruskan objek `Output` terstruktur milik tool, seperti `{filePath: "...", type: "create"}` untuk `Write`; `PostToolBatch` meneruskan konten `tool_result` terserialisasi yang dilihat model.
2390 Kontrol keputusan PostToolBatch2389 Kontrol keputusan PostToolBatch
2391</h4>2390</h4>
2392 2391
2393Hook `PostToolBatch` dapat menyisipkan konteks untuk Claude. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, skrip hook Anda dapat mengembalikan field khusus event berikut:2392Hook `PostToolBatch` dapat menyuntikkan konteks untuk Claude. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, skrip hook Anda dapat mengembalikan field khusus event berikut:
2394 2393
2395| Field | Deskripsi |2394| Field | Deskripsi |
2396| :- | :- |2395| :- | :- |
2397| `additionalContext` | String konteks yang disisipkan sekali sebelum panggilan model berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk detail pengiriman, apa yang perlu dimasukkan, dan bagaimana sesi yang dilanjutkan menangani nilai sebelumnya |2396| `additionalContext` | String konteks yang disuntikkan sekali sebelum panggilan model berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk detail penyampaian, apa yang harus dimasukkan, dan bagaimana sesi yang dilanjutkan menangani nilai sebelumnya |
2398 2397
2399```json theme={null}2398```json theme={null}
2400{2399{
2405}2404}
2406```2405```
2407 2406
2408Mengembalikan `decision: "block"` atau `continue: false` menghentikan agentic loop sebelum panggilan model berikutnya. Pesan pemblokiran berasal dari `reason` atau `stopReason` JSON, atau dari stderr pada exit 2. Anda melihatnya sebagai peringatan dalam transkrip, dan pesan tersebut tetap berada dalam percakapan, sehingga Claude melihatnya ketika percakapan berlanjut.2407Mengembalikan `decision: "block"` atau `continue: false` menghentikan agentic loop sebelum panggilan model berikutnya. Pesan pemblokiran berasal dari `reason` atau `stopReason` JSON, atau dari stderr pada exit 2. Anda melihatnya sebagai peringatan di transkrip, dan pesan tersebut tetap berada dalam percakapan, sehingga Claude melihatnya ketika percakapan berlanjut.
2409 2408
2410<h3 id="permissiondenied">2409<h3 id="permissiondenied">
2411 PermissionDenied2410 PermissionDenied
2412</h3>2411</h3>
2413 2412
2414Berjalan ketika [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) menolak panggilan tool, termasuk ketika menolak tanpa putusan pengklasifikasi karena [pemeriksaan keamanan yang terpisah dari auto mode menolak permintaan pengklasifikasi itu sendiri](/docs/id/errors#auto-mode-cannot-determine-the-safety-of-an-action) atau responsnya tidak dapat di-parse. Hook ini hanya dipicu dalam auto mode: hook ini tidak berjalan ketika Anda menolak dialog izin secara manual, ketika hook `PreToolUse` memblokir panggilan, atau ketika aturan `deny` cocok. Gunakan ini untuk mencatat penolakan, menyesuaikan konfigurasi, atau memberi tahu model bahwa ia boleh mencoba ulang panggilan tool.2413Berjalan ketika [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) menolak panggilan tool, termasuk ketika menolak tanpa putusan pengklasifikasi karena [pemeriksaan keamanan yang terpisah dari auto mode menolak permintaan pengklasifikasi itu sendiri](/docs/id/errors#auto-mode-cannot-determine-the-safety-of-an-action) atau responsnya tidak dapat di-parse. Hook ini hanya dipicu dalam auto mode: hook ini tidak berjalan ketika Anda menolak dialog izin secara manual, ketika hook `PreToolUse` memblokir panggilan, atau ketika aturan `deny` cocok. Gunakan untuk mencatat penolakan, menyesuaikan konfigurasi, atau memberi tahu model bahwa ia boleh mencoba ulang panggilan tool.
2415 2414
2416Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2415Mencocokkan nama tool, dengan nilai yang sama seperti PreToolUse.
2417 2416
2418<h4 id="permissiondenied-input">2417<h4 id="permissiondenied-input">
2419 Input PermissionDenied2418 Input PermissionDenied
2420</h4>2419</h4>
2421 2420
2422Selain [field input umum](#common-input-fields), hook PermissionDenied menerima `tool_name`, `tool_input`, `tool_use_id`, dan `reason`. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input).2421Selain [field input umum](#common-input-fields), hook PermissionDenied menerima `tool_name`, `tool_input`, `tool_use_id`, dan `reason`. Untuk tool MCP, hook juga menerima objek [`mcp_server`](#pretooluse-input).
2423 2422
2424```json theme={null}2423```json theme={null}
2425{2424{
2440 2439
2441| Field | Deskripsi |2440| Field | Deskripsi |
2442| :- | :- |2441| :- | :- |
2443| `reason` | Alasan penolakan. Untuk putusan pengklasifikasi, di sebagian besar sesi alasan ini menyebutkan aturan yang cocok dalam tanda kurung siku, seperti `[Data Exfiltration]`; lihat [Meninjau penolakan](/docs/id/auto-mode-config#review-denials) untuk bentuk lainnya. Untuk [penolakan tanpa putusan](#permissiondenied-decision-control), alasan diawali dengan `Auto mode could not evaluate this action and is blocking it for safety`. Untuk penolakan karena model pengklasifikasi tidak tersedia, alasannya adalah teks tetap `Classifier unavailable` |2442| `reason` | Alasan penolakan. Untuk putusan pengklasifikasi, di sebagian besar sesi berisi nama aturan yang cocok dalam kurung siku, seperti `[Data Exfiltration]`; lihat [Meninjau penolakan](/docs/id/auto-mode-config#review-denials) untuk bentuk lainnya. Untuk [penolakan tanpa putusan](#permissiondenied-decision-control), diawali dengan `Auto mode could not evaluate this action and is blocking it for safety`. Untuk penolakan karena model pengklasifikasi tidak tersedia, berisi teks tetap `Classifier unavailable` |
2444 2443
2445<h4 id="permissiondenied-decision-control">2444<h4 id="permissiondenied-decision-control">
2446 Kontrol keputusan PermissionDenied2445 Kontrol keputusan PermissionDenied
2447</h4>2446</h4>
2448 2447
2449Hook PermissionDenied dapat memberi tahu model bahwa ia boleh mencoba ulang panggilan tool yang ditolak. Kembalikan objek JSON dengan `hookSpecificOutput.retry` diatur ke `true`:2448Hook PermissionDenied dapat memberi tahu model bahwa ia boleh mencoba ulang panggilan tool yang ditolak. Kembalikan objek JSON dengan `hookSpecificOutput.retry` disetel ke `true`:
2450 2449
2451```json theme={null}2450```json theme={null}
2452{2451{
2459 2458
2460Ketika `retry` bernilai `true`, Claude Code menambahkan pesan ke percakapan yang memberi tahu model bahwa ia boleh mencoba ulang panggilan tool. Claude Code tidak membatalkan penolakan itu sendiri. Jika hook Anda tidak mengembalikan JSON, atau mengembalikan `retry: false`, penolakan tetap berlaku dan model menerima pesan penolakan asli.2459Ketika `retry` bernilai `true`, Claude Code menambahkan pesan ke percakapan yang memberi tahu model bahwa ia boleh mencoba ulang panggilan tool. Claude Code tidak membatalkan penolakan itu sendiri. Jika hook Anda tidak mengembalikan JSON, atau mengembalikan `retry: false`, penolakan tetap berlaku dan model menerima pesan penolakan asli.
2461 2460
2462Claude Code mengabaikan `retry: true` ketika pengklasifikasi tidak menghasilkan [putusan atas tindakan tersebut](/docs/id/errors#auto-mode-cannot-determine-the-safety-of-an-action): responsnya tidak dapat di-parse, atau pemeriksaan keamanan yang terpisah dari auto mode menolak permintaan pengklasifikasi itu sendiri. Untuk penolakan tersebut, Claude Code sudah memberi tahu model dalam pesan penolakan apakah harus mencoba ulang nanti atau melanjutkan.2461Claude Code mengabaikan `retry: true` ketika pengklasifikasi [tidak menghasilkan putusan atas tindakan tersebut](/docs/id/errors#auto-mode-cannot-determine-the-safety-of-an-action): responsnya tidak dapat di-parse, atau pemeriksaan keamanan yang terpisah dari auto mode menolak permintaan pengklasifikasi itu sendiri. Untuk penolakan tersebut, Claude Code sudah memberi tahu model dalam pesan penolakan apakah harus mencoba ulang nanti atau melanjutkan.
2463 2462
2464<h3 id="notification">2463<h3 id="notification">
2465 Notification2464 Notification
2466</h3>2465</h3>
2467 2466
2468Berjalan ketika Claude Code mengirim notifikasi. Mencocokkan berdasarkan jenis notifikasi. Hilangkan matcher untuk menjalankan hook untuk semua jenis notifikasi.2467Berjalan ketika Claude Code mengirim notifikasi. Mencocokkan jenis notifikasi. Hilangkan matcher untuk menjalankan hook untuk semua jenis notifikasi.
2469 2468
2470Anda menerima event hook ini bahkan ketika notifikasi desktop dimatikan: pengaturan `preferredNotifChannel`, termasuk `notifications_disabled`, hanya mengubah cara Anda diberi tahu, bukan apakah hook Anda berjalan.2469Anda menerima event hook ini bahkan ketika notifikasi desktop dimatikan: pengaturan `preferredNotifChannel`, termasuk `notifications_disabled`, hanya mengubah cara Anda diberi peringatan, bukan apakah hook Anda berjalan.
2471 2470
2472| Matcher | Kapan dipicu |2471| Matcher | Kapan dipicu |
2473| :- | :- |2472| :- | :- |
2480| `elicitation_response` | Respons elicitation MCP dikirim kembali ke server |2479| `elicitation_response` | Respons elicitation MCP dikirim kembali ke server |
2481| `agent_needs_input` | Sesi latar belakang mulai menunggu input Anda saat [agent view](/docs/id/agent-view) terbuka di terminal. Juga dipicu ketika sesi terminal menampilkan kepada Anda [pertanyaan penyiapan terminal dari rekan tim agent](/docs/id/agent-teams#choose-a-display-mode) atau pemberitahuan auto mode tentang [biaya permintaan pengklasifikasi](/docs/id/auto-mode-classifier-billing) dan Anda belum mengetik selama sekitar enam detik |2480| `agent_needs_input` | Sesi latar belakang mulai menunggu input Anda saat [agent view](/docs/id/agent-view) terbuka di terminal. Juga dipicu ketika sesi terminal menampilkan kepada Anda [pertanyaan penyiapan terminal dari rekan tim agent](/docs/id/agent-teams#choose-a-display-mode) atau pemberitahuan auto mode tentang [biaya permintaan pengklasifikasi](/docs/id/auto-mode-classifier-billing) dan Anda belum mengetik selama sekitar enam detik |
2482| `agent_completed` | Sesi latar belakang selesai atau gagal. Hanya dipicu saat [agent view](/docs/id/agent-view) terbuka di terminal |2481| `agent_completed` | Sesi latar belakang selesai atau gagal. Hanya dipicu saat [agent view](/docs/id/agent-view) terbuka di terminal |
2483| `quota_auto_resume_fired` | Claude Code melanjutkan tugas Anda setelah batas penggunaan claude.ai menjedanya: pada saat reset, atau lebih cepat ketika sesuatu yang Anda lakukan di Claude Code selama menunggu, seperti menambahkan kredit penggunaan, meningkatkan paket, atau berganti model, membuat penggunaan tersedia kembali, dengan [pengecualian pengaturan model](/docs/id/interactive-mode#wait-for-a-usage-limit-to-reset) |2482| `quota_auto_resume_fired` | Claude Code melanjutkan tugas Anda setelah batas penggunaan claude.ai menjedanya: pada saat reset, atau lebih cepat ketika sesuatu yang Anda lakukan di Claude Code selama menunggu, seperti menambahkan kredit penggunaan, meningkatkan paket Anda, atau berpindah model, membuat penggunaan tersedia kembali, dengan [pengecualian pengaturan model](/docs/id/interactive-mode#wait-for-a-usage-limit-to-reset) |
2484| `quota_auto_resume_stale` | Batas penggunaan claude.ai di-reset saat komputer Anda dalam mode tidur selama lebih dari sekitar 30 menit. Claude Code menunggu Anda menekan `Enter` alih-alih melanjutkan. Setelah tidur yang lebih singkat, Claude Code melanjutkan dan memicu `quota_auto_resume_fired` sebagai gantinya |2483| `quota_auto_resume_stale` | Batas penggunaan claude.ai di-reset saat komputer Anda dalam mode tidur selama lebih dari sekitar 30 menit. Claude Code menunggu Anda menekan `Enter` alih-alih melanjutkan. Setelah tidur yang lebih singkat, Claude Code melanjutkan dan memicu `quota_auto_resume_fired` sebagai gantinya |
2485| `quota_auto_resume_disabled` | Claude Code mengakhiri penantiannya terhadap batas penggunaan claude.ai tanpa melanjutkan tugas Anda: [`autoContinueAtUsageLimit`](/docs/id/settings-reference#autocontinueatusagelimit) dimatikan atau waktu reset bergeser lebih dari 24 jam selama penantian yang dimulai Claude Code sendiri, tugas yang dilanjutkan terus mencapai batas, atau kelanjutan diblokir sebelum mencapai model. Tidak dipicu ketika Anda menekan `Esc` atau `Ctrl+C`, atau memilih **Don't continue automatically** |2484| `quota_auto_resume_disabled` | Claude Code mengakhiri penantiannya atas batas penggunaan claude.ai tanpa melanjutkan tugas Anda: [`autoContinueAtUsageLimit`](/docs/id/settings-reference#autocontinueatusagelimit) dimatikan atau reset bergeser lebih dari 24 jam ke depan selama penantian yang dimulai Claude Code sendiri, tugas yang dilanjutkan terus mencapai batas, atau kelanjutan diblokir sebelum mencapai model. Tidak dipicu ketika Anda menekan `Esc` atau `Ctrl+C`, atau memilih **Don't continue automatically** |
2486 2485
2487Jenis `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau yang lebih baru.2486Jenis `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau lebih baru.
2488 2487
2489Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau yang lebih baru.2488Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau lebih baru.
2490 2489
2491`agent_needs_input` untuk pertanyaan penyiapan terminal dari rekan tim memerlukan Claude Code v2.1.248 atau yang lebih baru.2490`agent_needs_input` untuk pertanyaan penyiapan terminal dari rekan tim memerlukan Claude Code v2.1.248 atau lebih baru.
2492 2491
2493<Note>2492<Note>
2494 Jenis `permission_prompt`, `idle_prompt`, `elicitation_dialog`, dan `elicitation_url_dialog` berbagi pengaturan waktu dengan notifikasi desktop, sehingga dalam sesi terminal Anda hanya melihatnya ketika Anda tampak sedang tidak berada di depan terminal:2493 Jenis `permission_prompt`, `idle_prompt`, `elicitation_dialog`, dan `elicitation_url_dialog` berbagi waktu yang sama dengan notifikasi desktop, sehingga dalam sesi terminal Anda hanya melihatnya ketika Anda tampak sedang tidak berada di terminal:
2495 2494
2496 * Harapkan `permission_prompt` setelah Anda tidak mengetik selama sekitar enam detik. Timer dimulai ketika permintaan izin muncul, dan setiap ketukan tombol menundanya. Untuk menjalankan hook segera ketika Claude meminta izin untuk menggunakan tool, gunakan [PermissionRequest](#permissionrequest) sebagai gantinya.2495 * Harapkan `permission_prompt` setelah Anda tidak mengetik selama sekitar enam detik. Timer dimulai saat permintaan izin muncul, dan setiap penekanan tombol menundanya. Untuk menjalankan hook segera ketika Claude meminta izin untuk menggunakan tool, gunakan [PermissionRequest](#permissionrequest) sebagai gantinya.
2497 * Harapkan `idle_prompt` sekitar 60 detik setelah Claude selesai merespons, dan hanya jika Anda belum mengetik sejak itu serta tidak ada agent latar belakang, seperti [subagent](/docs/id/sub-agents) latar belakang, yang masih berjalan. Claude Code tidak mengirim `idle_prompt` saat menunggu batas penggunaan claude.ai di-reset. Ketika penantian berakhir dengan sendirinya, salah satu jenis `quota_auto_resume_*` dipicu sebagai gantinya.2496 * Harapkan `idle_prompt` sekitar 60 detik setelah Claude selesai merespons, dan hanya jika Anda belum mengetik sejak itu dan tidak ada agent latar belakang, seperti [subagent](/docs/id/sub-agents) latar belakang, yang masih berjalan. Claude Code tidak mengirim `idle_prompt` saat menunggu batas penggunaan claude.ai di-reset. Ketika penantian berakhir dengan sendirinya, salah satu jenis `quota_auto_resume_*` dipicu sebagai gantinya.
2498 * Harapkan `elicitation_dialog` untuk formulir elicitation, atau `elicitation_url_dialog` untuk permintaan URL browser, setelah Anda tidak mengetik selama sekitar enam detik. Keduanya berbagi batas enam detik yang sama dengan `permission_prompt`: timer dimulai ketika dialog muncul, dan setiap ketukan tombol menundanya.2497 * Harapkan `elicitation_dialog` untuk formulir elicitation, atau `elicitation_url_dialog` untuk permintaan URL browser, setelah Anda tidak mengetik selama sekitar enam detik. Keduanya berbagi batas enam detik yang sama dengan `permission_prompt`: timer dimulai saat dialog muncul, dan setiap penekanan tombol menundanya.
2499 2498
2500 Permintaan izin atau elicitation yang tiba saat dialog lain sedang tampil di layar tetap menggunakan batas enam detik yang sama, dihitung sejak permintaan tiba. Notifikasinya dapat sampai kepada Anda saat permintaan masih menunggu di belakang dialog yang terbuka.2499 Permintaan izin atau elicitation yang tiba saat dialog lain sedang tampil di layar tetap menggunakan batas enam detik yang sama, dihitung sejak permintaan tiba. Notifikasinya dapat sampai kepada Anda saat permintaan tersebut masih menunggu di belakang dialog yang terbuka.
2501</Note>2500</Note>
2502 2501
2503Claude Code mengatur waktu `permission_prompt` secara berbeda dalam sesi di mana Claude Code mengirim permintaan izin ke [callback `canUseTool`](/docs/id/agent-sdk/user-input) milik Agent SDK, yang merupakan cara Claude Desktop dan ekstensi VS Code meng-host Claude Code:2502Claude Code mengatur waktu `permission_prompt` secara berbeda dalam sesi di mana Claude Code mengirim permintaan izin ke [callback `canUseTool`](/docs/id/agent-sdk/user-input) milik Agent SDK, yaitu cara Claude Desktop dan ekstensi VS Code meng-host Claude Code:
2504 2503
2505* Harapkan `permission_prompt` sekitar enam detik setelah Claude meminta izin. Claude Code tidak menundanya saat Anda mengetik.2504* Harapkan `permission_prompt` sekitar enam detik setelah Claude meminta izin. Claude Code tidak menundanya saat Anda mengetik.
2506* Jika Anda atau hook [PermissionRequest](#permissionrequest) menjawab lebih cepat, Claude Code tidak menjalankan `permission_prompt`.2505* Jika Anda atau hook [PermissionRequest](#permissionrequest) menjawab lebih cepat, Claude Code tidak menjalankan `permission_prompt`.
2507* Atur [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/id/env-vars) ke `1` untuk mematikan `permission_prompt` dalam sesi-sesi ini.2506* Setel [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/id/env-vars) ke `1` untuk mematikan `permission_prompt` dalam sesi-sesi ini.
2508 2507
2509Sebelum v2.1.233, `permission_prompt` tidak dipicu dalam sesi-sesi ini.2508Sebelum v2.1.233, `permission_prompt` tidak dipicu dalam sesi-sesi ini.
2510 2509
2511Gunakan matcher terpisah untuk menjalankan handler yang berbeda tergantung pada jenis notifikasi. Konfigurasi ini memicu skrip peringatan khusus izin ketika Claude membutuhkan persetujuan izin dan notifikasi yang berbeda ketika Claude sedang idle:2510Gunakan matcher terpisah untuk menjalankan handler yang berbeda tergantung pada jenis notifikasi. Konfigurasi ini memicu skrip peringatan khusus izin ketika Claude membutuhkan persetujuan izin dan notifikasi berbeda ketika Claude menganggur:
2512 2511
2513```json theme={null}2512```json theme={null}
2514{2513{
2541 Input Notification2540 Input Notification
2542</h4>2541</h4>
2543 2542
2544Selain [field input umum](#common-input-fields), hook Notification menerima `message` dengan teks notifikasi, `title` opsional, dan `notification_type` yang menunjukkan jenis mana yang dipicu.2543Selain [field input umum](#common-input-fields), hook Notification menerima `message` berisi teks notifikasi, `title` opsional, dan `notification_type` yang menunjukkan jenis mana yang dipicu.
2545 2544
2546```json theme={null}2545```json theme={null}
2547{2546{
2561 SubagentStart2560 SubagentStart
2562</h3>2561</h3>
2563 2562
2564Berjalan ketika Claude memunculkan subagent dengan tool Agent, ketika Claude [melanjutkan subagent](/docs/id/sub-agents#resume-subagents), dan setiap kali rekan tim [tim agent](/docs/id/agent-teams) in-process menangani pesan baru. Mendukung matcher untuk memfilter berdasarkan nama jenis agent. Untuk agent bawaan, ini adalah nama agent seperti `general-purpose`, `Explore`, atau `Plan`. Untuk [subagent kustom](/docs/id/sub-agents), ini adalah field `name` dari frontmatter agent, bukan nama file.2563Berjalan ketika Claude memunculkan subagent dengan tool Agent, ketika Claude [melanjutkan subagent](/docs/id/sub-agents#resume-subagents), dan setiap kali rekan tim [tim agent](/docs/id/agent-teams) dalam proses menangani pesan baru. Mendukung matcher untuk memfilter berdasarkan nama jenis agent. Untuk agent bawaan, ini adalah nama agent seperti `general-purpose`, `Explore`, atau `Plan`. Untuk [subagent kustom](/docs/id/sub-agents), ini adalah field `name` dari frontmatter agent, bukan nama file.
2565 2564
2566Untuk subagent yang disertakan oleh [plugin](/docs/id/plugins/overview), jenis agent adalah pengidentifikasi dengan cakupan plugin seperti `my-plugin:reviewer`, bukan nama frontmatter polos. Titik dua menempatkan nama dengan cakupan plugin pada jalur ekspresi reguler, jadi jangkarkan matcher dengan `^` dan `$` untuk pencocokan persis: `^my-plugin:reviewer$`.2565Untuk subagent yang disertakan oleh [plugin](/docs/id/plugins/overview), jenis agent adalah pengenal dengan cakupan plugin seperti `my-plugin:reviewer`, bukan nama frontmatter polos. Titik dua menempatkan nama dengan cakupan plugin pada jalur regular expression, jadi jangkarkan matcher dengan `^` dan `$` untuk pencocokan persis: `^my-plugin:reviewer$`.
2567 2566
2568<h4 id="subagentstart-input">2567<h4 id="subagentstart-input">
2569 Input SubagentStart2568 Input SubagentStart
2570</h4>2569</h4>
2571 2570
2572Selain [field input umum](#common-input-fields), hook SubagentStart menerima `agent_id` dengan pengidentifikasi unik untuk subagent dan `agent_type` dengan nama agent yang difilter oleh matcher.2571Selain [field input umum](#common-input-fields), hook SubagentStart menerima `agent_id` berisi pengenal unik untuk subagent dan `agent_type` berisi nama agent yang difilter oleh matcher.
2573 2572
2574```json theme={null}2573```json theme={null}
2575{2574{
2582}2581}
2583```2582```
2584 2583
2585Hook SubagentStart tidak dapat memblokir pembuatan subagent, tetapi dapat menyisipkan konteks ke dalam subagent. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan:2584Hook SubagentStart tidak dapat memblokir pembuatan subagent, tetapi dapat menyuntikkan konteks ke dalam subagent. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan:
2586 2585
2587| Field | Deskripsi |2586| Field | Deskripsi |
2588| :- | :- |2587| :- | :- |
2597}2596}
2598```2597```
2599 2598
2600Ketika hook berjalan lagi untuk subagent yang sama, Claude Code menyisipkan konteks yang dikembalikan hanya ketika konteks subagent belum memuat salinan dari proses sebelumnya. Salinan yang disisipkan saat peluncuran tetap di tempatnya, sehingga [prompt cache](/docs/id/prompt-caching#subagents-and-the-cache) subagent tetap utuh. Setelah [auto-compaction](/docs/id/sub-agents#auto-compaction) membuang salinan tersebut, Claude Code menyisipkan kembali konteks dari proses berikutnya.2599Ketika hook berjalan lagi untuk subagent yang sama, Claude Code menyuntikkan konteks yang dikembalikan hanya jika konteks subagent belum memuat salinan dari eksekusi sebelumnya. Salinan yang disuntikkan saat peluncuran tetap di tempatnya, sehingga [prompt cache](/docs/id/prompt-caching#subagents-and-the-cache) subagent tetap utuh. Setelah [auto-compaction](/docs/id/sub-agents#auto-compaction) membuang salinan tersebut, Claude Code menyuntikkan konteks dari eksekusi berikutnya lagi.
2601 2600
2602<h3 id="subagentstop">2601<h3 id="subagentstop">
2603 SubagentStop2602 SubagentStop
2604</h3>2603</h3>
2605 2604
2606Berjalan ketika subagent Claude Code telah selesai merespons. Mencocokkan berdasarkan jenis agent, dengan nilai yang sama seperti SubagentStart.2605Berjalan ketika subagent Claude Code selesai merespons. Mencocokkan jenis agent, dengan nilai yang sama seperti SubagentStart.
2607 2606
2608<h4 id="subagentstop-input">2607<h4 id="subagentstop-input">
2609 Input SubagentStop2608 Input SubagentStop
2610</h4>2609</h4>
2611 2610
2612Selain [field input umum](#common-input-fields), hook SubagentStop menerima `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, dan `last_assistant_message`. Field `agent_type` adalah nilai yang digunakan untuk pemfilteran matcher. `transcript_path` adalah transkrip sesi utama, sedangkan `agent_transcript_path` adalah transkrip milik subagent sendiri yang disimpan dalam folder bertingkat `subagents/`. Field `last_assistant_message` berisi konten teks dari respons akhir subagent, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip.2611Selain [field input umum](#common-input-fields), hook SubagentStop menerima `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, dan `last_assistant_message`. Field `agent_type` adalah nilai yang digunakan untuk pemfilteran matcher. `transcript_path` adalah transkrip sesi utama, sedangkan `agent_transcript_path` adalah transkrip milik subagent sendiri yang disimpan dalam folder `subagents/` bersarang. Field `last_assistant_message` berisi konten teks dari respons akhir subagent, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip.
2613 2612
2614Tidak setiap event SubagentStop berasal dari subagent yang dimunculkan Claude. Claude Code juga menjalankan agent internal untuk beberapa fiturnya sendiri, seperti [saran prompt](/docs/id/interactive-mode#prompt-suggestions) dan [pertanyaan sampingan `/btw`](/docs/id/interactive-mode#side-questions-with-%2Fbtw), dan SubagentStop juga dipicu ketika salah satunya selesai. Untuk event tersebut, `agent_type` adalah nama agent yang dijalankan oleh sesi itu sendiri, seperti yang diatur dengan [`--agent`](/docs/id/cli-reference#cli-flags) atau [pengaturan `agent`](/docs/id/settings-reference#agent), dan berupa string kosong ketika sesi berjalan tanpanya.2613Tidak setiap event SubagentStop berasal dari subagent yang dimunculkan Claude. Claude Code juga menjalankan agent internal untuk beberapa fiturnya sendiri, seperti [saran prompt](/docs/id/interactive-mode#prompt-suggestions) dan [pertanyaan sampingan `/btw`](/docs/id/interactive-mode#side-questions-with-%2Fbtw), dan SubagentStop juga dipicu ketika salah satunya selesai. Untuk event tersebut, `agent_type` adalah nama agent yang dijalankan oleh sesi itu sendiri, seperti yang disetel dengan [`--agent`](/docs/id/cli-reference#cli-flags) atau [pengaturan `agent`](/docs/id/settings-reference#agent), dan berupa string kosong ketika sesi berjalan tanpa agent tersebut.
2615 2614
2616`matcher` yang menyebutkan jenis agent tidak cocok dengan `agent_type` kosong. Hook yang matcher-nya dihilangkan, `""`, atau `"*"`, atau berupa ekspresi reguler yang cocok dengan string kosong, juga berjalan untuk event dengan `agent_type` kosong.2615`matcher` yang menyebutkan jenis agent tidak cocok dengan `agent_type` kosong. Hook yang matcher-nya dihilangkan, `""`, atau `"*"`, atau berupa regular expression yang cocok dengan string kosong, juga berjalan untuk event dengan `agent_type` kosong.
2617 2616
2618Pada Claude Code v2.1.271 atau yang lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference) mengirimkan laporannya melalui tool tersebut sebelum berhenti. Field `last_assistant_message` kemudian memuat teks penutup subagent, jika ada, yang bukan laporan yang dikirimkan. Laporan tersebut adalah input `message` dari panggilan itu, yang diterima hook `PreToolUse` atau `PostToolUse` yang dicocokkan pada `SubagentHandback` sebagai `tool_input.message`.2617Pada Claude Code v2.1.271 atau lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference) menyampaikan laporannya melalui tool tersebut sebelum berhenti. Field `last_assistant_message` kemudian berisi teks penutup subagent, jika ada, yang bukan laporan yang disampaikan. Laporan tersebut adalah input `message` dari panggilan itu, yang diterima sebagai `tool_input.message` oleh hook `PreToolUse` atau `PostToolUse` yang dicocokkan pada `SubagentHandback`.
2619 2618
2620Hook SubagentStop juga menerima array `background_tasks` dan `session_crons` yang dijelaskan di [Input Stop](#stop-input). Kedua array tersebut dicakup ke sesi induk, bukan subagent.2619Hook SubagentStop juga menerima array `background_tasks` dan `session_crons` yang dijelaskan di bagian [Input Stop](#stop-input). Kedua array memiliki cakupan sesi induk, bukan subagent.
2621 2620
2622```json theme={null}2621```json theme={null}
2623{2622{
2636}2635}
2637```2636```
2638 2637
2639Hook SubagentStop menggunakan format kontrol keputusan yang sama seperti [hook Stop](#stop-decision-control), termasuk `hookSpecificOutput.additionalContext` dengan `hookEventName` diatur ke `"SubagentStop"`, untuk umpan balik non-error yang membuat subagent tetap berjalan. Mengembalikan `decision: "block"` dengan `reason` membuat subagent tetap berjalan dan mengirimkan `reason` ke subagent sebagai instruksi berikutnya. Hook yang memblokir dengan keluar menggunakan exit 2 mengirimkan pesan stderr-nya dengan cara yang sama. Untuk menyisipkan konteks ke sesi induk setelah subagent kembali, gunakan hook [`PostToolUse`](#posttooluse) pada tool `Agent` sebagai gantinya.2638Hook SubagentStop menggunakan format kontrol keputusan yang sama seperti [hook Stop](#stop-decision-control), termasuk `hookSpecificOutput.additionalContext` dengan `hookEventName` disetel ke `"SubagentStop"`, untuk umpan balik non-error yang membuat subagent tetap berjalan. Mengembalikan `decision: "block"` dengan `reason` membuat subagent tetap berjalan dan menyampaikan `reason` kepada subagent sebagai instruksi berikutnya. Hook yang memblokir dengan exit 2 menyampaikan pesan stderr-nya dengan cara yang sama. Untuk menyuntikkan konteks ke sesi induk setelah subagent kembali, gunakan hook [`PostToolUse`](#posttooluse) pada tool `Agent` sebagai gantinya.
2640 2639
2641<h3 id="taskcreated">2640<h3 id="taskcreated">
2642 TaskCreated2641 TaskCreated
2643</h3>2642</h3>
2644 2643
2645Berjalan ketika sebuah task sedang dibuat melalui tool `TaskCreate`. Gunakan ini untuk menerapkan konvensi penamaan, mewajibkan deskripsi task, atau mencegah task tertentu dibuat. Dalam [sesi tanpa tool Task](/docs/id/tools-reference#task-tool-availability), event ini tidak dipicu.2644Berjalan ketika tugas sedang dibuat melalui tool `TaskCreate`. Gunakan untuk menegakkan konvensi penamaan, mewajibkan deskripsi tugas, atau mencegah tugas tertentu dibuat. Dalam [sesi tanpa tool Task](/docs/id/tools-reference#task-tool-availability), event ini tidak dipicu.
2646 2645
2647Hook TaskCreated tidak mendukung matcher dan dipicu pada setiap kejadian.2646Hook TaskCreated tidak mendukung matcher dan dipicu pada setiap kejadian.
2648 2647
2668 2667
2669| Field | Deskripsi |2668| Field | Deskripsi |
2670| :- | :- |2669| :- | :- |
2671| `task_id` | Pengidentifikasi task yang sedang dibuat |2670| `task_id` | Pengenal tugas yang sedang dibuat |
2672| `task_subject` | Judul task |2671| `task_subject` | Judul tugas |
2673| `task_description` | Deskripsi terperinci task. Mungkin tidak ada |2672| `task_description` | Deskripsi rinci tugas. Mungkin tidak ada |
2674| `teammate_name` | Nama rekan tim yang membuat task. Mungkin tidak ada |2673| `teammate_name` | Nama rekan tim yang membuat tugas. Mungkin tidak ada |
2675| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |2674| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2675| `agent_id` | Pada event ini, [field input umum](#common-input-fields) ini mengidentifikasi subagent atau [rekan tim dalam proses](/docs/id/agent-teams#choose-a-display-mode) yang membuat tugas. Mungkin tidak ada. Memerlukan Claude Code v2.1.290 atau lebih baru |
2676 2676
2677<h4 id="taskcreated-decision-control">2677<h4 id="taskcreated-decision-control">
2678 Kontrol keputusan TaskCreated2678 Kontrol keputusan TaskCreated
2679</h4>2679</h4>
2680 2680
2681Hook TaskCreated dapat memblokir pembuatan dengan dua cara. Dengan cara mana pun, Claude Code menghapus task dan mengembalikan pesan Anda kepada Claude sebagai error tool. Claude Code mengabaikan `continue: false` dari event ini dan Claude terus bekerja.2681Hook TaskCreated dapat memblokir pembuatan dengan dua cara. Dengan cara mana pun, Claude Code menghapus tugas dan mengembalikan pesan Anda kepada Claude sebagai error tool. Claude Code mengabaikan `continue: false` dari event ini dan Claude tetap bekerja.
2682 2682
2683* **Exit code 2**: Claude Code mengembalikan teks stderr sebagai pesan.2683* **Exit code 2**: Claude Code mengembalikan teks stderr sebagai pesan.
2684* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code mengembalikan `reason` sebagai pesan.2684* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code mengembalikan `reason` sebagai pesan.
2685 2685
2686Contoh ini memblokir task yang subjeknya tidak mengikuti format yang diwajibkan:2686Contoh ini memblokir tugas yang subjeknya tidak mengikuti format yang diwajibkan:
2687 2687
2688```bash theme={null}2688```bash theme={null}
2689#!/bin/bash2689#!/bin/bash
2702 TaskCompleted2702 TaskCompleted
2703</h3>2703</h3>
2704 2704
2705Berjalan ketika sebuah task sedang ditandai sebagai selesai. Ini dipicu dalam dua situasi: ketika agent mana pun secara eksplisit menandai task sebagai selesai melalui tool TaskUpdate, atau ketika rekan tim [tim agent](/docs/id/agent-teams) menyelesaikan gilirannya dengan task yang sedang dikerjakan. Gunakan ini untuk menerapkan kriteria penyelesaian seperti lulus tes atau pemeriksaan lint sebelum task dapat ditutup.2705Berjalan ketika tugas sedang ditandai sebagai selesai. Ini dipicu dalam dua situasi: ketika agent mana pun secara eksplisit menandai tugas sebagai selesai melalui tool TaskUpdate, atau ketika rekan tim [tim agent](/docs/id/agent-teams) menyelesaikan gilirannya dengan tugas yang sedang berlangsung. Gunakan untuk menegakkan kriteria penyelesaian seperti lolos pengujian atau pemeriksaan lint sebelum tugas dapat ditutup.
2706 2706
2707Hook TaskCompleted tidak mendukung matcher dan dipicu pada setiap kejadian.2707Hook TaskCompleted tidak mendukung matcher dan dipicu pada setiap kejadian.
2708 2708
2729 2729
2730| Field | Deskripsi |2730| Field | Deskripsi |
2731| :- | :- |2731| :- | :- |
2732| `task_id` | Pengidentifikasi task yang sedang diselesaikan |2732| `task_id` | Pengenal tugas yang sedang diselesaikan |
2733| `task_subject` | Judul task |2733| `task_subject` | Judul tugas |
2734| `task_description` | Deskripsi terperinci task. Mungkin tidak ada |2734| `task_description` | Deskripsi rinci tugas. Mungkin tidak ada |
2735| `teammate_name` | Nama rekan tim yang menyelesaikan task. Mungkin tidak ada |2735| `teammate_name` | Nama rekan tim yang menyelesaikan tugas. Mungkin tidak ada |
2736| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |2736| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2737| `agent_id` | Pada event ini, [field input umum](#common-input-fields) ini mengidentifikasi subagent atau [rekan tim dalam proses](/docs/id/agent-teams#choose-a-display-mode) yang menyelesaikan tugas. Mungkin tidak ada. Memerlukan Claude Code v2.1.290 atau lebih baru |
2737 2738
2738<h4 id="taskcompleted-decision-control">2739<h4 id="taskcompleted-decision-control">
2739 Kontrol keputusan TaskCompleted2740 Kontrol keputusan TaskCompleted
2740</h4>2741</h4>
2741 2742
2742Hook TaskCompleted mendukung dua cara untuk mengontrol penyelesaian task:2743Hook TaskCompleted mendukung dua cara untuk mengontrol penyelesaian tugas:
2743 2744
2744* **Exit code 2**: task tidak ditandai sebagai selesai dan pesan stderr diumpankan kembali ke model sebagai umpan balik.2745* **Exit code 2**: tugas tidak ditandai sebagai selesai dan pesan stderr diumpankan kembali ke model sebagai umpan balik.
2745* **JSON `{"continue": false, "stopReason": "..."}`**: ketika rekan tim yang menyelesaikan gilirannya memicu event, menghentikan rekan tim sepenuhnya, sesuai dengan perilaku hook `Stop`. `stopReason` ditampilkan kepada pengguna. Ketika tool `TaskUpdate` memicu event, Claude Code mengabaikan `continue: false`; exit code 2 tetap memblokir penyelesaian.2746* **JSON `{"continue": false, "stopReason": "..."}`**: ketika rekan tim yang menyelesaikan gilirannya memicu event, ini menghentikan rekan tim sepenuhnya, sesuai dengan perilaku hook `Stop`. `stopReason` ditampilkan kepada pengguna. Ketika tool `TaskUpdate` memicu event, Claude Code mengabaikan `continue: false`; exit code 2 tetap memblokir penyelesaian.
2746 2747
2747Contoh ini menjalankan tes dan memblokir penyelesaian task jika tes gagal:2748Contoh ini menjalankan pengujian dan memblokir penyelesaian tugas jika pengujian gagal:
2748 2749
2749```bash theme={null}2750```bash theme={null}
2750#!/bin/bash2751#!/bin/bash
2764 Stop2765 Stop
2765</h3>2766</h3>
2766 2767
2767Berjalan ketika agent utama Claude Code telah selesai merespons. Tidak berjalan jika2768Berjalan ketika agent utama Claude Code selesai merespons. Tidak berjalan jika
2768penghentian terjadi karena interupsi pengguna. Error API memicu2769penghentian terjadi karena interupsi pengguna. Error API memicu
2769[StopFailure](#stopfailure) sebagai gantinya.2770[StopFailure](#stopfailure) sebagai gantinya.
2770 2771
2771<Tip>2772<Tip>
2772 Perintah [`/goal`](/docs/id/goal) adalah pintasan bawaan untuk hook Stop berbasis prompt dengan cakupan sesi. Gunakan ini ketika Anda ingin Claude terus bekerja menuju suatu kondisi tanpa menulis konfigurasi hook.2773 Perintah [`/goal`](/docs/id/goal) adalah pintasan bawaan untuk hook Stop berbasis prompt dengan cakupan sesi. Gunakan ketika Anda ingin Claude terus bekerja menuju suatu kondisi tanpa menulis konfigurasi hook.
2773</Tip>2774</Tip>
2774 2775
2775<h4 id="stop-input">2776<h4 id="stop-input">
2776 Input Stop2777 Input Stop
2777</h4>2778</h4>
2778 2779
2779Selain [field input umum](#common-input-fields), hook Stop menerima `stop_hook_active`, `last_assistant_message`, `background_tasks`, dan `session_crons`. Field `stop_hook_active` bernilai `true` ketika Claude Code sudah melanjutkan sebagai akibat dari hook stop. Periksa nilai ini atau proses transkrip untuk menghindari pemblokiran pada kondisi yang tidak akan pernah terselesaikan.2780Selain [field input umum](#common-input-fields), hook Stop menerima `stop_hook_active`, `last_assistant_message`, `background_tasks`, dan `session_crons`. Field `stop_hook_active` bernilai `true` ketika Claude Code sudah melanjutkan sebagai akibat dari stop hook. Periksa nilai ini atau proses transkrip untuk menghindari pemblokiran pada kondisi yang tidak akan pernah terselesaikan.
2780 2781
2781Claude Code menerapkan batas 8 kelanjutan berturut-turut: setelah hook stop melanjutkan giliran delapan kali berturut-turut, Claude Code menimpa blokir berikutnya dan mengakhiri giliran. Hitungan kelanjutan berturut-turut di-reset setiap kali Claude memanggil tool. Untuk menaikkan batas, atur [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/id/env-vars).2782Claude Code menerapkan batas 8 kelanjutan berturut-turut: setelah stop hook melanjutkan giliran delapan kali berturut-turut, Claude Code menimpa blokir berikutnya dan mengakhiri giliran. Hitungan kelanjutan berturut-turut di-reset setiap kali Claude memanggil tool. Untuk menaikkan batas, setel [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/id/env-vars).
2782 2783
2783Field `last_assistant_message` berisi konten teks dari respons akhir Claude, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip. Untuk hook yang bertindak atas giliran yang baru selesai, seperti hook baca-nyaring atau notifikasi, gunakan field ini alih-alih membaca `transcript_path`: file transkrip tidak dijamin menyertakan pesan akhir pada saat Stop di semua versi.2784Field `last_assistant_message` berisi konten teks dari respons akhir Claude, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip. Untuk hook yang bertindak pada giliran yang baru selesai, seperti hook pembacaan nyaring atau notifikasi, gunakan field ini alih-alih membaca `transcript_path`: file transkrip tidak dijamin menyertakan pesan akhir pada saat Stop di semua versi.
2784 2785
2785Array `background_tasks` dan `session_crons` memungkinkan hook membedakan antara "sesi sudah selesai" dan "sesi dijeda menunggu pekerjaan latar belakang untuk membangunkannya kembali". Kedua array ada ketika registri task dapat dijangkau dan kosong ketika tidak ada yang sedang berjalan atau dijadwalkan.2786Array `background_tasks` dan `session_crons` memungkinkan hook membedakan "sesi sudah selesai" dari "sesi dijeda menunggu pekerjaan latar belakang untuk membangunkannya kembali". Kedua array ada ketika registri tugas dapat dijangkau dan kosong ketika tidak ada yang sedang berjalan atau dijadwalkan.
2786 2787
2787Setiap entri dalam `background_tasks` menjelaskan satu task yang sedang berjalan dan menggunakan field berikut:2788Setiap entri dalam `background_tasks` menjelaskan satu tugas yang sedang berjalan dan menggunakan field berikut:
2788 2789
2789| Field | Deskripsi |2790| Field | Deskripsi |
2790| :- | :- |2791| :- | :- |
2791| `id` | Pengidentifikasi task |2792| `id` | Pengenal tugas |
2792| `type` | Label jenis task yang mudah dibaca seperti `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, atau `MCP task`. Setiap label mengidentifikasi fitur Claude Code mana yang membuat task tersebut. Kembali ke diskriminan mentah untuk jenis yang tidak dikenali |2793| `type` | Label jenis tugas yang mudah dibaca seperti `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, atau `MCP task`. Setiap label mengidentifikasi fitur Claude Code mana yang membuat tugas tersebut. Kembali ke diskriminan mentah untuk jenis yang tidak dikenali |
2793| `status` | Status task saat ini |2794| `status` | Status tugas saat ini |
2794| `description` | Deskripsi teks bebas, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` di dalam string ketika dipotong |2795| `description` | Deskripsi teks bebas, dibatasi 1000 karakter dengan penanda `… [+N chars]` di dalam string ketika dipotong |
2795| `command` | Baris perintah shell, dibatasi hingga 1000 karakter. Hanya ada untuk task `shell` |2796| `command` | Baris perintah shell, dibatasi 1000 karakter. Hanya ada untuk tugas `shell` |
2796| `agent_type` | Nama jenis subagent. Hanya ada untuk task `subagent` |2797| `agent_type` | Nama jenis subagent. Hanya ada untuk tugas `subagent` |
2797| `server` | Nama server MCP. Hanya ada untuk task `monitor` dan `MCP task` |2798| `server` | Nama server MCP. Hanya ada untuk tugas `monitor` dan `MCP task` |
2798| `tool` | Nama tool MCP. Hanya ada untuk task `monitor` dan `MCP task` |2799| `tool` | Nama tool MCP. Hanya ada untuk tugas `monitor` dan `MCP task` |
2799| `name` | Nama workflow. Hanya ada untuk task `workflow` |2800| `name` | Nama workflow. Hanya ada untuk tugas `workflow` |
2800 2801
2801Setiap entri dalam `session_crons` menjelaskan satu wakeup terjadwal dengan cakupan sesi, yang bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:2802Setiap entri dalam `session_crons` menjelaskan satu wakeup terjadwal dengan cakupan sesi, yang bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:
2802 2803
2803| Field | Deskripsi |2804| Field | Deskripsi |
2804| :- | :- |2805| :- | :- |
2805| `id` | Pengidentifikasi task cron |2806| `id` | Pengenal tugas cron |
2806| `schedule` | Ekspresi cron, misalnya `0 9 * * 1-5` |2807| `schedule` | Ekspresi cron, misalnya `0 9 * * 1-5` |
2807| `recurring` | `false` untuk wakeup sekali jalan yang jadwalnya mengodekan satu waktu pemicu, `true` untuk task yang dipicu ulang pada setiap kecocokan |2808| `recurring` | `false` untuk wakeup sekali jalan yang jadwalnya mengodekan satu waktu pemicuan, `true` untuk tugas yang dipicu ulang pada setiap kecocokan |
2808| `prompt` | Prompt yang dikirim ketika cron dipicu, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` yang sama |2809| `prompt` | Prompt yang dikirim ketika cron dipicu, dibatasi 1000 karakter dengan penanda `… [+N chars]` yang sama |
2809 2810
2810Contoh ini menunjukkan input Stop dengan satu task shell yang sedang berjalan dan satu cron berulang:2811Contoh ini menunjukkan input Stop dengan satu tugas shell yang sedang berjalan dan satu cron berulang:
2811 2812
2812```json theme={null}2813```json theme={null}
2813{2814{
2847| Field | Deskripsi |2848| Field | Deskripsi |
2848| :- | :- |2849| :- | :- |
2849| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |2850| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |
2850| `reason` | Wajib ketika `decision` bernilai `"block"`. Memberi tahu Claude mengapa ia harus melanjutkan |2851| `reason` | Wajib ketika `decision` adalah `"block"`. Memberi tahu Claude mengapa ia harus melanjutkan |
2851| `hookSpecificOutput.additionalContext` | Umpan balik non-error untuk Claude. Percakapan berlanjut sehingga Claude dapat menindaklanjutinya, tetapi tidak seperti `decision: "block"`, umpan balik ini ditampilkan dalam transkrip sebagai umpan balik hook, bukan error hook |2852| `hookSpecificOutput.additionalContext` | Umpan balik non-error untuk Claude. Percakapan berlanjut sehingga Claude dapat menindaklanjutinya, tetapi tidak seperti `decision: "block"`, ini ditampilkan di transkrip sebagai umpan balik hook, bukan error hook |
2852 2853
2853Hook yang memblokir dengan keluar menggunakan exit 2 dirutekan dengan cara yang sama seperti `reason`: Claude menerima pesan stderr sebagai penjelasan mengapa ia harus melanjutkan.2854Hook yang memblokir dengan exit 2 diarahkan dengan cara yang sama seperti `reason`: Claude menerima pesan stderr sebagai penjelasan mengapa ia harus melanjutkan.
2854 2855
2855```json theme={null}2856```json theme={null}
2856{2857{
2859}2860}
2860```2861```
2861 2862
2862Gunakan `additionalContext` ketika hook bekerja sesuai rancangan dan memberikan panduan kepada Claude, seperti "jalankan test suite sebelum selesai". Ini membuat percakapan tetap berjalan melalui perlindungan loop yang sama seperti `decision: "block"`, yaitu input `stop_hook_active` dan batas 8 kelanjutan berturut-turut, tetapi transkrip melabelinya sebagai `Stop hook feedback` dan tidak ada notifikasi error hook yang ditampilkan:2863Gunakan `additionalContext` ketika hook bekerja sesuai rancangan dan memberikan panduan kepada Claude, seperti "jalankan rangkaian pengujian sebelum selesai". Ini membuat percakapan terus berjalan melalui perlindungan loop yang sama seperti `decision: "block"`, yaitu input `stop_hook_active` dan batas 8 kelanjutan berturut-turut, tetapi transkrip melabelinya `Stop hook feedback` dan tidak ada notifikasi error hook yang ditampilkan:
2863 2864
2864```json theme={null}2865```json theme={null}
2865{2866{
2874 StopFailure2875 StopFailure
2875</h3>2876</h3>
2876 2877
2877Berjalan sebagai pengganti [Stop](#stop) ketika giliran berakhir karena error API. Claude Code mengabaikan output dan exit code hook, kecuali [`terminalSequence`](#emit-terminal-notifications). Gunakan ini untuk mencatat kegagalan, mengirim peringatan, atau mengambil tindakan pemulihan ketika Claude tidak dapat menyelesaikan respons karena rate limit, masalah autentikasi, atau error API lainnya.2878Berjalan sebagai pengganti [Stop](#stop) ketika giliran berakhir karena error API. Claude Code mengabaikan output dan exit code hook, kecuali [`terminalSequence`](#emit-terminal-notifications). Gunakan untuk mencatat kegagalan, mengirim peringatan, atau mengambil tindakan pemulihan ketika Claude tidak dapat menyelesaikan respons karena rate limit, masalah autentikasi, atau error API lainnya.
2878 2879
2879<h4 id="stopfailure-input">2880<h4 id="stopfailure-input">
2880 Input StopFailure2881 Input StopFailure
2886| :- | :- |2887| :- | :- |
2887| `error` | Jenis error: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, atau `unknown` |2888| `error` | Jenis error: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, atau `unknown` |
2888| `error_details` | Detail tambahan tentang error, jika tersedia |2889| `error_details` | Detail tambahan tentang error, jika tersedia |
2889| `last_assistant_message` | Teks error yang dirender dan ditampilkan dalam percakapan. Tidak seperti `Stop` dan `SubagentStop`, di mana field ini memuat output percakapan Claude, untuk `StopFailure` field ini berisi string error API itu sendiri, seperti `"API Error: Rate limit reached"` |2890| `last_assistant_message` | Teks error yang dirender dan ditampilkan dalam percakapan. Tidak seperti `Stop` dan `SubagentStop`, di mana field ini berisi output percakapan Claude, untuk `StopFailure` field ini berisi string error API itu sendiri, seperti `"API Error: Rate limit reached"` |
2890 2891
2891```json theme={null}2892```json theme={null}
2892{2893{
2900}2901}
2901```2902```
2902 2903
2903Hook StopFailure tidak memiliki kontrol keputusan. Hook ini hanya berjalan untuk tujuan notifikasi dan pencatatan log.2904Hook StopFailure tidak memiliki kontrol keputusan. Hook ini hanya berjalan untuk keperluan notifikasi dan logging.
2904 2905
2905<h3 id="teammateidle">2906<h3 id="teammateidle">
2906 TeammateIdle2907 TeammateIdle
2907</h3>2908</h3>
2908 2909
2909Berjalan ketika rekan tim [tim agent](/docs/id/agent-teams) akan menjadi idle setelah menyelesaikan gilirannya. Gunakan ini untuk menerapkan gerbang kualitas sebelum rekan tim berhenti bekerja, seperti mewajibkan pemeriksaan lint yang lulus atau memverifikasi bahwa file output ada.2910Berjalan ketika rekan tim [tim agent](/docs/id/agent-teams) akan menganggur setelah menyelesaikan gilirannya. Gunakan untuk menegakkan gerbang kualitas sebelum rekan tim berhenti bekerja, seperti mewajibkan pemeriksaan lint yang lolos atau memverifikasi bahwa file output ada.
2910 2911
2911Hook TeammateIdle tidak mendukung matcher dan dipicu pada setiap kejadian.2912Hook TeammateIdle tidak mendukung matcher dan dipicu pada setiap kejadian.
2912 2913
2930 2931
2931| Field | Deskripsi |2932| Field | Deskripsi |
2932| :- | :- |2933| :- | :- |
2933| `teammate_name` | Nama rekan tim yang akan menjadi idle |2934| `teammate_name` | Nama rekan tim yang akan menganggur |
2934| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |2935| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2936| `agent_id` | Pada event ini, [field input umum](#common-input-fields) ini mengidentifikasi [rekan tim dalam proses](/docs/id/agent-teams#choose-a-display-mode) yang akan menganggur. Mungkin tidak ada. Memerlukan Claude Code v2.1.290 atau lebih baru |
2935 2937
2936<h4 id="teammateidle-decision-control">2938<h4 id="teammateidle-decision-control">
2937 Kontrol keputusan TeammateIdle2939 Kontrol keputusan TeammateIdle
2939 2941
2940Hook TeammateIdle mendukung dua cara untuk mengontrol perilaku rekan tim:2942Hook TeammateIdle mendukung dua cara untuk mengontrol perilaku rekan tim:
2941 2943
2942* **Exit code 2**: rekan tim menerima pesan stderr sebagai umpan balik dan terus bekerja alih-alih menjadi idle.2944* **Exit code 2**: rekan tim menerima pesan stderr sebagai umpan balik dan terus bekerja alih-alih menganggur.
2943* **JSON `{"continue": false, "stopReason": "..."}`**: menghentikan rekan tim sepenuhnya, sesuai dengan perilaku hook `Stop`. `stopReason` ditampilkan kepada pengguna.2945* **JSON `{"continue": false, "stopReason": "..."}`**: menghentikan rekan tim sepenuhnya, sesuai dengan perilaku hook `Stop`. `stopReason` ditampilkan kepada pengguna.
2944 2946
2945Contoh ini memeriksa bahwa artefak build ada sebelum mengizinkan rekan tim menjadi idle:2947Contoh ini memeriksa bahwa artefak build ada sebelum mengizinkan rekan tim menganggur:
2946 2948
2947```bash theme={null}2949```bash theme={null}
2948#!/bin/bash2950#!/bin/bash
2959 ConfigChange2961 ConfigChange
2960</h3>2962</h3>
2961 2963
2962Berjalan ketika file konfigurasi berubah selama sesi. Gunakan ini untuk mengaudit perubahan pengaturan, menerapkan kebijakan keamanan, atau memblokir modifikasi yang tidak sah pada file konfigurasi.2964Berjalan ketika file konfigurasi berubah selama sesi. Gunakan untuk mengaudit perubahan pengaturan, menegakkan kebijakan keamanan, atau memblokir modifikasi tidak sah pada file konfigurasi.
2963 2965
2964Claude Code menjalankan hook ConfigChange ketika file pengaturan, file kebijakan terkelola, atau file skill berubah. Untuk kebijakan terkelola, Claude Code menjalankannya hanya ketika `managed-settings.json` atau file di `managed-settings.d/` berubah. Claude Code menerapkan [pengaturan yang dikelola server](/docs/id/server-managed-settings) dan perubahan pada preferensi terkelola macOS atau kebijakan registri Windows tanpa menjalankannya. Di WSL dengan [`wslInheritsWindowsSettings`](/docs/id/settings-reference#wslinheritswindowssettings), Claude Code juga menerapkan file pengaturan terkelola sisi Windows yang berubah pada polling kebijakannya tanpa menjalankannya.2966Claude Code menjalankan hook ConfigChange ketika file pengaturan, file kebijakan terkelola, atau file skill berubah. Untuk kebijakan terkelola, Claude Code menjalankannya hanya ketika `managed-settings.json` atau file di `managed-settings.d/` berubah. Claude Code menerapkan [pengaturan yang dikelola server](/docs/id/server-managed-settings) dan perubahan pada preferensi terkelola macOS atau kebijakan registri Windows tanpa menjalankannya. Di WSL dengan [`wslInheritsWindowsSettings`](/docs/id/settings-reference#wslinheritswindowssettings), Claude Code juga menerapkan file pengaturan terkelola sisi Windows yang berubah pada polling kebijakannya tanpa menjalankannya.
2965 2967
2997 Input ConfigChange2999 Input ConfigChange
2998</h4>3000</h4>
2999 3001
3000Selain [field input umum](#common-input-fields), hook ConfigChange menerima `source` dan secara opsional `file_path`. Field `source` menunjukkan jenis konfigurasi mana yang berubah, dan `file_path` menyediakan path ke file spesifik yang dimodifikasi.3002Selain [field input umum](#common-input-fields), hook ConfigChange menerima `source` dan secara opsional `file_path`. Field `source` menunjukkan jenis konfigurasi mana yang berubah, dan `file_path` memberikan path ke file spesifik yang dimodifikasi.
3001 3003
3002```json theme={null}3004```json theme={null}
3003{3005{
3028}3030}
3029```3031```
3030 3032
3031Perubahan `policy_settings` tidak dapat diblokir. Hook tetap dipicu untuk sumber `policy_settings` ketika file pengaturan terkelola di mesin berubah, sehingga Anda dapat menggunakannya untuk mencatat suntingan tersebut, tetapi setiap keputusan pemblokiran diabaikan. Ini memastikan pengaturan yang dikelola perusahaan selalu berlaku. Claude Code tidak menjalankan hook `ConfigChange` ketika [pengaturan yang dikelola server](/docs/id/server-managed-settings) tiba atau diperbarui.3033Perubahan `policy_settings` tidak dapat diblokir. Hook tetap dipicu untuk sumber `policy_settings` ketika file pengaturan terkelola di mesin berubah, sehingga Anda dapat menggunakannya untuk mencatat pengeditan tersebut, tetapi keputusan pemblokiran apa pun diabaikan. Ini memastikan pengaturan yang dikelola perusahaan selalu berlaku. Claude Code tidak menjalankan hook `ConfigChange` ketika [pengaturan yang dikelola server](/docs/id/server-managed-settings) tiba atau diperbarui.
3032 3034
3033Claude Code menindaklanjuti keputusan pemblokiran dari output JSON hook ConfigChange dan membuang `systemMessage` dan `continue`. Perubahan yang diblokir tidak memunculkan pesan apa pun kepada Anda atau Claude, baik Anda memblokir dengan `reason` maupun dengan stderr pada exit 2. Claude Code hanya menulis satu baris ke log debug.3035Claude Code bertindak berdasarkan keputusan pemblokiran dari output JSON hook ConfigChange dan membuang `systemMessage` dan `continue`. Perubahan yang diblokir tidak menampilkan pesan apa pun kepada Anda atau kepada Claude, baik Anda memblokir dengan `reason` maupun dengan stderr pada exit 2. Claude Code hanya menulis satu baris ke log debug.
3034 3036
3035<h3 id="cwdchanged">3037<h3 id="cwdchanged">
3036 CwdChanged3038 CwdChanged
3037</h3>3039</h3>
3038 3040
3039Berjalan ketika perintah shell dalam percakapan utama mengubah direktori kerja, misalnya ketika Claude mengeksekusi perintah `cd`. Gunakan ini untuk bereaksi terhadap perubahan direktori: memuat ulang environment variable, mengaktifkan toolchain khusus proyek, atau menjalankan skrip penyiapan secara otomatis. Berpasangan dengan [FileChanged](#filechanged) untuk alat seperti [direnv](https://direnv.net/) yang mengelola environment per direktori.3041Berjalan ketika perintah shell dalam percakapan utama mengubah direktori kerja, misalnya ketika Claude mengeksekusi perintah `cd`. Gunakan untuk bereaksi terhadap perubahan direktori: memuat ulang environment variable, mengaktifkan toolchain khusus proyek, atau menjalankan skrip penyiapan secara otomatis. Berpasangan dengan [FileChanged](#filechanged) untuk alat seperti [direnv](https://direnv.net/) yang mengelola environment per direktori.
3040 3042
3041Hook CwdChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event CwdChanged selanjutnya, ketika Claude Code menghapusnya.3043Hook CwdChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event CwdChanged berikutnya, saat Claude Code menghapusnya.
3042 3044
3043CwdChanged tidak mendukung matcher dan dipicu pada setiap kejadian.3045CwdChanged tidak mendukung matcher dan dipicu pada setiap kejadian.
3044 3046
3063 Output CwdChanged3065 Output CwdChanged
3064</h4>3066</h4>
3065 3067
3066Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook CwdChanged dapat mengembalikan `watchPaths` untuk mengatur secara dinamis path file mana yang dipantau oleh [FileChanged](#filechanged):3068Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook CwdChanged dapat mengembalikan `watchPaths` untuk secara dinamis menetapkan path file mana yang dipantau oleh [FileChanged](#filechanged):
3067 3069
3068| Field | Deskripsi |3070| Field | Deskripsi |
3069| :- | :- |3071| :- | :- |
3077 DirectoryAdded3079 DirectoryAdded
3078</h3>3080</h3>
3079 3081
3080Berjalan setelah Anda menambahkan direktori kerja di tengah sesi dengan perintah `/add-dir`, atau setelah klien SDK menambahkannya dengan permintaan kontrol `register_repo_root`. Gunakan ini untuk menyiapkan repositori yang baru ditambahkan, misalnya dengan menginstal dependensinya.3082Berjalan setelah Anda menambahkan direktori kerja di tengah sesi dengan perintah `/add-dir`, atau setelah klien SDK menambahkannya dengan permintaan kontrol `register_repo_root`. Gunakan untuk menyiapkan repositori yang baru ditambahkan, misalnya dengan menginstal dependensinya.
3081 3083
3082Claude Code tidak memicu event ini ketika:3084Claude Code tidak memicu event ini ketika:
3083 3085
3084* Anda meneruskan direktori dengan flag startup `--add-dir`; [SessionStart](#sessionstart) mencakup direktori tersebut3086* Anda meneruskan direktori dengan flag startup `--add-dir`; [SessionStart](#sessionstart) mencakup direktori tersebut
3085* Anda menambahkan direktori di tab Workspace `/permissions`3087* Anda menambahkan direktori pada tab Workspace di `/permissions`
3086* Anda menambahkan direktori yang sudah menjadi direktori kerja atau berada di dalamnya3088* Anda menambahkan direktori yang sudah merupakan direktori kerja atau berada di dalamnya
3087 3089
3088Claude Code memicu DirectoryAdded setelah memperbarui status sandbox dan izin, sehingga tool yang di-sandbox sudah melihat direktori baru ketika hook Anda berjalan. Perintah hook itu sendiri berjalan tanpa sandbox.3090Claude Code memicu DirectoryAdded setelah memperbarui status sandbox dan izin, sehingga tool yang di-sandbox sudah melihat direktori baru saat hook Anda berjalan. Perintah hook sendiri berjalan tanpa sandbox.
3089 3091
3090Claude Code tidak menunggu hook: penambahan selesai segera, dan hook berjalan di latar belakang dengan timeout default 600 detik.3092Claude Code tidak menunggu hook: penambahan selesai segera, dan hook berjalan di latar belakang dengan timeout default 600 detik.
3091 3093
3104 3106
3105| Field | Deskripsi |3107| Field | Deskripsi |
3106| :- | :- |3108| :- | :- |
3107| `directory` | Path absolut dari direktori yang ditambahkan |3109| `directory` | Path absolut direktori yang ditambahkan |
3108| `source` | Cara direktori ditambahkan, `"slash_command"` untuk `/add-dir` atau `"register_repo_root"` untuk permintaan kontrol SDK |3110| `source` | Cara direktori ditambahkan, `"slash_command"` untuk `/add-dir` atau `"register_repo_root"` untuk permintaan kontrol SDK |
3109 3111
3110```json theme={null}3112```json theme={null}
3118}3120}
3119```3121```
3120 3122
3121Hook DirectoryAdded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir penambahan, yang sudah selesai ketika hook berjalan. Claude Code membuang field `continue` dari output JSON-nya dan memunculkan sisanya secara berbeda per sumber:3123Hook DirectoryAdded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir penambahan, yang sudah selesai saat hook berjalan. Claude Code membuang field `continue` dari output JSON-nya dan menampilkan sisanya secara berbeda per sumber:
3122 3124
3123* `slash_command`: Claude Code mengirimkan `systemMessage` hook kepada Claude sebagai konteks pada giliran percakapan berikutnya, alih-alih menampilkannya kepada Anda. Jumlah hook yang gagal muncul dalam transkrip. Output kegagalan lengkap masuk ke log debug3125* `slash_command`: Claude Code menyampaikan `systemMessage` hook kepada Claude sebagai konteks pada giliran percakapan berikutnya, alih-alih menampilkannya kepada Anda. Jumlah hook yang gagal muncul di transkrip. Output kegagalan lengkap masuk ke log debug
3124* `register_repo_root`: Claude Code menulis output `systemMessage` dan output kegagalan hanya ke log debug3126* `register_repo_root`: Claude Code menulis output `systemMessage` dan output kegagalan hanya ke log debug
3125 3127
3126<h3 id="filechanged">3128<h3 id="filechanged">
3127 FileChanged3129 FileChanged
3128</h3>3130</h3>
3129 3131
3130Berjalan ketika file yang dipantau berubah di disk. Claude Code mendeteksi perubahan dengan pemantau filesystem, bukan dengan memeriksa panggilan tool, sehingga Claude Code menjalankan hook apa pun yang mengubah file tersebut: panggilan tool `Edit` atau `Write`, skrip yang dijalankan Claude dengan `Bash`, atau proses yang sepenuhnya di luar Claude Code. Penggunaan umum adalah memuat ulang environment variable ketika file konfigurasi proyek berubah.3132Berjalan ketika file yang dipantau berubah di disk. Claude Code mendeteksi perubahan dengan pemantau sistem file, bukan dengan memeriksa panggilan tool, sehingga Claude Code menjalankan hook apa pun yang mengubah file: panggilan tool `Edit` atau `Write`, skrip yang dijalankan Claude dengan `Bash`, atau proses yang sepenuhnya di luar Claude Code. Penggunaan umum adalah memuat ulang environment variable ketika file konfigurasi proyek berubah.
3131 3133
3132`matcher` untuk event ini memiliki dua peran:3134`matcher` untuk event ini memiliki dua peran:
3133 3135
3134* **Membangun daftar pantau**: nilai dipisahkan pada `|` dan setiap segmen didaftarkan sebagai nama file literal di direktori kerja, sehingga `".envrc|.env"` memantau tepat kedua file tersebut. Pola regex tidak berguna di sini: nilai seperti `^\.env` akan memantau file yang secara literal bernama `^\.env`.3136* **Membangun daftar pantau**: nilai dipisah pada `|` dan setiap segmen didaftarkan sebagai nama file literal di direktori kerja, sehingga `".envrc|.env"` memantau tepat kedua file tersebut. Pola regex tidak berguna di sini: nilai seperti `^\.env` akan memantau file yang secara literal bernama `^\.env`.
3135* **Memfilter hook mana yang berjalan**: ketika file yang dipantau berubah, nilai yang sama memfilter grup hook mana yang berjalan menggunakan [aturan matcher](#matcher-patterns) standar terhadap basename file yang berubah.3137* **Memfilter hook mana yang berjalan**: ketika file yang dipantau berubah, nilai yang sama memfilter grup hook mana yang berjalan menggunakan [aturan matcher](#matcher-patterns) standar terhadap nama dasar file yang berubah.
3136 3138
3137Contoh ini menormalkan akhir baris di `data.csv` setelah setiap perubahan, termasuk perintah `Bash` atau skrip eksternal yang menulis ulang file:3139Contoh ini menormalkan akhir baris di `data.csv` setelah setiap perubahan, termasuk perintah `Bash` atau skrip eksternal yang menulis ulang file:
3138 3140
3154}3156}
3155```3157```
3156 3158
3157Hook membaca path absolut file yang berubah dari field `file_path` pada [input JSON](#filechanged-input) di stdin. Penjaga `grep`-nya menguji hal yang sama yang dihapus oleh `perl`, yaitu CR di akhir baris, sehingga proses setelah normalisasi keluar tanpa menyentuh file. Penjaga yang lebih longgar akan berulang tanpa henti, karena `perl -i` menulis ulang file bahkan ketika tidak ada yang disubstitusi dan Claude Code menjalankan hook lagi setelah setiap penulisan ulang. Simpan skrip ini di `/path/to/normalize-line-endings.sh` dan jadikan dapat dieksekusi:3159Hook membaca path absolut file yang berubah dari field `file_path` pada [input JSON](#filechanged-input) di stdin. Penjaga `grep`-nya menguji hal yang sama yang dihapus oleh `perl`, yaitu CR di akhir baris, sehingga eksekusi setelah normalisasi keluar tanpa menyentuh file. Penjaga yang lebih longgar akan berulang tanpa henti, karena `perl -i` menulis ulang file bahkan ketika tidak mengganti apa pun dan Claude Code menjalankan hook lagi setelah setiap penulisan ulang. Simpan skrip ini di `/path/to/normalize-line-endings.sh` dan buat agar dapat dieksekusi:
3158 3160
3159```bash theme={null}3161```bash theme={null}
3160#!/bin/bash3162#!/bin/bash
3164fi3166fi
3165```3167```
3166 3168
3167Untuk memastikan hook berfungsi, minta Claude menambahkan baris CRLF ke `data.csv` dengan perintah `Bash`. Claude Code menjalankan hook dan file akhirnya memiliki akhir baris LF.3169Untuk memastikan hook berfungsi, minta Claude menambahkan baris CRLF ke `data.csv` dengan perintah `Bash`. Claude Code menjalankan hook dan file berakhir dengan akhir baris LF.
3168 3170
3169Untuk memantau file yang tidak dapat Anda sebutkan di awal, kembalikan [`watchPaths`](#filechanged-output) dari hook untuk memperbarui daftar pantau secara dinamis. Claude Code memulai pemantau hanya ketika sesuatu menyebutkan file untuk dipantau, jadi isi awal daftar dengan grup FileChanged yang matcher-nya menyebutkan setidaknya satu file, atau dengan hook [SessionStart](#sessionstart-decision-control) atau [CwdChanged](#cwdchanged) yang mengembalikan `watchPaths`. Matcher tetap memfilter grup hook mana yang berjalan ketika file yang dipantau berubah, jadi berikan grup yang menangani path dinamis matcher yang dihilangkan, yang cocok dengan setiap file yang dipantau dan tidak menambahkan apa pun ke daftar pantau. Matcher `"*"` juga cocok dengan setiap file, tetapi Claude Code mendaftarkannya dalam daftar pantau seperti nilai lainnya, sebagai file literal bernama `*`.3171Untuk memantau file yang tidak dapat Anda sebutkan di awal, kembalikan [`watchPaths`](#filechanged-output) dari hook untuk memperbarui daftar pantau secara dinamis. Claude Code memulai pemantau hanya ketika sesuatu menyebutkan file untuk dipantau, jadi isi daftar awal dengan grup FileChanged yang matcher-nya menyebutkan setidaknya satu file, atau dengan hook [SessionStart](#sessionstart-decision-control) atau [CwdChanged](#cwdchanged) yang mengembalikan `watchPaths`. Matcher tetap memfilter grup hook mana yang berjalan ketika file yang dipantau berubah, jadi berikan grup yang menangani path dinamis matcher yang dihilangkan, yang cocok dengan setiap file yang dipantau dan tidak menambahkan apa pun ke daftar pantau. Matcher `"*"` juga cocok dengan setiap file, tetapi Claude Code mendaftarkannya di daftar pantau seperti nilai lainnya, sebagai file literal bernama `*`.
3170 3172
3171Hook FileChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event [CwdChanged](#cwdchanged) selanjutnya, ketika Claude Code menghapusnya.3173Hook FileChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event [CwdChanged](#cwdchanged) berikutnya, saat Claude Code menghapusnya.
3172 3174
3173<h4 id="filechanged-input">3175<h4 id="filechanged-input">
3174 Input FileChanged3176 Input FileChanged
3196 Output FileChanged3198 Output FileChanged
3197</h4>3199</h4>
3198 3200
3199Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook FileChanged dapat mengembalikan `watchPaths` untuk memperbarui secara dinamis path file mana yang dipantau:3201Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook FileChanged dapat mengembalikan `watchPaths` untuk secara dinamis memperbarui path file mana yang dipantau:
3200 3202
3201| Field | Deskripsi |3203| Field | Deskripsi |
3202| :- | :- |3204| :- | :- |
3210 WorktreeCreate3212 WorktreeCreate
3211</h3>3213</h3>
3212 3214
3213Berjalan ketika worktree sedang dibuat, baik dari `claude --worktree`, dari [subagent yang menggunakan `isolation: "worktree"`](/docs/id/sub-agents#choose-the-subagent-scope), atau untuk [sesi latar belakang](/docs/id/agent-view#how-file-edits-are-isolated) yang diisolasi Claude Code dalam worktree-nya sendiri. Secara default Claude Code membuat salinan kerja terisolasi dengan `git worktree`. Mengonfigurasi hook WorktreeCreate menggantikan perilaku git default tersebut, sehingga Anda dapat menggunakan sistem kontrol versi lain seperti SVN, Perforce, atau Mercurial.3215Berjalan saat worktree sedang dibuat, baik dari `claude --worktree`, dari [subagent yang menggunakan `isolation: "worktree"`](/docs/id/sub-agents#choose-the-subagent-scope), maupun untuk [sesi latar belakang](/docs/id/agent-view#how-file-edits-are-isolated) yang diisolasi Claude Code dalam worktree-nya sendiri. Secara default, Claude Code membuat salinan kerja terisolasi dengan `git worktree`. Mengonfigurasi hook WorktreeCreate akan menggantikan perilaku git default tersebut, sehingga Anda dapat menggunakan sistem kontrol versi lain seperti SVN, Perforce, atau Mercurial.
3214 3216
3215Karena hook sepenuhnya menggantikan perilaku default, [`.worktreeinclude`](/docs/id/worktrees#copy-gitignored-files-into-worktrees) tidak diproses. Jika Anda perlu menyalin file konfigurasi lokal seperti `.env` ke worktree baru, lakukan di dalam skrip hook Anda.3217Karena hook menggantikan perilaku default sepenuhnya, [`.worktreeinclude`](/docs/id/worktrees#copy-gitignored-files-into-worktrees) tidak diproses. Jika Anda perlu menyalin file konfigurasi lokal seperti `.env` ke worktree baru, lakukan di dalam skrip hook Anda.
3216 3218
3217Hook harus mengembalikan path ke direktori worktree yang dibuat. Claude Code menggunakan path ini sebagai direktori kerja untuk sesi yang terisolasi. Lihat [Output WorktreeCreate](#worktreecreate-output) untuk cara setiap jenis hook mengembalikan path.3219Hook harus mengembalikan path ke direktori worktree yang dibuat. Claude Code menggunakan path ini sebagai direktori kerja untuk sesi terisolasi. Lihat [Output WorktreeCreate](#worktreecreate-output) untuk mengetahui cara setiap jenis hook mengembalikan path.
3218 3220
3219Claude Code menindaklanjuti keberhasilan hook dan path yang dikembalikan, serta membuang `systemMessage` dan `continue`.3221Claude Code bertindak berdasarkan keberhasilan hook dan path yang dikembalikan, serta membuang `systemMessage` dan `continue`.
3220 3222
3221Contoh ini membuat salinan kerja SVN dan mencetak path untuk digunakan oleh Claude Code. Ganti URL repositori dengan milik Anda sendiri:3223Contoh ini membuat salinan kerja SVN dan mencetak path untuk digunakan Claude Code. Ganti URL repositori dengan milik Anda:
3222 3224
3223```json theme={null}3225```json theme={null}
3224{3226{
3237}3239}
3238```3240```
3239 3241
3240Hook membaca `name` worktree dari input JSON di stdin, melakukan checkout salinan baru ke direktori baru, dan mencetak path direktori. `echo` pada baris terakhir adalah yang dibaca Claude Code sebagai path worktree. Alihkan output lainnya ke stderr agar tidak mengganggu path.3242Hook membaca `name` worktree dari input JSON di stdin, melakukan checkout salinan baru ke direktori baru, lalu mencetak path direktori tersebut. `echo` pada baris terakhir adalah yang dibaca Claude Code sebagai path worktree. Alihkan output lainnya ke stderr agar tidak mengganggu path.
3241 3243
3242<h4 id="worktreecreate-input">3244<h4 id="worktreecreate-input">
3243 Input WorktreeCreate3245 Input WorktreeCreate
3244</h4>3246</h4>
3245 3247
3246Selain [field input umum](#common-input-fields), hook WorktreeCreate menerima field `name`. Ini adalah pengidentifikasi slug untuk worktree baru, baik yang ditentukan oleh pengguna maupun yang dibuat secara otomatis, misalnya `bold-oak-a3f2`.3248Selain [kolom input umum](#common-input-fields), hook WorktreeCreate menerima kolom `name`. Ini adalah pengidentifikasi slug untuk worktree baru, baik yang ditentukan oleh pengguna maupun yang dibuat otomatis, misalnya `bold-oak-a3f2`.
3247 3249
3248```json theme={null}3250```json theme={null}
3249{3251{
3259 Output WorktreeCreate3261 Output WorktreeCreate
3260</h4>3262</h4>
3261 3263
3262Hook WorktreeCreate tidak menggunakan model keputusan izinkan/blokir standar. Sebagai gantinya, keberhasilan atau kegagalan hook menentukan hasilnya. Hook harus mengembalikan path ke direktori worktree yang dibuat:3264Hook WorktreeCreate tidak menggunakan model keputusan allow/block standar. Sebagai gantinya, keberhasilan atau kegagalan hook menentukan hasilnya. Hook harus mengembalikan path ke direktori worktree yang dibuat:
3263 3265
3264* **Hook perintah** (`type: "command"`): cetak path sebagai baris tidak kosong terakhir dari stdout. Claude Code menghapus kode escape ANSI sebelum membaca baris tersebut, sehingga banner startup shell yang dicetak sebelum `echo` Anda diabaikan. Alihkan output hook lainnya ke stderr.3266* **Hook perintah** (`type: "command"`): cetak path sebagai baris tidak kosong terakhir dari stdout. Claude Code menghapus kode escape ANSI sebelum membaca baris tersebut, sehingga banner startup shell yang dicetak sebelum `echo` Anda diabaikan. Alihkan output hook lainnya ke stderr.
3265* **Hook HTTP** (`type: "http"`): kembalikan `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dalam body respons.3267* **Hook HTTP** (`type: "http"`): kembalikan `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` di badan respons.
3266 3268
3267Jika hook gagal atau tidak menghasilkan path, pembuatan worktree gagal dengan error.3269Jika hook gagal atau tidak menghasilkan path, pembuatan worktree gagal dengan error.
3268 3270
3269Claude Code me-resolve path relatif terhadap direktori tempat hook dijalankan, dengan meringkas segmen `.` atau `..` di dalamnya. Jika path yang dihasilkan bukan direktori yang dapat dimasuki Claude Code, sesi mencetak error yang menyebutkan path tersebut dan keluar dengan kode 1.3271Claude Code menyelesaikan path relatif terhadap direktori tempat hook dijalankan, dengan meringkas segmen `.` atau `..` di dalamnya. Jika path yang dihasilkan bukan direktori yang dapat dimasuki Claude Code, sesi mencetak error yang menyebutkan path tersebut dan keluar dengan kode 1.
3270 3272
3271Claude Code menolak path absolut yang berisi segmen `.` atau `..`, serta path apa pun yang melewati symlink di bawah root repositori, karena symlink yang di-commit ke repositori dapat mengalihkan worktree ke luar repositori. Error tersebut menyebutkan komponen yang ditolak. Kembalikan path yang sudah dinormalisasi dan tidak melewati symlink di dalam repositori. Sebelum v2.1.216, pembuatan worktree mengikuti path dari hook tanpa pemeriksaan ini.3273Claude Code menolak path absolut yang berisi segmen `.` atau `..`, serta path apa pun yang melewati symlink di bawah root repositori, karena symlink yang di-commit ke repositori dapat mengalihkan worktree ke luar repositori. Error tersebut menyebutkan komponen yang ditolak. Kembalikan path yang dinormalisasi dan tidak melewati symlink di dalam repositori. Sebelum v2.1.216, pembuatan worktree mengikuti path dari hook tanpa penyaringan ini.
3272 3274
3273<h3 id="worktreeremove">3275<h3 id="worktreeremove">
3274 WorktreeRemove3276 WorktreeRemove
3275</h3>3277</h3>
3276 3278
3277Berjalan ketika Claude Code membersihkan worktree yang dibuat oleh hook [`WorktreeCreate`](#worktreecreate) Anda. Event ini dipicu ketika:3279Berjalan saat Claude Code membersihkan worktree yang dibuat oleh hook [`WorktreeCreate`](#worktreecreate) Anda. Event ini dipicu ketika:
3278 3280
3279* Anda keluar dari [sesi worktree](/docs/id/worktrees#start-claude-in-a-worktree) interaktif dan memilih untuk menghapus worktree saat Claude Code meminta Anda3281* Anda keluar dari [sesi worktree](/docs/id/worktrees#start-claude-in-a-worktree) interaktif dan memilih untuk menghapus worktree saat Claude Code meminta Anda
3280* Anda keluar dari sesi worktree interaktif yang belum Anda [beri nama](/docs/id/sessions#name-your-sessions), Claude Code tidak menemukan file yang berubah atau tidak terlacak, dan Claude Code menghapus worktree tanpa meminta konfirmasi Anda3282* Anda keluar dari sesi worktree interaktif yang belum Anda [beri nama](/docs/id/sessions#name-your-sessions), Claude Code tidak menemukan file yang berubah atau tidak terlacak, dan menghapus worktree tanpa meminta Anda
3281* Anda menghapus [sesi latar belakang](/docs/id/agent-view#what-deleting-a-session-removes) yang berjalan di worktree tersebut3283* Anda menghapus [sesi latar belakang](/docs/id/agent-view#what-deleting-a-session-removes) yang berjalan di worktree tersebut
3282 3284
3283Claude Code menggunakan git untuk mencari file yang berubah atau tidak terlacak, sehingga Claude Code tidak menemukan apa pun di worktree yang bukan checkout git atau tidak berada di dalamnya, bahkan ketika direktori tersebut berisi pekerjaan yang belum di-commit. Periksa pekerjaan tersebut di hook WorktreeRemove Anda sebelum hook menghapus apa pun.3285Claude Code menggunakan git untuk mencari file yang berubah atau tidak terlacak, sehingga tidak menemukan apa pun di worktree yang bukan checkout git atau tidak berada di dalamnya, meskipun direktori tersebut berisi pekerjaan yang belum di-commit. Periksa pekerjaan tersebut di hook WorktreeRemove Anda sebelum hook menghapus apa pun.
3284 3286
3285Untuk worktree berbasis git, Claude Code menangani pembersihan secara otomatis dengan `git worktree remove`. Jika Anda mengonfigurasi hook WorktreeCreate, pasangkan dengan hook WorktreeRemove untuk mengontrol pembersihan worktree yang dibuatnya:3287Untuk worktree berbasis git, Claude Code menangani pembersihan secara otomatis dengan `git worktree remove`. Jika Anda mengonfigurasi hook WorktreeCreate, pasangkan dengan hook WorktreeRemove untuk mengontrol pembersihan worktree yang dibuatnya:
3286 3288
3287* **Tanpa hook WorktreeRemove**: ketika Claude Code menghapus worktree saat Anda keluar dari sesi worktree, Claude Code melakukan fallback ke `git worktree remove --force` pada path yang dikembalikan oleh hook WorktreeCreate Anda, sehingga worktree yang dikenali git akan dihapus. Worktree yang tidak dikenali git, misalnya worktree yang dibuat hook Anda dengan sistem kontrol versi non-git, tetap ada di disk. Untuk apa yang dilakukan penghapusan [sesi latar belakang](/docs/id/agent-view#what-deleting-a-session-removes) terhadap worktree yang dibuat hook, lihat aturan penghapusan agent view.3289* **Tanpa hook WorktreeRemove**: saat Claude Code menghapus worktree ketika Anda keluar dari sesi worktree, Claude Code melakukan fallback ke `git worktree remove --force` pada path yang dikembalikan hook WorktreeCreate Anda, sehingga worktree yang dikenali git akan dihapus. Worktree yang tidak dikenali git, misalnya yang dibuat hook Anda dengan sistem kontrol versi non-git, tetap ada di disk. Untuk mengetahui apa yang dilakukan penghapusan [sesi latar belakang](/docs/id/agent-view#what-deleting-a-session-removes) terhadap worktree yang dibuat hook, lihat aturan penghapusan agent view.
3288* **Hook keluar dengan 0**: worktree dianggap telah dihapus. Claude Code tidak membaca apa pun lagi dari hook, jadi pastikan hook Anda telah menghapus direktori tersebut.3290* **Hook keluar dengan 0**: worktree dianggap telah dihapus. Claude Code tidak membaca apa pun lagi dari hook, jadi pastikan hook Anda telah menghapus direktori tersebut.
3289* **Hook keluar dengan non-zero**: penghapusan gagal jika direktori di `worktree_path` masih ada setelahnya, dan worktree tetap ada di disk tanpa fallback git. Hook yang telah menghapus direktori sebelum keluar dengan non-zero dianggap berhasil menghapus. Untuk cara kegagalan dilaporkan, lihat [Input WorktreeRemove](#worktreeremove-input).3291* **Hook keluar dengan non-zero**: penghapusan gagal jika direktori di `worktree_path` masih ada setelahnya, dan worktree tetap ada di disk tanpa fallback git. Hook yang telah menghapus direktori sebelum keluar dengan non-zero dianggap telah menghapus. Untuk cara kegagalan dilaporkan, lihat [Input WorktreeRemove](#worktreeremove-input).
3290 3292
3291Claude Code tidak pernah menghapus branch milik worktree yang dibuat hook, karena Claude Code hanya mengetahui path yang dikembalikan hook WorktreeCreate Anda. Jika hook WorktreeCreate Anda membuat branch, hapus branch tersebut di hook WorktreeRemove Anda.3293Claude Code tidak pernah menghapus branch milik worktree yang dibuat hook, karena Claude Code hanya mengetahui path yang dikembalikan hook WorktreeCreate Anda. Jika hook WorktreeCreate Anda membuat branch, hapus branch tersebut di hook WorktreeRemove Anda.
3292 3294
3293Claude Code membuang [field output JSON](#json-output) dari hook WorktreeRemove, seperti `systemMessage` dan `continue`.3295Claude Code membuang [kolom output JSON](#json-output) dari hook WorktreeRemove, seperti `systemMessage` dan `continue`.
3294 3296
3295Untuk penghapusan sesi latar belakang, Claude Code memverifikasi path worktree yang tersimpan sebelum menjalankan hook dan menolak path yang merupakan symlink atau melewati symlink di bawah root repositori. Hook berjalan untuk worktree yang masih berisi file hanya ketika Anda mengonfirmasi penghapusan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes); untuk worktree seperti itu, [`claude rm`](/docs/id/agent-view#manage-sessions-from-the-shell) justru mempertahankan sesi dan worktree. Sebelum v2.1.216, hook berjalan pada path yang tersimpan tanpa pemeriksaan ini.3297Untuk penghapusan sesi latar belakang, Claude Code memverifikasi path worktree yang tersimpan sebelum menjalankan hook dan menolak path yang merupakan symlink atau melewati symlink di bawah root repositori. Hook berjalan untuk worktree yang masih berisi file hanya jika Anda mengonfirmasi penghapusan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes); untuk worktree seperti itu, [`claude rm`](/docs/id/agent-view#manage-sessions-from-the-shell) justru mempertahankan sesi dan worktree. Sebelum v2.1.216, hook berjalan pada path yang tersimpan tanpa pemeriksaan ini.
3296 3298
3297Claude Code meneruskan path yang dikembalikan oleh WorktreeCreate sebagai `worktree_path` dalam input hook. Contoh ini membaca path tersebut dan menghapus direktorinya:3299Claude Code meneruskan path yang dikembalikan oleh WorktreeCreate sebagai `worktree_path` dalam input hook. Contoh ini membaca path tersebut dan menghapus direktorinya:
3298 3300
3317 Input WorktreeRemove3319 Input WorktreeRemove
3318</h4>3320</h4>
3319 3321
3320Selain [field input umum](#common-input-fields), hook WorktreeRemove menerima field `worktree_path`, yaitu path absolut ke worktree yang sedang dihapus.3322Selain [kolom input umum](#common-input-fields), hook WorktreeRemove menerima kolom `worktree_path`, yaitu path absolut ke worktree yang sedang dihapus.
3321 3323
3322```json theme={null}3324```json theme={null}
3323{3325{
3332Exit code hook WorktreeRemove menentukan hasilnya. Ketika hook keluar dengan non-zero dan direktori di `worktree_path` masih ada setelahnya, penghapusan gagal:3334Exit code hook WorktreeRemove menentukan hasilnya. Ketika hook keluar dengan non-zero dan direktori di `worktree_path` masih ada setelahnya, penghapusan gagal:
3333 3335
3334* Worktree tetap ada di disk, dan perintah serta stderr hook dikirim ke [log debug](#debug-hooks).3336* Worktree tetap ada di disk, dan perintah serta stderr hook dikirim ke [log debug](#debug-hooks).
3335* Jika Anda sedang menghapus sesi latar belakang, sesi tersebut juga tetap ada. Pesan penolakan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes) melaporkan bagaimana hook berakhir, seperti `exited 1`, mengutip bagian awal stderr-nya, dan menyebutkan apakah menghapus sesi lagi akan tetap menghapus direktori tersebut.3337* Jika Anda sedang menghapus sesi latar belakang, sesi tersebut juga tetap ada. Pesan penolakan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes) melaporkan bagaimana hook berakhir, seperti `exited 1`, mengutip awal stderr-nya, dan menyatakan apakah menghapus sesi lagi tetap akan menghapus direktori tersebut.
3336 3338
3337<h3 id="precompact">3339<h3 id="precompact">
3338 PreCompact3340 PreCompact
3345| Matcher | Kapan dipicu |3347| Matcher | Kapan dipicu |
3346| :- | :- |3348| :- | :- |
3347| `manual` | `/compact` |3349| `manual` | `/compact` |
3348| `auto` | Auto-compact ketika percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |3350| `auto` | Auto-compact saat percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |
3349 3351
3350Keluar dengan kode 2 untuk memblokir compaction. Untuk `/compact` manual, pesan stderr ditampilkan kepada pengguna. Anda juga dapat memblokir dengan mengembalikan JSON dengan `"decision": "block"`.3352Keluar dengan kode 2 untuk memblokir compaction. Untuk `/compact` manual, pesan stderr ditampilkan kepada pengguna. Anda juga dapat memblokir dengan mengembalikan JSON dengan `"decision": "block"`.
3351 3353
3352Memblokir compaction otomatis memiliki efek yang berbeda tergantung kapan dipicu. Jika compaction dipicu secara proaktif sebelum batas konteks, Claude Code melewatinya dan percakapan berlanjut tanpa di-compact. Jika compaction dipicu untuk memulihkan dari error batas konteks yang sudah dikembalikan oleh API, error yang mendasarinya akan muncul dan permintaan saat ini gagal.3354Memblokir compaction otomatis memiliki efek berbeda tergantung kapan dipicu. Jika compaction dipicu secara proaktif sebelum batas konteks, Claude Code melewatinya dan percakapan berlanjut tanpa di-compact. Jika compaction dipicu untuk pulih dari error batas konteks yang sudah dikembalikan oleh API, error yang mendasarinya muncul dan permintaan saat ini gagal.
3353 3355
3354Claude Code membuang field `systemMessage` dan `continue` dari hook PreCompact.3356Claude Code membuang kolom `systemMessage` dan `continue` dari hook PreCompact.
3355 3357
3356<h4 id="precompact-input">3358<h4 id="precompact-input">
3357 Input PreCompact3359 Input PreCompact
3358</h4>3360</h4>
3359 3361
3360Selain [field input umum](#common-input-fields), hook PreCompact menerima `trigger` dan `custom_instructions`. Untuk `manual`, `custom_instructions` berisi apa yang diteruskan pengguna ke `/compact` dan bernilai `null` ketika pengguna tidak meneruskan apa pun. Untuk `auto`, `custom_instructions` bernilai `null`.3362Selain [kolom input umum](#common-input-fields), hook PreCompact menerima `trigger` dan `custom_instructions`. Untuk `manual`, `custom_instructions` berisi apa yang diteruskan pengguna ke `/compact` dan bernilai `null` ketika pengguna tidak meneruskan apa pun. Untuk `auto`, `custom_instructions` bernilai `null`.
3361 3363
3362```json theme={null}3364```json theme={null}
3363{3365{
3374 PostCompact3376 PostCompact
3375</h3>3377</h3>
3376 3378
3377Berjalan setelah Claude Code menyelesaikan operasi compact. Gunakan event ini untuk bereaksi terhadap state baru yang telah di-compact, misalnya untuk mencatat ringkasan yang dihasilkan atau memperbarui state eksternal. Claude Code membuang field `systemMessage` dan `continue` dari hook PostCompact.3379Berjalan setelah Claude Code menyelesaikan operasi compact. Gunakan event ini untuk bereaksi terhadap status baru hasil compact, misalnya untuk mencatat ringkasan yang dihasilkan atau memperbarui status eksternal. Claude Code membuang kolom `systemMessage` dan `continue` dari hook PostCompact.
3378 3380
3379Nilai matcher yang sama berlaku seperti untuk `PreCompact`:3381Nilai matcher yang sama berlaku seperti untuk `PreCompact`:
3380 3382
3381| Matcher | Kapan dipicu |3383| Matcher | Kapan dipicu |
3382| :- | :- |3384| :- | :- |
3383| `manual` | Setelah `/compact` |3385| `manual` | Setelah `/compact` |
3384| `auto` | Setelah auto-compact ketika percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |3386| `auto` | Setelah auto-compact saat percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |
3385 3387
3386<h4 id="postcompact-input">3388<h4 id="postcompact-input">
3387 Input PostCompact3389 Input PostCompact
3388</h4>3390</h4>
3389 3391
3390Selain [field input umum](#common-input-fields), hook PostCompact menerima `trigger` dan `compact_summary`. Field `compact_summary` berisi ringkasan percakapan yang dihasilkan oleh operasi compact.3392Selain [kolom input umum](#common-input-fields), hook PostCompact menerima `trigger` dan `compact_summary`. Kolom `compact_summary` berisi ringkasan percakapan yang dihasilkan oleh operasi compact.
3391 3393
3392```json theme={null}3394```json theme={null}
3393{3395{
3408 3410
3409Berjalan sebelum Claude Code menerapkan peralihan model yang diminta oleh Anda atau klien. Gunakan untuk memblokir peralihan, meminta konfirmasi, atau menampilkan biaya peralihan sebelum terjadi.3411Berjalan sebelum Claude Code menerapkan peralihan model yang diminta oleh Anda atau klien. Gunakan untuk memblokir peralihan, meminta konfirmasi, atau menampilkan biaya peralihan sebelum terjadi.
3410 3412
3411PreModelSwitch memerlukan Claude Code v2.1.251 atau yang lebih baru. Claude Code menjalankannya untuk permintaan berikut:3413PreModelSwitch memerlukan Claude Code v2.1.251 atau lebih baru. Claude Code menjalankannya untuk permintaan berikut:
3412 3414
3413* `/model <name>` dan pemilih `/model`3415* `/model <name>` dan pemilih `/model`
3414* Pemilih model `Option+P` atau `Alt+P`3416* Pemilih model `Option+P` atau `Alt+P`
3418 3420
3419Claude Code tidak menjalankan hook PreModelSwitch untuk peralihan yang dilakukannya sendiri, seperti [fallback model otomatis](/docs/id/model-config#automatic-model-fallback) atau memulihkan model saat Anda melanjutkan sesi. Perubahan tersebut hanya mencapai [PostModelSwitch](#postmodelswitch).3421Claude Code tidak menjalankan hook PreModelSwitch untuk peralihan yang dilakukannya sendiri, seperti [fallback model otomatis](/docs/id/model-config#automatic-model-fallback) atau memulihkan model saat Anda melanjutkan sesi. Perubahan tersebut hanya mencapai [PostModelSwitch](#postmodelswitch).
3420 3422
3421Claude Code membandingkan matcher dengan nama kanonis model yang menjadi tujuan peralihan sesi, dengan mengabaikan sufiks `[1m]`. Alias seperti `opus`, ID model bertanggal, dan ID khusus penyedia seperti ID model Amazon Bedrock semuanya cocok dengan satu nama kanonis yang menjadi hasil resolve-nya, sehingga `claude-opus-5` mencakup setiap penulisan Opus 5.3423Claude Code membandingkan matcher dengan nama kanonis model yang menjadi tujuan peralihan sesi, dengan mengabaikan sufiks `[1m]` apa pun. Alias seperti `opus`, ID model bertanggal, dan ID khusus penyedia seperti ID model Amazon Bedrock semuanya cocok dengan satu nama kanonis yang dituju, sehingga `claude-opus-5` mencakup setiap penulisan Opus 5.
3422 3424
3423Ketika Claude Code tidak dapat menentukan nama kanonis untuk target, misalnya ID model kustom yang hanya diketahui oleh [LLM gateway](/docs/id/llm-gateway) Anda, Claude Code menjalankan setiap hook PreModelSwitch terlepas dari matcher. Oleh karena itu, hook yang memblokir sebaiknya memeriksa `to_model` dari inputnya alih-alih hanya mengandalkan matcher.3425Ketika Claude Code tidak dapat menentukan nama kanonis untuk target, misalnya ID model kustom yang hanya diketahui oleh [LLM gateway](/docs/id/llm-gateway) Anda, Claude Code menjalankan setiap hook PreModelSwitch terlepas dari matcher. Oleh karena itu, hook yang memblokir harus memeriksa `to_model` dari inputnya alih-alih hanya mengandalkan matcher.
3424 3426
3425Tulis matcher sebagai nama persis, daftar yang dipisahkan `|` seperti `claude-opus-4-6|claude-opus-5`, atau ekspresi reguler seperti `.*opus.*`. Contoh ini menggunakan matcher nama persis dan juga memeriksa `to_model` dari input hook, sehingga menolak peralihan ke Opus 4.6 dengan keluar menggunakan kode 2 dan membiarkan target lainnya lolos:3427Tulis matcher sebagai nama persis, daftar yang dipisahkan `|` seperti `claude-opus-4-6|claude-opus-5`, atau ekspresi reguler seperti `.*opus.*`. Contoh ini menggunakan matcher nama persis dan juga memeriksa `to_model` dari input hook, sehingga menolak peralihan ke Opus 4.6 dengan keluar menggunakan kode 2 dan membiarkan target lainnya lolos:
3426 3428
3494 Input PreModelSwitch3496 Input PreModelSwitch
3495</h4>3497</h4>
3496 3498
3497Selain [field input umum](#common-input-fields), hook PreModelSwitch menerima field dalam tabel ini. Lima field terakhir menjelaskan biaya pengiriman ulang percakapan ke model baru, sehingga hook dapat menampilkan angka tersebut sebelum peralihan terjadi.3499Selain [kolom input umum](#common-input-fields), hook PreModelSwitch menerima kolom-kolom dalam tabel ini. Lima kolom terakhir menjelaskan biaya pengiriman ulang percakapan ke model baru, sehingga hook dapat menampilkan angka tersebut sebelum peralihan terjadi.
3498 3500
3499| Field | Tipe | Deskripsi |3501| Kolom | Tipe | Deskripsi |
3500| :- | :- | :- |3502| :- | :- | :- |
3501| `from_model` | string | ID model asal peralihan |3503| `from_model` | string | ID model asal peralihan |
3502| `to_model` | string | ID model tujuan peralihan. Matcher dibandingkan dengan nama kanonis model ini |3504| `to_model` | string | ID model tujuan peralihan. Matcher membandingkan dengan nama kanonis model ini |
3503| `requested_model` | string atau `null` | Model yang disebutkan dalam permintaan: alias seperti `opus`, ID model lengkap, atau `null` ketika permintaan ditujukan untuk model default |3505| `requested_model` | string atau `null` | Model yang disebutkan dalam permintaan: alias seperti `opus`, ID model lengkap, atau `null` ketika permintaan ditujukan untuk model default |
3504| `source` | string | Asal permintaan: `"command"` untuk `/model <name>`, pengaturan Model di `/config`, atau mengaktifkan fast mode; `"picker"` untuk pemilih model; `"sdk"` untuk permintaan `set_model`, atau perubahan model dalam permintaan `apply_flag_settings`, dari host Agent SDK atau Remote Control |3506| `source` | string | Asal permintaan: `"command"` untuk `/model <name>`, pengaturan Model di `/config`, atau mengaktifkan fast mode; `"picker"` untuk pemilih model; `"sdk"` untuk permintaan `set_model`, atau perubahan model dalam permintaan `apply_flag_settings`, dari host Agent SDK atau Remote Control |
3505| `context_tokens` | number | Token yang dikirim ulang oleh permintaan berikutnya sebagai prompt-nya: gabungan token input, cache read, cache creation, dan output dari respons terakhir di percakapan utama. `0` sebelum respons pertama |3507| `context_tokens` | number | Token yang dikirim ulang oleh permintaan berikutnya sebagai prompt-nya: gabungan token input, cache read, cache creation, dan output dari respons terakhir dalam percakapan utama. `0` sebelum respons pertama |
3506| `prompt_cache_warm` | boolean | Apakah prompt cache model saat ini kemungkinan masih hangat, yang berarti peralihan akan mengorbankannya |3508| `prompt_cache_warm` | boolean | Apakah cache prompt model saat ini kemungkinan masih hangat, yang berarti peralihan akan mengorbankannya |
3507| `cache_ttl` | string | [Masa berlaku prompt cache](/docs/id/prompt-caching#cache-lifetime) yang diminta Claude Code untuk sesi ini: `"5m"` atau `"1h"` |3509| `cache_ttl` | string | [Masa berlaku cache prompt](/docs/id/prompt-caching#cache-lifetime) yang diminta Claude Code untuk sesi ini: `"5m"` atau `"1h"` |
3508| `estimated_cache_write_usd` | number | Perkiraan biaya dalam dolar AS untuk menulis `context_tokens` ke prompt cache pada `to_model` dengan tarif `cache_ttl`, tidak termasuk respons berikutnya. Server mungkin tidak perlu melakukan cache ulang seluruh konteks, jadi anggap ini sebagai perkiraan |3510| `estimated_cache_write_usd` | number | Perkiraan biaya dalam dolar AS untuk menulis `context_tokens` ke cache prompt pada `to_model` dengan tarif `cache_ttl`, tidak termasuk respons berikutnya. Server mungkin tidak perlu melakukan cache ulang seluruh konteks, jadi perlakukan angka ini sebagai perkiraan |
3509| `pricing` | string | Cara Claude Code menghitung harga `estimated_cache_write_usd`: `"configured"` dengan tarif organisasi Anda sendiri ketika organisasi telah mengonfigurasinya, `"catalog"` dengan harga daftar, atau `"default"` ketika `to_model` tidak memiliki harga yang diketahui dan Claude Code mengasumsikan tarif default |3511| `pricing` | string | Cara Claude Code menghitung harga `estimated_cache_write_usd`: `"configured"` dengan tarif milik organisasi Anda sendiri jika organisasi telah mengonfigurasinya, `"catalog"` dengan harga daftar, atau `"default"` ketika `to_model` tidak memiliki harga yang diketahui dan Claude Code mengasumsikan tarif default |
3510 3512
3511Contoh ini menunjukkan input untuk `/model opus` dalam sesi yang menjalankan Sonnet 5:3513Contoh ini menunjukkan input untuk `/model opus` dalam sesi yang menjalankan Sonnet 5:
3512 3514
3534 3536
3535Hook `PreModelSwitch` dapat membatalkan peralihan, meminta pengguna untuk mengonfirmasinya, atau membiarkannya berlanjut. Exit code 2 atau `decision: "block"` tingkat atas membatalkan peralihan.3537Hook `PreModelSwitch` dapat membatalkan peralihan, meminta pengguna untuk mengonfirmasinya, atau membiarkannya berlanjut. Exit code 2 atau `decision: "block"` tingkat atas membatalkan peralihan.
3536 3538
3537Untuk kontrol yang lebih rinci, kembalikan `permissionDecision` dan `permissionDecisionReason` dalam objek `hookSpecificOutput`, seperti pada [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` menerima `"allow"`, `"deny"`, dan `"ask"`. Hook ini tidak menerima `"defer"`, `updatedInput`, atau `additionalContext`. Tabel di bawah menjelaskan kedua field:3539Untuk kontrol yang lebih rinci, kembalikan `permissionDecision` dan `permissionDecisionReason` dalam objek `hookSpecificOutput`, seperti pada [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` menerima `"allow"`, `"deny"`, dan `"ask"`. Hook ini tidak menerima `"defer"`, `updatedInput`, atau `additionalContext`. Tabel di bawah menjelaskan kedua kolom:
3538 3540
3539| Field | Deskripsi |3541| Kolom | Deskripsi |
3540| :- | :- |3542| :- | :- |
3541| `permissionDecision` | `"allow"` melanjutkan dan melewati [konfirmasi yang ditampilkan Claude Code saat prompt cache masih hangat](/docs/id/prompt-caching#switching-models). `"deny"` membatalkan peralihan. `"ask"` meminta pengguna untuk mengonfirmasinya |3543| `permissionDecision` | `"allow"` melanjutkan dan melewati [konfirmasi yang ditampilkan Claude Code selama cache prompt masih hangat](/docs/id/prompt-caching#switching-models). `"deny"` membatalkan peralihan. `"ask"` meminta pengguna untuk mengonfirmasinya |
3542| `permissionDecisionReason` | Untuk `"deny"`, ditampilkan kepada pengguna sebagai alasan peralihan diblokir, atau dikembalikan sebagai error untuk permintaan `set_model`. Untuk `"ask"`, ditampilkan dalam prompt konfirmasi. Diabaikan untuk `"allow"` |3544| `permissionDecisionReason` | Untuk `"deny"`, ditampilkan kepada pengguna sebagai alasan peralihan diblokir, atau dikembalikan sebagai error untuk permintaan `set_model`. Untuk `"ask"`, ditampilkan dalam dialog konfirmasi. Diabaikan untuk `"allow"` |
3543 3545
3544Hanya `/model` dalam sesi interaktif yang dapat menampilkan prompt `"ask"`. Di setiap surface lainnya, termasuk mode non-interaktif dengan flag `-p`, `/config`, dan permintaan `set_model`, Claude Code memperlakukan `"ask"` sebagai penolakan.3546Hanya `/model` dalam sesi interaktif yang dapat menampilkan dialog `"ask"`. Pada setiap surface lainnya, termasuk mode non-interaktif dengan flag `-p`, `/config`, dan permintaan `set_model`, Claude Code memperlakukan `"ask"` sebagai penolakan.
3545 3547
3546Contoh ini meminta pengguna untuk mengonfirmasi dan mengutip jumlah token dari `context_tokens`:3548Contoh ini meminta pengguna untuk mengonfirmasi dan mengutip jumlah token dari `context_tokens`:
3547 3549
3557 3559
3558Ketika beberapa hook PreModelSwitch mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `ask` > `allow`.3560Ketika beberapa hook PreModelSwitch mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `ask` > `allow`.
3559 3561
3560Claude Code menampilkan kepada pengguna setiap `systemMessage` yang dikembalikan hook Anda terlepas dari keputusannya, sehingga hook pelapor biaya dapat mengembalikan `{"systemMessage": "..."}` dan keluar dengan 0.3562Claude Code menampilkan kepada pengguna `systemMessage` apa pun yang dikembalikan hook Anda terlepas dari keputusannya, sehingga hook pelaporan biaya dapat mengembalikan `{"systemMessage": "..."}` dan keluar dengan 0.
3561 3563
3562Hook PreModelSwitch yang tidak merespons sebelum timeout-nya akan memblokir peralihan. Sebaliknya, pada [PreToolUse](#timeouts), hook perintah yang mengalami timeout membiarkan panggilan tool berlanjut. Timeout default untuk event ini adalah 30 detik. `PreModelSwitch` hanya menjalankan hook `command`, `http`, dan `mcp_tool`, sehingga default `prompt` dan `agent` tidak berlaku.3564Hook PreModelSwitch yang tidak merespons sebelum timeout-nya akan memblokir peralihan. Sebaliknya, pada [PreToolUse](#timeouts), hook perintah yang mengalami timeout membiarkan panggilan tool berlanjut. Timeout default untuk event ini adalah 30 detik. `PreModelSwitch` hanya menjalankan hook `command`, `http`, dan `mcp_tool`, sehingga default `prompt` dan `agent` tidak berlaku.
3563 3565
3567 PostModelSwitch3569 PostModelSwitch
3568</h3>3570</h3>
3569 3571
3570Berjalan setelah model sesi berubah. Gunakan untuk memberikan panduan khusus model kepada Claude tanpa mengedit setiap CLAUDE.md, misalnya instruksi tingkat organisasi yang berlaku pada model tertentu.3572Berjalan setelah model sesi berubah. Gunakan untuk memberi Claude panduan khusus model tanpa mengedit setiap CLAUDE.md, misalnya instruksi tingkat organisasi yang berlaku pada model tertentu.
3571 3573
3572PostModelSwitch memerlukan Claude Code v2.1.251 atau yang lebih baru. Hook ini tidak dapat memblokir, karena model sudah berubah. Claude Code menjalankan hook PostModelSwitch setelah salah satu perubahan berikut:3574PostModelSwitch memerlukan Claude Code v2.1.251 atau lebih baru. Hook ini tidak dapat memblokir, karena model sudah berubah. Claude Code menjalankan hook PostModelSwitch setelah salah satu perubahan berikut:
3573 3575
3574* Peralihan yang diminta oleh Anda atau klien3576* Peralihan yang diminta oleh Anda atau klien
3575* [Fallback model otomatis](/docs/id/model-config#automatic-model-fallback), yang mengubah model sesi3577* [Fallback model otomatis](/docs/id/model-config#automatic-model-fallback), yang mengubah model sesi
3576* Pengaturan seperti [`opusplan`](/docs/id/model-config#opusplan-model-setting) yang masuk atau keluar dari plan mode3578* Pengaturan seperti [`opusplan`](/docs/id/model-config#opusplan-model-setting) yang masuk atau keluar dari plan mode
3577* Claude Code memulihkan model saat Anda melanjutkan sesi3579* Claude Code memulihkan model saat Anda melanjutkan sesi
3578 3580
3579Claude Code tidak menjalankan hook PostModelSwitch ketika model dari [rantai model fallback](/docs/id/model-config#fallback-model-chains) melayani suatu giliran, karena substitusi tersebut hanya berlangsung satu giliran dan tidak mengubah model sesi.3581Claude Code tidak menjalankan hook PostModelSwitch ketika model dari [rantai model fallback](/docs/id/model-config#fallback-model-chains) melayani satu giliran, karena substitusi tersebut hanya berlangsung satu giliran dan tidak mengubah model sesi.
3580 3582
3581Matcher mengikuti aturan yang sama seperti [PreModelSwitch](#premodelswitch): Claude Code membandingkannya dengan nama kanonis model yang menjadi tujuan peralihan sesi.3583Matcher mengikuti aturan yang sama seperti [PreModelSwitch](#premodelswitch): Claude Code membandingkannya dengan nama kanonis model yang menjadi tujuan peralihan sesi.
3582 3584
3606 Input PostModelSwitch3608 Input PostModelSwitch
3607</h4>3609</h4>
3608 3610
3609Hook PostModelSwitch menerima field yang sama seperti [PreModelSwitch](#premodelswitch-input), dengan `hook_event_name` diatur ke `"PostModelSwitch"` dan dua nilai `source` tambahan: `"auto"` untuk fallback otomatis atau perubahan lain yang dilakukan Claude Code sendiri, dan `"resume"` untuk model yang dipulihkan saat Anda melanjutkan sesi.3611Hook PostModelSwitch menerima kolom yang sama seperti [PreModelSwitch](#premodelswitch-input), dengan `hook_event_name` diatur ke `"PostModelSwitch"` dan dua nilai `source` tambahan: `"auto"` untuk fallback otomatis atau perubahan lain yang dilakukan Claude Code sendiri, dan `"resume"` untuk model yang dipulihkan saat Anda melanjutkan sesi.
3610 3612
3611`requested_model` bernilai `null` ketika `source` adalah `"auto"`. Ketika `source` adalah `"resume"`, nilainya adalah pengaturan model tersimpan yang dipulihkan Claude Code.3613`requested_model` bernilai `null` ketika `source` adalah `"auto"`. Ketika `source` adalah `"resume"`, nilainya adalah pengaturan model tersimpan yang dipulihkan Claude Code.
3612 3614
3614 Kontrol keputusan PostModelSwitch3616 Kontrol keputusan PostModelSwitch
3615</h4>3617</h4>
3616 3618
3617Claude Code mengambil [stdout teks biasa](#exit-code-0) hook Anda saat keluar dengan 0, atau `additionalContext` dari output JSON, dan mengirimkannya ke Claude bersama permintaan berikutnya setelah peralihan. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan:3619Claude Code mengambil [stdout teks biasa](#exit-code-0) hook Anda saat keluar dengan 0, atau `additionalContext` dari output JSON, dan menyampaikannya kepada Claude bersama permintaan berikutnya setelah peralihan. Selain [kolom output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan:
3618 3620
3619| Field | Deskripsi |3621| Kolom | Deskripsi |
3620| :- | :- |3622| :- | :- |
3621| `additionalContext` | String yang ditambahkan ke konteks Claude bersama permintaan berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |3623| `additionalContext` | String yang ditambahkan ke konteks Claude bersama permintaan berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
3622 3624
3623Jika hook belum selesai dalam lima detik setelah Anda mengirim prompt berikutnya, Claude Code mengirim permintaan tersebut tanpa output dan melampirkannya ke permintaan selanjutnya. Jika model berubah beberapa kali sebelum permintaan berikutnya, Claude Code hanya mengirimkan output untuk model target peralihan terakhir.3625Jika hook belum selesai dalam lima detik setelah Anda mengirim prompt berikutnya, Claude Code mengirim permintaan tersebut tanpa output dan melampirkannya ke permintaan setelahnya. Jika model berubah beberapa kali sebelum permintaan berikutnya, Claude Code hanya menyampaikan output untuk model tujuan peralihan terakhir.
3624 3626
3625<h3 id="sessionend">3627<h3 id="sessionend">
3626 SessionEnd3628 SessionEnd
3627</h3>3629</h3>
3628 3630
3629Berjalan ketika sesi Claude Code berakhir. Berguna untuk tugas pembersihan, mencatat statistik3631Berjalan saat sesi Claude Code berakhir. Berguna untuk tugas pembersihan, mencatat statistik
3630sesi, atau menyimpan state sesi. Mendukung matcher untuk memfilter berdasarkan alasan keluar.3632sesi, atau menyimpan status sesi. Mendukung matcher untuk memfilter berdasarkan alasan keluar.
3631 3633
3632Field `reason` dalam input hook menunjukkan mengapa sesi berakhir:3634Kolom `reason` dalam input hook menunjukkan mengapa sesi berakhir:
3633 3635
3634| Alasan | Deskripsi |3636| Alasan | Deskripsi |
3635| :- | :- |3637| :- | :- |
3636| `clear` | Sesi dibersihkan dengan perintah `/clear` |3638| `clear` | Sesi dibersihkan dengan perintah `/clear` |
3637| `resume` | Sesi dialihkan melalui `/resume` interaktif |3639| `resume` | Sesi dialihkan melalui `/resume` interaktif |
3638| `logout` | Pengguna keluar (log out) |3640| `logout` | Pengguna keluar (log out) |
3639| `prompt_input_exit` | Pengguna keluar saat input prompt sedang terlihat |3641| `prompt_input_exit` | Pengguna keluar saat input prompt terlihat |
3640| `other` | Alasan keluar lainnya |3642| `other` | Alasan keluar lainnya |
3641| `bypass_permissions_disabled` | Dihapus di v2.1.234; Claude Code tidak mengirimkannya. Hapus dari matcher `SessionEnd` Anda |3643| `bypass_permissions_disabled` | Dihapus di v2.1.234; Claude Code tidak mengirimkannya. Hapus dari matcher `SessionEnd` Anda |
3642 3644
3644 Input SessionEnd3646 Input SessionEnd
3645</h4>3647</h4>
3646 3648
3647Selain [field input umum](#common-input-fields), hook SessionEnd menerima field `reason` yang menunjukkan mengapa sesi berakhir. Lihat [tabel alasan](#sessionend) di atas untuk semua nilai.3649Selain [kolom input umum](#common-input-fields), hook SessionEnd menerima kolom `reason` yang menunjukkan mengapa sesi berakhir. Lihat [tabel alasan](#sessionend) di atas untuk semua nilai.
3648 3650
3649```json theme={null}3651```json theme={null}
3650{3652{
3656}3658}
3657```3659```
3658 3660
3659Hook SessionEnd tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir penghentian sesi tetapi dapat melakukan tugas pembersihan. Claude Code membuang [field output JSON](#json-output) hook ini, seperti `systemMessage`.3661Hook SessionEnd tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir penghentian sesi tetapi dapat melakukan tugas pembersihan. Claude Code membuang [kolom output JSON](#json-output) mereka, seperti `systemMessage`.
3660 3662
3661Hook SessionEnd memiliki timeout default 1,5 detik. Timeout ini berlaku saat Anda keluar, menjalankan `/clear`, atau beralih sesi dengan `/resume` interaktif. Anda dapat memberi hook lebih banyak waktu dengan dua cara:3663Hook SessionEnd memiliki timeout default 1,5 detik. Timeout ini berlaku saat Anda keluar, menjalankan `/clear`, atau beralih sesi dengan `/resume` interaktif. Anda dapat memberi hook lebih banyak waktu dengan dua cara:
3662 3664
3663* **`timeout` per hook**: atur `timeout` dalam konfigurasi hook tersebut. Anggaran keseluruhan naik secara otomatis untuk menyamai `timeout` per hook tertinggi di file pengaturan Anda, hingga 60 detik. Jika Anda menaikkan anggaran dengan cara ini, hook tanpa `timeout` sendiri tetap menggunakan default. Timeout yang diatur pada hook yang disediakan plugin tidak menaikkan anggaran.3665* **`timeout` per hook**: atur `timeout` dalam konfigurasi hook tersebut. Anggaran keseluruhan naik secara otomatis agar sesuai dengan `timeout` per hook tertinggi di file pengaturan Anda, hingga 60 detik. Jika Anda menaikkan anggaran dengan cara ini, hook tanpa `timeout`-nya sendiri tetap menggunakan default. Timeout yang diatur pada hook yang disediakan plugin tidak menaikkan anggaran.
3664* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: atur environment variable ini dalam milidetik untuk menimpa anggaran secara eksplisit. Nilai yang Anda atur juga menjadi timeout untuk setiap hook tanpa `timeout` sendiri.3666* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: atur environment variable ini dalam milidetik untuk menimpa anggaran secara eksplisit. Nilai yang Anda atur juga menjadi timeout untuk setiap hook tanpa `timeout`-nya sendiri.
3665 3667
3666Contoh ini mengatur anggaran menjadi 5 detik:3668Contoh ini mengatur anggaran menjadi 5 detik:
3667 3669
3669CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3671CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3670```3672```
3671 3673
3672Sebelum v2.1.268, `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` hanya menaikkan anggaran keseluruhan, dan hook tanpa `timeout` sendiri tetap dibatalkan setelah 1,5 detik.3674Sebelum v2.1.268, `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` hanya menaikkan anggaran keseluruhan, dan hook tanpa `timeout`-nya sendiri tetap dibatalkan setelah 1,5 detik.
3673 3675
3674<h3 id="elicitation">3676<h3 id="elicitation">
3675 Elicitation3677 Elicitation
3676</h3>3678</h3>
3677 3679
3678Berjalan ketika server MCP meminta input pengguna di tengah tugas. Secara default, Claude Code menampilkan dialog interaktif agar pengguna merespons. Hook dapat mencegat permintaan ini dan merespons secara terprogram, sehingga melewati dialog sepenuhnya.3680Berjalan saat server MCP meminta input pengguna di tengah tugas. Secara default, Claude Code menampilkan dialog interaktif agar pengguna merespons. Hook dapat mencegat permintaan ini dan merespons secara terprogram, sehingga melewati dialog sepenuhnya.
3681
3682Untuk hook lengkap beserta entri pengaturan dan skripnya, lihat [Menjawab permintaan formulir dari skrip](#answer-a-form-request-from-a-script).
3679 3683
3680Field matcher dicocokkan dengan nama server MCP.3684Kolom matcher dicocokkan dengan nama server MCP.
3681 3685
3682<h4 id="elicitation-input">3686<h4 id="elicitation-input">
3683 Input Elicitation3687 Input Elicitation
3684</h4>3688</h4>
3685 3689
3686Selain [field input umum](#common-input-fields), hook Elicitation menerima field `mcp_server_name`, `message`, serta field opsional `mode`, `url`, `elicitation_id`, dan `requested_schema`.3690Selain [kolom input umum](#common-input-fields), hook Elicitation menerima `mcp_server_name`, `message`, serta kolom opsional `mode`, `url`, `elicitation_id`, dan `requested_schema`.
3687 3691
3688Untuk elicitation mode formulir, kasus yang paling umum:3692Untuk elicitation mode formulir, kasus yang paling umum:
3689 3693
3724 Output Elicitation3728 Output Elicitation
3725</h4>3729</h4>
3726 3730
3727Untuk merespons secara terprogram tanpa menampilkan dialog, kembalikan objek JSON dengan `hookSpecificOutput`:3731Hook Elicitation dapat menjawab permintaan atas nama pengguna, menolak atau membatalkannya, atau menyerahkannya ke dialog. Untuk menjawab, menolak, atau membatalkan, keluar dengan 0 dan cetak objek `hookSpecificOutput` dengan `action`. Server mendapatkan jawaban Anda dan tidak ada dialog yang muncul. Setiap baris tabel ini menunjukkan apa yang harus dikembalikan untuk satu hasil dan apa yang diterima server MCP:
3732
3733| Untuk | Kembalikan | Yang diterima server |
3734| :- | :- | :- |
3735| Menjawab atas nama pengguna | `"action": "accept"`, dengan nilai kolom formulir di `content` | `accept` dengan `content` Anda |
3736| Menolak permintaan | `"action": "decline"` | `decline` |
3737| Membatalkan permintaan | `"action": "cancel"` | `cancel` |
3738| Menyerahkan permintaan kepada pengguna | Tanpa output, dengan exit code 0 | Jawaban pengguna dari [dialog](/docs/id/mcp#respond-to-mcp-elicitation-requests) |
3739
3740Output ini menjawab permintaan mode formulir yang ditampilkan di [Input Elicitation](#elicitation-input). Kunci di `content` adalah nama properti dari `requested_schema` permintaan tersebut:
3728 3741
3729```json theme={null}3742```json theme={null}
3730{3743{
3738}3751}
3739```3752```
3740 3753
3741| Field | Nilai | Deskripsi |3754Output ini menolak permintaan:
3742| :- | :- | :- |3755
3743| `action` | `accept`, `decline`, `cancel` | Apakah akan menerima, menolak, atau membatalkan permintaan |3756```json theme={null}
3744| `content` | object | Nilai field formulir yang akan dikirim. Hanya digunakan ketika `action` adalah `accept` |3757{
3758 "hookSpecificOutput": {
3759 "hookEventName": "Elicitation",
3760 "action": "decline"
3761 }
3762}
3763```
3764
3765Di dialog, memilih **Decline** mengirim `decline` dan menekan `Esc` mengirim `cancel`, jadi kembalikan yang ingin Anda tampilkan kepada server.
3766
3767Untuk permintaan mode URL, hook yang mengembalikan `accept` melewati dialog, sehingga URL tidak pernah dibuka.
3768
3769Claude Code membuang `reason`, `systemMessage`, dan `continue` dari output JSON hook Elicitation, apa pun `action` yang Anda kembalikan.
3770
3771<h4 id="other-ways-to-decline-an-elicitation">
3772 Cara lain untuk menolak elicitation
3773</h4>
3774
3775Hook Anda juga dapat menolak dengan cara-cara berikut. Server menerima `decline` yang sama seperti untuk `"action": "decline"`:
3776
3777* **Keluar dengan kode 2**: Claude Code mengabaikan `hookSpecificOutput` yang dicetak oleh hook yang sama
3778* **Mencetak `"decision": "block"` tingkat atas**: blokir tersebut menimpa `action` dalam output yang sama
3779
3780Ketika beberapa hook cocok dengan permintaan yang sama, penolakan dari salah satunya menimpa `accept` atau `cancel` dari yang lain.
3781
3782Skrip ini menolak permintaan mode URL dan menyerahkan permintaan formulir ke dialog:
3783
3784```bash theme={null}
3785#!/bin/bash
3786if [ "$(jq -r '.mode')" = "url" ]; then
3787 exit 2
3788fi
3789```
3790
3791Baik pengguna maupun server tidak melihat alasan hook Anda menolak, karena Claude Code tidak menampilkan stderr atau `reason` Anda.
3792
3793Claude Code mengabaikan `decision` tingkat atas dari hook `Elicitation` dan `ElicitationResult` sejak v2.1.105 hingga perbaikan di v2.1.284.
3794
3795<h4 id="answer-a-form-request-from-a-script">
3796 Menjawab permintaan formulir dari skrip
3797</h4>
3798
3799Contoh ini menjawab satu pertanyaan berulang atas nama pengguna. Server MCP bernama `issue-tracker` meminta kunci proyek dalam formulir, dan hook mengisi `DOCS`. Skrip menerima ketika `project_key` adalah satu-satunya kolom formulir. Untuk permintaan lainnya, skrip tidak mencetak apa pun, sehingga dialog muncul.
3800
3801<Tabs>
3802 <Tab title="macOS/Linux">
3803 Daftarkan hook perintah untuk event tersebut di file pengaturan Anda, dengan nama server sebagai matcher:
3804
3805 ```json theme={null}
3806 {
3807 "hooks": {
3808 "Elicitation": [
3809 {
3810 "matcher": "issue-tracker",
3811 "hooks": [
3812 {
3813 "type": "command",
3814 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.sh",
3815 "args": []
3816 }
3817 ]
3818 }
3819 ]
3820 }
3821 }
3822 ```
3823
3824 Simpan skrip ini ke `.claude/hooks/answer-project-key.sh` di proyek Anda dan jadikan dapat dieksekusi dengan `chmod +x`:
3825
3826 ```bash theme={null}
3827 #!/bin/bash
3828 input=$(cat)
3829 fields=$(jq -c '.requested_schema.properties // {} | keys' <<<"$input")
3830
3831 if [ "$fields" = '["project_key"]' ]; then
3832 jq -n '{hookSpecificOutput: {hookEventName: "Elicitation", action: "accept", content: {project_key: "DOCS"}}}'
3833 fi
3834 ```
3835 </Tab>
3836
3837 <Tab title="Windows (PowerShell)">
3838 Daftarkan hook perintah yang menjalankan skrip melalui PowerShell, dengan nama server sebagai matcher:
3745 3839
3746Exit code 2 menolak elicitation. Claude Code tidak menampilkan pesan stderr Anda di mana pun.3840 ```json theme={null}
3841 {
3842 "hooks": {
3843 "Elicitation": [
3844 {
3845 "matcher": "issue-tracker",
3846 "hooks": [
3847 {
3848 "type": "command",
3849 "command": "powershell.exe",
3850 "args": [
3851 "-NoProfile",
3852 "-ExecutionPolicy",
3853 "Bypass",
3854 "-File",
3855 "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.ps1"
3856 ]
3857 }
3858 ]
3859 }
3860 ]
3861 }
3862 }
3863 ```
3864
3865 Simpan skrip ini ke `.claude/hooks/answer-project-key.ps1` di proyek Anda:
3866
3867 ```powershell theme={null}
3868 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json
3869 $fields = @($request.requested_schema.properties.PSObject.Properties.Name)
3870
3871 if ($fields.Count -eq 1 -and $fields[0] -eq 'project_key') {
3872 @{
3873 hookSpecificOutput = @{
3874 hookEventName = "Elicitation"
3875 action = "accept"
3876 content = @{ project_key = "DOCS" }
3877 }
3878 } | ConvertTo-Json -Depth 3
3879 }
3880 ```
3881 </Tab>
3882</Tabs>
3747 3883
3748Claude Code bertindak berdasarkan `hookSpecificOutput` dari output JSON hook Elicitation dan membuang `systemMessage` serta `continue`.3884Untuk memastikan hook berfungsi, jalankan Claude Code dengan `claude --debug` dan berikan Claude tugas yang membuat server meminta kunci proyek. Tidak ada dialog yang muncul, dan [log debug](#debug-hooks) memiliki baris yang diakhiri dengan `Elicitation resolved by hook: {"action":"accept","content":{"project_key":"DOCS"}}`.
3749 3885
3750<h3 id="elicitationresult">3886<h3 id="elicitationresult">
3751 ElicitationResult3887 ElicitationResult
3753 3889
3754Berjalan setelah pengguna merespons elicitation MCP. Hook dapat mengamati, memodifikasi, atau memblokir respons sebelum dikirim kembali ke server MCP.3890Berjalan setelah pengguna merespons elicitation MCP. Hook dapat mengamati, memodifikasi, atau memblokir respons sebelum dikirim kembali ke server MCP.
3755 3891
3756Field matcher dicocokkan dengan nama server MCP.3892Ketika hook [Elicitation](#elicitation) menjawab permintaan, Claude Code mengirim jawaban tersebut ke server tanpa menjalankan hook ElicitationResult.
3893
3894Kolom matcher dicocokkan dengan nama server MCP.
3757 3895
3758<h4 id="elicitationresult-input">3896<h4 id="elicitationresult-input">
3759 Input ElicitationResult3897 Input ElicitationResult
3760</h4>3898</h4>
3761 3899
3762Selain [field input umum](#common-input-fields), hook ElicitationResult menerima field `mcp_server_name`, `action`, serta field opsional `mode`, `elicitation_id`, dan `content`.3900Selain [kolom input umum](#common-input-fields), hook ElicitationResult menerima `mcp_server_name`, `action`, serta kolom opsional `mode`, `elicitation_id`, dan `content`.
3763 3901
3764```json theme={null}3902```json theme={null}
3765{3903{
3770 "mcp_server_name": "my-mcp-server",3908 "mcp_server_name": "my-mcp-server",
3771 "action": "accept",3909 "action": "accept",
3772 "content": { "username": "alice" },3910 "content": { "username": "alice" },
3773 "mode": "form",3911 "mode": "form"
3774 "elicitation_id": "elicit-123"
3775}3912}
3776```3913```
3777 3914
3779 Output ElicitationResult3916 Output ElicitationResult
3780</h4>3917</h4>
3781 3918
3782Untuk menimpa respons pengguna, kembalikan objek JSON dengan `hookSpecificOutput`:3919Hook ElicitationResult dapat meloloskan respons pengguna, mengubah nilainya, atau memblokirnya. Untuk mengubah atau memblokir respons, keluar dengan 0 dan cetak objek `hookSpecificOutput` dengan `action`. Setiap baris tabel ini menunjukkan apa yang harus dikembalikan untuk satu hasil dan apa yang diterima server MCP:
3920
3921| Untuk | Kembalikan | Yang diterima server |
3922| :- | :- | :- |
3923| Meloloskan respons | Tanpa output, dengan exit code 0 | Respons pengguna, tanpa perubahan |
3924| Mengubah nilai yang dikirim | `"action": "accept"`, dengan nilai baru di `content` | `accept` dengan `content` Anda sebagai pengganti nilai pengguna |
3925| Memblokir respons | `"action": "decline"` | `decline`, tanpa nilai pengguna |
3926| Membatalkan permintaan | `"action": "cancel"` | `cancel`, beserta nilai yang dikirim pengguna. Untuk menahannya, kembalikan `"decline"` |
3927
3928Output ini mengubah respons yang ditampilkan di [Input ElicitationResult](#elicitationresult-input), sehingga server menerima `alice@example.com` di tempat pengguna mengirim `alice`:
3783 3929
3784```json theme={null}3930```json theme={null}
3785{3931{
3786 "hookSpecificOutput": {3932 "hookSpecificOutput": {
3787 "hookEventName": "ElicitationResult",3933 "hookEventName": "ElicitationResult",
3788 "action": "decline",3934 "action": "accept",
3789 "content": {}3935 "content": {
3936 "username": "alice@example.com"
3937 }
3790 }3938 }
3791}3939}
3792```3940```
3793 3941
3794| Field | Nilai | Deskripsi |3942`content` Anda menggantikan seluruh objek `content` milik pengguna, jadi sertakan kolom yang tidak Anda ubah. Kembalikan `action` bersamanya, karena Claude Code mengabaikan `hookSpecificOutput` yang tidak memiliki `action`.
3795| :- | :- | :- |
3796| `action` | `accept`, `decline`, `cancel` | Menimpa tindakan pengguna |
3797| `content` | object | Menimpa nilai field formulir. Hanya bermakna ketika `action` adalah `accept` |
3798 3943
3799Exit code 2 memblokir respons, mengubah tindakan efektif menjadi `decline`. Claude Code tidak menampilkan pesan stderr Anda di mana pun.3944Hook ElicitationResult juga berjalan ketika pengguna menolak atau membatalkan, dan `action` Anda menggantikan milik mereka. Periksa bahwa `action` pada input adalah `accept` sebelum Anda mengembalikan `accept`, atau hook Anda akan mengubah permintaan yang ditolak menjadi diterima. Skrip ini melakukan perubahan yang sama ketika pengguna menerima, mempertahankan kolom lainnya, dan tidak mencetak apa pun dalam kondisi lain:
3800 3945
3801Claude Code bertindak berdasarkan `hookSpecificOutput` dari output JSON hook ElicitationResult dan membuang `systemMessage` serta `continue`.3946```bash theme={null}
3947#!/bin/bash
3948input=$(cat)
3949
3950if [ "$(jq -r '.action' <<<"$input")" = "accept" ]; then
3951 jq '{hookSpecificOutput: {hookEventName: "ElicitationResult", action: "accept", content: (.content + {username: (.content.username + "@example.com")})}}' <<<"$input"
3952fi
3953```
3954
3955Output ini memblokir respons:
3956
3957```json theme={null}
3958{
3959 "hookSpecificOutput": {
3960 "hookEventName": "ElicitationResult",
3961 "action": "decline"
3962 }
3963}
3964```
3965
3966Exit code 2 dan `"decision": "block"` tingkat atas juga memblokir respons. [Cara lain untuk menolak elicitation](#other-ways-to-decline-an-elicitation) menjelaskan mana yang berlaku ketika hook menggabungkannya, apa yang dilihat pengguna, dan versi mana yang mengabaikan `decision`.
3967
3968Claude Code membuang `reason`, `systemMessage`, dan `continue` dari output JSON hook ElicitationResult, apa pun `action` yang Anda kembalikan.
3802 3969
3803<h2 id="prompt-based-hooks">3970<h2 id="prompt-based-hooks">
3804 Prompt-based hooks3971 Prompt-based hooks
3862 4029
3863Atur `type` ke `"prompt"` dan sediakan string `prompt` alih-alih `command`. Gunakan placeholder `$ARGUMENTS` untuk menyuntikkan data JSON input hook ke dalam teks prompt Anda.4030Atur `type` ke `"prompt"` dan sediakan string `prompt` alih-alih `command`. Gunakan placeholder `$ARGUMENTS` untuk menyuntikkan data JSON input hook ke dalam teks prompt Anda.
3864 4031
4032Dalam prompt hook atau [agent hook](#agent-based-hooks), Anda dapat menulis `prompt` sebagai aturan tentang apa yang harus diblokir atau diizinkan, seperti "Blokir setiap perintah Bash yang membaca file `.env`", atau sebagai kondisi yang harus terpenuhi, seperti "Semua unit test lulus".
4033
3865Hook `Stop` ini meminta LLM untuk mengevaluasi apakah semua tugas selesai sebelum mengizinkan Claude selesai:4034Hook `Stop` ini meminta LLM untuk mengevaluasi apakah semua tugas selesai sebelum mengizinkan Claude selesai:
3866 4035
3867```json theme={null}4036```json theme={null}