6 6
7> Referensi lengkap untuk mod Claude Code: tata letak modul hook, event, metode API mod, titik render, elemen per surface, batas, dan pengaturan.7> Referensi lengkap untuk mod Claude Code: tata letak modul hook, event, metode API mod, titik render, elemen per surface, batas, dan pengaturan.
8 8
9Cari event apa pun yang dapat ditangani oleh sebuah [mod](/docs/id/plugins/mods/overview.md), metode API mod yang dapat dipanggilnya, atau titik render tempat ia dapat menggambar. Entri mencakup CLI Claude Code dan aplikasi Desktop per v2.1.290, serta ekstensi VS Code per v2.1.299. Setiap entri memberikan nama dan deskripsi satu baris, serta menautkan ke bagian panduan yang menjelaskannya jika ada.9Cari event apa pun yang dapat ditangani oleh sebuah [mod](https://code.claude.com/docs/id/plugins/mods/overview.md), metode API mod yang dapat dipanggilnya, atau titik render tempat ia dapat menggambar. Entri mencakup CLI Claude Code dan aplikasi Desktop per v2.1.290, serta ekstensi VS Code per v2.1.299. Setiap entri memberikan nama dan deskripsi satu baris, serta menautkan ke bagian panduan yang menjelaskannya jika ada.
10 10
11> [!NOTE]11> [!NOTE]
12>12>
13> Referensi lengkapnya adalah [deklarasi TypeScript untuk mod](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts) milik Claude Code, yang menjelaskan setiap event, metode, dan elemen, beserta contohnya. Salinan di GitHub bisa lebih lama daripada versi Claude Code yang Anda instal. Jika keduanya tidak sesuai, percayai [salinan yang ditulis Claude Code untuk versi Anda](/docs/id/plugins/mods/create.md#get-the-types-for-your-build).13> Referensi lengkapnya adalah [deklarasi TypeScript untuk mod](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts) milik Claude Code, yang menjelaskan setiap event, metode, dan elemen, beserta contohnya. Salinan di GitHub bisa lebih lama daripada versi Claude Code yang Anda instal. Jika keduanya tidak sesuai, percayai [salinan yang ditulis Claude Code untuk versi Anda](https://code.claude.com/docs/id/plugins/mods/create.md#get-the-types-for-your-build).
14 14
15## File15## File
16 16
18 18
19| File | Wajib | Isi |19| File | Wajib | Isi |
20| :- | :- | :- |20| :- | :- | :- |
21| `.claude-plugin/plugin.json` | Ya | [Manifest](/docs/id/plugins/manifest-reference.md) plugin. Mod tidak menambahkan field wajib. |21| `.claude-plugin/plugin.json` | Ya | [Manifest](https://code.claude.com/docs/id/plugins/manifest-reference.md) plugin. Mod tidak menambahkan field wajib. |
22| `hooks/hooks.json` | Ya | `modules`: sebuah array dengan satu path, relatif terhadap file ini, ke modul hook, seperti dalam `"modules": ["./register.js"]`. Juga dapat memuat [hook pengaturan](/docs/id/hooks.md) di bawah `hooks`. |22| `hooks/hooks.json` | Ya | `modules`: sebuah array dengan satu path, relatif terhadap file ini, ke modul hook, seperti dalam `"modules": ["./register.js"]`. Juga dapat memuat [hook pengaturan](https://code.claude.com/docs/id/hooks.md) di bawah `hooks`. |
23| Modul hook, seperti [`hooks/register.js`](/docs/id/plugins/mods/create#write-a-mod-yourself) | Ya | Titik masuk mod. Mengekspor `register(on, options)`. Bernama `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts`, atau `.tsx`. Sebuah modul ES. |23| Modul hook, seperti [`hooks/register.js`](https://code.claude.com/docs/id/plugins/mods/create#write-a-mod-yourself) | Ya | Titik masuk mod. Mengekspor `register(on, options)`. Bernama `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts`, atau `.tsx`. Sebuah modul ES. |
24| [`types/index.d.ts`](/docs/id/plugins/mods/interface#declare-the-values), dinamai oleh `types` di manifest | Saat mod menggunakan `$.state` atau menambahkan namespace ke API mod | Mendeklarasikan nilai `PluginState` dan namespace apa pun yang ditambahkan mod |24| [`types/index.d.ts`](https://code.claude.com/docs/id/plugins/mods/interface#declare-the-values), dinamai oleh `types` di manifest | Saat mod menggunakan `$.state` atau menambahkan namespace ke API mod | Mendeklarasikan nilai `PluginState` dan namespace apa pun yang ditambahkan mod |
25| File yang namanya berakhiran `.test.ts` atau `.test.tsx` | Tidak | Tes yang dijalankan oleh [`claude plugin test`](/docs/id/plugins/mods/test#write-a-test) |25| File yang namanya berakhiran `.test.ts` atau `.test.tsx` | Tidak | Tes yang dijalankan oleh [`claude plugin test`](https://code.claude.com/docs/id/plugins/mods/test#write-a-test) |
26 26
27`register` menerima `on` dan `options`. `options` memuat nilai-nilai field [`userConfig`](/docs/id/plugins/components#user-configuration) yang dideklarasikan manifest, dengan nilai default yang sudah diisi.27`register` menerima `on` dan `options`. `options` memuat nilai-nilai field [`userConfig`](https://code.claude.com/docs/id/plugins/components#user-configuration) yang dideklarasikan manifest, dengan nilai default yang sudah diisi.
28 28
29## Fungsi hook29## Fungsi hook
30 30
31Sebuah mod mendaftarkan setiap hook-nya, yang merupakan handler event, dengan memanggil `on` di dalam `register`. `on` menerima nama event, [matcher](/docs/id/plugins/mods/events.md#filter-which-events-a-hook-handles) opsional, yaitu filter pada field event, dan hook itu sendiri, seperti dalam `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`. `on` mengembalikan sebuah registrasi dengan satu metode, `.catch(handler)`, yang menetapkan [handler error](/docs/id/plugins/mods/events.md#handle-a-hook-that-fails) hook tersebut.31Sebuah mod mendaftarkan setiap hook-nya, yang merupakan handler event, dengan memanggil `on` di dalam `register`. `on` menerima nama event, [matcher](https://code.claude.com/docs/id/plugins/mods/events.md#filter-which-events-a-hook-handles) opsional, yaitu filter pada field event, dan hook itu sendiri, seperti dalam `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`. `on` mengembalikan sebuah registrasi dengan satu metode, `.catch(handler)`, yang menetapkan [handler error](https://code.claude.com/docs/id/plugins/mods/events.md#handle-a-hook-that-fails) hook tersebut.
32 32
33| Argumen | Apa itu |33| Argumen | Apa itu |
34| :- | :- |34| :- | :- |
35| [`$`](/docs/id/plugins/mods/events#how-a-hook-handles-an-event) | API mod: setiap metode dalam [metode API mod](#mods-api-methods). Tulis setiap panggilan secara lengkap, namespace lalu metode, seperti dalam `$.fs.read('notes.md')`. |35| [`$`](https://code.claude.com/docs/id/plugins/mods/events#how-a-hook-handles-an-event) | API mod: setiap metode dalam [metode API mod](#mods-api-methods). Tulis setiap panggilan secara lengkap, namespace lalu metode, seperti dalam `$.fs.read('notes.md')`. |
36| [`e`](/docs/id/plugins/mods/events#how-a-hook-handles-an-event) | Input event, sebagai data biasa yang dibekukan secara mendalam. Untuk mengubahnya, teruskan salinannya ke `next`. |36| [`e`](https://code.claude.com/docs/id/plugins/mods/events#how-a-hook-handles-an-event) | Input event, sebagai data biasa yang dibekukan secara mendalam. Untuk mengubahnya, teruskan salinannya ke `next`. |
37| [`next(e)`](/docs/id/plugins/mods/events#how-a-hook-handles-an-event) | Handler berikutnya, seperti pada middleware. Menjalankan hook setelah hook ini, lalu perilaku Claude Code. Resolve ke hasil event. |37| [`next(e)`](https://code.claude.com/docs/id/plugins/mods/events#how-a-hook-handles-an-event) | Handler berikutnya, seperti pada middleware. Menjalankan hook setelah hook ini, lalu perilaku Claude Code. Resolve ke hasil event. |
38| [`next.signal`](/docs/id/plugins/mods/api#stop-background-work) | Sebuah `AbortSignal` yang dibatalkan saat event ditinggalkan |38| [`next.signal`](https://code.claude.com/docs/id/plugins/mods/api#stop-background-work) | Sebuah `AbortSignal` yang dibatalkan saat event ditinggalkan |
39| `next.origin` | `{ plugin, tier }` dari pihak yang memicu event. Claude Code sendiri adalah `{ plugin: 'engine', tier: 'core' }`. `tier` sebuah mod adalah grup prioritasnya dalam [urutan mod dijalankan](/docs/id/plugins/mods/events.md#the-order-mods-run-in): `prepend`, `user`, `append`, atau `builtin`. |39| `next.origin` | `{ plugin, tier }` dari pihak yang memicu event. Claude Code sendiri adalah `{ plugin: 'engine', tier: 'core' }`. `tier` sebuah mod adalah grup prioritasnya dalam [urutan mod dijalankan](https://code.claude.com/docs/id/plugins/mods/events.md#the-order-mods-run-in): `prepend`, `user`, `append`, atau `builtin`. |
40| `next.budget` | Batas waktu hook dalam milidetik: `next.budget.ms` adalah seluruh batas, dan `next.budget.remainingMs` adalah sisa waktu saat ini |40| `next.budget` | Batas waktu hook dalam milidetik: `next.budget.ms` adalah seluruh batas, dan `next.budget.remainingMs` adalah sisa waktu saat ini |
41| `next.to(e, tier)` | Melompat ke tier yang lebih belakang, yaitu `append`, `builtin`, atau `core`. `next.to(e, 'append')` melewati mod yang diinstal pengguna. Hanya mod di `prependPlugins` atau `appendPlugins` yang dapat memanggilnya. |41| `next.to(e, tier)` | Melompat ke tier yang lebih belakang, yaitu `append`, `builtin`, atau `core`. `next.to(e, 'append')` melewati mod yang diinstal pengguna. Hanya mod di `prependPlugins` atau `appendPlugins` yang dapat memanggilnya. |
42| `next.error` | Hanya di handler `.catch`. `kind` adalah `throw` atau `timeout` saat hook gagal, dan `message` adalah teks error. `kind` adalah `re-entry` saat hook dilewati karena event berasal dari dalam panggilan API mod oleh hook tersebut atau oleh kode mod Anda di luar hook-nya. `re-entry` memerlukan Claude Code v2.1.292 atau yang lebih baru. |42| `next.error` | Hanya di handler `.catch`. `kind` adalah `throw` atau `timeout` saat hook gagal, dan `message` adalah teks error. `kind` adalah `re-entry` saat hook dilewati karena event berasal dari dalam panggilan API mod oleh hook tersebut atau oleh kode mod Anda di luar hook-nya. `re-entry` memerlukan Claude Code v2.1.292 atau yang lebih baru. |
43| `next.error.cause` | Hanya ditetapkan saat `kind` adalah `re-entry`. `rewritten` jika hook `tool.call` atau [`PreToolUse`](/docs/id/hooks#pretooluse) mengubah panggilan API mod yang menjadi asal event, atau hook `agent.spawn` mengubah agent yang dimulai oleh panggilan tersebut. `lent` jika sebuah metode yang ditambahkan mod lain ke API mod memicu event tersebut, kecuali `rewritten` juga berlaku. `lent` memerlukan Claude Code v2.1.292 atau yang lebih baru dan `rewritten` v2.1.300 atau yang lebih baru. |43| `next.error.cause` | Hanya ditetapkan saat `kind` adalah `re-entry`. `rewritten` jika hook `tool.call` atau [`PreToolUse`](https://code.claude.com/docs/id/hooks#pretooluse) mengubah panggilan API mod yang menjadi asal event, atau hook `agent.spawn` mengubah agent yang dimulai oleh panggilan tersebut. `lent` jika sebuah metode yang ditambahkan mod lain ke API mod memicu event tersebut, kecuali `rewritten` juga berlaku. `lent` memerlukan Claude Code v2.1.292 atau yang lebih baru dan `rewritten` v2.1.300 atau yang lebih baru. |
44| `next.called` | Hanya di handler `.catch`. `true` saat hook telah memanggil `next`. |44| `next.called` | Hanya di handler `.catch`. `true` saat hook telah memanggil `next`. |
45 45
46## Event46## Event
55 55
56| Event | Dipicu saat | Hook dapat mengembalikan |56| Event | Dipicu saat | Hook dapat mengembalikan |
57| :- | :- | :- |57| :- | :- | :- |
58| [`tool.call`](/docs/id/plugins/mods/events#guard-or-change-a-tool-call) | Sebuah tool akan dijalankan | `next(e)`, `{ deny: reason }`, atau `{ result }` |58| [`tool.call`](https://code.claude.com/docs/id/plugins/mods/events#guard-or-change-a-tool-call) | Sebuah tool akan dijalankan | `next(e)`, `{ deny: reason }`, atau `{ result }` |
59| [`tool.check`](/docs/id/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code memutuskan apakah panggilan tool boleh dijalankan, setelah hook `tool.call` dan `PreToolUse`. `next(e)` resolve ke keputusan yang dicapai oleh aturan, mode izin, dan hook-hook tersebut. | `next(e)` atau `{ decision }`, dengan `decision` diatur ke `allow`, `ask`, atau `deny` dan `reason` opsional |59| [`tool.check`](https://code.claude.com/docs/id/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code memutuskan apakah panggilan tool boleh dijalankan, setelah hook `tool.call` dan `PreToolUse`. `next(e)` resolve ke keputusan yang dicapai oleh aturan, mode izin, dan hook-hook tersebut. | `next(e)` atau `{ decision }`, dengan `decision` diatur ke `allow`, `ask`, atau `deny` dan `reason` opsional |
60| `tool.describe` | Sekali untuk setiap tool, saat deskripsinya pertama kali dikirim ke Claude. Sekali lagi untuk tool MCP saat Claude memuatnya melalui [pencarian tool](/docs/id/mcp.md#scale-with-mcp-tool-search), dengan `e.description` diatur ke teks yang dibaca Claude untuk tool yang dimuat tersebut. | `{ description }`, secara opsional dengan `isDeferred` diatur ke `true` untuk menempatkan tool di balik pencarian tool atau `false` untuk memuatnya sejak awal |60| `tool.describe` | Sekali untuk setiap tool, saat deskripsinya pertama kali dikirim ke Claude. Sekali lagi untuk tool MCP saat Claude memuatnya melalui [pencarian tool](https://code.claude.com/docs/id/mcp.md#scale-with-mcp-tool-search), dengan `e.description` diatur ke teks yang dibaca Claude untuk tool yang dimuat tersebut. | `{ description }`, secara opsional dengan `isDeferred` diatur ke `true` untuk menempatkan tool di balik pencarian tool atau `false` untuk memuatnya sejak awal |
61 61
62#### Field agent dan organisasi pada `tool.check`62#### Field agent dan organisasi pada `tool.check`
63 63
64Dalam hook `tool.check`, baca field berikut untuk membedakan panggilan subagent dari panggilan percakapan utama, dan untuk melihat apakah organisasi Anda mewajibkan persetujuan untuk tool konektor:64Dalam hook `tool.check`, baca field berikut untuk membedakan panggilan subagent dari panggilan percakapan utama, dan untuk melihat apakah organisasi Anda mewajibkan persetujuan untuk tool konektor:
65 65
66* **`e.agentId`**: diatur saat sebuah [subagent](/docs/id/sub-agents.md) atau [rekan tim in-process](/docs/id/agent-teams.md#choose-a-display-mode) melakukan panggilan, dan tidak ada saat percakapan utama yang melakukannya66* **`e.agentId`**: diatur saat sebuah [subagent](https://code.claude.com/docs/id/sub-agents.md) atau [rekan tim in-process](https://code.claude.com/docs/id/agent-teams.md#choose-a-display-mode) melakukan panggilan, dan tidak ada saat percakapan utama yang melakukannya
67* **`e.ceiling`**: `ask` untuk tool konektor yang diatur organisasi Anda ke `ask`, dalam [sesi tempat pengaturan tersebut sampai ke Claude Code](/docs/id/mcp.md#organization-controls-on-connector-tools)67* **`e.ceiling`**: `ask` untuk tool konektor yang diatur organisasi Anda ke `ask`, dalam [sesi tempat pengaturan tersebut sampai ke Claude Code](https://code.claude.com/docs/id/mcp.md#organization-controls-on-connector-tools)
68 68
69Pada `tool.check`, `e.agentId` dan `e.ceiling` memerlukan Claude Code v2.1.290 atau yang lebih baru.69Pada `tool.check`, `e.agentId` dan `e.ceiling` memerlukan Claude Code v2.1.290 atau yang lebih baru.
70 70
71#### Field `e.isReadOnly` pada `tool.check`71#### Field `e.isReadOnly` pada `tool.check`
72 72
73Dalam hook `tool.check`, `e.isReadOnly` bernilai `true` saat tool melaporkan panggilan ini sebagai read-only. Jika tidak, field tersebut tidak ada, bukan `false`. Nilainya adalah laporan tool itu sendiri, jadi baca [Memeriksa apakah panggilan tool bersifat read-only](/docs/id/plugins/mods/events.md#check-whether-a-tool-call-is-read-only) sebelum Anda menyetujui sebuah panggilan hanya berdasarkan field ini.73Dalam hook `tool.check`, `e.isReadOnly` bernilai `true` saat tool melaporkan panggilan ini sebagai read-only. Jika tidak, field tersebut tidak ada, bukan `false`. Nilainya adalah laporan tool itu sendiri, jadi baca [Memeriksa apakah panggilan tool bersifat read-only](https://code.claude.com/docs/id/plugins/mods/events.md#check-whether-a-tool-call-is-read-only) sebelum Anda menyetujui sebuah panggilan hanya berdasarkan field ini.
74 74
75Pada `tool.check`, `e.isReadOnly` memerlukan Claude Code v2.1.304 atau yang lebih baru.75Pada `tool.check`, `e.isReadOnly` memerlukan Claude Code v2.1.304 atau yang lebih baru.
76 76
80 80
81| Event | Dipicu saat | Hook dapat mengembalikan |81| Event | Dipicu saat | Hook dapat mengembalikan |
82| :- | :- | :- |82| :- | :- | :- |
83| [`prompt.submit`](/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Sebuah prompt dikirim | `next({ ...e, text })`, `next({ ...e, context })`, atau `{ drop: reason }` |83| [`prompt.submit`](https://code.claude.com/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Sebuah prompt dikirim | `next({ ...e, text })`, `next({ ...e, context })`, atau `{ drop: reason }` |
84| `prompt.fill`, `prompt.suggest` | Teks akan dimasukkan ke kotak prompt sebagai draf, atau sebagai saran redup | `next(e)` dengan teks yang diubah |84| `prompt.fill`, `prompt.suggest` | Teks akan dimasukkan ke kotak prompt sebagai draf, atau sebagai saran redup | `next(e)` dengan teks yang diubah |
85| `prompt.edit` | Pengguna mengedit kotak prompt | `next(e)` |85| `prompt.edit` | Pengguna mengedit kotak prompt | `next(e)` |
86| `prompt.autocomplete` | Pengguna mengetik di kotak prompt dan sebuah kata berakhir di kursor. `e.token` adalah kata tersebut. Claude Code tidak menunggu hook: baris autocomplete miliknya sendiri ditampilkan lebih dulu. | `{ suggestions }`, daftar baris `{ text, label, description }` yang ditampilkan di bawah baris milik Claude Code. Memilih sebuah baris akan menulis `text`-nya menggantikan kata tersebut. |86| `prompt.autocomplete` | Pengguna mengetik di kotak prompt dan sebuah kata berakhir di kursor. `e.token` adalah kata tersebut. Claude Code tidak menunggu hook: baris autocomplete miliknya sendiri ditampilkan lebih dulu. | `{ suggestions }`, daftar baris `{ text, label, description }` yang ditampilkan di bawah baris milik Claude Code. Memilih sebuah baris akan menulis `text`-nya menggantikan kata tersebut. |
87| `prompt.compose` | Claude Code merender system prompt | `{ sections }`, daftar `{ id, text, scope }` dalam urutan pengirimannya |87| `prompt.compose` | Claude Code merender system prompt | `{ sections }`, daftar `{ id, text, scope }` dalam urutan pengirimannya |
88| [`prompt.section`](/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Sekali untuk setiap bagian bernama dari system prompt. `e.name` adalah `id` bagian tersebut di `prompt.compose`. | `{ text }`, atau `{ text: null }` untuk menghilangkan bagian tersebut |88| [`prompt.section`](https://code.claude.com/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Sekali untuk setiap bagian bernama dari system prompt. `e.name` adalah `id` bagian tersebut di `prompt.compose`. | `{ text }`, atau `{ text: null }` untuk menghilangkan bagian tersebut |
89| [`prompt.context`](/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Sekali untuk setiap percakapan, untuk konteks yang dikirim bersama pesan pertama | `{ blocks }` |89| [`prompt.context`](https://code.claude.com/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Sekali untuk setiap percakapan, untuk konteks yang dikirim bersama pesan pertama | `{ blocks }` |
90| `prompt.attachment` | Claude Code menambahkan pesannya sendiri untuk Claude, seperti pengingat. `e.type` menyebutkan jenisnya, dan untuk jenis yang dideklarasikan oleh types, `e.detail` memuat fakta yang menjadi dasar penulisan teks tersebut. | `{ text }`, atau `{ text: null }` untuk menghilangkannya |90| `prompt.attachment` | Claude Code menambahkan pesannya sendiri untuk Claude, seperti pengingat. `e.type` menyebutkan jenisnya, dan untuk jenis yang dideklarasikan oleh types, `e.detail` memuat fakta yang menjadi dasar penulisan teks tersebut. | `{ text }`, atau `{ text: null }` untuk menghilangkannya |
91| `prompt.mention` | Claude Code akan membaca file yang di-\@-mention oleh sebuah prompt. Memerlukan Claude Code v2.1.290 atau yang lebih baru. | `next({ ...e, path })` untuk membaca file lain, atau `{ deny: reason }` |91| `prompt.mention` | Claude Code akan membaca file yang di-\@-mention oleh sebuah prompt. Memerlukan Claude Code v2.1.290 atau yang lebih baru. | `next({ ...e, path })` untuk membaca file lain, atau `{ deny: reason }` |
92| [`skill.prompt`](/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Teks sebuah skill diperluas untuk Claude | `{ text }` |92| [`skill.prompt`](https://code.claude.com/docs/id/plugins/mods/events#rewrite-or-add-to-a-prompt) | Teks sebuah skill diperluas untuk Claude | `{ text }` |
93| `attribution.text` | Claude Code menyusun teks atribusi commit atau pull request | `{ text }` |93| `attribution.text` | Claude Code menyusun teks atribusi commit atau pull request | `{ text }` |
94 94
95#### Field sumber dan frontmatter pada `skill.prompt`95#### Field sumber dan frontmatter pada `skill.prompt`
98 98
99| Field | Tipe | Isinya |99| Field | Tipe | Isinya |
100| :- | :- | :- |100| :- | :- | :- |
101| `e.source` | string | Siapa yang menyediakan skill: `policySettings`, `userSettings`, atau `projectSettings` untuk skill di [lokasi](/docs/id/skills.md#where-skills-live) enterprise, pribadi, atau proyek, secara berurutan. Sumber lain memberikan kata seperti `plugin`, `mcp`, `syncedSkills`, atau `built-in`. |101| `e.source` | string | Siapa yang menyediakan skill: `policySettings`, `userSettings`, atau `projectSettings` untuk skill di [lokasi](https://code.claude.com/docs/id/skills.md#where-skills-live) enterprise, pribadi, atau proyek, secara berurutan. Sumber lain memberikan kata seperti `plugin`, `mcp`, `syncedSkills`, atau `built-in`. |
102| `e.pluginName` | string | Nama plugin, untuk skill yang `e.source`-nya adalah `plugin` |102| `e.pluginName` | string | Nama plugin, untuk skill yang `e.source`-nya adalah `plugin` |
103| `e.path` | string | Path absolut file `SKILL.md` milik skill, atau file `.md`-nya untuk skill yang ditulis sebagai [file perintah](/docs/id/skills.md#where-skills-live). Tidak ada jika skill tidak memiliki file di mesin ini, seperti pada skill bawaan. |103| `e.path` | string | Path absolut file `SKILL.md` milik skill, atau file `.md`-nya untuk skill yang ditulis sebagai [file perintah](https://code.claude.com/docs/id/skills.md#where-skills-live). Tidak ada jika skill tidak memiliki file di mesin ini, seperti pada skill bawaan. |
104| `e.frontmatter` | object | Frontmatter dari file skill, sebagai data biasa |104| `e.frontmatter` | object | Frontmatter dari file skill, sebagai data biasa |
105| `e.frontmatterProblem` | string | Alasan `e.frontmatter` tidak memuat frontmatter file atau salah satu key-nya, seperti dalam `is a list or a single value, not a table`. Tidak ada jika `e.frontmatter` memuat seluruh frontmatter atau skill tidak memilikinya. |105| `e.frontmatterProblem` | string | Alasan `e.frontmatter` tidak memuat frontmatter file atau salah satu key-nya, seperti dalam `is a list or a single value, not a table`. Tidak ada jika `e.frontmatter` memuat seluruh frontmatter atau skill tidak memilikinya. |
106 106
107Hook dapat meneruskan `text` atau `frontmatter` yang diubah ke `next`: hook setelahnya membaca keduanya, dan Claude membaca `text` akhir. Hook yang mengubah field lain apa pun akan [gagal](/docs/id/plugins/mods/events.md#handle-a-hook-that-fails).107Hook dapat meneruskan `text` atau `frontmatter` yang diubah ke `next`: hook setelahnya membaca keduanya, dan Claude membaca `text` akhir. Hook yang mengubah field lain apa pun akan [gagal](https://code.claude.com/docs/id/plugins/mods/events.md#handle-a-hook-that-fails).
108 108
109Pada `skill.prompt`, `e.source`, `e.pluginName`, `e.path`, `e.frontmatter`, dan `e.frontmatterProblem` memerlukan Claude Code v2.1.299 atau yang lebih baru.109Pada `skill.prompt`, `e.source`, `e.pluginName`, `e.path`, `e.frontmatter`, dan `e.frontmatterProblem` memerlukan Claude Code v2.1.299 atau yang lebih baru.
110 110
114 114
115| Event | Dipicu saat | Hook dapat mengembalikan |115| Event | Dipicu saat | Hook dapat mengembalikan |
116| :- | :- | :- |116| :- | :- | :- |
117| [`command.run`](/docs/id/plugins/mods/api#add-a-command) | Sebuah perintah akan dijalankan | `{ text }`, `{}`, atau `next(e)` |117| [`command.run`](https://code.claude.com/docs/id/plugins/mods/api#add-a-command) | Sebuah perintah akan dijalankan | `{ text }`, `{}`, atau `next(e)` |
118| `command.describe` | Sekali untuk setiap perintah, untuk daftar perintah | `{ description, argumentHint, isHidden }` |118| `command.describe` | Sekali untuk setiap perintah, untuk daftar perintah | `{ description, argumentHint, isHidden }` |
119| `config.set` | Sebuah baris `/config` akan berubah | `next({ ...e, value })` atau `{ deny: reason }` |119| `config.set` | Sebuah baris `/config` akan berubah | `next({ ...e, value })` atau `{ deny: reason }` |
120| `config.describe` | Sekali untuk setiap baris `/config` | `{ label, description, isHidden }` |120| `config.describe` | Sekali untuk setiap baris `/config` | `{ label, description, isHidden }` |
125 125
126| Event | Dipicu saat | Hook dapat mengembalikan |126| Event | Dipicu saat | Hook dapat mengembalikan |
127| :- | :- | :- |127| :- | :- | :- |
128| [`turn.start`](/docs/id/plugins/mods/events#follow-a-turn) | Sebuah giliran dimulai | `next(e)` |128| [`turn.start`](https://code.claude.com/docs/id/plugins/mods/events#follow-a-turn) | Sebuah giliran dimulai | `next(e)` |
129| [`turn.step`](/docs/id/plugins/mods/events#follow-a-turn) | Satu permintaan akan dikirim ke model | `yield* next(e)`, atau `next({ ...e, model })`, `next({ ...e, effort })` |129| [`turn.step`](https://code.claude.com/docs/id/plugins/mods/events#follow-a-turn) | Satu permintaan akan dikirim ke model | `yield* next(e)`, atau `next({ ...e, model })`, `next({ ...e, effort })` |
130| [`turn.complete`](/docs/id/plugins/mods/events#follow-a-turn) | Sebuah giliran berakhir | `next(e)`, atau `{ text }` untuk menampilkan baris di bawah jawaban |130| [`turn.complete`](https://code.claude.com/docs/id/plugins/mods/events#follow-a-turn) | Sebuah giliran berakhir | `next(e)`, atau `{ text }` untuk menampilkan baris di bawah jawaban |
131 131
132### Sesi132### Sesi
133 133
135 135
136| Event | Dipicu saat | Hook dapat mengembalikan |136| Event | Dipicu saat | Hook dapat mengembalikan |
137| :- | :- | :- |137| :- | :- | :- |
138| [`session.start`](/docs/id/plugins/mods/api#add-a-command-or-a-tool) | Sekali untuk setiap mod yang dimuat, sebelum prompt pertama, dan sekali lagi setelah mod tersebut dimuat ulang. Tidak setelah `/clear`, `/resume`, atau `/branch`. | `next(e)` |138| [`session.start`](https://code.claude.com/docs/id/plugins/mods/api#add-a-command-or-a-tool) | Sekali untuk setiap mod yang dimuat, sebelum prompt pertama, dan sekali lagi setelah mod tersebut dimuat ulang. Tidak setelah `/clear`, `/resume`, atau `/branch`. | `next(e)` |
139| `session.end` | Sesi berakhir, atau `/clear`, `/resume`, atau `/branch` dijalankan. `e.reason` adalah `clear`, `resume`, `logout`, `prompt_input_exit`, atau `other`. `/branch` melaporkan `resume`. | `next(e)` |139| `session.end` | Sesi berakhir, atau `/clear`, `/resume`, atau `/branch` dijalankan. `e.reason` adalah `clear`, `resume`, `logout`, `prompt_input_exit`, atau `other`. `/branch` melaporkan `resume`. | `next(e)` |
140| `session.compact` | Percakapan akan dipadatkan | `{ skip: reason }` |140| `session.compact` | Percakapan akan dipadatkan | `{ skip: reason }` |
141| [`session.receive`](/docs/id/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](/docs/id/plugins/mods/api#send-and-receive-messages-between-sessions) | Sebuah pesan tiba dari, atau akan dikirim ke, agent atau sesi lain. Lihat [Mengirim dan menerima pesan antarsesi](/docs/id/plugins/mods/api.md#send-and-receive-messages-between-sessions). | `{ consumed: reason }` untuk `receive`, `{ isDelivered: false, reason }` untuk `send` |141| [`session.receive`](https://code.claude.com/docs/id/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](https://code.claude.com/docs/id/plugins/mods/api#send-and-receive-messages-between-sessions) | Sebuah pesan tiba dari, atau akan dikirim ke, agent atau sesi lain. Lihat [Mengirim dan menerima pesan antarsesi](https://code.claude.com/docs/id/plugins/mods/api.md#send-and-receive-messages-between-sessions). | `{ consumed: reason }` untuk `receive`, `{ isDelivered: false, reason }` untuk `send` |
142| `session.append` | Sekali untuk setiap baris yang disimpan percakapan, seperti prompt, blok respons, hasil tool, atau pemberitahuan, sebelum disimpan | `next({ ...e, message })` dengan `message.content` yang diubah, untuk menulis ulang blok teks baris tersebut atau `content` dari blok `tool_result` di dalamnya |142| `session.append` | Sekali untuk setiap baris yang disimpan percakapan, seperti prompt, blok respons, hasil tool, atau pemberitahuan, sebelum disimpan | `next({ ...e, message })` dengan `message.content` yang diubah, untuk menulis ulang blok teks baris tersebut atau `content` dari blok `tool_result` di dalamnya |
143| `session.attach`, `session.detach` | Aplikasi lain terhubung ke atau terputus dari sesi | `next(e)` |143| `session.attach`, `session.detach` | Aplikasi lain terhubung ke atau terputus dari sesi | `next(e)` |
144| `session.measure` | Setelah setiap giliran, dan saat persentase penggunaan batas paket berubah | `next(e)` |144| `session.measure` | Setelah setiap giliran, dan saat persentase penggunaan batas paket berubah | `next(e)` |
150| Event | Dipicu saat | Hook dapat mengembalikan |150| Event | Dipicu saat | Hook dapat mengembalikan |
151| :- | :- | :- |151| :- | :- | :- |
152| `agent.offer` | Sebuah tipe subagent ditawarkan kepada Claude | `{ isOffered: false }` untuk menahannya |152| `agent.offer` | Sebuah tipe subagent ditawarkan kepada Claude | `{ isOffered: false }` untuk menahannya |
153| `agent.spawn` | Sebuah subagent atau rekan tim dalam [tim agent](/docs/id/agent-teams.md) akan dimulai. Untuk rekan tim, `e.isTeammate` bernilai `true`. | `next({ ...e, model })` untuk memilih modelnya, atau `{ deny: reason }` |153| `agent.spawn` | Sebuah subagent atau rekan tim dalam [tim agent](https://code.claude.com/docs/id/agent-teams.md) akan dimulai. Untuk rekan tim, `e.isTeammate` bernilai `true`. | `next({ ...e, model })` untuk memilih modelnya, atau `{ deny: reason }` |
154 154
155Saat Claude melanjutkan subagent dengan tool [`SendMessage`](/docs/id/sub-agents#resume-subagents), hook `agent.spawn` Anda tidak dijalankan lagi. Untuk menolak panggilan `SendMessage` yang melanjutkan subagent, cocokkan tool tersebut dalam hook [`tool.call`](/docs/id/plugins/mods/events#guard-or-change-a-tool-call).155Saat Claude melanjutkan subagent dengan tool [`SendMessage`](https://code.claude.com/docs/id/sub-agents#resume-subagents), hook `agent.spawn` Anda tidak dijalankan lagi. Untuk menolak panggilan `SendMessage` yang melanjutkan subagent, cocokkan tool tersebut dalam hook [`tool.call`](https://code.claude.com/docs/id/plugins/mods/events#guard-or-change-a-tool-call).
156 156
157### Antarmuka157### Antarmuka
158 158
159Event antarmuka dipicu saat Claude Code menggambar titik render dan saat pengguna menggunakan kontrol yang digambar oleh mod. [Menggambar di antarmuka](/docs/id/plugins/mods/interface.md) menunjukkan apa yang dikembalikan oleh hook `ui.render`:159Event antarmuka dipicu saat Claude Code menggambar titik render dan saat pengguna menggunakan kontrol yang digambar oleh mod. [Menggambar di antarmuka](https://code.claude.com/docs/id/plugins/mods/interface.md) menunjukkan apa yang dikembalikan oleh hook `ui.render`:
160 160
161| Event | Dipicu saat |161| Event | Dipicu saat |
162| :- | :- |162| :- | :- |
163| [`ui.render`](/docs/id/plugins/mods/interface#pick-where-to-draw) | Sebuah [titik render](#render-sites) akan digambar |163| [`ui.render`](https://code.claude.com/docs/id/plugins/mods/interface#pick-where-to-draw) | Sebuah [titik render](#render-sites) akan digambar |
164| `ui.resolve` | Mod dimuat, sekali untuk setiap aplikasi, titik render, dan mod. Hasilnya adalah tabel elemen yang dibaca oleh `$.ui.resolve(e)`. |164| `ui.resolve` | Mod dimuat, sekali untuk setiap aplikasi, titik render, dan mod. Hasilnya adalah tabel elemen yang dibaca oleh `$.ui.resolve(e)`. |
165| [`ui.press`](/docs/id/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](/docs/id/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](/docs/id/plugins/mods/interface#respond-to-presses-and-typing) | Sebuah `Button`, `Input`, atau `Select` yang digambar mod digunakan |165| [`ui.press`](https://code.claude.com/docs/id/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](https://code.claude.com/docs/id/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](https://code.claude.com/docs/id/plugins/mods/interface#respond-to-presses-and-typing) | Sebuah `Button`, `Input`, atau `Select` yang digambar mod digunakan |
166| `ui.focus`, `ui.scroll` | Kontrol yang difokuskan atau posisi gulir sebuah panel atau band akan berubah |166| `ui.focus`, `ui.scroll` | Kontrol yang difokuskan atau posisi gulir sebuah panel atau band akan berubah |
167| `ui.close` | Sebuah panel akan ditutup. `e.id` adalah panel tersebut dan `e.origin.kind` adalah `plugin`, `person`, atau `unload`. |167| `ui.close` | Sebuah panel akan ditutup. `e.id` adalah panel tersebut dan `e.origin.kind` adalah `plugin`, `person`, atau `unload`. |
168| [`ui.message`](/docs/id/plugins/mods/interface#build-a-tree-from-elements) | Sebuah elemen `Client` mengirim data ke mod-nya |168| [`ui.message`](https://code.claude.com/docs/id/plugins/mods/interface#build-a-tree-from-elements) | Sebuah elemen `Client` mengirim data ke mod-nya |
169| [`ui.fault`](/docs/id/plugins/mods/interface#redraw-when-something-changes) | Sebuah elemen `Client` yang digambar mod Anda gagal dimuat, digambar, atau dijalankan. `e.phase` adalah `load`, `render`, atau `run`, dan `e.reason` adalah pesan kesalahannya. Memerlukan Claude Code v2.1.289 atau yang lebih baru. |169| [`ui.fault`](https://code.claude.com/docs/id/plugins/mods/interface#redraw-when-something-changes) | Sebuah elemen `Client` yang digambar mod Anda gagal dimuat, digambar, atau dijalankan. `e.phase` adalah `load`, `render`, atau `run`, dan `e.reason` adalah pesan kesalahannya. Memerlukan Claude Code v2.1.289 atau yang lebih baru. |
170 170
171### Mod lain171### Mod lain
172 172
174 174
175| Event | Dipicu saat | Hook dapat mengembalikan |175| Event | Dipicu saat | Hook dapat mengembalikan |
176| :- | :- | :- |176| :- | :- | :- |
177| [`plugin.register`](/docs/id/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | Sebuah modul hook akan dimuat. `e.uses` mencantumkan event, panggilan API mod, environment variable, dan state-nya, sebagaimana dicetak oleh `claude plugin validate`. Setiap panggilan ditulis tanpa prefiks `$.`, seperti `fs.read`. | `{ refuse: reason }` |177| [`plugin.register`](https://code.claude.com/docs/id/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | Sebuah modul hook akan dimuat. `e.uses` mencantumkan event, panggilan API mod, environment variable, dan state-nya, sebagaimana dicetak oleh `claude plugin validate`. Setiap panggilan ditulis tanpa prefiks `$.`, seperti `fs.read`. | `{ refuse: reason }` |
178| `engine.create` | API mod sedang dibangun untuk mod ini | API mod yang diubah, untuk menambahkan namespace. Mod di luar [tingkat](#the-hook-function) `user` juga dapat menahan salah satunya. |178| `engine.create` | API mod sedang dibangun untuk mod ini | API mod yang diubah, untuk menambahkan namespace. Mod di luar [tingkat](#the-hook-function) `user` juga dapat menahan salah satunya. |
179 179
180Saat hook mod lain memanggil metode pada namespace yang Anda tambahkan dalam `engine.create`, panggilan `$` dari metode Anda dijalankan dalam konteks hook tersebut hingga setiap hook pada event tersebut kembali. Misalnya, path relatif di-resolve terhadap direktori kerja hook tersebut, dan `$.prompt.submit` ditolak selama giliran sedang menunggu hook tersebut. Panggilan yang dilakukan metode Anda setelah itu dijalankan dalam konteks mod Anda sendiri.180Saat hook mod lain memanggil metode pada namespace yang Anda tambahkan dalam `engine.create`, panggilan `$` dari metode Anda dijalankan dalam konteks hook tersebut hingga setiap hook pada event tersebut kembali. Misalnya, path relatif di-resolve terhadap direktori kerja hook tersebut, dan `$.prompt.submit` ditolak selama giliran sedang menunggu hook tersebut. Panggilan yang dilakukan metode Anda setelah itu dijalankan dalam konteks mod Anda sendiri.
189 189
190### Event hook pengaturan190### Event hook pengaturan
191 191
192Setiap [event hook pengaturan](/docs/id/hooks.md#hook-events) adalah event bernama `classic.<Event>`, seperti `classic.Stop` atau `classic.PostToolUse`. `e` adalah JSON stdin hook tersebut.192Setiap [event hook pengaturan](https://code.claude.com/docs/id/hooks.md#hook-events) adalah event bernama `classic.<Event>`, seperti `classic.Stop` atau `classic.PostToolUse`. `e` adalah JSON stdin hook tersebut.
193 193
194### Panggilan API mod194### Panggilan API mod
195 195
197 197
198## Metode API mod198## Metode API mod
199 199
200API mod adalah argumen `$` yang diterima setiap hook. Metodenya dikelompokkan dalam namespace, seperti `$.ui`. Tabel ini mencantumkan metode setiap namespace berdasarkan nama, sehingga `open` pada baris `$.ui` adalah panggilan `$.ui.open(...)`. Panduan menunjukkan penggunaan metode yang umum, dan [types untuk build Anda](/docs/id/plugins/mods/create.md#get-the-types-for-your-build) mendokumentasikan setiap metode beserta contohnya.200API mod adalah argumen `$` yang diterima setiap hook. Metodenya dikelompokkan dalam namespace, seperti `$.ui`. Tabel ini mencantumkan metode setiap namespace berdasarkan nama, sehingga `open` pada baris `$.ui` adalah panggilan `$.ui.open(...)`. Panduan menunjukkan penggunaan metode yang umum, dan [types untuk build Anda](https://code.claude.com/docs/id/plugins/mods/create.md#get-the-types-for-your-build) mendokumentasikan setiap metode beserta contohnya.
201 201
202| Namespace | Metode |202| Namespace | Metode |
203| :- | :- |203| :- | :- |
204| `$.plugin` | `name`, `root`: nama dan direktori plugin ini |204| `$.plugin` | `name`, `root`: nama dan direktori plugin ini |
205| [`$.ui`](/docs/id/plugins/mods/interface#pick-where-to-draw) | `resolve`, `invalidate`, `open`, `close`, `panes`, `focus`, `scroll`, `toast`, `notify`, `status`, `log`, `notice`, `ask`, `copy`, `selection`, `blit` |205| [`$.ui`](https://code.claude.com/docs/id/plugins/mods/interface#pick-where-to-draw) | `resolve`, `invalidate`, `open`, `close`, `panes`, `focus`, `scroll`, `toast`, `notify`, `status`, `log`, `notice`, `ask`, `copy`, `selection`, `blit` |
206| [`$.command`](/docs/id/plugins/mods/api#add-a-command) | `register`, `run`, `list` |206| [`$.command`](https://code.claude.com/docs/id/plugins/mods/api#add-a-command) | `register`, `run`, `list` |
207| [`$.tool`](/docs/id/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |207| [`$.tool`](https://code.claude.com/docs/id/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |
208| `$.agent` | `register`, `spawn`, `list`. `list()` mengembalikan subagent dan rekan tim (teammate) sesi ini, masing-masing dengan `status` berupa `pending`, `running`, `waiting`, `idle`, `completed`, `failed`, atau `killed`, di mana `idle` dan `waiting` memerlukan Claude Code v2.1.289 atau yang lebih baru. |208| `$.agent` | `register`, `spawn`, `list`. `list()` mengembalikan subagent dan rekan tim (teammate) sesi ini, masing-masing dengan `status` berupa `pending`, `running`, `waiting`, `idle`, `completed`, `failed`, atau `killed`, di mana `idle` dan `waiting` memerlukan Claude Code v2.1.289 atau yang lebih baru. |
209| [`$.model`](/docs/id/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |209| [`$.model`](https://code.claude.com/docs/id/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |
210| [`$.prompt`](/docs/id/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude membaca teks dari `submit({ text })` setelah sebuah kalimat yang menyebut mod Anda sebagai pengirim. `submit({ text, asUser: true })` mengirim teks sebagai kata-kata pengguna sendiri, tanpa kalimat tersebut. |210| [`$.prompt`](https://code.claude.com/docs/id/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude membaca teks dari `submit({ text })` setelah sebuah kalimat yang menyebut mod Anda sebagai pengirim. `submit({ text, asUser: true })` mengirim teks sebagai kata-kata pengguna sendiri, tanpa kalimat tersebut. |
211| `$.turn` | `abort` |211| `$.turn` | `abort` |
212| [`$.session`](/docs/id/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()` mengembalikan `{ startedAt, context, rateLimits, cost }`: `context` memiliki `tokens`, `window`, dan `percent`, dan `rateLimits` adalah daftar `{ kind, percentUsed, resetsAt }`. |212| [`$.session`](https://code.claude.com/docs/id/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()` mengembalikan `{ startedAt, context, rateLimits, cost }`: `context` memiliki `tokens`, `window`, dan `percent`, dan `rateLimits` adalah daftar `{ kind, percentUsed, resetsAt }`. |
213| `$.config` | `list`, `set` |213| `$.config` | `list`, `set` |
214| [`$.settings`](/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `read` |214| [`$.settings`](https://code.claude.com/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `read` |
215| [`$.env`](/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |215| [`$.env`](https://code.claude.com/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |
216| [`$.fs`](/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write` tidak atomik: ia mengganti isi file di tempat, sehingga proses lain dapat membaca file yang baru ditulis sebagian. Simpan data yang diubah oleh beberapa sesi di `$.store`. |216| [`$.fs`](https://code.claude.com/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write` tidak atomik: ia mengganti isi file di tempat, sehingga proses lain dapat membaca file yang baru ditulis sebagian. Simpan data yang diubah oleh beberapa sesi di `$.store`. |
217| [`$.store`](/docs/id/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. Penyimpanan key-value yang dibagikan oleh setiap sesi di mesin. Lihat [Menyimpan dari lebih dari satu sesi](/docs/id/plugins/mods/interface.md#save-from-more-than-one-session). |217| [`$.store`](https://code.claude.com/docs/id/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. Penyimpanan key-value yang dibagikan oleh setiap sesi di mesin. Lihat [Menyimpan dari lebih dari satu sesi](https://code.claude.com/docs/id/plugins/mods/interface.md#save-from-more-than-one-session). |
218| [`$.state`](/docs/id/plugins/mods/interface#keep-a-value-in-\$-state) | State reaktif: `get`, `set`, dengan helper `atom`, `read`, `update`, `derive`, dan `memberOf` yang diimpor dari `claude-code` |218| [`$.state`](https://code.claude.com/docs/id/plugins/mods/interface#keep-a-value-in-\$-state) | State reaktif: `get`, `set`, dengan helper `atom`, `read`, `update`, `derive`, dan `memberOf` yang diimpor dari `claude-code` |
219| [`$.clock`](/docs/id/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |219| [`$.clock`](https://code.claude.com/docs/id/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |
220| [`$.http`](/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |220| [`$.http`](https://code.claude.com/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |
221| [`$.process`](/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |221| [`$.process`](https://code.claude.com/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |
222| [`$.mcp`](/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)` menghubungkan server MCP yang tercantum di manifest plugin Anda sendiri. |222| [`$.mcp`](https://code.claude.com/docs/id/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)` menghubungkan server MCP yang tercantum di manifest plugin Anda sendiri. |
223| `$.audio` | `play`, `speak` |223| `$.audio` | `play`, `speak` |
224| `$.telemetry` | `log`, `mark`. Sebuah catatan hanya dikirim saat Claude Code atau mod bawaan melakukan panggilan tersebut. |224| `$.telemetry` | `log`, `mark`. Sebuah catatan hanya dikirim saat Claude Code atau mod bawaan melakukan panggilan tersebut. |
225 225
226## Titik render226## Titik render
227 227
228Titik render adalah titik ekstensi di antarmuka Claude Code. Setiap baris adalah nilai `e.component` dalam hook `ui.render`, dengan field `e.props` dan aplikasi yang merendernya. `e.surface` menyebutkan aplikasi yang sedang menggambar, seperti `terminal`, `desktop`, atau `vscode`. [Mengubah apa yang sudah digambar Claude Code](/docs/id/plugins/mods/interface.md#change-what-claude-code-already-draws) menunjukkan apa yang dapat dilakukan hook di sebuah titik, dengan contoh untuk setiap pilihan.228Titik render adalah titik ekstensi di antarmuka Claude Code. Setiap baris adalah nilai `e.component` dalam hook `ui.render`, dengan field `e.props` dan aplikasi yang merendernya. `e.surface` menyebutkan aplikasi yang sedang menggambar, seperti `terminal`, `desktop`, atau `vscode`. [Mengubah apa yang sudah digambar Claude Code](https://code.claude.com/docs/id/plugins/mods/interface.md#change-what-claude-code-already-draws) menunjukkan apa yang dapat dilakukan hook di sebuah titik, dengan contoh untuk setiap pilihan.
229 229
230Rendering di ekstensi VS Code memerlukan ekstensi versi 2.1.299 atau lebih baru. Sesi yang [tidak mengambil feature flag](/docs/id/env-vars.md#features-that-need-feature-flag-fetching) memerlukan versi 2.1.304 atau lebih baru. [Menggambar di ekstensi VS Code](/docs/id/plugins/mods/interface.md#draw-in-the-vs-code-extension) mencantumkan apa yang digambar secara berbeda oleh ekstensi tersebut.230Rendering di ekstensi VS Code memerlukan ekstensi versi 2.1.299 atau lebih baru. Sesi yang [tidak mengambil feature flag](https://code.claude.com/docs/id/env-vars.md#features-that-need-feature-flag-fetching) memerlukan versi 2.1.304 atau lebih baru. [Menggambar di ekstensi VS Code](https://code.claude.com/docs/id/plugins/mods/interface.md#draw-in-the-vs-code-extension) mencantumkan apa yang digambar secara berbeda oleh ekstensi tersebut.
231 231
232| Titik | `e.props` | `e.requestId` | Dirender di |232| Titik | `e.props` | `e.requestId` | Dirender di |
233| :- | :- | :- | :- |233| :- | :- | :- | :- |
234| [`Pane`](/docs/id/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | `id` panel | Terminal, Desktop, VS Code |234| [`Pane`](https://code.claude.com/docs/id/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | `id` panel | Terminal, Desktop, VS Code |
235| [`AbovePrompt`](/docs/id/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | Satu instans | Terminal, Desktop |235| [`AbovePrompt`](https://code.claude.com/docs/id/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | Satu instans | Terminal, Desktop |
236| `UserMessage` | `text`, `origin`, `isExpanded`, dan `task` atau `from` tergantung origin | id pesan | Terminal, Desktop, VS Code |236| `UserMessage` | `text`, `origin`, `isExpanded`, dan `task` atau `from` tergantung origin | id pesan | Terminal, Desktop, VS Code |
237| `AssistantMessage` | Teks balasan | id pesan | Terminal, Desktop, VS Code |237| `AssistantMessage` | Teks balasan | id pesan | Terminal, Desktop, VS Code |
238| `ToolUse`, `ToolResult`, `ToolGroup` | Nama, input, dan hasil tool | id panggilan tool | Terminal, Desktop, VS Code |238| `ToolUse`, `ToolResult`, `ToolGroup` | Nama, input, dan hasil tool | id panggilan tool | Terminal, Desktop, VS Code |
239| `CommandOutput` | `command`, `text` | id pesan | Terminal, Desktop |239| `CommandOutput` | `command`, `text` | id pesan | Terminal, Desktop |
240| [`AskUserQuestion`](/docs/id/plugins/mods/interface#change-what-claude-code-already-draws) | Pertanyaan dan opsi | id panggilan tool | Terminal, Desktop, VS Code |240| [`AskUserQuestion`](https://code.claude.com/docs/id/plugins/mods/interface#change-what-claude-code-already-draws) | Pertanyaan dan opsi | id panggilan tool | Terminal, Desktop, VS Code |
241| `ToolProgress` | `kind` | id panggilan tool | Terminal |241| `ToolProgress` | `kind` | id panggilan tool | Terminal |
242| [`Spinner`](/docs/id/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | id agent | Terminal, Desktop, VS Code |242| [`Spinner`](https://code.claude.com/docs/id/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | id agent | Terminal, Desktop, VS Code |
243| `TurnDuration` | `word`, `durationMs` | id pesan | Terminal |243| `TurnDuration` | `word`, `durationMs` | id pesan | Terminal |
244| `InfoNotice` | `text`, `command` | id pesan | Terminal |244| `InfoNotice` | `text`, `command` | id pesan | Terminal |
245| `SessionMode` | `modes` | Satu instans | Terminal, Desktop |245| `SessionMode` | `modes` | Satu instans | Terminal, Desktop |
251 251
252* **Lebar sebuah `Pane` atau band**: gambar sesuai `e.props.bodyColumns`252* **Lebar sebuah `Pane` atau band**: gambar sesuai `e.props.bodyColumns`
253* **Tinggi sebuah `Pane` di samping transkrip**: jika `e.props.placement` adalah `'dock'`, `e.props.scroll.bodyRows` adalah jumlah baris yang dimiliki panel untuk tree Anda253* **Tinggi sebuah `Pane` di samping transkrip**: jika `e.props.placement` adalah `'dock'`, `e.props.scroll.bodyRows` adalah jumlah baris yang dimiliki panel untuk tree Anda
254* **Tinggi sebuah `Pane` di atas prompt**: jika `e.props.placement` adalah `'inline'`, panel bertambah sesuai tree Anda hingga suatu batas, dan `bodyRows` adalah batas tersebut. Untuk meminta batas yang berbeda, lihat [field `rows` dari `$.ui.open`](/docs/id/plugins/mods/interface#open-a-pane-at-the-right-time).254* **Tinggi sebuah `Pane` di atas prompt**: jika `e.props.placement` adalah `'inline'`, panel bertambah sesuai tree Anda hingga suatu batas, dan `bodyRows` adalah batas tersebut. Untuk meminta batas yang berbeda, lihat [field `rows` dari `$.ui.open`](https://code.claude.com/docs/id/plugins/mods/interface#open-a-pane-at-the-right-time).
255 255
256Tree yang lebih tinggi daripada panel akan bergulir secara keseluruhan.256Tree yang lebih tinggi daripada panel akan bergulir secara keseluruhan.
257 257
258## Elemen258## Elemen
259 259
260Elemen adalah blok penyusun tree yang dikembalikan oleh hook `ui.render`, dan Anda mendapatkannya dari `$.ui.resolve(e)`. [Membangun tree dari elemen](/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) menunjukkan elemen yang umum beserta cara terminal menggambarnya, dan [galeri antarmuka](/docs/id/plugins/mods/gallery.md) memiliki tangkapan layar sebagian besar elemen. Tanda centang berarti aplikasi dapat menggambar elemen tersebut.260Elemen adalah blok penyusun tree yang dikembalikan oleh hook `ui.render`, dan Anda mendapatkannya dari `$.ui.resolve(e)`. [Membangun tree dari elemen](https://code.claude.com/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) menunjukkan elemen yang umum beserta cara terminal menggambarnya, dan [galeri antarmuka](https://code.claude.com/docs/id/plugins/mods/gallery.md) memiliki tangkapan layar sebagian besar elemen. Tanda centang berarti aplikasi dapat menggambar elemen tersebut.
261 261
262| Elemen | Prop utama | Terminal | Desktop | VS Code |262| Elemen | Prop utama | Terminal | Desktop | VS Code |
263| :- | :- | :-: | :-: | :-: |263| :- | :- | :-: | :-: | :-: |
264| [`Box`](/docs/id/plugins/mods/interface#build-a-tree-from-elements) | `key`, tata letak flex, [`gap`, `padding`, `margin`](#box-spacing-steps), `width`, `height`, [`borderStyle`](#box-border-styles), `backgroundColor`, `position`, `hover` | ✓ | ✓ | ✓ |264| [`Box`](https://code.claude.com/docs/id/plugins/mods/interface#build-a-tree-from-elements) | `key`, tata letak flex, [`gap`, `padding`, `margin`](#box-spacing-steps), `width`, `height`, `minWidth`, `minHeight`, [`borderStyle`](#box-border-styles), `borderColor`, `borderDimColor`, `backgroundColor`, `position`, `top`, `left`, `right`, `bottom`, `overflow`, `display`, `hover` | ✓ | ✓ | ✓ |
265| [`Text`](/docs/id/plugins/mods/interface#build-a-tree-from-elements) | `color`, `backgroundColor`, [`bold`](#text-bold), `italic`, `underline`, `dimColor`, `inverse`, `wrap`, [`size`, `weight`, `mono`, `tabular`](#text-typography) | ✓ | ✓ | ✓ |265| [`Text`](https://code.claude.com/docs/id/plugins/mods/interface#build-a-tree-from-elements) | `color`, `backgroundColor`, [`bold`](#text-bold), `italic`, `underline`, `strikethrough`, `dimColor`, `inverse`, `wrap`, [`size`, `weight`, `mono`, `tabular`](#text-typography), `hover` | ✓ | ✓ | ✓ |
266| [`Button`](/docs/id/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action` | ✓ | ✓ | ✓ |266| [`Button`](https://code.claude.com/docs/id/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action`, `hover` | ✓ | ✓ | ✓ |
267| [`Link`](/docs/id/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. Lihat [Batasan](#limits). | ✓ | ✓ | ✓ |267| [`Link`](https://code.claude.com/docs/id/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. Lihat [Batasan](#limits). | ✓ | ✓ | ✓ |
268| [`Code`](/docs/id/plugins/mods/gallery#show-code-and-changes) | `source`, `language`, `path`, `startLine`, `format`, `wrap` | ✓ | ✓ | ✓ |268| [`Code`](https://code.claude.com/docs/id/plugins/mods/gallery#show-code-and-changes) | `source`, `language`, `path`, `startLine`, `format`, `wrap` | ✓ | ✓ | ✓ |
269| `Markdown` | `text`, `key`, `dimColor`, `onLinkPress`, `pressableLinks` | ✓ | ✓ | ✓ |269| `Markdown` | `text`, `key`, `dimColor`, `onLinkPress`, `pressableLinks` | ✓ | ✓ | ✓ |
270| [`Input`](/docs/id/plugins/mods/interface#take-typed-input-and-draw-a-row-for-each-item) | `key`, `label`, `placeholder`, `value`, `submitLabel`, `onSubmit`, `onInput`, `autoFocus` | ✓ | ✓ | ✓ |270| [`Input`](https://code.claude.com/docs/id/plugins/mods/interface#take-typed-input-and-draw-a-row-for-each-item) | `key`, `label`, `placeholder`, `value`, `submitLabel`, `onSubmit`, `onInput`, `autoFocus` | ✓ | ✓ | ✓ |
271| `Select` | `key`, `label`, `options`, `value`, `onSelect`, `autoFocus` | ✓ | ✓ | ✓ |271| `Select` | `key`, `label`, `options`, `value`, `onSelect`, `autoFocus` | ✓ | ✓ | ✓ |
272| `Svg` | Dokumen SVG, hingga 131.072 karakter | | ✓ | ✓ |272| `Svg` | `source` berupa markup SVG hingga 131.072 karakter, teks `alt`, `width`, `height`, dan `isInteractive` | | ✓ | ✓ |
273| [`Client`](/docs/id/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key` | ✓ | ✓ | |273| [`Client`](https://code.claude.com/docs/id/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key`, `props`, `width`, `height`, `flexGrow` | ✓ | ✓ | |
274| [`Raster`](/docs/id/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, `columns` hingga 512, `rows` hingga 256, `cells`. Lihat [Menggambar grid sel berwarna](/docs/id/plugins/mods/interface.md#draw-a-grid-of-colored-cells). | ✓ | | |274| [`Raster`](https://code.claude.com/docs/id/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, `columns` hingga 512, `rows` hingga 256, `cells`. Lihat [Menggambar grid sel berwarna](https://code.claude.com/docs/id/plugins/mods/interface.md#draw-a-grid-of-colored-cells). | ✓ | | |
275| `Image` | Byte PNG atau RGBA hingga 2 MiB, atau path file, `columns` dan `rows` hingga 255, serta teks `alt`. Lihat [terminal mana yang menggambarnya](/docs/id/plugins/mods/gallery.md#image-and-client). | ✓ | | |275| `Image` | `key`, `source` seperti byte PNG atau RGBA hingga 2 MiB, atau path file, `columns` dan `rows` hingga 255, serta teks `alt`. Lihat [terminal mana yang menggambarnya](https://code.claude.com/docs/id/plugins/mods/gallery.md#image-and-client). | ✓ | | |
276 276
277Aturan `Button` lainnya: `action` menyebutkan salah satu [aksi pintasan keyboard](/docs/id/keybindings.md) milik Claude Code sendiri, dan pintasan keyboard pengguna untuk aksi tersebut akan menekan tombol jika pintasan itu berupa chord atau tombol dengan modifier. `hotkey` berupa digit pada tombol di band juga terpicu saat pengguna mengetik digit tersebut saja ke dalam prompt kosong lalu berhenti sejenak. Jika dua tombol dalam satu gambar menyebutkan `hotkey` yang sama, tombol yang lebih belakang yang mendapatkannya. `autoFocus` hanya menerima `true` pada kontrol apa pun, jadi hilangkan prop tersebut untuk menonaktifkannya.277Aturan `Button` lainnya:
278
279* **`action`**: menyebutkan salah satu [aksi pintasan keyboard](https://code.claude.com/docs/id/keybindings.md) milik Claude Code sendiri, dan pintasan keyboard pengguna untuk aksi tersebut akan menekan tombol jika pintasan itu berupa chord atau tombol dengan modifier
280* **Hotkey digit pada band**: `hotkey` berupa digit pada tombol di band juga terpicu saat pengguna mengetik digit tersebut saja ke dalam prompt kosong lalu berhenti sejenak
281* **Band yang diciutkan**: selama band [diciutkan](https://code.claude.com/docs/id/plugins/mods/interface.md#when-the-user-collapses-the-band), baik pintasan `action` maupun hotkey tidak menekan tombol di dalamnya
282* **Dua tombol dengan satu hotkey**: jika dua tombol dalam satu gambar menyebutkan `hotkey` yang sama, tombol yang lebih belakang yang mendapatkannya
283
284`autoFocus` hanya menerima `true` pada kontrol apa pun, jadi hilangkan prop tersebut untuk menonaktifkannya.
278 285
279Ekstensi VS Code mengabaikan beberapa prop elemen dan menggambar elemen seolah-olah Anda tidak menyertakannya:286Ekstensi VS Code mengabaikan beberapa prop elemen dan menggambar elemen seolah-olah Anda tidak menyertakannya:
280 287
281* **`Box`**: `position` dan `hover`288* **`Box`**: `position` beserta `top`, `left`, `right`, dan `bottom`-nya, `alignSelf`, `borderDimColor`, dan `hover`
282* **`Text`**: `size`, `mono`, dan `tabular`289* **`Text`**: `size`, `mono`, `tabular`, dan `hover`
283* **`Button`**: `hotkey`, `plain`, `autoFocus`, dan `action`, sehingga pengguna menekan tombol di sana dengan klik, atau dengan Enter setelah tombol tersebut mendapatkan fokus290* **`Button`**: `hotkey`, `plain`, `autoFocus`, `action`, dan `hover`, sehingga pengguna menekan tombol di sana dengan klik, atau dengan Enter setelah tombol tersebut mendapatkan fokus
284* **`Code`**: `language`, `path`, `startLine`, `format`, dan `wrap`, sehingga kode digambar tanpa warna atau nomor baris, dan blok `format: 'diff'` menampilkan teks mentah diff tersebut291* **`Code`**: `language`, `path`, `startLine`, `format`, dan `wrap`, sehingga kode digambar tanpa warna atau nomor baris, dan blok `format: 'diff'` menampilkan teks mentah diff tersebut
285* **`Input` dan `Select`**: `autoFocus`292* **`Input` dan `Select`**: `autoFocus`
293* **`Svg`**: `isInteractive`
286 294
287### Gaya border `Box`295### Gaya border `Box`
288 296
317 325
318Jika Anda mengatur `gap`, `padding`, atau `margin` ke sebuah langkah, langkah tersebut berlaku secara mendatar dan menurun sekaligus. Misalnya, di terminal dan ekstensi VS Code, `padding: 'md'` berarti dua sel di setiap sisi dan satu baris di atas dan di bawah.326Jika Anda mengatur `gap`, `padding`, atau `margin` ke sebuah langkah, langkah tersebut berlaku secara mendatar dan menurun sekaligus. Misalnya, di terminal dan ekstensi VS Code, `padding: 'md'` berarti dua sel di setiap sisi dan satu baris di atas dan di bawah.
319 327
320Nama langkah memerlukan Claude Code v2.1.299 atau yang lebih baru. Pada rilis yang lebih lama, Claude Code [menggambar versinya sendiri dari situs tersebut](/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) sebagai pengganti tree yang menggunakan nama langkah.328Nama langkah memerlukan Claude Code v2.1.299 atau yang lebih baru. Pada rilis yang lebih lama, Claude Code [menggambar versinya sendiri dari situs tersebut](https://code.claude.com/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) sebagai pengganti tree yang menggunakan nama langkah.
321 329
322### Prop tipografi `Text`330### Prop tipografi `Text`
323 331
330| `mono` | `true` untuk meminta jenis huruf monospace aplikasi | Diabaikan: terminal selalu monospace | Diabaikan, sehingga teks tetap menggunakan jenis huruf ekstensi itu sendiri |338| `mono` | `true` untuk meminta jenis huruf monospace aplikasi | Diabaikan: terminal selalu monospace | Diabaikan, sehingga teks tetap menggunakan jenis huruf ekstensi itu sendiri |
331| `tabular` | `true` untuk meminta digit dengan lebar yang sama, sehingga angka yang diperbarui di tempat atau kolom angka tetap sejajar | Diabaikan: digit terminal sudah selebar satu sel | Diabaikan |339| `tabular` | `true` untuk meminta digit dengan lebar yang sama, sehingga angka yang diperbarui di tempat atau kolom angka tetap sejajar | Diabaikan: digit terminal sudah selebar satu sel | Diabaikan |
332 340
333Keempat prop ini memerlukan Claude Code v2.1.299 atau yang lebih baru. Pada rilis yang lebih lama, Claude Code [menggambar versinya sendiri dari situs tersebut](/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) sebagai pengganti tree yang mengatur `size`, `weight`, `mono`, atau `tabular`.341Keempat prop ini memerlukan Claude Code v2.1.299 atau yang lebih baru. Pada rilis yang lebih lama, Claude Code [menggambar versinya sendiri dari situs tersebut](https://code.claude.com/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) sebagai pengganti tree yang mengatur `size`, `weight`, `mono`, atau `tabular`.
334 342
335#### Mengganti `bold` dengan `weight`343#### Mengganti `bold` dengan `weight`
336 344
337`bold` pada `Text` sudah deprecated dan digantikan oleh `weight`, tetapi masih berfungsi. Untuk menggantinya pada `Text` yang tidak memiliki `weight`, ubah `bold: true` menjadi `weight: 'semibold'` untuk hasil yang sama pada Claude Code v2.1.299 atau yang lebih baru.345`bold` pada `Text` sudah deprecated dan digantikan oleh `weight`, tetapi masih berfungsi. Untuk menggantinya pada `Text` yang tidak memiliki `weight`, ubah `bold: true` menjadi `weight: 'semibold'` untuk hasil yang sama pada Claude Code v2.1.299 atau yang lebih baru.
338 346
339Pada rilis yang lebih lama dari v2.1.299, tree yang mengatur `weight` tidak digambar, dan Claude Code [menggambar versinya sendiri dari situs tersebut](/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) sebagai gantinya. Jika Anda mengatur `bold` dan `weight` sekaligus pada `Text`, `bold` tidak berpengaruh.347Pada rilis yang lebih lama dari v2.1.299, tree yang mengatur `weight` tidak digambar, dan Claude Code [menggambar versinya sendiri dari situs tersebut](https://code.claude.com/docs/id/plugins/mods/interface.md#build-a-tree-from-elements) sebagai gantinya. Jika Anda mengatur `bold` dan `weight` sekaligus pada `Text`, `bold` tidak berpengaruh.
340 348
341## Batas349## Batas
342 350
346| :- | :- |354| :- | :- |
347| Waktu eksekusi hook itu sendiri untuk satu event, tidak termasuk waktu di dalam `next` atau panggilan API mod selain `$.clock.sleep` | 10 detik, atau 50 milidetik untuk hook `prompt.edit` |355| Waktu eksekusi hook itu sendiri untuk satu event, tidak termasuk waktu di dalam `next` atau panggilan API mod selain `$.clock.sleep` | 10 detik, atau 50 milidetik untuk hook `prompt.edit` |
348| Waktu eksekusi handler `.catch` | 1 detik |356| Waktu eksekusi handler `.catch` | 1 detik |
349| Semua hook `session.end` secara keseluruhan | Selama [anggaran hook SessionEnd](/docs/id/hooks.md#sessionend-input), 1,5 detik kecuali Anda mengubahnya, dihitung sejak hook `SessionEnd` di pengaturan Anda selesai |357| Semua hook `session.end` secara keseluruhan | Selama [anggaran hook SessionEnd](https://code.claude.com/docs/id/hooks.md#sessionend-input), 1,5 detik kecuali Anda mengubahnya, dihitung sejak hook `SessionEnd` di pengaturan Anda selesai |
350| Timeout `$.process.run` | 30 detik secara default, paling lama 10 menit |358| Timeout `$.process.run` | 30 detik secara default, paling lama 10 menit |
351| `maxTokens` `$.model.complete` | 1024 secara default, hingga 64.000 atau batas output model |359| `maxTokens` `$.model.complete` | 1024 secara default, hingga 64.000 atau batas output model |
352| `$.fs.read` dan `$.fs.write` | 4 MiB untuk satu file |360| `$.fs.read` dan `$.fs.write` | 4 MiB untuk satu file |
354| Body respons `$.http.fetch` | 4 MiB. `text` berisi 4 MiB pertama dan sisanya tidak dibaca. Ketika header `Content-Length` menyatakan ukuran yang lebih besar, panggilan tersebut justru ditolak (reject), dengan alasan yang diakhiri `is over the 4194304-byte limit`, kecuali jika permintaan terakhir setelah semua redirect menggunakan metode `HEAD`. Pengecualian `HEAD` memerlukan Claude Code v2.1.296 atau yang lebih baru. |362| Body respons `$.http.fetch` | 4 MiB. `text` berisi 4 MiB pertama dan sisanya tidak dibaca. Ketika header `Content-Length` menyatakan ukuran yang lebih besar, panggilan tersebut justru ditolak (reject), dengan alasan yang diakhiri `is over the 4194304-byte limit`, kecuali jika permintaan terakhir setelah semua redirect menggunakan metode `HEAD`. Pengecualian `HEAD` memerlukan Claude Code v2.1.296 atau yang lebih baru. |
355| Satu panggilan `$.http.fetch`, termasuk redirect dan body | 30 detik |363| Satu panggilan `$.http.fetch`, termasuk redirect dan body | 30 detik |
356| Redirect yang diikuti oleh satu panggilan `$.http.fetch` | 5 |364| Redirect yang diikuti oleh satu panggilan `$.http.fetch` | 5 |
357| Alasan `drop` dari hook atau alasan `deny` dari `config.set` | 4.096 karakter. Bagian akhir dari alasan yang lebih panjang dipotong, dan drop atau deny tetap berlaku. Pemotongan ini memerlukan Claude Code v2.1.292 atau yang lebih baru, dan pada versi sebelumnya hook tersebut [gagal](/docs/id/plugins/mods/events.md#handle-a-hook-that-fails) sebagai gantinya. |365| Alasan `drop` dari hook atau alasan `deny` dari `config.set` | 4.096 karakter. Bagian akhir dari alasan yang lebih panjang dipotong, dan drop atau deny tetap berlaku. Pemotongan ini memerlukan Claude Code v2.1.292 atau yang lebih baru, dan pada versi sebelumnya hook tersebut [gagal](https://code.claude.com/docs/id/plugins/mods/events.md#handle-a-hook-that-fails) sebagai gantinya. |
358| Teks dalam satu tree | 100.000 karakter pertama yang digambar |366| Teks dalam satu tree | 100.000 karakter pertama yang digambar |
359| `language` atau `path` dari `Code`, `value` dari opsi `Select`, atau `module` dari `Client` | 10.000 karakter. Jika salah satunya lebih panjang, Claude Code [menggambar versi situsnya sendiri](/docs/id/plugins/mods/interface.md#build-a-tree-from-elements). |367| `language` atau `path` dari `Code`, `value` dari opsi `Select`, atau `module` dari `Client` | 10.000 karakter. Jika salah satunya lebih panjang, Claude Code [menggambar versi situsnya sendiri](https://code.claude.com/docs/id/plugins/mods/interface.md#build-a-tree-from-elements). |
360| `href` dari `Link` | 2.048 karakter. `href` yang lebih panjang membuat seluruh tree tidak digambar. |368| `href` dari `Link` | 2.048 karakter. `href` yang lebih panjang membuat seluruh tree tidak digambar. |
361| `$.store` | Total 4 MiB JSON |369| `$.store` | Total 4 MiB JSON |
362| `$.session.messages()` | 4.096 entri terbaru |370| `$.session.messages()` | 4.096 entri terbaru |
375| :- | :- | :- |383| :- | :- | :- |
376| `CLAUDE_CODE_PLUGIN_DIRS` | Environment, atau `env` di `~/.claude/settings.json` | Direktori plugin yang dimuat seperti `--plugin-dir`, untuk aplikasi yang tidak dapat Anda berikan flag. Path absolut yang dipisahkan oleh `:`, atau `;` di Windows. |384| `CLAUDE_CODE_PLUGIN_DIRS` | Environment, atau `env` di `~/.claude/settings.json` | Direktori plugin yang dimuat seperti `--plugin-dir`, untuk aplikasi yang tidak dapat Anda berikan flag. Path absolut yang dipisahkan oleh `:`, atau `;` di Windows. |
377| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | Environment | `1` membuat sesi non-interaktif yang berjalan lama memuat ulang mod `--plugin-dir` saat disimpan |385| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | Environment | `1` membuat sesi non-interaktif yang berjalan lama memuat ulang mod `--plugin-dir` saat disimpan |
378| `prependPlugins`, `appendPlugins` | Pengaturan terkelola. Pengaturan pengguna hanya pada mesin tanpa pengaturan terkelola, dalam sesi yang kredensialnya bukan `/login` Team atau Enterprise. | Daftar id plugin, seperti `acme-guard@acme-tools`. Mod di `prependPlugins` berjalan sebelum setiap mod yang diinstal pengguna, dan mod di `appendPlugins` berjalan setelahnya, sesuai urutan yang tercantum. Lihat [Urutan mod dijalankan](/docs/id/plugins/mods/events.md#the-order-mods-run-in). |386| `prependPlugins`, `appendPlugins` | Pengaturan terkelola. Pengaturan pengguna hanya pada mesin tanpa pengaturan terkelola, dalam sesi yang kredensialnya bukan `/login` Team atau Enterprise. | Daftar id plugin, seperti `acme-guard@acme-tools`. Mod di `prependPlugins` berjalan sebelum setiap mod yang diinstal pengguna, dan mod di `appendPlugins` berjalan setelahnya, sesuai urutan yang tercantum. Lihat [Urutan mod dijalankan](https://code.claude.com/docs/id/plugins/mods/events.md#the-order-mods-run-in). |
379| `allowManagedModsOnly` | Pengaturan terkelola, sebagai [opsi pada penjaga bawaan](/docs/id/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Hanya mod yang [terhitung sebagai milik organisasi Anda](/docs/id/plugins/mods/admin.md#install-your-organizations-mods), dan mod bawaan Claude Code, yang menjalankan hook-nya. Hook pengaturan pengguna tetap berjalan. |387| `allowManagedModsOnly` | Pengaturan terkelola, sebagai [opsi pada penjaga bawaan](https://code.claude.com/docs/id/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Hanya mod yang [terhitung sebagai milik organisasi Anda](https://code.claude.com/docs/id/plugins/mods/admin.md#install-your-organizations-mods), dan mod bawaan Claude Code, yang menjalankan hook-nya. Hook pengaturan pengguna tetap berjalan. |
380| `allowModsToOverrideDenyRules` | Pengaturan terkelola, sebagai [opsi pada penjaga bawaan](/docs/id/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Mengizinkan mod yang diinstal pengguna menyetujui panggilan tool yang ditolak oleh aturan `deny` |388| `allowModsToOverrideDenyRules` | Pengaturan terkelola, sebagai [opsi pada penjaga bawaan](https://code.claude.com/docs/id/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Mengizinkan mod yang diinstal pengguna menyetujui panggilan tool yang ditolak oleh aturan `deny` |
381| `allowManagedHooksOnly` | Pengaturan terkelola | Memblokir hook dan mod terinstal yang bukan milik organisasi Anda. Lihat [apa yang tetap berjalan](/docs/id/settings-reference.md#what-runs-under-allowmanagedhooksonly). |389| `allowManagedHooksOnly` | Pengaturan terkelola | Memblokir hook dan mod terinstal yang bukan milik organisasi Anda. Lihat [apa yang tetap berjalan](https://code.claude.com/docs/id/settings-reference.md#what-runs-under-allowmanagedhooksonly). |
382| `disableAllHooks` | File pengaturan apa pun | Di pengaturan terkelola, tidak ada mod atau hook dari plugin terinstal yang berjalan. Di pengaturan Anda sendiri, apa yang dikelola organisasi Anda tetap berjalan. Lihat [`disableAllHooks`](/docs/id/settings-reference#disableallhooks). |390| `disableAllHooks` | File pengaturan apa pun | Di pengaturan terkelola, tidak ada mod atau hook dari plugin terinstal yang berjalan. Di pengaturan Anda sendiri, apa yang dikelola organisasi Anda tetap berjalan. Lihat [`disableAllHooks`](https://code.claude.com/docs/id/settings-reference#disableallhooks). |
383| `disableSideloadFlags` | Pengaturan terkelola | Menolak `--plugin-dir` dan `--plugin-url` saat startup |391| `disableSideloadFlags` | Pengaturan terkelola | Menolak `--plugin-dir` dan `--plugin-url` saat startup |
384| `pluginConfigs` | Pengaturan pengguna atau terkelola | Memuat nilai `userConfig` untuk sebuah mod, dengan kunci berupa id plugin, seperti `acme-guard@acme-tools`, atau namanya dan `@inline`, seperti `first-mod@inline`, untuk mod yang dimuat dengan `--plugin-dir` |392| `pluginConfigs` | Pengaturan pengguna atau terkelola | Memuat nilai `userConfig` untuk sebuah mod, dengan kunci berupa id plugin, seperti `acme-guard@acme-tools`, atau namanya dan `@inline`, seperti `first-mod@inline`, untuk mod yang dimuat dengan `--plugin-dir` |
385 393
386`sec-default@builtin` adalah penjaga bawaan Claude Code, tercantum sebagai `cc-plugin-sec-default` di `/plugin` dan log debug. Penjaga ini dimuat sebelum setiap mod yang diinstal seseorang pada mesin dengan pengaturan terkelola, atau dalam sesi yang kredensialnya adalah [`/login`](/docs/id/authentication#authentication-precedence) Team atau Enterprise. Jika `prependPlugins` terkelola ditetapkan, penjaga ini hanya dimuat jika daftar tersebut menyebutkannya, pada posisi yang tercantum.394`sec-default@builtin` adalah penjaga bawaan Claude Code, tercantum sebagai `cc-plugin-sec-default` di `/plugin` dan log debug. Penjaga ini dimuat sebelum setiap mod yang diinstal seseorang pada mesin dengan pengaturan terkelola, atau dalam sesi yang kredensialnya adalah [`/login`](https://code.claude.com/docs/id/authentication#authentication-precedence) Team atau Enterprise. Jika `prependPlugins` terkelola ditetapkan, penjaga ini hanya dimuat jika daftar tersebut menyebutkannya, pada posisi yang tercantum.
387 395
388Sumbernya ada di [direktori `mods/sec-default` dari repositori Claude Code](https://github.com/anthropics/claude-code/tree/main/mods/sec-default).396Sumbernya ada di [direktori `mods/sec-default` dari repositori Claude Code](https://github.com/anthropics/claude-code/tree/main/mods/sec-default).
389 397
393 401
394| Perintah | Fungsinya |402| Perintah | Fungsinya |
395| :- | :- |403| :- | :- |
396| [`/plugin`](/docs/id/plugins/mods/overview#see-which-mods-a-session-loaded) | Menampilkan baris seperti `1 mod active · first-mod` di bawah tab-nya saat mod yang bukan bawaan telah dimuat |404| [`/plugin`](https://code.claude.com/docs/id/plugins/mods/overview#see-which-mods-a-session-loaded) | Menampilkan baris seperti `1 mod active · first-mod` di bawah tab-nya saat mod yang bukan bawaan telah dimuat |
397| [`claude plugin validate <directory>`](/docs/id/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | Membaca manifest dan modul hook sebuah plugin lalu melaporkan error, event yang ditanganinya, dan panggilan API mod yang dilakukannya. `--strict` memperlakukan peringatan sebagai error dan `--json` mencetak laporan yang dapat dibaca mesin. |405| [`claude plugin validate <directory>`](https://code.claude.com/docs/id/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | Membaca manifest dan modul hook sebuah plugin lalu melaporkan error, event yang ditanganinya, dan panggilan API mod yang dilakukannya. `--strict` memperlakukan peringatan sebagai error dan `--json` mencetak laporan yang dapat dibaca mesin. |
398| [`claude plugin test [directory]`](/docs/id/plugins/mods/test#write-a-test) | Menjalankan setiap file di bawah direktori, atau direktori saat ini jika Anda tidak memberikannya, yang namanya berakhiran `.test.ts` atau `.test.tsx`. Keluar dengan status 1 saat sebuah tes gagal. |406| [`claude plugin test [directory]`](https://code.claude.com/docs/id/plugins/mods/test#write-a-test) | Menjalankan setiap file di bawah direktori, atau direktori saat ini jika Anda tidak memberikannya, yang namanya berakhiran `.test.ts` atau `.test.tsx`. Keluar dengan status 1 saat sebuah tes gagal. |
399| [`claude --plugin-dir <directory>`](/docs/id/plugins/mods/create#write-a-mod-yourself) | Memuat direktori plugin untuk satu sesi dan memuat ulang modul hook-nya saat Anda menyimpan. Ulangi flag untuk memuat beberapa. |407| [`claude --plugin-dir <directory>`](https://code.claude.com/docs/id/plugins/mods/create#write-a-mod-yourself) | Memuat direktori plugin untuk satu sesi dan memuat ulang modul hook-nya saat Anda menyimpan. Ulangi flag untuk memuat beberapa. |
400| `/reload-plugins` | Memuat ulang plugin saat Anda menjalankannya |408| `/reload-plugins` | Memuat ulang plugin saat Anda menjalankannya |